<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
	<id>https://www.raspibo.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dave4rp</id>
	<title>raspibo - Contributi utente [it]</title>
	<link rel="self" type="application/atom+xml" href="https://www.raspibo.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dave4rp"/>
	<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php/Speciale:Contributi/Dave4rp"/>
	<updated>2026-05-15T02:07:27Z</updated>
	<subtitle>Contributi utente</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7556</id>
		<title>Centralina livello 1</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7556"/>
		<updated>2025-03-08T07:33:32Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Centralina  livello 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
![[File:Livello1-Debug.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Centralina livello 1&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Centralina generale (?) gestione segnali&lt;br /&gt;
|-&lt;br /&gt;
|Repository: https://github.com/raspibo/Livello1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
= Centralina  livello 1 =&lt;br /&gt;
&lt;br /&gt;
;ATTENZIONE&lt;br /&gt;
:'''Il sistema cosi` com'e` funziona solo fino alla release &amp;quot;bullseye&amp;quot;.'''&lt;br /&gt;
::Provato upgrade a &amp;quot;bookworm&amp;quot;, ma ho desistito per i troppi errori/differenze da sistemare. Comunque la &amp;quot;bullseye&amp;quot; dovrebbe essere una LTS (&amp;quot;long term support&amp;quot;).&lt;br /&gt;
:Tutte le immagini sono puramente indicative, il progetto e` in pieno sviluppo, tutto e` passibile di modifiche, anche sostanziali.&lt;br /&gt;
:L'immagine di presentazione si riferisce alla sezione &amp;quot;debug&amp;quot;, realizzata con Dokuwiki e (ad oggi) non fa parte del progetto (o si ?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prima e sommaria descrizione ==&lt;br /&gt;
&lt;br /&gt;
Centralina di controllo segnali.&lt;br /&gt;
&lt;br /&gt;
:(Ad oggi)&lt;br /&gt;
:Acquisisce segnali, li suddivide in gruppi mono o multi utenza, dei quali: realizza grafici temporali, crea e gestisce allarmi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dal campo arrivano i valori della 'sensoristica' sottoforma di &amp;quot;Identificatore Valore&amp;quot;, da queste informazioni sono aggiunti i sensori che eventualmente non sono presenti e le relative 'liste' dei valori (sono generate due chiavi, una dell'utenza e l'altra dei valori), altrimenti viene solo accodato il valore nella rispettiva lista (aggiungendo data-ora-minuti-secondi).&lt;br /&gt;
&lt;br /&gt;
Acquisiti i sensori, e` possibile il loro raggruppamento (anche una sola utenza) ed il campionamento dei valori a tempi prestabiliti (generazione grafici tempo/valore).&lt;br /&gt;
&lt;br /&gt;
Sempre previo raggruppamento (sempre &amp;quot;anche di un solo sensore&amp;quot;), e` possibile attivare/disattivare i relativi allarmi, il classico ON/OFF, ma anche un'automatico (che per esempio attivi i sensori del solaio/cantine dalle 20 alle 8, quando e` certo che nessuno si rechi in quegli spazi).&lt;br /&gt;
&lt;br /&gt;
E poi il resto .. che sarebbe di arrivare non solo a leggere/interpretare segnali, ma anche a pilotare utenze (luci, serrande, elettrodomestici, ...)&lt;br /&gt;
&lt;br /&gt;
L'idea e` che tutto questo sia gestibile da:&lt;br /&gt;
# interfaccia web&lt;br /&gt;
#* browser&lt;br /&gt;
#* cellulare&lt;br /&gt;
# linea di comando&lt;br /&gt;
# terminali operatore (display+tastiere)&lt;br /&gt;
# pulsanti, lampade, selettori, ..&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
== Hardware e Software ==&lt;br /&gt;
&lt;br /&gt;
;Hardware&lt;br /&gt;
:Versione 1 - [[Raspberry Pi 3]], perche` completa di WiFi e Bluetooth&lt;br /&gt;
:Versione 2 (2018) - [[Raspberry Pi]] con chiavetta WiFi&lt;br /&gt;
&lt;br /&gt;
;Software&lt;br /&gt;
:MQTT Broker (Mosquitto), perche` in grado di dialogare con la maggior parte dei componenti (Arduino, ESP8266, eccetera)&lt;br /&gt;
:Redis, perche` servira` un database di appoggio e manipolazione per alcuni dati, e perche` servira` una struttura dati &amp;quot;manipolabile&amp;quot; (dovremo poter aggiungere e togliere &amp;quot;campi:valori&amp;quot; ad una &amp;quot;chiave&amp;quot;, e aggiungere/togliere chiavi a delle liste, ecc. ecc.)&lt;br /&gt;
:Nginx, non si puo` fare senza web server&lt;br /&gt;
:... e poi non so cos'altro&lt;br /&gt;
:Script cgi&lt;br /&gt;
:javascript&lt;br /&gt;
: ...&lt;br /&gt;
&lt;br /&gt;
Sistema operativo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
$ lsb_release -a&lt;br /&gt;
No LSB modules are available.&lt;br /&gt;
Distributor ID: Raspbian&lt;br /&gt;
Description:    Raspbian GNU/Linux 11 (bullseye)&lt;br /&gt;
Release:        11&lt;br /&gt;
Codename:       bullseye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Embedded page --&amp;gt;&lt;br /&gt;
{{:Raspberry_Pi-Raspbian_default_post-install}}&lt;br /&gt;
&lt;br /&gt;
== Access Point ==&lt;br /&gt;
&lt;br /&gt;
Installato/configurato &amp;quot;[[Raspberry Pi Access Point WEP2]]&amp;quot;, sfruttando il wifi integrato nel [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
Installazione dei pacchetti utili, necessari (e qualcuno inutile):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt install nginx fcgiwrap redis-server python3-redis mosquitto ssl-cert php8.0-fpm php8.0-xml python3-pip python3-paho-mqtt python3-pandas python3-cairosvg python3-tinycss python3-cssselect git mosquitto-clients redis-tools&lt;br /&gt;
pip3 install python-telegram-bot pygal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nelle precedenti versioni fu installato manualmente anche [http://www.dokuwiki.org dokuwiki], utilizzato per segnarsi appunti vari (e un po` di debug), e` facoltativo e non descritto le operazioni necessarie, ma i files di configurazione del web server si.&lt;br /&gt;
&lt;br /&gt;
E` necessario scaricare il repository con i programmi (script python per lo piu`), si puo` fare da normale utente, per esempio:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/Livello1.git&lt;br /&gt;
cd Livello1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/level1 /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-enabled/level1 /etc/nginx/sites-enabled/&lt;br /&gt;
#cp etc/nginx/dokuwiki* etc/nginx/fcgiwrap.conf /etc/nginx/ # se installate dokuwiki&lt;br /&gt;
cp etc/nginx/fcgiwrap.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
==== Redis (database) ====&lt;br /&gt;
&lt;br /&gt;
Nel file &amp;quot;/etc/redis/redis.conf&amp;quot; ho modificato le linee:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
bind 127.0.0.1 ::1&lt;br /&gt;
protected-mode yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
in&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#bind 127.0.0.1 ::1&lt;br /&gt;
protected-mode no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Level1 (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu var/www/ /var/&lt;br /&gt;
chown www-data:www-data -R /var/www/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serve anche la scrittura in &amp;quot;www&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chmod 775 /var/www&lt;br /&gt;
chown :www-data -R /var/www    # oppure si poteva eliminare il &amp;quot;/&amp;quot; dal &amp;quot;chown&amp;quot; precedente&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
:Potrebbe essere necessario creare la directory &amp;quot;/var/www/archive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Mosquitto ====&lt;br /&gt;
&lt;br /&gt;
Copiare il file di configurazione dal repository ed assicurarsi i giusti permessi e proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/mosquitto/conf.d/myadd.conf /etc/mosquitto/conf.d/&lt;br /&gt;
chown root:root /etc/mosquitto/conf.d/myadd.conf&lt;br /&gt;
chmod 644 /etc/mosquitto/conf.d/myadd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Telegram Bot ====&lt;br /&gt;
&lt;br /&gt;
Scaricare il repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone hhttps://github.com/raspibo/bot4livello1.git&lt;br /&gt;
cd bot4livello1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Questo programma fu creato in origine nella directory &amp;quot;/home/pi/project/csv2image2telegram&amp;quot;, quindi tutti i riferimenti sono a questa, copiate qua il programma oppure modificate la directory dove necessario (&amp;quot;/etc/rc.local&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Il programma dev'essere esguito al boot di sistema e rimanere sempre in esecuzione.&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
All'avvio del sistema, devono andare in esecuzione alcuni script (quasi &amp;quot;daemons&amp;quot;) e rimanere attivi, per questo si deve modificare il file &amp;quot;/etc/rc.local&amp;quot; (lo trovate nel repository git):&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Power On &amp;quot;Level 1&amp;quot;&lt;br /&gt;
DAEMON_NAME=mqtt2redis_d&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviata correttamente Livello 1, oppure mqtt2redis_d e\` gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio \&amp;quot;mqtt2redis_d\&amp;quot;&amp;quot;&lt;br /&gt;
                #/var/www/cgi-bin/mqtt2redis_init.d.sh start # 20180115&lt;br /&gt;
        su -c &amp;quot;/var/www/cgi-bin/mqtt2redis_init.d.sh start&amp;quot; pi&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Centralina level 1 [ri]avviata ..&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Start Telegram Bot&lt;br /&gt;
DAEMON_NAME=bot4livello1&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato il Telegram Bot, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio Telegram Bot&amp;quot;&lt;br /&gt;
                cd /home/pi/project/csv2image2telegram&lt;br /&gt;
                su pi -c &amp;quot;python3 bot4livello1.py &amp;amp;&amp;quot;&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio bot4livello1.py&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inoltre, visto che puo` capitare s'interrompano, specialmente nelle prove di nuovi [[Centralina_livello_1#Devices|devices]], sono predisposti dei &amp;quot;check orari&amp;quot; che nel caso, li riavviano:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.hourly/mqtt2redis_check /etc/cron.hourly/&lt;br /&gt;
cp -vapu etc/cron.hourly/bot4livello1_check /etc/cron.hourly/ # se installerete anche il bot telegram&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ho anche previsto un messaggio settimanale di centralina in funzione tramite crontab dell'utente pi, copiate il file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu var/spool/cron/crontabs/pi /var/spool/cron/crontabs/&lt;br /&gt;
chown root:root /var/spool/cron/crontabs/pi&lt;br /&gt;
chmod 600 /var/spool/cron/crontabs/pi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
oppure aggiungete la linea (col comando &amp;quot;crontab -e&amp;quot;):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
0 7 * * 0 redis-cli -h centred hmset msg:redis:alive:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Messaggio ciclico, centralina $(hostname) in funzione&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Backup ====&lt;br /&gt;
&lt;br /&gt;
Oltre ad un &amp;quot;backup&amp;quot; che si occupa di salvare tutti i computer's della rete, ho aggiunto uno script per salvare giornalmente il database redis, come ulteriore sicurezza, i files sono salvati nella directory &amp;quot;/root&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.daily/backupredis /etc/cron.daily/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rete ==&lt;br /&gt;
&lt;br /&gt;
Al momento e` previsto che sia tutto sotto WiFi (quella onboard) del [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
Comunque bastera` modificare il firewall per accettare dati dalla ethernet se si rendesse necessario.&lt;br /&gt;
&lt;br /&gt;
Le centrali accessorie, tipo quella di [[CentRed|allarme]], che deve solo ricevere, non necessariamente dovranno trovarsi nella sottorete gestita da &amp;quot;livello 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Descrizione ==&lt;br /&gt;
&lt;br /&gt;
I 'segnali' arrivano sempre (?) a &amp;quot;MQTT broker&amp;quot;, vengono manipolati se necessario, ed inseriti nel database Redis.&lt;br /&gt;
&lt;br /&gt;
Dal database Redis sono di nuovo letti/scritti/modificati/manipolati ed inviati:&lt;br /&gt;
:e/o&lt;br /&gt;
::in report (testo, grafico, audio, video, ...)&lt;br /&gt;
:e/o&lt;br /&gt;
::alla centralina di allarme [[CentRed]]&lt;br /&gt;
:e/o&lt;br /&gt;
::reinviati a MQTT broker&lt;br /&gt;
:e/o&lt;br /&gt;
::inviati ad altre centraline livello 1&lt;br /&gt;
:e/o&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
=== Configurazione e Funzionamento ===&lt;br /&gt;
&lt;br /&gt;
(Sommariamente)&lt;br /&gt;
&lt;br /&gt;
Al primo avvio e` necesssario configurare prima il database Redis da utilizzare, poi quello della [[CentRed|centralina avvisi/allarmi]] (se avete intenzione di ricevere le comunicazioni relative agli allarmi e/o avvisi di malfunzionamenti).&lt;br /&gt;
&lt;br /&gt;
Una volta &amp;quot;letti&amp;quot; i segnali, e` opera dell'utente aggiungere alcune caratteristiche [[#Segnali]], fatto questo si passa alla creazione dei [[#Gruppi]].&lt;br /&gt;
&lt;br /&gt;
Definiti i [[#Gruppi]], si passa ad avviare i servizi necessari [[#Daemons]], che si occupano di generare i grafici Tempo-Valore/i o gestione degli allarmi/anomalie.&lt;br /&gt;
&lt;br /&gt;
== Arrivo dati e manipolazione ==&lt;br /&gt;
&lt;br /&gt;
I dati devono arrivare al broker MQTT nel formato:&lt;br /&gt;
&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
inviati nel topic:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fate riferimento alla [[#Tabella dati e valori]] per comprendere meglio il significato.&lt;br /&gt;
&lt;br /&gt;
Nell'immagine, una schermata dei test in corso, a sinistra gli errori di lettura, a destra un listato della &amp;quot;cgi-bin&amp;quot;, sotto i falsi dati inviati (mi servono per i test che sto` facendo ;) ), e in fondo i dati ricevuti (veri e falsi).&lt;br /&gt;
&lt;br /&gt;
[[File:Level1 201604170814.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mqtt2redis_d.py ===&lt;br /&gt;
&lt;br /&gt;
I dati MQTT vengono letti dal programma &amp;quot;mqtt2redis_d.py&amp;quot; che deve sempre essere in esecuzione (ho gia` preparato anche un &amp;quot;init.d&amp;quot;, che tengo ancora nella &amp;quot;cgi-bin&amp;quot;), questi li manipola inserendoli se non presenti, in due &amp;quot;chiavi&amp;quot; nel database (noSQL) Redis, la prima, e` per identificare il segnale:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
la seconda e` quella dei valori:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
valori che sono accodati ad ogni arrivo con l'aggiunta della data e ora, predisposti per una generazione di output in formato &amp;quot;csv&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== ''IMPORTANTE'' ==&lt;br /&gt;
&lt;br /&gt;
''Quello che segue non e` aggiornato di pari passo con l'aggiornamento del software e quant'altro necessario.''&lt;br /&gt;
&lt;br /&gt;
''Durante l'uso, nelle pagine di configurazione e modifica compaiono delle descrizioni che sono piu` veritiere/aggiornate, perche` scritte durante la stesura e/o modifica del software.''&lt;br /&gt;
&lt;br /&gt;
== Segnali ==&lt;br /&gt;
&lt;br /&gt;
Una volta pervenuto il primo valore di un segnale, e` possibile configurarlo inserendo alcuni dati che non sono presenti nella comunicazione MQTT:&lt;br /&gt;
&lt;br /&gt;
;Descrizione&lt;br /&gt;
:Meglio se breve, perche` usata anche nei riferimenti dei grafici, non solo per gli allarmi (per esempio: &amp;quot;ST1 Cucina&amp;quot; per sensore temperatura in cucina)&lt;br /&gt;
;UM (Unita` di misura)&lt;br /&gt;
;TempoRitardo&lt;br /&gt;
:Ancora non usata&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Specificare il range dei valori nel formato 0,100&lt;br /&gt;
:Utile per sonde che (per esempio) lavorano da 0 a 100 gradi&lt;br /&gt;
:Genera avviso/allarme se minore di o maggiore di&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Avviso se valore e` inferiore a quello impostato&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Aavviso se valore e` superiore a quello impostato&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:Previsto per i segnali analogici o negati&lt;br /&gt;
:Avviso quando valore uguale a ValoreOn&lt;br /&gt;
;Allarme&lt;br /&gt;
:Definire qua i valori che saranno usati come allarmi, per esempio: ValoreOn,ValoreMin&lt;br /&gt;
:Se sono impostati, ma non indicati qua, sono emessi dei semplici avvisi&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sonda temperatura (ovviamente falsa):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashTempMod Falsa2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sensore di movimento (pir, ovviamente falso):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashPirMod Falso2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
== Gruppi ==&lt;br /&gt;
&lt;br /&gt;
Per realizzare i raggruppamenti ho utilizzato le chiavi Redis di tipo &amp;quot;sets&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Al momento ho pensato ai soli gruppi riguardanti gli allarmi e i grafici (per esempio quelli di due o piu`, sonde di temperatura).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Puoi benissimo creare un gruppo con un solo sensore.&lt;br /&gt;
&lt;br /&gt;
Al solito, ho pensato ad una chiave univoca d'inserimento dei dati in Redis '''sets:type:ID''' (gruppo:tipo:identificatore).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gruppo&lt;br /&gt;
|&lt;br /&gt;
* sets&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* alarms&lt;br /&gt;
* graph&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore)&lt;br /&gt;
|&lt;br /&gt;
(definito da utente, esempi:)&lt;br /&gt;
* TemperatureBagno&lt;br /&gt;
* TemperaturePianoTerra&lt;br /&gt;
* luigi&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I gruppi sono definiti dall'utente, ed ogni volta che viene creato un nuovo gruppo (deve avere almeno un'utenza altrimenti si autoelimina), viene gia` creato il &amp;quot;Timer&amp;quot; di &amp;quot;campionamento&amp;quot;/&amp;quot;ritardo nuovo allarme&amp;quot;, preimpostato a 5 minuti (sono previsti valori da 1 a 60 minuti).&lt;br /&gt;
&lt;br /&gt;
''La pagina d'inserimento permette di inserire una chiave con un nome qualsiasi, non ho ancora &amp;quot;bloccato&amp;quot; e/o previsto un controllo sull'identificatore assegnato.''&lt;br /&gt;
&lt;br /&gt;
=== sets:*:ID:Config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Timer&lt;br /&gt;
|&lt;br /&gt;
* da 1 60 minuti&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Funzionamento&lt;br /&gt;
|&lt;br /&gt;
* On&lt;br /&gt;
* Off&lt;br /&gt;
* Auto&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) dalle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) alle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;graph&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
La chiave per questi gruppi e` previsto che sia: '''sets:graph:ID'''&lt;br /&gt;
&lt;br /&gt;
La chiave per il timer di campionamento e` previsto che sia: '''sets:graph:ID:Timer''' (ora e` generata automaticamente)&lt;br /&gt;
&lt;br /&gt;
La chiave per i dati campionati e la generazione del grafico (che sara` in formato csv) e` previsto che sia: '''sets:graph:ID:Valori''' (sara` creata ed aggiornata autonomamente, da un programma in python)&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;alarms&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Al momento come sopra, tranne che il Timer non servira` (o forse si, perche` sono previsti anche grafici dei PIR).&lt;br /&gt;
&lt;br /&gt;
==== Esempio d'inserimento gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Aggiungi chiavi &amp;quot;sets&amp;quot; Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysAddSets 1.png&lt;br /&gt;
File:Livello1-KeysAddSets 2.png&lt;br /&gt;
File:Livello1-KeysAddSets 3.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
::Nell'immagine e` gia` stato applicato il filtro '''*:graph:*'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModHash 1.png|Spostiamoci verso il basso e selezioniamo la seconda voce di modifica delle chiavi &amp;quot;hash&amp;quot;, quella relativa al &amp;quot;Config&amp;quot;:&lt;br /&gt;
File:Livello1-KeysModHash 2.png&lt;br /&gt;
File:Livello1-KeysModHash 3.png|e l'esempio di un allarme:&lt;br /&gt;
File:Livello1-KeysModHash 3a.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modifica di un gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModSets 2.png&lt;br /&gt;
File:Livello1-KeysModSets 3.png|Credo si spieghi da sola ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Daemons ==&lt;br /&gt;
&lt;br /&gt;
Intanto: non sono veri e propri &amp;quot;demoni&amp;quot;, sono script che l'utente avvia e ferma al bisogno.&lt;br /&gt;
&lt;br /&gt;
Specialmente quello degli allarmi (che mi sta` rompendo al cellulare da stamattina ;) ), e` da avviare quando uscite di casa, e fermare prima di rientrare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Daemons part1.png&lt;br /&gt;
File:Livello1-Daemons part2.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grafici (files .csv) ==&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;TIP&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Allarmi ==&lt;br /&gt;
&lt;br /&gt;
Per ogni gruppo creato, e` possibile eseguire il controllo allarmi, servono opportune preimpostazioni (configurazioni), poi e` possibile eseguire il software dalla pagina '''Daemons''':&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-Allarmi-Daemons.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Si puo` notare in esecuzione solo quello relativo ad una falsa sonda di temperatura, relativo ai [[Centralina livello 1/Test allarmi|test eseguiti]].&lt;br /&gt;
&lt;br /&gt;
L'eseguibile e` &amp;quot;/var/www/cgi-bin/setsalarms_d.py&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== setsalarms_d.py ===&lt;br /&gt;
&lt;br /&gt;
Perche` possa &amp;quot;funzionare&amp;quot; servono alcuni requisiti:&lt;br /&gt;
*Deve esistere il gruppo ed avere una configurazione (che e` preimpostata alla creazione)&lt;br /&gt;
*Il gruppo deve essere &amp;quot;on&amp;quot; o in modalita` &amp;quot;auto&amp;quot; (per default e` &amp;quot;off&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Tutti sono avvisi (li ho chiamati &amp;quot;alert&amp;quot;), alcuni possono e devono invece diventare allarmi (&amp;quot;alarm&amp;quot;). Perche` siano definiti allarmi, devono essere inseriti nella voce &amp;quot;Allarme&amp;quot;, presente nella configurazione della sonda (sensore, PIR, o quello che e`).&lt;br /&gt;
&lt;br /&gt;
Tipi di &amp;quot;alert&amp;quot;:&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero,[+-]Numero, una sonda 1wire pe esempio sarebbe: -55,+125&lt;br /&gt;
:;Alert&lt;br /&gt;
::Se il valore letto e` fuori dal range&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` inferiore&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` superiore&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:0 o 1&lt;br /&gt;
:Al momento e` previsto per sola sensoristica come: finecorsa, PIR, e altri segnali on/off&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` uguale&lt;br /&gt;
;Allarme&lt;br /&gt;
:Quello che e` allarme e non semplice avviso:&lt;br /&gt;
::ValoreOn&lt;br /&gt;
::ValoreMin&lt;br /&gt;
::ValoreMin,ValoreMax,ValoreOn&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
Per un'esempio di configurazione fate riferimento alla pagina [[Centralina livello 1/Test allarmi|Test Allarmi]].&lt;br /&gt;
&lt;br /&gt;
Il software invia gli avvisi/allarmi alla centralina [[CentRed]], e` questa poi ad occuparsi della trasmissione, discriminando il tipo dalla stringa con cui e` stato inviato. Altre informazioni alla pagina [[CentRed]].&lt;br /&gt;
&lt;br /&gt;
== Analizza e Modifica Valori ==&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto la possibilita` di manipolare i valori memorizzati nel database Redis.&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Selezione_Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sono ammesse solamente chiavi &amp;quot;:Valori&amp;quot;, la possibilita` di selezione dipende (al solito) dal filtro attivo nella pagina.&lt;br /&gt;
&lt;br /&gt;
Una volta scelta la chiave e cliccato su &amp;quot;Analizza e Modifica&amp;quot;, compare la pagina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dove e` possibile:&lt;br /&gt;
* Visualizzare tutti i valori&lt;br /&gt;
* Creare il file &amp;quot;.csv&amp;quot; da elaborare successivamente tramite l'apposita pagina&lt;br /&gt;
* Eliminare i dati ormai obsoleti (attenzione che non ho filtrato le immissioni, e` possibile anche fare il contrario)&lt;br /&gt;
&lt;br /&gt;
== Tabella dati e valori ==&lt;br /&gt;
&lt;br /&gt;
Denominazione dei campi e attibuzione dei valori standard (piu` o meno)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* Temperatura&lt;br /&gt;
* PIR&lt;br /&gt;
* Finecorsa&lt;br /&gt;
* Proximity&lt;br /&gt;
* Livello&lt;br /&gt;
* Rele`&lt;br /&gt;
* Termostato&lt;br /&gt;
* Valvola&lt;br /&gt;
* Motore&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione del segnale&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TipoIO&lt;br /&gt;
|&lt;br /&gt;
* I (Input/Ingresso)&lt;br /&gt;
* O (Output/Uscita)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segnale&lt;br /&gt;
|&lt;br /&gt;
* Analogico&lt;br /&gt;
* Digitale&lt;br /&gt;
* Testo&lt;br /&gt;
* I2C&lt;br /&gt;
* SPI&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Al momento l'ho soppresso, il tipo di segnale e` praticamente definito dal valore in entrata (per ora)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneC&lt;br /&gt;
|&lt;br /&gt;
* Casa&lt;br /&gt;
* Garage&lt;br /&gt;
* Giardino&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneP&lt;br /&gt;
|&lt;br /&gt;
* Piano0 / PianoZero&lt;br /&gt;
* Piano1 / PianoUno&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneS&lt;br /&gt;
|&lt;br /&gt;
* Cucina1&lt;br /&gt;
* Camera2&lt;br /&gt;
* Bagno1&lt;br /&gt;
* ...&lt;br /&gt;
* Cantina&lt;br /&gt;
* EsternoSala&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore, Utenza/ITEM)&lt;br /&gt;
|&lt;br /&gt;
* 1&lt;br /&gt;
* 2&lt;br /&gt;
* 3&lt;br /&gt;
* ..&lt;br /&gt;
* Up&lt;br /&gt;
* Down&lt;br /&gt;
* Left&lt;br /&gt;
* Right&lt;br /&gt;
* (altro ?)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Convenzioni usate ad oggi:&lt;br /&gt;
* STn sonda/sensore temperatura [n = numero]&lt;br /&gt;
* RHn sonda/sensore umidita` relativa [n = numero]&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Definito dall'utente che programma i &amp;quot;remote&amp;quot;, ma meglio definire una struttura di base ..&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valori&lt;br /&gt;
|&lt;br /&gt;
* TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori&lt;br /&gt;
|&lt;br /&gt;
Assegnato automaticamente dal programma&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UM (Unita` di Misura)&lt;br /&gt;
|&lt;br /&gt;
* °C&lt;br /&gt;
* V (tensione)&lt;br /&gt;
* A (assorbimento)&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Questo e` previsto solo per le segnalazioni/avvisi/allarmi .. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TempoRitardo (secondi)&lt;br /&gt;
|&lt;br /&gt;
* 0.000&lt;br /&gt;
* 1.002&lt;br /&gt;
* ...&lt;br /&gt;
* 99.000 (max impostabile)&lt;br /&gt;
|&lt;br /&gt;
Al momento non previsto, teoricamente i segnali dovrebbero arrivare gia` &amp;quot;filtrati&amp;quot; dai &amp;quot;remote&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! RangeValori&lt;br /&gt;
|&lt;br /&gt;
* 0,100&lt;br /&gt;
* -50,125&lt;br /&gt;
* 0,1&lt;br /&gt;
|&lt;br /&gt;
Da utilizzarsi per definire l'errore e generare una segnalazione di sonda guasta&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMin&lt;br /&gt;
|&lt;br /&gt;
* 10 (temperatura)&lt;br /&gt;
* 0 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sotto a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMax&lt;br /&gt;
|&lt;br /&gt;
* 40 (temperatura)&lt;br /&gt;
* 1 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sopra a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreOn&lt;br /&gt;
|&lt;br /&gt;
* 1 (quando attivo a segnale on)&lt;br /&gt;
* 0 (quando attivo a segnale off)&lt;br /&gt;
* [Valore]&lt;br /&gt;
|&lt;br /&gt;
Valore da utilizzare per alert/alarm, e per definire se si tratta di un segnale negato (zero) e trattarlo di conseguenza&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Allarme&lt;br /&gt;
|&lt;br /&gt;
* ValoreOn&lt;br /&gt;
* ValoreMin&lt;br /&gt;
* ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin&lt;br /&gt;
* ValoreOn,ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin,ValoreMax&lt;br /&gt;
* ValoreMin,ValoreMax&lt;br /&gt;
|&lt;br /&gt;
Quali sono da trattare come allarmi, di default, se impostati, sono trattati come alert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data (e ora)&lt;br /&gt;
|&lt;br /&gt;
* 2016/03/13 20:40:08&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valore&lt;br /&gt;
|&lt;br /&gt;
* 0&lt;br /&gt;
* 1&lt;br /&gt;
* 13&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Promemoria chiavi, codici e ... ==&lt;br /&gt;
&lt;br /&gt;
====== Dati (mqtt) ======&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Topic (mqtt) ======&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria segnale di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria gruppi di livello 1 (redis) ======&lt;br /&gt;
;TYPE&lt;br /&gt;
:graph&lt;br /&gt;
:alarms&lt;br /&gt;
'''sets:TYPE:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria configurazione gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Config'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Notes|Notes]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Primo avvio|Primo avvio]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Test allarmi|Test allarmi]]&lt;br /&gt;
&lt;br /&gt;
= Devices =&lt;br /&gt;
&lt;br /&gt;
Ad oggi, ho predisposto/preparato:&lt;br /&gt;
* [[PorTHable]], che invia valori di temperatura&lt;br /&gt;
* [[ ESP8266/DS1820toMQTT | DS1820toMQTT ]], sensore/i di temperatura&lt;br /&gt;
* [[ ESP8266/PIRtoMQTT | PIRtoMQTT ]], sensore di movimento (PIR)&lt;br /&gt;
* [[ ESP8266/SerialToMQTT_Repeater | SerialToMQTT Repeater ]], che funziona da &amp;quot;repeater&amp;quot;, ritrasmette i dati ricevuti via seriale al broker MQTT&lt;br /&gt;
* [[ Thermo ]], che invia il valore della temperatura (solo di riferimento ad oggi, non le altre sonde)&lt;br /&gt;
* [[ ENC28J60-ATMEGA328P-DS18B20 | ENC28J60 + ATMEGA328P + DS18B20 ]], sensore di temperatura in ethernet&lt;br /&gt;
* [[ Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | ATMEGA328P + ESP8266 + DHT + Rain]], sensore temperatura/umidita` (dht) e pioggia (rain)&lt;br /&gt;
* [[ ESP8266/DHT22toMQTT | DHT22toMQTT ]], sensore di temperatura e umidita`&lt;br /&gt;
* [[ Centralina_livello_1/Dev_HTRL_wAE | ATMEGA328P + ESP8266 + DHT + Rain + Photoresistor]], sensore temperatura/umidita` (dht), pioggia (rain) e luminosita` (photoresistor).&amp;lt;br&amp;gt; Nuova e migliorata (?) versione del precedente [[Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | device]]&lt;br /&gt;
* [[ Cronotermostato settimanale ]]&lt;br /&gt;
* [[ Centralina_livello_1/Centralina_livello_2_PIR | Centralina livello 2 - PIR ]]&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/telegram bot|Telegram Bot per Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
= Problemi e soluzioni ? =&lt;br /&gt;
&lt;br /&gt;
;Eliminazione file di swap&lt;br /&gt;
:Non so se sia stato un problema e sia utile&lt;br /&gt;
::[[Raspberry_PI-Raspbian-Personalizzazioni#Disattivazione|Disattivazione file di swap]]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore salvataggio in background&lt;br /&gt;
:[https://jee-appy.blogspot.it/2016/04/can-not-save-in-background-fork-redis.html Can't save in background: fork: Cannot allocate memory Redis]&lt;br /&gt;
:[https://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory redis bgsave failed because fork Cannot allocate memory]&lt;br /&gt;
:[https://stackoverflow.com/questions/19581059/misconf-redis-is-configured-to-save-rdb-snapshots MISCONF Redis is configured to save RDB snapshots]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore avvio del server&lt;br /&gt;
:Dopo un ripristino del sistema ho avuto dei problemi di permessi al file &amp;quot;dump.rdb&amp;quot; (che ho voluto ricopiare per riprendermi alcune impostazioni), ho reimpostato in &amp;quot;redis:redis&amp;quot; (directory &amp;quot;/var/lib/redis&amp;quot; inclusa) il proprietario e settato i permessi a 660.&lt;br /&gt;
:Ho avuto il medesimo problema dopo un'aggiornamento del sistema operativo che, non essendo andato a buon fine, mi ha costretto ad un ripristino da precedente backup.&lt;br /&gt;
::Per questo caso ho salvato il file &amp;quot;/var/lib/redis/dump.rdb&amp;quot;, eliminato i pacchetti redis (apt purge redis*) e reinstallato nuovamente (apt install redis), ripristinando/ricopiando poi il file &amp;quot;dump&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;I daemon non vengono eseguiti dalle pagine web&lt;br /&gt;
:Non sono stati corretti i permessi della directory del webserver &amp;quot;/var/www&amp;quot; [[#Level1_.28www.29]]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7555</id>
		<title>Centralina livello 1</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7555"/>
		<updated>2025-03-08T07:26:03Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Problemi e soluzioni ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
![[File:Livello1-Debug.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Centralina livello 1&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Centralina generale (?) gestione segnali&lt;br /&gt;
|-&lt;br /&gt;
|Repository: https://github.com/raspibo/Livello1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
= Centralina  livello 1 =&lt;br /&gt;
&lt;br /&gt;
;ATTENZIONE&lt;br /&gt;
:Tutte le immagini sono puramente indicative, il progetto e` in pieno sviluppo, tutto e` passibile di modifiche, anche sostanziali.&lt;br /&gt;
:L'immagine di presentazione si riferisce alla sezione &amp;quot;debug&amp;quot;, realizzata con Dokuwiki e (ad oggi) non fa parte del progetto (o si ?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prima e sommaria descrizione ==&lt;br /&gt;
&lt;br /&gt;
Centralina di controllo segnali.&lt;br /&gt;
&lt;br /&gt;
:(Ad oggi)&lt;br /&gt;
:Acquisisce segnali, li suddivide in gruppi mono o multi utenza, dei quali: realizza grafici temporali, crea e gestisce allarmi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dal campo arrivano i valori della 'sensoristica' sottoforma di &amp;quot;Identificatore Valore&amp;quot;, da queste informazioni sono aggiunti i sensori che eventualmente non sono presenti e le relative 'liste' dei valori (sono generate due chiavi, una dell'utenza e l'altra dei valori), altrimenti viene solo accodato il valore nella rispettiva lista (aggiungendo data-ora-minuti-secondi).&lt;br /&gt;
&lt;br /&gt;
Acquisiti i sensori, e` possibile il loro raggruppamento (anche una sola utenza) ed il campionamento dei valori a tempi prestabiliti (generazione grafici tempo/valore).&lt;br /&gt;
&lt;br /&gt;
Sempre previo raggruppamento (sempre &amp;quot;anche di un solo sensore&amp;quot;), e` possibile attivare/disattivare i relativi allarmi, il classico ON/OFF, ma anche un'automatico (che per esempio attivi i sensori del solaio/cantine dalle 20 alle 8, quando e` certo che nessuno si rechi in quegli spazi).&lt;br /&gt;
&lt;br /&gt;
E poi il resto .. che sarebbe di arrivare non solo a leggere/interpretare segnali, ma anche a pilotare utenze (luci, serrande, elettrodomestici, ...)&lt;br /&gt;
&lt;br /&gt;
L'idea e` che tutto questo sia gestibile da:&lt;br /&gt;
# interfaccia web&lt;br /&gt;
#* browser&lt;br /&gt;
#* cellulare&lt;br /&gt;
# linea di comando&lt;br /&gt;
# terminali operatore (display+tastiere)&lt;br /&gt;
# pulsanti, lampade, selettori, ..&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
== Hardware e Software ==&lt;br /&gt;
&lt;br /&gt;
;Hardware&lt;br /&gt;
:Versione 1 - [[Raspberry Pi 3]], perche` completa di WiFi e Bluetooth&lt;br /&gt;
:Versione 2 (2018) - [[Raspberry Pi]] con chiavetta WiFi&lt;br /&gt;
&lt;br /&gt;
;Software&lt;br /&gt;
:MQTT Broker (Mosquitto), perche` in grado di dialogare con la maggior parte dei componenti (Arduino, ESP8266, eccetera)&lt;br /&gt;
:Redis, perche` servira` un database di appoggio e manipolazione per alcuni dati, e perche` servira` una struttura dati &amp;quot;manipolabile&amp;quot; (dovremo poter aggiungere e togliere &amp;quot;campi:valori&amp;quot; ad una &amp;quot;chiave&amp;quot;, e aggiungere/togliere chiavi a delle liste, ecc. ecc.)&lt;br /&gt;
:Nginx, non si puo` fare senza web server&lt;br /&gt;
:... e poi non so cos'altro&lt;br /&gt;
:Script cgi&lt;br /&gt;
:javascript&lt;br /&gt;
: ...&lt;br /&gt;
&lt;br /&gt;
Sistema operativo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
$ lsb_release -a&lt;br /&gt;
No LSB modules are available.&lt;br /&gt;
Distributor ID: Raspbian&lt;br /&gt;
Description:    Raspbian GNU/Linux 11 (bullseye)&lt;br /&gt;
Release:        11&lt;br /&gt;
Codename:       bullseye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Embedded page --&amp;gt;&lt;br /&gt;
{{:Raspberry_Pi-Raspbian_default_post-install}}&lt;br /&gt;
&lt;br /&gt;
== Access Point ==&lt;br /&gt;
&lt;br /&gt;
Installato/configurato &amp;quot;[[Raspberry Pi Access Point WEP2]]&amp;quot;, sfruttando il wifi integrato nel [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
Installazione dei pacchetti utili, necessari (e qualcuno inutile):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt install nginx fcgiwrap redis-server python3-redis mosquitto ssl-cert php8.0-fpm php8.0-xml python3-pip python3-paho-mqtt python3-pandas python3-cairosvg python3-tinycss python3-cssselect git mosquitto-clients redis-tools&lt;br /&gt;
pip3 install python-telegram-bot pygal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nelle precedenti versioni fu installato manualmente anche [http://www.dokuwiki.org dokuwiki], utilizzato per segnarsi appunti vari (e un po` di debug), e` facoltativo e non descritto le operazioni necessarie, ma i files di configurazione del web server si.&lt;br /&gt;
&lt;br /&gt;
E` necessario scaricare il repository con i programmi (script python per lo piu`), si puo` fare da normale utente, per esempio:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/Livello1.git&lt;br /&gt;
cd Livello1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/level1 /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-enabled/level1 /etc/nginx/sites-enabled/&lt;br /&gt;
#cp etc/nginx/dokuwiki* etc/nginx/fcgiwrap.conf /etc/nginx/ # se installate dokuwiki&lt;br /&gt;
cp etc/nginx/fcgiwrap.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
==== Redis (database) ====&lt;br /&gt;
&lt;br /&gt;
Nel file &amp;quot;/etc/redis/redis.conf&amp;quot; ho modificato le linee:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
bind 127.0.0.1 ::1&lt;br /&gt;
protected-mode yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
in&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#bind 127.0.0.1 ::1&lt;br /&gt;
protected-mode no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Level1 (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu var/www/ /var/&lt;br /&gt;
chown www-data:www-data -R /var/www/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serve anche la scrittura in &amp;quot;www&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chmod 775 /var/www&lt;br /&gt;
chown :www-data -R /var/www    # oppure si poteva eliminare il &amp;quot;/&amp;quot; dal &amp;quot;chown&amp;quot; precedente&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
:Potrebbe essere necessario creare la directory &amp;quot;/var/www/archive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Mosquitto ====&lt;br /&gt;
&lt;br /&gt;
Copiare il file di configurazione dal repository ed assicurarsi i giusti permessi e proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/mosquitto/conf.d/myadd.conf /etc/mosquitto/conf.d/&lt;br /&gt;
chown root:root /etc/mosquitto/conf.d/myadd.conf&lt;br /&gt;
chmod 644 /etc/mosquitto/conf.d/myadd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Telegram Bot ====&lt;br /&gt;
&lt;br /&gt;
Scaricare il repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone hhttps://github.com/raspibo/bot4livello1.git&lt;br /&gt;
cd bot4livello1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Questo programma fu creato in origine nella directory &amp;quot;/home/pi/project/csv2image2telegram&amp;quot;, quindi tutti i riferimenti sono a questa, copiate qua il programma oppure modificate la directory dove necessario (&amp;quot;/etc/rc.local&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Il programma dev'essere esguito al boot di sistema e rimanere sempre in esecuzione.&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
All'avvio del sistema, devono andare in esecuzione alcuni script (quasi &amp;quot;daemons&amp;quot;) e rimanere attivi, per questo si deve modificare il file &amp;quot;/etc/rc.local&amp;quot; (lo trovate nel repository git):&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Power On &amp;quot;Level 1&amp;quot;&lt;br /&gt;
DAEMON_NAME=mqtt2redis_d&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviata correttamente Livello 1, oppure mqtt2redis_d e\` gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio \&amp;quot;mqtt2redis_d\&amp;quot;&amp;quot;&lt;br /&gt;
                #/var/www/cgi-bin/mqtt2redis_init.d.sh start # 20180115&lt;br /&gt;
        su -c &amp;quot;/var/www/cgi-bin/mqtt2redis_init.d.sh start&amp;quot; pi&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Centralina level 1 [ri]avviata ..&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Start Telegram Bot&lt;br /&gt;
DAEMON_NAME=bot4livello1&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato il Telegram Bot, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio Telegram Bot&amp;quot;&lt;br /&gt;
                cd /home/pi/project/csv2image2telegram&lt;br /&gt;
                su pi -c &amp;quot;python3 bot4livello1.py &amp;amp;&amp;quot;&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio bot4livello1.py&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inoltre, visto che puo` capitare s'interrompano, specialmente nelle prove di nuovi [[Centralina_livello_1#Devices|devices]], sono predisposti dei &amp;quot;check orari&amp;quot; che nel caso, li riavviano:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.hourly/mqtt2redis_check /etc/cron.hourly/&lt;br /&gt;
cp -vapu etc/cron.hourly/bot4livello1_check /etc/cron.hourly/ # se installerete anche il bot telegram&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ho anche previsto un messaggio settimanale di centralina in funzione tramite crontab dell'utente pi, copiate il file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu var/spool/cron/crontabs/pi /var/spool/cron/crontabs/&lt;br /&gt;
chown root:root /var/spool/cron/crontabs/pi&lt;br /&gt;
chmod 600 /var/spool/cron/crontabs/pi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
oppure aggiungete la linea (col comando &amp;quot;crontab -e&amp;quot;):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
0 7 * * 0 redis-cli -h centred hmset msg:redis:alive:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Messaggio ciclico, centralina $(hostname) in funzione&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Backup ====&lt;br /&gt;
&lt;br /&gt;
Oltre ad un &amp;quot;backup&amp;quot; che si occupa di salvare tutti i computer's della rete, ho aggiunto uno script per salvare giornalmente il database redis, come ulteriore sicurezza, i files sono salvati nella directory &amp;quot;/root&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.daily/backupredis /etc/cron.daily/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rete ==&lt;br /&gt;
&lt;br /&gt;
Al momento e` previsto che sia tutto sotto WiFi (quella onboard) del [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
Comunque bastera` modificare il firewall per accettare dati dalla ethernet se si rendesse necessario.&lt;br /&gt;
&lt;br /&gt;
Le centrali accessorie, tipo quella di [[CentRed|allarme]], che deve solo ricevere, non necessariamente dovranno trovarsi nella sottorete gestita da &amp;quot;livello 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Descrizione ==&lt;br /&gt;
&lt;br /&gt;
I 'segnali' arrivano sempre (?) a &amp;quot;MQTT broker&amp;quot;, vengono manipolati se necessario, ed inseriti nel database Redis.&lt;br /&gt;
&lt;br /&gt;
Dal database Redis sono di nuovo letti/scritti/modificati/manipolati ed inviati:&lt;br /&gt;
:e/o&lt;br /&gt;
::in report (testo, grafico, audio, video, ...)&lt;br /&gt;
:e/o&lt;br /&gt;
::alla centralina di allarme [[CentRed]]&lt;br /&gt;
:e/o&lt;br /&gt;
::reinviati a MQTT broker&lt;br /&gt;
:e/o&lt;br /&gt;
::inviati ad altre centraline livello 1&lt;br /&gt;
:e/o&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
=== Configurazione e Funzionamento ===&lt;br /&gt;
&lt;br /&gt;
(Sommariamente)&lt;br /&gt;
&lt;br /&gt;
Al primo avvio e` necesssario configurare prima il database Redis da utilizzare, poi quello della [[CentRed|centralina avvisi/allarmi]] (se avete intenzione di ricevere le comunicazioni relative agli allarmi e/o avvisi di malfunzionamenti).&lt;br /&gt;
&lt;br /&gt;
Una volta &amp;quot;letti&amp;quot; i segnali, e` opera dell'utente aggiungere alcune caratteristiche [[#Segnali]], fatto questo si passa alla creazione dei [[#Gruppi]].&lt;br /&gt;
&lt;br /&gt;
Definiti i [[#Gruppi]], si passa ad avviare i servizi necessari [[#Daemons]], che si occupano di generare i grafici Tempo-Valore/i o gestione degli allarmi/anomalie.&lt;br /&gt;
&lt;br /&gt;
== Arrivo dati e manipolazione ==&lt;br /&gt;
&lt;br /&gt;
I dati devono arrivare al broker MQTT nel formato:&lt;br /&gt;
&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
inviati nel topic:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fate riferimento alla [[#Tabella dati e valori]] per comprendere meglio il significato.&lt;br /&gt;
&lt;br /&gt;
Nell'immagine, una schermata dei test in corso, a sinistra gli errori di lettura, a destra un listato della &amp;quot;cgi-bin&amp;quot;, sotto i falsi dati inviati (mi servono per i test che sto` facendo ;) ), e in fondo i dati ricevuti (veri e falsi).&lt;br /&gt;
&lt;br /&gt;
[[File:Level1 201604170814.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mqtt2redis_d.py ===&lt;br /&gt;
&lt;br /&gt;
I dati MQTT vengono letti dal programma &amp;quot;mqtt2redis_d.py&amp;quot; che deve sempre essere in esecuzione (ho gia` preparato anche un &amp;quot;init.d&amp;quot;, che tengo ancora nella &amp;quot;cgi-bin&amp;quot;), questi li manipola inserendoli se non presenti, in due &amp;quot;chiavi&amp;quot; nel database (noSQL) Redis, la prima, e` per identificare il segnale:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
la seconda e` quella dei valori:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
valori che sono accodati ad ogni arrivo con l'aggiunta della data e ora, predisposti per una generazione di output in formato &amp;quot;csv&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== ''IMPORTANTE'' ==&lt;br /&gt;
&lt;br /&gt;
''Quello che segue non e` aggiornato di pari passo con l'aggiornamento del software e quant'altro necessario.''&lt;br /&gt;
&lt;br /&gt;
''Durante l'uso, nelle pagine di configurazione e modifica compaiono delle descrizioni che sono piu` veritiere/aggiornate, perche` scritte durante la stesura e/o modifica del software.''&lt;br /&gt;
&lt;br /&gt;
== Segnali ==&lt;br /&gt;
&lt;br /&gt;
Una volta pervenuto il primo valore di un segnale, e` possibile configurarlo inserendo alcuni dati che non sono presenti nella comunicazione MQTT:&lt;br /&gt;
&lt;br /&gt;
;Descrizione&lt;br /&gt;
:Meglio se breve, perche` usata anche nei riferimenti dei grafici, non solo per gli allarmi (per esempio: &amp;quot;ST1 Cucina&amp;quot; per sensore temperatura in cucina)&lt;br /&gt;
;UM (Unita` di misura)&lt;br /&gt;
;TempoRitardo&lt;br /&gt;
:Ancora non usata&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Specificare il range dei valori nel formato 0,100&lt;br /&gt;
:Utile per sonde che (per esempio) lavorano da 0 a 100 gradi&lt;br /&gt;
:Genera avviso/allarme se minore di o maggiore di&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Avviso se valore e` inferiore a quello impostato&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Aavviso se valore e` superiore a quello impostato&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:Previsto per i segnali analogici o negati&lt;br /&gt;
:Avviso quando valore uguale a ValoreOn&lt;br /&gt;
;Allarme&lt;br /&gt;
:Definire qua i valori che saranno usati come allarmi, per esempio: ValoreOn,ValoreMin&lt;br /&gt;
:Se sono impostati, ma non indicati qua, sono emessi dei semplici avvisi&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sonda temperatura (ovviamente falsa):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashTempMod Falsa2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sensore di movimento (pir, ovviamente falso):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashPirMod Falso2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
== Gruppi ==&lt;br /&gt;
&lt;br /&gt;
Per realizzare i raggruppamenti ho utilizzato le chiavi Redis di tipo &amp;quot;sets&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Al momento ho pensato ai soli gruppi riguardanti gli allarmi e i grafici (per esempio quelli di due o piu`, sonde di temperatura).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Puoi benissimo creare un gruppo con un solo sensore.&lt;br /&gt;
&lt;br /&gt;
Al solito, ho pensato ad una chiave univoca d'inserimento dei dati in Redis '''sets:type:ID''' (gruppo:tipo:identificatore).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gruppo&lt;br /&gt;
|&lt;br /&gt;
* sets&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* alarms&lt;br /&gt;
* graph&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore)&lt;br /&gt;
|&lt;br /&gt;
(definito da utente, esempi:)&lt;br /&gt;
* TemperatureBagno&lt;br /&gt;
* TemperaturePianoTerra&lt;br /&gt;
* luigi&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I gruppi sono definiti dall'utente, ed ogni volta che viene creato un nuovo gruppo (deve avere almeno un'utenza altrimenti si autoelimina), viene gia` creato il &amp;quot;Timer&amp;quot; di &amp;quot;campionamento&amp;quot;/&amp;quot;ritardo nuovo allarme&amp;quot;, preimpostato a 5 minuti (sono previsti valori da 1 a 60 minuti).&lt;br /&gt;
&lt;br /&gt;
''La pagina d'inserimento permette di inserire una chiave con un nome qualsiasi, non ho ancora &amp;quot;bloccato&amp;quot; e/o previsto un controllo sull'identificatore assegnato.''&lt;br /&gt;
&lt;br /&gt;
=== sets:*:ID:Config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Timer&lt;br /&gt;
|&lt;br /&gt;
* da 1 60 minuti&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Funzionamento&lt;br /&gt;
|&lt;br /&gt;
* On&lt;br /&gt;
* Off&lt;br /&gt;
* Auto&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) dalle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) alle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;graph&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
La chiave per questi gruppi e` previsto che sia: '''sets:graph:ID'''&lt;br /&gt;
&lt;br /&gt;
La chiave per il timer di campionamento e` previsto che sia: '''sets:graph:ID:Timer''' (ora e` generata automaticamente)&lt;br /&gt;
&lt;br /&gt;
La chiave per i dati campionati e la generazione del grafico (che sara` in formato csv) e` previsto che sia: '''sets:graph:ID:Valori''' (sara` creata ed aggiornata autonomamente, da un programma in python)&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;alarms&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Al momento come sopra, tranne che il Timer non servira` (o forse si, perche` sono previsti anche grafici dei PIR).&lt;br /&gt;
&lt;br /&gt;
==== Esempio d'inserimento gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Aggiungi chiavi &amp;quot;sets&amp;quot; Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysAddSets 1.png&lt;br /&gt;
File:Livello1-KeysAddSets 2.png&lt;br /&gt;
File:Livello1-KeysAddSets 3.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
::Nell'immagine e` gia` stato applicato il filtro '''*:graph:*'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModHash 1.png|Spostiamoci verso il basso e selezioniamo la seconda voce di modifica delle chiavi &amp;quot;hash&amp;quot;, quella relativa al &amp;quot;Config&amp;quot;:&lt;br /&gt;
File:Livello1-KeysModHash 2.png&lt;br /&gt;
File:Livello1-KeysModHash 3.png|e l'esempio di un allarme:&lt;br /&gt;
File:Livello1-KeysModHash 3a.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modifica di un gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModSets 2.png&lt;br /&gt;
File:Livello1-KeysModSets 3.png|Credo si spieghi da sola ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Daemons ==&lt;br /&gt;
&lt;br /&gt;
Intanto: non sono veri e propri &amp;quot;demoni&amp;quot;, sono script che l'utente avvia e ferma al bisogno.&lt;br /&gt;
&lt;br /&gt;
Specialmente quello degli allarmi (che mi sta` rompendo al cellulare da stamattina ;) ), e` da avviare quando uscite di casa, e fermare prima di rientrare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Daemons part1.png&lt;br /&gt;
File:Livello1-Daemons part2.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grafici (files .csv) ==&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;TIP&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Allarmi ==&lt;br /&gt;
&lt;br /&gt;
Per ogni gruppo creato, e` possibile eseguire il controllo allarmi, servono opportune preimpostazioni (configurazioni), poi e` possibile eseguire il software dalla pagina '''Daemons''':&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-Allarmi-Daemons.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Si puo` notare in esecuzione solo quello relativo ad una falsa sonda di temperatura, relativo ai [[Centralina livello 1/Test allarmi|test eseguiti]].&lt;br /&gt;
&lt;br /&gt;
L'eseguibile e` &amp;quot;/var/www/cgi-bin/setsalarms_d.py&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== setsalarms_d.py ===&lt;br /&gt;
&lt;br /&gt;
Perche` possa &amp;quot;funzionare&amp;quot; servono alcuni requisiti:&lt;br /&gt;
*Deve esistere il gruppo ed avere una configurazione (che e` preimpostata alla creazione)&lt;br /&gt;
*Il gruppo deve essere &amp;quot;on&amp;quot; o in modalita` &amp;quot;auto&amp;quot; (per default e` &amp;quot;off&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Tutti sono avvisi (li ho chiamati &amp;quot;alert&amp;quot;), alcuni possono e devono invece diventare allarmi (&amp;quot;alarm&amp;quot;). Perche` siano definiti allarmi, devono essere inseriti nella voce &amp;quot;Allarme&amp;quot;, presente nella configurazione della sonda (sensore, PIR, o quello che e`).&lt;br /&gt;
&lt;br /&gt;
Tipi di &amp;quot;alert&amp;quot;:&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero,[+-]Numero, una sonda 1wire pe esempio sarebbe: -55,+125&lt;br /&gt;
:;Alert&lt;br /&gt;
::Se il valore letto e` fuori dal range&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` inferiore&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` superiore&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:0 o 1&lt;br /&gt;
:Al momento e` previsto per sola sensoristica come: finecorsa, PIR, e altri segnali on/off&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` uguale&lt;br /&gt;
;Allarme&lt;br /&gt;
:Quello che e` allarme e non semplice avviso:&lt;br /&gt;
::ValoreOn&lt;br /&gt;
::ValoreMin&lt;br /&gt;
::ValoreMin,ValoreMax,ValoreOn&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
Per un'esempio di configurazione fate riferimento alla pagina [[Centralina livello 1/Test allarmi|Test Allarmi]].&lt;br /&gt;
&lt;br /&gt;
Il software invia gli avvisi/allarmi alla centralina [[CentRed]], e` questa poi ad occuparsi della trasmissione, discriminando il tipo dalla stringa con cui e` stato inviato. Altre informazioni alla pagina [[CentRed]].&lt;br /&gt;
&lt;br /&gt;
== Analizza e Modifica Valori ==&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto la possibilita` di manipolare i valori memorizzati nel database Redis.&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Selezione_Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sono ammesse solamente chiavi &amp;quot;:Valori&amp;quot;, la possibilita` di selezione dipende (al solito) dal filtro attivo nella pagina.&lt;br /&gt;
&lt;br /&gt;
Una volta scelta la chiave e cliccato su &amp;quot;Analizza e Modifica&amp;quot;, compare la pagina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dove e` possibile:&lt;br /&gt;
* Visualizzare tutti i valori&lt;br /&gt;
* Creare il file &amp;quot;.csv&amp;quot; da elaborare successivamente tramite l'apposita pagina&lt;br /&gt;
* Eliminare i dati ormai obsoleti (attenzione che non ho filtrato le immissioni, e` possibile anche fare il contrario)&lt;br /&gt;
&lt;br /&gt;
== Tabella dati e valori ==&lt;br /&gt;
&lt;br /&gt;
Denominazione dei campi e attibuzione dei valori standard (piu` o meno)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* Temperatura&lt;br /&gt;
* PIR&lt;br /&gt;
* Finecorsa&lt;br /&gt;
* Proximity&lt;br /&gt;
* Livello&lt;br /&gt;
* Rele`&lt;br /&gt;
* Termostato&lt;br /&gt;
* Valvola&lt;br /&gt;
* Motore&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione del segnale&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TipoIO&lt;br /&gt;
|&lt;br /&gt;
* I (Input/Ingresso)&lt;br /&gt;
* O (Output/Uscita)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segnale&lt;br /&gt;
|&lt;br /&gt;
* Analogico&lt;br /&gt;
* Digitale&lt;br /&gt;
* Testo&lt;br /&gt;
* I2C&lt;br /&gt;
* SPI&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Al momento l'ho soppresso, il tipo di segnale e` praticamente definito dal valore in entrata (per ora)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneC&lt;br /&gt;
|&lt;br /&gt;
* Casa&lt;br /&gt;
* Garage&lt;br /&gt;
* Giardino&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneP&lt;br /&gt;
|&lt;br /&gt;
* Piano0 / PianoZero&lt;br /&gt;
* Piano1 / PianoUno&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneS&lt;br /&gt;
|&lt;br /&gt;
* Cucina1&lt;br /&gt;
* Camera2&lt;br /&gt;
* Bagno1&lt;br /&gt;
* ...&lt;br /&gt;
* Cantina&lt;br /&gt;
* EsternoSala&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore, Utenza/ITEM)&lt;br /&gt;
|&lt;br /&gt;
* 1&lt;br /&gt;
* 2&lt;br /&gt;
* 3&lt;br /&gt;
* ..&lt;br /&gt;
* Up&lt;br /&gt;
* Down&lt;br /&gt;
* Left&lt;br /&gt;
* Right&lt;br /&gt;
* (altro ?)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Convenzioni usate ad oggi:&lt;br /&gt;
* STn sonda/sensore temperatura [n = numero]&lt;br /&gt;
* RHn sonda/sensore umidita` relativa [n = numero]&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Definito dall'utente che programma i &amp;quot;remote&amp;quot;, ma meglio definire una struttura di base ..&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valori&lt;br /&gt;
|&lt;br /&gt;
* TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori&lt;br /&gt;
|&lt;br /&gt;
Assegnato automaticamente dal programma&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UM (Unita` di Misura)&lt;br /&gt;
|&lt;br /&gt;
* °C&lt;br /&gt;
* V (tensione)&lt;br /&gt;
* A (assorbimento)&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Questo e` previsto solo per le segnalazioni/avvisi/allarmi .. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TempoRitardo (secondi)&lt;br /&gt;
|&lt;br /&gt;
* 0.000&lt;br /&gt;
* 1.002&lt;br /&gt;
* ...&lt;br /&gt;
* 99.000 (max impostabile)&lt;br /&gt;
|&lt;br /&gt;
Al momento non previsto, teoricamente i segnali dovrebbero arrivare gia` &amp;quot;filtrati&amp;quot; dai &amp;quot;remote&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! RangeValori&lt;br /&gt;
|&lt;br /&gt;
* 0,100&lt;br /&gt;
* -50,125&lt;br /&gt;
* 0,1&lt;br /&gt;
|&lt;br /&gt;
Da utilizzarsi per definire l'errore e generare una segnalazione di sonda guasta&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMin&lt;br /&gt;
|&lt;br /&gt;
* 10 (temperatura)&lt;br /&gt;
* 0 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sotto a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMax&lt;br /&gt;
|&lt;br /&gt;
* 40 (temperatura)&lt;br /&gt;
* 1 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sopra a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreOn&lt;br /&gt;
|&lt;br /&gt;
* 1 (quando attivo a segnale on)&lt;br /&gt;
* 0 (quando attivo a segnale off)&lt;br /&gt;
* [Valore]&lt;br /&gt;
|&lt;br /&gt;
Valore da utilizzare per alert/alarm, e per definire se si tratta di un segnale negato (zero) e trattarlo di conseguenza&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Allarme&lt;br /&gt;
|&lt;br /&gt;
* ValoreOn&lt;br /&gt;
* ValoreMin&lt;br /&gt;
* ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin&lt;br /&gt;
* ValoreOn,ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin,ValoreMax&lt;br /&gt;
* ValoreMin,ValoreMax&lt;br /&gt;
|&lt;br /&gt;
Quali sono da trattare come allarmi, di default, se impostati, sono trattati come alert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data (e ora)&lt;br /&gt;
|&lt;br /&gt;
* 2016/03/13 20:40:08&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valore&lt;br /&gt;
|&lt;br /&gt;
* 0&lt;br /&gt;
* 1&lt;br /&gt;
* 13&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Promemoria chiavi, codici e ... ==&lt;br /&gt;
&lt;br /&gt;
====== Dati (mqtt) ======&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Topic (mqtt) ======&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria segnale di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria gruppi di livello 1 (redis) ======&lt;br /&gt;
;TYPE&lt;br /&gt;
:graph&lt;br /&gt;
:alarms&lt;br /&gt;
'''sets:TYPE:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria configurazione gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Config'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Notes|Notes]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Primo avvio|Primo avvio]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Test allarmi|Test allarmi]]&lt;br /&gt;
&lt;br /&gt;
= Devices =&lt;br /&gt;
&lt;br /&gt;
Ad oggi, ho predisposto/preparato:&lt;br /&gt;
* [[PorTHable]], che invia valori di temperatura&lt;br /&gt;
* [[ ESP8266/DS1820toMQTT | DS1820toMQTT ]], sensore/i di temperatura&lt;br /&gt;
* [[ ESP8266/PIRtoMQTT | PIRtoMQTT ]], sensore di movimento (PIR)&lt;br /&gt;
* [[ ESP8266/SerialToMQTT_Repeater | SerialToMQTT Repeater ]], che funziona da &amp;quot;repeater&amp;quot;, ritrasmette i dati ricevuti via seriale al broker MQTT&lt;br /&gt;
* [[ Thermo ]], che invia il valore della temperatura (solo di riferimento ad oggi, non le altre sonde)&lt;br /&gt;
* [[ ENC28J60-ATMEGA328P-DS18B20 | ENC28J60 + ATMEGA328P + DS18B20 ]], sensore di temperatura in ethernet&lt;br /&gt;
* [[ Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | ATMEGA328P + ESP8266 + DHT + Rain]], sensore temperatura/umidita` (dht) e pioggia (rain)&lt;br /&gt;
* [[ ESP8266/DHT22toMQTT | DHT22toMQTT ]], sensore di temperatura e umidita`&lt;br /&gt;
* [[ Centralina_livello_1/Dev_HTRL_wAE | ATMEGA328P + ESP8266 + DHT + Rain + Photoresistor]], sensore temperatura/umidita` (dht), pioggia (rain) e luminosita` (photoresistor).&amp;lt;br&amp;gt; Nuova e migliorata (?) versione del precedente [[Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | device]]&lt;br /&gt;
* [[ Cronotermostato settimanale ]]&lt;br /&gt;
* [[ Centralina_livello_1/Centralina_livello_2_PIR | Centralina livello 2 - PIR ]]&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/telegram bot|Telegram Bot per Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
= Problemi e soluzioni ? =&lt;br /&gt;
&lt;br /&gt;
;Eliminazione file di swap&lt;br /&gt;
:Non so se sia stato un problema e sia utile&lt;br /&gt;
::[[Raspberry_PI-Raspbian-Personalizzazioni#Disattivazione|Disattivazione file di swap]]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore salvataggio in background&lt;br /&gt;
:[https://jee-appy.blogspot.it/2016/04/can-not-save-in-background-fork-redis.html Can't save in background: fork: Cannot allocate memory Redis]&lt;br /&gt;
:[https://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory redis bgsave failed because fork Cannot allocate memory]&lt;br /&gt;
:[https://stackoverflow.com/questions/19581059/misconf-redis-is-configured-to-save-rdb-snapshots MISCONF Redis is configured to save RDB snapshots]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore avvio del server&lt;br /&gt;
:Dopo un ripristino del sistema ho avuto dei problemi di permessi al file &amp;quot;dump.rdb&amp;quot; (che ho voluto ricopiare per riprendermi alcune impostazioni), ho reimpostato in &amp;quot;redis:redis&amp;quot; (directory &amp;quot;/var/lib/redis&amp;quot; inclusa) il proprietario e settato i permessi a 660.&lt;br /&gt;
:Ho avuto il medesimo problema dopo un'aggiornamento del sistema operativo che, non essendo andato a buon fine, mi ha costretto ad un ripristino da precedente backup.&lt;br /&gt;
::Per questo caso ho salvato il file &amp;quot;/var/lib/redis/dump.rdb&amp;quot;, eliminato i pacchetti redis (apt purge redis*) e reinstallato nuovamente (apt install redis), ripristinando/ricopiando poi il file &amp;quot;dump&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;I daemon non vengono eseguiti dalle pagine web&lt;br /&gt;
:Non sono stati corretti i permessi della directory del webserver &amp;quot;/var/www&amp;quot; [[#Level1_.28www.29]]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7554</id>
		<title>Centralina livello 1</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7554"/>
		<updated>2025-03-08T07:21:44Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Install */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
![[File:Livello1-Debug.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Centralina livello 1&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Centralina generale (?) gestione segnali&lt;br /&gt;
|-&lt;br /&gt;
|Repository: https://github.com/raspibo/Livello1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
= Centralina  livello 1 =&lt;br /&gt;
&lt;br /&gt;
;ATTENZIONE&lt;br /&gt;
:Tutte le immagini sono puramente indicative, il progetto e` in pieno sviluppo, tutto e` passibile di modifiche, anche sostanziali.&lt;br /&gt;
:L'immagine di presentazione si riferisce alla sezione &amp;quot;debug&amp;quot;, realizzata con Dokuwiki e (ad oggi) non fa parte del progetto (o si ?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prima e sommaria descrizione ==&lt;br /&gt;
&lt;br /&gt;
Centralina di controllo segnali.&lt;br /&gt;
&lt;br /&gt;
:(Ad oggi)&lt;br /&gt;
:Acquisisce segnali, li suddivide in gruppi mono o multi utenza, dei quali: realizza grafici temporali, crea e gestisce allarmi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dal campo arrivano i valori della 'sensoristica' sottoforma di &amp;quot;Identificatore Valore&amp;quot;, da queste informazioni sono aggiunti i sensori che eventualmente non sono presenti e le relative 'liste' dei valori (sono generate due chiavi, una dell'utenza e l'altra dei valori), altrimenti viene solo accodato il valore nella rispettiva lista (aggiungendo data-ora-minuti-secondi).&lt;br /&gt;
&lt;br /&gt;
Acquisiti i sensori, e` possibile il loro raggruppamento (anche una sola utenza) ed il campionamento dei valori a tempi prestabiliti (generazione grafici tempo/valore).&lt;br /&gt;
&lt;br /&gt;
Sempre previo raggruppamento (sempre &amp;quot;anche di un solo sensore&amp;quot;), e` possibile attivare/disattivare i relativi allarmi, il classico ON/OFF, ma anche un'automatico (che per esempio attivi i sensori del solaio/cantine dalle 20 alle 8, quando e` certo che nessuno si rechi in quegli spazi).&lt;br /&gt;
&lt;br /&gt;
E poi il resto .. che sarebbe di arrivare non solo a leggere/interpretare segnali, ma anche a pilotare utenze (luci, serrande, elettrodomestici, ...)&lt;br /&gt;
&lt;br /&gt;
L'idea e` che tutto questo sia gestibile da:&lt;br /&gt;
# interfaccia web&lt;br /&gt;
#* browser&lt;br /&gt;
#* cellulare&lt;br /&gt;
# linea di comando&lt;br /&gt;
# terminali operatore (display+tastiere)&lt;br /&gt;
# pulsanti, lampade, selettori, ..&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
== Hardware e Software ==&lt;br /&gt;
&lt;br /&gt;
;Hardware&lt;br /&gt;
:Versione 1 - [[Raspberry Pi 3]], perche` completa di WiFi e Bluetooth&lt;br /&gt;
:Versione 2 (2018) - [[Raspberry Pi]] con chiavetta WiFi&lt;br /&gt;
&lt;br /&gt;
;Software&lt;br /&gt;
:MQTT Broker (Mosquitto), perche` in grado di dialogare con la maggior parte dei componenti (Arduino, ESP8266, eccetera)&lt;br /&gt;
:Redis, perche` servira` un database di appoggio e manipolazione per alcuni dati, e perche` servira` una struttura dati &amp;quot;manipolabile&amp;quot; (dovremo poter aggiungere e togliere &amp;quot;campi:valori&amp;quot; ad una &amp;quot;chiave&amp;quot;, e aggiungere/togliere chiavi a delle liste, ecc. ecc.)&lt;br /&gt;
:Nginx, non si puo` fare senza web server&lt;br /&gt;
:... e poi non so cos'altro&lt;br /&gt;
:Script cgi&lt;br /&gt;
:javascript&lt;br /&gt;
: ...&lt;br /&gt;
&lt;br /&gt;
Sistema operativo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
$ lsb_release -a&lt;br /&gt;
No LSB modules are available.&lt;br /&gt;
Distributor ID: Raspbian&lt;br /&gt;
Description:    Raspbian GNU/Linux 11 (bullseye)&lt;br /&gt;
Release:        11&lt;br /&gt;
Codename:       bullseye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Embedded page --&amp;gt;&lt;br /&gt;
{{:Raspberry_Pi-Raspbian_default_post-install}}&lt;br /&gt;
&lt;br /&gt;
== Access Point ==&lt;br /&gt;
&lt;br /&gt;
Installato/configurato &amp;quot;[[Raspberry Pi Access Point WEP2]]&amp;quot;, sfruttando il wifi integrato nel [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
Installazione dei pacchetti utili, necessari (e qualcuno inutile):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt install nginx fcgiwrap redis-server python3-redis mosquitto ssl-cert php8.0-fpm php8.0-xml python3-pip python3-paho-mqtt python3-pandas python3-cairosvg python3-tinycss python3-cssselect git mosquitto-clients redis-tools&lt;br /&gt;
pip3 install python-telegram-bot pygal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nelle precedenti versioni fu installato manualmente anche [http://www.dokuwiki.org dokuwiki], utilizzato per segnarsi appunti vari (e un po` di debug), e` facoltativo e non descritto le operazioni necessarie, ma i files di configurazione del web server si.&lt;br /&gt;
&lt;br /&gt;
E` necessario scaricare il repository con i programmi (script python per lo piu`), si puo` fare da normale utente, per esempio:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/Livello1.git&lt;br /&gt;
cd Livello1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/level1 /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-enabled/level1 /etc/nginx/sites-enabled/&lt;br /&gt;
#cp etc/nginx/dokuwiki* etc/nginx/fcgiwrap.conf /etc/nginx/ # se installate dokuwiki&lt;br /&gt;
cp etc/nginx/fcgiwrap.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
==== Redis (database) ====&lt;br /&gt;
&lt;br /&gt;
Nel file &amp;quot;/etc/redis/redis.conf&amp;quot; ho modificato le linee:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
bind 127.0.0.1 ::1&lt;br /&gt;
protected-mode yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
in&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#bind 127.0.0.1 ::1&lt;br /&gt;
protected-mode no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Level1 (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu var/www/ /var/&lt;br /&gt;
chown www-data:www-data -R /var/www/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serve anche la scrittura in &amp;quot;www&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chmod 775 /var/www&lt;br /&gt;
chown :www-data -R /var/www    # oppure si poteva eliminare il &amp;quot;/&amp;quot; dal &amp;quot;chown&amp;quot; precedente&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
:Potrebbe essere necessario creare la directory &amp;quot;/var/www/archive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Mosquitto ====&lt;br /&gt;
&lt;br /&gt;
Copiare il file di configurazione dal repository ed assicurarsi i giusti permessi e proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/mosquitto/conf.d/myadd.conf /etc/mosquitto/conf.d/&lt;br /&gt;
chown root:root /etc/mosquitto/conf.d/myadd.conf&lt;br /&gt;
chmod 644 /etc/mosquitto/conf.d/myadd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Telegram Bot ====&lt;br /&gt;
&lt;br /&gt;
Scaricare il repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone hhttps://github.com/raspibo/bot4livello1.git&lt;br /&gt;
cd bot4livello1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Questo programma fu creato in origine nella directory &amp;quot;/home/pi/project/csv2image2telegram&amp;quot;, quindi tutti i riferimenti sono a questa, copiate qua il programma oppure modificate la directory dove necessario (&amp;quot;/etc/rc.local&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Il programma dev'essere esguito al boot di sistema e rimanere sempre in esecuzione.&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
All'avvio del sistema, devono andare in esecuzione alcuni script (quasi &amp;quot;daemons&amp;quot;) e rimanere attivi, per questo si deve modificare il file &amp;quot;/etc/rc.local&amp;quot; (lo trovate nel repository git):&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Power On &amp;quot;Level 1&amp;quot;&lt;br /&gt;
DAEMON_NAME=mqtt2redis_d&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviata correttamente Livello 1, oppure mqtt2redis_d e\` gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio \&amp;quot;mqtt2redis_d\&amp;quot;&amp;quot;&lt;br /&gt;
                #/var/www/cgi-bin/mqtt2redis_init.d.sh start # 20180115&lt;br /&gt;
        su -c &amp;quot;/var/www/cgi-bin/mqtt2redis_init.d.sh start&amp;quot; pi&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Centralina level 1 [ri]avviata ..&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Start Telegram Bot&lt;br /&gt;
DAEMON_NAME=bot4livello1&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato il Telegram Bot, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio Telegram Bot&amp;quot;&lt;br /&gt;
                cd /home/pi/project/csv2image2telegram&lt;br /&gt;
                su pi -c &amp;quot;python3 bot4livello1.py &amp;amp;&amp;quot;&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio bot4livello1.py&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inoltre, visto che puo` capitare s'interrompano, specialmente nelle prove di nuovi [[Centralina_livello_1#Devices|devices]], sono predisposti dei &amp;quot;check orari&amp;quot; che nel caso, li riavviano:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.hourly/mqtt2redis_check /etc/cron.hourly/&lt;br /&gt;
cp -vapu etc/cron.hourly/bot4livello1_check /etc/cron.hourly/ # se installerete anche il bot telegram&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ho anche previsto un messaggio settimanale di centralina in funzione tramite crontab dell'utente pi, copiate il file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu var/spool/cron/crontabs/pi /var/spool/cron/crontabs/&lt;br /&gt;
chown root:root /var/spool/cron/crontabs/pi&lt;br /&gt;
chmod 600 /var/spool/cron/crontabs/pi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
oppure aggiungete la linea (col comando &amp;quot;crontab -e&amp;quot;):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
0 7 * * 0 redis-cli -h centred hmset msg:redis:alive:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Messaggio ciclico, centralina $(hostname) in funzione&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Backup ====&lt;br /&gt;
&lt;br /&gt;
Oltre ad un &amp;quot;backup&amp;quot; che si occupa di salvare tutti i computer's della rete, ho aggiunto uno script per salvare giornalmente il database redis, come ulteriore sicurezza, i files sono salvati nella directory &amp;quot;/root&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.daily/backupredis /etc/cron.daily/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rete ==&lt;br /&gt;
&lt;br /&gt;
Al momento e` previsto che sia tutto sotto WiFi (quella onboard) del [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
Comunque bastera` modificare il firewall per accettare dati dalla ethernet se si rendesse necessario.&lt;br /&gt;
&lt;br /&gt;
Le centrali accessorie, tipo quella di [[CentRed|allarme]], che deve solo ricevere, non necessariamente dovranno trovarsi nella sottorete gestita da &amp;quot;livello 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Descrizione ==&lt;br /&gt;
&lt;br /&gt;
I 'segnali' arrivano sempre (?) a &amp;quot;MQTT broker&amp;quot;, vengono manipolati se necessario, ed inseriti nel database Redis.&lt;br /&gt;
&lt;br /&gt;
Dal database Redis sono di nuovo letti/scritti/modificati/manipolati ed inviati:&lt;br /&gt;
:e/o&lt;br /&gt;
::in report (testo, grafico, audio, video, ...)&lt;br /&gt;
:e/o&lt;br /&gt;
::alla centralina di allarme [[CentRed]]&lt;br /&gt;
:e/o&lt;br /&gt;
::reinviati a MQTT broker&lt;br /&gt;
:e/o&lt;br /&gt;
::inviati ad altre centraline livello 1&lt;br /&gt;
:e/o&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
=== Configurazione e Funzionamento ===&lt;br /&gt;
&lt;br /&gt;
(Sommariamente)&lt;br /&gt;
&lt;br /&gt;
Al primo avvio e` necesssario configurare prima il database Redis da utilizzare, poi quello della [[CentRed|centralina avvisi/allarmi]] (se avete intenzione di ricevere le comunicazioni relative agli allarmi e/o avvisi di malfunzionamenti).&lt;br /&gt;
&lt;br /&gt;
Una volta &amp;quot;letti&amp;quot; i segnali, e` opera dell'utente aggiungere alcune caratteristiche [[#Segnali]], fatto questo si passa alla creazione dei [[#Gruppi]].&lt;br /&gt;
&lt;br /&gt;
Definiti i [[#Gruppi]], si passa ad avviare i servizi necessari [[#Daemons]], che si occupano di generare i grafici Tempo-Valore/i o gestione degli allarmi/anomalie.&lt;br /&gt;
&lt;br /&gt;
== Arrivo dati e manipolazione ==&lt;br /&gt;
&lt;br /&gt;
I dati devono arrivare al broker MQTT nel formato:&lt;br /&gt;
&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
inviati nel topic:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fate riferimento alla [[#Tabella dati e valori]] per comprendere meglio il significato.&lt;br /&gt;
&lt;br /&gt;
Nell'immagine, una schermata dei test in corso, a sinistra gli errori di lettura, a destra un listato della &amp;quot;cgi-bin&amp;quot;, sotto i falsi dati inviati (mi servono per i test che sto` facendo ;) ), e in fondo i dati ricevuti (veri e falsi).&lt;br /&gt;
&lt;br /&gt;
[[File:Level1 201604170814.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mqtt2redis_d.py ===&lt;br /&gt;
&lt;br /&gt;
I dati MQTT vengono letti dal programma &amp;quot;mqtt2redis_d.py&amp;quot; che deve sempre essere in esecuzione (ho gia` preparato anche un &amp;quot;init.d&amp;quot;, che tengo ancora nella &amp;quot;cgi-bin&amp;quot;), questi li manipola inserendoli se non presenti, in due &amp;quot;chiavi&amp;quot; nel database (noSQL) Redis, la prima, e` per identificare il segnale:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
la seconda e` quella dei valori:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
valori che sono accodati ad ogni arrivo con l'aggiunta della data e ora, predisposti per una generazione di output in formato &amp;quot;csv&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== ''IMPORTANTE'' ==&lt;br /&gt;
&lt;br /&gt;
''Quello che segue non e` aggiornato di pari passo con l'aggiornamento del software e quant'altro necessario.''&lt;br /&gt;
&lt;br /&gt;
''Durante l'uso, nelle pagine di configurazione e modifica compaiono delle descrizioni che sono piu` veritiere/aggiornate, perche` scritte durante la stesura e/o modifica del software.''&lt;br /&gt;
&lt;br /&gt;
== Segnali ==&lt;br /&gt;
&lt;br /&gt;
Una volta pervenuto il primo valore di un segnale, e` possibile configurarlo inserendo alcuni dati che non sono presenti nella comunicazione MQTT:&lt;br /&gt;
&lt;br /&gt;
;Descrizione&lt;br /&gt;
:Meglio se breve, perche` usata anche nei riferimenti dei grafici, non solo per gli allarmi (per esempio: &amp;quot;ST1 Cucina&amp;quot; per sensore temperatura in cucina)&lt;br /&gt;
;UM (Unita` di misura)&lt;br /&gt;
;TempoRitardo&lt;br /&gt;
:Ancora non usata&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Specificare il range dei valori nel formato 0,100&lt;br /&gt;
:Utile per sonde che (per esempio) lavorano da 0 a 100 gradi&lt;br /&gt;
:Genera avviso/allarme se minore di o maggiore di&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Avviso se valore e` inferiore a quello impostato&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Aavviso se valore e` superiore a quello impostato&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:Previsto per i segnali analogici o negati&lt;br /&gt;
:Avviso quando valore uguale a ValoreOn&lt;br /&gt;
;Allarme&lt;br /&gt;
:Definire qua i valori che saranno usati come allarmi, per esempio: ValoreOn,ValoreMin&lt;br /&gt;
:Se sono impostati, ma non indicati qua, sono emessi dei semplici avvisi&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sonda temperatura (ovviamente falsa):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashTempMod Falsa2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sensore di movimento (pir, ovviamente falso):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashPirMod Falso2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
== Gruppi ==&lt;br /&gt;
&lt;br /&gt;
Per realizzare i raggruppamenti ho utilizzato le chiavi Redis di tipo &amp;quot;sets&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Al momento ho pensato ai soli gruppi riguardanti gli allarmi e i grafici (per esempio quelli di due o piu`, sonde di temperatura).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Puoi benissimo creare un gruppo con un solo sensore.&lt;br /&gt;
&lt;br /&gt;
Al solito, ho pensato ad una chiave univoca d'inserimento dei dati in Redis '''sets:type:ID''' (gruppo:tipo:identificatore).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gruppo&lt;br /&gt;
|&lt;br /&gt;
* sets&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* alarms&lt;br /&gt;
* graph&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore)&lt;br /&gt;
|&lt;br /&gt;
(definito da utente, esempi:)&lt;br /&gt;
* TemperatureBagno&lt;br /&gt;
* TemperaturePianoTerra&lt;br /&gt;
* luigi&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I gruppi sono definiti dall'utente, ed ogni volta che viene creato un nuovo gruppo (deve avere almeno un'utenza altrimenti si autoelimina), viene gia` creato il &amp;quot;Timer&amp;quot; di &amp;quot;campionamento&amp;quot;/&amp;quot;ritardo nuovo allarme&amp;quot;, preimpostato a 5 minuti (sono previsti valori da 1 a 60 minuti).&lt;br /&gt;
&lt;br /&gt;
''La pagina d'inserimento permette di inserire una chiave con un nome qualsiasi, non ho ancora &amp;quot;bloccato&amp;quot; e/o previsto un controllo sull'identificatore assegnato.''&lt;br /&gt;
&lt;br /&gt;
=== sets:*:ID:Config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Timer&lt;br /&gt;
|&lt;br /&gt;
* da 1 60 minuti&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Funzionamento&lt;br /&gt;
|&lt;br /&gt;
* On&lt;br /&gt;
* Off&lt;br /&gt;
* Auto&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) dalle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) alle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;graph&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
La chiave per questi gruppi e` previsto che sia: '''sets:graph:ID'''&lt;br /&gt;
&lt;br /&gt;
La chiave per il timer di campionamento e` previsto che sia: '''sets:graph:ID:Timer''' (ora e` generata automaticamente)&lt;br /&gt;
&lt;br /&gt;
La chiave per i dati campionati e la generazione del grafico (che sara` in formato csv) e` previsto che sia: '''sets:graph:ID:Valori''' (sara` creata ed aggiornata autonomamente, da un programma in python)&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;alarms&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Al momento come sopra, tranne che il Timer non servira` (o forse si, perche` sono previsti anche grafici dei PIR).&lt;br /&gt;
&lt;br /&gt;
==== Esempio d'inserimento gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Aggiungi chiavi &amp;quot;sets&amp;quot; Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysAddSets 1.png&lt;br /&gt;
File:Livello1-KeysAddSets 2.png&lt;br /&gt;
File:Livello1-KeysAddSets 3.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
::Nell'immagine e` gia` stato applicato il filtro '''*:graph:*'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModHash 1.png|Spostiamoci verso il basso e selezioniamo la seconda voce di modifica delle chiavi &amp;quot;hash&amp;quot;, quella relativa al &amp;quot;Config&amp;quot;:&lt;br /&gt;
File:Livello1-KeysModHash 2.png&lt;br /&gt;
File:Livello1-KeysModHash 3.png|e l'esempio di un allarme:&lt;br /&gt;
File:Livello1-KeysModHash 3a.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modifica di un gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModSets 2.png&lt;br /&gt;
File:Livello1-KeysModSets 3.png|Credo si spieghi da sola ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Daemons ==&lt;br /&gt;
&lt;br /&gt;
Intanto: non sono veri e propri &amp;quot;demoni&amp;quot;, sono script che l'utente avvia e ferma al bisogno.&lt;br /&gt;
&lt;br /&gt;
Specialmente quello degli allarmi (che mi sta` rompendo al cellulare da stamattina ;) ), e` da avviare quando uscite di casa, e fermare prima di rientrare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Daemons part1.png&lt;br /&gt;
File:Livello1-Daemons part2.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grafici (files .csv) ==&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;TIP&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Allarmi ==&lt;br /&gt;
&lt;br /&gt;
Per ogni gruppo creato, e` possibile eseguire il controllo allarmi, servono opportune preimpostazioni (configurazioni), poi e` possibile eseguire il software dalla pagina '''Daemons''':&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-Allarmi-Daemons.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Si puo` notare in esecuzione solo quello relativo ad una falsa sonda di temperatura, relativo ai [[Centralina livello 1/Test allarmi|test eseguiti]].&lt;br /&gt;
&lt;br /&gt;
L'eseguibile e` &amp;quot;/var/www/cgi-bin/setsalarms_d.py&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== setsalarms_d.py ===&lt;br /&gt;
&lt;br /&gt;
Perche` possa &amp;quot;funzionare&amp;quot; servono alcuni requisiti:&lt;br /&gt;
*Deve esistere il gruppo ed avere una configurazione (che e` preimpostata alla creazione)&lt;br /&gt;
*Il gruppo deve essere &amp;quot;on&amp;quot; o in modalita` &amp;quot;auto&amp;quot; (per default e` &amp;quot;off&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Tutti sono avvisi (li ho chiamati &amp;quot;alert&amp;quot;), alcuni possono e devono invece diventare allarmi (&amp;quot;alarm&amp;quot;). Perche` siano definiti allarmi, devono essere inseriti nella voce &amp;quot;Allarme&amp;quot;, presente nella configurazione della sonda (sensore, PIR, o quello che e`).&lt;br /&gt;
&lt;br /&gt;
Tipi di &amp;quot;alert&amp;quot;:&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero,[+-]Numero, una sonda 1wire pe esempio sarebbe: -55,+125&lt;br /&gt;
:;Alert&lt;br /&gt;
::Se il valore letto e` fuori dal range&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` inferiore&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` superiore&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:0 o 1&lt;br /&gt;
:Al momento e` previsto per sola sensoristica come: finecorsa, PIR, e altri segnali on/off&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` uguale&lt;br /&gt;
;Allarme&lt;br /&gt;
:Quello che e` allarme e non semplice avviso:&lt;br /&gt;
::ValoreOn&lt;br /&gt;
::ValoreMin&lt;br /&gt;
::ValoreMin,ValoreMax,ValoreOn&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
Per un'esempio di configurazione fate riferimento alla pagina [[Centralina livello 1/Test allarmi|Test Allarmi]].&lt;br /&gt;
&lt;br /&gt;
Il software invia gli avvisi/allarmi alla centralina [[CentRed]], e` questa poi ad occuparsi della trasmissione, discriminando il tipo dalla stringa con cui e` stato inviato. Altre informazioni alla pagina [[CentRed]].&lt;br /&gt;
&lt;br /&gt;
== Analizza e Modifica Valori ==&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto la possibilita` di manipolare i valori memorizzati nel database Redis.&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Selezione_Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sono ammesse solamente chiavi &amp;quot;:Valori&amp;quot;, la possibilita` di selezione dipende (al solito) dal filtro attivo nella pagina.&lt;br /&gt;
&lt;br /&gt;
Una volta scelta la chiave e cliccato su &amp;quot;Analizza e Modifica&amp;quot;, compare la pagina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dove e` possibile:&lt;br /&gt;
* Visualizzare tutti i valori&lt;br /&gt;
* Creare il file &amp;quot;.csv&amp;quot; da elaborare successivamente tramite l'apposita pagina&lt;br /&gt;
* Eliminare i dati ormai obsoleti (attenzione che non ho filtrato le immissioni, e` possibile anche fare il contrario)&lt;br /&gt;
&lt;br /&gt;
== Tabella dati e valori ==&lt;br /&gt;
&lt;br /&gt;
Denominazione dei campi e attibuzione dei valori standard (piu` o meno)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* Temperatura&lt;br /&gt;
* PIR&lt;br /&gt;
* Finecorsa&lt;br /&gt;
* Proximity&lt;br /&gt;
* Livello&lt;br /&gt;
* Rele`&lt;br /&gt;
* Termostato&lt;br /&gt;
* Valvola&lt;br /&gt;
* Motore&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione del segnale&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TipoIO&lt;br /&gt;
|&lt;br /&gt;
* I (Input/Ingresso)&lt;br /&gt;
* O (Output/Uscita)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segnale&lt;br /&gt;
|&lt;br /&gt;
* Analogico&lt;br /&gt;
* Digitale&lt;br /&gt;
* Testo&lt;br /&gt;
* I2C&lt;br /&gt;
* SPI&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Al momento l'ho soppresso, il tipo di segnale e` praticamente definito dal valore in entrata (per ora)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneC&lt;br /&gt;
|&lt;br /&gt;
* Casa&lt;br /&gt;
* Garage&lt;br /&gt;
* Giardino&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneP&lt;br /&gt;
|&lt;br /&gt;
* Piano0 / PianoZero&lt;br /&gt;
* Piano1 / PianoUno&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneS&lt;br /&gt;
|&lt;br /&gt;
* Cucina1&lt;br /&gt;
* Camera2&lt;br /&gt;
* Bagno1&lt;br /&gt;
* ...&lt;br /&gt;
* Cantina&lt;br /&gt;
* EsternoSala&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore, Utenza/ITEM)&lt;br /&gt;
|&lt;br /&gt;
* 1&lt;br /&gt;
* 2&lt;br /&gt;
* 3&lt;br /&gt;
* ..&lt;br /&gt;
* Up&lt;br /&gt;
* Down&lt;br /&gt;
* Left&lt;br /&gt;
* Right&lt;br /&gt;
* (altro ?)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Convenzioni usate ad oggi:&lt;br /&gt;
* STn sonda/sensore temperatura [n = numero]&lt;br /&gt;
* RHn sonda/sensore umidita` relativa [n = numero]&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Definito dall'utente che programma i &amp;quot;remote&amp;quot;, ma meglio definire una struttura di base ..&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valori&lt;br /&gt;
|&lt;br /&gt;
* TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori&lt;br /&gt;
|&lt;br /&gt;
Assegnato automaticamente dal programma&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UM (Unita` di Misura)&lt;br /&gt;
|&lt;br /&gt;
* °C&lt;br /&gt;
* V (tensione)&lt;br /&gt;
* A (assorbimento)&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Questo e` previsto solo per le segnalazioni/avvisi/allarmi .. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TempoRitardo (secondi)&lt;br /&gt;
|&lt;br /&gt;
* 0.000&lt;br /&gt;
* 1.002&lt;br /&gt;
* ...&lt;br /&gt;
* 99.000 (max impostabile)&lt;br /&gt;
|&lt;br /&gt;
Al momento non previsto, teoricamente i segnali dovrebbero arrivare gia` &amp;quot;filtrati&amp;quot; dai &amp;quot;remote&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! RangeValori&lt;br /&gt;
|&lt;br /&gt;
* 0,100&lt;br /&gt;
* -50,125&lt;br /&gt;
* 0,1&lt;br /&gt;
|&lt;br /&gt;
Da utilizzarsi per definire l'errore e generare una segnalazione di sonda guasta&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMin&lt;br /&gt;
|&lt;br /&gt;
* 10 (temperatura)&lt;br /&gt;
* 0 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sotto a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMax&lt;br /&gt;
|&lt;br /&gt;
* 40 (temperatura)&lt;br /&gt;
* 1 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sopra a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreOn&lt;br /&gt;
|&lt;br /&gt;
* 1 (quando attivo a segnale on)&lt;br /&gt;
* 0 (quando attivo a segnale off)&lt;br /&gt;
* [Valore]&lt;br /&gt;
|&lt;br /&gt;
Valore da utilizzare per alert/alarm, e per definire se si tratta di un segnale negato (zero) e trattarlo di conseguenza&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Allarme&lt;br /&gt;
|&lt;br /&gt;
* ValoreOn&lt;br /&gt;
* ValoreMin&lt;br /&gt;
* ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin&lt;br /&gt;
* ValoreOn,ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin,ValoreMax&lt;br /&gt;
* ValoreMin,ValoreMax&lt;br /&gt;
|&lt;br /&gt;
Quali sono da trattare come allarmi, di default, se impostati, sono trattati come alert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data (e ora)&lt;br /&gt;
|&lt;br /&gt;
* 2016/03/13 20:40:08&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valore&lt;br /&gt;
|&lt;br /&gt;
* 0&lt;br /&gt;
* 1&lt;br /&gt;
* 13&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Promemoria chiavi, codici e ... ==&lt;br /&gt;
&lt;br /&gt;
====== Dati (mqtt) ======&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Topic (mqtt) ======&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria segnale di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria gruppi di livello 1 (redis) ======&lt;br /&gt;
;TYPE&lt;br /&gt;
:graph&lt;br /&gt;
:alarms&lt;br /&gt;
'''sets:TYPE:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria configurazione gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Config'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Notes|Notes]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Primo avvio|Primo avvio]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Test allarmi|Test allarmi]]&lt;br /&gt;
&lt;br /&gt;
= Devices =&lt;br /&gt;
&lt;br /&gt;
Ad oggi, ho predisposto/preparato:&lt;br /&gt;
* [[PorTHable]], che invia valori di temperatura&lt;br /&gt;
* [[ ESP8266/DS1820toMQTT | DS1820toMQTT ]], sensore/i di temperatura&lt;br /&gt;
* [[ ESP8266/PIRtoMQTT | PIRtoMQTT ]], sensore di movimento (PIR)&lt;br /&gt;
* [[ ESP8266/SerialToMQTT_Repeater | SerialToMQTT Repeater ]], che funziona da &amp;quot;repeater&amp;quot;, ritrasmette i dati ricevuti via seriale al broker MQTT&lt;br /&gt;
* [[ Thermo ]], che invia il valore della temperatura (solo di riferimento ad oggi, non le altre sonde)&lt;br /&gt;
* [[ ENC28J60-ATMEGA328P-DS18B20 | ENC28J60 + ATMEGA328P + DS18B20 ]], sensore di temperatura in ethernet&lt;br /&gt;
* [[ Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | ATMEGA328P + ESP8266 + DHT + Rain]], sensore temperatura/umidita` (dht) e pioggia (rain)&lt;br /&gt;
* [[ ESP8266/DHT22toMQTT | DHT22toMQTT ]], sensore di temperatura e umidita`&lt;br /&gt;
* [[ Centralina_livello_1/Dev_HTRL_wAE | ATMEGA328P + ESP8266 + DHT + Rain + Photoresistor]], sensore temperatura/umidita` (dht), pioggia (rain) e luminosita` (photoresistor).&amp;lt;br&amp;gt; Nuova e migliorata (?) versione del precedente [[Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | device]]&lt;br /&gt;
* [[ Cronotermostato settimanale ]]&lt;br /&gt;
* [[ Centralina_livello_1/Centralina_livello_2_PIR | Centralina livello 2 - PIR ]]&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/telegram bot|Telegram Bot per Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
= Problemi e soluzioni ? =&lt;br /&gt;
&lt;br /&gt;
;Eliminazione file di swap&lt;br /&gt;
:Non so se sia stato un problema e sia utile&lt;br /&gt;
::[[Raspberry_PI-Raspbian-Personalizzazioni#Disattivazione|Disattivazione file di swap]]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore salvataggio in background&lt;br /&gt;
:[https://jee-appy.blogspot.it/2016/04/can-not-save-in-background-fork-redis.html Can't save in background: fork: Cannot allocate memory Redis]&lt;br /&gt;
:[https://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory redis bgsave failed because fork Cannot allocate memory]&lt;br /&gt;
:[https://stackoverflow.com/questions/19581059/misconf-redis-is-configured-to-save-rdb-snapshots MISCONF Redis is configured to save RDB snapshots]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore avvio del server&lt;br /&gt;
:Dopo un ripristino del sistema ho avuto dei problemi di permessi al file &amp;quot;dump.rdb&amp;quot; (che ho voluto ricopiare per riprendermi alcune impostazioni), ho reimpostato in &amp;quot;redis:redis&amp;quot; (directory &amp;quot;/var/lib/redis&amp;quot; inclusa) il proprietario e settato i permessi a 660.&lt;br /&gt;
&lt;br /&gt;
;I daemon non vengono eseguiti dalle pagine web&lt;br /&gt;
:Non sono stati corretti i permessi della directory del webserver &amp;quot;/var/www&amp;quot; [[#Level1_.28www.29]]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7400</id>
		<title>CentRed</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7400"/>
		<updated>2023-07-12T13:03:34Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Centred&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Centralino di controllo avvisi (segnalazioni e allarmi)&lt;br /&gt;
|-&lt;br /&gt;
|Repository: https://github.com/raspibo/CentRed.git&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
'''Revisione''' 2023 07 12 (luglio)&lt;br /&gt;
&lt;br /&gt;
Al momento ho terminato una nuova installazione ed il sistema non e` nella rete della [https://www.raspibo.org/wiki/index.php/Centralina_livello_1|&amp;quot;level1&amp;quot;], dovro` anche aggiornare il repository [https://github.com/raspibo/CentRed.git|&amp;quot;git&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green&amp;quot;&amp;gt;&lt;br /&gt;
No LSB modules are available.&lt;br /&gt;
Distributor ID: Raspbian&lt;br /&gt;
Description:    Raspbian GNU/Linux 11 (bullseye)&lt;br /&gt;
Release:        11&lt;br /&gt;
Codename:       bullseye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Ho dovuto modificare istruzioni cgi&amp;lt;-&amp;gt;html negli script python&lt;br /&gt;
* Non ho al momento riconfigurato nessun invio mail (causa problemi autenticazione gmail da linea di comando, che chiede il rinnovo del token settimanalmente)&lt;br /&gt;
* Non ho configurato XMPP, perche` sono sempre meno i server a disposizione&lt;br /&gt;
* Neanche SIP ho configurato, per cui non ho ancora testato asterisk&lt;br /&gt;
&lt;br /&gt;
'''Revisione''' 2019 07 28 (luglio)&lt;br /&gt;
* Riviste ed aggiornate queste istruzioni&lt;br /&gt;
* L'installazione di Asterisk da` errore, ma poi tutto sembra funzionare&lt;br /&gt;
&lt;br /&gt;
'''Centralino di gestione avvisi e allarmi'''&lt;br /&gt;
&lt;br /&gt;
Si occupa di avvisare l'utilizzatore attraverso messaggi di posta elettronica, telefonate VOIP e chat (XMPP), di avvisi e allarmi dell'impianto domotico (?) e/o degli apparati che gli inviano messaggi opportunamente predisposti.&lt;br /&gt;
&lt;br /&gt;
Tabella di riferimento del messaggio da inviare: https://github.com/raspibo/CentRed/wiki/Tabella-avvisi.&lt;br /&gt;
&lt;br /&gt;
;Ad oggi questa centralina e` usata da:&lt;br /&gt;
:[[Thermo]]&lt;br /&gt;
:[[Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
== Installazione ==&lt;br /&gt;
&lt;br /&gt;
Distribuzione: Raspbian (Debian) versione 9, codename &amp;quot;stretch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
&lt;br /&gt;
Al primo avvio la nuova SD Card ha visualizzato una schermata di &amp;quot;Resizing file system&amp;quot; (o qualcosa di simile), seguito da un riavvio del sistema.&lt;br /&gt;
&lt;br /&gt;
SSH nella nuova release non e` attivato di default, prima di proseguire l'ho attivato:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
raspi-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5 Interfacing options&lt;br /&gt;
::P2 SSH Enable&lt;br /&gt;
&lt;br /&gt;
.. e visto che ero qui, ho configurato anche qualcos'altro:&lt;br /&gt;
&lt;br /&gt;
:password&lt;br /&gt;
:hostname &amp;lt;centred&amp;gt;&lt;br /&gt;
:locale &amp;lt;en&amp;gt;&lt;br /&gt;
:timezone &amp;lt;rome&amp;gt;&lt;br /&gt;
:keyboard layout &amp;lt;en-US&amp;gt;&lt;br /&gt;
:wifi country &amp;lt;it&amp;gt; # anche se non la usero`&lt;br /&gt;
&lt;br /&gt;
Visto che ho aggiornato tanta roba, ho riavviato il sistema.&lt;br /&gt;
&lt;br /&gt;
=== Upgrade ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get upgrade&lt;br /&gt;
reboot # perche` ha aggiornato anche i pacchetti del kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installazione pacchetti ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get install nginx fcgiwrap redis-server asterisk festival festvox-ita* python3-dnspython python3-pip git python3-redis&lt;br /&gt;
pip3 install pyxmpp2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
Per prima cosa, meglio avere gia` sottomano il repository git per copiare files e configurazioni, da utente normale, effettuamo una clonazione di questo repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/CentRed.git&lt;br /&gt;
cd CentRed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;IMPORTANTE&lt;br /&gt;
:Tutti i comandi visualizzati nella fasi successive sono riferiti alla directory in cui ci si trova ora, cioe`: &amp;quot;/home/pi/git/CentRed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Crontab ====&lt;br /&gt;
&lt;br /&gt;
Va bene che sia da utente, non servono permessi particolari:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inseriamo questa riga alla fine del file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
10 7 * * 0 redis-cli hmset msg:redis:alive:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Messaggio ciclico di centralina in funzione&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Riga che una volta a settimana ci inviera` un messaggio che la centralina e` in funzione.&lt;br /&gt;
&lt;br /&gt;
==== Asterisk ====&lt;br /&gt;
&lt;br /&gt;
Per editare i successivi files dovrete essere &amp;quot;root&amp;quot;, quindi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/extensions.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
[centred]&lt;br /&gt;
exten =&amp;gt; _X.,1,Answer()&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Playback(alarm)&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Hangup()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/sip.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
; Configurazione di un interno del PBX&lt;br /&gt;
[2001]                          ; numero identificativo dell'interno (il numero della linea telefonica)&lt;br /&gt;
; Turn off silence suppression in X-Lite (&amp;quot;Transmit Silence&amp;quot;=YES)!&lt;br /&gt;
; Note that Xlite sends NAT keep-alive packets, so qualify=yes is not needed&lt;br /&gt;
secret=NC2001                   ; password in chiaro (può essere anche cifrata con MD5)&lt;br /&gt;
type=friend                     ; la configurazione tipica per un telefono è friend, altrimenti con user per una linea solo ricevente, peer per un trunk verso l'esterno&lt;br /&gt;
regexten=1234                   ; When they register, create extension 1234&lt;br /&gt;
context=centred&lt;br /&gt;
callerid=&amp;quot;CentRed&amp;quot; &amp;lt;2001&amp;gt;       ; i dati di presentazione della linea visualizzati nel display di chi riceve la chiamata&lt;br /&gt;
host=dynamic                    ; This device needs to register&lt;br /&gt;
;directmedia=no                 ; Typically set to NO if behind NAT&lt;br /&gt;
disallow=all&lt;br /&gt;
;Configurazione del tipo di compressione della fonia&lt;br /&gt;
;allow=gsm                      ; GSM consumes far less bandwidth than ulaw - formato compresso che risparmia banda&lt;br /&gt;
allow=alaw                      ; il tipo di codec da usare per la chiamata alaw è senza compressione, è adatto ad esempio su lan&lt;br /&gt;
;mailbox=1234@default,1233@default      ; Subscribe to status of multiple mailboxes&lt;br /&gt;
registertrying=yes ; Send a 100 Trying when the device registers.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/mysite /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/myfastcgi.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
Nel web server e` attiva (in configurazione) l'autenticazione, per completarla dovete creare il file &amp;quot;/var/www/.htaccess&amp;quot; in questo modo (sostituite USERNAME col vostro nome o altro):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
echo -n &amp;quot;USERNAME&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
echo -n &amp;quot;:&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
openssl passwd &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
chown www-data:www-data /var/www/.htpasswd&lt;br /&gt;
chmod 600 /var/www/.htpasswd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redis ====&lt;br /&gt;
&lt;br /&gt;
Potete fare come ho fatto io, oppure modificare tutto nel file di configurazione, dovrebbe essere possibile stando a quel che ho letto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/redis/redis.conf&lt;br /&gt;
:Solo commentato la linea (dovrebbe essere la 61)&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#bind 127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ancora pero` l'accesso da remoto non e` possibile, si deve modificare un'altro parametro e renderlo permanente (quello che scrivevo dovrebbe essere possibile nel file di configurazione):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
redis-cli&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG SET protected-mode no&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG REWRITE&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Importante&lt;br /&gt;
:Non ho impostato nessuna password, quindi non esponete questo pc/raspberry alla rete esterna.&lt;br /&gt;
&lt;br /&gt;
==== CentRed (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -va var/www/ /var/&lt;br /&gt;
chown www-data:www-data /var/www/*.html&lt;br /&gt;
chown www-data:www-data -R /var/www/cgi-bin/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
Ovviamente all'avvio del sistema la nostra centralina deve avviarsi da sola, ho scelto di eseguire il programma dal &amp;quot;classico&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Start &amp;quot;CentRed&amp;quot;&lt;br /&gt;
DAEMON_NAME=centred  # senza .py&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato \&amp;quot;$DAEMON_NAME\&amp;quot;, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio $DAEMON_NAME ..&amp;quot;&lt;br /&gt;
                #su pi -c &amp;quot;python3 /var/www/cgi-bin/centred.py &amp;amp;&amp;quot;&lt;br /&gt;
                python3 /var/www/cgi-bin/centred.py &amp;amp;  # deve essere 'root'&lt;br /&gt;
                # .. e un messaggio a se stesso quando si [ri]avvia&lt;br /&gt;
                sleep 2  # un po` di ritardo&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio centralino allarmi CentRed&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Start/Reboot &amp;amp; Configure ====&lt;br /&gt;
&lt;br /&gt;
E` il momento di riavviare il sistema.&lt;br /&gt;
&lt;br /&gt;
Se tutto e` andato bene, dovrebbe essere gia` funzionante, rimane da configurarlo.&lt;br /&gt;
&lt;br /&gt;
Da browser aprite l'indirizzo http://centred:8080 (o &amp;quot;localhost:8080&amp;quot; o usate l'indirizzo IP), alcune voci non funzioneranno, altre pagine andranno proprio in errore, basta inserire i dati corretti e nel giusto ordine.&lt;br /&gt;
&lt;br /&gt;
# Per primo, inserite gli account di posta elettronica e XMPP, inserendo il vostro username/password ed eventuali parametri del server (tipo smtp.gmail.com porta 567).&lt;br /&gt;
# Inserite i destinatari dei messaggi, sono previsti inserimenti per destinatari di mail, XMPP e sip.&lt;br /&gt;
# Ora si possono associare gli elenchi ai tipi di messaggi, cioe`, dove dev'essere inviato il messaggio alarm piuttosto che alert ...&lt;br /&gt;
&lt;br /&gt;
== Pagina principale ==&lt;br /&gt;
&lt;br /&gt;
Pagina principale e menu:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Messaggi.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sono visibili i normali messaggi di controllo di funzionamento di se stessa e della centralina [[Thermo]].&lt;br /&gt;
&lt;br /&gt;
I messaggi non ancora confermati sono inviati a cadenze cicliche e per un massimo di volte, dipendente dalla configurazione.&lt;br /&gt;
&lt;br /&gt;
Ovviamente, una volta confermati, non sono piu` inviati e permangono visualizzati nella pagina fino a scadenza (configurazione).&lt;br /&gt;
&lt;br /&gt;
== Prima configurazione ==&lt;br /&gt;
&lt;br /&gt;
Ed anche unica, normalmente ;)&lt;br /&gt;
&lt;br /&gt;
Il database NoSQL Redis utilizzato, non e` configurabile perche` DEVE risiedere nella stessa macchina.&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:Non sono riuscito a parametrizzare tutte le configurazioni&lt;br /&gt;
&lt;br /&gt;
=== Configurazione accounts ===&lt;br /&gt;
&lt;br /&gt;
==== Mail ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso della posta elettronica, questo e` l'indirizzo che servira` per inviare le mail delle segnalazioni della centralina&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==== XMPP ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso del protocollo XMPP, servira` per inviare le segnalazioni della centralina.&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione liste destinatari ===&lt;br /&gt;
&lt;br /&gt;
Aggiungete gli indirizzi dei destinatari dei messaggi delle varie segnalazioni della centralina:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaSIP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione destinazioni allarme ===&lt;br /&gt;
&lt;br /&gt;
Per ogni tipologia di segnalazione, si deve indicare a quali liste e` da inviare:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllarme.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllerta.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
I parametri di controllo ed invio degli avvisi:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Configurazione.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed.git&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed/wiki&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7399</id>
		<title>CentRed</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7399"/>
		<updated>2023-07-12T13:03:06Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Centred&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Centralino di controllo avvisi (segnalazioni e allarmi)&lt;br /&gt;
|-&lt;br /&gt;
|Repository: https://github.com/raspibo/CentRed.git&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
'''Revisione''' 2023 07 12 (luglio)&lt;br /&gt;
&lt;br /&gt;
Al momento ho terminato una nuova installazione ed il sistema non e` nella rete della [[https://www.raspibo.org/wiki/index.php/Centralina_livello_1|&amp;quot;level1&amp;quot;]], dovro` anche aggiornare il repository [[https://github.com/raspibo/CentRed.git|&amp;quot;git&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green&amp;quot;&amp;gt;&lt;br /&gt;
No LSB modules are available.&lt;br /&gt;
Distributor ID: Raspbian&lt;br /&gt;
Description:    Raspbian GNU/Linux 11 (bullseye)&lt;br /&gt;
Release:        11&lt;br /&gt;
Codename:       bullseye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Ho dovuto modificare istruzioni cgi&amp;lt;-&amp;gt;html negli script python&lt;br /&gt;
* Non ho al momento riconfigurato nessun invio mail (causa problemi autenticazione gmail da linea di comando, che chiede il rinnovo del token settimanalmente)&lt;br /&gt;
* Non ho configurato XMPP, perche` sono sempre meno i server a disposizione&lt;br /&gt;
* Neanche SIP ho configurato, per cui non ho ancora testato asterisk&lt;br /&gt;
&lt;br /&gt;
'''Revisione''' 2019 07 28 (luglio)&lt;br /&gt;
* Riviste ed aggiornate queste istruzioni&lt;br /&gt;
* L'installazione di Asterisk da` errore, ma poi tutto sembra funzionare&lt;br /&gt;
&lt;br /&gt;
'''Centralino di gestione avvisi e allarmi'''&lt;br /&gt;
&lt;br /&gt;
Si occupa di avvisare l'utilizzatore attraverso messaggi di posta elettronica, telefonate VOIP e chat (XMPP), di avvisi e allarmi dell'impianto domotico (?) e/o degli apparati che gli inviano messaggi opportunamente predisposti.&lt;br /&gt;
&lt;br /&gt;
Tabella di riferimento del messaggio da inviare: https://github.com/raspibo/CentRed/wiki/Tabella-avvisi.&lt;br /&gt;
&lt;br /&gt;
;Ad oggi questa centralina e` usata da:&lt;br /&gt;
:[[Thermo]]&lt;br /&gt;
:[[Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
== Installazione ==&lt;br /&gt;
&lt;br /&gt;
Distribuzione: Raspbian (Debian) versione 9, codename &amp;quot;stretch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
&lt;br /&gt;
Al primo avvio la nuova SD Card ha visualizzato una schermata di &amp;quot;Resizing file system&amp;quot; (o qualcosa di simile), seguito da un riavvio del sistema.&lt;br /&gt;
&lt;br /&gt;
SSH nella nuova release non e` attivato di default, prima di proseguire l'ho attivato:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
raspi-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5 Interfacing options&lt;br /&gt;
::P2 SSH Enable&lt;br /&gt;
&lt;br /&gt;
.. e visto che ero qui, ho configurato anche qualcos'altro:&lt;br /&gt;
&lt;br /&gt;
:password&lt;br /&gt;
:hostname &amp;lt;centred&amp;gt;&lt;br /&gt;
:locale &amp;lt;en&amp;gt;&lt;br /&gt;
:timezone &amp;lt;rome&amp;gt;&lt;br /&gt;
:keyboard layout &amp;lt;en-US&amp;gt;&lt;br /&gt;
:wifi country &amp;lt;it&amp;gt; # anche se non la usero`&lt;br /&gt;
&lt;br /&gt;
Visto che ho aggiornato tanta roba, ho riavviato il sistema.&lt;br /&gt;
&lt;br /&gt;
=== Upgrade ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get upgrade&lt;br /&gt;
reboot # perche` ha aggiornato anche i pacchetti del kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installazione pacchetti ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get install nginx fcgiwrap redis-server asterisk festival festvox-ita* python3-dnspython python3-pip git python3-redis&lt;br /&gt;
pip3 install pyxmpp2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
Per prima cosa, meglio avere gia` sottomano il repository git per copiare files e configurazioni, da utente normale, effettuamo una clonazione di questo repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/CentRed.git&lt;br /&gt;
cd CentRed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;IMPORTANTE&lt;br /&gt;
:Tutti i comandi visualizzati nella fasi successive sono riferiti alla directory in cui ci si trova ora, cioe`: &amp;quot;/home/pi/git/CentRed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Crontab ====&lt;br /&gt;
&lt;br /&gt;
Va bene che sia da utente, non servono permessi particolari:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inseriamo questa riga alla fine del file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
10 7 * * 0 redis-cli hmset msg:redis:alive:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Messaggio ciclico di centralina in funzione&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Riga che una volta a settimana ci inviera` un messaggio che la centralina e` in funzione.&lt;br /&gt;
&lt;br /&gt;
==== Asterisk ====&lt;br /&gt;
&lt;br /&gt;
Per editare i successivi files dovrete essere &amp;quot;root&amp;quot;, quindi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/extensions.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
[centred]&lt;br /&gt;
exten =&amp;gt; _X.,1,Answer()&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Playback(alarm)&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Hangup()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/sip.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
; Configurazione di un interno del PBX&lt;br /&gt;
[2001]                          ; numero identificativo dell'interno (il numero della linea telefonica)&lt;br /&gt;
; Turn off silence suppression in X-Lite (&amp;quot;Transmit Silence&amp;quot;=YES)!&lt;br /&gt;
; Note that Xlite sends NAT keep-alive packets, so qualify=yes is not needed&lt;br /&gt;
secret=NC2001                   ; password in chiaro (può essere anche cifrata con MD5)&lt;br /&gt;
type=friend                     ; la configurazione tipica per un telefono è friend, altrimenti con user per una linea solo ricevente, peer per un trunk verso l'esterno&lt;br /&gt;
regexten=1234                   ; When they register, create extension 1234&lt;br /&gt;
context=centred&lt;br /&gt;
callerid=&amp;quot;CentRed&amp;quot; &amp;lt;2001&amp;gt;       ; i dati di presentazione della linea visualizzati nel display di chi riceve la chiamata&lt;br /&gt;
host=dynamic                    ; This device needs to register&lt;br /&gt;
;directmedia=no                 ; Typically set to NO if behind NAT&lt;br /&gt;
disallow=all&lt;br /&gt;
;Configurazione del tipo di compressione della fonia&lt;br /&gt;
;allow=gsm                      ; GSM consumes far less bandwidth than ulaw - formato compresso che risparmia banda&lt;br /&gt;
allow=alaw                      ; il tipo di codec da usare per la chiamata alaw è senza compressione, è adatto ad esempio su lan&lt;br /&gt;
;mailbox=1234@default,1233@default      ; Subscribe to status of multiple mailboxes&lt;br /&gt;
registertrying=yes ; Send a 100 Trying when the device registers.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/mysite /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/myfastcgi.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
Nel web server e` attiva (in configurazione) l'autenticazione, per completarla dovete creare il file &amp;quot;/var/www/.htaccess&amp;quot; in questo modo (sostituite USERNAME col vostro nome o altro):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
echo -n &amp;quot;USERNAME&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
echo -n &amp;quot;:&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
openssl passwd &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
chown www-data:www-data /var/www/.htpasswd&lt;br /&gt;
chmod 600 /var/www/.htpasswd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redis ====&lt;br /&gt;
&lt;br /&gt;
Potete fare come ho fatto io, oppure modificare tutto nel file di configurazione, dovrebbe essere possibile stando a quel che ho letto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/redis/redis.conf&lt;br /&gt;
:Solo commentato la linea (dovrebbe essere la 61)&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#bind 127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ancora pero` l'accesso da remoto non e` possibile, si deve modificare un'altro parametro e renderlo permanente (quello che scrivevo dovrebbe essere possibile nel file di configurazione):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
redis-cli&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG SET protected-mode no&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG REWRITE&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Importante&lt;br /&gt;
:Non ho impostato nessuna password, quindi non esponete questo pc/raspberry alla rete esterna.&lt;br /&gt;
&lt;br /&gt;
==== CentRed (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -va var/www/ /var/&lt;br /&gt;
chown www-data:www-data /var/www/*.html&lt;br /&gt;
chown www-data:www-data -R /var/www/cgi-bin/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
Ovviamente all'avvio del sistema la nostra centralina deve avviarsi da sola, ho scelto di eseguire il programma dal &amp;quot;classico&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Start &amp;quot;CentRed&amp;quot;&lt;br /&gt;
DAEMON_NAME=centred  # senza .py&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato \&amp;quot;$DAEMON_NAME\&amp;quot;, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio $DAEMON_NAME ..&amp;quot;&lt;br /&gt;
                #su pi -c &amp;quot;python3 /var/www/cgi-bin/centred.py &amp;amp;&amp;quot;&lt;br /&gt;
                python3 /var/www/cgi-bin/centred.py &amp;amp;  # deve essere 'root'&lt;br /&gt;
                # .. e un messaggio a se stesso quando si [ri]avvia&lt;br /&gt;
                sleep 2  # un po` di ritardo&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio centralino allarmi CentRed&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Start/Reboot &amp;amp; Configure ====&lt;br /&gt;
&lt;br /&gt;
E` il momento di riavviare il sistema.&lt;br /&gt;
&lt;br /&gt;
Se tutto e` andato bene, dovrebbe essere gia` funzionante, rimane da configurarlo.&lt;br /&gt;
&lt;br /&gt;
Da browser aprite l'indirizzo http://centred:8080 (o &amp;quot;localhost:8080&amp;quot; o usate l'indirizzo IP), alcune voci non funzioneranno, altre pagine andranno proprio in errore, basta inserire i dati corretti e nel giusto ordine.&lt;br /&gt;
&lt;br /&gt;
# Per primo, inserite gli account di posta elettronica e XMPP, inserendo il vostro username/password ed eventuali parametri del server (tipo smtp.gmail.com porta 567).&lt;br /&gt;
# Inserite i destinatari dei messaggi, sono previsti inserimenti per destinatari di mail, XMPP e sip.&lt;br /&gt;
# Ora si possono associare gli elenchi ai tipi di messaggi, cioe`, dove dev'essere inviato il messaggio alarm piuttosto che alert ...&lt;br /&gt;
&lt;br /&gt;
== Pagina principale ==&lt;br /&gt;
&lt;br /&gt;
Pagina principale e menu:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Messaggi.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sono visibili i normali messaggi di controllo di funzionamento di se stessa e della centralina [[Thermo]].&lt;br /&gt;
&lt;br /&gt;
I messaggi non ancora confermati sono inviati a cadenze cicliche e per un massimo di volte, dipendente dalla configurazione.&lt;br /&gt;
&lt;br /&gt;
Ovviamente, una volta confermati, non sono piu` inviati e permangono visualizzati nella pagina fino a scadenza (configurazione).&lt;br /&gt;
&lt;br /&gt;
== Prima configurazione ==&lt;br /&gt;
&lt;br /&gt;
Ed anche unica, normalmente ;)&lt;br /&gt;
&lt;br /&gt;
Il database NoSQL Redis utilizzato, non e` configurabile perche` DEVE risiedere nella stessa macchina.&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:Non sono riuscito a parametrizzare tutte le configurazioni&lt;br /&gt;
&lt;br /&gt;
=== Configurazione accounts ===&lt;br /&gt;
&lt;br /&gt;
==== Mail ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso della posta elettronica, questo e` l'indirizzo che servira` per inviare le mail delle segnalazioni della centralina&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==== XMPP ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso del protocollo XMPP, servira` per inviare le segnalazioni della centralina.&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione liste destinatari ===&lt;br /&gt;
&lt;br /&gt;
Aggiungete gli indirizzi dei destinatari dei messaggi delle varie segnalazioni della centralina:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaSIP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione destinazioni allarme ===&lt;br /&gt;
&lt;br /&gt;
Per ogni tipologia di segnalazione, si deve indicare a quali liste e` da inviare:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllarme.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllerta.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
I parametri di controllo ed invio degli avvisi:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Configurazione.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed.git&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed/wiki&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7398</id>
		<title>CentRed</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7398"/>
		<updated>2023-07-12T12:08:48Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* CentRed (www) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Progetto&lt;br /&gt;
|nome=CentRed&lt;br /&gt;
|descrizione=Centralino di controllo avvisi (segnalazioni e allarmi)&lt;br /&gt;
|repo=https://github.com/raspibo/CentRed.git&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Revisione'''&lt;br /&gt;
* Riviste ed aggiornate queste istruzioni&lt;br /&gt;
* L'installazione di Asterisk da` errore, ma poi tutto sembra funzionare&lt;br /&gt;
* --[[Utente:Dave4rp|Dave4rp]] ([[Discussioni utente:Dave4rp|discussioni]]) 17:39, 28 lug 2019 (CEST)&lt;br /&gt;
&lt;br /&gt;
'''Centralino di gestione avvisi e allarmi'''&lt;br /&gt;
&lt;br /&gt;
Si occupa di avvisare l'utilizzatore attraverso messaggi di posta elettronica, telefonate VOIP e chat (XMPP), di avvisi e allarmi dell'impianto domotico (?) e/o degli apparati che gli inviano messaggi opportunamente predisposti.&lt;br /&gt;
&lt;br /&gt;
Tabella di riferimento del messaggio da inviare: https://github.com/raspibo/CentRed/wiki/Tabella-avvisi.&lt;br /&gt;
&lt;br /&gt;
;Ad oggi questa centralina e` usata da:&lt;br /&gt;
:[[Thermo]]&lt;br /&gt;
:[[Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
== Installazione ==&lt;br /&gt;
&lt;br /&gt;
Distribuzione: Raspbian (Debian) versione 9, codename &amp;quot;stretch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
&lt;br /&gt;
Al primo avvio la nuova SD Card ha visualizzato una schermata di &amp;quot;Resizing file system&amp;quot; (o qualcosa di simile), seguito da un riavvio del sistema.&lt;br /&gt;
&lt;br /&gt;
SSH nella nuova release non e` attivato di default, prima di proseguire l'ho attivato:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
raspi-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5 Interfacing options&lt;br /&gt;
::P2 SSH Enable&lt;br /&gt;
&lt;br /&gt;
.. e visto che ero qui, ho configurato anche qualcos'altro:&lt;br /&gt;
&lt;br /&gt;
:password&lt;br /&gt;
:hostname &amp;lt;centred&amp;gt;&lt;br /&gt;
:locale &amp;lt;en&amp;gt;&lt;br /&gt;
:timezone &amp;lt;rome&amp;gt;&lt;br /&gt;
:keyboard layout &amp;lt;en-US&amp;gt;&lt;br /&gt;
:wifi country &amp;lt;it&amp;gt; # anche se non la usero`&lt;br /&gt;
&lt;br /&gt;
Visto che ho aggiornato tanta roba, ho riavviato il sistema.&lt;br /&gt;
&lt;br /&gt;
=== Upgrade ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get upgrade&lt;br /&gt;
reboot # perche` ha aggiornato anche i pacchetti del kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installazione pacchetti ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get install nginx fcgiwrap redis-server asterisk festival festvox-ita* python3-dnspython python3-pip git python3-redis&lt;br /&gt;
pip3 install pyxmpp2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
Per prima cosa, meglio avere gia` sottomano il repository git per copiare files e configurazioni, da utente normale, effettuamo una clonazione di questo repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/CentRed.git&lt;br /&gt;
cd CentRed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;IMPORTANTE&lt;br /&gt;
:Tutti i comandi visualizzati nella fasi successive sono riferiti alla directory in cui ci si trova ora, cioe`: &amp;quot;/home/pi/git/CentRed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Crontab ====&lt;br /&gt;
&lt;br /&gt;
Va bene che sia da utente, non servono permessi particolari:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inseriamo questa riga alla fine del file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
10 7 * * 0 redis-cli hmset msg:redis:alive:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Messaggio ciclico di centralina in funzione&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Riga che una volta a settimana ci inviera` un messaggio che la centralina e` in funzione.&lt;br /&gt;
&lt;br /&gt;
==== Asterisk ====&lt;br /&gt;
&lt;br /&gt;
Per editare i successivi files dovrete essere &amp;quot;root&amp;quot;, quindi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/extensions.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
[centred]&lt;br /&gt;
exten =&amp;gt; _X.,1,Answer()&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Playback(alarm)&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Hangup()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/sip.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
; Configurazione di un interno del PBX&lt;br /&gt;
[2001]                          ; numero identificativo dell'interno (il numero della linea telefonica)&lt;br /&gt;
; Turn off silence suppression in X-Lite (&amp;quot;Transmit Silence&amp;quot;=YES)!&lt;br /&gt;
; Note that Xlite sends NAT keep-alive packets, so qualify=yes is not needed&lt;br /&gt;
secret=NC2001                   ; password in chiaro (può essere anche cifrata con MD5)&lt;br /&gt;
type=friend                     ; la configurazione tipica per un telefono è friend, altrimenti con user per una linea solo ricevente, peer per un trunk verso l'esterno&lt;br /&gt;
regexten=1234                   ; When they register, create extension 1234&lt;br /&gt;
context=centred&lt;br /&gt;
callerid=&amp;quot;CentRed&amp;quot; &amp;lt;2001&amp;gt;       ; i dati di presentazione della linea visualizzati nel display di chi riceve la chiamata&lt;br /&gt;
host=dynamic                    ; This device needs to register&lt;br /&gt;
;directmedia=no                 ; Typically set to NO if behind NAT&lt;br /&gt;
disallow=all&lt;br /&gt;
;Configurazione del tipo di compressione della fonia&lt;br /&gt;
;allow=gsm                      ; GSM consumes far less bandwidth than ulaw - formato compresso che risparmia banda&lt;br /&gt;
allow=alaw                      ; il tipo di codec da usare per la chiamata alaw è senza compressione, è adatto ad esempio su lan&lt;br /&gt;
;mailbox=1234@default,1233@default      ; Subscribe to status of multiple mailboxes&lt;br /&gt;
registertrying=yes ; Send a 100 Trying when the device registers.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/mysite /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/myfastcgi.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
Nel web server e` attiva (in configurazione) l'autenticazione, per completarla dovete creare il file &amp;quot;/var/www/.htaccess&amp;quot; in questo modo (sostituite USERNAME col vostro nome o altro):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
echo -n &amp;quot;USERNAME&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
echo -n &amp;quot;:&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
openssl passwd &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
chown www-data:www-data /var/www/.htpasswd&lt;br /&gt;
chmod 600 /var/www/.htpasswd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redis ====&lt;br /&gt;
&lt;br /&gt;
Potete fare come ho fatto io, oppure modificare tutto nel file di configurazione, dovrebbe essere possibile stando a quel che ho letto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/redis/redis.conf&lt;br /&gt;
:Solo commentato la linea (dovrebbe essere la 61)&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#bind 127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ancora pero` l'accesso da remoto non e` possibile, si deve modificare un'altro parametro e renderlo permanente (quello che scrivevo dovrebbe essere possibile nel file di configurazione):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
redis-cli&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG SET protected-mode no&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG REWRITE&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Importante&lt;br /&gt;
:Non ho impostato nessuna password, quindi non esponete questo pc/raspberry alla rete esterna.&lt;br /&gt;
&lt;br /&gt;
==== CentRed (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -va var/www/ /var/&lt;br /&gt;
chown www-data:www-data /var/www/*.html&lt;br /&gt;
chown www-data:www-data -R /var/www/cgi-bin/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
Ovviamente all'avvio del sistema la nostra centralina deve avviarsi da sola, ho scelto di eseguire il programma dal &amp;quot;classico&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Start &amp;quot;CentRed&amp;quot;&lt;br /&gt;
DAEMON_NAME=centred  # senza .py&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato \&amp;quot;$DAEMON_NAME\&amp;quot;, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio $DAEMON_NAME ..&amp;quot;&lt;br /&gt;
                #su pi -c &amp;quot;python3 /var/www/cgi-bin/centred.py &amp;amp;&amp;quot;&lt;br /&gt;
                python3 /var/www/cgi-bin/centred.py &amp;amp;  # deve essere 'root'&lt;br /&gt;
                # .. e un messaggio a se stesso quando si [ri]avvia&lt;br /&gt;
                sleep 2  # un po` di ritardo&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio centralino allarmi CentRed&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Start/Reboot &amp;amp; Configure ====&lt;br /&gt;
&lt;br /&gt;
E` il momento di riavviare il sistema.&lt;br /&gt;
&lt;br /&gt;
Se tutto e` andato bene, dovrebbe essere gia` funzionante, rimane da configurarlo.&lt;br /&gt;
&lt;br /&gt;
Da browser aprite l'indirizzo http://centred:8080 (o &amp;quot;localhost:8080&amp;quot; o usate l'indirizzo IP), alcune voci non funzioneranno, altre pagine andranno proprio in errore, basta inserire i dati corretti e nel giusto ordine.&lt;br /&gt;
&lt;br /&gt;
# Per primo, inserite gli account di posta elettronica e XMPP, inserendo il vostro username/password ed eventuali parametri del server (tipo smtp.gmail.com porta 567).&lt;br /&gt;
# Inserite i destinatari dei messaggi, sono previsti inserimenti per destinatari di mail, XMPP e sip.&lt;br /&gt;
# Ora si possono associare gli elenchi ai tipi di messaggi, cioe`, dove dev'essere inviato il messaggio alarm piuttosto che alert ...&lt;br /&gt;
&lt;br /&gt;
== Pagina principale ==&lt;br /&gt;
&lt;br /&gt;
Pagina principale e menu:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Messaggi.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sono visibili i normali messaggi di controllo di funzionamento di se stessa e della centralina [[Thermo]].&lt;br /&gt;
&lt;br /&gt;
I messaggi non ancora confermati sono inviati a cadenze cicliche e per un massimo di volte, dipendente dalla configurazione.&lt;br /&gt;
&lt;br /&gt;
Ovviamente, una volta confermati, non sono piu` inviati e permangono visualizzati nella pagina fino a scadenza (configurazione).&lt;br /&gt;
&lt;br /&gt;
== Prima configurazione ==&lt;br /&gt;
&lt;br /&gt;
Ed anche unica, normalmente ;)&lt;br /&gt;
&lt;br /&gt;
Il database NoSQL Redis utilizzato, non e` configurabile perche` DEVE risiedere nella stessa macchina.&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:Non sono riuscito a parametrizzare tutte le configurazioni&lt;br /&gt;
&lt;br /&gt;
=== Configurazione accounts ===&lt;br /&gt;
&lt;br /&gt;
==== Mail ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso della posta elettronica, questo e` l'indirizzo che servira` per inviare le mail delle segnalazioni della centralina&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==== XMPP ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso del protocollo XMPP, servira` per inviare le segnalazioni della centralina.&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione liste destinatari ===&lt;br /&gt;
&lt;br /&gt;
Aggiungete gli indirizzi dei destinatari dei messaggi delle varie segnalazioni della centralina:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaSIP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione destinazioni allarme ===&lt;br /&gt;
&lt;br /&gt;
Per ogni tipologia di segnalazione, si deve indicare a quali liste e` da inviare:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllarme.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllerta.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
I parametri di controllo ed invio degli avvisi:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Configurazione.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed.git&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed/wiki&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7397</id>
		<title>CentRed</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7397"/>
		<updated>2023-07-12T12:03:51Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Nginx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Progetto&lt;br /&gt;
|nome=CentRed&lt;br /&gt;
|descrizione=Centralino di controllo avvisi (segnalazioni e allarmi)&lt;br /&gt;
|repo=https://github.com/raspibo/CentRed.git&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Revisione'''&lt;br /&gt;
* Riviste ed aggiornate queste istruzioni&lt;br /&gt;
* L'installazione di Asterisk da` errore, ma poi tutto sembra funzionare&lt;br /&gt;
* --[[Utente:Dave4rp|Dave4rp]] ([[Discussioni utente:Dave4rp|discussioni]]) 17:39, 28 lug 2019 (CEST)&lt;br /&gt;
&lt;br /&gt;
'''Centralino di gestione avvisi e allarmi'''&lt;br /&gt;
&lt;br /&gt;
Si occupa di avvisare l'utilizzatore attraverso messaggi di posta elettronica, telefonate VOIP e chat (XMPP), di avvisi e allarmi dell'impianto domotico (?) e/o degli apparati che gli inviano messaggi opportunamente predisposti.&lt;br /&gt;
&lt;br /&gt;
Tabella di riferimento del messaggio da inviare: https://github.com/raspibo/CentRed/wiki/Tabella-avvisi.&lt;br /&gt;
&lt;br /&gt;
;Ad oggi questa centralina e` usata da:&lt;br /&gt;
:[[Thermo]]&lt;br /&gt;
:[[Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
== Installazione ==&lt;br /&gt;
&lt;br /&gt;
Distribuzione: Raspbian (Debian) versione 9, codename &amp;quot;stretch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
&lt;br /&gt;
Al primo avvio la nuova SD Card ha visualizzato una schermata di &amp;quot;Resizing file system&amp;quot; (o qualcosa di simile), seguito da un riavvio del sistema.&lt;br /&gt;
&lt;br /&gt;
SSH nella nuova release non e` attivato di default, prima di proseguire l'ho attivato:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
raspi-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5 Interfacing options&lt;br /&gt;
::P2 SSH Enable&lt;br /&gt;
&lt;br /&gt;
.. e visto che ero qui, ho configurato anche qualcos'altro:&lt;br /&gt;
&lt;br /&gt;
:password&lt;br /&gt;
:hostname &amp;lt;centred&amp;gt;&lt;br /&gt;
:locale &amp;lt;en&amp;gt;&lt;br /&gt;
:timezone &amp;lt;rome&amp;gt;&lt;br /&gt;
:keyboard layout &amp;lt;en-US&amp;gt;&lt;br /&gt;
:wifi country &amp;lt;it&amp;gt; # anche se non la usero`&lt;br /&gt;
&lt;br /&gt;
Visto che ho aggiornato tanta roba, ho riavviato il sistema.&lt;br /&gt;
&lt;br /&gt;
=== Upgrade ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get upgrade&lt;br /&gt;
reboot # perche` ha aggiornato anche i pacchetti del kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installazione pacchetti ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get install nginx fcgiwrap redis-server asterisk festival festvox-ita* python3-dnspython python3-pip git python3-redis&lt;br /&gt;
pip3 install pyxmpp2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
Per prima cosa, meglio avere gia` sottomano il repository git per copiare files e configurazioni, da utente normale, effettuamo una clonazione di questo repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/CentRed.git&lt;br /&gt;
cd CentRed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;IMPORTANTE&lt;br /&gt;
:Tutti i comandi visualizzati nella fasi successive sono riferiti alla directory in cui ci si trova ora, cioe`: &amp;quot;/home/pi/git/CentRed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Crontab ====&lt;br /&gt;
&lt;br /&gt;
Va bene che sia da utente, non servono permessi particolari:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inseriamo questa riga alla fine del file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
10 7 * * 0 redis-cli hmset msg:redis:alive:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Messaggio ciclico di centralina in funzione&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Riga che una volta a settimana ci inviera` un messaggio che la centralina e` in funzione.&lt;br /&gt;
&lt;br /&gt;
==== Asterisk ====&lt;br /&gt;
&lt;br /&gt;
Per editare i successivi files dovrete essere &amp;quot;root&amp;quot;, quindi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/extensions.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
[centred]&lt;br /&gt;
exten =&amp;gt; _X.,1,Answer()&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Playback(alarm)&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Hangup()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/sip.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
; Configurazione di un interno del PBX&lt;br /&gt;
[2001]                          ; numero identificativo dell'interno (il numero della linea telefonica)&lt;br /&gt;
; Turn off silence suppression in X-Lite (&amp;quot;Transmit Silence&amp;quot;=YES)!&lt;br /&gt;
; Note that Xlite sends NAT keep-alive packets, so qualify=yes is not needed&lt;br /&gt;
secret=NC2001                   ; password in chiaro (può essere anche cifrata con MD5)&lt;br /&gt;
type=friend                     ; la configurazione tipica per un telefono è friend, altrimenti con user per una linea solo ricevente, peer per un trunk verso l'esterno&lt;br /&gt;
regexten=1234                   ; When they register, create extension 1234&lt;br /&gt;
context=centred&lt;br /&gt;
callerid=&amp;quot;CentRed&amp;quot; &amp;lt;2001&amp;gt;       ; i dati di presentazione della linea visualizzati nel display di chi riceve la chiamata&lt;br /&gt;
host=dynamic                    ; This device needs to register&lt;br /&gt;
;directmedia=no                 ; Typically set to NO if behind NAT&lt;br /&gt;
disallow=all&lt;br /&gt;
;Configurazione del tipo di compressione della fonia&lt;br /&gt;
;allow=gsm                      ; GSM consumes far less bandwidth than ulaw - formato compresso che risparmia banda&lt;br /&gt;
allow=alaw                      ; il tipo di codec da usare per la chiamata alaw è senza compressione, è adatto ad esempio su lan&lt;br /&gt;
;mailbox=1234@default,1233@default      ; Subscribe to status of multiple mailboxes&lt;br /&gt;
registertrying=yes ; Send a 100 Trying when the device registers.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/mysite /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/myfastcgi.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
Nel web server e` attiva (in configurazione) l'autenticazione, per completarla dovete creare il file &amp;quot;/var/www/.htaccess&amp;quot; in questo modo (sostituite USERNAME col vostro nome o altro):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
echo -n &amp;quot;USERNAME&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
echo -n &amp;quot;:&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
openssl passwd &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
chown www-data:www-data /var/www/.htpasswd&lt;br /&gt;
chmod 600 /var/www/.htpasswd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redis ====&lt;br /&gt;
&lt;br /&gt;
Potete fare come ho fatto io, oppure modificare tutto nel file di configurazione, dovrebbe essere possibile stando a quel che ho letto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/redis/redis.conf&lt;br /&gt;
:Solo commentato la linea (dovrebbe essere la 61)&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#bind 127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ancora pero` l'accesso da remoto non e` possibile, si deve modificare un'altro parametro e renderlo permanente (quello che scrivevo dovrebbe essere possibile nel file di configurazione):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
redis-cli&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG SET protected-mode no&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG REWRITE&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Importante&lt;br /&gt;
:Non ho impostato nessuna password, quindi non esponete questo pc/raspberry alla rete esterna.&lt;br /&gt;
&lt;br /&gt;
==== CentRed (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -va var/www/ /var/&lt;br /&gt;
chown www-data:www-data /var/www/*.html&lt;br /&gt;
chown www-data:www-data /var/www/cgi-bin/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
Ovviamente all'avvio del sistema la nostra centralina deve avviarsi da sola, ho scelto di eseguire il programma dal &amp;quot;classico&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Start &amp;quot;CentRed&amp;quot;&lt;br /&gt;
DAEMON_NAME=centred  # senza .py&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato \&amp;quot;$DAEMON_NAME\&amp;quot;, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio $DAEMON_NAME ..&amp;quot;&lt;br /&gt;
                #su pi -c &amp;quot;python3 /var/www/cgi-bin/centred.py &amp;amp;&amp;quot;&lt;br /&gt;
                python3 /var/www/cgi-bin/centred.py &amp;amp;  # deve essere 'root'&lt;br /&gt;
                # .. e un messaggio a se stesso quando si [ri]avvia&lt;br /&gt;
                sleep 2  # un po` di ritardo&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio centralino allarmi CentRed&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Start/Reboot &amp;amp; Configure ====&lt;br /&gt;
&lt;br /&gt;
E` il momento di riavviare il sistema.&lt;br /&gt;
&lt;br /&gt;
Se tutto e` andato bene, dovrebbe essere gia` funzionante, rimane da configurarlo.&lt;br /&gt;
&lt;br /&gt;
Da browser aprite l'indirizzo http://centred:8080 (o &amp;quot;localhost:8080&amp;quot; o usate l'indirizzo IP), alcune voci non funzioneranno, altre pagine andranno proprio in errore, basta inserire i dati corretti e nel giusto ordine.&lt;br /&gt;
&lt;br /&gt;
# Per primo, inserite gli account di posta elettronica e XMPP, inserendo il vostro username/password ed eventuali parametri del server (tipo smtp.gmail.com porta 567).&lt;br /&gt;
# Inserite i destinatari dei messaggi, sono previsti inserimenti per destinatari di mail, XMPP e sip.&lt;br /&gt;
# Ora si possono associare gli elenchi ai tipi di messaggi, cioe`, dove dev'essere inviato il messaggio alarm piuttosto che alert ...&lt;br /&gt;
&lt;br /&gt;
== Pagina principale ==&lt;br /&gt;
&lt;br /&gt;
Pagina principale e menu:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Messaggi.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sono visibili i normali messaggi di controllo di funzionamento di se stessa e della centralina [[Thermo]].&lt;br /&gt;
&lt;br /&gt;
I messaggi non ancora confermati sono inviati a cadenze cicliche e per un massimo di volte, dipendente dalla configurazione.&lt;br /&gt;
&lt;br /&gt;
Ovviamente, una volta confermati, non sono piu` inviati e permangono visualizzati nella pagina fino a scadenza (configurazione).&lt;br /&gt;
&lt;br /&gt;
== Prima configurazione ==&lt;br /&gt;
&lt;br /&gt;
Ed anche unica, normalmente ;)&lt;br /&gt;
&lt;br /&gt;
Il database NoSQL Redis utilizzato, non e` configurabile perche` DEVE risiedere nella stessa macchina.&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:Non sono riuscito a parametrizzare tutte le configurazioni&lt;br /&gt;
&lt;br /&gt;
=== Configurazione accounts ===&lt;br /&gt;
&lt;br /&gt;
==== Mail ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso della posta elettronica, questo e` l'indirizzo che servira` per inviare le mail delle segnalazioni della centralina&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==== XMPP ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso del protocollo XMPP, servira` per inviare le segnalazioni della centralina.&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione liste destinatari ===&lt;br /&gt;
&lt;br /&gt;
Aggiungete gli indirizzi dei destinatari dei messaggi delle varie segnalazioni della centralina:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaSIP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione destinazioni allarme ===&lt;br /&gt;
&lt;br /&gt;
Per ogni tipologia di segnalazione, si deve indicare a quali liste e` da inviare:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllarme.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllerta.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
I parametri di controllo ed invio degli avvisi:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Configurazione.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed.git&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed/wiki&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7367</id>
		<title>Centralina livello 1</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7367"/>
		<updated>2022-03-08T13:59:54Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
![[File:Livello1-Debug.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Centralina livello 1&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Centralina generale (?) gestione segnali&lt;br /&gt;
|-&lt;br /&gt;
|Repository: https://github.com/raspibo/Livello1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
= Centralina  livello 1 =&lt;br /&gt;
&lt;br /&gt;
;ATTENZIONE&lt;br /&gt;
:Tutte le immagini sono puramente indicative, il progetto e` in pieno sviluppo, tutto e` passibile di modifiche, anche sostanziali.&lt;br /&gt;
:L'immagine di presentazione si riferisce alla sezione &amp;quot;debug&amp;quot;, realizzata con Dokuwiki e (ad oggi) non fa parte del progetto (o si ?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prima e sommaria descrizione ==&lt;br /&gt;
&lt;br /&gt;
Centralina di controllo segnali.&lt;br /&gt;
&lt;br /&gt;
:(Ad oggi)&lt;br /&gt;
:Acquisisce segnali, li suddivide in gruppi mono o multi utenza, dei quali: realizza grafici temporali, crea e gestisce allarmi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dal campo arrivano i valori della 'sensoristica' sottoforma di &amp;quot;Identificatore Valore&amp;quot;, da queste informazioni sono aggiunti i sensori che eventualmente non sono presenti e le relative 'liste' dei valori (sono generate due chiavi, una dell'utenza e l'altra dei valori), altrimenti viene solo accodato il valore nella rispettiva lista (aggiungendo data-ora-minuti-secondi).&lt;br /&gt;
&lt;br /&gt;
Acquisiti i sensori, e` possibile il loro raggruppamento (anche una sola utenza) ed il campionamento dei valori a tempi prestabiliti (generazione grafici tempo/valore).&lt;br /&gt;
&lt;br /&gt;
Sempre previo raggruppamento (sempre &amp;quot;anche di un solo sensore&amp;quot;), e` possibile attivare/disattivare i relativi allarmi, il classico ON/OFF, ma anche un'automatico (che per esempio attivi i sensori del solaio/cantine dalle 20 alle 8, quando e` certo che nessuno si rechi in quegli spazi).&lt;br /&gt;
&lt;br /&gt;
E poi il resto .. che sarebbe di arrivare non solo a leggere/interpretare segnali, ma anche a pilotare utenze (luci, serrande, elettrodomestici, ...)&lt;br /&gt;
&lt;br /&gt;
L'idea e` che tutto questo sia gestibile da:&lt;br /&gt;
# interfaccia web&lt;br /&gt;
#* browser&lt;br /&gt;
#* cellulare&lt;br /&gt;
# linea di comando&lt;br /&gt;
# terminali operatore (display+tastiere)&lt;br /&gt;
# pulsanti, lampade, selettori, ..&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
== Hardware e Software ==&lt;br /&gt;
&lt;br /&gt;
;Hardware&lt;br /&gt;
:Versione 1 - [[Raspberry Pi 3]], perche` completa di WiFi e Bluetooth&lt;br /&gt;
:Versione 2 (2018) - [[Raspberry Pi]] con chiavetta WiFi&lt;br /&gt;
&lt;br /&gt;
;Software&lt;br /&gt;
:MQTT Broker (Mosquitto), perche` in grado di dialogare con la maggior parte dei componenti (Arduino, ESP8266, eccetera)&lt;br /&gt;
:Redis, perche` servira` un database di appoggio e manipolazione per alcuni dati, e perche` servira` una struttura dati &amp;quot;manipolabile&amp;quot; (dovremo poter aggiungere e togliere &amp;quot;campi:valori&amp;quot; ad una &amp;quot;chiave&amp;quot;, e aggiungere/togliere chiavi a delle liste, ecc. ecc.)&lt;br /&gt;
:Nginx, non si puo` fare senza web server&lt;br /&gt;
:... e poi non so cos'altro&lt;br /&gt;
:Script cgi&lt;br /&gt;
:javascript&lt;br /&gt;
: ...&lt;br /&gt;
&lt;br /&gt;
Sistema operativo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
$ lsb_release -a&lt;br /&gt;
No LSB modules are available.&lt;br /&gt;
Distributor ID: Raspbian&lt;br /&gt;
Description:    Raspbian GNU/Linux 11 (bullseye)&lt;br /&gt;
Release:        11&lt;br /&gt;
Codename:       bullseye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Embedded page --&amp;gt;&lt;br /&gt;
{{:Raspberry_Pi-Raspbian_default_post-install}}&lt;br /&gt;
&lt;br /&gt;
== Access Point ==&lt;br /&gt;
&lt;br /&gt;
Installato/configurato &amp;quot;[[Raspberry Pi Access Point WEP2]]&amp;quot;, sfruttando il wifi integrato nel [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
Installazione dei pacchetti utili, necessari (e qualcuno inutile):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt install nginx fcgiwrap redis-server python3-redis mosquitto ssl-cert php8.0-fpm php8.0-xml python3-pip python3-paho-mqtt python3-pandas python3-cairosvg python3-tinycss python3-cssselect git mosquitto-clients redis-tools&lt;br /&gt;
pip3 install python-telegram-bot pygal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nelle precedenti versioni fu installato manualmente anche [http://www.dokuwiki.org dokuwiki], utilizzato per segnarsi appunti vari (e un po` di debug), e` facoltativo e non descritto le operazioni necessarie, ma i files di configurazione del web server si.&lt;br /&gt;
&lt;br /&gt;
E` necessario scaricare il repository con i programmi (script python per lo piu`), si puo` fare da normale utente, per esempio:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/Livello1.git&lt;br /&gt;
cd Livello1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/level1 /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-enabled/level1 /etc/nginx/sites-enabled/&lt;br /&gt;
#cp etc/nginx/dokuwiki* etc/nginx/fcgiwrap.conf /etc/nginx/ # se installate dokuwiki&lt;br /&gt;
cp etc/nginx/fcgiwrap.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
==== Level1 (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu var/www/ /var/&lt;br /&gt;
chown www-data:www-data -R /var/www/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serve anche la scrittura in &amp;quot;www&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chmod 775 /var/www&lt;br /&gt;
chown :www-data -R /var/www    # oppure si poteva eliminare il &amp;quot;/&amp;quot; dal &amp;quot;chown&amp;quot; precedente&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
:Potrebbe essere necessario creare la directory &amp;quot;/var/www/archive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Mosquitto ====&lt;br /&gt;
&lt;br /&gt;
Copiare il file di configurazione dal repository ed assicurarsi i giusti permessi e proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/mosquitto/conf.d/myadd.conf /etc/mosquitto/conf.d/&lt;br /&gt;
chown root:root /etc/mosquitto/conf.d/myadd.conf&lt;br /&gt;
chmod 644 /etc/mosquitto/conf.d/myadd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Telegram Bot ====&lt;br /&gt;
&lt;br /&gt;
Scaricare il repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone hhttps://github.com/raspibo/bot4livello1.git&lt;br /&gt;
cd bot4livello1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Questo programma fu creato in origine nella directory &amp;quot;/home/pi/project/csv2image2telegram&amp;quot;, quindi tutti i riferimenti sono a questa, copiate qua il programma oppure modificate la directory dove necessario (&amp;quot;/etc/rc.local&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Il programma dev'essere esguito al boot di sistema e rimanere sempre in esecuzione.&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
All'avvio del sistema, devono andare in esecuzione alcuni script (quasi &amp;quot;daemons&amp;quot;) e rimanere attivi, per questo si deve modificare il file &amp;quot;/etc/rc.local&amp;quot; (lo trovate nel repository git):&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Power On &amp;quot;Level 1&amp;quot;&lt;br /&gt;
DAEMON_NAME=mqtt2redis_d&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviata correttamente Livello 1, oppure mqtt2redis_d e\` gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio \&amp;quot;mqtt2redis_d\&amp;quot;&amp;quot;&lt;br /&gt;
                #/var/www/cgi-bin/mqtt2redis_init.d.sh start # 20180115&lt;br /&gt;
        su -c &amp;quot;/var/www/cgi-bin/mqtt2redis_init.d.sh start&amp;quot; pi&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Centralina level 1 [ri]avviata ..&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Start Telegram Bot&lt;br /&gt;
DAEMON_NAME=bot4livello1&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato il Telegram Bot, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio Telegram Bot&amp;quot;&lt;br /&gt;
                cd /home/pi/project/csv2image2telegram&lt;br /&gt;
                su pi -c &amp;quot;python3 bot4livello1.py &amp;amp;&amp;quot;&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio bot4livello1.py&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inoltre, visto che puo` capitare s'interrompano, specialmente nelle prove di nuovi [[Centralina_livello_1#Devices|devices]], sono predisposti dei &amp;quot;check orari&amp;quot; che nel caso, li riavviano:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.hourly/mqtt2redis_check /etc/cron.hourly/&lt;br /&gt;
cp -vapu etc/cron.hourly/bot4livello1_check /etc/cron.hourly/ # se installerete anche il bot telegram&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ho anche previsto un messaggio settimanale di centralina in funzione tramite crontab dell'utente pi, copiate il file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu var/spool/cron/crontabs/pi /var/spool/cron/crontabs/&lt;br /&gt;
chown root:root /var/spool/cron/crontabs/pi&lt;br /&gt;
chmod 600 /var/spool/cron/crontabs/pi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
oppure aggiungete la linea (col comando &amp;quot;crontab -e&amp;quot;):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
0 7 * * 0 redis-cli -h centred hmset msg:redis:alive:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Messaggio ciclico, centralina $(hostname) in funzione&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Backup ====&lt;br /&gt;
&lt;br /&gt;
Oltre ad un &amp;quot;backup&amp;quot; che si occupa di salvare tutti i computer's della rete, ho aggiunto uno script per salvare giornalmente il database redis, come ulteriore sicurezza, i files sono salvati nella directory &amp;quot;/root&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.daily/backupredis /etc/cron.daily/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rete ==&lt;br /&gt;
&lt;br /&gt;
Al momento e` previsto che sia tutto sotto WiFi (quella onboard) del [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
Comunque bastera` modificare il firewall per accettare dati dalla ethernet se si rendesse necessario.&lt;br /&gt;
&lt;br /&gt;
Le centrali accessorie, tipo quella di [[CentRed|allarme]], che deve solo ricevere, non necessariamente dovranno trovarsi nella sottorete gestita da &amp;quot;livello 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Descrizione ==&lt;br /&gt;
&lt;br /&gt;
I 'segnali' arrivano sempre (?) a &amp;quot;MQTT broker&amp;quot;, vengono manipolati se necessario, ed inseriti nel database Redis.&lt;br /&gt;
&lt;br /&gt;
Dal database Redis sono di nuovo letti/scritti/modificati/manipolati ed inviati:&lt;br /&gt;
:e/o&lt;br /&gt;
::in report (testo, grafico, audio, video, ...)&lt;br /&gt;
:e/o&lt;br /&gt;
::alla centralina di allarme [[CentRed]]&lt;br /&gt;
:e/o&lt;br /&gt;
::reinviati a MQTT broker&lt;br /&gt;
:e/o&lt;br /&gt;
::inviati ad altre centraline livello 1&lt;br /&gt;
:e/o&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
=== Configurazione e Funzionamento ===&lt;br /&gt;
&lt;br /&gt;
(Sommariamente)&lt;br /&gt;
&lt;br /&gt;
Al primo avvio e` necesssario configurare prima il database Redis da utilizzare, poi quello della [[CentRed|centralina avvisi/allarmi]] (se avete intenzione di ricevere le comunicazioni relative agli allarmi e/o avvisi di malfunzionamenti).&lt;br /&gt;
&lt;br /&gt;
Una volta &amp;quot;letti&amp;quot; i segnali, e` opera dell'utente aggiungere alcune caratteristiche [[#Segnali]], fatto questo si passa alla creazione dei [[#Gruppi]].&lt;br /&gt;
&lt;br /&gt;
Definiti i [[#Gruppi]], si passa ad avviare i servizi necessari [[#Daemons]], che si occupano di generare i grafici Tempo-Valore/i o gestione degli allarmi/anomalie.&lt;br /&gt;
&lt;br /&gt;
== Arrivo dati e manipolazione ==&lt;br /&gt;
&lt;br /&gt;
I dati devono arrivare al broker MQTT nel formato:&lt;br /&gt;
&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
inviati nel topic:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fate riferimento alla [[#Tabella dati e valori]] per comprendere meglio il significato.&lt;br /&gt;
&lt;br /&gt;
Nell'immagine, una schermata dei test in corso, a sinistra gli errori di lettura, a destra un listato della &amp;quot;cgi-bin&amp;quot;, sotto i falsi dati inviati (mi servono per i test che sto` facendo ;) ), e in fondo i dati ricevuti (veri e falsi).&lt;br /&gt;
&lt;br /&gt;
[[File:Level1 201604170814.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mqtt2redis_d.py ===&lt;br /&gt;
&lt;br /&gt;
I dati MQTT vengono letti dal programma &amp;quot;mqtt2redis_d.py&amp;quot; che deve sempre essere in esecuzione (ho gia` preparato anche un &amp;quot;init.d&amp;quot;, che tengo ancora nella &amp;quot;cgi-bin&amp;quot;), questi li manipola inserendoli se non presenti, in due &amp;quot;chiavi&amp;quot; nel database (noSQL) Redis, la prima, e` per identificare il segnale:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
la seconda e` quella dei valori:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
valori che sono accodati ad ogni arrivo con l'aggiunta della data e ora, predisposti per una generazione di output in formato &amp;quot;csv&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== ''IMPORTANTE'' ==&lt;br /&gt;
&lt;br /&gt;
''Quello che segue non e` aggiornato di pari passo con l'aggiornamento del software e quant'altro necessario.''&lt;br /&gt;
&lt;br /&gt;
''Durante l'uso, nelle pagine di configurazione e modifica compaiono delle descrizioni che sono piu` veritiere/aggiornate, perche` scritte durante la stesura e/o modifica del software.''&lt;br /&gt;
&lt;br /&gt;
== Segnali ==&lt;br /&gt;
&lt;br /&gt;
Una volta pervenuto il primo valore di un segnale, e` possibile configurarlo inserendo alcuni dati che non sono presenti nella comunicazione MQTT:&lt;br /&gt;
&lt;br /&gt;
;Descrizione&lt;br /&gt;
:Meglio se breve, perche` usata anche nei riferimenti dei grafici, non solo per gli allarmi (per esempio: &amp;quot;ST1 Cucina&amp;quot; per sensore temperatura in cucina)&lt;br /&gt;
;UM (Unita` di misura)&lt;br /&gt;
;TempoRitardo&lt;br /&gt;
:Ancora non usata&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Specificare il range dei valori nel formato 0,100&lt;br /&gt;
:Utile per sonde che (per esempio) lavorano da 0 a 100 gradi&lt;br /&gt;
:Genera avviso/allarme se minore di o maggiore di&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Avviso se valore e` inferiore a quello impostato&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Aavviso se valore e` superiore a quello impostato&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:Previsto per i segnali analogici o negati&lt;br /&gt;
:Avviso quando valore uguale a ValoreOn&lt;br /&gt;
;Allarme&lt;br /&gt;
:Definire qua i valori che saranno usati come allarmi, per esempio: ValoreOn,ValoreMin&lt;br /&gt;
:Se sono impostati, ma non indicati qua, sono emessi dei semplici avvisi&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sonda temperatura (ovviamente falsa):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashTempMod Falsa2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sensore di movimento (pir, ovviamente falso):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashPirMod Falso2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
== Gruppi ==&lt;br /&gt;
&lt;br /&gt;
Per realizzare i raggruppamenti ho utilizzato le chiavi Redis di tipo &amp;quot;sets&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Al momento ho pensato ai soli gruppi riguardanti gli allarmi e i grafici (per esempio quelli di due o piu`, sonde di temperatura).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Puoi benissimo creare un gruppo con un solo sensore.&lt;br /&gt;
&lt;br /&gt;
Al solito, ho pensato ad una chiave univoca d'inserimento dei dati in Redis '''sets:type:ID''' (gruppo:tipo:identificatore).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gruppo&lt;br /&gt;
|&lt;br /&gt;
* sets&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* alarms&lt;br /&gt;
* graph&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore)&lt;br /&gt;
|&lt;br /&gt;
(definito da utente, esempi:)&lt;br /&gt;
* TemperatureBagno&lt;br /&gt;
* TemperaturePianoTerra&lt;br /&gt;
* luigi&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I gruppi sono definiti dall'utente, ed ogni volta che viene creato un nuovo gruppo (deve avere almeno un'utenza altrimenti si autoelimina), viene gia` creato il &amp;quot;Timer&amp;quot; di &amp;quot;campionamento&amp;quot;/&amp;quot;ritardo nuovo allarme&amp;quot;, preimpostato a 5 minuti (sono previsti valori da 1 a 60 minuti).&lt;br /&gt;
&lt;br /&gt;
''La pagina d'inserimento permette di inserire una chiave con un nome qualsiasi, non ho ancora &amp;quot;bloccato&amp;quot; e/o previsto un controllo sull'identificatore assegnato.''&lt;br /&gt;
&lt;br /&gt;
=== sets:*:ID:Config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Timer&lt;br /&gt;
|&lt;br /&gt;
* da 1 60 minuti&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Funzionamento&lt;br /&gt;
|&lt;br /&gt;
* On&lt;br /&gt;
* Off&lt;br /&gt;
* Auto&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) dalle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) alle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;graph&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
La chiave per questi gruppi e` previsto che sia: '''sets:graph:ID'''&lt;br /&gt;
&lt;br /&gt;
La chiave per il timer di campionamento e` previsto che sia: '''sets:graph:ID:Timer''' (ora e` generata automaticamente)&lt;br /&gt;
&lt;br /&gt;
La chiave per i dati campionati e la generazione del grafico (che sara` in formato csv) e` previsto che sia: '''sets:graph:ID:Valori''' (sara` creata ed aggiornata autonomamente, da un programma in python)&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;alarms&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Al momento come sopra, tranne che il Timer non servira` (o forse si, perche` sono previsti anche grafici dei PIR).&lt;br /&gt;
&lt;br /&gt;
==== Esempio d'inserimento gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Aggiungi chiavi &amp;quot;sets&amp;quot; Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysAddSets 1.png&lt;br /&gt;
File:Livello1-KeysAddSets 2.png&lt;br /&gt;
File:Livello1-KeysAddSets 3.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
::Nell'immagine e` gia` stato applicato il filtro '''*:graph:*'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModHash 1.png|Spostiamoci verso il basso e selezioniamo la seconda voce di modifica delle chiavi &amp;quot;hash&amp;quot;, quella relativa al &amp;quot;Config&amp;quot;:&lt;br /&gt;
File:Livello1-KeysModHash 2.png&lt;br /&gt;
File:Livello1-KeysModHash 3.png|e l'esempio di un allarme:&lt;br /&gt;
File:Livello1-KeysModHash 3a.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modifica di un gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModSets 2.png&lt;br /&gt;
File:Livello1-KeysModSets 3.png|Credo si spieghi da sola ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Daemons ==&lt;br /&gt;
&lt;br /&gt;
Intanto: non sono veri e propri &amp;quot;demoni&amp;quot;, sono script che l'utente avvia e ferma al bisogno.&lt;br /&gt;
&lt;br /&gt;
Specialmente quello degli allarmi (che mi sta` rompendo al cellulare da stamattina ;) ), e` da avviare quando uscite di casa, e fermare prima di rientrare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Daemons part1.png&lt;br /&gt;
File:Livello1-Daemons part2.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grafici (files .csv) ==&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;TIP&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Allarmi ==&lt;br /&gt;
&lt;br /&gt;
Per ogni gruppo creato, e` possibile eseguire il controllo allarmi, servono opportune preimpostazioni (configurazioni), poi e` possibile eseguire il software dalla pagina '''Daemons''':&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-Allarmi-Daemons.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Si puo` notare in esecuzione solo quello relativo ad una falsa sonda di temperatura, relativo ai [[Centralina livello 1/Test allarmi|test eseguiti]].&lt;br /&gt;
&lt;br /&gt;
L'eseguibile e` &amp;quot;/var/www/cgi-bin/setsalarms_d.py&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== setsalarms_d.py ===&lt;br /&gt;
&lt;br /&gt;
Perche` possa &amp;quot;funzionare&amp;quot; servono alcuni requisiti:&lt;br /&gt;
*Deve esistere il gruppo ed avere una configurazione (che e` preimpostata alla creazione)&lt;br /&gt;
*Il gruppo deve essere &amp;quot;on&amp;quot; o in modalita` &amp;quot;auto&amp;quot; (per default e` &amp;quot;off&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Tutti sono avvisi (li ho chiamati &amp;quot;alert&amp;quot;), alcuni possono e devono invece diventare allarmi (&amp;quot;alarm&amp;quot;). Perche` siano definiti allarmi, devono essere inseriti nella voce &amp;quot;Allarme&amp;quot;, presente nella configurazione della sonda (sensore, PIR, o quello che e`).&lt;br /&gt;
&lt;br /&gt;
Tipi di &amp;quot;alert&amp;quot;:&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero,[+-]Numero, una sonda 1wire pe esempio sarebbe: -55,+125&lt;br /&gt;
:;Alert&lt;br /&gt;
::Se il valore letto e` fuori dal range&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` inferiore&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` superiore&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:0 o 1&lt;br /&gt;
:Al momento e` previsto per sola sensoristica come: finecorsa, PIR, e altri segnali on/off&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` uguale&lt;br /&gt;
;Allarme&lt;br /&gt;
:Quello che e` allarme e non semplice avviso:&lt;br /&gt;
::ValoreOn&lt;br /&gt;
::ValoreMin&lt;br /&gt;
::ValoreMin,ValoreMax,ValoreOn&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
Per un'esempio di configurazione fate riferimento alla pagina [[Centralina livello 1/Test allarmi|Test Allarmi]].&lt;br /&gt;
&lt;br /&gt;
Il software invia gli avvisi/allarmi alla centralina [[CentRed]], e` questa poi ad occuparsi della trasmissione, discriminando il tipo dalla stringa con cui e` stato inviato. Altre informazioni alla pagina [[CentRed]].&lt;br /&gt;
&lt;br /&gt;
== Analizza e Modifica Valori ==&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto la possibilita` di manipolare i valori memorizzati nel database Redis.&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Selezione_Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sono ammesse solamente chiavi &amp;quot;:Valori&amp;quot;, la possibilita` di selezione dipende (al solito) dal filtro attivo nella pagina.&lt;br /&gt;
&lt;br /&gt;
Una volta scelta la chiave e cliccato su &amp;quot;Analizza e Modifica&amp;quot;, compare la pagina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dove e` possibile:&lt;br /&gt;
* Visualizzare tutti i valori&lt;br /&gt;
* Creare il file &amp;quot;.csv&amp;quot; da elaborare successivamente tramite l'apposita pagina&lt;br /&gt;
* Eliminare i dati ormai obsoleti (attenzione che non ho filtrato le immissioni, e` possibile anche fare il contrario)&lt;br /&gt;
&lt;br /&gt;
== Tabella dati e valori ==&lt;br /&gt;
&lt;br /&gt;
Denominazione dei campi e attibuzione dei valori standard (piu` o meno)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* Temperatura&lt;br /&gt;
* PIR&lt;br /&gt;
* Finecorsa&lt;br /&gt;
* Proximity&lt;br /&gt;
* Livello&lt;br /&gt;
* Rele`&lt;br /&gt;
* Termostato&lt;br /&gt;
* Valvola&lt;br /&gt;
* Motore&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione del segnale&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TipoIO&lt;br /&gt;
|&lt;br /&gt;
* I (Input/Ingresso)&lt;br /&gt;
* O (Output/Uscita)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segnale&lt;br /&gt;
|&lt;br /&gt;
* Analogico&lt;br /&gt;
* Digitale&lt;br /&gt;
* Testo&lt;br /&gt;
* I2C&lt;br /&gt;
* SPI&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Al momento l'ho soppresso, il tipo di segnale e` praticamente definito dal valore in entrata (per ora)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneC&lt;br /&gt;
|&lt;br /&gt;
* Casa&lt;br /&gt;
* Garage&lt;br /&gt;
* Giardino&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneP&lt;br /&gt;
|&lt;br /&gt;
* Piano0 / PianoZero&lt;br /&gt;
* Piano1 / PianoUno&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneS&lt;br /&gt;
|&lt;br /&gt;
* Cucina1&lt;br /&gt;
* Camera2&lt;br /&gt;
* Bagno1&lt;br /&gt;
* ...&lt;br /&gt;
* Cantina&lt;br /&gt;
* EsternoSala&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore, Utenza/ITEM)&lt;br /&gt;
|&lt;br /&gt;
* 1&lt;br /&gt;
* 2&lt;br /&gt;
* 3&lt;br /&gt;
* ..&lt;br /&gt;
* Up&lt;br /&gt;
* Down&lt;br /&gt;
* Left&lt;br /&gt;
* Right&lt;br /&gt;
* (altro ?)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Convenzioni usate ad oggi:&lt;br /&gt;
* STn sonda/sensore temperatura [n = numero]&lt;br /&gt;
* RHn sonda/sensore umidita` relativa [n = numero]&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Definito dall'utente che programma i &amp;quot;remote&amp;quot;, ma meglio definire una struttura di base ..&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valori&lt;br /&gt;
|&lt;br /&gt;
* TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori&lt;br /&gt;
|&lt;br /&gt;
Assegnato automaticamente dal programma&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UM (Unita` di Misura)&lt;br /&gt;
|&lt;br /&gt;
* °C&lt;br /&gt;
* V (tensione)&lt;br /&gt;
* A (assorbimento)&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Questo e` previsto solo per le segnalazioni/avvisi/allarmi .. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TempoRitardo (secondi)&lt;br /&gt;
|&lt;br /&gt;
* 0.000&lt;br /&gt;
* 1.002&lt;br /&gt;
* ...&lt;br /&gt;
* 99.000 (max impostabile)&lt;br /&gt;
|&lt;br /&gt;
Al momento non previsto, teoricamente i segnali dovrebbero arrivare gia` &amp;quot;filtrati&amp;quot; dai &amp;quot;remote&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! RangeValori&lt;br /&gt;
|&lt;br /&gt;
* 0,100&lt;br /&gt;
* -50,125&lt;br /&gt;
* 0,1&lt;br /&gt;
|&lt;br /&gt;
Da utilizzarsi per definire l'errore e generare una segnalazione di sonda guasta&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMin&lt;br /&gt;
|&lt;br /&gt;
* 10 (temperatura)&lt;br /&gt;
* 0 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sotto a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMax&lt;br /&gt;
|&lt;br /&gt;
* 40 (temperatura)&lt;br /&gt;
* 1 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sopra a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreOn&lt;br /&gt;
|&lt;br /&gt;
* 1 (quando attivo a segnale on)&lt;br /&gt;
* 0 (quando attivo a segnale off)&lt;br /&gt;
* [Valore]&lt;br /&gt;
|&lt;br /&gt;
Valore da utilizzare per alert/alarm, e per definire se si tratta di un segnale negato (zero) e trattarlo di conseguenza&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Allarme&lt;br /&gt;
|&lt;br /&gt;
* ValoreOn&lt;br /&gt;
* ValoreMin&lt;br /&gt;
* ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin&lt;br /&gt;
* ValoreOn,ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin,ValoreMax&lt;br /&gt;
* ValoreMin,ValoreMax&lt;br /&gt;
|&lt;br /&gt;
Quali sono da trattare come allarmi, di default, se impostati, sono trattati come alert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data (e ora)&lt;br /&gt;
|&lt;br /&gt;
* 2016/03/13 20:40:08&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valore&lt;br /&gt;
|&lt;br /&gt;
* 0&lt;br /&gt;
* 1&lt;br /&gt;
* 13&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Promemoria chiavi, codici e ... ==&lt;br /&gt;
&lt;br /&gt;
====== Dati (mqtt) ======&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Topic (mqtt) ======&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria segnale di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria gruppi di livello 1 (redis) ======&lt;br /&gt;
;TYPE&lt;br /&gt;
:graph&lt;br /&gt;
:alarms&lt;br /&gt;
'''sets:TYPE:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria configurazione gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Config'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Notes|Notes]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Primo avvio|Primo avvio]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Test allarmi|Test allarmi]]&lt;br /&gt;
&lt;br /&gt;
= Devices =&lt;br /&gt;
&lt;br /&gt;
Ad oggi, ho predisposto/preparato:&lt;br /&gt;
* [[PorTHable]], che invia valori di temperatura&lt;br /&gt;
* [[ ESP8266/DS1820toMQTT | DS1820toMQTT ]], sensore/i di temperatura&lt;br /&gt;
* [[ ESP8266/PIRtoMQTT | PIRtoMQTT ]], sensore di movimento (PIR)&lt;br /&gt;
* [[ ESP8266/SerialToMQTT_Repeater | SerialToMQTT Repeater ]], che funziona da &amp;quot;repeater&amp;quot;, ritrasmette i dati ricevuti via seriale al broker MQTT&lt;br /&gt;
* [[ Thermo ]], che invia il valore della temperatura (solo di riferimento ad oggi, non le altre sonde)&lt;br /&gt;
* [[ ENC28J60-ATMEGA328P-DS18B20 | ENC28J60 + ATMEGA328P + DS18B20 ]], sensore di temperatura in ethernet&lt;br /&gt;
* [[ Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | ATMEGA328P + ESP8266 + DHT + Rain]], sensore temperatura/umidita` (dht) e pioggia (rain)&lt;br /&gt;
* [[ ESP8266/DHT22toMQTT | DHT22toMQTT ]], sensore di temperatura e umidita`&lt;br /&gt;
* [[ Centralina_livello_1/Dev_HTRL_wAE | ATMEGA328P + ESP8266 + DHT + Rain + Photoresistor]], sensore temperatura/umidita` (dht), pioggia (rain) e luminosita` (photoresistor).&amp;lt;br&amp;gt; Nuova e migliorata (?) versione del precedente [[Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | device]]&lt;br /&gt;
* [[ Cronotermostato settimanale ]]&lt;br /&gt;
* [[ Centralina_livello_1/Centralina_livello_2_PIR | Centralina livello 2 - PIR ]]&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/telegram bot|Telegram Bot per Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
= Problemi e soluzioni ? =&lt;br /&gt;
&lt;br /&gt;
;Eliminazione file di swap&lt;br /&gt;
:Non so se sia stato un problema e sia utile&lt;br /&gt;
::[[Raspberry_PI-Raspbian-Personalizzazioni#Disattivazione|Disattivazione file di swap]]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore salvataggio in background&lt;br /&gt;
:[https://jee-appy.blogspot.it/2016/04/can-not-save-in-background-fork-redis.html Can't save in background: fork: Cannot allocate memory Redis]&lt;br /&gt;
:[https://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory redis bgsave failed because fork Cannot allocate memory]&lt;br /&gt;
:[https://stackoverflow.com/questions/19581059/misconf-redis-is-configured-to-save-rdb-snapshots MISCONF Redis is configured to save RDB snapshots]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore avvio del server&lt;br /&gt;
:Dopo un ripristino del sistema ho avuto dei problemi di permessi al file &amp;quot;dump.rdb&amp;quot; (che ho voluto ricopiare per riprendermi alcune impostazioni), ho reimpostato in &amp;quot;redis:redis&amp;quot; (directory &amp;quot;/var/lib/redis&amp;quot; inclusa) il proprietario e settato i permessi a 660.&lt;br /&gt;
&lt;br /&gt;
;I daemon non vengono eseguiti dalle pagine web&lt;br /&gt;
:Non sono stati corretti i permessi della directory del webserver &amp;quot;/var/www&amp;quot; [[#Level1_.28www.29]]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi_Access_Point_WEP2&amp;diff=7363</id>
		<title>Raspberry Pi Access Point WEP2</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi_Access_Point_WEP2&amp;diff=7363"/>
		<updated>2022-02-20T18:50:35Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Firewall (iptables) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Premessa ==&lt;br /&gt;
&lt;br /&gt;
Questo articolo potrebbe contenere inesattezze e/o dimenticanze, oltretutto e` la prima volta che uso e configuro 'hostapd' e 'dnsmasq'.&amp;lt;br /&amp;gt;&lt;br /&gt;
Si declina ogni responsabilita`.&lt;br /&gt;
&lt;br /&gt;
Nell'esempio ho utilizzato la rete &amp;quot;192.168.3.0/24&amp;quot;, cambiatela secondo le vostre neccessita`.&lt;br /&gt;
&lt;br /&gt;
; Note&lt;br /&gt;
: Tutti i comandi ed i file sono da eseguire e/o modificare come utente &amp;quot;root&amp;quot;.&lt;br /&gt;
: In alcuni ho aggiunto &amp;quot;sudo&amp;quot; davanti, ovviamente non e` necessario se gia` siete &amp;quot;root&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Installazione ==&lt;br /&gt;
&lt;br /&gt;
Terminata l'installazione base [[Raspberry_Pi-Raspbian_default_post-install|Raspbian]] (fate eventuale aggiornamento), installiamo alcuni pacchetti necessari:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;apt-get install hostapd hostap-utils dnsmasq&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; iw&lt;br /&gt;
: nell'ultima release di [[Raspbian]] e` gia` installato, l'ho usato per controllare che la chiave usb wifi fosse AP compatibile (comando: &amp;quot;iw list&amp;quot;, poi andate a leggere il report se compare la scritta AP)&lt;br /&gt;
&lt;br /&gt;
== Configurazione ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
&lt;br /&gt;
Per prima cosa ho modificato il file &amp;quot;/etc/network/interfaces&amp;quot; aggiungendo la configurazione per la periferica 'wlan0' (normalmente e` cosi` che viene vista la chiave usb wifi):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# interfaces(5) file used by ifup(8) and ifdown(8)&lt;br /&gt;
&lt;br /&gt;
# Please note that this file is written to be used with dhcpcd&lt;br /&gt;
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'&lt;br /&gt;
&lt;br /&gt;
# Include files from /etc/network/interfaces.d:&lt;br /&gt;
source-directory /etc/network/interfaces.d&lt;br /&gt;
&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
auto eth0&lt;br /&gt;
allow-hotplug eth0&lt;br /&gt;
iface eth0 inet dhcp&lt;br /&gt;
&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet static&lt;br /&gt;
        address 192.168.3.1&lt;br /&gt;
        netmask 255.255.255.0&lt;br /&gt;
        hostapd /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== hostapd ===&lt;br /&gt;
&lt;br /&gt;
Letto &amp;quot;/usr/share/doc/hostapd/README.Debian&amp;quot;, procediamo come indicato, generandoci dall'esempio il file &amp;quot;/etc/hostapd/hostapd.conf&amp;quot;, per ragioni di permessi ho trovato qualche difficolta` ad eseguire il comando cosi` come scritto, questi dovrebbero funzionare:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
zcat /usr/share/doc/hostapd/examples/hostapd.conf.gz &amp;gt; /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Versione &amp;quot;bullseye&amp;quot;'''&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp /usr/share/doc/hostapd/examples/hostapd.conf /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per 'sicurezza' ho anche messo il file leggibile/scrivibile solo da 'root'&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo chmod 600 /etc/hostapd/hostapd.conf&lt;br /&gt;
sudo chown root:root /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ora correggiamo la configurazione secondo le nostre esigenze, modifichiamo &amp;quot;/etc/hostapd/hostapd.conf&amp;quot; (indichero` solo le righe che ho modificato, le altre sono state lasciate inalterate):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
ssid=&amp;lt;MetteteUnNomePerLaReteWifi&amp;gt;&lt;br /&gt;
wpa=2&lt;br /&gt;
wpa_passphrase=&amp;lt;MetteteLaVostra&amp;gt;&lt;br /&gt;
wpa_key_mgmt=WPA-PSK&lt;br /&gt;
rsn_pairwise=CCMP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dnsmasq ===&lt;br /&gt;
&lt;br /&gt;
Il procedimento e` lo stesso usato per la configurazione 'hostapd', utilizzo dell'esempio e modifiche del caso.&lt;br /&gt;
Correggiamo la configurazione secondo le nostre esigenze, modifichiamo &amp;quot;/etc/dnsmasq.conf&amp;quot; (indichero` solo le righe che ho modificato, le altre sono state lasciate inalterate):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
domain-needed&lt;br /&gt;
bogus-priv&lt;br /&gt;
interface=wlan0&lt;br /&gt;
dhcp-range=192.168.3.2,192.168.3.5,12h&lt;br /&gt;
dhcp-option=option:router,192.168.3.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rimane solo un problema sulla risoluzione del nome macchina (hostname) di questo pc, al momento ho risolto sistemando il file &amp;quot;/etc/hosts&amp;quot; in questo modo, dove ho modificato la penultima ed aggiunto l'ultima riga (esempio reale preso da [[Centralina livello 1]]):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1       localhost&lt;br /&gt;
::1             localhost ip6-localhost ip6-loopback&lt;br /&gt;
ff02::1         ip6-allnodes&lt;br /&gt;
ff02::2         ip6-allrouters&lt;br /&gt;
&lt;br /&gt;
127.0.1.1       level1error&lt;br /&gt;
192.168.3.1     level1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Firewall (iptables) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt install iptables&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Normalmente uso un'utility online per generare la base e procedo poi al ritocco secondo le esigenze, l'indirizzo del 'generatore' e`: http://easyfwgen.morizot.net/&lt;br /&gt;
&lt;br /&gt;
Questa e` la configurazione impostata, modificatela secondo le vostre esigenze, considerate sempre di NON usare e/o attivare opzioni che non conoscete e/o sapete a cosa servono. Da Notare che sono stati predisposti servizi che al momento non sono utilizzati, se pensate di non averne bisogno, disattivateli.&lt;br /&gt;
&lt;br /&gt;
(Per migliorarne la lettura ho realizzato diverse schermate, che messe in ordine somigliano alla pagina web che vi troverete ad impostare).&lt;br /&gt;
&lt;br /&gt;
[[File:Easy_Firewall_Generator_for_iptables.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Easy_Firewall_Generator_for_iptables_2.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Easy_Firewall_Generator_for_iptables_3.png]]&lt;br /&gt;
&lt;br /&gt;
Create la vostra configurazione e salvatela in un file chiamato &amp;quot;/etc/init.d/iptables&amp;quot;, cambiate poi i permessi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo chmod 755 /etc/init.d/iptables&lt;br /&gt;
sudo chown root:root /etc/init.d/iptables&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Questa e` quella che ho predisposto, attivando anche servizi come &amp;quot;http&amp;quot; ed &amp;quot;ftp&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# Generated iptables firewall script for the Linux 2.4 kernel&lt;br /&gt;
# Script generated by Easy Firewall Generator for IPTables 1.15&lt;br /&gt;
# copyright 2002 Timothy Scott Morizot&lt;br /&gt;
# &lt;br /&gt;
# Redhat chkconfig comments - firewall applied early,&lt;br /&gt;
#                             removed late&lt;br /&gt;
# chkconfig: 2345 08 92&lt;br /&gt;
# description: This script applies or removes iptables firewall rules&lt;br /&gt;
# &lt;br /&gt;
# This generator is primarily designed for RedHat installations,&lt;br /&gt;
# although it should be adaptable for others.&lt;br /&gt;
#&lt;br /&gt;
# It can be executed with the typical start and stop arguments.&lt;br /&gt;
# If used with stop, it will stop after flushing the firewall.&lt;br /&gt;
# The save and restore arguments will save or restore the rules&lt;br /&gt;
# from the /etc/sysconfig/iptables file.  The save and restore&lt;br /&gt;
# arguments are included to preserve compatibility with&lt;br /&gt;
# Redhat's or Fedora's init.d script if you prefer to use it.&lt;br /&gt;
&lt;br /&gt;
# Redhat/Fedora installation instructions&lt;br /&gt;
#&lt;br /&gt;
# 1. Have the system link the iptables init.d startup script into run states&lt;br /&gt;
#    2, 3, and 5.&lt;br /&gt;
#    chkconfig --level 235 iptables on&lt;br /&gt;
#&lt;br /&gt;
# 2. Save this script and execute it to load the ruleset from this file.&lt;br /&gt;
#    You may need to run the dos2unix command on it to remove carraige returns.&lt;br /&gt;
#&lt;br /&gt;
# 3. To have it applied at startup, copy this script to&lt;br /&gt;
#    /etc/init.d/iptables.  It accepts stop, start, save, and restore&lt;br /&gt;
#    arguments.  (You may wish to save the existing one first.)&lt;br /&gt;
#    Alternatively, if you issue the 'service iptables save' command&lt;br /&gt;
#    the init.d script should save the rules and reload them at runtime.&lt;br /&gt;
#&lt;br /&gt;
# 4. For non-Redhat systems (or Redhat systems if you have a problem), you&lt;br /&gt;
#    may want to append the command to execute this script to rc.local.&lt;br /&gt;
#    rc.local is typically located in /etc and /etc/rc.d and is usually&lt;br /&gt;
#    the last thing executed on startup.  Simply add /path/to/script/script_name&lt;br /&gt;
#    on its own line in the rc.local file.&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# &lt;br /&gt;
# Local Settings&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# sysctl location.  If set, it will use sysctl to adjust the kernel parameters.&lt;br /&gt;
# If this is set to the empty string (or is unset), the use of sysctl&lt;br /&gt;
# is disabled.&lt;br /&gt;
&lt;br /&gt;
SYSCTL=&amp;quot;/sbin/sysctl -w&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# To echo the value directly to the /proc file instead&lt;br /&gt;
# SYSCTL=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# IPTables Location - adjust if needed&lt;br /&gt;
&lt;br /&gt;
IPT=&amp;quot;/sbin/iptables&amp;quot;&lt;br /&gt;
IPTS=&amp;quot;/sbin/iptables-save&amp;quot;&lt;br /&gt;
IPTR=&amp;quot;/sbin/iptables-restore&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Internet Interface&lt;br /&gt;
INET_IFACE=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Local Interface Information&lt;br /&gt;
LOCAL_IFACE=&amp;quot;wlan0&amp;quot;&lt;br /&gt;
LOCAL_IP=&amp;quot;192.168.3.1&amp;quot;&lt;br /&gt;
LOCAL_NET=&amp;quot;192.168.3.0/24&amp;quot;&lt;br /&gt;
LOCAL_BCAST=&amp;quot;192.168.3.255&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Localhost Interface&lt;br /&gt;
&lt;br /&gt;
LO_IFACE=&amp;quot;lo&amp;quot;&lt;br /&gt;
LO_IP=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Save and Restore arguments handled here&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; = &amp;quot;save&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
	echo -n &amp;quot;Saving firewall to /etc/sysconfig/iptables ... &amp;quot;&lt;br /&gt;
	$IPTS &amp;gt; /etc/sysconfig/iptables&lt;br /&gt;
	echo &amp;quot;done&amp;quot;&lt;br /&gt;
	exit 0&lt;br /&gt;
elif [ &amp;quot;$1&amp;quot; = &amp;quot;restore&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
	echo -n &amp;quot;Restoring firewall from /etc/sysconfig/iptables ... &amp;quot;&lt;br /&gt;
	$IPTR &amp;lt; /etc/sysconfig/iptables&lt;br /&gt;
	echo &amp;quot;done&amp;quot;&lt;br /&gt;
	exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Load Modules&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Loading kernel modules ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# You should uncomment the line below and run it the first time just to&lt;br /&gt;
# ensure all kernel module dependencies are OK.  There is no need to run&lt;br /&gt;
# every time, however.&lt;br /&gt;
&lt;br /&gt;
# /sbin/depmod -a&lt;br /&gt;
&lt;br /&gt;
# Unless you have kernel module auto-loading disabled, you should not&lt;br /&gt;
# need to manually load each of these modules.  Other than ip_tables,&lt;br /&gt;
# ip_conntrack, and some of the optional modules, I've left these&lt;br /&gt;
# commented by default.  Uncomment if you have any problems or if&lt;br /&gt;
# you have disabled module autoload.  Note that some modules must&lt;br /&gt;
# be loaded by another kernel module.&lt;br /&gt;
&lt;br /&gt;
# core netfilter module&lt;br /&gt;
/sbin/modprobe ip_tables&lt;br /&gt;
&lt;br /&gt;
# the stateful connection tracking module&lt;br /&gt;
/sbin/modprobe ip_conntrack&lt;br /&gt;
&lt;br /&gt;
# filter table module&lt;br /&gt;
# /sbin/modprobe iptable_filter&lt;br /&gt;
&lt;br /&gt;
# mangle table module&lt;br /&gt;
# /sbin/modprobe iptable_mangle&lt;br /&gt;
&lt;br /&gt;
# nat table module&lt;br /&gt;
# /sbin/modprobe iptable_nat&lt;br /&gt;
&lt;br /&gt;
# LOG target module&lt;br /&gt;
# /sbin/modprobe ipt_LOG&lt;br /&gt;
&lt;br /&gt;
# This is used to limit the number of packets per sec/min/hr&lt;br /&gt;
# /sbin/modprobe ipt_limit&lt;br /&gt;
&lt;br /&gt;
# masquerade target module&lt;br /&gt;
# /sbin/modprobe ipt_MASQUERADE&lt;br /&gt;
&lt;br /&gt;
# filter using owner as part of the match&lt;br /&gt;
# /sbin/modprobe ipt_owner&lt;br /&gt;
&lt;br /&gt;
# REJECT target drops the packet and returns an ICMP response.&lt;br /&gt;
# The response is configurable.  By default, connection refused.&lt;br /&gt;
# /sbin/modprobe ipt_REJECT&lt;br /&gt;
&lt;br /&gt;
# This target allows packets to be marked in the mangle table&lt;br /&gt;
# /sbin/modprobe ipt_mark&lt;br /&gt;
&lt;br /&gt;
# This target affects the TCP MSS&lt;br /&gt;
# /sbin/modprobe ipt_tcpmss&lt;br /&gt;
&lt;br /&gt;
# This match allows multiple ports instead of a single port or range&lt;br /&gt;
# /sbin/modprobe multiport&lt;br /&gt;
&lt;br /&gt;
# This match checks against the TCP flags&lt;br /&gt;
# /sbin/modprobe ipt_state&lt;br /&gt;
&lt;br /&gt;
# This match catches packets with invalid flags&lt;br /&gt;
# /sbin/modprobe ipt_unclean&lt;br /&gt;
&lt;br /&gt;
# The ftp nat module is required for non-PASV ftp support&lt;br /&gt;
/sbin/modprobe ip_nat_ftp&lt;br /&gt;
&lt;br /&gt;
# the module for full ftp connection tracking&lt;br /&gt;
/sbin/modprobe ip_conntrack_ftp&lt;br /&gt;
&lt;br /&gt;
# the module for full irc connection tracking&lt;br /&gt;
/sbin/modprobe ip_conntrack_irc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Kernel Parameter Configuration&lt;br /&gt;
#&lt;br /&gt;
# See http://ipsysctl-tutorial.frozentux.net/chunkyhtml/index.html&lt;br /&gt;
# for a detailed tutorial on sysctl and the various settings&lt;br /&gt;
# available.&lt;br /&gt;
&lt;br /&gt;
# Required to enable IPv4 forwarding.&lt;br /&gt;
# Redhat users can try setting FORWARD_IPV4 in /etc/sysconfig/network to true&lt;br /&gt;
# Alternatively, it can be set in /etc/sysctl.conf&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.ip_forward=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This enables dynamic address hacking.&lt;br /&gt;
# This may help if you have a dynamic IP address \(e.g. slip, ppp, dhcp\).&lt;br /&gt;
#if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
#then&lt;br /&gt;
#    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/ip_dynaddr&lt;br /&gt;
#else&lt;br /&gt;
#    $SYSCTL net.ipv4.ip_dynaddr=&amp;quot;1&amp;quot;&lt;br /&gt;
#fi&lt;br /&gt;
&lt;br /&gt;
# This enables SYN flood protection.&lt;br /&gt;
# The SYN cookies activation allows your system to accept an unlimited&lt;br /&gt;
# number of TCP connections while still trying to give reasonable&lt;br /&gt;
# service during a denial of service attack.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/tcp_syncookies&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.tcp_syncookies=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This enables source validation by reversed path according to RFC1812.&lt;br /&gt;
# In other words, did the response packet originate from the same interface&lt;br /&gt;
# through which the source packet was sent?  It's recommended for single-homed&lt;br /&gt;
# systems and routers on stub networks.  Since those are the configurations&lt;br /&gt;
# this firewall is designed to support, I turn it on by default.&lt;br /&gt;
# Turn it off if you use multiple NICs connected to the same network.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/rp_filter&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.rp_filter=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option allows a subnet to be firewalled with a single IP address.&lt;br /&gt;
# It's used to build a DMZ.  Since that's not a focus of this firewall&lt;br /&gt;
# script, it's not enabled by default, but is included for reference.&lt;br /&gt;
# See: http://www.sjdjweis.com/linux/proxyarp/ &lt;br /&gt;
#if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
#then&lt;br /&gt;
#    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/proxy_arp&lt;br /&gt;
#else&lt;br /&gt;
#    $SYSCTL net.ipv4.conf.all.proxy_arp=&amp;quot;1&amp;quot;&lt;br /&gt;
#fi&lt;br /&gt;
&lt;br /&gt;
# The following kernel settings were suggested by Alex Weeks. Thanks!&lt;br /&gt;
&lt;br /&gt;
# This kernel parameter instructs the kernel to ignore all ICMP&lt;br /&gt;
# echo requests sent to the broadcast address.  This prevents&lt;br /&gt;
# a number of smurfs and similar DoS nasty attacks.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.icmp_echo_ignore_broadcasts=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option can be used to accept or refuse source routed&lt;br /&gt;
# packets.  It is usually on by default, but is generally&lt;br /&gt;
# considered a security risk.  This option turns it off.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;0&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/accept_source_route&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.accept_source_route=&amp;quot;0&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option can disable ICMP redirects.  ICMP redirects&lt;br /&gt;
# are generally considered a security risk and shouldn't be&lt;br /&gt;
# needed by most systems using this generator.&lt;br /&gt;
#if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
#then&lt;br /&gt;
#    echo &amp;quot;0&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/accept_redirects&lt;br /&gt;
#else&lt;br /&gt;
#    $SYSCTL net.ipv4.conf.all.accept_redirects=&amp;quot;0&amp;quot;&lt;br /&gt;
#fi&lt;br /&gt;
&lt;br /&gt;
# However, we'll ensure the secure_redirects option is on instead.&lt;br /&gt;
# This option accepts only from gateways in the default gateways list.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/secure_redirects&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.secure_redirects=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option logs packets from impossible addresses.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/log_martians&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.log_martians=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Flush Any Existing Rules or Chains&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Flushing Tables ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Reset Default Policies&lt;br /&gt;
$IPT -P INPUT ACCEPT&lt;br /&gt;
$IPT -P FORWARD ACCEPT&lt;br /&gt;
$IPT -P OUTPUT ACCEPT&lt;br /&gt;
$IPT -t nat -P PREROUTING ACCEPT&lt;br /&gt;
$IPT -t nat -P POSTROUTING ACCEPT&lt;br /&gt;
$IPT -t nat -P OUTPUT ACCEPT&lt;br /&gt;
$IPT -t mangle -P PREROUTING ACCEPT&lt;br /&gt;
$IPT -t mangle -P OUTPUT ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Flush all rules&lt;br /&gt;
$IPT -F&lt;br /&gt;
$IPT -t nat -F&lt;br /&gt;
$IPT -t mangle -F&lt;br /&gt;
&lt;br /&gt;
# Erase all non-default chains&lt;br /&gt;
$IPT -X&lt;br /&gt;
$IPT -t nat -X&lt;br /&gt;
$IPT -t mangle -X&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; = &amp;quot;stop&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;Firewall completely flushed!  Now running with no firewall.&amp;quot;&lt;br /&gt;
	exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Rules Configuration&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Filter Table&lt;br /&gt;
#&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Set Policies&lt;br /&gt;
&lt;br /&gt;
$IPT -P INPUT DROP&lt;br /&gt;
$IPT -P OUTPUT DROP&lt;br /&gt;
$IPT -P FORWARD DROP&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# User-Specified Chains&lt;br /&gt;
#&lt;br /&gt;
# Create user chains to reduce the number of rules each packet&lt;br /&gt;
# must traverse.&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Create and populate custom rule chains ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Create a chain to filter INVALID packets&lt;br /&gt;
&lt;br /&gt;
$IPT -N bad_packets&lt;br /&gt;
&lt;br /&gt;
# Create another chain to filter bad tcp packets&lt;br /&gt;
&lt;br /&gt;
$IPT -N bad_tcp_packets&lt;br /&gt;
&lt;br /&gt;
# Create separate chains for icmp, tcp (incoming and outgoing),&lt;br /&gt;
# and incoming udp packets.&lt;br /&gt;
&lt;br /&gt;
$IPT -N icmp_packets&lt;br /&gt;
&lt;br /&gt;
# Used for UDP packets inbound from the Internet&lt;br /&gt;
$IPT -N udp_inbound&lt;br /&gt;
&lt;br /&gt;
# Used to block outbound UDP services from internal network&lt;br /&gt;
# Default to allow all&lt;br /&gt;
$IPT -N udp_outbound&lt;br /&gt;
&lt;br /&gt;
# Used to allow inbound services if desired&lt;br /&gt;
# Default fail except for established sessions&lt;br /&gt;
$IPT -N tcp_inbound&lt;br /&gt;
&lt;br /&gt;
# Used to block outbound services from internal network&lt;br /&gt;
# Default to allow all&lt;br /&gt;
$IPT -N tcp_outbound&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Populate User Chains&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# bad_packets chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# Drop packets received on the external interface&lt;br /&gt;
# claiming a source of the local network&lt;br /&gt;
$IPT -A bad_packets -p ALL -i $INET_IFACE -s $LOCAL_NET -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Illegal source: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_packets -p ALL -i $INET_IFACE -s $LOCAL_NET -j DROP&lt;br /&gt;
&lt;br /&gt;
# Drop INVALID packets immediately&lt;br /&gt;
$IPT -A bad_packets -p ALL -m state --state INVALID -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Invalid packet: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_packets -p ALL -m state --state INVALID -j DROP&lt;br /&gt;
&lt;br /&gt;
# Then check the tcp packets for additional problems&lt;br /&gt;
$IPT -A bad_packets -p tcp -j bad_tcp_packets&lt;br /&gt;
&lt;br /&gt;
# All good, so return&lt;br /&gt;
$IPT -A bad_packets -p ALL -j RETURN&lt;br /&gt;
&lt;br /&gt;
# bad_tcp_packets chain&lt;br /&gt;
#&lt;br /&gt;
# All tcp packets will traverse this chain.&lt;br /&gt;
# Every new connection attempt should begin with&lt;br /&gt;
# a syn packet.  If it doesn't, it is likely a&lt;br /&gt;
# port scan.  This drops packets in state&lt;br /&gt;
# NEW that are not flagged as syn packets.&lt;br /&gt;
&lt;br /&gt;
# Return to the calling chain if the bad packets originate&lt;br /&gt;
# from the local interface. This maintains the approach&lt;br /&gt;
# throughout this firewall of a largely trusted internal&lt;br /&gt;
# network.&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp -i $LOCAL_IFACE -j RETURN&lt;br /&gt;
&lt;br /&gt;
# However, I originally did apply this filter to the forward chain&lt;br /&gt;
# for packets originating from the internal network.  While I have&lt;br /&gt;
# not conclusively determined its effect, it appears to have the&lt;br /&gt;
# interesting side effect of blocking some of the ad systems.&lt;br /&gt;
# Apparently some ad systems have the browser initiate a NEW&lt;br /&gt;
# connection that is not flagged as a syn packet to retrieve&lt;br /&gt;
# the ad image.  If you wish to experiment further comment the&lt;br /&gt;
# rule above. If you try it, you may also wish to uncomment the&lt;br /&gt;
# rule below.  It will keep those packets from being logged.&lt;br /&gt;
# There are a lot of them.&lt;br /&gt;
# $IPT -A bad_tcp_packets -p tcp -i $LOCAL_IFACE ! --syn -m state \&lt;br /&gt;
#     --state NEW -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;New not syn: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP&lt;br /&gt;
&lt;br /&gt;
# All good, so return&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp -j RETURN&lt;br /&gt;
&lt;br /&gt;
# icmp_packets chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is for inbound (from the Internet) icmp packets only.&lt;br /&gt;
# Type 8 (Echo Request) is not accepted by default&lt;br /&gt;
# Enable it if you want remote hosts to be able to reach you.&lt;br /&gt;
# 11 (Time Exceeded) is the only one accepted&lt;br /&gt;
# that would not already be covered by the established&lt;br /&gt;
# connection rule.  Applied to INPUT on the external interface.&lt;br /&gt;
# &lt;br /&gt;
# See: http://www.ee.siue.edu/~rwalden/networking/icmp.html&lt;br /&gt;
# for more info on ICMP types.&lt;br /&gt;
#&lt;br /&gt;
# Note that the stateful settings allow replies to ICMP packets.&lt;br /&gt;
# These rules allow new packets of the specified types.&lt;br /&gt;
&lt;br /&gt;
# ICMP packets should fit in a Layer 2 frame, thus they should&lt;br /&gt;
# never be fragmented.  Fragmented ICMP packets are a typical sign&lt;br /&gt;
# of a denial of service attack.&lt;br /&gt;
$IPT -A icmp_packets --fragment -p ICMP -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;ICMP Fragment: &amp;quot;&lt;br /&gt;
$IPT -A icmp_packets --fragment -p ICMP -j DROP&lt;br /&gt;
&lt;br /&gt;
# Echo - uncomment to allow your system to be pinged.&lt;br /&gt;
# Uncomment the LOG command if you also want to log PING attempts&lt;br /&gt;
# &lt;br /&gt;
# $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j LOG \&lt;br /&gt;
#    --log-prefix &amp;quot;Ping detected: &amp;quot;&lt;br /&gt;
# $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# By default, however, drop pings without logging. Blaster&lt;br /&gt;
# and other worms have infected systems blasting pings.&lt;br /&gt;
# Comment the line below if you want pings logged, but it&lt;br /&gt;
# will likely fill your logs.&lt;br /&gt;
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j DROP&lt;br /&gt;
&lt;br /&gt;
# Time Exceeded&lt;br /&gt;
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Not matched, so return so it will be logged&lt;br /&gt;
$IPT -A icmp_packets -p ICMP -j RETURN&lt;br /&gt;
&lt;br /&gt;
# TCP &amp;amp; UDP&lt;br /&gt;
# Identify ports at:&lt;br /&gt;
#    http://www.chebucto.ns.ca/~rakerman/port-table.html&lt;br /&gt;
#    http://www.iana.org/assignments/port-numbers&lt;br /&gt;
&lt;br /&gt;
# udp_inbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain describes the inbound UDP packets it will accept.&lt;br /&gt;
# It's applied to INPUT on the external or Internet interface.&lt;br /&gt;
# Note that the stateful settings allow replies.&lt;br /&gt;
# These rules are for new requests.&lt;br /&gt;
# It drops netbios packets (windows) immediately without logging.&lt;br /&gt;
&lt;br /&gt;
# Drop netbios calls&lt;br /&gt;
# Please note that these rules do not really change the way the firewall&lt;br /&gt;
# treats netbios connections.  Connections from the localhost and&lt;br /&gt;
# internal interface (if one exists) are accepted by default.&lt;br /&gt;
# Responses from the Internet to requests initiated by or through&lt;br /&gt;
# the firewall are also accepted by default.  To get here, the&lt;br /&gt;
# packets would have to be part of a new request received by the&lt;br /&gt;
# Internet interface.  You would have to manually add rules to&lt;br /&gt;
# accept these.  I added these rules because some network connections,&lt;br /&gt;
# such as those via cable modems, tend to be filled with noise from&lt;br /&gt;
# unprotected Windows machines.  These rules drop those packets&lt;br /&gt;
# quickly and without logging them.  This prevents them from traversing&lt;br /&gt;
# the whole chain and keeps the log from getting cluttered with&lt;br /&gt;
# chatter from Windows systems.&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 137 -j DROP&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 138 -j DROP&lt;br /&gt;
&lt;br /&gt;
# Network Time Protocol (NTP) Server&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 123 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# DNS Server&lt;br /&gt;
# Configure the server to use port 53 as the source port for requests&lt;br /&gt;
# Note, if you run a caching-only name server that only accepts queries&lt;br /&gt;
# from the private network or localhost, you can comment out this line.&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 53 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# If you don't query-source the server to port 53 and you have problems,&lt;br /&gt;
# uncomment this rule.  It specifically allows responses to queries&lt;br /&gt;
# initiated to another server from a high UDP port.  The stateful&lt;br /&gt;
# connection rules should handle this situation, though.&lt;br /&gt;
# $IPT -A udp_inbound -p UDP -s 0/0 --source-port 53 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Dynamic Address&lt;br /&gt;
# If DHCP, the initial request is a broadcast. The response&lt;br /&gt;
# doesn't exactly match the outbound packet.  This explicitly&lt;br /&gt;
# allow the DHCP ports to alleviate this problem.&lt;br /&gt;
# If you receive your dynamic address by a different means, you&lt;br /&gt;
# can probably comment this line.&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --source-port 67 --destination-port 68 \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Network File System (NFS) Server&lt;br /&gt;
# Please note that additional services must&lt;br /&gt;
# be configured in order to support an NFS Server through&lt;br /&gt;
# the firewall. Read the help in the generator or this site:&lt;br /&gt;
# http://www.lowth.com/LinWiz/nfs_help.html&lt;br /&gt;
&lt;br /&gt;
# NFS Server - portmapper&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 111 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - statd&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9400 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - NFS daemon&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 2049 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - lockd&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9401 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - mountd&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9402 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - quotad&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9403 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Not matched, so return for logging&lt;br /&gt;
$IPT -A udp_inbound -p UDP -j RETURN&lt;br /&gt;
&lt;br /&gt;
# udp_outbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is used with a private network to prevent forwarding for&lt;br /&gt;
# UDP requests on specific protocols.  Applied to the FORWARD rule from&lt;br /&gt;
# the internal network.  Ends with an ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# No match, so ACCEPT&lt;br /&gt;
$IPT -A udp_outbound -p UDP -s 0/0 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# tcp_inbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is used to allow inbound connections to the&lt;br /&gt;
# system/gateway.  Use with care.  It defaults to none.&lt;br /&gt;
# It's applied on INPUT from the external or Internet interface.&lt;br /&gt;
&lt;br /&gt;
# DNS Server - Allow TCP connections (zone transfers and large requests)&lt;br /&gt;
# This is disabled by default.  DNS Zone transfers occur via TCP.&lt;br /&gt;
# If you need to allow transfers over the net you need to uncomment this line.&lt;br /&gt;
# If you allow queries from the 'net, you also need to be aware that although&lt;br /&gt;
# DNS queries use UDP by default, a truncated UDP query can legally be&lt;br /&gt;
# submitted via TCP instead.  You probably will never need it, but should&lt;br /&gt;
# be aware of the fact.&lt;br /&gt;
# $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 53 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Web Server&lt;br /&gt;
&lt;br /&gt;
# HTTP&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 80 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# HTTPS (Secure Web Server)&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 443 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# FTP Server (Control)&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 21 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# FTP Client (Data Port for non-PASV transfers)&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --source-port 20 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Passive FTP&lt;br /&gt;
# &lt;br /&gt;
# With passive FTP, the server provides a port to the client&lt;br /&gt;
# and allows the client to initiate the connection rather&lt;br /&gt;
# than initiating the connection with the client from the data port.&lt;br /&gt;
# Web browsers and clients operating behind a firewall generally&lt;br /&gt;
# use passive ftp transfers.  A general purpose FTP server&lt;br /&gt;
# will need to support them.&lt;br /&gt;
# &lt;br /&gt;
# However, by default an FTP server will select a port from the entire&lt;br /&gt;
# range of high ports.  It is not particularly safe to open all&lt;br /&gt;
# high ports.  Fortunately, that range can be restricted.  This&lt;br /&gt;
# firewall presumes that the range has been restricted to a specific&lt;br /&gt;
# selected range.  That range must also be configured in the ftp server.&lt;br /&gt;
# &lt;br /&gt;
# Instructions for specifying the port range for the wu-ftpd server&lt;br /&gt;
# can be found here:&lt;br /&gt;
# http://www.wu-ftpd.org/man/ftpaccess.html&lt;br /&gt;
# (See the passive ports option.)&lt;br /&gt;
# &lt;br /&gt;
# Instructions for the ProFTPD server can be found here:&lt;br /&gt;
# http://proftpd.linux.co.uk/localsite/Userguide/linked/x861.html&lt;br /&gt;
&lt;br /&gt;
# Sample Rule&lt;br /&gt;
# $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 62000:64000 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# sshd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Network File System (NFS) Server&lt;br /&gt;
# Please note that additional services must&lt;br /&gt;
# be configured in order to support an NFS Server through&lt;br /&gt;
# the firewall. Read the help in the generator or this site:&lt;br /&gt;
# http://www.lowth.com/LinWiz/nfs_help.html&lt;br /&gt;
&lt;br /&gt;
# NFS Server - portmapper&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 111 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - statd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9400 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - NFS daemon&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 2049 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - lockd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9401 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - mountd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9402 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - quotad&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9403 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# User specified allowed TCP protocol&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 8080:8081 -j ACCEPT&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 10301:10302 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Not matched, so return so it will be logged&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -j RETURN&lt;br /&gt;
&lt;br /&gt;
# tcp_outbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is used with a private network to prevent forwarding for&lt;br /&gt;
# requests on specific protocols.  Applied to the FORWARD rule from&lt;br /&gt;
# the internal network.  Ends with an ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Block Outbound Telnet&lt;br /&gt;
$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 23 -j REJECT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# No match, so ACCEPT&lt;br /&gt;
$IPT -A tcp_outbound -p TCP -s 0/0 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# INPUT Chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Process INPUT chain ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Allow all on localhost interface&lt;br /&gt;
$IPT -A INPUT -p ALL -i $LO_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Drop bad packets&lt;br /&gt;
$IPT -A INPUT -p ALL -j bad_packets&lt;br /&gt;
&lt;br /&gt;
# DOCSIS compliant cable modems&lt;br /&gt;
# Some DOCSIS compliant cable modems send IGMP multicasts to find&lt;br /&gt;
# connected PCs.  The multicast packets have the destination address&lt;br /&gt;
# 224.0.0.1.  You can accept them.  If you choose to do so,&lt;br /&gt;
# Uncomment the rule to ACCEPT them and comment the rule to DROP&lt;br /&gt;
# them  The firewall will drop them here by default to avoid&lt;br /&gt;
# cluttering the log.  The firewall will drop all multicasts&lt;br /&gt;
# to the entire subnet (224.0.0.1) by default.  To only affect&lt;br /&gt;
# IGMP multicasts, change '-p ALL' to '-p 2'.  Of course,&lt;br /&gt;
# if they aren't accepted elsewhere, it will only ensure that&lt;br /&gt;
# multicasts on other protocols are logged.&lt;br /&gt;
# Drop them without logging.&lt;br /&gt;
$IPT -A INPUT -p ALL -d 224.0.0.1 -j DROP&lt;br /&gt;
# The rule to accept the packets.&lt;br /&gt;
# $IPT -A INPUT -p ALL -d 224.0.0.1 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Rules for the private network (accessing gateway system itself)&lt;br /&gt;
$IPT -A INPUT -p ALL -i $LOCAL_IFACE -s $LOCAL_NET -j ACCEPT&lt;br /&gt;
$IPT -A INPUT -p ALL -i $LOCAL_IFACE -d $LOCAL_BCAST -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Allow DHCP client request packets inbound from internal network&lt;br /&gt;
$IPT -A INPUT -p UDP -i $LOCAL_IFACE --source-port 68 --destination-port 67 \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Inbound Internet Packet Rules&lt;br /&gt;
&lt;br /&gt;
# Accept Established Connections&lt;br /&gt;
$IPT -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Route the rest to the appropriate user chain&lt;br /&gt;
$IPT -A INPUT -p TCP -i $INET_IFACE -j tcp_inbound&lt;br /&gt;
$IPT -A INPUT -p UDP -i $INET_IFACE -j udp_inbound&lt;br /&gt;
$IPT -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets&lt;br /&gt;
&lt;br /&gt;
# Drop without logging broadcasts that get this far.&lt;br /&gt;
# Cuts down on log clutter.&lt;br /&gt;
# Comment this line if testing new rules that impact&lt;br /&gt;
# broadcast protocols.&lt;br /&gt;
$IPT -A INPUT -m pkttype --pkt-type broadcast -j DROP&lt;br /&gt;
&lt;br /&gt;
# Log packets that still don't match&lt;br /&gt;
$IPT -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;INPUT packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# FORWARD Chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Process FORWARD chain ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Used if forwarding for a private network&lt;br /&gt;
&lt;br /&gt;
# Drop bad packets&lt;br /&gt;
$IPT -A FORWARD -p ALL -j bad_packets&lt;br /&gt;
&lt;br /&gt;
# Accept TCP packets we want to forward from internal sources&lt;br /&gt;
$IPT -A FORWARD -p tcp -i $LOCAL_IFACE -j tcp_outbound&lt;br /&gt;
&lt;br /&gt;
# Accept UDP packets we want to forward from internal sources&lt;br /&gt;
$IPT -A FORWARD -p udp -i $LOCAL_IFACE -j udp_outbound&lt;br /&gt;
&lt;br /&gt;
# If not blocked, accept any other packets from the internal interface&lt;br /&gt;
$IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Deal with responses from the internet&lt;br /&gt;
$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Port Forwarding is enabled, so accept forwarded traffic&lt;br /&gt;
$IPT -A FORWARD -p tcp -i $INET_IFACE --destination-port 80 \&lt;br /&gt;
     --destination 191.168.3.2 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# Log packets that still don't match&lt;br /&gt;
$IPT -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;FORWARD packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# OUTPUT Chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Process OUTPUT chain ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Generally trust the firewall on output&lt;br /&gt;
&lt;br /&gt;
# However, invalid icmp packets need to be dropped&lt;br /&gt;
# to prevent a possible exploit.&lt;br /&gt;
$IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP&lt;br /&gt;
&lt;br /&gt;
# Localhost&lt;br /&gt;
$IPT -A OUTPUT -p ALL -s $LO_IP -j ACCEPT&lt;br /&gt;
$IPT -A OUTPUT -p ALL -o $LO_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# To internal network&lt;br /&gt;
$IPT -A OUTPUT -p ALL -s $LOCAL_IP -j ACCEPT&lt;br /&gt;
$IPT -A OUTPUT -p ALL -o $LOCAL_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# To internet&lt;br /&gt;
$IPT -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Log packets that still don't match&lt;br /&gt;
$IPT -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;OUTPUT packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# nat table&lt;br /&gt;
#&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# The nat table is where network address translation occurs if there&lt;br /&gt;
# is a private network.  If the gateway is connected to the Internet&lt;br /&gt;
# with a static IP, snat is used.  If the gateway has a dynamic address,&lt;br /&gt;
# masquerade must be used instead.  There is more overhead associated&lt;br /&gt;
# with masquerade, so snat is better when it can be used.&lt;br /&gt;
# The nat table has a builtin chain, PREROUTING, for dnat and redirects.&lt;br /&gt;
# Another, POSTROUTING, handles snat and masquerade.&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Load rules for nat table ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# PREROUTING chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# Port Forwarding&lt;br /&gt;
# &lt;br /&gt;
# Port forwarding forwards all traffic on a port or ports from&lt;br /&gt;
# the firewall to a computer on the internal LAN.  This can&lt;br /&gt;
# be required to support special situations.  For instance,&lt;br /&gt;
# this is the only way to support file transfers with an ICQ&lt;br /&gt;
# client on an internal computer.  It's also required if an internal&lt;br /&gt;
# system hosts a service such as a web server.  However, it's also&lt;br /&gt;
# a dangerous option.  It allows Internet computers access to&lt;br /&gt;
# your internal network.  Use it carefully and only if you're&lt;br /&gt;
# certain you know what you're doing.&lt;br /&gt;
&lt;br /&gt;
$IPT -t nat -A PREROUTING -p tcp -i $INET_IFACE --destination-port 10380 \&lt;br /&gt;
     -j DNAT --to-destination 191.168.3.2:80&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# POSTROUTING chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
$IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# mangle table&lt;br /&gt;
#&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# The mangle table is used to alter packets.  It can alter or mangle them in&lt;br /&gt;
# several ways.  For the purposes of this generator, we only use its ability&lt;br /&gt;
# to alter the TTL in packets.  However, it can be used to set netfilter&lt;br /&gt;
# mark values on specific packets.  Those marks could then be used in another&lt;br /&gt;
# table like filter, to limit activities associated with a specific host, for&lt;br /&gt;
# instance.  The TOS target can be used to set the Type of Service field in&lt;br /&gt;
# the IP header.  Note that the TTL target might not be included in the&lt;br /&gt;
# distribution on your system.  If it is not and you require it, you will&lt;br /&gt;
# have to add it.  That may require that you build from source.&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Load rules for mangle table ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Set the TTL in outbound packets to the same consistent value.&lt;br /&gt;
# A value around 128 is a good value.  Do not set this too high as&lt;br /&gt;
# it will adversely affect your network.  It is also considered bad&lt;br /&gt;
# form on the Internet.&lt;br /&gt;
$IPT -t mangle -A OUTPUT -o $INET_IFACE -j TTL --ttl-set 128&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Faccio notare le due principali regole che abilitano &amp;quot;l'attraversamento&amp;quot; della rete (la navigazione, se possibile ovviamente, perche` il sistema a cui sto` lavorando non lo prevedera` visto che non intendo collegare la porta di rete 'eth0' da nessuna parte, anche se rimarra` disponibile e predisposta):&lt;br /&gt;
; echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
: Chiamato generalmente &amp;quot;forward&amp;quot;, serve per ritrasmettere i pacchetti che devono attraversare/passare dalla rete locale ad un'altra&lt;br /&gt;
; $IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE&lt;br /&gt;
: Chiamato generalemnte &amp;quot;masquerade&amp;quot;, funziona da mascheramento degli indirizzi della rete locale verso le altre.&lt;br /&gt;
&lt;br /&gt;
== Riavvio ==&lt;br /&gt;
&lt;br /&gt;
; Importante&lt;br /&gt;
: ''Sconsiglio la modalita` di esecuzione dello script iptables come qua descritta, solo perche` non essendo in linea (o congruente, come dir si voglia) con gli altri script di avvio genera poi errori (solo a video) quando si installano e rimuovo altri pacchetti software.''&lt;br /&gt;
: ''Suggerirei di posizionarlo in una directory differente, per esempio &amp;quot;/etc/myscripts/&amp;quot; ed avviarlo da &amp;quot;/etc/rc.local&amp;quot;'' (nda: Aggiungere link all'esempio che sara` in un nuovo 'progetto').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Be`, le modifiche sono state tante, avrei potuto riavviare tutti i servizi, ma ho optato per riavviare il Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
=== Versione wheezy ===&lt;br /&gt;
&lt;br /&gt;
Prima di riavviare ho installato il mio gestore di &amp;quot;init&amp;quot; preferito, per avviare &amp;quot;iptables&amp;quot; all'avvio del sistema:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo aptitude install sysv-rc-conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avete letto fra le descrizioni all'inizio del file che abbiamo generato vero ? Funziona con i comandi &amp;quot;start&amp;quot; e &amp;quot;stop&amp;quot;, ma se provate ad utilizzare il comando ora &amp;quot;iptables&amp;quot; non comparira` fra i servizi, quindi riavviamo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo reboot;exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Autentichiamoci, eseguiamo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sysv-rc-conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
e attiviamo &amp;quot;iptables&amp;quot; al &amp;quot;runlevel 2&amp;quot;, come da immagine (ci si sposta coi tasti freccia ed al punto desiderato si preme la barra spaziatrice, per uscire il tasto &amp;quot;q&amp;quot;):&lt;br /&gt;
[[File:sysv-rc-conf_iptables.png]]&lt;br /&gt;
&lt;br /&gt;
Ancora non era in avvio, dai prossimi riavii lo sara, ma ora dobbiamo avviarlo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo service iptables start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Versione jessie ===&lt;br /&gt;
&lt;br /&gt;
Ho modificato il firewall &amp;quot;/etc/init.d/iptables&amp;quot;, aggiungendo all'inizio del file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          iptables&lt;br /&gt;
# Required-Start:    $hostapd&lt;br /&gt;
# Required-Stop:&lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:&lt;br /&gt;
# Short-Description: Run iptables firewall /etc/init.d/iptables if it exist&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:''Ho scelto di avviarlo dopo &amp;quot;hostapd&amp;quot; perche` questo firewall l'ho usato per la &amp;quot;wlan&amp;quot;, credo che funzioni ugualmente se specificato &amp;quot;network&amp;quot;.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Poi ho dato i comandi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl status iptables&lt;br /&gt;
sudo systemctl enable iptables&lt;br /&gt;
sudo update-rc.d iptables defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Versione &amp;quot;buster&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl status iptables&lt;br /&gt;
sudo systemctl enable iptables&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... e ho riavviato.&lt;br /&gt;
&lt;br /&gt;
Per testare che sia in funzione, potete usare il comando:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo iptables --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test finale ==&lt;br /&gt;
&lt;br /&gt;
''Non resta che provare il collegamento da un client, mi raccomando di inserire il SSID e la Passphrase, quelle che avete utilizzato nella configurazione di &amp;quot;hostapd&amp;quot;.&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
== Problemi e FAQ ==&lt;br /&gt;
&lt;br /&gt;
;Hostapd non si avvia:&lt;br /&gt;
:Cercare il problema eseguendo il demone da linea di comando &amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.themagpi.com/issue/issue-11/ Articolo &amp;quot;Turn your Raspberry Pi into a Wireless Pi Point&amp;quot; su rivista The MagPi nr.11 (pagina 10)]&lt;br /&gt;
* [[Raspberry PI come access point: l'esempio dell'AP usato al non-corso]]&lt;br /&gt;
* http://guide.debianizzati.org/index.php/Creare_un_Access_Point_con_Debian&lt;br /&gt;
* http://nims11.wordpress.com/2012/04/27/hostapd-the-linux-way-to-create-virtual-wifi-access-point/&lt;br /&gt;
* http://easyfwgen.morizot.net/&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi_Access_Point_WEP2&amp;diff=7362</id>
		<title>Raspberry Pi Access Point WEP2</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi_Access_Point_WEP2&amp;diff=7362"/>
		<updated>2022-02-20T18:47:57Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* hostapd */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Premessa ==&lt;br /&gt;
&lt;br /&gt;
Questo articolo potrebbe contenere inesattezze e/o dimenticanze, oltretutto e` la prima volta che uso e configuro 'hostapd' e 'dnsmasq'.&amp;lt;br /&amp;gt;&lt;br /&gt;
Si declina ogni responsabilita`.&lt;br /&gt;
&lt;br /&gt;
Nell'esempio ho utilizzato la rete &amp;quot;192.168.3.0/24&amp;quot;, cambiatela secondo le vostre neccessita`.&lt;br /&gt;
&lt;br /&gt;
; Note&lt;br /&gt;
: Tutti i comandi ed i file sono da eseguire e/o modificare come utente &amp;quot;root&amp;quot;.&lt;br /&gt;
: In alcuni ho aggiunto &amp;quot;sudo&amp;quot; davanti, ovviamente non e` necessario se gia` siete &amp;quot;root&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Installazione ==&lt;br /&gt;
&lt;br /&gt;
Terminata l'installazione base [[Raspberry_Pi-Raspbian_default_post-install|Raspbian]] (fate eventuale aggiornamento), installiamo alcuni pacchetti necessari:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;apt-get install hostapd hostap-utils dnsmasq&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; iw&lt;br /&gt;
: nell'ultima release di [[Raspbian]] e` gia` installato, l'ho usato per controllare che la chiave usb wifi fosse AP compatibile (comando: &amp;quot;iw list&amp;quot;, poi andate a leggere il report se compare la scritta AP)&lt;br /&gt;
&lt;br /&gt;
== Configurazione ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
&lt;br /&gt;
Per prima cosa ho modificato il file &amp;quot;/etc/network/interfaces&amp;quot; aggiungendo la configurazione per la periferica 'wlan0' (normalmente e` cosi` che viene vista la chiave usb wifi):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# interfaces(5) file used by ifup(8) and ifdown(8)&lt;br /&gt;
&lt;br /&gt;
# Please note that this file is written to be used with dhcpcd&lt;br /&gt;
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'&lt;br /&gt;
&lt;br /&gt;
# Include files from /etc/network/interfaces.d:&lt;br /&gt;
source-directory /etc/network/interfaces.d&lt;br /&gt;
&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
auto eth0&lt;br /&gt;
allow-hotplug eth0&lt;br /&gt;
iface eth0 inet dhcp&lt;br /&gt;
&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet static&lt;br /&gt;
        address 192.168.3.1&lt;br /&gt;
        netmask 255.255.255.0&lt;br /&gt;
        hostapd /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== hostapd ===&lt;br /&gt;
&lt;br /&gt;
Letto &amp;quot;/usr/share/doc/hostapd/README.Debian&amp;quot;, procediamo come indicato, generandoci dall'esempio il file &amp;quot;/etc/hostapd/hostapd.conf&amp;quot;, per ragioni di permessi ho trovato qualche difficolta` ad eseguire il comando cosi` come scritto, questi dovrebbero funzionare:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
zcat /usr/share/doc/hostapd/examples/hostapd.conf.gz &amp;gt; /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Versione &amp;quot;bullseye&amp;quot;'''&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp /usr/share/doc/hostapd/examples/hostapd.conf /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per 'sicurezza' ho anche messo il file leggibile/scrivibile solo da 'root'&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo chmod 600 /etc/hostapd/hostapd.conf&lt;br /&gt;
sudo chown root:root /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ora correggiamo la configurazione secondo le nostre esigenze, modifichiamo &amp;quot;/etc/hostapd/hostapd.conf&amp;quot; (indichero` solo le righe che ho modificato, le altre sono state lasciate inalterate):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
ssid=&amp;lt;MetteteUnNomePerLaReteWifi&amp;gt;&lt;br /&gt;
wpa=2&lt;br /&gt;
wpa_passphrase=&amp;lt;MetteteLaVostra&amp;gt;&lt;br /&gt;
wpa_key_mgmt=WPA-PSK&lt;br /&gt;
rsn_pairwise=CCMP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dnsmasq ===&lt;br /&gt;
&lt;br /&gt;
Il procedimento e` lo stesso usato per la configurazione 'hostapd', utilizzo dell'esempio e modifiche del caso.&lt;br /&gt;
Correggiamo la configurazione secondo le nostre esigenze, modifichiamo &amp;quot;/etc/dnsmasq.conf&amp;quot; (indichero` solo le righe che ho modificato, le altre sono state lasciate inalterate):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
domain-needed&lt;br /&gt;
bogus-priv&lt;br /&gt;
interface=wlan0&lt;br /&gt;
dhcp-range=192.168.3.2,192.168.3.5,12h&lt;br /&gt;
dhcp-option=option:router,192.168.3.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rimane solo un problema sulla risoluzione del nome macchina (hostname) di questo pc, al momento ho risolto sistemando il file &amp;quot;/etc/hosts&amp;quot; in questo modo, dove ho modificato la penultima ed aggiunto l'ultima riga (esempio reale preso da [[Centralina livello 1]]):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1       localhost&lt;br /&gt;
::1             localhost ip6-localhost ip6-loopback&lt;br /&gt;
ff02::1         ip6-allnodes&lt;br /&gt;
ff02::2         ip6-allrouters&lt;br /&gt;
&lt;br /&gt;
127.0.1.1       level1error&lt;br /&gt;
192.168.3.1     level1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Firewall (iptables) ===&lt;br /&gt;
&lt;br /&gt;
Normalmente uso un'utility online per generare la base e procedo poi al ritocco secondo le esigenze, l'indirizzo del 'generatore' e`: http://easyfwgen.morizot.net/&lt;br /&gt;
&lt;br /&gt;
Questa e` la configurazione impostata, modificatela secondo le vostre esigenze, considerate sempre di NON usare e/o attivare opzioni che non conoscete e/o sapete a cosa servono. Da Notare che sono stati predisposti servizi che al momento non sono utilizzati, se pensate di non averne bisogno, disattivateli.&lt;br /&gt;
&lt;br /&gt;
(Per migliorarne la lettura ho realizzato diverse schermate, che messe in ordine somigliano alla pagina web che vi troverete ad impostare).&lt;br /&gt;
&lt;br /&gt;
[[File:Easy_Firewall_Generator_for_iptables.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Easy_Firewall_Generator_for_iptables_2.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Easy_Firewall_Generator_for_iptables_3.png]]&lt;br /&gt;
&lt;br /&gt;
Create la vostra configurazione e salvatela in un file chiamato &amp;quot;/etc/init.d/iptables&amp;quot;, cambiate poi i permessi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo chmod 755 /etc/init.d/iptables&lt;br /&gt;
sudo chown root:root /etc/init.d/iptables&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Questa e` quella che ho predisposto, attivando anche servizi come &amp;quot;http&amp;quot; ed &amp;quot;ftp&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# Generated iptables firewall script for the Linux 2.4 kernel&lt;br /&gt;
# Script generated by Easy Firewall Generator for IPTables 1.15&lt;br /&gt;
# copyright 2002 Timothy Scott Morizot&lt;br /&gt;
# &lt;br /&gt;
# Redhat chkconfig comments - firewall applied early,&lt;br /&gt;
#                             removed late&lt;br /&gt;
# chkconfig: 2345 08 92&lt;br /&gt;
# description: This script applies or removes iptables firewall rules&lt;br /&gt;
# &lt;br /&gt;
# This generator is primarily designed for RedHat installations,&lt;br /&gt;
# although it should be adaptable for others.&lt;br /&gt;
#&lt;br /&gt;
# It can be executed with the typical start and stop arguments.&lt;br /&gt;
# If used with stop, it will stop after flushing the firewall.&lt;br /&gt;
# The save and restore arguments will save or restore the rules&lt;br /&gt;
# from the /etc/sysconfig/iptables file.  The save and restore&lt;br /&gt;
# arguments are included to preserve compatibility with&lt;br /&gt;
# Redhat's or Fedora's init.d script if you prefer to use it.&lt;br /&gt;
&lt;br /&gt;
# Redhat/Fedora installation instructions&lt;br /&gt;
#&lt;br /&gt;
# 1. Have the system link the iptables init.d startup script into run states&lt;br /&gt;
#    2, 3, and 5.&lt;br /&gt;
#    chkconfig --level 235 iptables on&lt;br /&gt;
#&lt;br /&gt;
# 2. Save this script and execute it to load the ruleset from this file.&lt;br /&gt;
#    You may need to run the dos2unix command on it to remove carraige returns.&lt;br /&gt;
#&lt;br /&gt;
# 3. To have it applied at startup, copy this script to&lt;br /&gt;
#    /etc/init.d/iptables.  It accepts stop, start, save, and restore&lt;br /&gt;
#    arguments.  (You may wish to save the existing one first.)&lt;br /&gt;
#    Alternatively, if you issue the 'service iptables save' command&lt;br /&gt;
#    the init.d script should save the rules and reload them at runtime.&lt;br /&gt;
#&lt;br /&gt;
# 4. For non-Redhat systems (or Redhat systems if you have a problem), you&lt;br /&gt;
#    may want to append the command to execute this script to rc.local.&lt;br /&gt;
#    rc.local is typically located in /etc and /etc/rc.d and is usually&lt;br /&gt;
#    the last thing executed on startup.  Simply add /path/to/script/script_name&lt;br /&gt;
#    on its own line in the rc.local file.&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# &lt;br /&gt;
# Local Settings&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# sysctl location.  If set, it will use sysctl to adjust the kernel parameters.&lt;br /&gt;
# If this is set to the empty string (or is unset), the use of sysctl&lt;br /&gt;
# is disabled.&lt;br /&gt;
&lt;br /&gt;
SYSCTL=&amp;quot;/sbin/sysctl -w&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# To echo the value directly to the /proc file instead&lt;br /&gt;
# SYSCTL=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# IPTables Location - adjust if needed&lt;br /&gt;
&lt;br /&gt;
IPT=&amp;quot;/sbin/iptables&amp;quot;&lt;br /&gt;
IPTS=&amp;quot;/sbin/iptables-save&amp;quot;&lt;br /&gt;
IPTR=&amp;quot;/sbin/iptables-restore&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Internet Interface&lt;br /&gt;
INET_IFACE=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Local Interface Information&lt;br /&gt;
LOCAL_IFACE=&amp;quot;wlan0&amp;quot;&lt;br /&gt;
LOCAL_IP=&amp;quot;192.168.3.1&amp;quot;&lt;br /&gt;
LOCAL_NET=&amp;quot;192.168.3.0/24&amp;quot;&lt;br /&gt;
LOCAL_BCAST=&amp;quot;192.168.3.255&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Localhost Interface&lt;br /&gt;
&lt;br /&gt;
LO_IFACE=&amp;quot;lo&amp;quot;&lt;br /&gt;
LO_IP=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Save and Restore arguments handled here&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; = &amp;quot;save&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
	echo -n &amp;quot;Saving firewall to /etc/sysconfig/iptables ... &amp;quot;&lt;br /&gt;
	$IPTS &amp;gt; /etc/sysconfig/iptables&lt;br /&gt;
	echo &amp;quot;done&amp;quot;&lt;br /&gt;
	exit 0&lt;br /&gt;
elif [ &amp;quot;$1&amp;quot; = &amp;quot;restore&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
	echo -n &amp;quot;Restoring firewall from /etc/sysconfig/iptables ... &amp;quot;&lt;br /&gt;
	$IPTR &amp;lt; /etc/sysconfig/iptables&lt;br /&gt;
	echo &amp;quot;done&amp;quot;&lt;br /&gt;
	exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Load Modules&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Loading kernel modules ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# You should uncomment the line below and run it the first time just to&lt;br /&gt;
# ensure all kernel module dependencies are OK.  There is no need to run&lt;br /&gt;
# every time, however.&lt;br /&gt;
&lt;br /&gt;
# /sbin/depmod -a&lt;br /&gt;
&lt;br /&gt;
# Unless you have kernel module auto-loading disabled, you should not&lt;br /&gt;
# need to manually load each of these modules.  Other than ip_tables,&lt;br /&gt;
# ip_conntrack, and some of the optional modules, I've left these&lt;br /&gt;
# commented by default.  Uncomment if you have any problems or if&lt;br /&gt;
# you have disabled module autoload.  Note that some modules must&lt;br /&gt;
# be loaded by another kernel module.&lt;br /&gt;
&lt;br /&gt;
# core netfilter module&lt;br /&gt;
/sbin/modprobe ip_tables&lt;br /&gt;
&lt;br /&gt;
# the stateful connection tracking module&lt;br /&gt;
/sbin/modprobe ip_conntrack&lt;br /&gt;
&lt;br /&gt;
# filter table module&lt;br /&gt;
# /sbin/modprobe iptable_filter&lt;br /&gt;
&lt;br /&gt;
# mangle table module&lt;br /&gt;
# /sbin/modprobe iptable_mangle&lt;br /&gt;
&lt;br /&gt;
# nat table module&lt;br /&gt;
# /sbin/modprobe iptable_nat&lt;br /&gt;
&lt;br /&gt;
# LOG target module&lt;br /&gt;
# /sbin/modprobe ipt_LOG&lt;br /&gt;
&lt;br /&gt;
# This is used to limit the number of packets per sec/min/hr&lt;br /&gt;
# /sbin/modprobe ipt_limit&lt;br /&gt;
&lt;br /&gt;
# masquerade target module&lt;br /&gt;
# /sbin/modprobe ipt_MASQUERADE&lt;br /&gt;
&lt;br /&gt;
# filter using owner as part of the match&lt;br /&gt;
# /sbin/modprobe ipt_owner&lt;br /&gt;
&lt;br /&gt;
# REJECT target drops the packet and returns an ICMP response.&lt;br /&gt;
# The response is configurable.  By default, connection refused.&lt;br /&gt;
# /sbin/modprobe ipt_REJECT&lt;br /&gt;
&lt;br /&gt;
# This target allows packets to be marked in the mangle table&lt;br /&gt;
# /sbin/modprobe ipt_mark&lt;br /&gt;
&lt;br /&gt;
# This target affects the TCP MSS&lt;br /&gt;
# /sbin/modprobe ipt_tcpmss&lt;br /&gt;
&lt;br /&gt;
# This match allows multiple ports instead of a single port or range&lt;br /&gt;
# /sbin/modprobe multiport&lt;br /&gt;
&lt;br /&gt;
# This match checks against the TCP flags&lt;br /&gt;
# /sbin/modprobe ipt_state&lt;br /&gt;
&lt;br /&gt;
# This match catches packets with invalid flags&lt;br /&gt;
# /sbin/modprobe ipt_unclean&lt;br /&gt;
&lt;br /&gt;
# The ftp nat module is required for non-PASV ftp support&lt;br /&gt;
/sbin/modprobe ip_nat_ftp&lt;br /&gt;
&lt;br /&gt;
# the module for full ftp connection tracking&lt;br /&gt;
/sbin/modprobe ip_conntrack_ftp&lt;br /&gt;
&lt;br /&gt;
# the module for full irc connection tracking&lt;br /&gt;
/sbin/modprobe ip_conntrack_irc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Kernel Parameter Configuration&lt;br /&gt;
#&lt;br /&gt;
# See http://ipsysctl-tutorial.frozentux.net/chunkyhtml/index.html&lt;br /&gt;
# for a detailed tutorial on sysctl and the various settings&lt;br /&gt;
# available.&lt;br /&gt;
&lt;br /&gt;
# Required to enable IPv4 forwarding.&lt;br /&gt;
# Redhat users can try setting FORWARD_IPV4 in /etc/sysconfig/network to true&lt;br /&gt;
# Alternatively, it can be set in /etc/sysctl.conf&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.ip_forward=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This enables dynamic address hacking.&lt;br /&gt;
# This may help if you have a dynamic IP address \(e.g. slip, ppp, dhcp\).&lt;br /&gt;
#if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
#then&lt;br /&gt;
#    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/ip_dynaddr&lt;br /&gt;
#else&lt;br /&gt;
#    $SYSCTL net.ipv4.ip_dynaddr=&amp;quot;1&amp;quot;&lt;br /&gt;
#fi&lt;br /&gt;
&lt;br /&gt;
# This enables SYN flood protection.&lt;br /&gt;
# The SYN cookies activation allows your system to accept an unlimited&lt;br /&gt;
# number of TCP connections while still trying to give reasonable&lt;br /&gt;
# service during a denial of service attack.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/tcp_syncookies&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.tcp_syncookies=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This enables source validation by reversed path according to RFC1812.&lt;br /&gt;
# In other words, did the response packet originate from the same interface&lt;br /&gt;
# through which the source packet was sent?  It's recommended for single-homed&lt;br /&gt;
# systems and routers on stub networks.  Since those are the configurations&lt;br /&gt;
# this firewall is designed to support, I turn it on by default.&lt;br /&gt;
# Turn it off if you use multiple NICs connected to the same network.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/rp_filter&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.rp_filter=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option allows a subnet to be firewalled with a single IP address.&lt;br /&gt;
# It's used to build a DMZ.  Since that's not a focus of this firewall&lt;br /&gt;
# script, it's not enabled by default, but is included for reference.&lt;br /&gt;
# See: http://www.sjdjweis.com/linux/proxyarp/ &lt;br /&gt;
#if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
#then&lt;br /&gt;
#    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/proxy_arp&lt;br /&gt;
#else&lt;br /&gt;
#    $SYSCTL net.ipv4.conf.all.proxy_arp=&amp;quot;1&amp;quot;&lt;br /&gt;
#fi&lt;br /&gt;
&lt;br /&gt;
# The following kernel settings were suggested by Alex Weeks. Thanks!&lt;br /&gt;
&lt;br /&gt;
# This kernel parameter instructs the kernel to ignore all ICMP&lt;br /&gt;
# echo requests sent to the broadcast address.  This prevents&lt;br /&gt;
# a number of smurfs and similar DoS nasty attacks.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.icmp_echo_ignore_broadcasts=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option can be used to accept or refuse source routed&lt;br /&gt;
# packets.  It is usually on by default, but is generally&lt;br /&gt;
# considered a security risk.  This option turns it off.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;0&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/accept_source_route&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.accept_source_route=&amp;quot;0&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option can disable ICMP redirects.  ICMP redirects&lt;br /&gt;
# are generally considered a security risk and shouldn't be&lt;br /&gt;
# needed by most systems using this generator.&lt;br /&gt;
#if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
#then&lt;br /&gt;
#    echo &amp;quot;0&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/accept_redirects&lt;br /&gt;
#else&lt;br /&gt;
#    $SYSCTL net.ipv4.conf.all.accept_redirects=&amp;quot;0&amp;quot;&lt;br /&gt;
#fi&lt;br /&gt;
&lt;br /&gt;
# However, we'll ensure the secure_redirects option is on instead.&lt;br /&gt;
# This option accepts only from gateways in the default gateways list.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/secure_redirects&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.secure_redirects=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option logs packets from impossible addresses.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/log_martians&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.log_martians=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Flush Any Existing Rules or Chains&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Flushing Tables ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Reset Default Policies&lt;br /&gt;
$IPT -P INPUT ACCEPT&lt;br /&gt;
$IPT -P FORWARD ACCEPT&lt;br /&gt;
$IPT -P OUTPUT ACCEPT&lt;br /&gt;
$IPT -t nat -P PREROUTING ACCEPT&lt;br /&gt;
$IPT -t nat -P POSTROUTING ACCEPT&lt;br /&gt;
$IPT -t nat -P OUTPUT ACCEPT&lt;br /&gt;
$IPT -t mangle -P PREROUTING ACCEPT&lt;br /&gt;
$IPT -t mangle -P OUTPUT ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Flush all rules&lt;br /&gt;
$IPT -F&lt;br /&gt;
$IPT -t nat -F&lt;br /&gt;
$IPT -t mangle -F&lt;br /&gt;
&lt;br /&gt;
# Erase all non-default chains&lt;br /&gt;
$IPT -X&lt;br /&gt;
$IPT -t nat -X&lt;br /&gt;
$IPT -t mangle -X&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; = &amp;quot;stop&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;Firewall completely flushed!  Now running with no firewall.&amp;quot;&lt;br /&gt;
	exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Rules Configuration&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Filter Table&lt;br /&gt;
#&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Set Policies&lt;br /&gt;
&lt;br /&gt;
$IPT -P INPUT DROP&lt;br /&gt;
$IPT -P OUTPUT DROP&lt;br /&gt;
$IPT -P FORWARD DROP&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# User-Specified Chains&lt;br /&gt;
#&lt;br /&gt;
# Create user chains to reduce the number of rules each packet&lt;br /&gt;
# must traverse.&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Create and populate custom rule chains ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Create a chain to filter INVALID packets&lt;br /&gt;
&lt;br /&gt;
$IPT -N bad_packets&lt;br /&gt;
&lt;br /&gt;
# Create another chain to filter bad tcp packets&lt;br /&gt;
&lt;br /&gt;
$IPT -N bad_tcp_packets&lt;br /&gt;
&lt;br /&gt;
# Create separate chains for icmp, tcp (incoming and outgoing),&lt;br /&gt;
# and incoming udp packets.&lt;br /&gt;
&lt;br /&gt;
$IPT -N icmp_packets&lt;br /&gt;
&lt;br /&gt;
# Used for UDP packets inbound from the Internet&lt;br /&gt;
$IPT -N udp_inbound&lt;br /&gt;
&lt;br /&gt;
# Used to block outbound UDP services from internal network&lt;br /&gt;
# Default to allow all&lt;br /&gt;
$IPT -N udp_outbound&lt;br /&gt;
&lt;br /&gt;
# Used to allow inbound services if desired&lt;br /&gt;
# Default fail except for established sessions&lt;br /&gt;
$IPT -N tcp_inbound&lt;br /&gt;
&lt;br /&gt;
# Used to block outbound services from internal network&lt;br /&gt;
# Default to allow all&lt;br /&gt;
$IPT -N tcp_outbound&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Populate User Chains&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# bad_packets chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# Drop packets received on the external interface&lt;br /&gt;
# claiming a source of the local network&lt;br /&gt;
$IPT -A bad_packets -p ALL -i $INET_IFACE -s $LOCAL_NET -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Illegal source: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_packets -p ALL -i $INET_IFACE -s $LOCAL_NET -j DROP&lt;br /&gt;
&lt;br /&gt;
# Drop INVALID packets immediately&lt;br /&gt;
$IPT -A bad_packets -p ALL -m state --state INVALID -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Invalid packet: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_packets -p ALL -m state --state INVALID -j DROP&lt;br /&gt;
&lt;br /&gt;
# Then check the tcp packets for additional problems&lt;br /&gt;
$IPT -A bad_packets -p tcp -j bad_tcp_packets&lt;br /&gt;
&lt;br /&gt;
# All good, so return&lt;br /&gt;
$IPT -A bad_packets -p ALL -j RETURN&lt;br /&gt;
&lt;br /&gt;
# bad_tcp_packets chain&lt;br /&gt;
#&lt;br /&gt;
# All tcp packets will traverse this chain.&lt;br /&gt;
# Every new connection attempt should begin with&lt;br /&gt;
# a syn packet.  If it doesn't, it is likely a&lt;br /&gt;
# port scan.  This drops packets in state&lt;br /&gt;
# NEW that are not flagged as syn packets.&lt;br /&gt;
&lt;br /&gt;
# Return to the calling chain if the bad packets originate&lt;br /&gt;
# from the local interface. This maintains the approach&lt;br /&gt;
# throughout this firewall of a largely trusted internal&lt;br /&gt;
# network.&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp -i $LOCAL_IFACE -j RETURN&lt;br /&gt;
&lt;br /&gt;
# However, I originally did apply this filter to the forward chain&lt;br /&gt;
# for packets originating from the internal network.  While I have&lt;br /&gt;
# not conclusively determined its effect, it appears to have the&lt;br /&gt;
# interesting side effect of blocking some of the ad systems.&lt;br /&gt;
# Apparently some ad systems have the browser initiate a NEW&lt;br /&gt;
# connection that is not flagged as a syn packet to retrieve&lt;br /&gt;
# the ad image.  If you wish to experiment further comment the&lt;br /&gt;
# rule above. If you try it, you may also wish to uncomment the&lt;br /&gt;
# rule below.  It will keep those packets from being logged.&lt;br /&gt;
# There are a lot of them.&lt;br /&gt;
# $IPT -A bad_tcp_packets -p tcp -i $LOCAL_IFACE ! --syn -m state \&lt;br /&gt;
#     --state NEW -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;New not syn: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP&lt;br /&gt;
&lt;br /&gt;
# All good, so return&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp -j RETURN&lt;br /&gt;
&lt;br /&gt;
# icmp_packets chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is for inbound (from the Internet) icmp packets only.&lt;br /&gt;
# Type 8 (Echo Request) is not accepted by default&lt;br /&gt;
# Enable it if you want remote hosts to be able to reach you.&lt;br /&gt;
# 11 (Time Exceeded) is the only one accepted&lt;br /&gt;
# that would not already be covered by the established&lt;br /&gt;
# connection rule.  Applied to INPUT on the external interface.&lt;br /&gt;
# &lt;br /&gt;
# See: http://www.ee.siue.edu/~rwalden/networking/icmp.html&lt;br /&gt;
# for more info on ICMP types.&lt;br /&gt;
#&lt;br /&gt;
# Note that the stateful settings allow replies to ICMP packets.&lt;br /&gt;
# These rules allow new packets of the specified types.&lt;br /&gt;
&lt;br /&gt;
# ICMP packets should fit in a Layer 2 frame, thus they should&lt;br /&gt;
# never be fragmented.  Fragmented ICMP packets are a typical sign&lt;br /&gt;
# of a denial of service attack.&lt;br /&gt;
$IPT -A icmp_packets --fragment -p ICMP -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;ICMP Fragment: &amp;quot;&lt;br /&gt;
$IPT -A icmp_packets --fragment -p ICMP -j DROP&lt;br /&gt;
&lt;br /&gt;
# Echo - uncomment to allow your system to be pinged.&lt;br /&gt;
# Uncomment the LOG command if you also want to log PING attempts&lt;br /&gt;
# &lt;br /&gt;
# $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j LOG \&lt;br /&gt;
#    --log-prefix &amp;quot;Ping detected: &amp;quot;&lt;br /&gt;
# $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# By default, however, drop pings without logging. Blaster&lt;br /&gt;
# and other worms have infected systems blasting pings.&lt;br /&gt;
# Comment the line below if you want pings logged, but it&lt;br /&gt;
# will likely fill your logs.&lt;br /&gt;
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j DROP&lt;br /&gt;
&lt;br /&gt;
# Time Exceeded&lt;br /&gt;
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Not matched, so return so it will be logged&lt;br /&gt;
$IPT -A icmp_packets -p ICMP -j RETURN&lt;br /&gt;
&lt;br /&gt;
# TCP &amp;amp; UDP&lt;br /&gt;
# Identify ports at:&lt;br /&gt;
#    http://www.chebucto.ns.ca/~rakerman/port-table.html&lt;br /&gt;
#    http://www.iana.org/assignments/port-numbers&lt;br /&gt;
&lt;br /&gt;
# udp_inbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain describes the inbound UDP packets it will accept.&lt;br /&gt;
# It's applied to INPUT on the external or Internet interface.&lt;br /&gt;
# Note that the stateful settings allow replies.&lt;br /&gt;
# These rules are for new requests.&lt;br /&gt;
# It drops netbios packets (windows) immediately without logging.&lt;br /&gt;
&lt;br /&gt;
# Drop netbios calls&lt;br /&gt;
# Please note that these rules do not really change the way the firewall&lt;br /&gt;
# treats netbios connections.  Connections from the localhost and&lt;br /&gt;
# internal interface (if one exists) are accepted by default.&lt;br /&gt;
# Responses from the Internet to requests initiated by or through&lt;br /&gt;
# the firewall are also accepted by default.  To get here, the&lt;br /&gt;
# packets would have to be part of a new request received by the&lt;br /&gt;
# Internet interface.  You would have to manually add rules to&lt;br /&gt;
# accept these.  I added these rules because some network connections,&lt;br /&gt;
# such as those via cable modems, tend to be filled with noise from&lt;br /&gt;
# unprotected Windows machines.  These rules drop those packets&lt;br /&gt;
# quickly and without logging them.  This prevents them from traversing&lt;br /&gt;
# the whole chain and keeps the log from getting cluttered with&lt;br /&gt;
# chatter from Windows systems.&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 137 -j DROP&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 138 -j DROP&lt;br /&gt;
&lt;br /&gt;
# Network Time Protocol (NTP) Server&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 123 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# DNS Server&lt;br /&gt;
# Configure the server to use port 53 as the source port for requests&lt;br /&gt;
# Note, if you run a caching-only name server that only accepts queries&lt;br /&gt;
# from the private network or localhost, you can comment out this line.&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 53 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# If you don't query-source the server to port 53 and you have problems,&lt;br /&gt;
# uncomment this rule.  It specifically allows responses to queries&lt;br /&gt;
# initiated to another server from a high UDP port.  The stateful&lt;br /&gt;
# connection rules should handle this situation, though.&lt;br /&gt;
# $IPT -A udp_inbound -p UDP -s 0/0 --source-port 53 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Dynamic Address&lt;br /&gt;
# If DHCP, the initial request is a broadcast. The response&lt;br /&gt;
# doesn't exactly match the outbound packet.  This explicitly&lt;br /&gt;
# allow the DHCP ports to alleviate this problem.&lt;br /&gt;
# If you receive your dynamic address by a different means, you&lt;br /&gt;
# can probably comment this line.&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --source-port 67 --destination-port 68 \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Network File System (NFS) Server&lt;br /&gt;
# Please note that additional services must&lt;br /&gt;
# be configured in order to support an NFS Server through&lt;br /&gt;
# the firewall. Read the help in the generator or this site:&lt;br /&gt;
# http://www.lowth.com/LinWiz/nfs_help.html&lt;br /&gt;
&lt;br /&gt;
# NFS Server - portmapper&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 111 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - statd&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9400 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - NFS daemon&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 2049 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - lockd&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9401 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - mountd&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9402 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - quotad&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9403 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Not matched, so return for logging&lt;br /&gt;
$IPT -A udp_inbound -p UDP -j RETURN&lt;br /&gt;
&lt;br /&gt;
# udp_outbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is used with a private network to prevent forwarding for&lt;br /&gt;
# UDP requests on specific protocols.  Applied to the FORWARD rule from&lt;br /&gt;
# the internal network.  Ends with an ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# No match, so ACCEPT&lt;br /&gt;
$IPT -A udp_outbound -p UDP -s 0/0 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# tcp_inbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is used to allow inbound connections to the&lt;br /&gt;
# system/gateway.  Use with care.  It defaults to none.&lt;br /&gt;
# It's applied on INPUT from the external or Internet interface.&lt;br /&gt;
&lt;br /&gt;
# DNS Server - Allow TCP connections (zone transfers and large requests)&lt;br /&gt;
# This is disabled by default.  DNS Zone transfers occur via TCP.&lt;br /&gt;
# If you need to allow transfers over the net you need to uncomment this line.&lt;br /&gt;
# If you allow queries from the 'net, you also need to be aware that although&lt;br /&gt;
# DNS queries use UDP by default, a truncated UDP query can legally be&lt;br /&gt;
# submitted via TCP instead.  You probably will never need it, but should&lt;br /&gt;
# be aware of the fact.&lt;br /&gt;
# $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 53 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Web Server&lt;br /&gt;
&lt;br /&gt;
# HTTP&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 80 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# HTTPS (Secure Web Server)&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 443 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# FTP Server (Control)&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 21 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# FTP Client (Data Port for non-PASV transfers)&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --source-port 20 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Passive FTP&lt;br /&gt;
# &lt;br /&gt;
# With passive FTP, the server provides a port to the client&lt;br /&gt;
# and allows the client to initiate the connection rather&lt;br /&gt;
# than initiating the connection with the client from the data port.&lt;br /&gt;
# Web browsers and clients operating behind a firewall generally&lt;br /&gt;
# use passive ftp transfers.  A general purpose FTP server&lt;br /&gt;
# will need to support them.&lt;br /&gt;
# &lt;br /&gt;
# However, by default an FTP server will select a port from the entire&lt;br /&gt;
# range of high ports.  It is not particularly safe to open all&lt;br /&gt;
# high ports.  Fortunately, that range can be restricted.  This&lt;br /&gt;
# firewall presumes that the range has been restricted to a specific&lt;br /&gt;
# selected range.  That range must also be configured in the ftp server.&lt;br /&gt;
# &lt;br /&gt;
# Instructions for specifying the port range for the wu-ftpd server&lt;br /&gt;
# can be found here:&lt;br /&gt;
# http://www.wu-ftpd.org/man/ftpaccess.html&lt;br /&gt;
# (See the passive ports option.)&lt;br /&gt;
# &lt;br /&gt;
# Instructions for the ProFTPD server can be found here:&lt;br /&gt;
# http://proftpd.linux.co.uk/localsite/Userguide/linked/x861.html&lt;br /&gt;
&lt;br /&gt;
# Sample Rule&lt;br /&gt;
# $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 62000:64000 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# sshd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Network File System (NFS) Server&lt;br /&gt;
# Please note that additional services must&lt;br /&gt;
# be configured in order to support an NFS Server through&lt;br /&gt;
# the firewall. Read the help in the generator or this site:&lt;br /&gt;
# http://www.lowth.com/LinWiz/nfs_help.html&lt;br /&gt;
&lt;br /&gt;
# NFS Server - portmapper&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 111 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - statd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9400 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - NFS daemon&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 2049 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - lockd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9401 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - mountd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9402 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - quotad&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9403 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# User specified allowed TCP protocol&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 8080:8081 -j ACCEPT&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 10301:10302 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Not matched, so return so it will be logged&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -j RETURN&lt;br /&gt;
&lt;br /&gt;
# tcp_outbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is used with a private network to prevent forwarding for&lt;br /&gt;
# requests on specific protocols.  Applied to the FORWARD rule from&lt;br /&gt;
# the internal network.  Ends with an ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Block Outbound Telnet&lt;br /&gt;
$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 23 -j REJECT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# No match, so ACCEPT&lt;br /&gt;
$IPT -A tcp_outbound -p TCP -s 0/0 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# INPUT Chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Process INPUT chain ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Allow all on localhost interface&lt;br /&gt;
$IPT -A INPUT -p ALL -i $LO_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Drop bad packets&lt;br /&gt;
$IPT -A INPUT -p ALL -j bad_packets&lt;br /&gt;
&lt;br /&gt;
# DOCSIS compliant cable modems&lt;br /&gt;
# Some DOCSIS compliant cable modems send IGMP multicasts to find&lt;br /&gt;
# connected PCs.  The multicast packets have the destination address&lt;br /&gt;
# 224.0.0.1.  You can accept them.  If you choose to do so,&lt;br /&gt;
# Uncomment the rule to ACCEPT them and comment the rule to DROP&lt;br /&gt;
# them  The firewall will drop them here by default to avoid&lt;br /&gt;
# cluttering the log.  The firewall will drop all multicasts&lt;br /&gt;
# to the entire subnet (224.0.0.1) by default.  To only affect&lt;br /&gt;
# IGMP multicasts, change '-p ALL' to '-p 2'.  Of course,&lt;br /&gt;
# if they aren't accepted elsewhere, it will only ensure that&lt;br /&gt;
# multicasts on other protocols are logged.&lt;br /&gt;
# Drop them without logging.&lt;br /&gt;
$IPT -A INPUT -p ALL -d 224.0.0.1 -j DROP&lt;br /&gt;
# The rule to accept the packets.&lt;br /&gt;
# $IPT -A INPUT -p ALL -d 224.0.0.1 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Rules for the private network (accessing gateway system itself)&lt;br /&gt;
$IPT -A INPUT -p ALL -i $LOCAL_IFACE -s $LOCAL_NET -j ACCEPT&lt;br /&gt;
$IPT -A INPUT -p ALL -i $LOCAL_IFACE -d $LOCAL_BCAST -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Allow DHCP client request packets inbound from internal network&lt;br /&gt;
$IPT -A INPUT -p UDP -i $LOCAL_IFACE --source-port 68 --destination-port 67 \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Inbound Internet Packet Rules&lt;br /&gt;
&lt;br /&gt;
# Accept Established Connections&lt;br /&gt;
$IPT -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Route the rest to the appropriate user chain&lt;br /&gt;
$IPT -A INPUT -p TCP -i $INET_IFACE -j tcp_inbound&lt;br /&gt;
$IPT -A INPUT -p UDP -i $INET_IFACE -j udp_inbound&lt;br /&gt;
$IPT -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets&lt;br /&gt;
&lt;br /&gt;
# Drop without logging broadcasts that get this far.&lt;br /&gt;
# Cuts down on log clutter.&lt;br /&gt;
# Comment this line if testing new rules that impact&lt;br /&gt;
# broadcast protocols.&lt;br /&gt;
$IPT -A INPUT -m pkttype --pkt-type broadcast -j DROP&lt;br /&gt;
&lt;br /&gt;
# Log packets that still don't match&lt;br /&gt;
$IPT -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;INPUT packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# FORWARD Chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Process FORWARD chain ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Used if forwarding for a private network&lt;br /&gt;
&lt;br /&gt;
# Drop bad packets&lt;br /&gt;
$IPT -A FORWARD -p ALL -j bad_packets&lt;br /&gt;
&lt;br /&gt;
# Accept TCP packets we want to forward from internal sources&lt;br /&gt;
$IPT -A FORWARD -p tcp -i $LOCAL_IFACE -j tcp_outbound&lt;br /&gt;
&lt;br /&gt;
# Accept UDP packets we want to forward from internal sources&lt;br /&gt;
$IPT -A FORWARD -p udp -i $LOCAL_IFACE -j udp_outbound&lt;br /&gt;
&lt;br /&gt;
# If not blocked, accept any other packets from the internal interface&lt;br /&gt;
$IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Deal with responses from the internet&lt;br /&gt;
$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Port Forwarding is enabled, so accept forwarded traffic&lt;br /&gt;
$IPT -A FORWARD -p tcp -i $INET_IFACE --destination-port 80 \&lt;br /&gt;
     --destination 191.168.3.2 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# Log packets that still don't match&lt;br /&gt;
$IPT -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;FORWARD packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# OUTPUT Chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Process OUTPUT chain ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Generally trust the firewall on output&lt;br /&gt;
&lt;br /&gt;
# However, invalid icmp packets need to be dropped&lt;br /&gt;
# to prevent a possible exploit.&lt;br /&gt;
$IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP&lt;br /&gt;
&lt;br /&gt;
# Localhost&lt;br /&gt;
$IPT -A OUTPUT -p ALL -s $LO_IP -j ACCEPT&lt;br /&gt;
$IPT -A OUTPUT -p ALL -o $LO_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# To internal network&lt;br /&gt;
$IPT -A OUTPUT -p ALL -s $LOCAL_IP -j ACCEPT&lt;br /&gt;
$IPT -A OUTPUT -p ALL -o $LOCAL_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# To internet&lt;br /&gt;
$IPT -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Log packets that still don't match&lt;br /&gt;
$IPT -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;OUTPUT packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# nat table&lt;br /&gt;
#&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# The nat table is where network address translation occurs if there&lt;br /&gt;
# is a private network.  If the gateway is connected to the Internet&lt;br /&gt;
# with a static IP, snat is used.  If the gateway has a dynamic address,&lt;br /&gt;
# masquerade must be used instead.  There is more overhead associated&lt;br /&gt;
# with masquerade, so snat is better when it can be used.&lt;br /&gt;
# The nat table has a builtin chain, PREROUTING, for dnat and redirects.&lt;br /&gt;
# Another, POSTROUTING, handles snat and masquerade.&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Load rules for nat table ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# PREROUTING chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# Port Forwarding&lt;br /&gt;
# &lt;br /&gt;
# Port forwarding forwards all traffic on a port or ports from&lt;br /&gt;
# the firewall to a computer on the internal LAN.  This can&lt;br /&gt;
# be required to support special situations.  For instance,&lt;br /&gt;
# this is the only way to support file transfers with an ICQ&lt;br /&gt;
# client on an internal computer.  It's also required if an internal&lt;br /&gt;
# system hosts a service such as a web server.  However, it's also&lt;br /&gt;
# a dangerous option.  It allows Internet computers access to&lt;br /&gt;
# your internal network.  Use it carefully and only if you're&lt;br /&gt;
# certain you know what you're doing.&lt;br /&gt;
&lt;br /&gt;
$IPT -t nat -A PREROUTING -p tcp -i $INET_IFACE --destination-port 10380 \&lt;br /&gt;
     -j DNAT --to-destination 191.168.3.2:80&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# POSTROUTING chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
$IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# mangle table&lt;br /&gt;
#&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# The mangle table is used to alter packets.  It can alter or mangle them in&lt;br /&gt;
# several ways.  For the purposes of this generator, we only use its ability&lt;br /&gt;
# to alter the TTL in packets.  However, it can be used to set netfilter&lt;br /&gt;
# mark values on specific packets.  Those marks could then be used in another&lt;br /&gt;
# table like filter, to limit activities associated with a specific host, for&lt;br /&gt;
# instance.  The TOS target can be used to set the Type of Service field in&lt;br /&gt;
# the IP header.  Note that the TTL target might not be included in the&lt;br /&gt;
# distribution on your system.  If it is not and you require it, you will&lt;br /&gt;
# have to add it.  That may require that you build from source.&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Load rules for mangle table ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Set the TTL in outbound packets to the same consistent value.&lt;br /&gt;
# A value around 128 is a good value.  Do not set this too high as&lt;br /&gt;
# it will adversely affect your network.  It is also considered bad&lt;br /&gt;
# form on the Internet.&lt;br /&gt;
$IPT -t mangle -A OUTPUT -o $INET_IFACE -j TTL --ttl-set 128&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Faccio notare le due principali regole che abilitano &amp;quot;l'attraversamento&amp;quot; della rete (la navigazione, se possibile ovviamente, perche` il sistema a cui sto` lavorando non lo prevedera` visto che non intendo collegare la porta di rete 'eth0' da nessuna parte, anche se rimarra` disponibile e predisposta):&lt;br /&gt;
; echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
: Chiamato generalmente &amp;quot;forward&amp;quot;, serve per ritrasmettere i pacchetti che devono attraversare/passare dalla rete locale ad un'altra&lt;br /&gt;
; $IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE&lt;br /&gt;
: Chiamato generalemnte &amp;quot;masquerade&amp;quot;, funziona da mascheramento degli indirizzi della rete locale verso le altre.&lt;br /&gt;
&lt;br /&gt;
== Riavvio ==&lt;br /&gt;
&lt;br /&gt;
; Importante&lt;br /&gt;
: ''Sconsiglio la modalita` di esecuzione dello script iptables come qua descritta, solo perche` non essendo in linea (o congruente, come dir si voglia) con gli altri script di avvio genera poi errori (solo a video) quando si installano e rimuovo altri pacchetti software.''&lt;br /&gt;
: ''Suggerirei di posizionarlo in una directory differente, per esempio &amp;quot;/etc/myscripts/&amp;quot; ed avviarlo da &amp;quot;/etc/rc.local&amp;quot;'' (nda: Aggiungere link all'esempio che sara` in un nuovo 'progetto').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Be`, le modifiche sono state tante, avrei potuto riavviare tutti i servizi, ma ho optato per riavviare il Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
=== Versione wheezy ===&lt;br /&gt;
&lt;br /&gt;
Prima di riavviare ho installato il mio gestore di &amp;quot;init&amp;quot; preferito, per avviare &amp;quot;iptables&amp;quot; all'avvio del sistema:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo aptitude install sysv-rc-conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avete letto fra le descrizioni all'inizio del file che abbiamo generato vero ? Funziona con i comandi &amp;quot;start&amp;quot; e &amp;quot;stop&amp;quot;, ma se provate ad utilizzare il comando ora &amp;quot;iptables&amp;quot; non comparira` fra i servizi, quindi riavviamo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo reboot;exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Autentichiamoci, eseguiamo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sysv-rc-conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
e attiviamo &amp;quot;iptables&amp;quot; al &amp;quot;runlevel 2&amp;quot;, come da immagine (ci si sposta coi tasti freccia ed al punto desiderato si preme la barra spaziatrice, per uscire il tasto &amp;quot;q&amp;quot;):&lt;br /&gt;
[[File:sysv-rc-conf_iptables.png]]&lt;br /&gt;
&lt;br /&gt;
Ancora non era in avvio, dai prossimi riavii lo sara, ma ora dobbiamo avviarlo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo service iptables start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Versione jessie ===&lt;br /&gt;
&lt;br /&gt;
Ho modificato il firewall &amp;quot;/etc/init.d/iptables&amp;quot;, aggiungendo all'inizio del file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          iptables&lt;br /&gt;
# Required-Start:    $hostapd&lt;br /&gt;
# Required-Stop:&lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:&lt;br /&gt;
# Short-Description: Run iptables firewall /etc/init.d/iptables if it exist&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:''Ho scelto di avviarlo dopo &amp;quot;hostapd&amp;quot; perche` questo firewall l'ho usato per la &amp;quot;wlan&amp;quot;, credo che funzioni ugualmente se specificato &amp;quot;network&amp;quot;.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Poi ho dato i comandi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl status iptables&lt;br /&gt;
sudo systemctl enable iptables&lt;br /&gt;
sudo update-rc.d iptables defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Versione &amp;quot;buster&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl status iptables&lt;br /&gt;
sudo systemctl enable iptables&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... e ho riavviato.&lt;br /&gt;
&lt;br /&gt;
Per testare che sia in funzione, potete usare il comando:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo iptables --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test finale ==&lt;br /&gt;
&lt;br /&gt;
''Non resta che provare il collegamento da un client, mi raccomando di inserire il SSID e la Passphrase, quelle che avete utilizzato nella configurazione di &amp;quot;hostapd&amp;quot;.&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
== Problemi e FAQ ==&lt;br /&gt;
&lt;br /&gt;
;Hostapd non si avvia:&lt;br /&gt;
:Cercare il problema eseguendo il demone da linea di comando &amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.themagpi.com/issue/issue-11/ Articolo &amp;quot;Turn your Raspberry Pi into a Wireless Pi Point&amp;quot; su rivista The MagPi nr.11 (pagina 10)]&lt;br /&gt;
* [[Raspberry PI come access point: l'esempio dell'AP usato al non-corso]]&lt;br /&gt;
* http://guide.debianizzati.org/index.php/Creare_un_Access_Point_con_Debian&lt;br /&gt;
* http://nims11.wordpress.com/2012/04/27/hostapd-the-linux-way-to-create-virtual-wifi-access-point/&lt;br /&gt;
* http://easyfwgen.morizot.net/&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi_Access_Point_WEP2&amp;diff=7361</id>
		<title>Raspberry Pi Access Point WEP2</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi_Access_Point_WEP2&amp;diff=7361"/>
		<updated>2022-02-20T18:47:40Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* hostapd */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Premessa ==&lt;br /&gt;
&lt;br /&gt;
Questo articolo potrebbe contenere inesattezze e/o dimenticanze, oltretutto e` la prima volta che uso e configuro 'hostapd' e 'dnsmasq'.&amp;lt;br /&amp;gt;&lt;br /&gt;
Si declina ogni responsabilita`.&lt;br /&gt;
&lt;br /&gt;
Nell'esempio ho utilizzato la rete &amp;quot;192.168.3.0/24&amp;quot;, cambiatela secondo le vostre neccessita`.&lt;br /&gt;
&lt;br /&gt;
; Note&lt;br /&gt;
: Tutti i comandi ed i file sono da eseguire e/o modificare come utente &amp;quot;root&amp;quot;.&lt;br /&gt;
: In alcuni ho aggiunto &amp;quot;sudo&amp;quot; davanti, ovviamente non e` necessario se gia` siete &amp;quot;root&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Installazione ==&lt;br /&gt;
&lt;br /&gt;
Terminata l'installazione base [[Raspberry_Pi-Raspbian_default_post-install|Raspbian]] (fate eventuale aggiornamento), installiamo alcuni pacchetti necessari:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;apt-get install hostapd hostap-utils dnsmasq&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; iw&lt;br /&gt;
: nell'ultima release di [[Raspbian]] e` gia` installato, l'ho usato per controllare che la chiave usb wifi fosse AP compatibile (comando: &amp;quot;iw list&amp;quot;, poi andate a leggere il report se compare la scritta AP)&lt;br /&gt;
&lt;br /&gt;
== Configurazione ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
&lt;br /&gt;
Per prima cosa ho modificato il file &amp;quot;/etc/network/interfaces&amp;quot; aggiungendo la configurazione per la periferica 'wlan0' (normalmente e` cosi` che viene vista la chiave usb wifi):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# interfaces(5) file used by ifup(8) and ifdown(8)&lt;br /&gt;
&lt;br /&gt;
# Please note that this file is written to be used with dhcpcd&lt;br /&gt;
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'&lt;br /&gt;
&lt;br /&gt;
# Include files from /etc/network/interfaces.d:&lt;br /&gt;
source-directory /etc/network/interfaces.d&lt;br /&gt;
&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
auto eth0&lt;br /&gt;
allow-hotplug eth0&lt;br /&gt;
iface eth0 inet dhcp&lt;br /&gt;
&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet static&lt;br /&gt;
        address 192.168.3.1&lt;br /&gt;
        netmask 255.255.255.0&lt;br /&gt;
        hostapd /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== hostapd ===&lt;br /&gt;
&lt;br /&gt;
Letto &amp;quot;/usr/share/doc/hostapd/README.Debian&amp;quot;, procediamo come indicato, generandoci dall'esempio il file &amp;quot;/etc/hostapd/hostapd.conf&amp;quot;, per ragioni di permessi ho trovato qualche difficolta` ad eseguire il comando cosi` come scritto, questi dovrebbero funzionare:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
zcat /usr/share/doc/hostapd/examples/hostapd.conf.gz &amp;gt; /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Versione &amp;quot;bullseye&amp;quot;'''&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp /usr/share/doc/hostapd/examples/hostapd.conf.gz /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per 'sicurezza' ho anche messo il file leggibile/scrivibile solo da 'root'&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo chmod 600 /etc/hostapd/hostapd.conf&lt;br /&gt;
sudo chown root:root /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ora correggiamo la configurazione secondo le nostre esigenze, modifichiamo &amp;quot;/etc/hostapd/hostapd.conf&amp;quot; (indichero` solo le righe che ho modificato, le altre sono state lasciate inalterate):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
ssid=&amp;lt;MetteteUnNomePerLaReteWifi&amp;gt;&lt;br /&gt;
wpa=2&lt;br /&gt;
wpa_passphrase=&amp;lt;MetteteLaVostra&amp;gt;&lt;br /&gt;
wpa_key_mgmt=WPA-PSK&lt;br /&gt;
rsn_pairwise=CCMP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dnsmasq ===&lt;br /&gt;
&lt;br /&gt;
Il procedimento e` lo stesso usato per la configurazione 'hostapd', utilizzo dell'esempio e modifiche del caso.&lt;br /&gt;
Correggiamo la configurazione secondo le nostre esigenze, modifichiamo &amp;quot;/etc/dnsmasq.conf&amp;quot; (indichero` solo le righe che ho modificato, le altre sono state lasciate inalterate):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
domain-needed&lt;br /&gt;
bogus-priv&lt;br /&gt;
interface=wlan0&lt;br /&gt;
dhcp-range=192.168.3.2,192.168.3.5,12h&lt;br /&gt;
dhcp-option=option:router,192.168.3.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rimane solo un problema sulla risoluzione del nome macchina (hostname) di questo pc, al momento ho risolto sistemando il file &amp;quot;/etc/hosts&amp;quot; in questo modo, dove ho modificato la penultima ed aggiunto l'ultima riga (esempio reale preso da [[Centralina livello 1]]):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1       localhost&lt;br /&gt;
::1             localhost ip6-localhost ip6-loopback&lt;br /&gt;
ff02::1         ip6-allnodes&lt;br /&gt;
ff02::2         ip6-allrouters&lt;br /&gt;
&lt;br /&gt;
127.0.1.1       level1error&lt;br /&gt;
192.168.3.1     level1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Firewall (iptables) ===&lt;br /&gt;
&lt;br /&gt;
Normalmente uso un'utility online per generare la base e procedo poi al ritocco secondo le esigenze, l'indirizzo del 'generatore' e`: http://easyfwgen.morizot.net/&lt;br /&gt;
&lt;br /&gt;
Questa e` la configurazione impostata, modificatela secondo le vostre esigenze, considerate sempre di NON usare e/o attivare opzioni che non conoscete e/o sapete a cosa servono. Da Notare che sono stati predisposti servizi che al momento non sono utilizzati, se pensate di non averne bisogno, disattivateli.&lt;br /&gt;
&lt;br /&gt;
(Per migliorarne la lettura ho realizzato diverse schermate, che messe in ordine somigliano alla pagina web che vi troverete ad impostare).&lt;br /&gt;
&lt;br /&gt;
[[File:Easy_Firewall_Generator_for_iptables.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Easy_Firewall_Generator_for_iptables_2.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Easy_Firewall_Generator_for_iptables_3.png]]&lt;br /&gt;
&lt;br /&gt;
Create la vostra configurazione e salvatela in un file chiamato &amp;quot;/etc/init.d/iptables&amp;quot;, cambiate poi i permessi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo chmod 755 /etc/init.d/iptables&lt;br /&gt;
sudo chown root:root /etc/init.d/iptables&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Questa e` quella che ho predisposto, attivando anche servizi come &amp;quot;http&amp;quot; ed &amp;quot;ftp&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# Generated iptables firewall script for the Linux 2.4 kernel&lt;br /&gt;
# Script generated by Easy Firewall Generator for IPTables 1.15&lt;br /&gt;
# copyright 2002 Timothy Scott Morizot&lt;br /&gt;
# &lt;br /&gt;
# Redhat chkconfig comments - firewall applied early,&lt;br /&gt;
#                             removed late&lt;br /&gt;
# chkconfig: 2345 08 92&lt;br /&gt;
# description: This script applies or removes iptables firewall rules&lt;br /&gt;
# &lt;br /&gt;
# This generator is primarily designed for RedHat installations,&lt;br /&gt;
# although it should be adaptable for others.&lt;br /&gt;
#&lt;br /&gt;
# It can be executed with the typical start and stop arguments.&lt;br /&gt;
# If used with stop, it will stop after flushing the firewall.&lt;br /&gt;
# The save and restore arguments will save or restore the rules&lt;br /&gt;
# from the /etc/sysconfig/iptables file.  The save and restore&lt;br /&gt;
# arguments are included to preserve compatibility with&lt;br /&gt;
# Redhat's or Fedora's init.d script if you prefer to use it.&lt;br /&gt;
&lt;br /&gt;
# Redhat/Fedora installation instructions&lt;br /&gt;
#&lt;br /&gt;
# 1. Have the system link the iptables init.d startup script into run states&lt;br /&gt;
#    2, 3, and 5.&lt;br /&gt;
#    chkconfig --level 235 iptables on&lt;br /&gt;
#&lt;br /&gt;
# 2. Save this script and execute it to load the ruleset from this file.&lt;br /&gt;
#    You may need to run the dos2unix command on it to remove carraige returns.&lt;br /&gt;
#&lt;br /&gt;
# 3. To have it applied at startup, copy this script to&lt;br /&gt;
#    /etc/init.d/iptables.  It accepts stop, start, save, and restore&lt;br /&gt;
#    arguments.  (You may wish to save the existing one first.)&lt;br /&gt;
#    Alternatively, if you issue the 'service iptables save' command&lt;br /&gt;
#    the init.d script should save the rules and reload them at runtime.&lt;br /&gt;
#&lt;br /&gt;
# 4. For non-Redhat systems (or Redhat systems if you have a problem), you&lt;br /&gt;
#    may want to append the command to execute this script to rc.local.&lt;br /&gt;
#    rc.local is typically located in /etc and /etc/rc.d and is usually&lt;br /&gt;
#    the last thing executed on startup.  Simply add /path/to/script/script_name&lt;br /&gt;
#    on its own line in the rc.local file.&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# &lt;br /&gt;
# Local Settings&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# sysctl location.  If set, it will use sysctl to adjust the kernel parameters.&lt;br /&gt;
# If this is set to the empty string (or is unset), the use of sysctl&lt;br /&gt;
# is disabled.&lt;br /&gt;
&lt;br /&gt;
SYSCTL=&amp;quot;/sbin/sysctl -w&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# To echo the value directly to the /proc file instead&lt;br /&gt;
# SYSCTL=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# IPTables Location - adjust if needed&lt;br /&gt;
&lt;br /&gt;
IPT=&amp;quot;/sbin/iptables&amp;quot;&lt;br /&gt;
IPTS=&amp;quot;/sbin/iptables-save&amp;quot;&lt;br /&gt;
IPTR=&amp;quot;/sbin/iptables-restore&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Internet Interface&lt;br /&gt;
INET_IFACE=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Local Interface Information&lt;br /&gt;
LOCAL_IFACE=&amp;quot;wlan0&amp;quot;&lt;br /&gt;
LOCAL_IP=&amp;quot;192.168.3.1&amp;quot;&lt;br /&gt;
LOCAL_NET=&amp;quot;192.168.3.0/24&amp;quot;&lt;br /&gt;
LOCAL_BCAST=&amp;quot;192.168.3.255&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Localhost Interface&lt;br /&gt;
&lt;br /&gt;
LO_IFACE=&amp;quot;lo&amp;quot;&lt;br /&gt;
LO_IP=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Save and Restore arguments handled here&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; = &amp;quot;save&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
	echo -n &amp;quot;Saving firewall to /etc/sysconfig/iptables ... &amp;quot;&lt;br /&gt;
	$IPTS &amp;gt; /etc/sysconfig/iptables&lt;br /&gt;
	echo &amp;quot;done&amp;quot;&lt;br /&gt;
	exit 0&lt;br /&gt;
elif [ &amp;quot;$1&amp;quot; = &amp;quot;restore&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
	echo -n &amp;quot;Restoring firewall from /etc/sysconfig/iptables ... &amp;quot;&lt;br /&gt;
	$IPTR &amp;lt; /etc/sysconfig/iptables&lt;br /&gt;
	echo &amp;quot;done&amp;quot;&lt;br /&gt;
	exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Load Modules&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Loading kernel modules ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# You should uncomment the line below and run it the first time just to&lt;br /&gt;
# ensure all kernel module dependencies are OK.  There is no need to run&lt;br /&gt;
# every time, however.&lt;br /&gt;
&lt;br /&gt;
# /sbin/depmod -a&lt;br /&gt;
&lt;br /&gt;
# Unless you have kernel module auto-loading disabled, you should not&lt;br /&gt;
# need to manually load each of these modules.  Other than ip_tables,&lt;br /&gt;
# ip_conntrack, and some of the optional modules, I've left these&lt;br /&gt;
# commented by default.  Uncomment if you have any problems or if&lt;br /&gt;
# you have disabled module autoload.  Note that some modules must&lt;br /&gt;
# be loaded by another kernel module.&lt;br /&gt;
&lt;br /&gt;
# core netfilter module&lt;br /&gt;
/sbin/modprobe ip_tables&lt;br /&gt;
&lt;br /&gt;
# the stateful connection tracking module&lt;br /&gt;
/sbin/modprobe ip_conntrack&lt;br /&gt;
&lt;br /&gt;
# filter table module&lt;br /&gt;
# /sbin/modprobe iptable_filter&lt;br /&gt;
&lt;br /&gt;
# mangle table module&lt;br /&gt;
# /sbin/modprobe iptable_mangle&lt;br /&gt;
&lt;br /&gt;
# nat table module&lt;br /&gt;
# /sbin/modprobe iptable_nat&lt;br /&gt;
&lt;br /&gt;
# LOG target module&lt;br /&gt;
# /sbin/modprobe ipt_LOG&lt;br /&gt;
&lt;br /&gt;
# This is used to limit the number of packets per sec/min/hr&lt;br /&gt;
# /sbin/modprobe ipt_limit&lt;br /&gt;
&lt;br /&gt;
# masquerade target module&lt;br /&gt;
# /sbin/modprobe ipt_MASQUERADE&lt;br /&gt;
&lt;br /&gt;
# filter using owner as part of the match&lt;br /&gt;
# /sbin/modprobe ipt_owner&lt;br /&gt;
&lt;br /&gt;
# REJECT target drops the packet and returns an ICMP response.&lt;br /&gt;
# The response is configurable.  By default, connection refused.&lt;br /&gt;
# /sbin/modprobe ipt_REJECT&lt;br /&gt;
&lt;br /&gt;
# This target allows packets to be marked in the mangle table&lt;br /&gt;
# /sbin/modprobe ipt_mark&lt;br /&gt;
&lt;br /&gt;
# This target affects the TCP MSS&lt;br /&gt;
# /sbin/modprobe ipt_tcpmss&lt;br /&gt;
&lt;br /&gt;
# This match allows multiple ports instead of a single port or range&lt;br /&gt;
# /sbin/modprobe multiport&lt;br /&gt;
&lt;br /&gt;
# This match checks against the TCP flags&lt;br /&gt;
# /sbin/modprobe ipt_state&lt;br /&gt;
&lt;br /&gt;
# This match catches packets with invalid flags&lt;br /&gt;
# /sbin/modprobe ipt_unclean&lt;br /&gt;
&lt;br /&gt;
# The ftp nat module is required for non-PASV ftp support&lt;br /&gt;
/sbin/modprobe ip_nat_ftp&lt;br /&gt;
&lt;br /&gt;
# the module for full ftp connection tracking&lt;br /&gt;
/sbin/modprobe ip_conntrack_ftp&lt;br /&gt;
&lt;br /&gt;
# the module for full irc connection tracking&lt;br /&gt;
/sbin/modprobe ip_conntrack_irc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Kernel Parameter Configuration&lt;br /&gt;
#&lt;br /&gt;
# See http://ipsysctl-tutorial.frozentux.net/chunkyhtml/index.html&lt;br /&gt;
# for a detailed tutorial on sysctl and the various settings&lt;br /&gt;
# available.&lt;br /&gt;
&lt;br /&gt;
# Required to enable IPv4 forwarding.&lt;br /&gt;
# Redhat users can try setting FORWARD_IPV4 in /etc/sysconfig/network to true&lt;br /&gt;
# Alternatively, it can be set in /etc/sysctl.conf&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.ip_forward=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This enables dynamic address hacking.&lt;br /&gt;
# This may help if you have a dynamic IP address \(e.g. slip, ppp, dhcp\).&lt;br /&gt;
#if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
#then&lt;br /&gt;
#    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/ip_dynaddr&lt;br /&gt;
#else&lt;br /&gt;
#    $SYSCTL net.ipv4.ip_dynaddr=&amp;quot;1&amp;quot;&lt;br /&gt;
#fi&lt;br /&gt;
&lt;br /&gt;
# This enables SYN flood protection.&lt;br /&gt;
# The SYN cookies activation allows your system to accept an unlimited&lt;br /&gt;
# number of TCP connections while still trying to give reasonable&lt;br /&gt;
# service during a denial of service attack.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/tcp_syncookies&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.tcp_syncookies=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This enables source validation by reversed path according to RFC1812.&lt;br /&gt;
# In other words, did the response packet originate from the same interface&lt;br /&gt;
# through which the source packet was sent?  It's recommended for single-homed&lt;br /&gt;
# systems and routers on stub networks.  Since those are the configurations&lt;br /&gt;
# this firewall is designed to support, I turn it on by default.&lt;br /&gt;
# Turn it off if you use multiple NICs connected to the same network.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/rp_filter&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.rp_filter=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option allows a subnet to be firewalled with a single IP address.&lt;br /&gt;
# It's used to build a DMZ.  Since that's not a focus of this firewall&lt;br /&gt;
# script, it's not enabled by default, but is included for reference.&lt;br /&gt;
# See: http://www.sjdjweis.com/linux/proxyarp/ &lt;br /&gt;
#if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
#then&lt;br /&gt;
#    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/proxy_arp&lt;br /&gt;
#else&lt;br /&gt;
#    $SYSCTL net.ipv4.conf.all.proxy_arp=&amp;quot;1&amp;quot;&lt;br /&gt;
#fi&lt;br /&gt;
&lt;br /&gt;
# The following kernel settings were suggested by Alex Weeks. Thanks!&lt;br /&gt;
&lt;br /&gt;
# This kernel parameter instructs the kernel to ignore all ICMP&lt;br /&gt;
# echo requests sent to the broadcast address.  This prevents&lt;br /&gt;
# a number of smurfs and similar DoS nasty attacks.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.icmp_echo_ignore_broadcasts=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option can be used to accept or refuse source routed&lt;br /&gt;
# packets.  It is usually on by default, but is generally&lt;br /&gt;
# considered a security risk.  This option turns it off.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;0&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/accept_source_route&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.accept_source_route=&amp;quot;0&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option can disable ICMP redirects.  ICMP redirects&lt;br /&gt;
# are generally considered a security risk and shouldn't be&lt;br /&gt;
# needed by most systems using this generator.&lt;br /&gt;
#if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
#then&lt;br /&gt;
#    echo &amp;quot;0&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/accept_redirects&lt;br /&gt;
#else&lt;br /&gt;
#    $SYSCTL net.ipv4.conf.all.accept_redirects=&amp;quot;0&amp;quot;&lt;br /&gt;
#fi&lt;br /&gt;
&lt;br /&gt;
# However, we'll ensure the secure_redirects option is on instead.&lt;br /&gt;
# This option accepts only from gateways in the default gateways list.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/secure_redirects&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.secure_redirects=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option logs packets from impossible addresses.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/log_martians&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.log_martians=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Flush Any Existing Rules or Chains&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Flushing Tables ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Reset Default Policies&lt;br /&gt;
$IPT -P INPUT ACCEPT&lt;br /&gt;
$IPT -P FORWARD ACCEPT&lt;br /&gt;
$IPT -P OUTPUT ACCEPT&lt;br /&gt;
$IPT -t nat -P PREROUTING ACCEPT&lt;br /&gt;
$IPT -t nat -P POSTROUTING ACCEPT&lt;br /&gt;
$IPT -t nat -P OUTPUT ACCEPT&lt;br /&gt;
$IPT -t mangle -P PREROUTING ACCEPT&lt;br /&gt;
$IPT -t mangle -P OUTPUT ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Flush all rules&lt;br /&gt;
$IPT -F&lt;br /&gt;
$IPT -t nat -F&lt;br /&gt;
$IPT -t mangle -F&lt;br /&gt;
&lt;br /&gt;
# Erase all non-default chains&lt;br /&gt;
$IPT -X&lt;br /&gt;
$IPT -t nat -X&lt;br /&gt;
$IPT -t mangle -X&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; = &amp;quot;stop&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;Firewall completely flushed!  Now running with no firewall.&amp;quot;&lt;br /&gt;
	exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Rules Configuration&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Filter Table&lt;br /&gt;
#&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Set Policies&lt;br /&gt;
&lt;br /&gt;
$IPT -P INPUT DROP&lt;br /&gt;
$IPT -P OUTPUT DROP&lt;br /&gt;
$IPT -P FORWARD DROP&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# User-Specified Chains&lt;br /&gt;
#&lt;br /&gt;
# Create user chains to reduce the number of rules each packet&lt;br /&gt;
# must traverse.&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Create and populate custom rule chains ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Create a chain to filter INVALID packets&lt;br /&gt;
&lt;br /&gt;
$IPT -N bad_packets&lt;br /&gt;
&lt;br /&gt;
# Create another chain to filter bad tcp packets&lt;br /&gt;
&lt;br /&gt;
$IPT -N bad_tcp_packets&lt;br /&gt;
&lt;br /&gt;
# Create separate chains for icmp, tcp (incoming and outgoing),&lt;br /&gt;
# and incoming udp packets.&lt;br /&gt;
&lt;br /&gt;
$IPT -N icmp_packets&lt;br /&gt;
&lt;br /&gt;
# Used for UDP packets inbound from the Internet&lt;br /&gt;
$IPT -N udp_inbound&lt;br /&gt;
&lt;br /&gt;
# Used to block outbound UDP services from internal network&lt;br /&gt;
# Default to allow all&lt;br /&gt;
$IPT -N udp_outbound&lt;br /&gt;
&lt;br /&gt;
# Used to allow inbound services if desired&lt;br /&gt;
# Default fail except for established sessions&lt;br /&gt;
$IPT -N tcp_inbound&lt;br /&gt;
&lt;br /&gt;
# Used to block outbound services from internal network&lt;br /&gt;
# Default to allow all&lt;br /&gt;
$IPT -N tcp_outbound&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Populate User Chains&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# bad_packets chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# Drop packets received on the external interface&lt;br /&gt;
# claiming a source of the local network&lt;br /&gt;
$IPT -A bad_packets -p ALL -i $INET_IFACE -s $LOCAL_NET -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Illegal source: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_packets -p ALL -i $INET_IFACE -s $LOCAL_NET -j DROP&lt;br /&gt;
&lt;br /&gt;
# Drop INVALID packets immediately&lt;br /&gt;
$IPT -A bad_packets -p ALL -m state --state INVALID -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Invalid packet: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_packets -p ALL -m state --state INVALID -j DROP&lt;br /&gt;
&lt;br /&gt;
# Then check the tcp packets for additional problems&lt;br /&gt;
$IPT -A bad_packets -p tcp -j bad_tcp_packets&lt;br /&gt;
&lt;br /&gt;
# All good, so return&lt;br /&gt;
$IPT -A bad_packets -p ALL -j RETURN&lt;br /&gt;
&lt;br /&gt;
# bad_tcp_packets chain&lt;br /&gt;
#&lt;br /&gt;
# All tcp packets will traverse this chain.&lt;br /&gt;
# Every new connection attempt should begin with&lt;br /&gt;
# a syn packet.  If it doesn't, it is likely a&lt;br /&gt;
# port scan.  This drops packets in state&lt;br /&gt;
# NEW that are not flagged as syn packets.&lt;br /&gt;
&lt;br /&gt;
# Return to the calling chain if the bad packets originate&lt;br /&gt;
# from the local interface. This maintains the approach&lt;br /&gt;
# throughout this firewall of a largely trusted internal&lt;br /&gt;
# network.&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp -i $LOCAL_IFACE -j RETURN&lt;br /&gt;
&lt;br /&gt;
# However, I originally did apply this filter to the forward chain&lt;br /&gt;
# for packets originating from the internal network.  While I have&lt;br /&gt;
# not conclusively determined its effect, it appears to have the&lt;br /&gt;
# interesting side effect of blocking some of the ad systems.&lt;br /&gt;
# Apparently some ad systems have the browser initiate a NEW&lt;br /&gt;
# connection that is not flagged as a syn packet to retrieve&lt;br /&gt;
# the ad image.  If you wish to experiment further comment the&lt;br /&gt;
# rule above. If you try it, you may also wish to uncomment the&lt;br /&gt;
# rule below.  It will keep those packets from being logged.&lt;br /&gt;
# There are a lot of them.&lt;br /&gt;
# $IPT -A bad_tcp_packets -p tcp -i $LOCAL_IFACE ! --syn -m state \&lt;br /&gt;
#     --state NEW -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;New not syn: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP&lt;br /&gt;
&lt;br /&gt;
# All good, so return&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp -j RETURN&lt;br /&gt;
&lt;br /&gt;
# icmp_packets chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is for inbound (from the Internet) icmp packets only.&lt;br /&gt;
# Type 8 (Echo Request) is not accepted by default&lt;br /&gt;
# Enable it if you want remote hosts to be able to reach you.&lt;br /&gt;
# 11 (Time Exceeded) is the only one accepted&lt;br /&gt;
# that would not already be covered by the established&lt;br /&gt;
# connection rule.  Applied to INPUT on the external interface.&lt;br /&gt;
# &lt;br /&gt;
# See: http://www.ee.siue.edu/~rwalden/networking/icmp.html&lt;br /&gt;
# for more info on ICMP types.&lt;br /&gt;
#&lt;br /&gt;
# Note that the stateful settings allow replies to ICMP packets.&lt;br /&gt;
# These rules allow new packets of the specified types.&lt;br /&gt;
&lt;br /&gt;
# ICMP packets should fit in a Layer 2 frame, thus they should&lt;br /&gt;
# never be fragmented.  Fragmented ICMP packets are a typical sign&lt;br /&gt;
# of a denial of service attack.&lt;br /&gt;
$IPT -A icmp_packets --fragment -p ICMP -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;ICMP Fragment: &amp;quot;&lt;br /&gt;
$IPT -A icmp_packets --fragment -p ICMP -j DROP&lt;br /&gt;
&lt;br /&gt;
# Echo - uncomment to allow your system to be pinged.&lt;br /&gt;
# Uncomment the LOG command if you also want to log PING attempts&lt;br /&gt;
# &lt;br /&gt;
# $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j LOG \&lt;br /&gt;
#    --log-prefix &amp;quot;Ping detected: &amp;quot;&lt;br /&gt;
# $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# By default, however, drop pings without logging. Blaster&lt;br /&gt;
# and other worms have infected systems blasting pings.&lt;br /&gt;
# Comment the line below if you want pings logged, but it&lt;br /&gt;
# will likely fill your logs.&lt;br /&gt;
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j DROP&lt;br /&gt;
&lt;br /&gt;
# Time Exceeded&lt;br /&gt;
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Not matched, so return so it will be logged&lt;br /&gt;
$IPT -A icmp_packets -p ICMP -j RETURN&lt;br /&gt;
&lt;br /&gt;
# TCP &amp;amp; UDP&lt;br /&gt;
# Identify ports at:&lt;br /&gt;
#    http://www.chebucto.ns.ca/~rakerman/port-table.html&lt;br /&gt;
#    http://www.iana.org/assignments/port-numbers&lt;br /&gt;
&lt;br /&gt;
# udp_inbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain describes the inbound UDP packets it will accept.&lt;br /&gt;
# It's applied to INPUT on the external or Internet interface.&lt;br /&gt;
# Note that the stateful settings allow replies.&lt;br /&gt;
# These rules are for new requests.&lt;br /&gt;
# It drops netbios packets (windows) immediately without logging.&lt;br /&gt;
&lt;br /&gt;
# Drop netbios calls&lt;br /&gt;
# Please note that these rules do not really change the way the firewall&lt;br /&gt;
# treats netbios connections.  Connections from the localhost and&lt;br /&gt;
# internal interface (if one exists) are accepted by default.&lt;br /&gt;
# Responses from the Internet to requests initiated by or through&lt;br /&gt;
# the firewall are also accepted by default.  To get here, the&lt;br /&gt;
# packets would have to be part of a new request received by the&lt;br /&gt;
# Internet interface.  You would have to manually add rules to&lt;br /&gt;
# accept these.  I added these rules because some network connections,&lt;br /&gt;
# such as those via cable modems, tend to be filled with noise from&lt;br /&gt;
# unprotected Windows machines.  These rules drop those packets&lt;br /&gt;
# quickly and without logging them.  This prevents them from traversing&lt;br /&gt;
# the whole chain and keeps the log from getting cluttered with&lt;br /&gt;
# chatter from Windows systems.&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 137 -j DROP&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 138 -j DROP&lt;br /&gt;
&lt;br /&gt;
# Network Time Protocol (NTP) Server&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 123 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# DNS Server&lt;br /&gt;
# Configure the server to use port 53 as the source port for requests&lt;br /&gt;
# Note, if you run a caching-only name server that only accepts queries&lt;br /&gt;
# from the private network or localhost, you can comment out this line.&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 53 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# If you don't query-source the server to port 53 and you have problems,&lt;br /&gt;
# uncomment this rule.  It specifically allows responses to queries&lt;br /&gt;
# initiated to another server from a high UDP port.  The stateful&lt;br /&gt;
# connection rules should handle this situation, though.&lt;br /&gt;
# $IPT -A udp_inbound -p UDP -s 0/0 --source-port 53 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Dynamic Address&lt;br /&gt;
# If DHCP, the initial request is a broadcast. The response&lt;br /&gt;
# doesn't exactly match the outbound packet.  This explicitly&lt;br /&gt;
# allow the DHCP ports to alleviate this problem.&lt;br /&gt;
# If you receive your dynamic address by a different means, you&lt;br /&gt;
# can probably comment this line.&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --source-port 67 --destination-port 68 \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Network File System (NFS) Server&lt;br /&gt;
# Please note that additional services must&lt;br /&gt;
# be configured in order to support an NFS Server through&lt;br /&gt;
# the firewall. Read the help in the generator or this site:&lt;br /&gt;
# http://www.lowth.com/LinWiz/nfs_help.html&lt;br /&gt;
&lt;br /&gt;
# NFS Server - portmapper&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 111 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - statd&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9400 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - NFS daemon&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 2049 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - lockd&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9401 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - mountd&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9402 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - quotad&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9403 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Not matched, so return for logging&lt;br /&gt;
$IPT -A udp_inbound -p UDP -j RETURN&lt;br /&gt;
&lt;br /&gt;
# udp_outbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is used with a private network to prevent forwarding for&lt;br /&gt;
# UDP requests on specific protocols.  Applied to the FORWARD rule from&lt;br /&gt;
# the internal network.  Ends with an ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# No match, so ACCEPT&lt;br /&gt;
$IPT -A udp_outbound -p UDP -s 0/0 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# tcp_inbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is used to allow inbound connections to the&lt;br /&gt;
# system/gateway.  Use with care.  It defaults to none.&lt;br /&gt;
# It's applied on INPUT from the external or Internet interface.&lt;br /&gt;
&lt;br /&gt;
# DNS Server - Allow TCP connections (zone transfers and large requests)&lt;br /&gt;
# This is disabled by default.  DNS Zone transfers occur via TCP.&lt;br /&gt;
# If you need to allow transfers over the net you need to uncomment this line.&lt;br /&gt;
# If you allow queries from the 'net, you also need to be aware that although&lt;br /&gt;
# DNS queries use UDP by default, a truncated UDP query can legally be&lt;br /&gt;
# submitted via TCP instead.  You probably will never need it, but should&lt;br /&gt;
# be aware of the fact.&lt;br /&gt;
# $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 53 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Web Server&lt;br /&gt;
&lt;br /&gt;
# HTTP&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 80 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# HTTPS (Secure Web Server)&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 443 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# FTP Server (Control)&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 21 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# FTP Client (Data Port for non-PASV transfers)&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --source-port 20 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Passive FTP&lt;br /&gt;
# &lt;br /&gt;
# With passive FTP, the server provides a port to the client&lt;br /&gt;
# and allows the client to initiate the connection rather&lt;br /&gt;
# than initiating the connection with the client from the data port.&lt;br /&gt;
# Web browsers and clients operating behind a firewall generally&lt;br /&gt;
# use passive ftp transfers.  A general purpose FTP server&lt;br /&gt;
# will need to support them.&lt;br /&gt;
# &lt;br /&gt;
# However, by default an FTP server will select a port from the entire&lt;br /&gt;
# range of high ports.  It is not particularly safe to open all&lt;br /&gt;
# high ports.  Fortunately, that range can be restricted.  This&lt;br /&gt;
# firewall presumes that the range has been restricted to a specific&lt;br /&gt;
# selected range.  That range must also be configured in the ftp server.&lt;br /&gt;
# &lt;br /&gt;
# Instructions for specifying the port range for the wu-ftpd server&lt;br /&gt;
# can be found here:&lt;br /&gt;
# http://www.wu-ftpd.org/man/ftpaccess.html&lt;br /&gt;
# (See the passive ports option.)&lt;br /&gt;
# &lt;br /&gt;
# Instructions for the ProFTPD server can be found here:&lt;br /&gt;
# http://proftpd.linux.co.uk/localsite/Userguide/linked/x861.html&lt;br /&gt;
&lt;br /&gt;
# Sample Rule&lt;br /&gt;
# $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 62000:64000 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# sshd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Network File System (NFS) Server&lt;br /&gt;
# Please note that additional services must&lt;br /&gt;
# be configured in order to support an NFS Server through&lt;br /&gt;
# the firewall. Read the help in the generator or this site:&lt;br /&gt;
# http://www.lowth.com/LinWiz/nfs_help.html&lt;br /&gt;
&lt;br /&gt;
# NFS Server - portmapper&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 111 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - statd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9400 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - NFS daemon&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 2049 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - lockd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9401 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - mountd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9402 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - quotad&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9403 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# User specified allowed TCP protocol&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 8080:8081 -j ACCEPT&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 10301:10302 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Not matched, so return so it will be logged&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -j RETURN&lt;br /&gt;
&lt;br /&gt;
# tcp_outbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is used with a private network to prevent forwarding for&lt;br /&gt;
# requests on specific protocols.  Applied to the FORWARD rule from&lt;br /&gt;
# the internal network.  Ends with an ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Block Outbound Telnet&lt;br /&gt;
$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 23 -j REJECT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# No match, so ACCEPT&lt;br /&gt;
$IPT -A tcp_outbound -p TCP -s 0/0 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# INPUT Chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Process INPUT chain ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Allow all on localhost interface&lt;br /&gt;
$IPT -A INPUT -p ALL -i $LO_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Drop bad packets&lt;br /&gt;
$IPT -A INPUT -p ALL -j bad_packets&lt;br /&gt;
&lt;br /&gt;
# DOCSIS compliant cable modems&lt;br /&gt;
# Some DOCSIS compliant cable modems send IGMP multicasts to find&lt;br /&gt;
# connected PCs.  The multicast packets have the destination address&lt;br /&gt;
# 224.0.0.1.  You can accept them.  If you choose to do so,&lt;br /&gt;
# Uncomment the rule to ACCEPT them and comment the rule to DROP&lt;br /&gt;
# them  The firewall will drop them here by default to avoid&lt;br /&gt;
# cluttering the log.  The firewall will drop all multicasts&lt;br /&gt;
# to the entire subnet (224.0.0.1) by default.  To only affect&lt;br /&gt;
# IGMP multicasts, change '-p ALL' to '-p 2'.  Of course,&lt;br /&gt;
# if they aren't accepted elsewhere, it will only ensure that&lt;br /&gt;
# multicasts on other protocols are logged.&lt;br /&gt;
# Drop them without logging.&lt;br /&gt;
$IPT -A INPUT -p ALL -d 224.0.0.1 -j DROP&lt;br /&gt;
# The rule to accept the packets.&lt;br /&gt;
# $IPT -A INPUT -p ALL -d 224.0.0.1 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Rules for the private network (accessing gateway system itself)&lt;br /&gt;
$IPT -A INPUT -p ALL -i $LOCAL_IFACE -s $LOCAL_NET -j ACCEPT&lt;br /&gt;
$IPT -A INPUT -p ALL -i $LOCAL_IFACE -d $LOCAL_BCAST -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Allow DHCP client request packets inbound from internal network&lt;br /&gt;
$IPT -A INPUT -p UDP -i $LOCAL_IFACE --source-port 68 --destination-port 67 \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Inbound Internet Packet Rules&lt;br /&gt;
&lt;br /&gt;
# Accept Established Connections&lt;br /&gt;
$IPT -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Route the rest to the appropriate user chain&lt;br /&gt;
$IPT -A INPUT -p TCP -i $INET_IFACE -j tcp_inbound&lt;br /&gt;
$IPT -A INPUT -p UDP -i $INET_IFACE -j udp_inbound&lt;br /&gt;
$IPT -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets&lt;br /&gt;
&lt;br /&gt;
# Drop without logging broadcasts that get this far.&lt;br /&gt;
# Cuts down on log clutter.&lt;br /&gt;
# Comment this line if testing new rules that impact&lt;br /&gt;
# broadcast protocols.&lt;br /&gt;
$IPT -A INPUT -m pkttype --pkt-type broadcast -j DROP&lt;br /&gt;
&lt;br /&gt;
# Log packets that still don't match&lt;br /&gt;
$IPT -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;INPUT packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# FORWARD Chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Process FORWARD chain ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Used if forwarding for a private network&lt;br /&gt;
&lt;br /&gt;
# Drop bad packets&lt;br /&gt;
$IPT -A FORWARD -p ALL -j bad_packets&lt;br /&gt;
&lt;br /&gt;
# Accept TCP packets we want to forward from internal sources&lt;br /&gt;
$IPT -A FORWARD -p tcp -i $LOCAL_IFACE -j tcp_outbound&lt;br /&gt;
&lt;br /&gt;
# Accept UDP packets we want to forward from internal sources&lt;br /&gt;
$IPT -A FORWARD -p udp -i $LOCAL_IFACE -j udp_outbound&lt;br /&gt;
&lt;br /&gt;
# If not blocked, accept any other packets from the internal interface&lt;br /&gt;
$IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Deal with responses from the internet&lt;br /&gt;
$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Port Forwarding is enabled, so accept forwarded traffic&lt;br /&gt;
$IPT -A FORWARD -p tcp -i $INET_IFACE --destination-port 80 \&lt;br /&gt;
     --destination 191.168.3.2 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# Log packets that still don't match&lt;br /&gt;
$IPT -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;FORWARD packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# OUTPUT Chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Process OUTPUT chain ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Generally trust the firewall on output&lt;br /&gt;
&lt;br /&gt;
# However, invalid icmp packets need to be dropped&lt;br /&gt;
# to prevent a possible exploit.&lt;br /&gt;
$IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP&lt;br /&gt;
&lt;br /&gt;
# Localhost&lt;br /&gt;
$IPT -A OUTPUT -p ALL -s $LO_IP -j ACCEPT&lt;br /&gt;
$IPT -A OUTPUT -p ALL -o $LO_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# To internal network&lt;br /&gt;
$IPT -A OUTPUT -p ALL -s $LOCAL_IP -j ACCEPT&lt;br /&gt;
$IPT -A OUTPUT -p ALL -o $LOCAL_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# To internet&lt;br /&gt;
$IPT -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Log packets that still don't match&lt;br /&gt;
$IPT -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;OUTPUT packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# nat table&lt;br /&gt;
#&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# The nat table is where network address translation occurs if there&lt;br /&gt;
# is a private network.  If the gateway is connected to the Internet&lt;br /&gt;
# with a static IP, snat is used.  If the gateway has a dynamic address,&lt;br /&gt;
# masquerade must be used instead.  There is more overhead associated&lt;br /&gt;
# with masquerade, so snat is better when it can be used.&lt;br /&gt;
# The nat table has a builtin chain, PREROUTING, for dnat and redirects.&lt;br /&gt;
# Another, POSTROUTING, handles snat and masquerade.&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Load rules for nat table ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# PREROUTING chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# Port Forwarding&lt;br /&gt;
# &lt;br /&gt;
# Port forwarding forwards all traffic on a port or ports from&lt;br /&gt;
# the firewall to a computer on the internal LAN.  This can&lt;br /&gt;
# be required to support special situations.  For instance,&lt;br /&gt;
# this is the only way to support file transfers with an ICQ&lt;br /&gt;
# client on an internal computer.  It's also required if an internal&lt;br /&gt;
# system hosts a service such as a web server.  However, it's also&lt;br /&gt;
# a dangerous option.  It allows Internet computers access to&lt;br /&gt;
# your internal network.  Use it carefully and only if you're&lt;br /&gt;
# certain you know what you're doing.&lt;br /&gt;
&lt;br /&gt;
$IPT -t nat -A PREROUTING -p tcp -i $INET_IFACE --destination-port 10380 \&lt;br /&gt;
     -j DNAT --to-destination 191.168.3.2:80&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# POSTROUTING chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
$IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# mangle table&lt;br /&gt;
#&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# The mangle table is used to alter packets.  It can alter or mangle them in&lt;br /&gt;
# several ways.  For the purposes of this generator, we only use its ability&lt;br /&gt;
# to alter the TTL in packets.  However, it can be used to set netfilter&lt;br /&gt;
# mark values on specific packets.  Those marks could then be used in another&lt;br /&gt;
# table like filter, to limit activities associated with a specific host, for&lt;br /&gt;
# instance.  The TOS target can be used to set the Type of Service field in&lt;br /&gt;
# the IP header.  Note that the TTL target might not be included in the&lt;br /&gt;
# distribution on your system.  If it is not and you require it, you will&lt;br /&gt;
# have to add it.  That may require that you build from source.&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Load rules for mangle table ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Set the TTL in outbound packets to the same consistent value.&lt;br /&gt;
# A value around 128 is a good value.  Do not set this too high as&lt;br /&gt;
# it will adversely affect your network.  It is also considered bad&lt;br /&gt;
# form on the Internet.&lt;br /&gt;
$IPT -t mangle -A OUTPUT -o $INET_IFACE -j TTL --ttl-set 128&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Faccio notare le due principali regole che abilitano &amp;quot;l'attraversamento&amp;quot; della rete (la navigazione, se possibile ovviamente, perche` il sistema a cui sto` lavorando non lo prevedera` visto che non intendo collegare la porta di rete 'eth0' da nessuna parte, anche se rimarra` disponibile e predisposta):&lt;br /&gt;
; echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
: Chiamato generalmente &amp;quot;forward&amp;quot;, serve per ritrasmettere i pacchetti che devono attraversare/passare dalla rete locale ad un'altra&lt;br /&gt;
; $IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE&lt;br /&gt;
: Chiamato generalemnte &amp;quot;masquerade&amp;quot;, funziona da mascheramento degli indirizzi della rete locale verso le altre.&lt;br /&gt;
&lt;br /&gt;
== Riavvio ==&lt;br /&gt;
&lt;br /&gt;
; Importante&lt;br /&gt;
: ''Sconsiglio la modalita` di esecuzione dello script iptables come qua descritta, solo perche` non essendo in linea (o congruente, come dir si voglia) con gli altri script di avvio genera poi errori (solo a video) quando si installano e rimuovo altri pacchetti software.''&lt;br /&gt;
: ''Suggerirei di posizionarlo in una directory differente, per esempio &amp;quot;/etc/myscripts/&amp;quot; ed avviarlo da &amp;quot;/etc/rc.local&amp;quot;'' (nda: Aggiungere link all'esempio che sara` in un nuovo 'progetto').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Be`, le modifiche sono state tante, avrei potuto riavviare tutti i servizi, ma ho optato per riavviare il Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
=== Versione wheezy ===&lt;br /&gt;
&lt;br /&gt;
Prima di riavviare ho installato il mio gestore di &amp;quot;init&amp;quot; preferito, per avviare &amp;quot;iptables&amp;quot; all'avvio del sistema:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo aptitude install sysv-rc-conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avete letto fra le descrizioni all'inizio del file che abbiamo generato vero ? Funziona con i comandi &amp;quot;start&amp;quot; e &amp;quot;stop&amp;quot;, ma se provate ad utilizzare il comando ora &amp;quot;iptables&amp;quot; non comparira` fra i servizi, quindi riavviamo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo reboot;exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Autentichiamoci, eseguiamo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sysv-rc-conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
e attiviamo &amp;quot;iptables&amp;quot; al &amp;quot;runlevel 2&amp;quot;, come da immagine (ci si sposta coi tasti freccia ed al punto desiderato si preme la barra spaziatrice, per uscire il tasto &amp;quot;q&amp;quot;):&lt;br /&gt;
[[File:sysv-rc-conf_iptables.png]]&lt;br /&gt;
&lt;br /&gt;
Ancora non era in avvio, dai prossimi riavii lo sara, ma ora dobbiamo avviarlo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo service iptables start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Versione jessie ===&lt;br /&gt;
&lt;br /&gt;
Ho modificato il firewall &amp;quot;/etc/init.d/iptables&amp;quot;, aggiungendo all'inizio del file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          iptables&lt;br /&gt;
# Required-Start:    $hostapd&lt;br /&gt;
# Required-Stop:&lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:&lt;br /&gt;
# Short-Description: Run iptables firewall /etc/init.d/iptables if it exist&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:''Ho scelto di avviarlo dopo &amp;quot;hostapd&amp;quot; perche` questo firewall l'ho usato per la &amp;quot;wlan&amp;quot;, credo che funzioni ugualmente se specificato &amp;quot;network&amp;quot;.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Poi ho dato i comandi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl status iptables&lt;br /&gt;
sudo systemctl enable iptables&lt;br /&gt;
sudo update-rc.d iptables defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Versione &amp;quot;buster&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl status iptables&lt;br /&gt;
sudo systemctl enable iptables&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... e ho riavviato.&lt;br /&gt;
&lt;br /&gt;
Per testare che sia in funzione, potete usare il comando:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo iptables --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test finale ==&lt;br /&gt;
&lt;br /&gt;
''Non resta che provare il collegamento da un client, mi raccomando di inserire il SSID e la Passphrase, quelle che avete utilizzato nella configurazione di &amp;quot;hostapd&amp;quot;.&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
== Problemi e FAQ ==&lt;br /&gt;
&lt;br /&gt;
;Hostapd non si avvia:&lt;br /&gt;
:Cercare il problema eseguendo il demone da linea di comando &amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.themagpi.com/issue/issue-11/ Articolo &amp;quot;Turn your Raspberry Pi into a Wireless Pi Point&amp;quot; su rivista The MagPi nr.11 (pagina 10)]&lt;br /&gt;
* [[Raspberry PI come access point: l'esempio dell'AP usato al non-corso]]&lt;br /&gt;
* http://guide.debianizzati.org/index.php/Creare_un_Access_Point_con_Debian&lt;br /&gt;
* http://nims11.wordpress.com/2012/04/27/hostapd-the-linux-way-to-create-virtual-wifi-access-point/&lt;br /&gt;
* http://easyfwgen.morizot.net/&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Cronotermostato_settimanale&amp;diff=7324</id>
		<title>Cronotermostato settimanale</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Cronotermostato_settimanale&amp;diff=7324"/>
		<updated>2021-01-06T18:11:22Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
!&amp;lt;source lang=[shell] gutter=false&amp;gt;&lt;br /&gt;
2018/01/07 08:35&lt;br /&gt;
&lt;br /&gt;
Temperatura: &lt;br /&gt;
          20.761&lt;br /&gt;
Umidita`: 43.102&lt;br /&gt;
&lt;br /&gt;
Relay:    off&lt;br /&gt;
SetPoint: 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Cronotermostato settimanale&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Device lettura temperatura/umidita`, controllo riscaldamento, visualizzazione su display lcd&lt;br /&gt;
|-&lt;br /&gt;
|Repository: https://github.com/raspibo/cronotermostato&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
= Descrizione =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=[shell]&amp;gt;gpio -v&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
Raspberry Pi Details:&lt;br /&gt;
Type: Model A+, Revision: 01, Memory: 256MB, Maker: Sony&lt;br /&gt;
  * Device tree is enabled.&lt;br /&gt;
  *--&amp;gt; Raspberry Pi Model A Plus Rev 1.1&lt;br /&gt;
  * This Raspberry Pi supports user-level GPIO access.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E` il tipo di [[Raspberry Pi]] utilizzato.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=[shell]&amp;gt;lsusb&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
  .. Ralink Technology, Corp. RT5370 Wireless Adapter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E` la chiave wifi [[Raspberry_PI-WiFi_Client#TP-LINK_TL-WN727N|TP-LINK_TL-WN727N]] usata.&lt;br /&gt;
&lt;br /&gt;
Legge temperatura e umidita` dal sensore [https://www.ebay.it/itm/I2C-GY-213V-HTU21D-SHT21-SI7021-HDC1080-SHT20-Temperature-Humidity-Sensor-/401364416322?var=&amp;amp;hash=item9c39e65c46 SHT20]&amp;lt;br/&amp;gt;&lt;br /&gt;
Visualizza su un piccolo [https://www.ebay.it/itm/1-44-Red-Serial-128X128-SPI-Color-TFT-LCD-Module-Display-Replace-Nokia-5110-LCD-/310876068105?hash=item4861a85909 display lcd 128x128 pixel (8 righe 16 colonne)]&amp;lt;br/&amp;gt;&lt;br /&gt;
Trasmette i valori via MQTT alla [[Centralina livello 1]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Gestisce un'uscita per comando riscaldamento&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La particolarita` di questo progetto, e` che la programmazione delle temperature non ha vincoli e puo` essere anche prevista al minuto (per esempio si puo` scrivere nell'orario: &amp;quot;09:23&amp;quot; (il programma guarda che ore sono e che temperatura era impostata nell'orario inferiore all'attuale).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tranne la chiave wifi, tutto il resto dei componenti dovrebbe essere indicato nel ..&lt;br /&gt;
&lt;br /&gt;
= Circuito elettrico/elettronico =&lt;br /&gt;
&lt;br /&gt;
[[File:rpi2dev_tmp.pdf]] '''Contiene un'errore, la resistenza R3 e` da 1k''' (purtroppo la nuova versione di kicad non ritrova i simboli/librerie e ha pure modificato altre cose, quindi per ora non aggiorno il pdf).&lt;br /&gt;
&lt;br /&gt;
Il sensore [https://www.sensirion.com/en/environmental-sensors/humidity-sensors/humidity-temperature-sensor-sht2x-digital-i2c-accurate/ SHT20] richiede resistenze di pull-up sul collegamento I2C (SDA, SCL), non ci sono perche` sono gia` presenti nel [[Raspberry Pi]].&lt;br /&gt;
&lt;br /&gt;
Al momento in cui scrivo il circuito e` completo di annotazioni per la fase di test (in corso).&amp;lt;br/&amp;gt;&lt;br /&gt;
''(Terminata questa, la seconda sara` di effettuare rilievi di funzionamento dell'attuale cronotermostato, solo successivamente, terza e ultima fase, andra` a sostituirlo)''&lt;br /&gt;
&lt;br /&gt;
'''S'e` resa necessaria la sostituzione causa guasto al termostato esistente''', ho eliminato il feedback dell'uscita che in questo contesto ha perso senso (ho configurato i rele` in e out sul medesimo gpio 17), per ora funziona.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
Come noterete dal [https://github.com/raspibo/cronotermostato repository dei files], e` scritto in &amp;quot;bash&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; [https://github.com/raspibo/cronotermostato/blob/master/cronotermostato.sh cronotermostato.sh]&lt;br /&gt;
: Programma principale, e` l'unico da eseguire, gli altri sono di contorno ed utilizzati da questo.&lt;br /&gt;
; [https://github.com/raspibo/cronotermostato/blob/master/cronotermostato.conf cronotermostato.conf]&lt;br /&gt;
: File di configurazione (parametrizzazione) dello script principale, e` possibile:&lt;br /&gt;
:: Selezionare se inviare dati a [[Centralina livello 1]]&lt;br /&gt;
:: Cambiare tempi&lt;br /&gt;
:: Cambiare identificatori&lt;br /&gt;
:: .. e altro (credo sia abbastanza commentato).&lt;br /&gt;
; [https://github.com/raspibo/cronotermostato/blob/master/help.sh help.sh]&lt;br /&gt;
: Ho voluto mantenere separato dal programma principale le visualizzazioni di aiuto (perche` le modifico/avo spesso)&lt;br /&gt;
; [https://github.com/raspibo/cronotermostato/blob/master/program7d.txt program7d.txt]&lt;br /&gt;
: File di programma settimanale, contiene le programmazioni giornaliere/orarie del termostato.&lt;br /&gt;
; [https://github.com/raspibo/cronotermostato/blob/master/cecho.sh cecho.sh]&lt;br /&gt;
; [https://github.com/raspibo/cronotermostato/blob/master/mvcursor.sh mvcursor.sh]&lt;br /&gt;
: Sono script di controllo della visualizzazione in console, il primo si coccupa della colorazione dei testi (ma non funziona su tutte), il secondo degli spostamenti cursore.&lt;br /&gt;
; [https://github.com/raspibo/cronotermostato/blob/master/sht20_rh.sh sht20_rh.sh]&lt;br /&gt;
; [https://github.com/raspibo/cronotermostato/blob/master/sht20_t.sh sht20_t.sh]&lt;br /&gt;
: Umidita` relativa e Temperatura, questi si occupano di leggere il sensore SHT20 (i2c), ho preferito mantenerli indipendenti dal tutto il resto.&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
Per il [[Raspberry Pi]] ho utilizzato la [https://www.raspberrypi.org/downloads/raspbian/ Raspbian Stretch Lite (Minimal image based on Debian Stretch)], non sto` a spiegare come si installa, e` gia` spiegato ovunque in rete, credo anche in questo wiki, da qualche parte.&lt;br /&gt;
&lt;br /&gt;
Per installare il programma del cronotermostato in oggetto e` sufficiente scaricarlo (sul proprio [[Raspberry Pi]]), oppure clonare il repository git (git clone https://github.com/raspibo/cronotermostato.git), nella directory che preferite.&lt;br /&gt;
&lt;br /&gt;
Nel [[Raspberry Pi]] dovremo sistemare alcune cose prima di eseguire il programma:&lt;br /&gt;
* Attivare SPI&lt;br /&gt;
* Attivare I2C&lt;br /&gt;
Potete farlo eseguendo (da utente root, oppure fate precedere il comando da &amp;quot;sudo&amp;quot;):&lt;br /&gt;
&amp;lt;source lang=[shell]&amp;gt;sudo raspi-config&amp;lt;/source&amp;gt;&lt;br /&gt;
selezionate l'opzione 5, poi P4, poi P5 (dovrete ricominciare da capo perche` ad ogni selezione sarete rimandati alla prima pagina di scelta).&amp;lt;br/&amp;gt;&lt;br /&gt;
Se volte farlo a mano, abilitate le righe:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
dtparam=i2c_arm=on&lt;br /&gt;
dtparam=spi=on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
nel file &amp;quot;/boot/config.txt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Nel mio caso (Raspbian Lite) ho dovuto installare qualche pacchetto software accessorio (spero di non averne dimenticati):&lt;br /&gt;
;Necessari&lt;br /&gt;
&amp;lt;source lang=[shell]&amp;gt;apt-get install bc i2c-tools mosquitto-clients wiringpi fbset&amp;lt;/source&amp;gt;&lt;br /&gt;
;Opzionali&lt;br /&gt;
&amp;lt;source lang=[shell]&amp;gt;apt-get install git&amp;lt;/source&amp;gt;&lt;br /&gt;
;Sicuramente non necessari&lt;br /&gt;
&amp;lt;source lang=[shell]&amp;gt;apt-get install fim fbi tio python3-serial imagemagick tput cadubi screen tmux figlet toilet aria2 fbterm&amp;lt;/source&amp;gt;&lt;br /&gt;
:Potrebbero servire per visualizzazioni immagini sul display lcd e trasmissioni/letture seriali&lt;br /&gt;
&lt;br /&gt;
;Note&lt;br /&gt;
:Ho aggiunto lo user &amp;quot;pi&amp;quot; al gruppo &amp;quot;tty&amp;quot;, per scrivere da qualsiasi terminale sulla tty0 (es.: echo &amp;quot;testo&amp;quot; &amp;gt;&amp;gt; /dev/tty0 ).&lt;br /&gt;
:fbi, fim, visualizzano immagini tramite framebuffer&lt;br /&gt;
:imagemagick, pensavo di usarlo per convertire il testo in immagini ... (poi ho preferito, per ora, non usare immagini)&lt;br /&gt;
&lt;br /&gt;
=== Configurazione wifi ===&lt;br /&gt;
Modificato &amp;quot;/etc/network/interfaces&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# interfaces(5) file used by ifup(8) and ifdown(8)&lt;br /&gt;
&lt;br /&gt;
# Please note that this file is written to be used with dhcpcd&lt;br /&gt;
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'&lt;br /&gt;
&lt;br /&gt;
# Include files from /etc/network/interfaces.d:&lt;br /&gt;
source-directory /etc/network/interfaces.d&lt;br /&gt;
&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
#allow-hotplug eth0&lt;br /&gt;
#iface eth0 inet dhcp&lt;br /&gt;
&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet manual&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
allow-hotplug wlan1&lt;br /&gt;
iface wlan1 inet manual&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Trovate due &amp;quot;wlan&amp;quot; perche` per accelerare le sperimentazioni (install e setup) ho usato un Raspberry Pi Versione 3, potete omettere le righe che riguardano la seconda &amp;quot;wlan&amp;quot; (wlan1), o lasciatele, male non fanno.&lt;br /&gt;
&lt;br /&gt;
Aggiunto/modificato &amp;quot;/etc/wpa_supplicant/wpa_supplicant.conf&amp;quot;, ricordateVi di mettere la vostra rete e password dove indicato:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
country=IT&lt;br /&gt;
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev&lt;br /&gt;
update_config=1&lt;br /&gt;
&lt;br /&gt;
network={&lt;br /&gt;
    ssid=&amp;quot;&amp;lt;VOSTRO IDENTIFICATIVO RETE WIFI&amp;gt;&amp;quot;&lt;br /&gt;
    psk=&amp;quot;&amp;lt;VOSTRA PASSWORD RETE WIFI&amp;gt;&amp;quot;&lt;br /&gt;
    key_mgmt=WPA-PSK&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configurazione display ===&lt;br /&gt;
&lt;br /&gt;
Ho scelto la via piu` breve, usare il file &amp;quot;/etc/rc.local&amp;quot;, cui ho aggiunto le seguenti righe, prima dell'ultima &amp;quot;exit 0&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Carica il display LCD, non so come, ma finisce in &amp;quot;fb1&amp;quot;&lt;br /&gt;
modprobe fbtft_device custom name=s6d02a1 gpios=reset:25,dc:24,led:23 width=128 height=128 rotate=270&lt;br /&gt;
#dmesg | tail -10 # Check messages&lt;br /&gt;
# Ritardo 3 secondi per il caricamento di &amp;quot;fb device&amp;quot; ..&lt;br /&gt;
#sleep 3&lt;br /&gt;
#con2fbmap 1 1 # Mappa la console 1 sul framebuffer 1&lt;br /&gt;
&lt;br /&gt;
# Disable savescreen&lt;br /&gt;
/usr/bin/setterm -blank 0 -powerdown 0 -powersave off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notare la disattivazione dello screen saver e del power off, perche` il display lo tengo sempre acceso (ho fatto testi che si visualizzano a colorazione random).&lt;br /&gt;
&lt;br /&gt;
=== Configurazione autologin ===&lt;br /&gt;
&lt;br /&gt;
Ho creato il file &amp;quot;/etc/systemd/system/getty@tty1.service.d/override.conf&amp;quot;, con questo contenuto:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=&lt;br /&gt;
ExecStart=-/sbin/agetty -a pi --noclear %I $TERM&lt;br /&gt;
Type=idle&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurazione autostart cronotermostato ===&lt;br /&gt;
&lt;br /&gt;
Nella directory utente (&amp;quot;pi&amp;quot; ovviamente), ho modificato il file &amp;quot;.profile&amp;quot;, aggiungendo le righe seguenti:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Start cronotermostato&lt;br /&gt;
CTPRG=cronotermostato&lt;br /&gt;
CTPATH=&amp;quot;/home/pi/projects/cronotermostato&amp;quot;&lt;br /&gt;
PATH=&amp;quot;$PATH:$CTPATH&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$CTPRG[.]sh&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato \&amp;quot;$CTPRG\&amp;quot;, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio $CTPRG&amp;quot;&lt;br /&gt;
                cd $CTPATH&lt;br /&gt;
                # La linea seguente e` messa fuori dal IF, perche` finche` faccio prove ..&lt;br /&gt;
                #PATH=&amp;quot;$PATH:`pwd`&amp;quot; # oppure potevo metterlo/farlo cosi`: PATH=&amp;quot;$PATH:$CTPATH&amp;quot;&lt;br /&gt;
                ./$CTPRG.sh&lt;br /&gt;
                # Non e` installato e da decidere se e come usarlo.&lt;br /&gt;
                #redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio $CTPRG&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [Opzionale] Disattivare lo swapfile ===&lt;br /&gt;
&lt;br /&gt;
Per far durare di piu` la SD Card.&lt;br /&gt;
&lt;br /&gt;
[[Raspberry_PI-Raspbian-Personalizzazioni#Swapfile]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Configurazione ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Note hardware e software ==&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Promemoria Chiavi/Codici =&lt;br /&gt;
&lt;br /&gt;
[[Centralina_livello_1#Topic_.28mqtt.29|Topic (mqtt)]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina_livello_1/Notes#Chiavi_e_codici.2C_esempi_da_ultimo_device|Chiavi e codici, esempi da ultimo device]]&lt;br /&gt;
&lt;br /&gt;
= Riferimenti =&lt;br /&gt;
&lt;br /&gt;
* [[Centralina livello 1]]&lt;br /&gt;
* [[Display LCD SPI a colori]]&lt;br /&gt;
* [https://github.com/notro/fbtft/wiki Linux Framebuffer drivers for small TFT LCD display modules]&lt;br /&gt;
* [http://www.pluto.it/files/ildp/guide/abs/index.html Guida avanzata di scripting Bash]&lt;br /&gt;
* [http://www.pluto.it/files/ildp/HOWTO/Bash-Prog-Intro-HOWTO/Bash-Prog-Intro-HOWTO.html BASH Programming - Introduction HOWTO]&lt;br /&gt;
* [http://wiki.bash-hackers.org/howto/conffile Config files for your script]&lt;br /&gt;
* [https://storma.wordpress.com/2012/11/28/debian-systemd-autologin-without-a-display-manager/ Debian systemd autologin without a display manager]&lt;br /&gt;
* [https://www.sensirion.com/en/environmental-sensors/humidity-sensors/humidity-temperature-sensor-sht2x-digital-i2c-accurate/ SHT20]&lt;br /&gt;
* [https://www.ebay.it/itm/I2C-GY-213V-HTU21D-SHT21-SI7021-HDC1080-SHT20-Temperature-Humidity-Sensor-/401364416322?var=&amp;amp;hash=item9c39e65c46 SHT20 ebay]&lt;br /&gt;
* [https://www.ebay.it/itm/1-44-Red-Serial-128X128-SPI-Color-TFT-LCD-Module-Display-Replace-Nokia-5110-LCD-/310876068105?hash=item4861a85909 Display LCD 1,44&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7288</id>
		<title>Centralina livello 1</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7288"/>
		<updated>2020-09-28T15:22:58Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Install */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
![[File:Livello1-Debug.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Centralina livello 1&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Centralina generale (?) gestione segnali&lt;br /&gt;
|-&lt;br /&gt;
|Repository: https://github.com/raspibo/Livello1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
= Centralina  livello 1 =&lt;br /&gt;
&lt;br /&gt;
;ATTENZIONE&lt;br /&gt;
:Tutte le immagini sono puramente indicative, il progetto e` in pieno sviluppo, tutto e` passibile di modifiche, anche sostanziali.&lt;br /&gt;
:L'immagine di presentazione si riferisce alla sezione &amp;quot;debug&amp;quot;, realizzata con Dokuwiki e (ad oggi) non fa parte del progetto (o si ?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prima e sommaria descrizione ==&lt;br /&gt;
&lt;br /&gt;
Centralina di controllo segnali.&lt;br /&gt;
&lt;br /&gt;
:(Ad oggi)&lt;br /&gt;
:Acquisisce segnali, li suddivide in gruppi mono o multi utenza, dei quali: realizza grafici temporali, crea e gestisce allarmi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dal campo arrivano i valori della 'sensoristica' sottoforma di &amp;quot;Identificatore Valore&amp;quot;, da queste informazioni sono aggiunti i sensori che eventualmente non sono presenti e le relative 'liste' dei valori (sono generate due chiavi, una dell'utenza e l'altra dei valori), altrimenti viene solo accodato il valore nella rispettiva lista (aggiungendo data-ora-minuti-secondi).&lt;br /&gt;
&lt;br /&gt;
Acquisiti i sensori, e` possibile il loro raggruppamento (anche una sola utenza) ed il campionamento dei valori a tempi prestabiliti (generazione grafici tempo/valore).&lt;br /&gt;
&lt;br /&gt;
Sempre previo raggruppamento (sempre &amp;quot;anche di un solo sensore&amp;quot;), e` possibile attivare/disattivare i relativi allarmi, il classico ON/OFF, ma anche un'automatico (che per esempio attivi i sensori del solaio/cantine dalle 20 alle 8, quando e` certo che nessuno si rechi in quegli spazi).&lt;br /&gt;
&lt;br /&gt;
E poi il resto .. che sarebbe di arrivare non solo a leggere/interpretare segnali, ma anche a pilotare utenze (luci, serrande, elettrodomestici, ...)&lt;br /&gt;
&lt;br /&gt;
L'idea e` che tutto questo sia gestibile da:&lt;br /&gt;
# interfaccia web&lt;br /&gt;
#* browser&lt;br /&gt;
#* cellulare&lt;br /&gt;
# linea di comando&lt;br /&gt;
# terminali operatore (display+tastiere)&lt;br /&gt;
# pulsanti, lampade, selettori, ..&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
== Hardware e Software ==&lt;br /&gt;
&lt;br /&gt;
;Hardware&lt;br /&gt;
:Versione 1 - [[Raspberry Pi 3]], perche` completa di WiFi e Bluetooth&lt;br /&gt;
:Versione 2 (2018) - [[Raspberry Pi]] con chiavetta WiFi&lt;br /&gt;
&lt;br /&gt;
;Software&lt;br /&gt;
:MQTT Broker (Mosquitto), perche` in grado di dialogare con la maggior parte dei componenti (Arduino, ESP8266, eccetera)&lt;br /&gt;
:Redis, perche` servira` un database di appoggio e manipolazione per alcuni dati, e perche` servira` una struttura dati &amp;quot;manipolabile&amp;quot; (dovremo poter aggiungere e togliere &amp;quot;campi:valori&amp;quot; ad una &amp;quot;chiave&amp;quot;, e aggiungere/togliere chiavi a delle liste, ecc. ecc.)&lt;br /&gt;
:Nginx, non si puo` fare senza web server&lt;br /&gt;
:... e poi non so cos'altro&lt;br /&gt;
:Script cgi&lt;br /&gt;
:javascript&lt;br /&gt;
: ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Embedded page --&amp;gt;&lt;br /&gt;
{{:Raspberry_Pi-Raspbian_default_post-install}}&lt;br /&gt;
&lt;br /&gt;
== Access Point ==&lt;br /&gt;
&lt;br /&gt;
Installato/configurato &amp;quot;[[Raspberry Pi Access Point WEP2]]&amp;quot;, sfruttando il wifi integrato nel [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
Installazione dei pacchetti utili, necessari (e qualcuno inutile):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt install nginx fcgiwrap redis-server python3-redis mosquitto ssl-cert php-fpm php7.3-xml python3-pip python3-paho-mqtt python3-pandas python3-cairosvg python3-tinycss python3-cssselect git mosquitto-clients redis-tools&lt;br /&gt;
pip3 install python-telegram-bot pygal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E` stato installato manualmente anche [http://www.dokuwiki.org dokuwiki], utilizzato per segnarsi appunti vari (e un po` di debug), e` facoltativo e non descritto le operazioni necessarie, ma i files di configurazione del web server si.&lt;br /&gt;
&lt;br /&gt;
E` necessario scaricare il repository con i programmi (script python per lo piu`), si puo` fare da normale utente, per esempio:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/Livello1.git&lt;br /&gt;
cd Livello1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/level1 /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-enabled/level1 /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/dokuwiki* etc/nginx/fcgiwrap.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
==== Level1 (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu var/www/ /var/&lt;br /&gt;
chown www-data:www-data -R /var/www/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serve anche la scrittura in &amp;quot;www&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chmod 775 /var/www&lt;br /&gt;
chown :www-data -R /var/www    # oppure si poteva eliminare il &amp;quot;/&amp;quot; dal &amp;quot;chown&amp;quot; precedente&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
:Potrebbe essere necessario creare la directory &amp;quot;/var/www/archive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
All'avvio del sistema, devono andare in esecuzione alcuni script (quasi &amp;quot;daemons&amp;quot;) e rimanere attivi, per questo si deve modificare il file &amp;quot;/etc/rc.local&amp;quot; (lo trovate nel repository git):&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Power On &amp;quot;Level 1&amp;quot;&lt;br /&gt;
DAEMON_NAME=mqtt2redis_d&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviata correttamente Livello 1, oppure mqtt2redis_d e\` gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio \&amp;quot;mqtt2redis_d\&amp;quot;&amp;quot;&lt;br /&gt;
                #/var/www/cgi-bin/mqtt2redis_init.d.sh start # 20180115&lt;br /&gt;
        su -c &amp;quot;/var/www/cgi-bin/mqtt2redis_init.d.sh start&amp;quot; pi&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Centralina level 1 [ri]avviata ..&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Start Telegram Bot&lt;br /&gt;
DAEMON_NAME=bot4livello1&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato il Telegram Bot, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio Telegram Bot&amp;quot;&lt;br /&gt;
                cd /home/pi/project/csv2image2telegram&lt;br /&gt;
                su pi -c &amp;quot;python3 bot4livello1.py &amp;amp;&amp;quot;&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio bot4livello1.py&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inoltre, visto che puo` capitare s'interrompano, specialmente nelle prove di nuovi [[Centralina_livello_1#Devices|devices]], sono predisposti dei &amp;quot;check orari&amp;quot; che nel caso, li riavviano:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.hourly/mqtt2redis_check /etc/cron.hourly/&lt;br /&gt;
cp -vapu etc/cron.hourly/bot4livello1_check /etc/cron.hourly/ # se installerete anche il bot telegram&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Backup ====&lt;br /&gt;
&lt;br /&gt;
Oltre ad un &amp;quot;backup&amp;quot; che si occupa di salvare tutti i computer's della rete, ho aggiunto uno script per salvare giornalmente il database redis, come ulteriore sicurezza, i files sono salvati nella directory &amp;quot;/root&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.daily/backupredis /etc/cron.daily/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rete ==&lt;br /&gt;
&lt;br /&gt;
Al momento e` previsto che sia tutto sotto WiFi (quella onboard) del [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
Comunque bastera` modificare il firewall per accettare dati dalla ethernet se si rendesse necessario.&lt;br /&gt;
&lt;br /&gt;
Le centrali accessorie, tipo quella di [[CentRed|allarme]], che deve solo ricevere, non necessariamente dovranno trovarsi nella sottorete gestita da &amp;quot;livello 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Descrizione ==&lt;br /&gt;
&lt;br /&gt;
I 'segnali' arrivano sempre (?) a &amp;quot;MQTT broker&amp;quot;, vengono manipolati se necessario, ed inseriti nel database Redis.&lt;br /&gt;
&lt;br /&gt;
Dal database Redis sono di nuovo letti/scritti/modificati/manipolati ed inviati:&lt;br /&gt;
:e/o&lt;br /&gt;
::in report (testo, grafico, audio, video, ...)&lt;br /&gt;
:e/o&lt;br /&gt;
::alla centralina di allarme [[CentRed]]&lt;br /&gt;
:e/o&lt;br /&gt;
::reinviati a MQTT broker&lt;br /&gt;
:e/o&lt;br /&gt;
::inviati ad altre centraline livello 1&lt;br /&gt;
:e/o&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
=== Configurazione e Funzionamento ===&lt;br /&gt;
&lt;br /&gt;
(Sommariamente)&lt;br /&gt;
&lt;br /&gt;
Al primo avvio e` necesssario configurare prima il database Redis da utilizzare, poi quello della [[CentRed|centralina avvisi/allarmi]] (se avete intenzione di ricevere le comunicazioni relative agli allarmi e/o avvisi di malfunzionamenti).&lt;br /&gt;
&lt;br /&gt;
Una volta &amp;quot;letti&amp;quot; i segnali, e` opera dell'utente aggiungere alcune caratteristiche [[#Segnali]], fatto questo si passa alla creazione dei [[#Gruppi]].&lt;br /&gt;
&lt;br /&gt;
Definiti i [[#Gruppi]], si passa ad avviare i servizi necessari [[#Daemons]], che si occupano di generare i grafici Tempo-Valore/i o gestione degli allarmi/anomalie.&lt;br /&gt;
&lt;br /&gt;
== Arrivo dati e manipolazione ==&lt;br /&gt;
&lt;br /&gt;
I dati devono arrivare al broker MQTT nel formato:&lt;br /&gt;
&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
inviati nel topic:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fate riferimento alla [[#Tabella dati e valori]] per comprendere meglio il significato.&lt;br /&gt;
&lt;br /&gt;
Nell'immagine, una schermata dei test in corso, a sinistra gli errori di lettura, a destra un listato della &amp;quot;cgi-bin&amp;quot;, sotto i falsi dati inviati (mi servono per i test che sto` facendo ;) ), e in fondo i dati ricevuti (veri e falsi).&lt;br /&gt;
&lt;br /&gt;
[[File:Level1 201604170814.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mqtt2redis_d.py ===&lt;br /&gt;
&lt;br /&gt;
I dati MQTT vengono letti dal programma &amp;quot;mqtt2redis_d.py&amp;quot; che deve sempre essere in esecuzione (ho gia` preparato anche un &amp;quot;init.d&amp;quot;, che tengo ancora nella &amp;quot;cgi-bin&amp;quot;), questi li manipola inserendoli se non presenti, in due &amp;quot;chiavi&amp;quot; nel database (noSQL) Redis, la prima, e` per identificare il segnale:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
la seconda e` quella dei valori:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
valori che sono accodati ad ogni arrivo con l'aggiunta della data e ora, predisposti per una generazione di output in formato &amp;quot;csv&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== ''IMPORTANTE'' ==&lt;br /&gt;
&lt;br /&gt;
''Quello che segue non e` aggiornato di pari passo con l'aggiornamento del software e quant'altro necessario.''&lt;br /&gt;
&lt;br /&gt;
''Durante l'uso, nelle pagine di configurazione e modifica compaiono delle descrizioni che sono piu` veritiere/aggiornate, perche` scritte durante la stesura e/o modifica del software.''&lt;br /&gt;
&lt;br /&gt;
== Segnali ==&lt;br /&gt;
&lt;br /&gt;
Una volta pervenuto il primo valore di un segnale, e` possibile configurarlo inserendo alcuni dati che non sono presenti nella comunicazione MQTT:&lt;br /&gt;
&lt;br /&gt;
;Descrizione&lt;br /&gt;
:Meglio se breve, perche` usata anche nei riferimenti dei grafici, non solo per gli allarmi (per esempio: &amp;quot;ST1 Cucina&amp;quot; per sensore temperatura in cucina)&lt;br /&gt;
;UM (Unita` di misura)&lt;br /&gt;
;TempoRitardo&lt;br /&gt;
:Ancora non usata&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Specificare il range dei valori nel formato 0,100&lt;br /&gt;
:Utile per sonde che (per esempio) lavorano da 0 a 100 gradi&lt;br /&gt;
:Genera avviso/allarme se minore di o maggiore di&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Avviso se valore e` inferiore a quello impostato&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Aavviso se valore e` superiore a quello impostato&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:Previsto per i segnali analogici o negati&lt;br /&gt;
:Avviso quando valore uguale a ValoreOn&lt;br /&gt;
;Allarme&lt;br /&gt;
:Definire qua i valori che saranno usati come allarmi, per esempio: ValoreOn,ValoreMin&lt;br /&gt;
:Se sono impostati, ma non indicati qua, sono emessi dei semplici avvisi&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sonda temperatura (ovviamente falsa):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashTempMod Falsa2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sensore di movimento (pir, ovviamente falso):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashPirMod Falso2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
== Gruppi ==&lt;br /&gt;
&lt;br /&gt;
Per realizzare i raggruppamenti ho utilizzato le chiavi Redis di tipo &amp;quot;sets&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Al momento ho pensato ai soli gruppi riguardanti gli allarmi e i grafici (per esempio quelli di due o piu`, sonde di temperatura).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Puoi benissimo creare un gruppo con un solo sensore.&lt;br /&gt;
&lt;br /&gt;
Al solito, ho pensato ad una chiave univoca d'inserimento dei dati in Redis '''sets:type:ID''' (gruppo:tipo:identificatore).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gruppo&lt;br /&gt;
|&lt;br /&gt;
* sets&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* alarms&lt;br /&gt;
* graph&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore)&lt;br /&gt;
|&lt;br /&gt;
(definito da utente, esempi:)&lt;br /&gt;
* TemperatureBagno&lt;br /&gt;
* TemperaturePianoTerra&lt;br /&gt;
* luigi&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I gruppi sono definiti dall'utente, ed ogni volta che viene creato un nuovo gruppo (deve avere almeno un'utenza altrimenti si autoelimina), viene gia` creato il &amp;quot;Timer&amp;quot; di &amp;quot;campionamento&amp;quot;/&amp;quot;ritardo nuovo allarme&amp;quot;, preimpostato a 5 minuti (sono previsti valori da 1 a 60 minuti).&lt;br /&gt;
&lt;br /&gt;
''La pagina d'inserimento permette di inserire una chiave con un nome qualsiasi, non ho ancora &amp;quot;bloccato&amp;quot; e/o previsto un controllo sull'identificatore assegnato.''&lt;br /&gt;
&lt;br /&gt;
=== sets:*:ID:Config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Timer&lt;br /&gt;
|&lt;br /&gt;
* da 1 60 minuti&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Funzionamento&lt;br /&gt;
|&lt;br /&gt;
* On&lt;br /&gt;
* Off&lt;br /&gt;
* Auto&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) dalle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) alle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;graph&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
La chiave per questi gruppi e` previsto che sia: '''sets:graph:ID'''&lt;br /&gt;
&lt;br /&gt;
La chiave per il timer di campionamento e` previsto che sia: '''sets:graph:ID:Timer''' (ora e` generata automaticamente)&lt;br /&gt;
&lt;br /&gt;
La chiave per i dati campionati e la generazione del grafico (che sara` in formato csv) e` previsto che sia: '''sets:graph:ID:Valori''' (sara` creata ed aggiornata autonomamente, da un programma in python)&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;alarms&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Al momento come sopra, tranne che il Timer non servira` (o forse si, perche` sono previsti anche grafici dei PIR).&lt;br /&gt;
&lt;br /&gt;
==== Esempio d'inserimento gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Aggiungi chiavi &amp;quot;sets&amp;quot; Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysAddSets 1.png&lt;br /&gt;
File:Livello1-KeysAddSets 2.png&lt;br /&gt;
File:Livello1-KeysAddSets 3.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
::Nell'immagine e` gia` stato applicato il filtro '''*:graph:*'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModHash 1.png|Spostiamoci verso il basso e selezioniamo la seconda voce di modifica delle chiavi &amp;quot;hash&amp;quot;, quella relativa al &amp;quot;Config&amp;quot;:&lt;br /&gt;
File:Livello1-KeysModHash 2.png&lt;br /&gt;
File:Livello1-KeysModHash 3.png|e l'esempio di un allarme:&lt;br /&gt;
File:Livello1-KeysModHash 3a.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modifica di un gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModSets 2.png&lt;br /&gt;
File:Livello1-KeysModSets 3.png|Credo si spieghi da sola ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Daemons ==&lt;br /&gt;
&lt;br /&gt;
Intanto: non sono veri e propri &amp;quot;demoni&amp;quot;, sono script che l'utente avvia e ferma al bisogno.&lt;br /&gt;
&lt;br /&gt;
Specialmente quello degli allarmi (che mi sta` rompendo al cellulare da stamattina ;) ), e` da avviare quando uscite di casa, e fermare prima di rientrare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Daemons part1.png&lt;br /&gt;
File:Livello1-Daemons part2.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grafici (files .csv) ==&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;TIP&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Allarmi ==&lt;br /&gt;
&lt;br /&gt;
Per ogni gruppo creato, e` possibile eseguire il controllo allarmi, servono opportune preimpostazioni (configurazioni), poi e` possibile eseguire il software dalla pagina '''Daemons''':&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-Allarmi-Daemons.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Si puo` notare in esecuzione solo quello relativo ad una falsa sonda di temperatura, relativo ai [[Centralina livello 1/Test allarmi|test eseguiti]].&lt;br /&gt;
&lt;br /&gt;
L'eseguibile e` &amp;quot;/var/www/cgi-bin/setsalarms_d.py&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== setsalarms_d.py ===&lt;br /&gt;
&lt;br /&gt;
Perche` possa &amp;quot;funzionare&amp;quot; servono alcuni requisiti:&lt;br /&gt;
*Deve esistere il gruppo ed avere una configurazione (che e` preimpostata alla creazione)&lt;br /&gt;
*Il gruppo deve essere &amp;quot;on&amp;quot; o in modalita` &amp;quot;auto&amp;quot; (per default e` &amp;quot;off&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Tutti sono avvisi (li ho chiamati &amp;quot;alert&amp;quot;), alcuni possono e devono invece diventare allarmi (&amp;quot;alarm&amp;quot;). Perche` siano definiti allarmi, devono essere inseriti nella voce &amp;quot;Allarme&amp;quot;, presente nella configurazione della sonda (sensore, PIR, o quello che e`).&lt;br /&gt;
&lt;br /&gt;
Tipi di &amp;quot;alert&amp;quot;:&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero,[+-]Numero, una sonda 1wire pe esempio sarebbe: -55,+125&lt;br /&gt;
:;Alert&lt;br /&gt;
::Se il valore letto e` fuori dal range&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` inferiore&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` superiore&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:0 o 1&lt;br /&gt;
:Al momento e` previsto per sola sensoristica come: finecorsa, PIR, e altri segnali on/off&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` uguale&lt;br /&gt;
;Allarme&lt;br /&gt;
:Quello che e` allarme e non semplice avviso:&lt;br /&gt;
::ValoreOn&lt;br /&gt;
::ValoreMin&lt;br /&gt;
::ValoreMin,ValoreMax,ValoreOn&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
Per un'esempio di configurazione fate riferimento alla pagina [[Centralina livello 1/Test allarmi|Test Allarmi]].&lt;br /&gt;
&lt;br /&gt;
Il software invia gli avvisi/allarmi alla centralina [[CentRed]], e` questa poi ad occuparsi della trasmissione, discriminando il tipo dalla stringa con cui e` stato inviato. Altre informazioni alla pagina [[CentRed]].&lt;br /&gt;
&lt;br /&gt;
== Analizza e Modifica Valori ==&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto la possibilita` di manipolare i valori memorizzati nel database Redis.&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Selezione_Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sono ammesse solamente chiavi &amp;quot;:Valori&amp;quot;, la possibilita` di selezione dipende (al solito) dal filtro attivo nella pagina.&lt;br /&gt;
&lt;br /&gt;
Una volta scelta la chiave e cliccato su &amp;quot;Analizza e Modifica&amp;quot;, compare la pagina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dove e` possibile:&lt;br /&gt;
* Visualizzare tutti i valori&lt;br /&gt;
* Creare il file &amp;quot;.csv&amp;quot; da elaborare successivamente tramite l'apposita pagina&lt;br /&gt;
* Eliminare i dati ormai obsoleti (attenzione che non ho filtrato le immissioni, e` possibile anche fare il contrario)&lt;br /&gt;
&lt;br /&gt;
== Tabella dati e valori ==&lt;br /&gt;
&lt;br /&gt;
Denominazione dei campi e attibuzione dei valori standard (piu` o meno)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* Temperatura&lt;br /&gt;
* PIR&lt;br /&gt;
* Finecorsa&lt;br /&gt;
* Proximity&lt;br /&gt;
* Livello&lt;br /&gt;
* Rele`&lt;br /&gt;
* Termostato&lt;br /&gt;
* Valvola&lt;br /&gt;
* Motore&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione del segnale&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TipoIO&lt;br /&gt;
|&lt;br /&gt;
* I (Input/Ingresso)&lt;br /&gt;
* O (Output/Uscita)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segnale&lt;br /&gt;
|&lt;br /&gt;
* Analogico&lt;br /&gt;
* Digitale&lt;br /&gt;
* Testo&lt;br /&gt;
* I2C&lt;br /&gt;
* SPI&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Al momento l'ho soppresso, il tipo di segnale e` praticamente definito dal valore in entrata (per ora)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneC&lt;br /&gt;
|&lt;br /&gt;
* Casa&lt;br /&gt;
* Garage&lt;br /&gt;
* Giardino&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneP&lt;br /&gt;
|&lt;br /&gt;
* Piano0 / PianoZero&lt;br /&gt;
* Piano1 / PianoUno&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneS&lt;br /&gt;
|&lt;br /&gt;
* Cucina1&lt;br /&gt;
* Camera2&lt;br /&gt;
* Bagno1&lt;br /&gt;
* ...&lt;br /&gt;
* Cantina&lt;br /&gt;
* EsternoSala&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore, Utenza/ITEM)&lt;br /&gt;
|&lt;br /&gt;
* 1&lt;br /&gt;
* 2&lt;br /&gt;
* 3&lt;br /&gt;
* ..&lt;br /&gt;
* Up&lt;br /&gt;
* Down&lt;br /&gt;
* Left&lt;br /&gt;
* Right&lt;br /&gt;
* (altro ?)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Convenzioni usate ad oggi:&lt;br /&gt;
* STn sonda/sensore temperatura [n = numero]&lt;br /&gt;
* RHn sonda/sensore umidita` relativa [n = numero]&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Definito dall'utente che programma i &amp;quot;remote&amp;quot;, ma meglio definire una struttura di base ..&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valori&lt;br /&gt;
|&lt;br /&gt;
* TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori&lt;br /&gt;
|&lt;br /&gt;
Assegnato automaticamente dal programma&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UM (Unita` di Misura)&lt;br /&gt;
|&lt;br /&gt;
* °C&lt;br /&gt;
* V (tensione)&lt;br /&gt;
* A (assorbimento)&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Questo e` previsto solo per le segnalazioni/avvisi/allarmi .. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TempoRitardo (secondi)&lt;br /&gt;
|&lt;br /&gt;
* 0.000&lt;br /&gt;
* 1.002&lt;br /&gt;
* ...&lt;br /&gt;
* 99.000 (max impostabile)&lt;br /&gt;
|&lt;br /&gt;
Al momento non previsto, teoricamente i segnali dovrebbero arrivare gia` &amp;quot;filtrati&amp;quot; dai &amp;quot;remote&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! RangeValori&lt;br /&gt;
|&lt;br /&gt;
* 0,100&lt;br /&gt;
* -50,125&lt;br /&gt;
* 0,1&lt;br /&gt;
|&lt;br /&gt;
Da utilizzarsi per definire l'errore e generare una segnalazione di sonda guasta&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMin&lt;br /&gt;
|&lt;br /&gt;
* 10 (temperatura)&lt;br /&gt;
* 0 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sotto a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMax&lt;br /&gt;
|&lt;br /&gt;
* 40 (temperatura)&lt;br /&gt;
* 1 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sopra a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreOn&lt;br /&gt;
|&lt;br /&gt;
* 1 (quando attivo a segnale on)&lt;br /&gt;
* 0 (quando attivo a segnale off)&lt;br /&gt;
* [Valore]&lt;br /&gt;
|&lt;br /&gt;
Valore da utilizzare per alert/alarm, e per definire se si tratta di un segnale negato (zero) e trattarlo di conseguenza&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Allarme&lt;br /&gt;
|&lt;br /&gt;
* ValoreOn&lt;br /&gt;
* ValoreMin&lt;br /&gt;
* ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin&lt;br /&gt;
* ValoreOn,ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin,ValoreMax&lt;br /&gt;
* ValoreMin,ValoreMax&lt;br /&gt;
|&lt;br /&gt;
Quali sono da trattare come allarmi, di default, se impostati, sono trattati come alert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data (e ora)&lt;br /&gt;
|&lt;br /&gt;
* 2016/03/13 20:40:08&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valore&lt;br /&gt;
|&lt;br /&gt;
* 0&lt;br /&gt;
* 1&lt;br /&gt;
* 13&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Promemoria chiavi, codici e ... ==&lt;br /&gt;
&lt;br /&gt;
====== Dati (mqtt) ======&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Topic (mqtt) ======&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria segnale di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria gruppi di livello 1 (redis) ======&lt;br /&gt;
;TYPE&lt;br /&gt;
:graph&lt;br /&gt;
:alarms&lt;br /&gt;
'''sets:TYPE:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria configurazione gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Config'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Notes|Notes]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Primo avvio|Primo avvio]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Test allarmi|Test allarmi]]&lt;br /&gt;
&lt;br /&gt;
= Devices =&lt;br /&gt;
&lt;br /&gt;
Ad oggi, ho predisposto/preparato:&lt;br /&gt;
* [[PorTHable]], che invia valori di temperatura&lt;br /&gt;
* [[ ESP8266/DS1820toMQTT | DS1820toMQTT ]], sensore/i di temperatura&lt;br /&gt;
* [[ ESP8266/PIRtoMQTT | PIRtoMQTT ]], sensore di movimento (PIR)&lt;br /&gt;
* [[ ESP8266/SerialToMQTT_Repeater | SerialToMQTT Repeater ]], che funziona da &amp;quot;repeater&amp;quot;, ritrasmette i dati ricevuti via seriale al broker MQTT&lt;br /&gt;
* [[ Thermo ]], che invia il valore della temperatura (solo di riferimento ad oggi, non le altre sonde)&lt;br /&gt;
* [[ ENC28J60-ATMEGA328P-DS18B20 | ENC28J60 + ATMEGA328P + DS18B20 ]], sensore di temperatura in ethernet&lt;br /&gt;
* [[ Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | ATMEGA328P + ESP8266 + DHT + Rain]], sensore temperatura/umidita` (dht) e pioggia (rain)&lt;br /&gt;
* [[ ESP8266/DHT22toMQTT | DHT22toMQTT ]], sensore di temperatura e umidita`&lt;br /&gt;
* [[ Centralina_livello_1/Dev_HTRL_wAE | ATMEGA328P + ESP8266 + DHT + Rain + Photoresistor]], sensore temperatura/umidita` (dht), pioggia (rain) e luminosita` (photoresistor).&amp;lt;br&amp;gt; Nuova e migliorata (?) versione del precedente [[Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | device]]&lt;br /&gt;
* [[ Cronotermostato settimanale ]]&lt;br /&gt;
* [[ Centralina_livello_1/Centralina_livello_2_PIR | Centralina livello 2 - PIR ]]&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/telegram bot|Telegram Bot per Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
= Problemi e soluzioni ? =&lt;br /&gt;
&lt;br /&gt;
;Eliminazione file di swap&lt;br /&gt;
:Non so se sia stato un problema e sia utile&lt;br /&gt;
::[[Raspberry_PI-Raspbian-Personalizzazioni#Disattivazione|Disattivazione file di swap]]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore salvataggio in background&lt;br /&gt;
:[https://jee-appy.blogspot.it/2016/04/can-not-save-in-background-fork-redis.html Can't save in background: fork: Cannot allocate memory Redis]&lt;br /&gt;
:[https://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory redis bgsave failed because fork Cannot allocate memory]&lt;br /&gt;
:[https://stackoverflow.com/questions/19581059/misconf-redis-is-configured-to-save-rdb-snapshots MISCONF Redis is configured to save RDB snapshots]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore avvio del server&lt;br /&gt;
:Dopo un ripristino del sistema ho avuto dei problemi di permessi al file &amp;quot;dump.rdb&amp;quot; (che ho voluto ricopiare per riprendermi alcune impostazioni), ho reimpostato in &amp;quot;redis:redis&amp;quot; (directory &amp;quot;/var/lib/redis&amp;quot; inclusa) il proprietario e settato i permessi a 660.&lt;br /&gt;
&lt;br /&gt;
;I daemon non vengono eseguiti dalle pagine web&lt;br /&gt;
:Non sono stati corretti i permessi della directory del webserver &amp;quot;/var/www&amp;quot; [[#Level1_.28www.29]]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7287</id>
		<title>Centralina livello 1</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7287"/>
		<updated>2020-09-19T16:46:55Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Problemi e soluzioni ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
![[File:Livello1-Debug.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Centralina livello 1&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Centralina generale (?) gestione segnali&lt;br /&gt;
|-&lt;br /&gt;
|Repository: https://github.com/raspibo/Livello1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
= Centralina  livello 1 =&lt;br /&gt;
&lt;br /&gt;
;ATTENZIONE&lt;br /&gt;
:Tutte le immagini sono puramente indicative, il progetto e` in pieno sviluppo, tutto e` passibile di modifiche, anche sostanziali.&lt;br /&gt;
:L'immagine di presentazione si riferisce alla sezione &amp;quot;debug&amp;quot;, realizzata con Dokuwiki e (ad oggi) non fa parte del progetto (o si ?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prima e sommaria descrizione ==&lt;br /&gt;
&lt;br /&gt;
Centralina di controllo segnali.&lt;br /&gt;
&lt;br /&gt;
:(Ad oggi)&lt;br /&gt;
:Acquisisce segnali, li suddivide in gruppi mono o multi utenza, dei quali: realizza grafici temporali, crea e gestisce allarmi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dal campo arrivano i valori della 'sensoristica' sottoforma di &amp;quot;Identificatore Valore&amp;quot;, da queste informazioni sono aggiunti i sensori che eventualmente non sono presenti e le relative 'liste' dei valori (sono generate due chiavi, una dell'utenza e l'altra dei valori), altrimenti viene solo accodato il valore nella rispettiva lista (aggiungendo data-ora-minuti-secondi).&lt;br /&gt;
&lt;br /&gt;
Acquisiti i sensori, e` possibile il loro raggruppamento (anche una sola utenza) ed il campionamento dei valori a tempi prestabiliti (generazione grafici tempo/valore).&lt;br /&gt;
&lt;br /&gt;
Sempre previo raggruppamento (sempre &amp;quot;anche di un solo sensore&amp;quot;), e` possibile attivare/disattivare i relativi allarmi, il classico ON/OFF, ma anche un'automatico (che per esempio attivi i sensori del solaio/cantine dalle 20 alle 8, quando e` certo che nessuno si rechi in quegli spazi).&lt;br /&gt;
&lt;br /&gt;
E poi il resto .. che sarebbe di arrivare non solo a leggere/interpretare segnali, ma anche a pilotare utenze (luci, serrande, elettrodomestici, ...)&lt;br /&gt;
&lt;br /&gt;
L'idea e` che tutto questo sia gestibile da:&lt;br /&gt;
# interfaccia web&lt;br /&gt;
#* browser&lt;br /&gt;
#* cellulare&lt;br /&gt;
# linea di comando&lt;br /&gt;
# terminali operatore (display+tastiere)&lt;br /&gt;
# pulsanti, lampade, selettori, ..&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
== Hardware e Software ==&lt;br /&gt;
&lt;br /&gt;
;Hardware&lt;br /&gt;
:Versione 1 - [[Raspberry Pi 3]], perche` completa di WiFi e Bluetooth&lt;br /&gt;
:Versione 2 (2018) - [[Raspberry Pi]] con chiavetta WiFi&lt;br /&gt;
&lt;br /&gt;
;Software&lt;br /&gt;
:MQTT Broker (Mosquitto), perche` in grado di dialogare con la maggior parte dei componenti (Arduino, ESP8266, eccetera)&lt;br /&gt;
:Redis, perche` servira` un database di appoggio e manipolazione per alcuni dati, e perche` servira` una struttura dati &amp;quot;manipolabile&amp;quot; (dovremo poter aggiungere e togliere &amp;quot;campi:valori&amp;quot; ad una &amp;quot;chiave&amp;quot;, e aggiungere/togliere chiavi a delle liste, ecc. ecc.)&lt;br /&gt;
:Nginx, non si puo` fare senza web server&lt;br /&gt;
:... e poi non so cos'altro&lt;br /&gt;
:Script cgi&lt;br /&gt;
:javascript&lt;br /&gt;
: ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Embedded page --&amp;gt;&lt;br /&gt;
{{:Raspberry_Pi-Raspbian_default_post-install}}&lt;br /&gt;
&lt;br /&gt;
== Access Point ==&lt;br /&gt;
&lt;br /&gt;
Installato/configurato &amp;quot;[[Raspberry Pi Access Point WEP2]]&amp;quot;, sfruttando il wifi integrato nel [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
Installazione dei pacchetti utili, necessari (e qualcuno inutile):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get install nginx fcgiwrap redis-server python3-redis mosquitto paho-mqtt ssl-cert php-fpm php7.0-xml python3-pip python3-paho-mqtt python3-pandas python3-cairosvg python3-tinycss python3-cssselect git mosquitto-clients apt-file mc redis-tools aria2&lt;br /&gt;
pip3 install python-telegram-bot pygal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E` stato installato manualmente anche [http://www.dokuwiki.org dokuwiki], utilizzato per segnarsi appunti vari (e un po` di debug), e` facoltativo e non descritto le operazioni necessarie, ma i files di configurazione del web server si.&lt;br /&gt;
&lt;br /&gt;
E` necessario scaricare il repository con i programmi (script python per lo piu`), si puo` fare da normale utente, per esempio:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/Livello1.git&lt;br /&gt;
cd Livello1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/level1 /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-enabled/level1 /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/dokuwiki* etc/nginx/fcgiwrap.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
==== Level1 (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu var/www/ /var/&lt;br /&gt;
chown www-data:www-data -R /var/www/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serve anche la scrittura in &amp;quot;www&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chmod 775 /var/www&lt;br /&gt;
chown :www-data -R /var/www    # oppure si poteva eliminare il &amp;quot;/&amp;quot; dal &amp;quot;chown&amp;quot; precedente&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
:Potrebbe essere necessario creare la directory &amp;quot;/var/www/archive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
All'avvio del sistema, devono andare in esecuzione alcuni script (quasi &amp;quot;daemons&amp;quot;) e rimanere attivi, per questo si deve modificare il file &amp;quot;/etc/rc.local&amp;quot; (lo trovate nel repository git):&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Power On &amp;quot;Level 1&amp;quot;&lt;br /&gt;
DAEMON_NAME=mqtt2redis_d&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviata correttamente Livello 1, oppure mqtt2redis_d e\` gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio \&amp;quot;mqtt2redis_d\&amp;quot;&amp;quot;&lt;br /&gt;
                #/var/www/cgi-bin/mqtt2redis_init.d.sh start # 20180115&lt;br /&gt;
        su -c &amp;quot;/var/www/cgi-bin/mqtt2redis_init.d.sh start&amp;quot; pi&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Centralina level 1 [ri]avviata ..&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Start Telegram Bot&lt;br /&gt;
DAEMON_NAME=bot4livello1&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato il Telegram Bot, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio Telegram Bot&amp;quot;&lt;br /&gt;
                cd /home/pi/project/csv2image2telegram&lt;br /&gt;
                su pi -c &amp;quot;python3 bot4livello1.py &amp;amp;&amp;quot;&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio bot4livello1.py&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inoltre, visto che puo` capitare s'interrompano, specialmente nelle prove di nuovi [[Centralina_livello_1#Devices|devices]], sono predisposti dei &amp;quot;check orari&amp;quot; che nel caso, li riavviano:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.hourly/mqtt2redis_check /etc/cron.hourly/&lt;br /&gt;
cp -vapu etc/cron.hourly/bot4livello1_check /etc/cron.hourly/ # se installerete anche il bot telegram&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Backup ====&lt;br /&gt;
&lt;br /&gt;
Oltre ad un &amp;quot;backup&amp;quot; che si occupa di salvare tutti i computer's della rete, ho aggiunto uno script per salvare giornalmente il database redis, come ulteriore sicurezza, i files sono salvati nella directory &amp;quot;/root&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.daily/backupredis /etc/cron.daily/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rete ==&lt;br /&gt;
&lt;br /&gt;
Al momento e` previsto che sia tutto sotto WiFi (quella onboard) del [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
Comunque bastera` modificare il firewall per accettare dati dalla ethernet se si rendesse necessario.&lt;br /&gt;
&lt;br /&gt;
Le centrali accessorie, tipo quella di [[CentRed|allarme]], che deve solo ricevere, non necessariamente dovranno trovarsi nella sottorete gestita da &amp;quot;livello 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Descrizione ==&lt;br /&gt;
&lt;br /&gt;
I 'segnali' arrivano sempre (?) a &amp;quot;MQTT broker&amp;quot;, vengono manipolati se necessario, ed inseriti nel database Redis.&lt;br /&gt;
&lt;br /&gt;
Dal database Redis sono di nuovo letti/scritti/modificati/manipolati ed inviati:&lt;br /&gt;
:e/o&lt;br /&gt;
::in report (testo, grafico, audio, video, ...)&lt;br /&gt;
:e/o&lt;br /&gt;
::alla centralina di allarme [[CentRed]]&lt;br /&gt;
:e/o&lt;br /&gt;
::reinviati a MQTT broker&lt;br /&gt;
:e/o&lt;br /&gt;
::inviati ad altre centraline livello 1&lt;br /&gt;
:e/o&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
=== Configurazione e Funzionamento ===&lt;br /&gt;
&lt;br /&gt;
(Sommariamente)&lt;br /&gt;
&lt;br /&gt;
Al primo avvio e` necesssario configurare prima il database Redis da utilizzare, poi quello della [[CentRed|centralina avvisi/allarmi]] (se avete intenzione di ricevere le comunicazioni relative agli allarmi e/o avvisi di malfunzionamenti).&lt;br /&gt;
&lt;br /&gt;
Una volta &amp;quot;letti&amp;quot; i segnali, e` opera dell'utente aggiungere alcune caratteristiche [[#Segnali]], fatto questo si passa alla creazione dei [[#Gruppi]].&lt;br /&gt;
&lt;br /&gt;
Definiti i [[#Gruppi]], si passa ad avviare i servizi necessari [[#Daemons]], che si occupano di generare i grafici Tempo-Valore/i o gestione degli allarmi/anomalie.&lt;br /&gt;
&lt;br /&gt;
== Arrivo dati e manipolazione ==&lt;br /&gt;
&lt;br /&gt;
I dati devono arrivare al broker MQTT nel formato:&lt;br /&gt;
&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
inviati nel topic:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fate riferimento alla [[#Tabella dati e valori]] per comprendere meglio il significato.&lt;br /&gt;
&lt;br /&gt;
Nell'immagine, una schermata dei test in corso, a sinistra gli errori di lettura, a destra un listato della &amp;quot;cgi-bin&amp;quot;, sotto i falsi dati inviati (mi servono per i test che sto` facendo ;) ), e in fondo i dati ricevuti (veri e falsi).&lt;br /&gt;
&lt;br /&gt;
[[File:Level1 201604170814.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mqtt2redis_d.py ===&lt;br /&gt;
&lt;br /&gt;
I dati MQTT vengono letti dal programma &amp;quot;mqtt2redis_d.py&amp;quot; che deve sempre essere in esecuzione (ho gia` preparato anche un &amp;quot;init.d&amp;quot;, che tengo ancora nella &amp;quot;cgi-bin&amp;quot;), questi li manipola inserendoli se non presenti, in due &amp;quot;chiavi&amp;quot; nel database (noSQL) Redis, la prima, e` per identificare il segnale:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
la seconda e` quella dei valori:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
valori che sono accodati ad ogni arrivo con l'aggiunta della data e ora, predisposti per una generazione di output in formato &amp;quot;csv&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== ''IMPORTANTE'' ==&lt;br /&gt;
&lt;br /&gt;
''Quello che segue non e` aggiornato di pari passo con l'aggiornamento del software e quant'altro necessario.''&lt;br /&gt;
&lt;br /&gt;
''Durante l'uso, nelle pagine di configurazione e modifica compaiono delle descrizioni che sono piu` veritiere/aggiornate, perche` scritte durante la stesura e/o modifica del software.''&lt;br /&gt;
&lt;br /&gt;
== Segnali ==&lt;br /&gt;
&lt;br /&gt;
Una volta pervenuto il primo valore di un segnale, e` possibile configurarlo inserendo alcuni dati che non sono presenti nella comunicazione MQTT:&lt;br /&gt;
&lt;br /&gt;
;Descrizione&lt;br /&gt;
:Meglio se breve, perche` usata anche nei riferimenti dei grafici, non solo per gli allarmi (per esempio: &amp;quot;ST1 Cucina&amp;quot; per sensore temperatura in cucina)&lt;br /&gt;
;UM (Unita` di misura)&lt;br /&gt;
;TempoRitardo&lt;br /&gt;
:Ancora non usata&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Specificare il range dei valori nel formato 0,100&lt;br /&gt;
:Utile per sonde che (per esempio) lavorano da 0 a 100 gradi&lt;br /&gt;
:Genera avviso/allarme se minore di o maggiore di&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Avviso se valore e` inferiore a quello impostato&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Aavviso se valore e` superiore a quello impostato&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:Previsto per i segnali analogici o negati&lt;br /&gt;
:Avviso quando valore uguale a ValoreOn&lt;br /&gt;
;Allarme&lt;br /&gt;
:Definire qua i valori che saranno usati come allarmi, per esempio: ValoreOn,ValoreMin&lt;br /&gt;
:Se sono impostati, ma non indicati qua, sono emessi dei semplici avvisi&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sonda temperatura (ovviamente falsa):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashTempMod Falsa2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sensore di movimento (pir, ovviamente falso):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashPirMod Falso2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
== Gruppi ==&lt;br /&gt;
&lt;br /&gt;
Per realizzare i raggruppamenti ho utilizzato le chiavi Redis di tipo &amp;quot;sets&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Al momento ho pensato ai soli gruppi riguardanti gli allarmi e i grafici (per esempio quelli di due o piu`, sonde di temperatura).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Puoi benissimo creare un gruppo con un solo sensore.&lt;br /&gt;
&lt;br /&gt;
Al solito, ho pensato ad una chiave univoca d'inserimento dei dati in Redis '''sets:type:ID''' (gruppo:tipo:identificatore).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gruppo&lt;br /&gt;
|&lt;br /&gt;
* sets&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* alarms&lt;br /&gt;
* graph&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore)&lt;br /&gt;
|&lt;br /&gt;
(definito da utente, esempi:)&lt;br /&gt;
* TemperatureBagno&lt;br /&gt;
* TemperaturePianoTerra&lt;br /&gt;
* luigi&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I gruppi sono definiti dall'utente, ed ogni volta che viene creato un nuovo gruppo (deve avere almeno un'utenza altrimenti si autoelimina), viene gia` creato il &amp;quot;Timer&amp;quot; di &amp;quot;campionamento&amp;quot;/&amp;quot;ritardo nuovo allarme&amp;quot;, preimpostato a 5 minuti (sono previsti valori da 1 a 60 minuti).&lt;br /&gt;
&lt;br /&gt;
''La pagina d'inserimento permette di inserire una chiave con un nome qualsiasi, non ho ancora &amp;quot;bloccato&amp;quot; e/o previsto un controllo sull'identificatore assegnato.''&lt;br /&gt;
&lt;br /&gt;
=== sets:*:ID:Config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Timer&lt;br /&gt;
|&lt;br /&gt;
* da 1 60 minuti&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Funzionamento&lt;br /&gt;
|&lt;br /&gt;
* On&lt;br /&gt;
* Off&lt;br /&gt;
* Auto&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) dalle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) alle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;graph&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
La chiave per questi gruppi e` previsto che sia: '''sets:graph:ID'''&lt;br /&gt;
&lt;br /&gt;
La chiave per il timer di campionamento e` previsto che sia: '''sets:graph:ID:Timer''' (ora e` generata automaticamente)&lt;br /&gt;
&lt;br /&gt;
La chiave per i dati campionati e la generazione del grafico (che sara` in formato csv) e` previsto che sia: '''sets:graph:ID:Valori''' (sara` creata ed aggiornata autonomamente, da un programma in python)&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;alarms&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Al momento come sopra, tranne che il Timer non servira` (o forse si, perche` sono previsti anche grafici dei PIR).&lt;br /&gt;
&lt;br /&gt;
==== Esempio d'inserimento gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Aggiungi chiavi &amp;quot;sets&amp;quot; Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysAddSets 1.png&lt;br /&gt;
File:Livello1-KeysAddSets 2.png&lt;br /&gt;
File:Livello1-KeysAddSets 3.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
::Nell'immagine e` gia` stato applicato il filtro '''*:graph:*'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModHash 1.png|Spostiamoci verso il basso e selezioniamo la seconda voce di modifica delle chiavi &amp;quot;hash&amp;quot;, quella relativa al &amp;quot;Config&amp;quot;:&lt;br /&gt;
File:Livello1-KeysModHash 2.png&lt;br /&gt;
File:Livello1-KeysModHash 3.png|e l'esempio di un allarme:&lt;br /&gt;
File:Livello1-KeysModHash 3a.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modifica di un gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModSets 2.png&lt;br /&gt;
File:Livello1-KeysModSets 3.png|Credo si spieghi da sola ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Daemons ==&lt;br /&gt;
&lt;br /&gt;
Intanto: non sono veri e propri &amp;quot;demoni&amp;quot;, sono script che l'utente avvia e ferma al bisogno.&lt;br /&gt;
&lt;br /&gt;
Specialmente quello degli allarmi (che mi sta` rompendo al cellulare da stamattina ;) ), e` da avviare quando uscite di casa, e fermare prima di rientrare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Daemons part1.png&lt;br /&gt;
File:Livello1-Daemons part2.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grafici (files .csv) ==&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;TIP&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Allarmi ==&lt;br /&gt;
&lt;br /&gt;
Per ogni gruppo creato, e` possibile eseguire il controllo allarmi, servono opportune preimpostazioni (configurazioni), poi e` possibile eseguire il software dalla pagina '''Daemons''':&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-Allarmi-Daemons.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Si puo` notare in esecuzione solo quello relativo ad una falsa sonda di temperatura, relativo ai [[Centralina livello 1/Test allarmi|test eseguiti]].&lt;br /&gt;
&lt;br /&gt;
L'eseguibile e` &amp;quot;/var/www/cgi-bin/setsalarms_d.py&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== setsalarms_d.py ===&lt;br /&gt;
&lt;br /&gt;
Perche` possa &amp;quot;funzionare&amp;quot; servono alcuni requisiti:&lt;br /&gt;
*Deve esistere il gruppo ed avere una configurazione (che e` preimpostata alla creazione)&lt;br /&gt;
*Il gruppo deve essere &amp;quot;on&amp;quot; o in modalita` &amp;quot;auto&amp;quot; (per default e` &amp;quot;off&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Tutti sono avvisi (li ho chiamati &amp;quot;alert&amp;quot;), alcuni possono e devono invece diventare allarmi (&amp;quot;alarm&amp;quot;). Perche` siano definiti allarmi, devono essere inseriti nella voce &amp;quot;Allarme&amp;quot;, presente nella configurazione della sonda (sensore, PIR, o quello che e`).&lt;br /&gt;
&lt;br /&gt;
Tipi di &amp;quot;alert&amp;quot;:&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero,[+-]Numero, una sonda 1wire pe esempio sarebbe: -55,+125&lt;br /&gt;
:;Alert&lt;br /&gt;
::Se il valore letto e` fuori dal range&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` inferiore&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` superiore&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:0 o 1&lt;br /&gt;
:Al momento e` previsto per sola sensoristica come: finecorsa, PIR, e altri segnali on/off&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` uguale&lt;br /&gt;
;Allarme&lt;br /&gt;
:Quello che e` allarme e non semplice avviso:&lt;br /&gt;
::ValoreOn&lt;br /&gt;
::ValoreMin&lt;br /&gt;
::ValoreMin,ValoreMax,ValoreOn&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
Per un'esempio di configurazione fate riferimento alla pagina [[Centralina livello 1/Test allarmi|Test Allarmi]].&lt;br /&gt;
&lt;br /&gt;
Il software invia gli avvisi/allarmi alla centralina [[CentRed]], e` questa poi ad occuparsi della trasmissione, discriminando il tipo dalla stringa con cui e` stato inviato. Altre informazioni alla pagina [[CentRed]].&lt;br /&gt;
&lt;br /&gt;
== Analizza e Modifica Valori ==&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto la possibilita` di manipolare i valori memorizzati nel database Redis.&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Selezione_Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sono ammesse solamente chiavi &amp;quot;:Valori&amp;quot;, la possibilita` di selezione dipende (al solito) dal filtro attivo nella pagina.&lt;br /&gt;
&lt;br /&gt;
Una volta scelta la chiave e cliccato su &amp;quot;Analizza e Modifica&amp;quot;, compare la pagina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dove e` possibile:&lt;br /&gt;
* Visualizzare tutti i valori&lt;br /&gt;
* Creare il file &amp;quot;.csv&amp;quot; da elaborare successivamente tramite l'apposita pagina&lt;br /&gt;
* Eliminare i dati ormai obsoleti (attenzione che non ho filtrato le immissioni, e` possibile anche fare il contrario)&lt;br /&gt;
&lt;br /&gt;
== Tabella dati e valori ==&lt;br /&gt;
&lt;br /&gt;
Denominazione dei campi e attibuzione dei valori standard (piu` o meno)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* Temperatura&lt;br /&gt;
* PIR&lt;br /&gt;
* Finecorsa&lt;br /&gt;
* Proximity&lt;br /&gt;
* Livello&lt;br /&gt;
* Rele`&lt;br /&gt;
* Termostato&lt;br /&gt;
* Valvola&lt;br /&gt;
* Motore&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione del segnale&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TipoIO&lt;br /&gt;
|&lt;br /&gt;
* I (Input/Ingresso)&lt;br /&gt;
* O (Output/Uscita)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segnale&lt;br /&gt;
|&lt;br /&gt;
* Analogico&lt;br /&gt;
* Digitale&lt;br /&gt;
* Testo&lt;br /&gt;
* I2C&lt;br /&gt;
* SPI&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Al momento l'ho soppresso, il tipo di segnale e` praticamente definito dal valore in entrata (per ora)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneC&lt;br /&gt;
|&lt;br /&gt;
* Casa&lt;br /&gt;
* Garage&lt;br /&gt;
* Giardino&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneP&lt;br /&gt;
|&lt;br /&gt;
* Piano0 / PianoZero&lt;br /&gt;
* Piano1 / PianoUno&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneS&lt;br /&gt;
|&lt;br /&gt;
* Cucina1&lt;br /&gt;
* Camera2&lt;br /&gt;
* Bagno1&lt;br /&gt;
* ...&lt;br /&gt;
* Cantina&lt;br /&gt;
* EsternoSala&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore, Utenza/ITEM)&lt;br /&gt;
|&lt;br /&gt;
* 1&lt;br /&gt;
* 2&lt;br /&gt;
* 3&lt;br /&gt;
* ..&lt;br /&gt;
* Up&lt;br /&gt;
* Down&lt;br /&gt;
* Left&lt;br /&gt;
* Right&lt;br /&gt;
* (altro ?)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Convenzioni usate ad oggi:&lt;br /&gt;
* STn sonda/sensore temperatura [n = numero]&lt;br /&gt;
* RHn sonda/sensore umidita` relativa [n = numero]&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Definito dall'utente che programma i &amp;quot;remote&amp;quot;, ma meglio definire una struttura di base ..&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valori&lt;br /&gt;
|&lt;br /&gt;
* TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori&lt;br /&gt;
|&lt;br /&gt;
Assegnato automaticamente dal programma&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UM (Unita` di Misura)&lt;br /&gt;
|&lt;br /&gt;
* °C&lt;br /&gt;
* V (tensione)&lt;br /&gt;
* A (assorbimento)&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Questo e` previsto solo per le segnalazioni/avvisi/allarmi .. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TempoRitardo (secondi)&lt;br /&gt;
|&lt;br /&gt;
* 0.000&lt;br /&gt;
* 1.002&lt;br /&gt;
* ...&lt;br /&gt;
* 99.000 (max impostabile)&lt;br /&gt;
|&lt;br /&gt;
Al momento non previsto, teoricamente i segnali dovrebbero arrivare gia` &amp;quot;filtrati&amp;quot; dai &amp;quot;remote&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! RangeValori&lt;br /&gt;
|&lt;br /&gt;
* 0,100&lt;br /&gt;
* -50,125&lt;br /&gt;
* 0,1&lt;br /&gt;
|&lt;br /&gt;
Da utilizzarsi per definire l'errore e generare una segnalazione di sonda guasta&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMin&lt;br /&gt;
|&lt;br /&gt;
* 10 (temperatura)&lt;br /&gt;
* 0 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sotto a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMax&lt;br /&gt;
|&lt;br /&gt;
* 40 (temperatura)&lt;br /&gt;
* 1 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sopra a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreOn&lt;br /&gt;
|&lt;br /&gt;
* 1 (quando attivo a segnale on)&lt;br /&gt;
* 0 (quando attivo a segnale off)&lt;br /&gt;
* [Valore]&lt;br /&gt;
|&lt;br /&gt;
Valore da utilizzare per alert/alarm, e per definire se si tratta di un segnale negato (zero) e trattarlo di conseguenza&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Allarme&lt;br /&gt;
|&lt;br /&gt;
* ValoreOn&lt;br /&gt;
* ValoreMin&lt;br /&gt;
* ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin&lt;br /&gt;
* ValoreOn,ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin,ValoreMax&lt;br /&gt;
* ValoreMin,ValoreMax&lt;br /&gt;
|&lt;br /&gt;
Quali sono da trattare come allarmi, di default, se impostati, sono trattati come alert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data (e ora)&lt;br /&gt;
|&lt;br /&gt;
* 2016/03/13 20:40:08&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valore&lt;br /&gt;
|&lt;br /&gt;
* 0&lt;br /&gt;
* 1&lt;br /&gt;
* 13&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Promemoria chiavi, codici e ... ==&lt;br /&gt;
&lt;br /&gt;
====== Dati (mqtt) ======&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Topic (mqtt) ======&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria segnale di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria gruppi di livello 1 (redis) ======&lt;br /&gt;
;TYPE&lt;br /&gt;
:graph&lt;br /&gt;
:alarms&lt;br /&gt;
'''sets:TYPE:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria configurazione gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Config'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Notes|Notes]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Primo avvio|Primo avvio]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Test allarmi|Test allarmi]]&lt;br /&gt;
&lt;br /&gt;
= Devices =&lt;br /&gt;
&lt;br /&gt;
Ad oggi, ho predisposto/preparato:&lt;br /&gt;
* [[PorTHable]], che invia valori di temperatura&lt;br /&gt;
* [[ ESP8266/DS1820toMQTT | DS1820toMQTT ]], sensore/i di temperatura&lt;br /&gt;
* [[ ESP8266/PIRtoMQTT | PIRtoMQTT ]], sensore di movimento (PIR)&lt;br /&gt;
* [[ ESP8266/SerialToMQTT_Repeater | SerialToMQTT Repeater ]], che funziona da &amp;quot;repeater&amp;quot;, ritrasmette i dati ricevuti via seriale al broker MQTT&lt;br /&gt;
* [[ Thermo ]], che invia il valore della temperatura (solo di riferimento ad oggi, non le altre sonde)&lt;br /&gt;
* [[ ENC28J60-ATMEGA328P-DS18B20 | ENC28J60 + ATMEGA328P + DS18B20 ]], sensore di temperatura in ethernet&lt;br /&gt;
* [[ Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | ATMEGA328P + ESP8266 + DHT + Rain]], sensore temperatura/umidita` (dht) e pioggia (rain)&lt;br /&gt;
* [[ ESP8266/DHT22toMQTT | DHT22toMQTT ]], sensore di temperatura e umidita`&lt;br /&gt;
* [[ Centralina_livello_1/Dev_HTRL_wAE | ATMEGA328P + ESP8266 + DHT + Rain + Photoresistor]], sensore temperatura/umidita` (dht), pioggia (rain) e luminosita` (photoresistor).&amp;lt;br&amp;gt; Nuova e migliorata (?) versione del precedente [[Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | device]]&lt;br /&gt;
* [[ Cronotermostato settimanale ]]&lt;br /&gt;
* [[ Centralina_livello_1/Centralina_livello_2_PIR | Centralina livello 2 - PIR ]]&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/telegram bot|Telegram Bot per Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
= Problemi e soluzioni ? =&lt;br /&gt;
&lt;br /&gt;
;Eliminazione file di swap&lt;br /&gt;
:Non so se sia stato un problema e sia utile&lt;br /&gt;
::[[Raspberry_PI-Raspbian-Personalizzazioni#Disattivazione|Disattivazione file di swap]]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore salvataggio in background&lt;br /&gt;
:[https://jee-appy.blogspot.it/2016/04/can-not-save-in-background-fork-redis.html Can't save in background: fork: Cannot allocate memory Redis]&lt;br /&gt;
:[https://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory redis bgsave failed because fork Cannot allocate memory]&lt;br /&gt;
:[https://stackoverflow.com/questions/19581059/misconf-redis-is-configured-to-save-rdb-snapshots MISCONF Redis is configured to save RDB snapshots]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore avvio del server&lt;br /&gt;
:Dopo un ripristino del sistema ho avuto dei problemi di permessi al file &amp;quot;dump.rdb&amp;quot; (che ho voluto ricopiare per riprendermi alcune impostazioni), ho reimpostato in &amp;quot;redis:redis&amp;quot; (directory &amp;quot;/var/lib/redis&amp;quot; inclusa) il proprietario e settato i permessi a 660.&lt;br /&gt;
&lt;br /&gt;
;I daemon non vengono eseguiti dalle pagine web&lt;br /&gt;
:Non sono stati corretti i permessi della directory del webserver &amp;quot;/var/www&amp;quot; [[#Level1_.28www.29]]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7286</id>
		<title>Centralina livello 1</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7286"/>
		<updated>2020-09-19T16:05:28Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Problemi e soluzioni ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
![[File:Livello1-Debug.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Centralina livello 1&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Centralina generale (?) gestione segnali&lt;br /&gt;
|-&lt;br /&gt;
|Repository: https://github.com/raspibo/Livello1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
= Centralina  livello 1 =&lt;br /&gt;
&lt;br /&gt;
;ATTENZIONE&lt;br /&gt;
:Tutte le immagini sono puramente indicative, il progetto e` in pieno sviluppo, tutto e` passibile di modifiche, anche sostanziali.&lt;br /&gt;
:L'immagine di presentazione si riferisce alla sezione &amp;quot;debug&amp;quot;, realizzata con Dokuwiki e (ad oggi) non fa parte del progetto (o si ?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prima e sommaria descrizione ==&lt;br /&gt;
&lt;br /&gt;
Centralina di controllo segnali.&lt;br /&gt;
&lt;br /&gt;
:(Ad oggi)&lt;br /&gt;
:Acquisisce segnali, li suddivide in gruppi mono o multi utenza, dei quali: realizza grafici temporali, crea e gestisce allarmi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dal campo arrivano i valori della 'sensoristica' sottoforma di &amp;quot;Identificatore Valore&amp;quot;, da queste informazioni sono aggiunti i sensori che eventualmente non sono presenti e le relative 'liste' dei valori (sono generate due chiavi, una dell'utenza e l'altra dei valori), altrimenti viene solo accodato il valore nella rispettiva lista (aggiungendo data-ora-minuti-secondi).&lt;br /&gt;
&lt;br /&gt;
Acquisiti i sensori, e` possibile il loro raggruppamento (anche una sola utenza) ed il campionamento dei valori a tempi prestabiliti (generazione grafici tempo/valore).&lt;br /&gt;
&lt;br /&gt;
Sempre previo raggruppamento (sempre &amp;quot;anche di un solo sensore&amp;quot;), e` possibile attivare/disattivare i relativi allarmi, il classico ON/OFF, ma anche un'automatico (che per esempio attivi i sensori del solaio/cantine dalle 20 alle 8, quando e` certo che nessuno si rechi in quegli spazi).&lt;br /&gt;
&lt;br /&gt;
E poi il resto .. che sarebbe di arrivare non solo a leggere/interpretare segnali, ma anche a pilotare utenze (luci, serrande, elettrodomestici, ...)&lt;br /&gt;
&lt;br /&gt;
L'idea e` che tutto questo sia gestibile da:&lt;br /&gt;
# interfaccia web&lt;br /&gt;
#* browser&lt;br /&gt;
#* cellulare&lt;br /&gt;
# linea di comando&lt;br /&gt;
# terminali operatore (display+tastiere)&lt;br /&gt;
# pulsanti, lampade, selettori, ..&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
== Hardware e Software ==&lt;br /&gt;
&lt;br /&gt;
;Hardware&lt;br /&gt;
:Versione 1 - [[Raspberry Pi 3]], perche` completa di WiFi e Bluetooth&lt;br /&gt;
:Versione 2 (2018) - [[Raspberry Pi]] con chiavetta WiFi&lt;br /&gt;
&lt;br /&gt;
;Software&lt;br /&gt;
:MQTT Broker (Mosquitto), perche` in grado di dialogare con la maggior parte dei componenti (Arduino, ESP8266, eccetera)&lt;br /&gt;
:Redis, perche` servira` un database di appoggio e manipolazione per alcuni dati, e perche` servira` una struttura dati &amp;quot;manipolabile&amp;quot; (dovremo poter aggiungere e togliere &amp;quot;campi:valori&amp;quot; ad una &amp;quot;chiave&amp;quot;, e aggiungere/togliere chiavi a delle liste, ecc. ecc.)&lt;br /&gt;
:Nginx, non si puo` fare senza web server&lt;br /&gt;
:... e poi non so cos'altro&lt;br /&gt;
:Script cgi&lt;br /&gt;
:javascript&lt;br /&gt;
: ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Embedded page --&amp;gt;&lt;br /&gt;
{{:Raspberry_Pi-Raspbian_default_post-install}}&lt;br /&gt;
&lt;br /&gt;
== Access Point ==&lt;br /&gt;
&lt;br /&gt;
Installato/configurato &amp;quot;[[Raspberry Pi Access Point WEP2]]&amp;quot;, sfruttando il wifi integrato nel [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
Installazione dei pacchetti utili, necessari (e qualcuno inutile):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get install nginx fcgiwrap redis-server python3-redis mosquitto paho-mqtt ssl-cert php-fpm php7.0-xml python3-pip python3-paho-mqtt python3-pandas python3-cairosvg python3-tinycss python3-cssselect git mosquitto-clients apt-file mc redis-tools aria2&lt;br /&gt;
pip3 install python-telegram-bot pygal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E` stato installato manualmente anche [http://www.dokuwiki.org dokuwiki], utilizzato per segnarsi appunti vari (e un po` di debug), e` facoltativo e non descritto le operazioni necessarie, ma i files di configurazione del web server si.&lt;br /&gt;
&lt;br /&gt;
E` necessario scaricare il repository con i programmi (script python per lo piu`), si puo` fare da normale utente, per esempio:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/Livello1.git&lt;br /&gt;
cd Livello1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/level1 /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-enabled/level1 /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/dokuwiki* etc/nginx/fcgiwrap.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
==== Level1 (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu var/www/ /var/&lt;br /&gt;
chown www-data:www-data -R /var/www/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serve anche la scrittura in &amp;quot;www&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chmod 775 /var/www&lt;br /&gt;
chown :www-data -R /var/www    # oppure si poteva eliminare il &amp;quot;/&amp;quot; dal &amp;quot;chown&amp;quot; precedente&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
:Potrebbe essere necessario creare la directory &amp;quot;/var/www/archive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
All'avvio del sistema, devono andare in esecuzione alcuni script (quasi &amp;quot;daemons&amp;quot;) e rimanere attivi, per questo si deve modificare il file &amp;quot;/etc/rc.local&amp;quot; (lo trovate nel repository git):&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Power On &amp;quot;Level 1&amp;quot;&lt;br /&gt;
DAEMON_NAME=mqtt2redis_d&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviata correttamente Livello 1, oppure mqtt2redis_d e\` gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio \&amp;quot;mqtt2redis_d\&amp;quot;&amp;quot;&lt;br /&gt;
                #/var/www/cgi-bin/mqtt2redis_init.d.sh start # 20180115&lt;br /&gt;
        su -c &amp;quot;/var/www/cgi-bin/mqtt2redis_init.d.sh start&amp;quot; pi&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Centralina level 1 [ri]avviata ..&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Start Telegram Bot&lt;br /&gt;
DAEMON_NAME=bot4livello1&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato il Telegram Bot, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio Telegram Bot&amp;quot;&lt;br /&gt;
                cd /home/pi/project/csv2image2telegram&lt;br /&gt;
                su pi -c &amp;quot;python3 bot4livello1.py &amp;amp;&amp;quot;&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio bot4livello1.py&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inoltre, visto che puo` capitare s'interrompano, specialmente nelle prove di nuovi [[Centralina_livello_1#Devices|devices]], sono predisposti dei &amp;quot;check orari&amp;quot; che nel caso, li riavviano:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.hourly/mqtt2redis_check /etc/cron.hourly/&lt;br /&gt;
cp -vapu etc/cron.hourly/bot4livello1_check /etc/cron.hourly/ # se installerete anche il bot telegram&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Backup ====&lt;br /&gt;
&lt;br /&gt;
Oltre ad un &amp;quot;backup&amp;quot; che si occupa di salvare tutti i computer's della rete, ho aggiunto uno script per salvare giornalmente il database redis, come ulteriore sicurezza, i files sono salvati nella directory &amp;quot;/root&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.daily/backupredis /etc/cron.daily/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rete ==&lt;br /&gt;
&lt;br /&gt;
Al momento e` previsto che sia tutto sotto WiFi (quella onboard) del [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
Comunque bastera` modificare il firewall per accettare dati dalla ethernet se si rendesse necessario.&lt;br /&gt;
&lt;br /&gt;
Le centrali accessorie, tipo quella di [[CentRed|allarme]], che deve solo ricevere, non necessariamente dovranno trovarsi nella sottorete gestita da &amp;quot;livello 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Descrizione ==&lt;br /&gt;
&lt;br /&gt;
I 'segnali' arrivano sempre (?) a &amp;quot;MQTT broker&amp;quot;, vengono manipolati se necessario, ed inseriti nel database Redis.&lt;br /&gt;
&lt;br /&gt;
Dal database Redis sono di nuovo letti/scritti/modificati/manipolati ed inviati:&lt;br /&gt;
:e/o&lt;br /&gt;
::in report (testo, grafico, audio, video, ...)&lt;br /&gt;
:e/o&lt;br /&gt;
::alla centralina di allarme [[CentRed]]&lt;br /&gt;
:e/o&lt;br /&gt;
::reinviati a MQTT broker&lt;br /&gt;
:e/o&lt;br /&gt;
::inviati ad altre centraline livello 1&lt;br /&gt;
:e/o&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
=== Configurazione e Funzionamento ===&lt;br /&gt;
&lt;br /&gt;
(Sommariamente)&lt;br /&gt;
&lt;br /&gt;
Al primo avvio e` necesssario configurare prima il database Redis da utilizzare, poi quello della [[CentRed|centralina avvisi/allarmi]] (se avete intenzione di ricevere le comunicazioni relative agli allarmi e/o avvisi di malfunzionamenti).&lt;br /&gt;
&lt;br /&gt;
Una volta &amp;quot;letti&amp;quot; i segnali, e` opera dell'utente aggiungere alcune caratteristiche [[#Segnali]], fatto questo si passa alla creazione dei [[#Gruppi]].&lt;br /&gt;
&lt;br /&gt;
Definiti i [[#Gruppi]], si passa ad avviare i servizi necessari [[#Daemons]], che si occupano di generare i grafici Tempo-Valore/i o gestione degli allarmi/anomalie.&lt;br /&gt;
&lt;br /&gt;
== Arrivo dati e manipolazione ==&lt;br /&gt;
&lt;br /&gt;
I dati devono arrivare al broker MQTT nel formato:&lt;br /&gt;
&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
inviati nel topic:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fate riferimento alla [[#Tabella dati e valori]] per comprendere meglio il significato.&lt;br /&gt;
&lt;br /&gt;
Nell'immagine, una schermata dei test in corso, a sinistra gli errori di lettura, a destra un listato della &amp;quot;cgi-bin&amp;quot;, sotto i falsi dati inviati (mi servono per i test che sto` facendo ;) ), e in fondo i dati ricevuti (veri e falsi).&lt;br /&gt;
&lt;br /&gt;
[[File:Level1 201604170814.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mqtt2redis_d.py ===&lt;br /&gt;
&lt;br /&gt;
I dati MQTT vengono letti dal programma &amp;quot;mqtt2redis_d.py&amp;quot; che deve sempre essere in esecuzione (ho gia` preparato anche un &amp;quot;init.d&amp;quot;, che tengo ancora nella &amp;quot;cgi-bin&amp;quot;), questi li manipola inserendoli se non presenti, in due &amp;quot;chiavi&amp;quot; nel database (noSQL) Redis, la prima, e` per identificare il segnale:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
la seconda e` quella dei valori:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
valori che sono accodati ad ogni arrivo con l'aggiunta della data e ora, predisposti per una generazione di output in formato &amp;quot;csv&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== ''IMPORTANTE'' ==&lt;br /&gt;
&lt;br /&gt;
''Quello che segue non e` aggiornato di pari passo con l'aggiornamento del software e quant'altro necessario.''&lt;br /&gt;
&lt;br /&gt;
''Durante l'uso, nelle pagine di configurazione e modifica compaiono delle descrizioni che sono piu` veritiere/aggiornate, perche` scritte durante la stesura e/o modifica del software.''&lt;br /&gt;
&lt;br /&gt;
== Segnali ==&lt;br /&gt;
&lt;br /&gt;
Una volta pervenuto il primo valore di un segnale, e` possibile configurarlo inserendo alcuni dati che non sono presenti nella comunicazione MQTT:&lt;br /&gt;
&lt;br /&gt;
;Descrizione&lt;br /&gt;
:Meglio se breve, perche` usata anche nei riferimenti dei grafici, non solo per gli allarmi (per esempio: &amp;quot;ST1 Cucina&amp;quot; per sensore temperatura in cucina)&lt;br /&gt;
;UM (Unita` di misura)&lt;br /&gt;
;TempoRitardo&lt;br /&gt;
:Ancora non usata&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Specificare il range dei valori nel formato 0,100&lt;br /&gt;
:Utile per sonde che (per esempio) lavorano da 0 a 100 gradi&lt;br /&gt;
:Genera avviso/allarme se minore di o maggiore di&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Avviso se valore e` inferiore a quello impostato&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Aavviso se valore e` superiore a quello impostato&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:Previsto per i segnali analogici o negati&lt;br /&gt;
:Avviso quando valore uguale a ValoreOn&lt;br /&gt;
;Allarme&lt;br /&gt;
:Definire qua i valori che saranno usati come allarmi, per esempio: ValoreOn,ValoreMin&lt;br /&gt;
:Se sono impostati, ma non indicati qua, sono emessi dei semplici avvisi&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sonda temperatura (ovviamente falsa):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashTempMod Falsa2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sensore di movimento (pir, ovviamente falso):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashPirMod Falso2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
== Gruppi ==&lt;br /&gt;
&lt;br /&gt;
Per realizzare i raggruppamenti ho utilizzato le chiavi Redis di tipo &amp;quot;sets&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Al momento ho pensato ai soli gruppi riguardanti gli allarmi e i grafici (per esempio quelli di due o piu`, sonde di temperatura).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Puoi benissimo creare un gruppo con un solo sensore.&lt;br /&gt;
&lt;br /&gt;
Al solito, ho pensato ad una chiave univoca d'inserimento dei dati in Redis '''sets:type:ID''' (gruppo:tipo:identificatore).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gruppo&lt;br /&gt;
|&lt;br /&gt;
* sets&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* alarms&lt;br /&gt;
* graph&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore)&lt;br /&gt;
|&lt;br /&gt;
(definito da utente, esempi:)&lt;br /&gt;
* TemperatureBagno&lt;br /&gt;
* TemperaturePianoTerra&lt;br /&gt;
* luigi&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I gruppi sono definiti dall'utente, ed ogni volta che viene creato un nuovo gruppo (deve avere almeno un'utenza altrimenti si autoelimina), viene gia` creato il &amp;quot;Timer&amp;quot; di &amp;quot;campionamento&amp;quot;/&amp;quot;ritardo nuovo allarme&amp;quot;, preimpostato a 5 minuti (sono previsti valori da 1 a 60 minuti).&lt;br /&gt;
&lt;br /&gt;
''La pagina d'inserimento permette di inserire una chiave con un nome qualsiasi, non ho ancora &amp;quot;bloccato&amp;quot; e/o previsto un controllo sull'identificatore assegnato.''&lt;br /&gt;
&lt;br /&gt;
=== sets:*:ID:Config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Timer&lt;br /&gt;
|&lt;br /&gt;
* da 1 60 minuti&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Funzionamento&lt;br /&gt;
|&lt;br /&gt;
* On&lt;br /&gt;
* Off&lt;br /&gt;
* Auto&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) dalle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) alle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;graph&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
La chiave per questi gruppi e` previsto che sia: '''sets:graph:ID'''&lt;br /&gt;
&lt;br /&gt;
La chiave per il timer di campionamento e` previsto che sia: '''sets:graph:ID:Timer''' (ora e` generata automaticamente)&lt;br /&gt;
&lt;br /&gt;
La chiave per i dati campionati e la generazione del grafico (che sara` in formato csv) e` previsto che sia: '''sets:graph:ID:Valori''' (sara` creata ed aggiornata autonomamente, da un programma in python)&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;alarms&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Al momento come sopra, tranne che il Timer non servira` (o forse si, perche` sono previsti anche grafici dei PIR).&lt;br /&gt;
&lt;br /&gt;
==== Esempio d'inserimento gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Aggiungi chiavi &amp;quot;sets&amp;quot; Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysAddSets 1.png&lt;br /&gt;
File:Livello1-KeysAddSets 2.png&lt;br /&gt;
File:Livello1-KeysAddSets 3.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
::Nell'immagine e` gia` stato applicato il filtro '''*:graph:*'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModHash 1.png|Spostiamoci verso il basso e selezioniamo la seconda voce di modifica delle chiavi &amp;quot;hash&amp;quot;, quella relativa al &amp;quot;Config&amp;quot;:&lt;br /&gt;
File:Livello1-KeysModHash 2.png&lt;br /&gt;
File:Livello1-KeysModHash 3.png|e l'esempio di un allarme:&lt;br /&gt;
File:Livello1-KeysModHash 3a.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modifica di un gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModSets 2.png&lt;br /&gt;
File:Livello1-KeysModSets 3.png|Credo si spieghi da sola ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Daemons ==&lt;br /&gt;
&lt;br /&gt;
Intanto: non sono veri e propri &amp;quot;demoni&amp;quot;, sono script che l'utente avvia e ferma al bisogno.&lt;br /&gt;
&lt;br /&gt;
Specialmente quello degli allarmi (che mi sta` rompendo al cellulare da stamattina ;) ), e` da avviare quando uscite di casa, e fermare prima di rientrare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Daemons part1.png&lt;br /&gt;
File:Livello1-Daemons part2.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grafici (files .csv) ==&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;TIP&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Allarmi ==&lt;br /&gt;
&lt;br /&gt;
Per ogni gruppo creato, e` possibile eseguire il controllo allarmi, servono opportune preimpostazioni (configurazioni), poi e` possibile eseguire il software dalla pagina '''Daemons''':&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-Allarmi-Daemons.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Si puo` notare in esecuzione solo quello relativo ad una falsa sonda di temperatura, relativo ai [[Centralina livello 1/Test allarmi|test eseguiti]].&lt;br /&gt;
&lt;br /&gt;
L'eseguibile e` &amp;quot;/var/www/cgi-bin/setsalarms_d.py&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== setsalarms_d.py ===&lt;br /&gt;
&lt;br /&gt;
Perche` possa &amp;quot;funzionare&amp;quot; servono alcuni requisiti:&lt;br /&gt;
*Deve esistere il gruppo ed avere una configurazione (che e` preimpostata alla creazione)&lt;br /&gt;
*Il gruppo deve essere &amp;quot;on&amp;quot; o in modalita` &amp;quot;auto&amp;quot; (per default e` &amp;quot;off&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Tutti sono avvisi (li ho chiamati &amp;quot;alert&amp;quot;), alcuni possono e devono invece diventare allarmi (&amp;quot;alarm&amp;quot;). Perche` siano definiti allarmi, devono essere inseriti nella voce &amp;quot;Allarme&amp;quot;, presente nella configurazione della sonda (sensore, PIR, o quello che e`).&lt;br /&gt;
&lt;br /&gt;
Tipi di &amp;quot;alert&amp;quot;:&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero,[+-]Numero, una sonda 1wire pe esempio sarebbe: -55,+125&lt;br /&gt;
:;Alert&lt;br /&gt;
::Se il valore letto e` fuori dal range&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` inferiore&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` superiore&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:0 o 1&lt;br /&gt;
:Al momento e` previsto per sola sensoristica come: finecorsa, PIR, e altri segnali on/off&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` uguale&lt;br /&gt;
;Allarme&lt;br /&gt;
:Quello che e` allarme e non semplice avviso:&lt;br /&gt;
::ValoreOn&lt;br /&gt;
::ValoreMin&lt;br /&gt;
::ValoreMin,ValoreMax,ValoreOn&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
Per un'esempio di configurazione fate riferimento alla pagina [[Centralina livello 1/Test allarmi|Test Allarmi]].&lt;br /&gt;
&lt;br /&gt;
Il software invia gli avvisi/allarmi alla centralina [[CentRed]], e` questa poi ad occuparsi della trasmissione, discriminando il tipo dalla stringa con cui e` stato inviato. Altre informazioni alla pagina [[CentRed]].&lt;br /&gt;
&lt;br /&gt;
== Analizza e Modifica Valori ==&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto la possibilita` di manipolare i valori memorizzati nel database Redis.&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Selezione_Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sono ammesse solamente chiavi &amp;quot;:Valori&amp;quot;, la possibilita` di selezione dipende (al solito) dal filtro attivo nella pagina.&lt;br /&gt;
&lt;br /&gt;
Una volta scelta la chiave e cliccato su &amp;quot;Analizza e Modifica&amp;quot;, compare la pagina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dove e` possibile:&lt;br /&gt;
* Visualizzare tutti i valori&lt;br /&gt;
* Creare il file &amp;quot;.csv&amp;quot; da elaborare successivamente tramite l'apposita pagina&lt;br /&gt;
* Eliminare i dati ormai obsoleti (attenzione che non ho filtrato le immissioni, e` possibile anche fare il contrario)&lt;br /&gt;
&lt;br /&gt;
== Tabella dati e valori ==&lt;br /&gt;
&lt;br /&gt;
Denominazione dei campi e attibuzione dei valori standard (piu` o meno)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* Temperatura&lt;br /&gt;
* PIR&lt;br /&gt;
* Finecorsa&lt;br /&gt;
* Proximity&lt;br /&gt;
* Livello&lt;br /&gt;
* Rele`&lt;br /&gt;
* Termostato&lt;br /&gt;
* Valvola&lt;br /&gt;
* Motore&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione del segnale&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TipoIO&lt;br /&gt;
|&lt;br /&gt;
* I (Input/Ingresso)&lt;br /&gt;
* O (Output/Uscita)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segnale&lt;br /&gt;
|&lt;br /&gt;
* Analogico&lt;br /&gt;
* Digitale&lt;br /&gt;
* Testo&lt;br /&gt;
* I2C&lt;br /&gt;
* SPI&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Al momento l'ho soppresso, il tipo di segnale e` praticamente definito dal valore in entrata (per ora)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneC&lt;br /&gt;
|&lt;br /&gt;
* Casa&lt;br /&gt;
* Garage&lt;br /&gt;
* Giardino&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneP&lt;br /&gt;
|&lt;br /&gt;
* Piano0 / PianoZero&lt;br /&gt;
* Piano1 / PianoUno&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneS&lt;br /&gt;
|&lt;br /&gt;
* Cucina1&lt;br /&gt;
* Camera2&lt;br /&gt;
* Bagno1&lt;br /&gt;
* ...&lt;br /&gt;
* Cantina&lt;br /&gt;
* EsternoSala&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore, Utenza/ITEM)&lt;br /&gt;
|&lt;br /&gt;
* 1&lt;br /&gt;
* 2&lt;br /&gt;
* 3&lt;br /&gt;
* ..&lt;br /&gt;
* Up&lt;br /&gt;
* Down&lt;br /&gt;
* Left&lt;br /&gt;
* Right&lt;br /&gt;
* (altro ?)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Convenzioni usate ad oggi:&lt;br /&gt;
* STn sonda/sensore temperatura [n = numero]&lt;br /&gt;
* RHn sonda/sensore umidita` relativa [n = numero]&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Definito dall'utente che programma i &amp;quot;remote&amp;quot;, ma meglio definire una struttura di base ..&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valori&lt;br /&gt;
|&lt;br /&gt;
* TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori&lt;br /&gt;
|&lt;br /&gt;
Assegnato automaticamente dal programma&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UM (Unita` di Misura)&lt;br /&gt;
|&lt;br /&gt;
* °C&lt;br /&gt;
* V (tensione)&lt;br /&gt;
* A (assorbimento)&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Questo e` previsto solo per le segnalazioni/avvisi/allarmi .. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TempoRitardo (secondi)&lt;br /&gt;
|&lt;br /&gt;
* 0.000&lt;br /&gt;
* 1.002&lt;br /&gt;
* ...&lt;br /&gt;
* 99.000 (max impostabile)&lt;br /&gt;
|&lt;br /&gt;
Al momento non previsto, teoricamente i segnali dovrebbero arrivare gia` &amp;quot;filtrati&amp;quot; dai &amp;quot;remote&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! RangeValori&lt;br /&gt;
|&lt;br /&gt;
* 0,100&lt;br /&gt;
* -50,125&lt;br /&gt;
* 0,1&lt;br /&gt;
|&lt;br /&gt;
Da utilizzarsi per definire l'errore e generare una segnalazione di sonda guasta&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMin&lt;br /&gt;
|&lt;br /&gt;
* 10 (temperatura)&lt;br /&gt;
* 0 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sotto a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMax&lt;br /&gt;
|&lt;br /&gt;
* 40 (temperatura)&lt;br /&gt;
* 1 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sopra a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreOn&lt;br /&gt;
|&lt;br /&gt;
* 1 (quando attivo a segnale on)&lt;br /&gt;
* 0 (quando attivo a segnale off)&lt;br /&gt;
* [Valore]&lt;br /&gt;
|&lt;br /&gt;
Valore da utilizzare per alert/alarm, e per definire se si tratta di un segnale negato (zero) e trattarlo di conseguenza&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Allarme&lt;br /&gt;
|&lt;br /&gt;
* ValoreOn&lt;br /&gt;
* ValoreMin&lt;br /&gt;
* ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin&lt;br /&gt;
* ValoreOn,ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin,ValoreMax&lt;br /&gt;
* ValoreMin,ValoreMax&lt;br /&gt;
|&lt;br /&gt;
Quali sono da trattare come allarmi, di default, se impostati, sono trattati come alert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data (e ora)&lt;br /&gt;
|&lt;br /&gt;
* 2016/03/13 20:40:08&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valore&lt;br /&gt;
|&lt;br /&gt;
* 0&lt;br /&gt;
* 1&lt;br /&gt;
* 13&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Promemoria chiavi, codici e ... ==&lt;br /&gt;
&lt;br /&gt;
====== Dati (mqtt) ======&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Topic (mqtt) ======&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria segnale di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria gruppi di livello 1 (redis) ======&lt;br /&gt;
;TYPE&lt;br /&gt;
:graph&lt;br /&gt;
:alarms&lt;br /&gt;
'''sets:TYPE:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria configurazione gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Config'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Notes|Notes]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Primo avvio|Primo avvio]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Test allarmi|Test allarmi]]&lt;br /&gt;
&lt;br /&gt;
= Devices =&lt;br /&gt;
&lt;br /&gt;
Ad oggi, ho predisposto/preparato:&lt;br /&gt;
* [[PorTHable]], che invia valori di temperatura&lt;br /&gt;
* [[ ESP8266/DS1820toMQTT | DS1820toMQTT ]], sensore/i di temperatura&lt;br /&gt;
* [[ ESP8266/PIRtoMQTT | PIRtoMQTT ]], sensore di movimento (PIR)&lt;br /&gt;
* [[ ESP8266/SerialToMQTT_Repeater | SerialToMQTT Repeater ]], che funziona da &amp;quot;repeater&amp;quot;, ritrasmette i dati ricevuti via seriale al broker MQTT&lt;br /&gt;
* [[ Thermo ]], che invia il valore della temperatura (solo di riferimento ad oggi, non le altre sonde)&lt;br /&gt;
* [[ ENC28J60-ATMEGA328P-DS18B20 | ENC28J60 + ATMEGA328P + DS18B20 ]], sensore di temperatura in ethernet&lt;br /&gt;
* [[ Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | ATMEGA328P + ESP8266 + DHT + Rain]], sensore temperatura/umidita` (dht) e pioggia (rain)&lt;br /&gt;
* [[ ESP8266/DHT22toMQTT | DHT22toMQTT ]], sensore di temperatura e umidita`&lt;br /&gt;
* [[ Centralina_livello_1/Dev_HTRL_wAE | ATMEGA328P + ESP8266 + DHT + Rain + Photoresistor]], sensore temperatura/umidita` (dht), pioggia (rain) e luminosita` (photoresistor).&amp;lt;br&amp;gt; Nuova e migliorata (?) versione del precedente [[Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | device]]&lt;br /&gt;
* [[ Cronotermostato settimanale ]]&lt;br /&gt;
* [[ Centralina_livello_1/Centralina_livello_2_PIR | Centralina livello 2 - PIR ]]&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/telegram bot|Telegram Bot per Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
= Problemi e soluzioni ? =&lt;br /&gt;
&lt;br /&gt;
;Eliminazione file di swap&lt;br /&gt;
:Non so se sia stato un problema e sia utile&lt;br /&gt;
::[[Raspberry_PI-Raspbian-Personalizzazioni#Disattivazione|Disattivazione file di swap]]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore salvataggio in background&lt;br /&gt;
:[https://jee-appy.blogspot.it/2016/04/can-not-save-in-background-fork-redis.html Can't save in background: fork: Cannot allocate memory Redis]&lt;br /&gt;
:[https://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory redis bgsave failed because fork Cannot allocate memory]&lt;br /&gt;
:[https://stackoverflow.com/questions/19581059/misconf-redis-is-configured-to-save-rdb-snapshots MISCONF Redis is configured to save RDB snapshots]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore avvio del server&lt;br /&gt;
:Dopo un ripristino del sistema ho avuto dei problemi di permessi al file &amp;quot;dump.rdb&amp;quot; (che ho voluto ricopiare per riprendermi alcune impostazioni), ho reimpostato in &amp;quot;redis:redis&amp;quot; (directory &amp;quot;/var/lib/redis&amp;quot; inclusa) il proprietario e settato i permessi a 660.&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi_Access_Point_WEP2&amp;diff=7285</id>
		<title>Raspberry Pi Access Point WEP2</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi_Access_Point_WEP2&amp;diff=7285"/>
		<updated>2020-09-19T08:00:56Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Versione jessie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Premessa ==&lt;br /&gt;
&lt;br /&gt;
Questo articolo potrebbe contenere inesattezze e/o dimenticanze, oltretutto e` la prima volta che uso e configuro 'hostapd' e 'dnsmasq'.&amp;lt;br /&amp;gt;&lt;br /&gt;
Si declina ogni responsabilita`.&lt;br /&gt;
&lt;br /&gt;
Nell'esempio ho utilizzato la rete &amp;quot;192.168.3.0/24&amp;quot;, cambiatela secondo le vostre neccessita`.&lt;br /&gt;
&lt;br /&gt;
; Note&lt;br /&gt;
: Tutti i comandi ed i file sono da eseguire e/o modificare come utente &amp;quot;root&amp;quot;.&lt;br /&gt;
: In alcuni ho aggiunto &amp;quot;sudo&amp;quot; davanti, ovviamente non e` necessario se gia` siete &amp;quot;root&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Installazione ==&lt;br /&gt;
&lt;br /&gt;
Terminata l'installazione base [[Raspberry_Pi-Raspbian_default_post-install|Raspbian]] (fate eventuale aggiornamento), installiamo alcuni pacchetti necessari:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;apt-get install hostapd hostap-utils dnsmasq&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; iw&lt;br /&gt;
: nell'ultima release di [[Raspbian]] e` gia` installato, l'ho usato per controllare che la chiave usb wifi fosse AP compatibile (comando: &amp;quot;iw list&amp;quot;, poi andate a leggere il report se compare la scritta AP)&lt;br /&gt;
&lt;br /&gt;
== Configurazione ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
&lt;br /&gt;
Per prima cosa ho modificato il file &amp;quot;/etc/network/interfaces&amp;quot; aggiungendo la configurazione per la periferica 'wlan0' (normalmente e` cosi` che viene vista la chiave usb wifi):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# interfaces(5) file used by ifup(8) and ifdown(8)&lt;br /&gt;
&lt;br /&gt;
# Please note that this file is written to be used with dhcpcd&lt;br /&gt;
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'&lt;br /&gt;
&lt;br /&gt;
# Include files from /etc/network/interfaces.d:&lt;br /&gt;
source-directory /etc/network/interfaces.d&lt;br /&gt;
&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
auto eth0&lt;br /&gt;
allow-hotplug eth0&lt;br /&gt;
iface eth0 inet dhcp&lt;br /&gt;
&lt;br /&gt;
allow-hotplug wlan0&lt;br /&gt;
iface wlan0 inet static&lt;br /&gt;
        address 192.168.3.1&lt;br /&gt;
        netmask 255.255.255.0&lt;br /&gt;
        hostapd /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== hostapd ===&lt;br /&gt;
&lt;br /&gt;
Letto &amp;quot;/usr/share/doc/hostapd/README.Debian&amp;quot;, procediamo come indicato, generandoci dall'esempio il file &amp;quot;/etc/hostapd/hostapd.conf&amp;quot;, per ragioni di permessi ho trovato qualche difficolta` ad eseguire il comando cosi` come scritto, questi dovrebbero funzionare:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
zcat /usr/share/doc/hostapd/examples/hostapd.conf.gz &amp;gt; /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per 'sicurezza' ho anche messo il file leggibile/scrivibile solo da 'root'&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo chmod 600 /etc/hostapd/hostapd.conf&lt;br /&gt;
sudo chown root:root /etc/hostapd/hostapd.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ora correggiamo la configurazione secondo le nostre esigenze, modifichiamo &amp;quot;/etc/hostapd/hostapd.conf&amp;quot; (indichero` solo le righe che ho modificato, le altre sono state lasciate inalterate):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
ssid=&amp;lt;MetteteUnNomePerLaReteWifi&amp;gt;&lt;br /&gt;
wpa=2&lt;br /&gt;
wpa_passphrase=&amp;lt;MetteteLaVostra&amp;gt;&lt;br /&gt;
wpa_key_mgmt=WPA-PSK&lt;br /&gt;
rsn_pairwise=CCMP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== dnsmasq ===&lt;br /&gt;
&lt;br /&gt;
Il procedimento e` lo stesso usato per la configurazione 'hostapd', utilizzo dell'esempio e modifiche del caso.&lt;br /&gt;
Correggiamo la configurazione secondo le nostre esigenze, modifichiamo &amp;quot;/etc/dnsmasq.conf&amp;quot; (indichero` solo le righe che ho modificato, le altre sono state lasciate inalterate):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
domain-needed&lt;br /&gt;
bogus-priv&lt;br /&gt;
interface=wlan0&lt;br /&gt;
dhcp-range=192.168.3.2,192.168.3.5,12h&lt;br /&gt;
dhcp-option=option:router,192.168.3.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rimane solo un problema sulla risoluzione del nome macchina (hostname) di questo pc, al momento ho risolto sistemando il file &amp;quot;/etc/hosts&amp;quot; in questo modo, dove ho modificato la penultima ed aggiunto l'ultima riga (esempio reale preso da [[Centralina livello 1]]):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
127.0.0.1       localhost&lt;br /&gt;
::1             localhost ip6-localhost ip6-loopback&lt;br /&gt;
ff02::1         ip6-allnodes&lt;br /&gt;
ff02::2         ip6-allrouters&lt;br /&gt;
&lt;br /&gt;
127.0.1.1       level1error&lt;br /&gt;
192.168.3.1     level1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Firewall (iptables) ===&lt;br /&gt;
&lt;br /&gt;
Normalmente uso un'utility online per generare la base e procedo poi al ritocco secondo le esigenze, l'indirizzo del 'generatore' e`: http://easyfwgen.morizot.net/&lt;br /&gt;
&lt;br /&gt;
Questa e` la configurazione impostata, modificatela secondo le vostre esigenze, considerate sempre di NON usare e/o attivare opzioni che non conoscete e/o sapete a cosa servono. Da Notare che sono stati predisposti servizi che al momento non sono utilizzati, se pensate di non averne bisogno, disattivateli.&lt;br /&gt;
&lt;br /&gt;
(Per migliorarne la lettura ho realizzato diverse schermate, che messe in ordine somigliano alla pagina web che vi troverete ad impostare).&lt;br /&gt;
&lt;br /&gt;
[[File:Easy_Firewall_Generator_for_iptables.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Easy_Firewall_Generator_for_iptables_2.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Easy_Firewall_Generator_for_iptables_3.png]]&lt;br /&gt;
&lt;br /&gt;
Create la vostra configurazione e salvatela in un file chiamato &amp;quot;/etc/init.d/iptables&amp;quot;, cambiate poi i permessi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo chmod 755 /etc/init.d/iptables&lt;br /&gt;
sudo chown root:root /etc/init.d/iptables&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Questa e` quella che ho predisposto, attivando anche servizi come &amp;quot;http&amp;quot; ed &amp;quot;ftp&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# Generated iptables firewall script for the Linux 2.4 kernel&lt;br /&gt;
# Script generated by Easy Firewall Generator for IPTables 1.15&lt;br /&gt;
# copyright 2002 Timothy Scott Morizot&lt;br /&gt;
# &lt;br /&gt;
# Redhat chkconfig comments - firewall applied early,&lt;br /&gt;
#                             removed late&lt;br /&gt;
# chkconfig: 2345 08 92&lt;br /&gt;
# description: This script applies or removes iptables firewall rules&lt;br /&gt;
# &lt;br /&gt;
# This generator is primarily designed for RedHat installations,&lt;br /&gt;
# although it should be adaptable for others.&lt;br /&gt;
#&lt;br /&gt;
# It can be executed with the typical start and stop arguments.&lt;br /&gt;
# If used with stop, it will stop after flushing the firewall.&lt;br /&gt;
# The save and restore arguments will save or restore the rules&lt;br /&gt;
# from the /etc/sysconfig/iptables file.  The save and restore&lt;br /&gt;
# arguments are included to preserve compatibility with&lt;br /&gt;
# Redhat's or Fedora's init.d script if you prefer to use it.&lt;br /&gt;
&lt;br /&gt;
# Redhat/Fedora installation instructions&lt;br /&gt;
#&lt;br /&gt;
# 1. Have the system link the iptables init.d startup script into run states&lt;br /&gt;
#    2, 3, and 5.&lt;br /&gt;
#    chkconfig --level 235 iptables on&lt;br /&gt;
#&lt;br /&gt;
# 2. Save this script and execute it to load the ruleset from this file.&lt;br /&gt;
#    You may need to run the dos2unix command on it to remove carraige returns.&lt;br /&gt;
#&lt;br /&gt;
# 3. To have it applied at startup, copy this script to&lt;br /&gt;
#    /etc/init.d/iptables.  It accepts stop, start, save, and restore&lt;br /&gt;
#    arguments.  (You may wish to save the existing one first.)&lt;br /&gt;
#    Alternatively, if you issue the 'service iptables save' command&lt;br /&gt;
#    the init.d script should save the rules and reload them at runtime.&lt;br /&gt;
#&lt;br /&gt;
# 4. For non-Redhat systems (or Redhat systems if you have a problem), you&lt;br /&gt;
#    may want to append the command to execute this script to rc.local.&lt;br /&gt;
#    rc.local is typically located in /etc and /etc/rc.d and is usually&lt;br /&gt;
#    the last thing executed on startup.  Simply add /path/to/script/script_name&lt;br /&gt;
#    on its own line in the rc.local file.&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# &lt;br /&gt;
# Local Settings&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# sysctl location.  If set, it will use sysctl to adjust the kernel parameters.&lt;br /&gt;
# If this is set to the empty string (or is unset), the use of sysctl&lt;br /&gt;
# is disabled.&lt;br /&gt;
&lt;br /&gt;
SYSCTL=&amp;quot;/sbin/sysctl -w&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# To echo the value directly to the /proc file instead&lt;br /&gt;
# SYSCTL=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# IPTables Location - adjust if needed&lt;br /&gt;
&lt;br /&gt;
IPT=&amp;quot;/sbin/iptables&amp;quot;&lt;br /&gt;
IPTS=&amp;quot;/sbin/iptables-save&amp;quot;&lt;br /&gt;
IPTR=&amp;quot;/sbin/iptables-restore&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Internet Interface&lt;br /&gt;
INET_IFACE=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Local Interface Information&lt;br /&gt;
LOCAL_IFACE=&amp;quot;wlan0&amp;quot;&lt;br /&gt;
LOCAL_IP=&amp;quot;192.168.3.1&amp;quot;&lt;br /&gt;
LOCAL_NET=&amp;quot;192.168.3.0/24&amp;quot;&lt;br /&gt;
LOCAL_BCAST=&amp;quot;192.168.3.255&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Localhost Interface&lt;br /&gt;
&lt;br /&gt;
LO_IFACE=&amp;quot;lo&amp;quot;&lt;br /&gt;
LO_IP=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Save and Restore arguments handled here&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; = &amp;quot;save&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
	echo -n &amp;quot;Saving firewall to /etc/sysconfig/iptables ... &amp;quot;&lt;br /&gt;
	$IPTS &amp;gt; /etc/sysconfig/iptables&lt;br /&gt;
	echo &amp;quot;done&amp;quot;&lt;br /&gt;
	exit 0&lt;br /&gt;
elif [ &amp;quot;$1&amp;quot; = &amp;quot;restore&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
	echo -n &amp;quot;Restoring firewall from /etc/sysconfig/iptables ... &amp;quot;&lt;br /&gt;
	$IPTR &amp;lt; /etc/sysconfig/iptables&lt;br /&gt;
	echo &amp;quot;done&amp;quot;&lt;br /&gt;
	exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Load Modules&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Loading kernel modules ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# You should uncomment the line below and run it the first time just to&lt;br /&gt;
# ensure all kernel module dependencies are OK.  There is no need to run&lt;br /&gt;
# every time, however.&lt;br /&gt;
&lt;br /&gt;
# /sbin/depmod -a&lt;br /&gt;
&lt;br /&gt;
# Unless you have kernel module auto-loading disabled, you should not&lt;br /&gt;
# need to manually load each of these modules.  Other than ip_tables,&lt;br /&gt;
# ip_conntrack, and some of the optional modules, I've left these&lt;br /&gt;
# commented by default.  Uncomment if you have any problems or if&lt;br /&gt;
# you have disabled module autoload.  Note that some modules must&lt;br /&gt;
# be loaded by another kernel module.&lt;br /&gt;
&lt;br /&gt;
# core netfilter module&lt;br /&gt;
/sbin/modprobe ip_tables&lt;br /&gt;
&lt;br /&gt;
# the stateful connection tracking module&lt;br /&gt;
/sbin/modprobe ip_conntrack&lt;br /&gt;
&lt;br /&gt;
# filter table module&lt;br /&gt;
# /sbin/modprobe iptable_filter&lt;br /&gt;
&lt;br /&gt;
# mangle table module&lt;br /&gt;
# /sbin/modprobe iptable_mangle&lt;br /&gt;
&lt;br /&gt;
# nat table module&lt;br /&gt;
# /sbin/modprobe iptable_nat&lt;br /&gt;
&lt;br /&gt;
# LOG target module&lt;br /&gt;
# /sbin/modprobe ipt_LOG&lt;br /&gt;
&lt;br /&gt;
# This is used to limit the number of packets per sec/min/hr&lt;br /&gt;
# /sbin/modprobe ipt_limit&lt;br /&gt;
&lt;br /&gt;
# masquerade target module&lt;br /&gt;
# /sbin/modprobe ipt_MASQUERADE&lt;br /&gt;
&lt;br /&gt;
# filter using owner as part of the match&lt;br /&gt;
# /sbin/modprobe ipt_owner&lt;br /&gt;
&lt;br /&gt;
# REJECT target drops the packet and returns an ICMP response.&lt;br /&gt;
# The response is configurable.  By default, connection refused.&lt;br /&gt;
# /sbin/modprobe ipt_REJECT&lt;br /&gt;
&lt;br /&gt;
# This target allows packets to be marked in the mangle table&lt;br /&gt;
# /sbin/modprobe ipt_mark&lt;br /&gt;
&lt;br /&gt;
# This target affects the TCP MSS&lt;br /&gt;
# /sbin/modprobe ipt_tcpmss&lt;br /&gt;
&lt;br /&gt;
# This match allows multiple ports instead of a single port or range&lt;br /&gt;
# /sbin/modprobe multiport&lt;br /&gt;
&lt;br /&gt;
# This match checks against the TCP flags&lt;br /&gt;
# /sbin/modprobe ipt_state&lt;br /&gt;
&lt;br /&gt;
# This match catches packets with invalid flags&lt;br /&gt;
# /sbin/modprobe ipt_unclean&lt;br /&gt;
&lt;br /&gt;
# The ftp nat module is required for non-PASV ftp support&lt;br /&gt;
/sbin/modprobe ip_nat_ftp&lt;br /&gt;
&lt;br /&gt;
# the module for full ftp connection tracking&lt;br /&gt;
/sbin/modprobe ip_conntrack_ftp&lt;br /&gt;
&lt;br /&gt;
# the module for full irc connection tracking&lt;br /&gt;
/sbin/modprobe ip_conntrack_irc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Kernel Parameter Configuration&lt;br /&gt;
#&lt;br /&gt;
# See http://ipsysctl-tutorial.frozentux.net/chunkyhtml/index.html&lt;br /&gt;
# for a detailed tutorial on sysctl and the various settings&lt;br /&gt;
# available.&lt;br /&gt;
&lt;br /&gt;
# Required to enable IPv4 forwarding.&lt;br /&gt;
# Redhat users can try setting FORWARD_IPV4 in /etc/sysconfig/network to true&lt;br /&gt;
# Alternatively, it can be set in /etc/sysctl.conf&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.ip_forward=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This enables dynamic address hacking.&lt;br /&gt;
# This may help if you have a dynamic IP address \(e.g. slip, ppp, dhcp\).&lt;br /&gt;
#if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
#then&lt;br /&gt;
#    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/ip_dynaddr&lt;br /&gt;
#else&lt;br /&gt;
#    $SYSCTL net.ipv4.ip_dynaddr=&amp;quot;1&amp;quot;&lt;br /&gt;
#fi&lt;br /&gt;
&lt;br /&gt;
# This enables SYN flood protection.&lt;br /&gt;
# The SYN cookies activation allows your system to accept an unlimited&lt;br /&gt;
# number of TCP connections while still trying to give reasonable&lt;br /&gt;
# service during a denial of service attack.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/tcp_syncookies&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.tcp_syncookies=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This enables source validation by reversed path according to RFC1812.&lt;br /&gt;
# In other words, did the response packet originate from the same interface&lt;br /&gt;
# through which the source packet was sent?  It's recommended for single-homed&lt;br /&gt;
# systems and routers on stub networks.  Since those are the configurations&lt;br /&gt;
# this firewall is designed to support, I turn it on by default.&lt;br /&gt;
# Turn it off if you use multiple NICs connected to the same network.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/rp_filter&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.rp_filter=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option allows a subnet to be firewalled with a single IP address.&lt;br /&gt;
# It's used to build a DMZ.  Since that's not a focus of this firewall&lt;br /&gt;
# script, it's not enabled by default, but is included for reference.&lt;br /&gt;
# See: http://www.sjdjweis.com/linux/proxyarp/ &lt;br /&gt;
#if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
#then&lt;br /&gt;
#    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/proxy_arp&lt;br /&gt;
#else&lt;br /&gt;
#    $SYSCTL net.ipv4.conf.all.proxy_arp=&amp;quot;1&amp;quot;&lt;br /&gt;
#fi&lt;br /&gt;
&lt;br /&gt;
# The following kernel settings were suggested by Alex Weeks. Thanks!&lt;br /&gt;
&lt;br /&gt;
# This kernel parameter instructs the kernel to ignore all ICMP&lt;br /&gt;
# echo requests sent to the broadcast address.  This prevents&lt;br /&gt;
# a number of smurfs and similar DoS nasty attacks.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.icmp_echo_ignore_broadcasts=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option can be used to accept or refuse source routed&lt;br /&gt;
# packets.  It is usually on by default, but is generally&lt;br /&gt;
# considered a security risk.  This option turns it off.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;0&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/accept_source_route&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.accept_source_route=&amp;quot;0&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option can disable ICMP redirects.  ICMP redirects&lt;br /&gt;
# are generally considered a security risk and shouldn't be&lt;br /&gt;
# needed by most systems using this generator.&lt;br /&gt;
#if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
#then&lt;br /&gt;
#    echo &amp;quot;0&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/accept_redirects&lt;br /&gt;
#else&lt;br /&gt;
#    $SYSCTL net.ipv4.conf.all.accept_redirects=&amp;quot;0&amp;quot;&lt;br /&gt;
#fi&lt;br /&gt;
&lt;br /&gt;
# However, we'll ensure the secure_redirects option is on instead.&lt;br /&gt;
# This option accepts only from gateways in the default gateways list.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/secure_redirects&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.secure_redirects=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# This option logs packets from impossible addresses.&lt;br /&gt;
if [ &amp;quot;$SYSCTL&amp;quot; = &amp;quot;&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
    echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/conf/all/log_martians&lt;br /&gt;
else&lt;br /&gt;
    $SYSCTL net.ipv4.conf.all.log_martians=&amp;quot;1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Flush Any Existing Rules or Chains&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Flushing Tables ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Reset Default Policies&lt;br /&gt;
$IPT -P INPUT ACCEPT&lt;br /&gt;
$IPT -P FORWARD ACCEPT&lt;br /&gt;
$IPT -P OUTPUT ACCEPT&lt;br /&gt;
$IPT -t nat -P PREROUTING ACCEPT&lt;br /&gt;
$IPT -t nat -P POSTROUTING ACCEPT&lt;br /&gt;
$IPT -t nat -P OUTPUT ACCEPT&lt;br /&gt;
$IPT -t mangle -P PREROUTING ACCEPT&lt;br /&gt;
$IPT -t mangle -P OUTPUT ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Flush all rules&lt;br /&gt;
$IPT -F&lt;br /&gt;
$IPT -t nat -F&lt;br /&gt;
$IPT -t mangle -F&lt;br /&gt;
&lt;br /&gt;
# Erase all non-default chains&lt;br /&gt;
$IPT -X&lt;br /&gt;
$IPT -t nat -X&lt;br /&gt;
$IPT -t mangle -X&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$1&amp;quot; = &amp;quot;stop&amp;quot; ]&lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;Firewall completely flushed!  Now running with no firewall.&amp;quot;&lt;br /&gt;
	exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Rules Configuration&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Filter Table&lt;br /&gt;
#&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Set Policies&lt;br /&gt;
&lt;br /&gt;
$IPT -P INPUT DROP&lt;br /&gt;
$IPT -P OUTPUT DROP&lt;br /&gt;
$IPT -P FORWARD DROP&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# User-Specified Chains&lt;br /&gt;
#&lt;br /&gt;
# Create user chains to reduce the number of rules each packet&lt;br /&gt;
# must traverse.&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Create and populate custom rule chains ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Create a chain to filter INVALID packets&lt;br /&gt;
&lt;br /&gt;
$IPT -N bad_packets&lt;br /&gt;
&lt;br /&gt;
# Create another chain to filter bad tcp packets&lt;br /&gt;
&lt;br /&gt;
$IPT -N bad_tcp_packets&lt;br /&gt;
&lt;br /&gt;
# Create separate chains for icmp, tcp (incoming and outgoing),&lt;br /&gt;
# and incoming udp packets.&lt;br /&gt;
&lt;br /&gt;
$IPT -N icmp_packets&lt;br /&gt;
&lt;br /&gt;
# Used for UDP packets inbound from the Internet&lt;br /&gt;
$IPT -N udp_inbound&lt;br /&gt;
&lt;br /&gt;
# Used to block outbound UDP services from internal network&lt;br /&gt;
# Default to allow all&lt;br /&gt;
$IPT -N udp_outbound&lt;br /&gt;
&lt;br /&gt;
# Used to allow inbound services if desired&lt;br /&gt;
# Default fail except for established sessions&lt;br /&gt;
$IPT -N tcp_inbound&lt;br /&gt;
&lt;br /&gt;
# Used to block outbound services from internal network&lt;br /&gt;
# Default to allow all&lt;br /&gt;
$IPT -N tcp_outbound&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# Populate User Chains&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# bad_packets chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# Drop packets received on the external interface&lt;br /&gt;
# claiming a source of the local network&lt;br /&gt;
$IPT -A bad_packets -p ALL -i $INET_IFACE -s $LOCAL_NET -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Illegal source: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_packets -p ALL -i $INET_IFACE -s $LOCAL_NET -j DROP&lt;br /&gt;
&lt;br /&gt;
# Drop INVALID packets immediately&lt;br /&gt;
$IPT -A bad_packets -p ALL -m state --state INVALID -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Invalid packet: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_packets -p ALL -m state --state INVALID -j DROP&lt;br /&gt;
&lt;br /&gt;
# Then check the tcp packets for additional problems&lt;br /&gt;
$IPT -A bad_packets -p tcp -j bad_tcp_packets&lt;br /&gt;
&lt;br /&gt;
# All good, so return&lt;br /&gt;
$IPT -A bad_packets -p ALL -j RETURN&lt;br /&gt;
&lt;br /&gt;
# bad_tcp_packets chain&lt;br /&gt;
#&lt;br /&gt;
# All tcp packets will traverse this chain.&lt;br /&gt;
# Every new connection attempt should begin with&lt;br /&gt;
# a syn packet.  If it doesn't, it is likely a&lt;br /&gt;
# port scan.  This drops packets in state&lt;br /&gt;
# NEW that are not flagged as syn packets.&lt;br /&gt;
&lt;br /&gt;
# Return to the calling chain if the bad packets originate&lt;br /&gt;
# from the local interface. This maintains the approach&lt;br /&gt;
# throughout this firewall of a largely trusted internal&lt;br /&gt;
# network.&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp -i $LOCAL_IFACE -j RETURN&lt;br /&gt;
&lt;br /&gt;
# However, I originally did apply this filter to the forward chain&lt;br /&gt;
# for packets originating from the internal network.  While I have&lt;br /&gt;
# not conclusively determined its effect, it appears to have the&lt;br /&gt;
# interesting side effect of blocking some of the ad systems.&lt;br /&gt;
# Apparently some ad systems have the browser initiate a NEW&lt;br /&gt;
# connection that is not flagged as a syn packet to retrieve&lt;br /&gt;
# the ad image.  If you wish to experiment further comment the&lt;br /&gt;
# rule above. If you try it, you may also wish to uncomment the&lt;br /&gt;
# rule below.  It will keep those packets from being logged.&lt;br /&gt;
# There are a lot of them.&lt;br /&gt;
# $IPT -A bad_tcp_packets -p tcp -i $LOCAL_IFACE ! --syn -m state \&lt;br /&gt;
#     --state NEW -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;New not syn: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP&lt;br /&gt;
&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP&lt;br /&gt;
&lt;br /&gt;
# All good, so return&lt;br /&gt;
$IPT -A bad_tcp_packets -p tcp -j RETURN&lt;br /&gt;
&lt;br /&gt;
# icmp_packets chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is for inbound (from the Internet) icmp packets only.&lt;br /&gt;
# Type 8 (Echo Request) is not accepted by default&lt;br /&gt;
# Enable it if you want remote hosts to be able to reach you.&lt;br /&gt;
# 11 (Time Exceeded) is the only one accepted&lt;br /&gt;
# that would not already be covered by the established&lt;br /&gt;
# connection rule.  Applied to INPUT on the external interface.&lt;br /&gt;
# &lt;br /&gt;
# See: http://www.ee.siue.edu/~rwalden/networking/icmp.html&lt;br /&gt;
# for more info on ICMP types.&lt;br /&gt;
#&lt;br /&gt;
# Note that the stateful settings allow replies to ICMP packets.&lt;br /&gt;
# These rules allow new packets of the specified types.&lt;br /&gt;
&lt;br /&gt;
# ICMP packets should fit in a Layer 2 frame, thus they should&lt;br /&gt;
# never be fragmented.  Fragmented ICMP packets are a typical sign&lt;br /&gt;
# of a denial of service attack.&lt;br /&gt;
$IPT -A icmp_packets --fragment -p ICMP -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;ICMP Fragment: &amp;quot;&lt;br /&gt;
$IPT -A icmp_packets --fragment -p ICMP -j DROP&lt;br /&gt;
&lt;br /&gt;
# Echo - uncomment to allow your system to be pinged.&lt;br /&gt;
# Uncomment the LOG command if you also want to log PING attempts&lt;br /&gt;
# &lt;br /&gt;
# $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j LOG \&lt;br /&gt;
#    --log-prefix &amp;quot;Ping detected: &amp;quot;&lt;br /&gt;
# $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# By default, however, drop pings without logging. Blaster&lt;br /&gt;
# and other worms have infected systems blasting pings.&lt;br /&gt;
# Comment the line below if you want pings logged, but it&lt;br /&gt;
# will likely fill your logs.&lt;br /&gt;
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j DROP&lt;br /&gt;
&lt;br /&gt;
# Time Exceeded&lt;br /&gt;
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Not matched, so return so it will be logged&lt;br /&gt;
$IPT -A icmp_packets -p ICMP -j RETURN&lt;br /&gt;
&lt;br /&gt;
# TCP &amp;amp; UDP&lt;br /&gt;
# Identify ports at:&lt;br /&gt;
#    http://www.chebucto.ns.ca/~rakerman/port-table.html&lt;br /&gt;
#    http://www.iana.org/assignments/port-numbers&lt;br /&gt;
&lt;br /&gt;
# udp_inbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain describes the inbound UDP packets it will accept.&lt;br /&gt;
# It's applied to INPUT on the external or Internet interface.&lt;br /&gt;
# Note that the stateful settings allow replies.&lt;br /&gt;
# These rules are for new requests.&lt;br /&gt;
# It drops netbios packets (windows) immediately without logging.&lt;br /&gt;
&lt;br /&gt;
# Drop netbios calls&lt;br /&gt;
# Please note that these rules do not really change the way the firewall&lt;br /&gt;
# treats netbios connections.  Connections from the localhost and&lt;br /&gt;
# internal interface (if one exists) are accepted by default.&lt;br /&gt;
# Responses from the Internet to requests initiated by or through&lt;br /&gt;
# the firewall are also accepted by default.  To get here, the&lt;br /&gt;
# packets would have to be part of a new request received by the&lt;br /&gt;
# Internet interface.  You would have to manually add rules to&lt;br /&gt;
# accept these.  I added these rules because some network connections,&lt;br /&gt;
# such as those via cable modems, tend to be filled with noise from&lt;br /&gt;
# unprotected Windows machines.  These rules drop those packets&lt;br /&gt;
# quickly and without logging them.  This prevents them from traversing&lt;br /&gt;
# the whole chain and keeps the log from getting cluttered with&lt;br /&gt;
# chatter from Windows systems.&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 137 -j DROP&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 138 -j DROP&lt;br /&gt;
&lt;br /&gt;
# Network Time Protocol (NTP) Server&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 123 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# DNS Server&lt;br /&gt;
# Configure the server to use port 53 as the source port for requests&lt;br /&gt;
# Note, if you run a caching-only name server that only accepts queries&lt;br /&gt;
# from the private network or localhost, you can comment out this line.&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 53 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# If you don't query-source the server to port 53 and you have problems,&lt;br /&gt;
# uncomment this rule.  It specifically allows responses to queries&lt;br /&gt;
# initiated to another server from a high UDP port.  The stateful&lt;br /&gt;
# connection rules should handle this situation, though.&lt;br /&gt;
# $IPT -A udp_inbound -p UDP -s 0/0 --source-port 53 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Dynamic Address&lt;br /&gt;
# If DHCP, the initial request is a broadcast. The response&lt;br /&gt;
# doesn't exactly match the outbound packet.  This explicitly&lt;br /&gt;
# allow the DHCP ports to alleviate this problem.&lt;br /&gt;
# If you receive your dynamic address by a different means, you&lt;br /&gt;
# can probably comment this line.&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --source-port 67 --destination-port 68 \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Network File System (NFS) Server&lt;br /&gt;
# Please note that additional services must&lt;br /&gt;
# be configured in order to support an NFS Server through&lt;br /&gt;
# the firewall. Read the help in the generator or this site:&lt;br /&gt;
# http://www.lowth.com/LinWiz/nfs_help.html&lt;br /&gt;
&lt;br /&gt;
# NFS Server - portmapper&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 111 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - statd&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9400 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - NFS daemon&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 2049 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - lockd&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9401 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - mountd&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9402 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - quotad&lt;br /&gt;
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 9403 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Not matched, so return for logging&lt;br /&gt;
$IPT -A udp_inbound -p UDP -j RETURN&lt;br /&gt;
&lt;br /&gt;
# udp_outbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is used with a private network to prevent forwarding for&lt;br /&gt;
# UDP requests on specific protocols.  Applied to the FORWARD rule from&lt;br /&gt;
# the internal network.  Ends with an ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# No match, so ACCEPT&lt;br /&gt;
$IPT -A udp_outbound -p UDP -s 0/0 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# tcp_inbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is used to allow inbound connections to the&lt;br /&gt;
# system/gateway.  Use with care.  It defaults to none.&lt;br /&gt;
# It's applied on INPUT from the external or Internet interface.&lt;br /&gt;
&lt;br /&gt;
# DNS Server - Allow TCP connections (zone transfers and large requests)&lt;br /&gt;
# This is disabled by default.  DNS Zone transfers occur via TCP.&lt;br /&gt;
# If you need to allow transfers over the net you need to uncomment this line.&lt;br /&gt;
# If you allow queries from the 'net, you also need to be aware that although&lt;br /&gt;
# DNS queries use UDP by default, a truncated UDP query can legally be&lt;br /&gt;
# submitted via TCP instead.  You probably will never need it, but should&lt;br /&gt;
# be aware of the fact.&lt;br /&gt;
# $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 53 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Web Server&lt;br /&gt;
&lt;br /&gt;
# HTTP&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 80 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# HTTPS (Secure Web Server)&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 443 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# FTP Server (Control)&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 21 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# FTP Client (Data Port for non-PASV transfers)&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --source-port 20 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Passive FTP&lt;br /&gt;
# &lt;br /&gt;
# With passive FTP, the server provides a port to the client&lt;br /&gt;
# and allows the client to initiate the connection rather&lt;br /&gt;
# than initiating the connection with the client from the data port.&lt;br /&gt;
# Web browsers and clients operating behind a firewall generally&lt;br /&gt;
# use passive ftp transfers.  A general purpose FTP server&lt;br /&gt;
# will need to support them.&lt;br /&gt;
# &lt;br /&gt;
# However, by default an FTP server will select a port from the entire&lt;br /&gt;
# range of high ports.  It is not particularly safe to open all&lt;br /&gt;
# high ports.  Fortunately, that range can be restricted.  This&lt;br /&gt;
# firewall presumes that the range has been restricted to a specific&lt;br /&gt;
# selected range.  That range must also be configured in the ftp server.&lt;br /&gt;
# &lt;br /&gt;
# Instructions for specifying the port range for the wu-ftpd server&lt;br /&gt;
# can be found here:&lt;br /&gt;
# http://www.wu-ftpd.org/man/ftpaccess.html&lt;br /&gt;
# (See the passive ports option.)&lt;br /&gt;
# &lt;br /&gt;
# Instructions for the ProFTPD server can be found here:&lt;br /&gt;
# http://proftpd.linux.co.uk/localsite/Userguide/linked/x861.html&lt;br /&gt;
&lt;br /&gt;
# Sample Rule&lt;br /&gt;
# $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 62000:64000 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# sshd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Network File System (NFS) Server&lt;br /&gt;
# Please note that additional services must&lt;br /&gt;
# be configured in order to support an NFS Server through&lt;br /&gt;
# the firewall. Read the help in the generator or this site:&lt;br /&gt;
# http://www.lowth.com/LinWiz/nfs_help.html&lt;br /&gt;
&lt;br /&gt;
# NFS Server - portmapper&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 111 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - statd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9400 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - NFS daemon&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 2049 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - lockd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9401 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - mountd&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9402 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# NFS Server - quotad&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 9403 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# User specified allowed TCP protocol&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 8080:8081 -j ACCEPT&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 10301:10302 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Not matched, so return so it will be logged&lt;br /&gt;
$IPT -A tcp_inbound -p TCP -j RETURN&lt;br /&gt;
&lt;br /&gt;
# tcp_outbound chain&lt;br /&gt;
#&lt;br /&gt;
# This chain is used with a private network to prevent forwarding for&lt;br /&gt;
# requests on specific protocols.  Applied to the FORWARD rule from&lt;br /&gt;
# the internal network.  Ends with an ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Block Outbound Telnet&lt;br /&gt;
$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 23 -j REJECT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# No match, so ACCEPT&lt;br /&gt;
$IPT -A tcp_outbound -p TCP -s 0/0 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# INPUT Chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Process INPUT chain ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Allow all on localhost interface&lt;br /&gt;
$IPT -A INPUT -p ALL -i $LO_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Drop bad packets&lt;br /&gt;
$IPT -A INPUT -p ALL -j bad_packets&lt;br /&gt;
&lt;br /&gt;
# DOCSIS compliant cable modems&lt;br /&gt;
# Some DOCSIS compliant cable modems send IGMP multicasts to find&lt;br /&gt;
# connected PCs.  The multicast packets have the destination address&lt;br /&gt;
# 224.0.0.1.  You can accept them.  If you choose to do so,&lt;br /&gt;
# Uncomment the rule to ACCEPT them and comment the rule to DROP&lt;br /&gt;
# them  The firewall will drop them here by default to avoid&lt;br /&gt;
# cluttering the log.  The firewall will drop all multicasts&lt;br /&gt;
# to the entire subnet (224.0.0.1) by default.  To only affect&lt;br /&gt;
# IGMP multicasts, change '-p ALL' to '-p 2'.  Of course,&lt;br /&gt;
# if they aren't accepted elsewhere, it will only ensure that&lt;br /&gt;
# multicasts on other protocols are logged.&lt;br /&gt;
# Drop them without logging.&lt;br /&gt;
$IPT -A INPUT -p ALL -d 224.0.0.1 -j DROP&lt;br /&gt;
# The rule to accept the packets.&lt;br /&gt;
# $IPT -A INPUT -p ALL -d 224.0.0.1 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Rules for the private network (accessing gateway system itself)&lt;br /&gt;
$IPT -A INPUT -p ALL -i $LOCAL_IFACE -s $LOCAL_NET -j ACCEPT&lt;br /&gt;
$IPT -A INPUT -p ALL -i $LOCAL_IFACE -d $LOCAL_BCAST -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Allow DHCP client request packets inbound from internal network&lt;br /&gt;
$IPT -A INPUT -p UDP -i $LOCAL_IFACE --source-port 68 --destination-port 67 \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Inbound Internet Packet Rules&lt;br /&gt;
&lt;br /&gt;
# Accept Established Connections&lt;br /&gt;
$IPT -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Route the rest to the appropriate user chain&lt;br /&gt;
$IPT -A INPUT -p TCP -i $INET_IFACE -j tcp_inbound&lt;br /&gt;
$IPT -A INPUT -p UDP -i $INET_IFACE -j udp_inbound&lt;br /&gt;
$IPT -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets&lt;br /&gt;
&lt;br /&gt;
# Drop without logging broadcasts that get this far.&lt;br /&gt;
# Cuts down on log clutter.&lt;br /&gt;
# Comment this line if testing new rules that impact&lt;br /&gt;
# broadcast protocols.&lt;br /&gt;
$IPT -A INPUT -m pkttype --pkt-type broadcast -j DROP&lt;br /&gt;
&lt;br /&gt;
# Log packets that still don't match&lt;br /&gt;
$IPT -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;INPUT packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# FORWARD Chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Process FORWARD chain ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Used if forwarding for a private network&lt;br /&gt;
&lt;br /&gt;
# Drop bad packets&lt;br /&gt;
$IPT -A FORWARD -p ALL -j bad_packets&lt;br /&gt;
&lt;br /&gt;
# Accept TCP packets we want to forward from internal sources&lt;br /&gt;
$IPT -A FORWARD -p tcp -i $LOCAL_IFACE -j tcp_outbound&lt;br /&gt;
&lt;br /&gt;
# Accept UDP packets we want to forward from internal sources&lt;br /&gt;
$IPT -A FORWARD -p udp -i $LOCAL_IFACE -j udp_outbound&lt;br /&gt;
&lt;br /&gt;
# If not blocked, accept any other packets from the internal interface&lt;br /&gt;
$IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Deal with responses from the internet&lt;br /&gt;
$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED \&lt;br /&gt;
     -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Port Forwarding is enabled, so accept forwarded traffic&lt;br /&gt;
$IPT -A FORWARD -p tcp -i $INET_IFACE --destination-port 80 \&lt;br /&gt;
     --destination 191.168.3.2 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# Log packets that still don't match&lt;br /&gt;
$IPT -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;FORWARD packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# OUTPUT Chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Process OUTPUT chain ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Generally trust the firewall on output&lt;br /&gt;
&lt;br /&gt;
# However, invalid icmp packets need to be dropped&lt;br /&gt;
# to prevent a possible exploit.&lt;br /&gt;
$IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP&lt;br /&gt;
&lt;br /&gt;
# Localhost&lt;br /&gt;
$IPT -A OUTPUT -p ALL -s $LO_IP -j ACCEPT&lt;br /&gt;
$IPT -A OUTPUT -p ALL -o $LO_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# To internal network&lt;br /&gt;
$IPT -A OUTPUT -p ALL -s $LOCAL_IP -j ACCEPT&lt;br /&gt;
$IPT -A OUTPUT -p ALL -o $LOCAL_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# To internet&lt;br /&gt;
$IPT -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Log packets that still don't match&lt;br /&gt;
$IPT -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \&lt;br /&gt;
    --log-prefix &amp;quot;OUTPUT packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# nat table&lt;br /&gt;
#&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# The nat table is where network address translation occurs if there&lt;br /&gt;
# is a private network.  If the gateway is connected to the Internet&lt;br /&gt;
# with a static IP, snat is used.  If the gateway has a dynamic address,&lt;br /&gt;
# masquerade must be used instead.  There is more overhead associated&lt;br /&gt;
# with masquerade, so snat is better when it can be used.&lt;br /&gt;
# The nat table has a builtin chain, PREROUTING, for dnat and redirects.&lt;br /&gt;
# Another, POSTROUTING, handles snat and masquerade.&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Load rules for nat table ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# PREROUTING chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# Port Forwarding&lt;br /&gt;
# &lt;br /&gt;
# Port forwarding forwards all traffic on a port or ports from&lt;br /&gt;
# the firewall to a computer on the internal LAN.  This can&lt;br /&gt;
# be required to support special situations.  For instance,&lt;br /&gt;
# this is the only way to support file transfers with an ICQ&lt;br /&gt;
# client on an internal computer.  It's also required if an internal&lt;br /&gt;
# system hosts a service such as a web server.  However, it's also&lt;br /&gt;
# a dangerous option.  It allows Internet computers access to&lt;br /&gt;
# your internal network.  Use it carefully and only if you're&lt;br /&gt;
# certain you know what you're doing.&lt;br /&gt;
&lt;br /&gt;
$IPT -t nat -A PREROUTING -p tcp -i $INET_IFACE --destination-port 10380 \&lt;br /&gt;
     -j DNAT --to-destination 191.168.3.2:80&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# POSTROUTING chain&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
$IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
#&lt;br /&gt;
# mangle table&lt;br /&gt;
#&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# The mangle table is used to alter packets.  It can alter or mangle them in&lt;br /&gt;
# several ways.  For the purposes of this generator, we only use its ability&lt;br /&gt;
# to alter the TTL in packets.  However, it can be used to set netfilter&lt;br /&gt;
# mark values on specific packets.  Those marks could then be used in another&lt;br /&gt;
# table like filter, to limit activities associated with a specific host, for&lt;br /&gt;
# instance.  The TOS target can be used to set the Type of Service field in&lt;br /&gt;
# the IP header.  Note that the TTL target might not be included in the&lt;br /&gt;
# distribution on your system.  If it is not and you require it, you will&lt;br /&gt;
# have to add it.  That may require that you build from source.&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Load rules for mangle table ...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Set the TTL in outbound packets to the same consistent value.&lt;br /&gt;
# A value around 128 is a good value.  Do not set this too high as&lt;br /&gt;
# it will adversely affect your network.  It is also considered bad&lt;br /&gt;
# form on the Internet.&lt;br /&gt;
$IPT -t mangle -A OUTPUT -o $INET_IFACE -j TTL --ttl-set 128&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Faccio notare le due principali regole che abilitano &amp;quot;l'attraversamento&amp;quot; della rete (la navigazione, se possibile ovviamente, perche` il sistema a cui sto` lavorando non lo prevedera` visto che non intendo collegare la porta di rete 'eth0' da nessuna parte, anche se rimarra` disponibile e predisposta):&lt;br /&gt;
; echo &amp;quot;1&amp;quot; &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
: Chiamato generalmente &amp;quot;forward&amp;quot;, serve per ritrasmettere i pacchetti che devono attraversare/passare dalla rete locale ad un'altra&lt;br /&gt;
; $IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE&lt;br /&gt;
: Chiamato generalemnte &amp;quot;masquerade&amp;quot;, funziona da mascheramento degli indirizzi della rete locale verso le altre.&lt;br /&gt;
&lt;br /&gt;
== Riavvio ==&lt;br /&gt;
&lt;br /&gt;
; Importante&lt;br /&gt;
: ''Sconsiglio la modalita` di esecuzione dello script iptables come qua descritta, solo perche` non essendo in linea (o congruente, come dir si voglia) con gli altri script di avvio genera poi errori (solo a video) quando si installano e rimuovo altri pacchetti software.''&lt;br /&gt;
: ''Suggerirei di posizionarlo in una directory differente, per esempio &amp;quot;/etc/myscripts/&amp;quot; ed avviarlo da &amp;quot;/etc/rc.local&amp;quot;'' (nda: Aggiungere link all'esempio che sara` in un nuovo 'progetto').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Be`, le modifiche sono state tante, avrei potuto riavviare tutti i servizi, ma ho optato per riavviare il Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
=== Versione wheezy ===&lt;br /&gt;
&lt;br /&gt;
Prima di riavviare ho installato il mio gestore di &amp;quot;init&amp;quot; preferito, per avviare &amp;quot;iptables&amp;quot; all'avvio del sistema:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo aptitude install sysv-rc-conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avete letto fra le descrizioni all'inizio del file che abbiamo generato vero ? Funziona con i comandi &amp;quot;start&amp;quot; e &amp;quot;stop&amp;quot;, ma se provate ad utilizzare il comando ora &amp;quot;iptables&amp;quot; non comparira` fra i servizi, quindi riavviamo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo reboot;exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Autentichiamoci, eseguiamo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sysv-rc-conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
e attiviamo &amp;quot;iptables&amp;quot; al &amp;quot;runlevel 2&amp;quot;, come da immagine (ci si sposta coi tasti freccia ed al punto desiderato si preme la barra spaziatrice, per uscire il tasto &amp;quot;q&amp;quot;):&lt;br /&gt;
[[File:sysv-rc-conf_iptables.png]]&lt;br /&gt;
&lt;br /&gt;
Ancora non era in avvio, dai prossimi riavii lo sara, ma ora dobbiamo avviarlo:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo service iptables start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Versione jessie ===&lt;br /&gt;
&lt;br /&gt;
Ho modificato il firewall &amp;quot;/etc/init.d/iptables&amp;quot;, aggiungendo all'inizio del file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          iptables&lt;br /&gt;
# Required-Start:    $hostapd&lt;br /&gt;
# Required-Stop:&lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:&lt;br /&gt;
# Short-Description: Run iptables firewall /etc/init.d/iptables if it exist&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:''Ho scelto di avviarlo dopo &amp;quot;hostapd&amp;quot; perche` questo firewall l'ho usato per la &amp;quot;wlan&amp;quot;, credo che funzioni ugualmente se specificato &amp;quot;network&amp;quot;.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Poi ho dato i comandi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl status iptables&lt;br /&gt;
sudo systemctl enable iptables&lt;br /&gt;
sudo update-rc.d iptables defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Versione &amp;quot;buster&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl status iptables&lt;br /&gt;
sudo systemctl enable iptables&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... e ho riavviato.&lt;br /&gt;
&lt;br /&gt;
Per testare che sia in funzione, potete usare il comando:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo iptables --list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test finale ==&lt;br /&gt;
&lt;br /&gt;
''Non resta che provare il collegamento da un client, mi raccomando di inserire il SSID e la Passphrase, quelle che avete utilizzato nella configurazione di &amp;quot;hostapd&amp;quot;.&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
== Problemi e FAQ ==&lt;br /&gt;
&lt;br /&gt;
;Hostapd non si avvia:&lt;br /&gt;
:Cercare il problema eseguendo il demone da linea di comando &amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.themagpi.com/issue/issue-11/ Articolo &amp;quot;Turn your Raspberry Pi into a Wireless Pi Point&amp;quot; su rivista The MagPi nr.11 (pagina 10)]&lt;br /&gt;
* [[Raspberry PI come access point: l'esempio dell'AP usato al non-corso]]&lt;br /&gt;
* http://guide.debianizzati.org/index.php/Creare_un_Access_Point_con_Debian&lt;br /&gt;
* http://nims11.wordpress.com/2012/04/27/hostapd-the-linux-way-to-create-virtual-wifi-access-point/&lt;br /&gt;
* http://easyfwgen.morizot.net/&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7278</id>
		<title>Centralina livello 1</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=7278"/>
		<updated>2020-07-05T08:48:59Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Install */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
![[File:Livello1-Debug.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Centralina livello 1&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Centralina generale (?) gestione segnali&lt;br /&gt;
|-&lt;br /&gt;
|Repository: https://github.com/raspibo/Livello1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
= Centralina  livello 1 =&lt;br /&gt;
&lt;br /&gt;
;ATTENZIONE&lt;br /&gt;
:Tutte le immagini sono puramente indicative, il progetto e` in pieno sviluppo, tutto e` passibile di modifiche, anche sostanziali.&lt;br /&gt;
:L'immagine di presentazione si riferisce alla sezione &amp;quot;debug&amp;quot;, realizzata con Dokuwiki e (ad oggi) non fa parte del progetto (o si ?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prima e sommaria descrizione ==&lt;br /&gt;
&lt;br /&gt;
Centralina di controllo segnali.&lt;br /&gt;
&lt;br /&gt;
:(Ad oggi)&lt;br /&gt;
:Acquisisce segnali, li suddivide in gruppi mono o multi utenza, dei quali: realizza grafici temporali, crea e gestisce allarmi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dal campo arrivano i valori della 'sensoristica' sottoforma di &amp;quot;Identificatore Valore&amp;quot;, da queste informazioni sono aggiunti i sensori che eventualmente non sono presenti e le relative 'liste' dei valori (sono generate due chiavi, una dell'utenza e l'altra dei valori), altrimenti viene solo accodato il valore nella rispettiva lista (aggiungendo data-ora-minuti-secondi).&lt;br /&gt;
&lt;br /&gt;
Acquisiti i sensori, e` possibile il loro raggruppamento (anche una sola utenza) ed il campionamento dei valori a tempi prestabiliti (generazione grafici tempo/valore).&lt;br /&gt;
&lt;br /&gt;
Sempre previo raggruppamento (sempre &amp;quot;anche di un solo sensore&amp;quot;), e` possibile attivare/disattivare i relativi allarmi, il classico ON/OFF, ma anche un'automatico (che per esempio attivi i sensori del solaio/cantine dalle 20 alle 8, quando e` certo che nessuno si rechi in quegli spazi).&lt;br /&gt;
&lt;br /&gt;
E poi il resto .. che sarebbe di arrivare non solo a leggere/interpretare segnali, ma anche a pilotare utenze (luci, serrande, elettrodomestici, ...)&lt;br /&gt;
&lt;br /&gt;
L'idea e` che tutto questo sia gestibile da:&lt;br /&gt;
# interfaccia web&lt;br /&gt;
#* browser&lt;br /&gt;
#* cellulare&lt;br /&gt;
# linea di comando&lt;br /&gt;
# terminali operatore (display+tastiere)&lt;br /&gt;
# pulsanti, lampade, selettori, ..&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
== Hardware e Software ==&lt;br /&gt;
&lt;br /&gt;
;Hardware&lt;br /&gt;
:Versione 1 - [[Raspberry Pi 3]], perche` completa di WiFi e Bluetooth&lt;br /&gt;
:Versione 2 (2018) - [[Raspberry Pi]] con chiavetta WiFi&lt;br /&gt;
&lt;br /&gt;
;Software&lt;br /&gt;
:MQTT Broker (Mosquitto), perche` in grado di dialogare con la maggior parte dei componenti (Arduino, ESP8266, eccetera)&lt;br /&gt;
:Redis, perche` servira` un database di appoggio e manipolazione per alcuni dati, e perche` servira` una struttura dati &amp;quot;manipolabile&amp;quot; (dovremo poter aggiungere e togliere &amp;quot;campi:valori&amp;quot; ad una &amp;quot;chiave&amp;quot;, e aggiungere/togliere chiavi a delle liste, ecc. ecc.)&lt;br /&gt;
:Nginx, non si puo` fare senza web server&lt;br /&gt;
:... e poi non so cos'altro&lt;br /&gt;
:Script cgi&lt;br /&gt;
:javascript&lt;br /&gt;
: ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Embedded page --&amp;gt;&lt;br /&gt;
{{:Raspberry_Pi-Raspbian_default_post-install}}&lt;br /&gt;
&lt;br /&gt;
== Access Point ==&lt;br /&gt;
&lt;br /&gt;
Installato/configurato &amp;quot;[[Raspberry Pi Access Point WEP2]]&amp;quot;, sfruttando il wifi integrato nel [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
Installazione dei pacchetti utili, necessari (e qualcuno inutile):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get install nginx fcgiwrap redis-server python3-redis mosquitto paho-mqtt ssl-cert php-fpm php7.0-xml python3-pip python3-paho-mqtt python3-pandas python3-cairosvg python3-tinycss python3-cssselect git mosquitto-clients apt-file mc redis-tools aria2&lt;br /&gt;
pip3 install python-telegram-bot pygal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E` stato installato manualmente anche [http://www.dokuwiki.org dokuwiki], utilizzato per segnarsi appunti vari (e un po` di debug), e` facoltativo e non descritto le operazioni necessarie, ma i files di configurazione del web server si.&lt;br /&gt;
&lt;br /&gt;
E` necessario scaricare il repository con i programmi (script python per lo piu`), si puo` fare da normale utente, per esempio:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/Livello1.git&lt;br /&gt;
cd Livello1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/level1 /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-enabled/level1 /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/dokuwiki* etc/nginx/fcgiwrap.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
==== Level1 (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu var/www/ /var/&lt;br /&gt;
chown www-data:www-data -R /var/www/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serve anche la scrittura in &amp;quot;www&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chmod 775 /var/www&lt;br /&gt;
chown :www-data -R /var/www    # oppure si poteva eliminare il &amp;quot;/&amp;quot; dal &amp;quot;chown&amp;quot; precedente&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
:Potrebbe essere necessario creare la directory &amp;quot;/var/www/archive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
All'avvio del sistema, devono andare in esecuzione alcuni script (quasi &amp;quot;daemons&amp;quot;) e rimanere attivi, per questo si deve modificare il file &amp;quot;/etc/rc.local&amp;quot; (lo trovate nel repository git):&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Power On &amp;quot;Level 1&amp;quot;&lt;br /&gt;
DAEMON_NAME=mqtt2redis_d&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviata correttamente Livello 1, oppure mqtt2redis_d e\` gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio \&amp;quot;mqtt2redis_d\&amp;quot;&amp;quot;&lt;br /&gt;
                #/var/www/cgi-bin/mqtt2redis_init.d.sh start # 20180115&lt;br /&gt;
        su -c &amp;quot;/var/www/cgi-bin/mqtt2redis_init.d.sh start&amp;quot; pi&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Centralina level 1 [ri]avviata ..&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Start Telegram Bot&lt;br /&gt;
DAEMON_NAME=bot4livello1&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato il Telegram Bot, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio Telegram Bot&amp;quot;&lt;br /&gt;
                cd /home/pi/project/csv2image2telegram&lt;br /&gt;
                su pi -c &amp;quot;python3 bot4livello1.py &amp;amp;&amp;quot;&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio bot4livello1.py&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inoltre, visto che puo` capitare s'interrompano, specialmente nelle prove di nuovi [[Centralina_livello_1#Devices|devices]], sono predisposti dei &amp;quot;check orari&amp;quot; che nel caso, li riavviano:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.hourly/mqtt2redis_check /etc/cron.hourly/&lt;br /&gt;
cp -vapu etc/cron.hourly/bot4livello1_check /etc/cron.hourly/ # se installerete anche il bot telegram&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Backup ====&lt;br /&gt;
&lt;br /&gt;
Oltre ad un &amp;quot;backup&amp;quot; che si occupa di salvare tutti i computer's della rete, ho aggiunto uno script per salvare giornalmente il database redis, come ulteriore sicurezza, i files sono salvati nella directory &amp;quot;/root&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.daily/backupredis /etc/cron.daily/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rete ==&lt;br /&gt;
&lt;br /&gt;
Al momento e` previsto che sia tutto sotto WiFi (quella onboard) del [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
Comunque bastera` modificare il firewall per accettare dati dalla ethernet se si rendesse necessario.&lt;br /&gt;
&lt;br /&gt;
Le centrali accessorie, tipo quella di [[CentRed|allarme]], che deve solo ricevere, non necessariamente dovranno trovarsi nella sottorete gestita da &amp;quot;livello 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Descrizione ==&lt;br /&gt;
&lt;br /&gt;
I 'segnali' arrivano sempre (?) a &amp;quot;MQTT broker&amp;quot;, vengono manipolati se necessario, ed inseriti nel database Redis.&lt;br /&gt;
&lt;br /&gt;
Dal database Redis sono di nuovo letti/scritti/modificati/manipolati ed inviati:&lt;br /&gt;
:e/o&lt;br /&gt;
::in report (testo, grafico, audio, video, ...)&lt;br /&gt;
:e/o&lt;br /&gt;
::alla centralina di allarme [[CentRed]]&lt;br /&gt;
:e/o&lt;br /&gt;
::reinviati a MQTT broker&lt;br /&gt;
:e/o&lt;br /&gt;
::inviati ad altre centraline livello 1&lt;br /&gt;
:e/o&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
=== Configurazione e Funzionamento ===&lt;br /&gt;
&lt;br /&gt;
(Sommariamente)&lt;br /&gt;
&lt;br /&gt;
Al primo avvio e` necesssario configurare prima il database Redis da utilizzare, poi quello della [[CentRed|centralina avvisi/allarmi]] (se avete intenzione di ricevere le comunicazioni relative agli allarmi e/o avvisi di malfunzionamenti).&lt;br /&gt;
&lt;br /&gt;
Una volta &amp;quot;letti&amp;quot; i segnali, e` opera dell'utente aggiungere alcune caratteristiche [[#Segnali]], fatto questo si passa alla creazione dei [[#Gruppi]].&lt;br /&gt;
&lt;br /&gt;
Definiti i [[#Gruppi]], si passa ad avviare i servizi necessari [[#Daemons]], che si occupano di generare i grafici Tempo-Valore/i o gestione degli allarmi/anomalie.&lt;br /&gt;
&lt;br /&gt;
== Arrivo dati e manipolazione ==&lt;br /&gt;
&lt;br /&gt;
I dati devono arrivare al broker MQTT nel formato:&lt;br /&gt;
&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
inviati nel topic:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fate riferimento alla [[#Tabella dati e valori]] per comprendere meglio il significato.&lt;br /&gt;
&lt;br /&gt;
Nell'immagine, una schermata dei test in corso, a sinistra gli errori di lettura, a destra un listato della &amp;quot;cgi-bin&amp;quot;, sotto i falsi dati inviati (mi servono per i test che sto` facendo ;) ), e in fondo i dati ricevuti (veri e falsi).&lt;br /&gt;
&lt;br /&gt;
[[File:Level1 201604170814.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mqtt2redis_d.py ===&lt;br /&gt;
&lt;br /&gt;
I dati MQTT vengono letti dal programma &amp;quot;mqtt2redis_d.py&amp;quot; che deve sempre essere in esecuzione (ho gia` preparato anche un &amp;quot;init.d&amp;quot;, che tengo ancora nella &amp;quot;cgi-bin&amp;quot;), questi li manipola inserendoli se non presenti, in due &amp;quot;chiavi&amp;quot; nel database (noSQL) Redis, la prima, e` per identificare il segnale:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
la seconda e` quella dei valori:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
valori che sono accodati ad ogni arrivo con l'aggiunta della data e ora, predisposti per una generazione di output in formato &amp;quot;csv&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== ''IMPORTANTE'' ==&lt;br /&gt;
&lt;br /&gt;
''Quello che segue non e` aggiornato di pari passo con l'aggiornamento del software e quant'altro necessario.''&lt;br /&gt;
&lt;br /&gt;
''Durante l'uso, nelle pagine di configurazione e modifica compaiono delle descrizioni che sono piu` veritiere/aggiornate, perche` scritte durante la stesura e/o modifica del software.''&lt;br /&gt;
&lt;br /&gt;
== Segnali ==&lt;br /&gt;
&lt;br /&gt;
Una volta pervenuto il primo valore di un segnale, e` possibile configurarlo inserendo alcuni dati che non sono presenti nella comunicazione MQTT:&lt;br /&gt;
&lt;br /&gt;
;Descrizione&lt;br /&gt;
:Meglio se breve, perche` usata anche nei riferimenti dei grafici, non solo per gli allarmi (per esempio: &amp;quot;ST1 Cucina&amp;quot; per sensore temperatura in cucina)&lt;br /&gt;
;UM (Unita` di misura)&lt;br /&gt;
;TempoRitardo&lt;br /&gt;
:Ancora non usata&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Specificare il range dei valori nel formato 0,100&lt;br /&gt;
:Utile per sonde che (per esempio) lavorano da 0 a 100 gradi&lt;br /&gt;
:Genera avviso/allarme se minore di o maggiore di&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Avviso se valore e` inferiore a quello impostato&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Aavviso se valore e` superiore a quello impostato&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:Previsto per i segnali analogici o negati&lt;br /&gt;
:Avviso quando valore uguale a ValoreOn&lt;br /&gt;
;Allarme&lt;br /&gt;
:Definire qua i valori che saranno usati come allarmi, per esempio: ValoreOn,ValoreMin&lt;br /&gt;
:Se sono impostati, ma non indicati qua, sono emessi dei semplici avvisi&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sonda temperatura (ovviamente falsa):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashTempMod Falsa2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sensore di movimento (pir, ovviamente falso):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashPirMod Falso2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
== Gruppi ==&lt;br /&gt;
&lt;br /&gt;
Per realizzare i raggruppamenti ho utilizzato le chiavi Redis di tipo &amp;quot;sets&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Al momento ho pensato ai soli gruppi riguardanti gli allarmi e i grafici (per esempio quelli di due o piu`, sonde di temperatura).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Puoi benissimo creare un gruppo con un solo sensore.&lt;br /&gt;
&lt;br /&gt;
Al solito, ho pensato ad una chiave univoca d'inserimento dei dati in Redis '''sets:type:ID''' (gruppo:tipo:identificatore).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gruppo&lt;br /&gt;
|&lt;br /&gt;
* sets&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* alarms&lt;br /&gt;
* graph&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore)&lt;br /&gt;
|&lt;br /&gt;
(definito da utente, esempi:)&lt;br /&gt;
* TemperatureBagno&lt;br /&gt;
* TemperaturePianoTerra&lt;br /&gt;
* luigi&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I gruppi sono definiti dall'utente, ed ogni volta che viene creato un nuovo gruppo (deve avere almeno un'utenza altrimenti si autoelimina), viene gia` creato il &amp;quot;Timer&amp;quot; di &amp;quot;campionamento&amp;quot;/&amp;quot;ritardo nuovo allarme&amp;quot;, preimpostato a 5 minuti (sono previsti valori da 1 a 60 minuti).&lt;br /&gt;
&lt;br /&gt;
''La pagina d'inserimento permette di inserire una chiave con un nome qualsiasi, non ho ancora &amp;quot;bloccato&amp;quot; e/o previsto un controllo sull'identificatore assegnato.''&lt;br /&gt;
&lt;br /&gt;
=== sets:*:ID:Config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Timer&lt;br /&gt;
|&lt;br /&gt;
* da 1 60 minuti&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Funzionamento&lt;br /&gt;
|&lt;br /&gt;
* On&lt;br /&gt;
* Off&lt;br /&gt;
* Auto&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) dalle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) alle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;graph&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
La chiave per questi gruppi e` previsto che sia: '''sets:graph:ID'''&lt;br /&gt;
&lt;br /&gt;
La chiave per il timer di campionamento e` previsto che sia: '''sets:graph:ID:Timer''' (ora e` generata automaticamente)&lt;br /&gt;
&lt;br /&gt;
La chiave per i dati campionati e la generazione del grafico (che sara` in formato csv) e` previsto che sia: '''sets:graph:ID:Valori''' (sara` creata ed aggiornata autonomamente, da un programma in python)&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;alarms&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Al momento come sopra, tranne che il Timer non servira` (o forse si, perche` sono previsti anche grafici dei PIR).&lt;br /&gt;
&lt;br /&gt;
==== Esempio d'inserimento gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Aggiungi chiavi &amp;quot;sets&amp;quot; Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysAddSets 1.png&lt;br /&gt;
File:Livello1-KeysAddSets 2.png&lt;br /&gt;
File:Livello1-KeysAddSets 3.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
::Nell'immagine e` gia` stato applicato il filtro '''*:graph:*'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModHash 1.png|Spostiamoci verso il basso e selezioniamo la seconda voce di modifica delle chiavi &amp;quot;hash&amp;quot;, quella relativa al &amp;quot;Config&amp;quot;:&lt;br /&gt;
File:Livello1-KeysModHash 2.png&lt;br /&gt;
File:Livello1-KeysModHash 3.png|e l'esempio di un allarme:&lt;br /&gt;
File:Livello1-KeysModHash 3a.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modifica di un gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModSets 2.png&lt;br /&gt;
File:Livello1-KeysModSets 3.png|Credo si spieghi da sola ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Daemons ==&lt;br /&gt;
&lt;br /&gt;
Intanto: non sono veri e propri &amp;quot;demoni&amp;quot;, sono script che l'utente avvia e ferma al bisogno.&lt;br /&gt;
&lt;br /&gt;
Specialmente quello degli allarmi (che mi sta` rompendo al cellulare da stamattina ;) ), e` da avviare quando uscite di casa, e fermare prima di rientrare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Daemons part1.png&lt;br /&gt;
File:Livello1-Daemons part2.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grafici (files .csv) ==&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;TIP&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Allarmi ==&lt;br /&gt;
&lt;br /&gt;
Per ogni gruppo creato, e` possibile eseguire il controllo allarmi, servono opportune preimpostazioni (configurazioni), poi e` possibile eseguire il software dalla pagina '''Daemons''':&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-Allarmi-Daemons.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Si puo` notare in esecuzione solo quello relativo ad una falsa sonda di temperatura, relativo ai [[Centralina livello 1/Test allarmi|test eseguiti]].&lt;br /&gt;
&lt;br /&gt;
L'eseguibile e` &amp;quot;/var/www/cgi-bin/setsalarms_d.py&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== setsalarms_d.py ===&lt;br /&gt;
&lt;br /&gt;
Perche` possa &amp;quot;funzionare&amp;quot; servono alcuni requisiti:&lt;br /&gt;
*Deve esistere il gruppo ed avere una configurazione (che e` preimpostata alla creazione)&lt;br /&gt;
*Il gruppo deve essere &amp;quot;on&amp;quot; o in modalita` &amp;quot;auto&amp;quot; (per default e` &amp;quot;off&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Tutti sono avvisi (li ho chiamati &amp;quot;alert&amp;quot;), alcuni possono e devono invece diventare allarmi (&amp;quot;alarm&amp;quot;). Perche` siano definiti allarmi, devono essere inseriti nella voce &amp;quot;Allarme&amp;quot;, presente nella configurazione della sonda (sensore, PIR, o quello che e`).&lt;br /&gt;
&lt;br /&gt;
Tipi di &amp;quot;alert&amp;quot;:&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero,[+-]Numero, una sonda 1wire pe esempio sarebbe: -55,+125&lt;br /&gt;
:;Alert&lt;br /&gt;
::Se il valore letto e` fuori dal range&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` inferiore&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` superiore&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:0 o 1&lt;br /&gt;
:Al momento e` previsto per sola sensoristica come: finecorsa, PIR, e altri segnali on/off&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` uguale&lt;br /&gt;
;Allarme&lt;br /&gt;
:Quello che e` allarme e non semplice avviso:&lt;br /&gt;
::ValoreOn&lt;br /&gt;
::ValoreMin&lt;br /&gt;
::ValoreMin,ValoreMax,ValoreOn&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
Per un'esempio di configurazione fate riferimento alla pagina [[Centralina livello 1/Test allarmi|Test Allarmi]].&lt;br /&gt;
&lt;br /&gt;
Il software invia gli avvisi/allarmi alla centralina [[CentRed]], e` questa poi ad occuparsi della trasmissione, discriminando il tipo dalla stringa con cui e` stato inviato. Altre informazioni alla pagina [[CentRed]].&lt;br /&gt;
&lt;br /&gt;
== Analizza e Modifica Valori ==&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto la possibilita` di manipolare i valori memorizzati nel database Redis.&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Selezione_Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sono ammesse solamente chiavi &amp;quot;:Valori&amp;quot;, la possibilita` di selezione dipende (al solito) dal filtro attivo nella pagina.&lt;br /&gt;
&lt;br /&gt;
Una volta scelta la chiave e cliccato su &amp;quot;Analizza e Modifica&amp;quot;, compare la pagina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dove e` possibile:&lt;br /&gt;
* Visualizzare tutti i valori&lt;br /&gt;
* Creare il file &amp;quot;.csv&amp;quot; da elaborare successivamente tramite l'apposita pagina&lt;br /&gt;
* Eliminare i dati ormai obsoleti (attenzione che non ho filtrato le immissioni, e` possibile anche fare il contrario)&lt;br /&gt;
&lt;br /&gt;
== Tabella dati e valori ==&lt;br /&gt;
&lt;br /&gt;
Denominazione dei campi e attibuzione dei valori standard (piu` o meno)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* Temperatura&lt;br /&gt;
* PIR&lt;br /&gt;
* Finecorsa&lt;br /&gt;
* Proximity&lt;br /&gt;
* Livello&lt;br /&gt;
* Rele`&lt;br /&gt;
* Termostato&lt;br /&gt;
* Valvola&lt;br /&gt;
* Motore&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione del segnale&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TipoIO&lt;br /&gt;
|&lt;br /&gt;
* I (Input/Ingresso)&lt;br /&gt;
* O (Output/Uscita)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segnale&lt;br /&gt;
|&lt;br /&gt;
* Analogico&lt;br /&gt;
* Digitale&lt;br /&gt;
* Testo&lt;br /&gt;
* I2C&lt;br /&gt;
* SPI&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Al momento l'ho soppresso, il tipo di segnale e` praticamente definito dal valore in entrata (per ora)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneC&lt;br /&gt;
|&lt;br /&gt;
* Casa&lt;br /&gt;
* Garage&lt;br /&gt;
* Giardino&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneP&lt;br /&gt;
|&lt;br /&gt;
* Piano0 / PianoZero&lt;br /&gt;
* Piano1 / PianoUno&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneS&lt;br /&gt;
|&lt;br /&gt;
* Cucina1&lt;br /&gt;
* Camera2&lt;br /&gt;
* Bagno1&lt;br /&gt;
* ...&lt;br /&gt;
* Cantina&lt;br /&gt;
* EsternoSala&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore, Utenza/ITEM)&lt;br /&gt;
|&lt;br /&gt;
* 1&lt;br /&gt;
* 2&lt;br /&gt;
* 3&lt;br /&gt;
* ..&lt;br /&gt;
* Up&lt;br /&gt;
* Down&lt;br /&gt;
* Left&lt;br /&gt;
* Right&lt;br /&gt;
* (altro ?)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Convenzioni usate ad oggi:&lt;br /&gt;
* STn sonda/sensore temperatura [n = numero]&lt;br /&gt;
* RHn sonda/sensore umidita` relativa [n = numero]&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Definito dall'utente che programma i &amp;quot;remote&amp;quot;, ma meglio definire una struttura di base ..&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valori&lt;br /&gt;
|&lt;br /&gt;
* TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori&lt;br /&gt;
|&lt;br /&gt;
Assegnato automaticamente dal programma&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UM (Unita` di Misura)&lt;br /&gt;
|&lt;br /&gt;
* °C&lt;br /&gt;
* V (tensione)&lt;br /&gt;
* A (assorbimento)&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Questo e` previsto solo per le segnalazioni/avvisi/allarmi .. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TempoRitardo (secondi)&lt;br /&gt;
|&lt;br /&gt;
* 0.000&lt;br /&gt;
* 1.002&lt;br /&gt;
* ...&lt;br /&gt;
* 99.000 (max impostabile)&lt;br /&gt;
|&lt;br /&gt;
Al momento non previsto, teoricamente i segnali dovrebbero arrivare gia` &amp;quot;filtrati&amp;quot; dai &amp;quot;remote&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! RangeValori&lt;br /&gt;
|&lt;br /&gt;
* 0,100&lt;br /&gt;
* -50,125&lt;br /&gt;
* 0,1&lt;br /&gt;
|&lt;br /&gt;
Da utilizzarsi per definire l'errore e generare una segnalazione di sonda guasta&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMin&lt;br /&gt;
|&lt;br /&gt;
* 10 (temperatura)&lt;br /&gt;
* 0 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sotto a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMax&lt;br /&gt;
|&lt;br /&gt;
* 40 (temperatura)&lt;br /&gt;
* 1 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sopra a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreOn&lt;br /&gt;
|&lt;br /&gt;
* 1 (quando attivo a segnale on)&lt;br /&gt;
* 0 (quando attivo a segnale off)&lt;br /&gt;
* [Valore]&lt;br /&gt;
|&lt;br /&gt;
Valore da utilizzare per alert/alarm, e per definire se si tratta di un segnale negato (zero) e trattarlo di conseguenza&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Allarme&lt;br /&gt;
|&lt;br /&gt;
* ValoreOn&lt;br /&gt;
* ValoreMin&lt;br /&gt;
* ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin&lt;br /&gt;
* ValoreOn,ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin,ValoreMax&lt;br /&gt;
* ValoreMin,ValoreMax&lt;br /&gt;
|&lt;br /&gt;
Quali sono da trattare come allarmi, di default, se impostati, sono trattati come alert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data (e ora)&lt;br /&gt;
|&lt;br /&gt;
* 2016/03/13 20:40:08&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valore&lt;br /&gt;
|&lt;br /&gt;
* 0&lt;br /&gt;
* 1&lt;br /&gt;
* 13&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Promemoria chiavi, codici e ... ==&lt;br /&gt;
&lt;br /&gt;
====== Dati (mqtt) ======&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Topic (mqtt) ======&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria segnale di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria gruppi di livello 1 (redis) ======&lt;br /&gt;
;TYPE&lt;br /&gt;
:graph&lt;br /&gt;
:alarms&lt;br /&gt;
'''sets:TYPE:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria configurazione gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Config'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Notes|Notes]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Primo avvio|Primo avvio]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Test allarmi|Test allarmi]]&lt;br /&gt;
&lt;br /&gt;
= Devices =&lt;br /&gt;
&lt;br /&gt;
Ad oggi, ho predisposto/preparato:&lt;br /&gt;
* [[PorTHable]], che invia valori di temperatura&lt;br /&gt;
* [[ ESP8266/DS1820toMQTT | DS1820toMQTT ]], sensore/i di temperatura&lt;br /&gt;
* [[ ESP8266/PIRtoMQTT | PIRtoMQTT ]], sensore di movimento (PIR)&lt;br /&gt;
* [[ ESP8266/SerialToMQTT_Repeater | SerialToMQTT Repeater ]], che funziona da &amp;quot;repeater&amp;quot;, ritrasmette i dati ricevuti via seriale al broker MQTT&lt;br /&gt;
* [[ Thermo ]], che invia il valore della temperatura (solo di riferimento ad oggi, non le altre sonde)&lt;br /&gt;
* [[ ENC28J60-ATMEGA328P-DS18B20 | ENC28J60 + ATMEGA328P + DS18B20 ]], sensore di temperatura in ethernet&lt;br /&gt;
* [[ Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | ATMEGA328P + ESP8266 + DHT + Rain]], sensore temperatura/umidita` (dht) e pioggia (rain)&lt;br /&gt;
* [[ ESP8266/DHT22toMQTT | DHT22toMQTT ]], sensore di temperatura e umidita`&lt;br /&gt;
* [[ Centralina_livello_1/Dev_HTRL_wAE | ATMEGA328P + ESP8266 + DHT + Rain + Photoresistor]], sensore temperatura/umidita` (dht), pioggia (rain) e luminosita` (photoresistor).&amp;lt;br&amp;gt; Nuova e migliorata (?) versione del precedente [[Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | device]]&lt;br /&gt;
* [[ Cronotermostato settimanale ]]&lt;br /&gt;
* [[ Centralina_livello_1/Centralina_livello_2_PIR | Centralina livello 2 - PIR ]]&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/telegram bot|Telegram Bot per Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
= Problemi e soluzioni ? =&lt;br /&gt;
&lt;br /&gt;
;Eliminazione file di swap&lt;br /&gt;
:Non so se sia stato un problema e sia utile&lt;br /&gt;
::[[Raspberry_PI-Raspbian-Personalizzazioni#Disattivazione|Disattivazione file di swap]]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore salvataggio in background&lt;br /&gt;
:[https://jee-appy.blogspot.it/2016/04/can-not-save-in-background-fork-redis.html Can't save in background: fork: Cannot allocate memory Redis]&lt;br /&gt;
:[https://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory redis bgsave failed because fork Cannot allocate memory]&lt;br /&gt;
:[https://stackoverflow.com/questions/19581059/misconf-redis-is-configured-to-save-rdb-snapshots MISCONF Redis is configured to save RDB snapshots]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7124</id>
		<title>CentRed</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7124"/>
		<updated>2019-07-28T15:39:40Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Progetto&lt;br /&gt;
|nome=CentRed&lt;br /&gt;
|descrizione=Centralino di controllo avvisi (segnalazioni e allarmi)&lt;br /&gt;
|repo=https://github.com/raspibo/CentRed.git&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Revisione'''&lt;br /&gt;
* Riviste ed aggiornate queste istruzioni&lt;br /&gt;
* L'installazione di Asterisk da` errore, ma poi tutto sembra funzionare&lt;br /&gt;
* --[[Utente:Dave4rp|Dave4rp]] ([[Discussioni utente:Dave4rp|discussioni]]) 17:39, 28 lug 2019 (CEST)&lt;br /&gt;
&lt;br /&gt;
'''Centralino di gestione avvisi e allarmi'''&lt;br /&gt;
&lt;br /&gt;
Si occupa di avvisare l'utilizzatore attraverso messaggi di posta elettronica, telefonate VOIP e chat (XMPP), di avvisi e allarmi dell'impianto domotico (?) e/o degli apparati che gli inviano messaggi opportunamente predisposti.&lt;br /&gt;
&lt;br /&gt;
Tabella di riferimento del messaggio da inviare: https://github.com/raspibo/CentRed/wiki/Tabella-avvisi.&lt;br /&gt;
&lt;br /&gt;
;Ad oggi questa centralina e` usata da:&lt;br /&gt;
:[[Thermo]]&lt;br /&gt;
:[[Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
== Installazione ==&lt;br /&gt;
&lt;br /&gt;
Distribuzione: Raspbian (Debian) versione 9, codename &amp;quot;stretch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
&lt;br /&gt;
Al primo avvio la nuova SD Card ha visualizzato una schermata di &amp;quot;Resizing file system&amp;quot; (o qualcosa di simile), seguito da un riavvio del sistema.&lt;br /&gt;
&lt;br /&gt;
SSH nella nuova release non e` attivato di default, prima di proseguire l'ho attivato:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
raspi-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5 Interfacing options&lt;br /&gt;
::P2 SSH Enable&lt;br /&gt;
&lt;br /&gt;
.. e visto che ero qui, ho configurato anche qualcos'altro:&lt;br /&gt;
&lt;br /&gt;
:password&lt;br /&gt;
:hostname &amp;lt;centred&amp;gt;&lt;br /&gt;
:locale &amp;lt;en&amp;gt;&lt;br /&gt;
:timezone &amp;lt;rome&amp;gt;&lt;br /&gt;
:keyboard layout &amp;lt;en-US&amp;gt;&lt;br /&gt;
:wifi country &amp;lt;it&amp;gt; # anche se non la usero`&lt;br /&gt;
&lt;br /&gt;
Visto che ho aggiornato tanta roba, ho riavviato il sistema.&lt;br /&gt;
&lt;br /&gt;
=== Upgrade ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get upgrade&lt;br /&gt;
reboot # perche` ha aggiornato anche i pacchetti del kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installazione pacchetti ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get install nginx fcgiwrap redis-server asterisk festival festvox-ita* python3-dnspython python3-pip git python3-redis&lt;br /&gt;
pip3 install pyxmpp2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
Per prima cosa, meglio avere gia` sottomano il repository git per copiare files e configurazioni, da utente normale, effettuamo una clonazione di questo repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/CentRed.git&lt;br /&gt;
cd CentRed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;IMPORTANTE&lt;br /&gt;
:Tutti i comandi visualizzati nella fasi successive sono riferiti alla directory in cui ci si trova ora, cioe`: &amp;quot;/home/pi/git/CentRed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Crontab ====&lt;br /&gt;
&lt;br /&gt;
Va bene che sia da utente, non servono permessi particolari:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inseriamo questa riga alla fine del file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
10 7 * * 0 redis-cli hmset msg:redis:alive:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Messaggio ciclico di centralina in funzione&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Riga che una volta a settimana ci inviera` un messaggio che la centralina e` in funzione.&lt;br /&gt;
&lt;br /&gt;
==== Asterisk ====&lt;br /&gt;
&lt;br /&gt;
Per editare i successivi files dovrete essere &amp;quot;root&amp;quot;, quindi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/extensions.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
[centred]&lt;br /&gt;
exten =&amp;gt; _X.,1,Answer()&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Playback(alarm)&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Hangup()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/sip.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
; Configurazione di un interno del PBX&lt;br /&gt;
[2001]                          ; numero identificativo dell'interno (il numero della linea telefonica)&lt;br /&gt;
; Turn off silence suppression in X-Lite (&amp;quot;Transmit Silence&amp;quot;=YES)!&lt;br /&gt;
; Note that Xlite sends NAT keep-alive packets, so qualify=yes is not needed&lt;br /&gt;
secret=NC2001                   ; password in chiaro (può essere anche cifrata con MD5)&lt;br /&gt;
type=friend                     ; la configurazione tipica per un telefono è friend, altrimenti con user per una linea solo ricevente, peer per un trunk verso l'esterno&lt;br /&gt;
regexten=1234                   ; When they register, create extension 1234&lt;br /&gt;
context=centred&lt;br /&gt;
callerid=&amp;quot;CentRed&amp;quot; &amp;lt;2001&amp;gt;       ; i dati di presentazione della linea visualizzati nel display di chi riceve la chiamata&lt;br /&gt;
host=dynamic                    ; This device needs to register&lt;br /&gt;
;directmedia=no                 ; Typically set to NO if behind NAT&lt;br /&gt;
disallow=all&lt;br /&gt;
;Configurazione del tipo di compressione della fonia&lt;br /&gt;
;allow=gsm                      ; GSM consumes far less bandwidth than ulaw - formato compresso che risparmia banda&lt;br /&gt;
allow=alaw                      ; il tipo di codec da usare per la chiamata alaw è senza compressione, è adatto ad esempio su lan&lt;br /&gt;
;mailbox=1234@default,1233@default      ; Subscribe to status of multiple mailboxes&lt;br /&gt;
registertrying=yes ; Send a 100 Trying when the device registers.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/mysite /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/myfastcgi.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
Nel web server e` attiva (in configurazione) l'autenticazione, per completarla dovete creare il file &amp;quot;/var/www/.htaccess&amp;quot; in questo modo (sostituite USERNAME col vostro nome o altro):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
echo -n &amp;quot;USERNAME&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
echo -n &amp;quot;:&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
openssl passwd &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
chown www-data:www-data /var/www/.htpasswd&lt;br /&gt;
chmod 600 /var/www/.htpasswd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redis ====&lt;br /&gt;
&lt;br /&gt;
Potete fare come ho fatto io, oppure modificare tutto nel file di configurazione, dovrebbe essere possibile stando a quel che ho letto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/redis/redis.conf&lt;br /&gt;
:Solo commentato la linea (dovrebbe essere la 61)&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#bind 127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ancora pero` l'accesso da remoto non e` possibile, si deve modificare un'altro parametro e renderlo permanente (quello che scrivevo dovrebbe essere possibile nel file di configurazione):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
redis-cli&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG SET protected-mode no&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG REWRITE&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Importante&lt;br /&gt;
:Non ho impostato nessuna password, quindi non esponete questo pc/raspberry alla rete esterna.&lt;br /&gt;
&lt;br /&gt;
==== CentRed (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -va var/www/ /var/&lt;br /&gt;
chown www-data:www-data /var/www/*.html&lt;br /&gt;
chown www-data:www-data /var/www/cgi-bin/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
Ovviamente all'avvio del sistema la nostra centralina deve avviarsi da sola, ho scelto di eseguire il programma dal &amp;quot;classico&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Start &amp;quot;CentRed&amp;quot;&lt;br /&gt;
DAEMON_NAME=centred  # senza .py&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato \&amp;quot;$DAEMON_NAME\&amp;quot;, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio $DAEMON_NAME ..&amp;quot;&lt;br /&gt;
                #su pi -c &amp;quot;python3 /var/www/cgi-bin/centred.py &amp;amp;&amp;quot;&lt;br /&gt;
                python3 /var/www/cgi-bin/centred.py &amp;amp;  # deve essere 'root'&lt;br /&gt;
                # .. e un messaggio a se stesso quando si [ri]avvia&lt;br /&gt;
                sleep 2  # un po` di ritardo&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio centralino allarmi CentRed&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Start/Reboot &amp;amp; Configure ====&lt;br /&gt;
&lt;br /&gt;
E` il momento di riavviare il sistema.&lt;br /&gt;
&lt;br /&gt;
Se tutto e` andato bene, dovrebbe essere gia` funzionante, rimane da configurarlo.&lt;br /&gt;
&lt;br /&gt;
Da browser aprite l'indirizzo http://centred:8080 (o &amp;quot;localhost:8080&amp;quot; o usate l'indirizzo IP), alcune voci non funzioneranno, altre pagine andranno proprio in errore, basta inserire i dati corretti e nel giusto ordine.&lt;br /&gt;
&lt;br /&gt;
# Per primo, inserite gli account di posta elettronica e XMPP, inserendo il vostro username/password ed eventuali parametri del server (tipo smtp.gmail.com porta 567).&lt;br /&gt;
# Inserite i destinatari dei messaggi, sono previsti inserimenti per destinatari di mail, XMPP e sip.&lt;br /&gt;
# Ora si possono associare gli elenchi ai tipi di messaggi, cioe`, dove dev'essere inviato il messaggio alarm piuttosto che alert ...&lt;br /&gt;
&lt;br /&gt;
== Pagina principale ==&lt;br /&gt;
&lt;br /&gt;
Pagina principale e menu:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Messaggi.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sono visibili i normali messaggi di controllo di funzionamento di se stessa e della centralina [[Thermo]].&lt;br /&gt;
&lt;br /&gt;
I messaggi non ancora confermati sono inviati a cadenze cicliche e per un massimo di volte, dipendente dalla configurazione.&lt;br /&gt;
&lt;br /&gt;
Ovviamente, una volta confermati, non sono piu` inviati e permangono visualizzati nella pagina fino a scadenza (configurazione).&lt;br /&gt;
&lt;br /&gt;
== Prima configurazione ==&lt;br /&gt;
&lt;br /&gt;
Ed anche unica, normalmente ;)&lt;br /&gt;
&lt;br /&gt;
Il database NoSQL Redis utilizzato, non e` configurabile perche` DEVE risiedere nella stessa macchina.&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:Non sono riuscito a parametrizzare tutte le configurazioni&lt;br /&gt;
&lt;br /&gt;
=== Configurazione accounts ===&lt;br /&gt;
&lt;br /&gt;
==== Mail ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso della posta elettronica, questo e` l'indirizzo che servira` per inviare le mail delle segnalazioni della centralina&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==== XMPP ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso del protocollo XMPP, servira` per inviare le segnalazioni della centralina.&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione liste destinatari ===&lt;br /&gt;
&lt;br /&gt;
Aggiungete gli indirizzi dei destinatari dei messaggi delle varie segnalazioni della centralina:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaSIP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione destinazioni allarme ===&lt;br /&gt;
&lt;br /&gt;
Per ogni tipologia di segnalazione, si deve indicare a quali liste e` da inviare:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllarme.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllerta.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
I parametri di controllo ed invio degli avvisi:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Configurazione.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed.git&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed/wiki&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7123</id>
		<title>CentRed</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7123"/>
		<updated>2019-07-28T15:31:06Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Installazione pacchetti */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Progetto&lt;br /&gt;
|nome=CentRed&lt;br /&gt;
|descrizione=Centralino di controllo avvisi (segnalazioni e allarmi)&lt;br /&gt;
|repo=https://github.com/raspibo/CentRed.git&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Centralino di gestione avvisi e allarmi&lt;br /&gt;
&lt;br /&gt;
Si occupa di avvisare l'utilizzatore attraverso messaggi di posta elettronica, telefonate VOIP e chat (XMPP), di avvisi e allarmi dell'impianto domotico (?) e/o degli apparati che gli inviano messaggi opportunamente predisposti.&lt;br /&gt;
&lt;br /&gt;
Tabella di riferimento del messaggio da inviare: https://github.com/raspibo/CentRed/wiki/Tabella-avvisi.&lt;br /&gt;
&lt;br /&gt;
;Ad oggi questa centralina e` usata da:&lt;br /&gt;
:[[Thermo]]&lt;br /&gt;
:[[Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installazione ==&lt;br /&gt;
&lt;br /&gt;
Distribuzione: Raspbian (Debian) versione 9, codename &amp;quot;stretch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
&lt;br /&gt;
Al primo avvio la nuova SD Card ha visualizzato una schermata di &amp;quot;Resizing file system&amp;quot; (o qualcosa di simile), seguito da un riavvio del sistema.&lt;br /&gt;
&lt;br /&gt;
SSH nella nuova release non e` attivato di default, prima di proseguire l'ho attivato:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
raspi-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5 Interfacing options&lt;br /&gt;
::P2 SSH Enable&lt;br /&gt;
&lt;br /&gt;
.. e visto che ero qui, ho configurato anche qualcos'altro:&lt;br /&gt;
&lt;br /&gt;
:password&lt;br /&gt;
:hostname &amp;lt;centred&amp;gt;&lt;br /&gt;
:locale &amp;lt;en&amp;gt;&lt;br /&gt;
:timezone &amp;lt;rome&amp;gt;&lt;br /&gt;
:keyboard layout &amp;lt;en-US&amp;gt;&lt;br /&gt;
:wifi country &amp;lt;it&amp;gt; # anche se non la usero`&lt;br /&gt;
&lt;br /&gt;
Visto che ho aggiornato tanta roba, ho riavviato il sistema.&lt;br /&gt;
&lt;br /&gt;
=== Upgrade ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get upgrade&lt;br /&gt;
reboot # perche` ha aggiornato anche i pacchetti del kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installazione pacchetti ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get install nginx fcgiwrap redis-server asterisk festival festvox-ita* python3-dnspython python3-pip git python3-redis&lt;br /&gt;
pip3 install pyxmpp2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
Per prima cosa, meglio avere gia` sottomano il repository git per copiare files e configurazioni, da utente normale, effettuamo una clonazione di questo repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/CentRed.git&lt;br /&gt;
cd CentRed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;IMPORTANTE&lt;br /&gt;
:Tutti i comandi visualizzati nella fasi successive sono riferiti alla directory in cui ci si trova ora, cioe`: &amp;quot;/home/pi/git/CentRed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Crontab ====&lt;br /&gt;
&lt;br /&gt;
Va bene che sia da utente, non servono permessi particolari:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inseriamo questa riga alla fine del file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
10 7 * * 0 redis-cli hmset msg:redis:alive:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Messaggio ciclico di centralina in funzione&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Riga che una volta a settimana ci inviera` un messaggio che la centralina e` in funzione.&lt;br /&gt;
&lt;br /&gt;
==== Asterisk ====&lt;br /&gt;
&lt;br /&gt;
Per editare i successivi files dovrete essere &amp;quot;root&amp;quot;, quindi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/extensions.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
[centred]&lt;br /&gt;
exten =&amp;gt; _X.,1,Answer()&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Playback(alarm)&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Hangup()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/sip.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
; Configurazione di un interno del PBX&lt;br /&gt;
[2001]                          ; numero identificativo dell'interno (il numero della linea telefonica)&lt;br /&gt;
; Turn off silence suppression in X-Lite (&amp;quot;Transmit Silence&amp;quot;=YES)!&lt;br /&gt;
; Note that Xlite sends NAT keep-alive packets, so qualify=yes is not needed&lt;br /&gt;
secret=NC2001                   ; password in chiaro (può essere anche cifrata con MD5)&lt;br /&gt;
type=friend                     ; la configurazione tipica per un telefono è friend, altrimenti con user per una linea solo ricevente, peer per un trunk verso l'esterno&lt;br /&gt;
regexten=1234                   ; When they register, create extension 1234&lt;br /&gt;
context=centred&lt;br /&gt;
callerid=&amp;quot;CentRed&amp;quot; &amp;lt;2001&amp;gt;       ; i dati di presentazione della linea visualizzati nel display di chi riceve la chiamata&lt;br /&gt;
host=dynamic                    ; This device needs to register&lt;br /&gt;
;directmedia=no                 ; Typically set to NO if behind NAT&lt;br /&gt;
disallow=all&lt;br /&gt;
;Configurazione del tipo di compressione della fonia&lt;br /&gt;
;allow=gsm                      ; GSM consumes far less bandwidth than ulaw - formato compresso che risparmia banda&lt;br /&gt;
allow=alaw                      ; il tipo di codec da usare per la chiamata alaw è senza compressione, è adatto ad esempio su lan&lt;br /&gt;
;mailbox=1234@default,1233@default      ; Subscribe to status of multiple mailboxes&lt;br /&gt;
registertrying=yes ; Send a 100 Trying when the device registers.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/mysite /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/myfastcgi.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
Nel web server e` attiva (in configurazione) l'autenticazione, per completarla dovete creare il file &amp;quot;/var/www/.htaccess&amp;quot; in questo modo (sostituite USERNAME col vostro nome o altro):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
echo -n &amp;quot;USERNAME&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
echo -n &amp;quot;:&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
openssl passwd &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
chown www-data:www-data /var/www/.htpasswd&lt;br /&gt;
chmod 600 /var/www/.htpasswd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redis ====&lt;br /&gt;
&lt;br /&gt;
Potete fare come ho fatto io, oppure modificare tutto nel file di configurazione, dovrebbe essere possibile stando a quel che ho letto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/redis/redis.conf&lt;br /&gt;
:Solo commentato la linea (dovrebbe essere la 61)&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#bind 127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ancora pero` l'accesso da remoto non e` possibile, si deve modificare un'altro parametro e renderlo permanente (quello che scrivevo dovrebbe essere possibile nel file di configurazione):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
redis-cli&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG SET protected-mode no&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG REWRITE&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Importante&lt;br /&gt;
:Non ho impostato nessuna password, quindi non esponete questo pc/raspberry alla rete esterna.&lt;br /&gt;
&lt;br /&gt;
==== CentRed (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -va var/www/ /var/&lt;br /&gt;
chown www-data:www-data /var/www/*.html&lt;br /&gt;
chown www-data:www-data /var/www/cgi-bin/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
Ovviamente all'avvio del sistema la nostra centralina deve avviarsi da sola, ho scelto di eseguire il programma dal &amp;quot;classico&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Start &amp;quot;CentRed&amp;quot;&lt;br /&gt;
DAEMON_NAME=centred  # senza .py&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato \&amp;quot;$DAEMON_NAME\&amp;quot;, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio $DAEMON_NAME ..&amp;quot;&lt;br /&gt;
                #su pi -c &amp;quot;python3 /var/www/cgi-bin/centred.py &amp;amp;&amp;quot;&lt;br /&gt;
                python3 /var/www/cgi-bin/centred.py &amp;amp;  # deve essere 'root'&lt;br /&gt;
                # .. e un messaggio a se stesso quando si [ri]avvia&lt;br /&gt;
                sleep 2  # un po` di ritardo&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio centralino allarmi CentRed&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Start/Reboot &amp;amp; Configure ====&lt;br /&gt;
&lt;br /&gt;
E` il momento di riavviare il sistema.&lt;br /&gt;
&lt;br /&gt;
Se tutto e` andato bene, dovrebbe essere gia` funzionante, rimane da configurarlo.&lt;br /&gt;
&lt;br /&gt;
Da browser aprite l'indirizzo http://centred:8080 (o &amp;quot;localhost:8080&amp;quot; o usate l'indirizzo IP), alcune voci non funzioneranno, altre pagine andranno proprio in errore, basta inserire i dati corretti e nel giusto ordine.&lt;br /&gt;
&lt;br /&gt;
# Per primo, inserite gli account di posta elettronica e XMPP, inserendo il vostro username/password ed eventuali parametri del server (tipo smtp.gmail.com porta 567).&lt;br /&gt;
# Inserite i destinatari dei messaggi, sono previsti inserimenti per destinatari di mail, XMPP e sip.&lt;br /&gt;
# Ora si possono associare gli elenchi ai tipi di messaggi, cioe`, dove dev'essere inviato il messaggio alarm piuttosto che alert ...&lt;br /&gt;
&lt;br /&gt;
== Pagina principale ==&lt;br /&gt;
&lt;br /&gt;
Pagina principale e menu:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Messaggi.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sono visibili i normali messaggi di controllo di funzionamento di se stessa e della centralina [[Thermo]].&lt;br /&gt;
&lt;br /&gt;
I messaggi non ancora confermati sono inviati a cadenze cicliche e per un massimo di volte, dipendente dalla configurazione.&lt;br /&gt;
&lt;br /&gt;
Ovviamente, una volta confermati, non sono piu` inviati e permangono visualizzati nella pagina fino a scadenza (configurazione).&lt;br /&gt;
&lt;br /&gt;
== Prima configurazione ==&lt;br /&gt;
&lt;br /&gt;
Ed anche unica, normalmente ;)&lt;br /&gt;
&lt;br /&gt;
Il database NoSQL Redis utilizzato, non e` configurabile perche` DEVE risiedere nella stessa macchina.&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:Non sono riuscito a parametrizzare tutte le configurazioni&lt;br /&gt;
&lt;br /&gt;
=== Configurazione accounts ===&lt;br /&gt;
&lt;br /&gt;
==== Mail ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso della posta elettronica, questo e` l'indirizzo che servira` per inviare le mail delle segnalazioni della centralina&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==== XMPP ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso del protocollo XMPP, servira` per inviare le segnalazioni della centralina.&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione liste destinatari ===&lt;br /&gt;
&lt;br /&gt;
Aggiungete gli indirizzi dei destinatari dei messaggi delle varie segnalazioni della centralina:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaSIP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione destinazioni allarme ===&lt;br /&gt;
&lt;br /&gt;
Per ogni tipologia di segnalazione, si deve indicare a quali liste e` da inviare:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllarme.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllerta.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
I parametri di controllo ed invio degli avvisi:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Configurazione.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed.git&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed/wiki&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7122</id>
		<title>CentRed</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7122"/>
		<updated>2019-07-28T14:17:56Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Nginx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Progetto&lt;br /&gt;
|nome=CentRed&lt;br /&gt;
|descrizione=Centralino di controllo avvisi (segnalazioni e allarmi)&lt;br /&gt;
|repo=https://github.com/raspibo/CentRed.git&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Centralino di gestione avvisi e allarmi&lt;br /&gt;
&lt;br /&gt;
Si occupa di avvisare l'utilizzatore attraverso messaggi di posta elettronica, telefonate VOIP e chat (XMPP), di avvisi e allarmi dell'impianto domotico (?) e/o degli apparati che gli inviano messaggi opportunamente predisposti.&lt;br /&gt;
&lt;br /&gt;
Tabella di riferimento del messaggio da inviare: https://github.com/raspibo/CentRed/wiki/Tabella-avvisi.&lt;br /&gt;
&lt;br /&gt;
;Ad oggi questa centralina e` usata da:&lt;br /&gt;
:[[Thermo]]&lt;br /&gt;
:[[Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installazione ==&lt;br /&gt;
&lt;br /&gt;
Distribuzione: Raspbian (Debian) versione 9, codename &amp;quot;stretch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
&lt;br /&gt;
Al primo avvio la nuova SD Card ha visualizzato una schermata di &amp;quot;Resizing file system&amp;quot; (o qualcosa di simile), seguito da un riavvio del sistema.&lt;br /&gt;
&lt;br /&gt;
SSH nella nuova release non e` attivato di default, prima di proseguire l'ho attivato:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
raspi-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5 Interfacing options&lt;br /&gt;
::P2 SSH Enable&lt;br /&gt;
&lt;br /&gt;
.. e visto che ero qui, ho configurato anche qualcos'altro:&lt;br /&gt;
&lt;br /&gt;
:password&lt;br /&gt;
:hostname &amp;lt;centred&amp;gt;&lt;br /&gt;
:locale &amp;lt;en&amp;gt;&lt;br /&gt;
:timezone &amp;lt;rome&amp;gt;&lt;br /&gt;
:keyboard layout &amp;lt;en-US&amp;gt;&lt;br /&gt;
:wifi country &amp;lt;it&amp;gt; # anche se non la usero`&lt;br /&gt;
&lt;br /&gt;
Visto che ho aggiornato tanta roba, ho riavviato il sistema.&lt;br /&gt;
&lt;br /&gt;
=== Upgrade ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get upgrade&lt;br /&gt;
reboot # perche` ha aggiornato anche i pacchetti del kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installazione pacchetti ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get install nginx fcgiwrap redis-server asterisk festival festvox-ita* python3-dnspython python3-pip git&lt;br /&gt;
pip3 install redis pyxmpp2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
Per prima cosa, meglio avere gia` sottomano il repository git per copiare files e configurazioni, da utente normale, effettuamo una clonazione di questo repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/CentRed.git&lt;br /&gt;
cd CentRed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;IMPORTANTE&lt;br /&gt;
:Tutti i comandi visualizzati nella fasi successive sono riferiti alla directory in cui ci si trova ora, cioe`: &amp;quot;/home/pi/git/CentRed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Crontab ====&lt;br /&gt;
&lt;br /&gt;
Va bene che sia da utente, non servono permessi particolari:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inseriamo questa riga alla fine del file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
10 7 * * 0 redis-cli hmset msg:redis:alive:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Messaggio ciclico di centralina in funzione&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Riga che una volta a settimana ci inviera` un messaggio che la centralina e` in funzione.&lt;br /&gt;
&lt;br /&gt;
==== Asterisk ====&lt;br /&gt;
&lt;br /&gt;
Per editare i successivi files dovrete essere &amp;quot;root&amp;quot;, quindi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/extensions.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
[centred]&lt;br /&gt;
exten =&amp;gt; _X.,1,Answer()&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Playback(alarm)&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Hangup()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/sip.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
; Configurazione di un interno del PBX&lt;br /&gt;
[2001]                          ; numero identificativo dell'interno (il numero della linea telefonica)&lt;br /&gt;
; Turn off silence suppression in X-Lite (&amp;quot;Transmit Silence&amp;quot;=YES)!&lt;br /&gt;
; Note that Xlite sends NAT keep-alive packets, so qualify=yes is not needed&lt;br /&gt;
secret=NC2001                   ; password in chiaro (può essere anche cifrata con MD5)&lt;br /&gt;
type=friend                     ; la configurazione tipica per un telefono è friend, altrimenti con user per una linea solo ricevente, peer per un trunk verso l'esterno&lt;br /&gt;
regexten=1234                   ; When they register, create extension 1234&lt;br /&gt;
context=centred&lt;br /&gt;
callerid=&amp;quot;CentRed&amp;quot; &amp;lt;2001&amp;gt;       ; i dati di presentazione della linea visualizzati nel display di chi riceve la chiamata&lt;br /&gt;
host=dynamic                    ; This device needs to register&lt;br /&gt;
;directmedia=no                 ; Typically set to NO if behind NAT&lt;br /&gt;
disallow=all&lt;br /&gt;
;Configurazione del tipo di compressione della fonia&lt;br /&gt;
;allow=gsm                      ; GSM consumes far less bandwidth than ulaw - formato compresso che risparmia banda&lt;br /&gt;
allow=alaw                      ; il tipo di codec da usare per la chiamata alaw è senza compressione, è adatto ad esempio su lan&lt;br /&gt;
;mailbox=1234@default,1233@default      ; Subscribe to status of multiple mailboxes&lt;br /&gt;
registertrying=yes ; Send a 100 Trying when the device registers.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/mysite /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/myfastcgi.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
Nel web server e` attiva (in configurazione) l'autenticazione, per completarla dovete creare il file &amp;quot;/var/www/.htaccess&amp;quot; in questo modo (sostituite USERNAME col vostro nome o altro):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
echo -n &amp;quot;USERNAME&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
echo -n &amp;quot;:&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
openssl passwd &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
chown www-data:www-data /var/www/.htpasswd&lt;br /&gt;
chmod 600 /var/www/.htpasswd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redis ====&lt;br /&gt;
&lt;br /&gt;
Potete fare come ho fatto io, oppure modificare tutto nel file di configurazione, dovrebbe essere possibile stando a quel che ho letto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/redis/redis.conf&lt;br /&gt;
:Solo commentato la linea (dovrebbe essere la 61)&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#bind 127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ancora pero` l'accesso da remoto non e` possibile, si deve modificare un'altro parametro e renderlo permanente (quello che scrivevo dovrebbe essere possibile nel file di configurazione):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
redis-cli&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG SET protected-mode no&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG REWRITE&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Importante&lt;br /&gt;
:Non ho impostato nessuna password, quindi non esponete questo pc/raspberry alla rete esterna.&lt;br /&gt;
&lt;br /&gt;
==== CentRed (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -va var/www/ /var/&lt;br /&gt;
chown www-data:www-data /var/www/*.html&lt;br /&gt;
chown www-data:www-data /var/www/cgi-bin/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
Ovviamente all'avvio del sistema la nostra centralina deve avviarsi da sola, ho scelto di eseguire il programma dal &amp;quot;classico&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Start &amp;quot;CentRed&amp;quot;&lt;br /&gt;
DAEMON_NAME=centred  # senza .py&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato \&amp;quot;$DAEMON_NAME\&amp;quot;, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio $DAEMON_NAME ..&amp;quot;&lt;br /&gt;
                #su pi -c &amp;quot;python3 /var/www/cgi-bin/centred.py &amp;amp;&amp;quot;&lt;br /&gt;
                python3 /var/www/cgi-bin/centred.py &amp;amp;  # deve essere 'root'&lt;br /&gt;
                # .. e un messaggio a se stesso quando si [ri]avvia&lt;br /&gt;
                sleep 2  # un po` di ritardo&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio centralino allarmi CentRed&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Start/Reboot &amp;amp; Configure ====&lt;br /&gt;
&lt;br /&gt;
E` il momento di riavviare il sistema.&lt;br /&gt;
&lt;br /&gt;
Se tutto e` andato bene, dovrebbe essere gia` funzionante, rimane da configurarlo.&lt;br /&gt;
&lt;br /&gt;
Da browser aprite l'indirizzo http://centred:8080 (o &amp;quot;localhost:8080&amp;quot; o usate l'indirizzo IP), alcune voci non funzioneranno, altre pagine andranno proprio in errore, basta inserire i dati corretti e nel giusto ordine.&lt;br /&gt;
&lt;br /&gt;
# Per primo, inserite gli account di posta elettronica e XMPP, inserendo il vostro username/password ed eventuali parametri del server (tipo smtp.gmail.com porta 567).&lt;br /&gt;
# Inserite i destinatari dei messaggi, sono previsti inserimenti per destinatari di mail, XMPP e sip.&lt;br /&gt;
# Ora si possono associare gli elenchi ai tipi di messaggi, cioe`, dove dev'essere inviato il messaggio alarm piuttosto che alert ...&lt;br /&gt;
&lt;br /&gt;
== Pagina principale ==&lt;br /&gt;
&lt;br /&gt;
Pagina principale e menu:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Messaggi.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sono visibili i normali messaggi di controllo di funzionamento di se stessa e della centralina [[Thermo]].&lt;br /&gt;
&lt;br /&gt;
I messaggi non ancora confermati sono inviati a cadenze cicliche e per un massimo di volte, dipendente dalla configurazione.&lt;br /&gt;
&lt;br /&gt;
Ovviamente, una volta confermati, non sono piu` inviati e permangono visualizzati nella pagina fino a scadenza (configurazione).&lt;br /&gt;
&lt;br /&gt;
== Prima configurazione ==&lt;br /&gt;
&lt;br /&gt;
Ed anche unica, normalmente ;)&lt;br /&gt;
&lt;br /&gt;
Il database NoSQL Redis utilizzato, non e` configurabile perche` DEVE risiedere nella stessa macchina.&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:Non sono riuscito a parametrizzare tutte le configurazioni&lt;br /&gt;
&lt;br /&gt;
=== Configurazione accounts ===&lt;br /&gt;
&lt;br /&gt;
==== Mail ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso della posta elettronica, questo e` l'indirizzo che servira` per inviare le mail delle segnalazioni della centralina&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==== XMPP ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso del protocollo XMPP, servira` per inviare le segnalazioni della centralina.&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione liste destinatari ===&lt;br /&gt;
&lt;br /&gt;
Aggiungete gli indirizzi dei destinatari dei messaggi delle varie segnalazioni della centralina:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaSIP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione destinazioni allarme ===&lt;br /&gt;
&lt;br /&gt;
Per ogni tipologia di segnalazione, si deve indicare a quali liste e` da inviare:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllarme.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllerta.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
I parametri di controllo ed invio degli avvisi:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Configurazione.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed.git&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed/wiki&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7121</id>
		<title>CentRed</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7121"/>
		<updated>2019-07-28T14:10:46Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* CentRed (www) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Progetto&lt;br /&gt;
|nome=CentRed&lt;br /&gt;
|descrizione=Centralino di controllo avvisi (segnalazioni e allarmi)&lt;br /&gt;
|repo=https://github.com/raspibo/CentRed.git&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Centralino di gestione avvisi e allarmi&lt;br /&gt;
&lt;br /&gt;
Si occupa di avvisare l'utilizzatore attraverso messaggi di posta elettronica, telefonate VOIP e chat (XMPP), di avvisi e allarmi dell'impianto domotico (?) e/o degli apparati che gli inviano messaggi opportunamente predisposti.&lt;br /&gt;
&lt;br /&gt;
Tabella di riferimento del messaggio da inviare: https://github.com/raspibo/CentRed/wiki/Tabella-avvisi.&lt;br /&gt;
&lt;br /&gt;
;Ad oggi questa centralina e` usata da:&lt;br /&gt;
:[[Thermo]]&lt;br /&gt;
:[[Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installazione ==&lt;br /&gt;
&lt;br /&gt;
Distribuzione: Raspbian (Debian) versione 9, codename &amp;quot;stretch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
&lt;br /&gt;
Al primo avvio la nuova SD Card ha visualizzato una schermata di &amp;quot;Resizing file system&amp;quot; (o qualcosa di simile), seguito da un riavvio del sistema.&lt;br /&gt;
&lt;br /&gt;
SSH nella nuova release non e` attivato di default, prima di proseguire l'ho attivato:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
raspi-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5 Interfacing options&lt;br /&gt;
::P2 SSH Enable&lt;br /&gt;
&lt;br /&gt;
.. e visto che ero qui, ho configurato anche qualcos'altro:&lt;br /&gt;
&lt;br /&gt;
:password&lt;br /&gt;
:hostname &amp;lt;centred&amp;gt;&lt;br /&gt;
:locale &amp;lt;en&amp;gt;&lt;br /&gt;
:timezone &amp;lt;rome&amp;gt;&lt;br /&gt;
:keyboard layout &amp;lt;en-US&amp;gt;&lt;br /&gt;
:wifi country &amp;lt;it&amp;gt; # anche se non la usero`&lt;br /&gt;
&lt;br /&gt;
Visto che ho aggiornato tanta roba, ho riavviato il sistema.&lt;br /&gt;
&lt;br /&gt;
=== Upgrade ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get upgrade&lt;br /&gt;
reboot # perche` ha aggiornato anche i pacchetti del kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installazione pacchetti ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get install nginx fcgiwrap redis-server asterisk festival festvox-ita* python3-dnspython python3-pip git&lt;br /&gt;
pip3 install redis pyxmpp2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
Per prima cosa, meglio avere gia` sottomano il repository git per copiare files e configurazioni, da utente normale, effettuamo una clonazione di questo repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/CentRed.git&lt;br /&gt;
cd CentRed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;IMPORTANTE&lt;br /&gt;
:Tutti i comandi visualizzati nella fasi successive sono riferiti alla directory in cui ci si trova ora, cioe`: &amp;quot;/home/pi/git/CentRed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Crontab ====&lt;br /&gt;
&lt;br /&gt;
Va bene che sia da utente, non servono permessi particolari:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inseriamo questa riga alla fine del file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
10 7 * * 0 redis-cli hmset msg:redis:alive:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Messaggio ciclico di centralina in funzione&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Riga che una volta a settimana ci inviera` un messaggio che la centralina e` in funzione.&lt;br /&gt;
&lt;br /&gt;
==== Asterisk ====&lt;br /&gt;
&lt;br /&gt;
Per editare i successivi files dovrete essere &amp;quot;root&amp;quot;, quindi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/extensions.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
[centred]&lt;br /&gt;
exten =&amp;gt; _X.,1,Answer()&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Playback(alarm)&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Hangup()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/sip.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
; Configurazione di un interno del PBX&lt;br /&gt;
[2001]                          ; numero identificativo dell'interno (il numero della linea telefonica)&lt;br /&gt;
; Turn off silence suppression in X-Lite (&amp;quot;Transmit Silence&amp;quot;=YES)!&lt;br /&gt;
; Note that Xlite sends NAT keep-alive packets, so qualify=yes is not needed&lt;br /&gt;
secret=NC2001                   ; password in chiaro (può essere anche cifrata con MD5)&lt;br /&gt;
type=friend                     ; la configurazione tipica per un telefono è friend, altrimenti con user per una linea solo ricevente, peer per un trunk verso l'esterno&lt;br /&gt;
regexten=1234                   ; When they register, create extension 1234&lt;br /&gt;
context=centred&lt;br /&gt;
callerid=&amp;quot;CentRed&amp;quot; &amp;lt;2001&amp;gt;       ; i dati di presentazione della linea visualizzati nel display di chi riceve la chiamata&lt;br /&gt;
host=dynamic                    ; This device needs to register&lt;br /&gt;
;directmedia=no                 ; Typically set to NO if behind NAT&lt;br /&gt;
disallow=all&lt;br /&gt;
;Configurazione del tipo di compressione della fonia&lt;br /&gt;
;allow=gsm                      ; GSM consumes far less bandwidth than ulaw - formato compresso che risparmia banda&lt;br /&gt;
allow=alaw                      ; il tipo di codec da usare per la chiamata alaw è senza compressione, è adatto ad esempio su lan&lt;br /&gt;
;mailbox=1234@default,1233@default      ; Subscribe to status of multiple mailboxes&lt;br /&gt;
registertrying=yes ; Send a 100 Trying when the device registers.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/mysite /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-enabled/mysite /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/myfastcgi.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
Nel web server e` attiva (in configurazione) l'autenticazione, per completarla dovete creare il file &amp;quot;/var/www/.htaccess&amp;quot; in questo modo (sostituite USERNAME col vostro nome o altro):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
echo -n &amp;quot;USERNAME&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
echo -n &amp;quot;:&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
openssl passwd &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
chown www-data:www-data /var/www/.htpasswd&lt;br /&gt;
chmod 600 /var/www/.htpasswd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redis ====&lt;br /&gt;
&lt;br /&gt;
Potete fare come ho fatto io, oppure modificare tutto nel file di configurazione, dovrebbe essere possibile stando a quel che ho letto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/redis/redis.conf&lt;br /&gt;
:Solo commentato la linea (dovrebbe essere la 61)&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#bind 127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ancora pero` l'accesso da remoto non e` possibile, si deve modificare un'altro parametro e renderlo permanente (quello che scrivevo dovrebbe essere possibile nel file di configurazione):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
redis-cli&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG SET protected-mode no&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG REWRITE&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Importante&lt;br /&gt;
:Non ho impostato nessuna password, quindi non esponete questo pc/raspberry alla rete esterna.&lt;br /&gt;
&lt;br /&gt;
==== CentRed (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -va var/www/ /var/&lt;br /&gt;
chown www-data:www-data /var/www/*.html&lt;br /&gt;
chown www-data:www-data /var/www/cgi-bin/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
Ovviamente all'avvio del sistema la nostra centralina deve avviarsi da sola, ho scelto di eseguire il programma dal &amp;quot;classico&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Start &amp;quot;CentRed&amp;quot;&lt;br /&gt;
DAEMON_NAME=centred  # senza .py&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato \&amp;quot;$DAEMON_NAME\&amp;quot;, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio $DAEMON_NAME ..&amp;quot;&lt;br /&gt;
                #su pi -c &amp;quot;python3 /var/www/cgi-bin/centred.py &amp;amp;&amp;quot;&lt;br /&gt;
                python3 /var/www/cgi-bin/centred.py &amp;amp;  # deve essere 'root'&lt;br /&gt;
                # .. e un messaggio a se stesso quando si [ri]avvia&lt;br /&gt;
                sleep 2  # un po` di ritardo&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio centralino allarmi CentRed&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Start/Reboot &amp;amp; Configure ====&lt;br /&gt;
&lt;br /&gt;
E` il momento di riavviare il sistema.&lt;br /&gt;
&lt;br /&gt;
Se tutto e` andato bene, dovrebbe essere gia` funzionante, rimane da configurarlo.&lt;br /&gt;
&lt;br /&gt;
Da browser aprite l'indirizzo http://centred:8080 (o &amp;quot;localhost:8080&amp;quot; o usate l'indirizzo IP), alcune voci non funzioneranno, altre pagine andranno proprio in errore, basta inserire i dati corretti e nel giusto ordine.&lt;br /&gt;
&lt;br /&gt;
# Per primo, inserite gli account di posta elettronica e XMPP, inserendo il vostro username/password ed eventuali parametri del server (tipo smtp.gmail.com porta 567).&lt;br /&gt;
# Inserite i destinatari dei messaggi, sono previsti inserimenti per destinatari di mail, XMPP e sip.&lt;br /&gt;
# Ora si possono associare gli elenchi ai tipi di messaggi, cioe`, dove dev'essere inviato il messaggio alarm piuttosto che alert ...&lt;br /&gt;
&lt;br /&gt;
== Pagina principale ==&lt;br /&gt;
&lt;br /&gt;
Pagina principale e menu:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Messaggi.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sono visibili i normali messaggi di controllo di funzionamento di se stessa e della centralina [[Thermo]].&lt;br /&gt;
&lt;br /&gt;
I messaggi non ancora confermati sono inviati a cadenze cicliche e per un massimo di volte, dipendente dalla configurazione.&lt;br /&gt;
&lt;br /&gt;
Ovviamente, una volta confermati, non sono piu` inviati e permangono visualizzati nella pagina fino a scadenza (configurazione).&lt;br /&gt;
&lt;br /&gt;
== Prima configurazione ==&lt;br /&gt;
&lt;br /&gt;
Ed anche unica, normalmente ;)&lt;br /&gt;
&lt;br /&gt;
Il database NoSQL Redis utilizzato, non e` configurabile perche` DEVE risiedere nella stessa macchina.&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:Non sono riuscito a parametrizzare tutte le configurazioni&lt;br /&gt;
&lt;br /&gt;
=== Configurazione accounts ===&lt;br /&gt;
&lt;br /&gt;
==== Mail ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso della posta elettronica, questo e` l'indirizzo che servira` per inviare le mail delle segnalazioni della centralina&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==== XMPP ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso del protocollo XMPP, servira` per inviare le segnalazioni della centralina.&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione liste destinatari ===&lt;br /&gt;
&lt;br /&gt;
Aggiungete gli indirizzi dei destinatari dei messaggi delle varie segnalazioni della centralina:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaSIP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione destinazioni allarme ===&lt;br /&gt;
&lt;br /&gt;
Per ogni tipologia di segnalazione, si deve indicare a quali liste e` da inviare:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllarme.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllerta.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
I parametri di controllo ed invio degli avvisi:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Configurazione.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed.git&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed/wiki&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7120</id>
		<title>CentRed</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7120"/>
		<updated>2019-07-28T14:06:04Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Nginx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Progetto&lt;br /&gt;
|nome=CentRed&lt;br /&gt;
|descrizione=Centralino di controllo avvisi (segnalazioni e allarmi)&lt;br /&gt;
|repo=https://github.com/raspibo/CentRed.git&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Centralino di gestione avvisi e allarmi&lt;br /&gt;
&lt;br /&gt;
Si occupa di avvisare l'utilizzatore attraverso messaggi di posta elettronica, telefonate VOIP e chat (XMPP), di avvisi e allarmi dell'impianto domotico (?) e/o degli apparati che gli inviano messaggi opportunamente predisposti.&lt;br /&gt;
&lt;br /&gt;
Tabella di riferimento del messaggio da inviare: https://github.com/raspibo/CentRed/wiki/Tabella-avvisi.&lt;br /&gt;
&lt;br /&gt;
;Ad oggi questa centralina e` usata da:&lt;br /&gt;
:[[Thermo]]&lt;br /&gt;
:[[Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installazione ==&lt;br /&gt;
&lt;br /&gt;
Distribuzione: Raspbian (Debian) versione 9, codename &amp;quot;stretch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
&lt;br /&gt;
Al primo avvio la nuova SD Card ha visualizzato una schermata di &amp;quot;Resizing file system&amp;quot; (o qualcosa di simile), seguito da un riavvio del sistema.&lt;br /&gt;
&lt;br /&gt;
SSH nella nuova release non e` attivato di default, prima di proseguire l'ho attivato:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
raspi-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5 Interfacing options&lt;br /&gt;
::P2 SSH Enable&lt;br /&gt;
&lt;br /&gt;
.. e visto che ero qui, ho configurato anche qualcos'altro:&lt;br /&gt;
&lt;br /&gt;
:password&lt;br /&gt;
:hostname &amp;lt;centred&amp;gt;&lt;br /&gt;
:locale &amp;lt;en&amp;gt;&lt;br /&gt;
:timezone &amp;lt;rome&amp;gt;&lt;br /&gt;
:keyboard layout &amp;lt;en-US&amp;gt;&lt;br /&gt;
:wifi country &amp;lt;it&amp;gt; # anche se non la usero`&lt;br /&gt;
&lt;br /&gt;
Visto che ho aggiornato tanta roba, ho riavviato il sistema.&lt;br /&gt;
&lt;br /&gt;
=== Upgrade ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get upgrade&lt;br /&gt;
reboot # perche` ha aggiornato anche i pacchetti del kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installazione pacchetti ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get install nginx fcgiwrap redis-server asterisk festival festvox-ita* python3-dnspython python3-pip git&lt;br /&gt;
pip3 install redis pyxmpp2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
Per prima cosa, meglio avere gia` sottomano il repository git per copiare files e configurazioni, da utente normale, effettuamo una clonazione di questo repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/CentRed.git&lt;br /&gt;
cd CentRed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;IMPORTANTE&lt;br /&gt;
:Tutti i comandi visualizzati nella fasi successive sono riferiti alla directory in cui ci si trova ora, cioe`: &amp;quot;/home/pi/git/CentRed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Crontab ====&lt;br /&gt;
&lt;br /&gt;
Va bene che sia da utente, non servono permessi particolari:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inseriamo questa riga alla fine del file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
10 7 * * 0 redis-cli hmset msg:redis:alive:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Messaggio ciclico di centralina in funzione&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Riga che una volta a settimana ci inviera` un messaggio che la centralina e` in funzione.&lt;br /&gt;
&lt;br /&gt;
==== Asterisk ====&lt;br /&gt;
&lt;br /&gt;
Per editare i successivi files dovrete essere &amp;quot;root&amp;quot;, quindi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/extensions.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
[centred]&lt;br /&gt;
exten =&amp;gt; _X.,1,Answer()&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Playback(alarm)&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Hangup()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/sip.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
; Configurazione di un interno del PBX&lt;br /&gt;
[2001]                          ; numero identificativo dell'interno (il numero della linea telefonica)&lt;br /&gt;
; Turn off silence suppression in X-Lite (&amp;quot;Transmit Silence&amp;quot;=YES)!&lt;br /&gt;
; Note that Xlite sends NAT keep-alive packets, so qualify=yes is not needed&lt;br /&gt;
secret=NC2001                   ; password in chiaro (può essere anche cifrata con MD5)&lt;br /&gt;
type=friend                     ; la configurazione tipica per un telefono è friend, altrimenti con user per una linea solo ricevente, peer per un trunk verso l'esterno&lt;br /&gt;
regexten=1234                   ; When they register, create extension 1234&lt;br /&gt;
context=centred&lt;br /&gt;
callerid=&amp;quot;CentRed&amp;quot; &amp;lt;2001&amp;gt;       ; i dati di presentazione della linea visualizzati nel display di chi riceve la chiamata&lt;br /&gt;
host=dynamic                    ; This device needs to register&lt;br /&gt;
;directmedia=no                 ; Typically set to NO if behind NAT&lt;br /&gt;
disallow=all&lt;br /&gt;
;Configurazione del tipo di compressione della fonia&lt;br /&gt;
;allow=gsm                      ; GSM consumes far less bandwidth than ulaw - formato compresso che risparmia banda&lt;br /&gt;
allow=alaw                      ; il tipo di codec da usare per la chiamata alaw è senza compressione, è adatto ad esempio su lan&lt;br /&gt;
;mailbox=1234@default,1233@default      ; Subscribe to status of multiple mailboxes&lt;br /&gt;
registertrying=yes ; Send a 100 Trying when the device registers.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/mysite /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-enabled/mysite /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/myfastcgi.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
Nel web server e` attiva (in configurazione) l'autenticazione, per completarla dovete creare il file &amp;quot;/var/www/.htaccess&amp;quot; in questo modo (sostituite USERNAME col vostro nome o altro):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
echo -n &amp;quot;USERNAME&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
echo -n &amp;quot;:&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
openssl passwd &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
chown www-data:www-data /var/www/.htpasswd&lt;br /&gt;
chmod 600 /var/www/.htpasswd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redis ====&lt;br /&gt;
&lt;br /&gt;
Potete fare come ho fatto io, oppure modificare tutto nel file di configurazione, dovrebbe essere possibile stando a quel che ho letto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/redis/redis.conf&lt;br /&gt;
:Solo commentato la linea (dovrebbe essere la 61)&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#bind 127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ancora pero` l'accesso da remoto non e` possibile, si deve modificare un'altro parametro e renderlo permanente (quello che scrivevo dovrebbe essere possibile nel file di configurazione):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
redis-cli&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG SET protected-mode no&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG REWRITE&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Importante&lt;br /&gt;
:Non ho impostato nessuna password, quindi non esponete questo pc/raspberry alla rete esterna.&lt;br /&gt;
&lt;br /&gt;
==== CentRed (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -varpu var/www/ /var/&lt;br /&gt;
chown www-data:www-data /var/www/*.html&lt;br /&gt;
chown www-data:www-data /var/www/cgi-bin/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
Ovviamente all'avvio del sistema la nostra centralina deve avviarsi da sola, ho scelto di eseguire il programma dal &amp;quot;classico&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Start &amp;quot;CentRed&amp;quot;&lt;br /&gt;
DAEMON_NAME=centred  # senza .py&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato \&amp;quot;$DAEMON_NAME\&amp;quot;, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio $DAEMON_NAME ..&amp;quot;&lt;br /&gt;
                #su pi -c &amp;quot;python3 /var/www/cgi-bin/centred.py &amp;amp;&amp;quot;&lt;br /&gt;
                python3 /var/www/cgi-bin/centred.py &amp;amp;  # deve essere 'root'&lt;br /&gt;
                # .. e un messaggio a se stesso quando si [ri]avvia&lt;br /&gt;
                sleep 2  # un po` di ritardo&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio centralino allarmi CentRed&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Start/Reboot &amp;amp; Configure ====&lt;br /&gt;
&lt;br /&gt;
E` il momento di riavviare il sistema.&lt;br /&gt;
&lt;br /&gt;
Se tutto e` andato bene, dovrebbe essere gia` funzionante, rimane da configurarlo.&lt;br /&gt;
&lt;br /&gt;
Da browser aprite l'indirizzo http://centred:8080 (o &amp;quot;localhost:8080&amp;quot; o usate l'indirizzo IP), alcune voci non funzioneranno, altre pagine andranno proprio in errore, basta inserire i dati corretti e nel giusto ordine.&lt;br /&gt;
&lt;br /&gt;
# Per primo, inserite gli account di posta elettronica e XMPP, inserendo il vostro username/password ed eventuali parametri del server (tipo smtp.gmail.com porta 567).&lt;br /&gt;
# Inserite i destinatari dei messaggi, sono previsti inserimenti per destinatari di mail, XMPP e sip.&lt;br /&gt;
# Ora si possono associare gli elenchi ai tipi di messaggi, cioe`, dove dev'essere inviato il messaggio alarm piuttosto che alert ...&lt;br /&gt;
&lt;br /&gt;
== Pagina principale ==&lt;br /&gt;
&lt;br /&gt;
Pagina principale e menu:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Messaggi.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sono visibili i normali messaggi di controllo di funzionamento di se stessa e della centralina [[Thermo]].&lt;br /&gt;
&lt;br /&gt;
I messaggi non ancora confermati sono inviati a cadenze cicliche e per un massimo di volte, dipendente dalla configurazione.&lt;br /&gt;
&lt;br /&gt;
Ovviamente, una volta confermati, non sono piu` inviati e permangono visualizzati nella pagina fino a scadenza (configurazione).&lt;br /&gt;
&lt;br /&gt;
== Prima configurazione ==&lt;br /&gt;
&lt;br /&gt;
Ed anche unica, normalmente ;)&lt;br /&gt;
&lt;br /&gt;
Il database NoSQL Redis utilizzato, non e` configurabile perche` DEVE risiedere nella stessa macchina.&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:Non sono riuscito a parametrizzare tutte le configurazioni&lt;br /&gt;
&lt;br /&gt;
=== Configurazione accounts ===&lt;br /&gt;
&lt;br /&gt;
==== Mail ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso della posta elettronica, questo e` l'indirizzo che servira` per inviare le mail delle segnalazioni della centralina&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==== XMPP ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso del protocollo XMPP, servira` per inviare le segnalazioni della centralina.&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione liste destinatari ===&lt;br /&gt;
&lt;br /&gt;
Aggiungete gli indirizzi dei destinatari dei messaggi delle varie segnalazioni della centralina:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaSIP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione destinazioni allarme ===&lt;br /&gt;
&lt;br /&gt;
Per ogni tipologia di segnalazione, si deve indicare a quali liste e` da inviare:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllarme.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllerta.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
I parametri di controllo ed invio degli avvisi:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Configurazione.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed.git&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed/wiki&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7119</id>
		<title>CentRed</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7119"/>
		<updated>2019-07-28T14:05:19Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Nginx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Progetto&lt;br /&gt;
|nome=CentRed&lt;br /&gt;
|descrizione=Centralino di controllo avvisi (segnalazioni e allarmi)&lt;br /&gt;
|repo=https://github.com/raspibo/CentRed.git&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Centralino di gestione avvisi e allarmi&lt;br /&gt;
&lt;br /&gt;
Si occupa di avvisare l'utilizzatore attraverso messaggi di posta elettronica, telefonate VOIP e chat (XMPP), di avvisi e allarmi dell'impianto domotico (?) e/o degli apparati che gli inviano messaggi opportunamente predisposti.&lt;br /&gt;
&lt;br /&gt;
Tabella di riferimento del messaggio da inviare: https://github.com/raspibo/CentRed/wiki/Tabella-avvisi.&lt;br /&gt;
&lt;br /&gt;
;Ad oggi questa centralina e` usata da:&lt;br /&gt;
:[[Thermo]]&lt;br /&gt;
:[[Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installazione ==&lt;br /&gt;
&lt;br /&gt;
Distribuzione: Raspbian (Debian) versione 9, codename &amp;quot;stretch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
&lt;br /&gt;
Al primo avvio la nuova SD Card ha visualizzato una schermata di &amp;quot;Resizing file system&amp;quot; (o qualcosa di simile), seguito da un riavvio del sistema.&lt;br /&gt;
&lt;br /&gt;
SSH nella nuova release non e` attivato di default, prima di proseguire l'ho attivato:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
raspi-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5 Interfacing options&lt;br /&gt;
::P2 SSH Enable&lt;br /&gt;
&lt;br /&gt;
.. e visto che ero qui, ho configurato anche qualcos'altro:&lt;br /&gt;
&lt;br /&gt;
:password&lt;br /&gt;
:hostname &amp;lt;centred&amp;gt;&lt;br /&gt;
:locale &amp;lt;en&amp;gt;&lt;br /&gt;
:timezone &amp;lt;rome&amp;gt;&lt;br /&gt;
:keyboard layout &amp;lt;en-US&amp;gt;&lt;br /&gt;
:wifi country &amp;lt;it&amp;gt; # anche se non la usero`&lt;br /&gt;
&lt;br /&gt;
Visto che ho aggiornato tanta roba, ho riavviato il sistema.&lt;br /&gt;
&lt;br /&gt;
=== Upgrade ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get upgrade&lt;br /&gt;
reboot # perche` ha aggiornato anche i pacchetti del kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installazione pacchetti ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get install nginx fcgiwrap redis-server asterisk festival festvox-ita* python3-dnspython python3-pip git&lt;br /&gt;
pip3 install redis pyxmpp2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
Per prima cosa, meglio avere gia` sottomano il repository git per copiare files e configurazioni, da utente normale, effettuamo una clonazione di questo repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/CentRed.git&lt;br /&gt;
cd CentRed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;IMPORTANTE&lt;br /&gt;
:Tutti i comandi visualizzati nella fasi successive sono riferiti alla directory in cui ci si trova ora, cioe`: &amp;quot;/home/pi/git/CentRed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Crontab ====&lt;br /&gt;
&lt;br /&gt;
Va bene che sia da utente, non servono permessi particolari:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inseriamo questa riga alla fine del file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
10 7 * * 0 redis-cli hmset msg:redis:alive:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Messaggio ciclico di centralina in funzione&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Riga che una volta a settimana ci inviera` un messaggio che la centralina e` in funzione.&lt;br /&gt;
&lt;br /&gt;
==== Asterisk ====&lt;br /&gt;
&lt;br /&gt;
Per editare i successivi files dovrete essere &amp;quot;root&amp;quot;, quindi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/extensions.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
[centred]&lt;br /&gt;
exten =&amp;gt; _X.,1,Answer()&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Playback(alarm)&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Hangup()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/sip.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
; Configurazione di un interno del PBX&lt;br /&gt;
[2001]                          ; numero identificativo dell'interno (il numero della linea telefonica)&lt;br /&gt;
; Turn off silence suppression in X-Lite (&amp;quot;Transmit Silence&amp;quot;=YES)!&lt;br /&gt;
; Note that Xlite sends NAT keep-alive packets, so qualify=yes is not needed&lt;br /&gt;
secret=NC2001                   ; password in chiaro (può essere anche cifrata con MD5)&lt;br /&gt;
type=friend                     ; la configurazione tipica per un telefono è friend, altrimenti con user per una linea solo ricevente, peer per un trunk verso l'esterno&lt;br /&gt;
regexten=1234                   ; When they register, create extension 1234&lt;br /&gt;
context=centred&lt;br /&gt;
callerid=&amp;quot;CentRed&amp;quot; &amp;lt;2001&amp;gt;       ; i dati di presentazione della linea visualizzati nel display di chi riceve la chiamata&lt;br /&gt;
host=dynamic                    ; This device needs to register&lt;br /&gt;
;directmedia=no                 ; Typically set to NO if behind NAT&lt;br /&gt;
disallow=all&lt;br /&gt;
;Configurazione del tipo di compressione della fonia&lt;br /&gt;
;allow=gsm                      ; GSM consumes far less bandwidth than ulaw - formato compresso che risparmia banda&lt;br /&gt;
allow=alaw                      ; il tipo di codec da usare per la chiamata alaw è senza compressione, è adatto ad esempio su lan&lt;br /&gt;
;mailbox=1234@default,1233@default      ; Subscribe to status of multiple mailboxes&lt;br /&gt;
registertrying=yes ; Send a 100 Trying when the device registers.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/mysite /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-enabled/mysite /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/myfastcgi.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
Nel web server e` attiva (in configurazione) l'autenticazione, per completarla dovete creare il file &amp;quot;/var/www/.htaccess&amp;quot; in questo modo (sostituite USERNAME col vostro nome o altro):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
echo -n &amp;quot;USERNAME&amp;quot; &amp;gt;&amp;gt; /var/www/.htpassw&lt;br /&gt;
echo -n &amp;quot;:&amp;quot; &amp;gt;&amp;gt; /var/www/.htpassw&lt;br /&gt;
openssl passwd &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
chown www-data:www-data /var/www/.htpasswd&lt;br /&gt;
chmod 600 /var/www/.htpasswd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redis ====&lt;br /&gt;
&lt;br /&gt;
Potete fare come ho fatto io, oppure modificare tutto nel file di configurazione, dovrebbe essere possibile stando a quel che ho letto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/redis/redis.conf&lt;br /&gt;
:Solo commentato la linea (dovrebbe essere la 61)&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#bind 127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ancora pero` l'accesso da remoto non e` possibile, si deve modificare un'altro parametro e renderlo permanente (quello che scrivevo dovrebbe essere possibile nel file di configurazione):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
redis-cli&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG SET protected-mode no&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG REWRITE&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Importante&lt;br /&gt;
:Non ho impostato nessuna password, quindi non esponete questo pc/raspberry alla rete esterna.&lt;br /&gt;
&lt;br /&gt;
==== CentRed (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -varpu var/www/ /var/&lt;br /&gt;
chown www-data:www-data /var/www/*.html&lt;br /&gt;
chown www-data:www-data /var/www/cgi-bin/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
Ovviamente all'avvio del sistema la nostra centralina deve avviarsi da sola, ho scelto di eseguire il programma dal &amp;quot;classico&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Start &amp;quot;CentRed&amp;quot;&lt;br /&gt;
DAEMON_NAME=centred  # senza .py&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato \&amp;quot;$DAEMON_NAME\&amp;quot;, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio $DAEMON_NAME ..&amp;quot;&lt;br /&gt;
                #su pi -c &amp;quot;python3 /var/www/cgi-bin/centred.py &amp;amp;&amp;quot;&lt;br /&gt;
                python3 /var/www/cgi-bin/centred.py &amp;amp;  # deve essere 'root'&lt;br /&gt;
                # .. e un messaggio a se stesso quando si [ri]avvia&lt;br /&gt;
                sleep 2  # un po` di ritardo&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio centralino allarmi CentRed&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Start/Reboot &amp;amp; Configure ====&lt;br /&gt;
&lt;br /&gt;
E` il momento di riavviare il sistema.&lt;br /&gt;
&lt;br /&gt;
Se tutto e` andato bene, dovrebbe essere gia` funzionante, rimane da configurarlo.&lt;br /&gt;
&lt;br /&gt;
Da browser aprite l'indirizzo http://centred:8080 (o &amp;quot;localhost:8080&amp;quot; o usate l'indirizzo IP), alcune voci non funzioneranno, altre pagine andranno proprio in errore, basta inserire i dati corretti e nel giusto ordine.&lt;br /&gt;
&lt;br /&gt;
# Per primo, inserite gli account di posta elettronica e XMPP, inserendo il vostro username/password ed eventuali parametri del server (tipo smtp.gmail.com porta 567).&lt;br /&gt;
# Inserite i destinatari dei messaggi, sono previsti inserimenti per destinatari di mail, XMPP e sip.&lt;br /&gt;
# Ora si possono associare gli elenchi ai tipi di messaggi, cioe`, dove dev'essere inviato il messaggio alarm piuttosto che alert ...&lt;br /&gt;
&lt;br /&gt;
== Pagina principale ==&lt;br /&gt;
&lt;br /&gt;
Pagina principale e menu:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Messaggi.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sono visibili i normali messaggi di controllo di funzionamento di se stessa e della centralina [[Thermo]].&lt;br /&gt;
&lt;br /&gt;
I messaggi non ancora confermati sono inviati a cadenze cicliche e per un massimo di volte, dipendente dalla configurazione.&lt;br /&gt;
&lt;br /&gt;
Ovviamente, una volta confermati, non sono piu` inviati e permangono visualizzati nella pagina fino a scadenza (configurazione).&lt;br /&gt;
&lt;br /&gt;
== Prima configurazione ==&lt;br /&gt;
&lt;br /&gt;
Ed anche unica, normalmente ;)&lt;br /&gt;
&lt;br /&gt;
Il database NoSQL Redis utilizzato, non e` configurabile perche` DEVE risiedere nella stessa macchina.&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:Non sono riuscito a parametrizzare tutte le configurazioni&lt;br /&gt;
&lt;br /&gt;
=== Configurazione accounts ===&lt;br /&gt;
&lt;br /&gt;
==== Mail ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso della posta elettronica, questo e` l'indirizzo che servira` per inviare le mail delle segnalazioni della centralina&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==== XMPP ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso del protocollo XMPP, servira` per inviare le segnalazioni della centralina.&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione liste destinatari ===&lt;br /&gt;
&lt;br /&gt;
Aggiungete gli indirizzi dei destinatari dei messaggi delle varie segnalazioni della centralina:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaSIP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione destinazioni allarme ===&lt;br /&gt;
&lt;br /&gt;
Per ogni tipologia di segnalazione, si deve indicare a quali liste e` da inviare:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllarme.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllerta.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
I parametri di controllo ed invio degli avvisi:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Configurazione.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed.git&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed/wiki&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7118</id>
		<title>CentRed</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=CentRed&amp;diff=7118"/>
		<updated>2019-07-28T14:00:48Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Configurazione */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Progetto&lt;br /&gt;
|nome=CentRed&lt;br /&gt;
|descrizione=Centralino di controllo avvisi (segnalazioni e allarmi)&lt;br /&gt;
|repo=https://github.com/raspibo/CentRed.git&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Centralino di gestione avvisi e allarmi&lt;br /&gt;
&lt;br /&gt;
Si occupa di avvisare l'utilizzatore attraverso messaggi di posta elettronica, telefonate VOIP e chat (XMPP), di avvisi e allarmi dell'impianto domotico (?) e/o degli apparati che gli inviano messaggi opportunamente predisposti.&lt;br /&gt;
&lt;br /&gt;
Tabella di riferimento del messaggio da inviare: https://github.com/raspibo/CentRed/wiki/Tabella-avvisi.&lt;br /&gt;
&lt;br /&gt;
;Ad oggi questa centralina e` usata da:&lt;br /&gt;
:[[Thermo]]&lt;br /&gt;
:[[Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installazione ==&lt;br /&gt;
&lt;br /&gt;
Distribuzione: Raspbian (Debian) versione 9, codename &amp;quot;stretch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
&lt;br /&gt;
Al primo avvio la nuova SD Card ha visualizzato una schermata di &amp;quot;Resizing file system&amp;quot; (o qualcosa di simile), seguito da un riavvio del sistema.&lt;br /&gt;
&lt;br /&gt;
SSH nella nuova release non e` attivato di default, prima di proseguire l'ho attivato:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
raspi-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5 Interfacing options&lt;br /&gt;
::P2 SSH Enable&lt;br /&gt;
&lt;br /&gt;
.. e visto che ero qui, ho configurato anche qualcos'altro:&lt;br /&gt;
&lt;br /&gt;
:password&lt;br /&gt;
:hostname &amp;lt;centred&amp;gt;&lt;br /&gt;
:locale &amp;lt;en&amp;gt;&lt;br /&gt;
:timezone &amp;lt;rome&amp;gt;&lt;br /&gt;
:keyboard layout &amp;lt;en-US&amp;gt;&lt;br /&gt;
:wifi country &amp;lt;it&amp;gt; # anche se non la usero`&lt;br /&gt;
&lt;br /&gt;
Visto che ho aggiornato tanta roba, ho riavviato il sistema.&lt;br /&gt;
&lt;br /&gt;
=== Upgrade ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get upgrade&lt;br /&gt;
reboot # perche` ha aggiornato anche i pacchetti del kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installazione pacchetti ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get install nginx fcgiwrap redis-server asterisk festival festvox-ita* python3-dnspython python3-pip git&lt;br /&gt;
pip3 install redis pyxmpp2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
Per prima cosa, meglio avere gia` sottomano il repository git per copiare files e configurazioni, da utente normale, effettuamo una clonazione di questo repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/CentRed.git&lt;br /&gt;
cd CentRed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;IMPORTANTE&lt;br /&gt;
:Tutti i comandi visualizzati nella fasi successive sono riferiti alla directory in cui ci si trova ora, cioe`: &amp;quot;/home/pi/git/CentRed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Crontab ====&lt;br /&gt;
&lt;br /&gt;
Va bene che sia da utente, non servono permessi particolari:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
crontab -e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Inseriamo questa riga alla fine del file:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
10 7 * * 0 redis-cli hmset msg:redis:alive:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Messaggio ciclico di centralina in funzione&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Riga che una volta a settimana ci inviera` un messaggio che la centralina e` in funzione.&lt;br /&gt;
&lt;br /&gt;
==== Asterisk ====&lt;br /&gt;
&lt;br /&gt;
Per editare i successivi files dovrete essere &amp;quot;root&amp;quot;, quindi:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/extensions.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
[centred]&lt;br /&gt;
exten =&amp;gt; _X.,1,Answer()&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Playback(alarm)&lt;br /&gt;
exten =&amp;gt; _X.,n,Wait(1)&lt;br /&gt;
exten =&amp;gt; _X.,n,Hangup()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/asterisk/sip.conf&lt;br /&gt;
:Aggiungete queste righe in fondo al file&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
; Configurazione di un interno del PBX&lt;br /&gt;
[2001]                          ; numero identificativo dell'interno (il numero della linea telefonica)&lt;br /&gt;
; Turn off silence suppression in X-Lite (&amp;quot;Transmit Silence&amp;quot;=YES)!&lt;br /&gt;
; Note that Xlite sends NAT keep-alive packets, so qualify=yes is not needed&lt;br /&gt;
secret=NC2001                   ; password in chiaro (può essere anche cifrata con MD5)&lt;br /&gt;
type=friend                     ; la configurazione tipica per un telefono è friend, altrimenti con user per una linea solo ricevente, peer per un trunk verso l'esterno&lt;br /&gt;
regexten=1234                   ; When they register, create extension 1234&lt;br /&gt;
context=centred&lt;br /&gt;
callerid=&amp;quot;CentRed&amp;quot; &amp;lt;2001&amp;gt;       ; i dati di presentazione della linea visualizzati nel display di chi riceve la chiamata&lt;br /&gt;
host=dynamic                    ; This device needs to register&lt;br /&gt;
;directmedia=no                 ; Typically set to NO if behind NAT&lt;br /&gt;
disallow=all&lt;br /&gt;
;Configurazione del tipo di compressione della fonia&lt;br /&gt;
;allow=gsm                      ; GSM consumes far less bandwidth than ulaw - formato compresso che risparmia banda&lt;br /&gt;
allow=alaw                      ; il tipo di codec da usare per la chiamata alaw è senza compressione, è adatto ad esempio su lan&lt;br /&gt;
;mailbox=1234@default,1233@default      ; Subscribe to status of multiple mailboxes&lt;br /&gt;
registertrying=yes ; Send a 100 Trying when the device registers.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/mysite /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-enabled/mysite /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/myfastcgi.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
Nel web server e` attiva (in configurazione) l'autenticazione, per completarla dovete creare il file &amp;quot;/var/www/.htaccess&amp;quot; in questo modo (sostituite USERNAME col vostro nome o altro):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
echo -n &amp;quot;USERNAME&amp;quot; &amp;gt;&amp;gt; /var/www/.htpassw&lt;br /&gt;
echo -n &amp;quot;:&amp;quot; &amp;gt;&amp;gt; /var/www/.htpasswdd&lt;br /&gt;
openssl passwd &amp;gt;&amp;gt; /var/www/.htpasswd&lt;br /&gt;
chown www-data:www-data /var/www/.htpasswd&lt;br /&gt;
chmod 600 /var/www/.htpasswd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redis ====&lt;br /&gt;
&lt;br /&gt;
Potete fare come ho fatto io, oppure modificare tutto nel file di configurazione, dovrebbe essere possibile stando a quel che ho letto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/etc/redis/redis.conf&lt;br /&gt;
:Solo commentato la linea (dovrebbe essere la 61)&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#bind 127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ancora pero` l'accesso da remoto non e` possibile, si deve modificare un'altro parametro e renderlo permanente (quello che scrivevo dovrebbe essere possibile nel file di configurazione):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
redis-cli&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG SET protected-mode no&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; CONFIG REWRITE&lt;br /&gt;
OK&lt;br /&gt;
127.0.0.1:6379&amp;gt; quit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Importante&lt;br /&gt;
:Non ho impostato nessuna password, quindi non esponete questo pc/raspberry alla rete esterna.&lt;br /&gt;
&lt;br /&gt;
==== CentRed (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -varpu var/www/ /var/&lt;br /&gt;
chown www-data:www-data /var/www/*.html&lt;br /&gt;
chown www-data:www-data /var/www/cgi-bin/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
Ovviamente all'avvio del sistema la nostra centralina deve avviarsi da sola, ho scelto di eseguire il programma dal &amp;quot;classico&amp;quot; file:&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Start &amp;quot;CentRed&amp;quot;&lt;br /&gt;
DAEMON_NAME=centred  # senza .py&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato \&amp;quot;$DAEMON_NAME\&amp;quot;, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio $DAEMON_NAME ..&amp;quot;&lt;br /&gt;
                #su pi -c &amp;quot;python3 /var/www/cgi-bin/centred.py &amp;amp;&amp;quot;&lt;br /&gt;
                python3 /var/www/cgi-bin/centred.py &amp;amp;  # deve essere 'root'&lt;br /&gt;
                # .. e un messaggio a se stesso quando si [ri]avvia&lt;br /&gt;
                sleep 2  # un po` di ritardo&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio centralino allarmi CentRed&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Start/Reboot &amp;amp; Configure ====&lt;br /&gt;
&lt;br /&gt;
E` il momento di riavviare il sistema.&lt;br /&gt;
&lt;br /&gt;
Se tutto e` andato bene, dovrebbe essere gia` funzionante, rimane da configurarlo.&lt;br /&gt;
&lt;br /&gt;
Da browser aprite l'indirizzo http://centred:8080 (o &amp;quot;localhost:8080&amp;quot; o usate l'indirizzo IP), alcune voci non funzioneranno, altre pagine andranno proprio in errore, basta inserire i dati corretti e nel giusto ordine.&lt;br /&gt;
&lt;br /&gt;
# Per primo, inserite gli account di posta elettronica e XMPP, inserendo il vostro username/password ed eventuali parametri del server (tipo smtp.gmail.com porta 567).&lt;br /&gt;
# Inserite i destinatari dei messaggi, sono previsti inserimenti per destinatari di mail, XMPP e sip.&lt;br /&gt;
# Ora si possono associare gli elenchi ai tipi di messaggi, cioe`, dove dev'essere inviato il messaggio alarm piuttosto che alert ...&lt;br /&gt;
&lt;br /&gt;
== Pagina principale ==&lt;br /&gt;
&lt;br /&gt;
Pagina principale e menu:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Messaggi.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sono visibili i normali messaggi di controllo di funzionamento di se stessa e della centralina [[Thermo]].&lt;br /&gt;
&lt;br /&gt;
I messaggi non ancora confermati sono inviati a cadenze cicliche e per un massimo di volte, dipendente dalla configurazione.&lt;br /&gt;
&lt;br /&gt;
Ovviamente, una volta confermati, non sono piu` inviati e permangono visualizzati nella pagina fino a scadenza (configurazione).&lt;br /&gt;
&lt;br /&gt;
== Prima configurazione ==&lt;br /&gt;
&lt;br /&gt;
Ed anche unica, normalmente ;)&lt;br /&gt;
&lt;br /&gt;
Il database NoSQL Redis utilizzato, non e` configurabile perche` DEVE risiedere nella stessa macchina.&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:Non sono riuscito a parametrizzare tutte le configurazioni&lt;br /&gt;
&lt;br /&gt;
=== Configurazione accounts ===&lt;br /&gt;
&lt;br /&gt;
==== Mail ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso della posta elettronica, questo e` l'indirizzo che servira` per inviare le mail delle segnalazioni della centralina&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==== XMPP ====&lt;br /&gt;
&lt;br /&gt;
Inserite le credenziali per l'invio/uso del protocollo XMPP, servira` per inviare le segnalazioni della centralina.&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ConfiguraXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione liste destinatari ===&lt;br /&gt;
&lt;br /&gt;
Aggiungete gli indirizzi dei destinatari dei messaggi delle varie segnalazioni della centralina:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaMail.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaXMPP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-ListaSIP.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione destinazioni allarme ===&lt;br /&gt;
&lt;br /&gt;
Per ogni tipologia di segnalazione, si deve indicare a quali liste e` da inviare:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllarme.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-SelezioneListeMessaggiAllerta.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Configurazione ===&lt;br /&gt;
&lt;br /&gt;
I parametri di controllo ed invio degli avvisi:&lt;br /&gt;
&lt;br /&gt;
[[File:Centred-Configurazione.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed.git&lt;br /&gt;
&lt;br /&gt;
https://github.com/raspibo/CentRed/wiki&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Motion_con_Raspberry_Pi_Camera_on_board&amp;diff=7038</id>
		<title>Motion con Raspberry Pi Camera on board</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Motion_con_Raspberry_Pi_Camera_on_board&amp;diff=7038"/>
		<updated>2019-05-16T14:06:03Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Installazione motion ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash gutter=false&amp;gt;&lt;br /&gt;
sudo apt-get install motion&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Perche` funzioni con la &amp;quot;raspi-cam&amp;quot; (la Camera on board ufficiale del Raspberry Pi), si deve caricare il modulo &amp;quot;bcm2835-v4l2&amp;quot;, per farlo ad ogni avvio del Raspberry Pi, aggiungiamolo nel file &amp;quot;/etc/modules&amp;quot;:&lt;br /&gt;
&amp;lt;source lang=bash gutter=false&amp;gt;&lt;br /&gt;
# /etc/modules: kernel modules to load at boot time.&lt;br /&gt;
#&lt;br /&gt;
# This file contains the names of kernel modules that should be loaded&lt;br /&gt;
# at boot time, one per line. Lines beginning with &amp;quot;#&amp;quot; are ignored.&lt;br /&gt;
&lt;br /&gt;
bcm2835-v4l2&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configurazione motion ==&lt;br /&gt;
&lt;br /&gt;
''La mia intenzione e` stata di non utilizzarlo da &amp;quot;root&amp;quot;, ma da normale utente &amp;quot;pi&amp;quot;, per cui ..&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
Ho creato la directory di lavoro nella directory utente &amp;quot;/home/pi&amp;quot; e ho copiato il file di configurazione d'esempio fornito con il pacchetto installato:&lt;br /&gt;
&amp;lt;source lang=bash gutter=false&amp;gt;&lt;br /&gt;
mkdir motion&lt;br /&gt;
cp /usr/share/motion/examples/motion-dist.conf motion/motion.conf&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ho modificato il file (motion/motion.conf) secondo le mie esigenze, riporto alcune delle impostazioni modificate (e/o controllate) a titolo d'esempio:&lt;br /&gt;
&amp;lt;source lang=bash gutter=false&amp;gt;&lt;br /&gt;
daemon off&lt;br /&gt;
process_id_file /home/pi/motion/motion.pid&lt;br /&gt;
setup_mode off&lt;br /&gt;
logfile /home/pi/motion/motion.log&lt;br /&gt;
log_level 6&lt;br /&gt;
log_type all&lt;br /&gt;
videodevice /dev/video0&lt;br /&gt;
v4l2_palette 15&lt;br /&gt;
input -1&lt;br /&gt;
norm 0&lt;br /&gt;
frequency 0&lt;br /&gt;
rotate 270&lt;br /&gt;
width 480&lt;br /&gt;
height 640&lt;br /&gt;
framerate 2&lt;br /&gt;
minimum_frame_time 0&lt;br /&gt;
netcam_keepalive off&lt;br /&gt;
netcam_tolerant_check off&lt;br /&gt;
rtsp_uses_tcp on&lt;br /&gt;
auto_brightness off&lt;br /&gt;
brightness 0&lt;br /&gt;
contrast 0&lt;br /&gt;
saturation 0&lt;br /&gt;
hue 0&lt;br /&gt;
power_line_frequency -1&lt;br /&gt;
roundrobin_frames 1&lt;br /&gt;
roundrobin_skip 1&lt;br /&gt;
switchfilter off&lt;br /&gt;
threshold 15000&lt;br /&gt;
threshold_tune off&lt;br /&gt;
noise_level 32&lt;br /&gt;
noise_tune on&lt;br /&gt;
lightswitch 0&lt;br /&gt;
minimum_motion_frames 1&lt;br /&gt;
pre_capture 0&lt;br /&gt;
post_capture 0&lt;br /&gt;
event_gap 60&lt;br /&gt;
max_movie_time 120&lt;br /&gt;
emulate_motion off&lt;br /&gt;
output_pictures on&lt;br /&gt;
output_debug_pictures off&lt;br /&gt;
quality 75&lt;br /&gt;
camera_id 0&lt;br /&gt;
picture_type jpeg&lt;br /&gt;
ffmpeg_output_movies on&lt;br /&gt;
ffmpeg_output_debug_movies off&lt;br /&gt;
ffmpeg_timelapse 0&lt;br /&gt;
ffmpeg_timelapse_mode daily&lt;br /&gt;
ffmpeg_bps 400000&lt;br /&gt;
ffmpeg_variable_bitrate 0&lt;br /&gt;
ffmpeg_video_codec mpeg4&lt;br /&gt;
ffmpeg_duplicate_frames off&lt;br /&gt;
use_extpipe off&lt;br /&gt;
snapshot_interval 0&lt;br /&gt;
locate_motion_mode off&lt;br /&gt;
locate_motion_style box&lt;br /&gt;
text_right %Y-%m-%d\n%T-%q&lt;br /&gt;
text_changes off&lt;br /&gt;
text_event %Y%m%d%H%M%S&lt;br /&gt;
text_double off&lt;br /&gt;
target_dir /home/pi/motion&lt;br /&gt;
snapshot_filename %Y%m%d%H%M%S-snapshot-%v&lt;br /&gt;
picture_filename %Y%m%d%H%M%S-%q-%v&lt;br /&gt;
movie_filename %Y%m%d%H%M%S-%v&lt;br /&gt;
timelapse_filename %Y%m%d-timelapse&lt;br /&gt;
stream_port 8081&lt;br /&gt;
stream_quality 50&lt;br /&gt;
stream_motion off&lt;br /&gt;
stream_maxrate 1&lt;br /&gt;
stream_localhost off&lt;br /&gt;
stream_limit 0&lt;br /&gt;
stream_auth_method 0&lt;br /&gt;
stream_preview_scale 25&lt;br /&gt;
stream_preview_newline off&lt;br /&gt;
webcontrol_port 8080&lt;br /&gt;
webcontrol_localhost off&lt;br /&gt;
webcontrol_html_output on&lt;br /&gt;
### Serve &amp;quot;mutt&amp;quot; configurato per l'invio della posta e la &amp;lt;MAIL&amp;gt; destinazione ###&lt;br /&gt;
on_picture_save echo &amp;quot;see attach&amp;quot; | mutt -s &amp;quot;$(hostname) alarm $(date +%F_%H-%M)&amp;quot; -a %f -- &amp;lt;MAIL&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Avvio motion ==&lt;br /&gt;
&lt;br /&gt;
Non ho voluto usarlo come &amp;quot;daemon&amp;quot; vero e proprio, ma eseguirlo all'avvio del sistema, quindi ho inserito la linea di comando nel file &amp;quot;/etc/rc.local&amp;quot;:&lt;br /&gt;
&amp;lt;source lang=bash gutter=false&amp;gt;&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
#&lt;br /&gt;
# rc.local&lt;br /&gt;
#&lt;br /&gt;
# This script is executed at the end of each multiuser runlevel.&lt;br /&gt;
# Make sure that the script will &amp;quot;exit 0&amp;quot; on success or any other&lt;br /&gt;
# value on error.&lt;br /&gt;
#&lt;br /&gt;
# In order to enable or disable this script just change the execution&lt;br /&gt;
# bits.&lt;br /&gt;
#&lt;br /&gt;
# By default this script does nothing.&lt;br /&gt;
&lt;br /&gt;
# Print the IP address&lt;br /&gt;
_IP=$(hostname -I) || true&lt;br /&gt;
if [ &amp;quot;$_IP&amp;quot; ]; then&lt;br /&gt;
  printf &amp;quot;My IP address is %s\n&amp;quot; &amp;quot;$_IP&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
su -c &amp;quot;motion -n -c /home/pi/motion/motion.conf &amp;amp;&amp;quot; pi&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utilizzo motion ==&lt;br /&gt;
&lt;br /&gt;
Per il &amp;quot;controllo&amp;quot; web, collegatevi col browser agli indirizzi:&lt;br /&gt;
; &amp;lt;nowiki&amp;gt;http://&amp;lt;IP o Nome del Raspberry Pi&amp;gt;:8080&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: per controllare/cambiare alcune impostazioni di configurazione (non l'ho provato)&lt;br /&gt;
; &amp;lt;nowiki&amp;gt;http://&amp;lt;IP o Nome del Raspberry Pi&amp;gt;:8081&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: per visualizzare lo stream.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
Per teminare il programma usate il comando:&lt;br /&gt;
&amp;lt;source lang=bash gutter=false&amp;gt;kill $(pidof motion)&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
[[Motion-mmal_con_Raspberry_Pi_Camera_on_board]]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Applicazioni_di_Raspberry_PI&amp;diff=7037</id>
		<title>Applicazioni di Raspberry PI</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Applicazioni_di_Raspberry_PI&amp;diff=7037"/>
		<updated>2019-05-16T13:38:41Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Videosorveglianza */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Web Server ==&lt;br /&gt;
&lt;br /&gt;
[http://tapion.it/server-con-un-raspberrypi-si-puo-fare-parte-2-nginx-php-fpm-wordpress-sqlit/ Usare il Raspberry Pi come Web Server]&lt;br /&gt;
&lt;br /&gt;
== Firewall ==&lt;br /&gt;
&lt;br /&gt;
[[Raspberry_Pi_Access_Point_WEP2#Firewall_.28iptables.29 | Una 'base' di partenza per un firewall 'manuale']]&lt;br /&gt;
&lt;br /&gt;
== Access Point ==&lt;br /&gt;
&lt;br /&gt;
[[Raspberry PI come access point: l'esempio dell'AP usato al non-corso]]&lt;br /&gt;
&lt;br /&gt;
[[Raspberry_Pi_Access_Point_WEP2 | Access Point con autenticazione WEP2, DNS e Firewall]]&lt;br /&gt;
&lt;br /&gt;
[[Raspberry_Pi_Access_Point | Access Point con autenticazione WEP2]]&lt;br /&gt;
&lt;br /&gt;
== Piratebox ==&lt;br /&gt;
&lt;br /&gt;
http://piratebox.cc/raspberry_pi&lt;br /&gt;
&lt;br /&gt;
== Freedombox ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Freedombox]]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.debian.org/FreedomBox Freedombox (Debian wiki)]&lt;br /&gt;
&lt;br /&gt;
[http://ftp.skolelinux.org/pub/freedombox/ Dowload images]&lt;br /&gt;
&lt;br /&gt;
== Applicazioni telefoniche ==&lt;br /&gt;
&lt;br /&gt;
[[Asterisk installazione base]]&lt;br /&gt;
&lt;br /&gt;
[[Configurazione di Ekiga]] client voip per pc&lt;br /&gt;
&lt;br /&gt;
[[Asterisk configurazione]]&lt;br /&gt;
&lt;br /&gt;
[[Generazione chiamate da Asterisk]]&lt;br /&gt;
&lt;br /&gt;
[[Debug di Asterisk]]&lt;br /&gt;
&lt;br /&gt;
[[NCID]]:Filtro per chiamate indesiderate&lt;br /&gt;
&lt;br /&gt;
== Domotica ==&lt;br /&gt;
&lt;br /&gt;
=== Segnali e Comandi ===&lt;br /&gt;
&lt;br /&gt;
[[Interfacciare un Rele']]&lt;br /&gt;
&lt;br /&gt;
[[Rivelatore di 230v]]&lt;br /&gt;
&lt;br /&gt;
[[Una ciabatta controllata da USB]]&lt;br /&gt;
&lt;br /&gt;
[[Leggere un pulsante su GPIO con antirimbalzo software]]&lt;br /&gt;
&lt;br /&gt;
=== Controllo consumi elettrici ===&lt;br /&gt;
&lt;br /&gt;
[[Misurare la corrente con un anello amperometrico]]&lt;br /&gt;
&lt;br /&gt;
[[Misurare la corrente dal contatore elettronico]]&lt;br /&gt;
&lt;br /&gt;
=== Temperature ===&lt;br /&gt;
&lt;br /&gt;
[[Raspberry_Pi-Lettura_Temperatura|Lettura Temperatura]]&lt;br /&gt;
&lt;br /&gt;
[[Misurare la Temperatura]]&lt;br /&gt;
&lt;br /&gt;
[[Termostato]]&lt;br /&gt;
&lt;br /&gt;
[[CronoTermostato|CronoTermostato (ThermoRed)]]&lt;br /&gt;
&lt;br /&gt;
[[Thermo]]&lt;br /&gt;
&lt;br /&gt;
== Lavagna multimediale ==&lt;br /&gt;
&lt;br /&gt;
== Laboratorio scolastico (linux terminal server) ==&lt;br /&gt;
&lt;br /&gt;
:[[LTSP|Laboratorio/Aula informatica LTSP]]&lt;br /&gt;
: ..&lt;br /&gt;
: ..&lt;br /&gt;
&lt;br /&gt;
== Remote console per server ==&lt;br /&gt;
&lt;br /&gt;
[[Collegare una porta seriale RS-232]]&lt;br /&gt;
&lt;br /&gt;
== PVR, DVB, TV ==&lt;br /&gt;
&lt;br /&gt;
[[PVR (Personal Video Recorder), DVB, gateway televisivo]]&lt;br /&gt;
&lt;br /&gt;
== Videosorveglianza ==&lt;br /&gt;
&lt;br /&gt;
[[Modulo Camera per Raspberry Pi]]&lt;br /&gt;
&lt;br /&gt;
[[Videosorveglianza con Motion]]&lt;br /&gt;
&lt;br /&gt;
[[Motion con Raspberry Pi Camera on board]]&lt;br /&gt;
&lt;br /&gt;
[[Motion-mmal con Raspberry Pi Camera on board]]&lt;br /&gt;
&lt;br /&gt;
[[Appunti per un sistema di video, sorveglianza e streaming, indipendente]]&lt;br /&gt;
&lt;br /&gt;
== Radiocomandi ==&lt;br /&gt;
[[Accendere e spegnere 4 led tramite un ricevitore a infrarossi]]&lt;br /&gt;
&lt;br /&gt;
[[Comandare centralina allarme low cost 433Mhz con un raspberry]]&lt;br /&gt;
&lt;br /&gt;
== Raspberry e Arduino insieme: interfacciamento ==&lt;br /&gt;
Oltre ai vari metodi di interfacciamento di Raspberry PI con Arduino, tra cui il protocollo I2C, si può farlo attraverso la porta USB utilizzando la libreria Python Nampy. Maggiori informazioni si trovano qui [http://marcosbox.blogspot.it/2013/01/nanpy-usa-il-tuo-arduino-con-python.html]&lt;br /&gt;
&lt;br /&gt;
== Uno smart player audio da abbinare allo stereo casalingo ==&lt;br /&gt;
&lt;br /&gt;
Sto viluppando un player python basato su gstreamer senza interfaccia se non quella su dbus che segue lo standard mpris2 http://specifications.freedesktop.org/mpris-spec/latest/&lt;br /&gt;
Questo permetterebbe di usare ruspberry come player remoto senza consumare inutili risorse.&lt;br /&gt;
Seguono una cli su dbus per getire il player, una gui pygtk sempre su dbus e una interfaccia web con cherrypy sempre a partire da dbus.&lt;br /&gt;
Sarebbe interessante abbinare un dac amplifier magari basato su t-amp.&lt;br /&gt;
Per il momento il player è sviluppato all'interno di un software per l'automazione di una emittente radiofonica: http://autoradiobc.sf.net (vedi svn)&lt;br /&gt;
&lt;br /&gt;
== Cambiamonete / servizi a pagamento / Totem informativo ==&lt;br /&gt;
&lt;br /&gt;
Raspberry per gestire servizi a pagamento.&lt;br /&gt;
Gestire tramite python il protocollo cctalk http://en.wikipedia.org/wiki/CcTalk e quindi dispositivi per accettare monete e banconote.&lt;br /&gt;
Realizzare quindi servizi a pagamento tramite Totem informativi &amp;amp; Chioschi ...&lt;br /&gt;
Driver CCTALK per gettoniera già disponibile insieme ad hardware di test.&lt;br /&gt;
Aggiungere magari un sensore di prossimità per il risparmio energetico attivando il display solo in presenza di utenti.&lt;br /&gt;
&lt;br /&gt;
== Mini centrale di Controllo Accessi ==&lt;br /&gt;
&lt;br /&gt;
Il Raspberry può diventare una centralina in grado di controllare l’apertura di cancelli pedonali o automatici, porte scorrevoli o sezionali interfacciandola ad un lettore di badge magnetici commerciale. &lt;br /&gt;
Occorre implementare il protocollo Wiegand [ http://en.wikipedia.org/wiki/Wiegand_interface ] per dialogare attraverso un cavo dati di lunghezza fino a 100mt (in condizioni ottimali). La centralina potrebbe funzionare in stand-alone acquisendo in auto-apprendimento il codice delle tessere da autorizzare ad accedere oppure creare una lista di codici all’interno di un file modificabile da Raspbian. Eventualmente potrebbe essere previsto un buffer per contenere fino a un certo numero di timbrature, associate alla data e all’ora in cui è avvenuto il passaggio della tessera per effettuare una sorta di consultazione dello storico eventi.&lt;br /&gt;
&lt;br /&gt;
== Display LCD ==&lt;br /&gt;
&lt;br /&gt;
*[[Nokia 5110 LCD 84x48 px]]&lt;br /&gt;
&lt;br /&gt;
== Chiavette 3G USB ==&lt;br /&gt;
&lt;br /&gt;
*[[Huawei E353 HSPA+ Usb Stick]]&lt;br /&gt;
&lt;br /&gt;
*[[Input/Output tramite sms]]&lt;br /&gt;
&lt;br /&gt;
== Server Stampante Scanner  ==&lt;br /&gt;
*[[PrinterScannerServer]]&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
[[Personal Portable Server]]&lt;br /&gt;
&lt;br /&gt;
== Accesso remoto via Internet ==&lt;br /&gt;
[[SSH_Internet]]&lt;br /&gt;
&lt;br /&gt;
== Utilizzo di Telegram Istant Messenger ==&lt;br /&gt;
Telegram è un servizio di istant messaging disponibile per i principali sistemi operativi di dispositivi mobili e computer. Può essere utilizzato per interagire con il Raspberry Pi sia per inviare, sia per ricevere messaggi di testo, immagini, video e audio. E' molto utile sia per controllare e attuare sistemi (ad esempio possiamo aprire un cancello o accendere le luci o il riscaldamento inviando un messaggio), sia per ricevere risposta da sistemi (ad esempio foto o video da una telecamera). [[Utilizzo di Telegram IM]]&lt;br /&gt;
&lt;br /&gt;
== qui la lista continua con la vostra fantasia ==&lt;br /&gt;
&lt;br /&gt;
[[Accensione di un led]]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Utente:Dave4rp&amp;diff=6995</id>
		<title>Utente:Dave4rp</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Utente:Dave4rp&amp;diff=6995"/>
		<updated>2019-05-07T14:14:01Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Web ====&lt;br /&gt;
http://dave4th.ydns.eu oppure http://trance.myftp.org&lt;br /&gt;
&lt;br /&gt;
===== Repository =====&lt;br /&gt;
* [https://github.com/dave4th Github]&lt;br /&gt;
* [https://www.dropbox.com/sh/q0dfel54wnue4lx/AACQvtgxabOhkfBjlpoLdGFEa?dl=0 Circuiti Kicad]&lt;br /&gt;
* [https://app.box.com/s/od05c2iiytuz9vt5ia9p Directory pubblica (box)]&lt;br /&gt;
&lt;br /&gt;
==== Note ====&lt;br /&gt;
# Nel wiki potrebbero (ma non dovrebbero) esserci ancora link errati riferiti al sito &amp;quot;3ns&amp;quot;, se trovate, segnalate o correggete, ho spostato il sito web su un pc sotto adsl, indirizzo: http://dave4th.ydns.eu oppure http://trance.myftp.org&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Idee e progetti in .. &amp;quot;???&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* [[Utente:Dave4rp/Doppia matrice led 8x8|]]&lt;br /&gt;
* [[Utente:Dave4rp/Display grafico LCD 128x64|]]&lt;br /&gt;
* [[Utente:Dave4rp/Gripper Arm|]]&lt;br /&gt;
* [[Utente:Dave4rp/Lettore con display portabile di temperatura e umidita`|]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Note di formattazione wiki ==&lt;br /&gt;
&lt;br /&gt;
;Comando&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;Comando&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
oppure&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;Comando&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
;Visualizzazioni&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green&amp;quot;&amp;gt;Visualizzazione&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
;Visualizzazioni files/script con righe lunghe&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;Visualizzazione con riga lunga che oltrepasserebbe la larghezza pagina, utile quando negli script il comando deve essere su una unica riga e altrettanto la sua visualizzazione&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
::;Esempio:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;Visualizzazione con riga lunga che oltrepasserebbe la larghezza pagina, utile quando negli script il comando deve essere su una unica riga e altrettanto la sua visualizzazione&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Comandi/Attenzione&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:red;overflow:auto&amp;quot;&amp;gt;Attenzione (Comando)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
;Barra di scorrimento (utile se riga &amp;quot;lunga&amp;quot;)&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;Comando lungo&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
;Sintassi dell'estensione per sorgenti, l'interrogativo e` da sostituire col linguaggio, per esempio&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; c,python, ... eccetera&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;source lang=[?]&amp;gt;... codice ..&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
::;Esempio:&lt;br /&gt;
::&amp;lt;nowiki&amp;gt;&amp;lt;source lang=bash gutter=false&amp;gt;apt-get install program&amp;lt;/source&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;source lang=bash gutter=false&amp;gt;apt-get install program&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per la formattazione delle tabelle uso http://excel2wiki.net/wikipedia.php&lt;br /&gt;
L'ultima volta ho copiato la tabella da una pagina in drupal e mi sembra funzioni bene, non ha messo il bordo, ma per me e` ok.&lt;br /&gt;
&lt;br /&gt;
Altro link utile per generazione di tabelle: http://www.tablesgenerator.com/mediawiki_tables&lt;br /&gt;
&lt;br /&gt;
;Galleria di foto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=&amp;lt;300&amp;gt;px heights=&amp;lt;300&amp;gt;px&amp;gt;&lt;br /&gt;
File:&amp;lt;filename.jpg&amp;gt;|[Descrizione visibile]&lt;br /&gt;
File:&amp;lt;filename.jpg&amp;gt;|[Descrizione visibile]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;HTML code &amp;quot;abbr&amp;quot; (o &amp;quot;dfn&amp;quot;), tipo abbreviazione o definizione, fa` comparire una simil tooltip sul testo&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Scrivo un &amp;lt;abbr title=&amp;quot;quando non sai cosa scrivere&amp;quot;&amp;gt;testo a caso&amp;lt;/abbr&amp;gt; per provare &amp;quot;abbr&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:risultato&lt;br /&gt;
Scrivo un &amp;lt;abbr title=&amp;quot;quando non sai cosa scrivere&amp;quot;&amp;gt;testo a caso&amp;lt;/abbr&amp;gt; per provare &amp;quot;abbr&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Motion_con_Raspberry_Pi_Camera_on_board&amp;diff=6994</id>
		<title>Motion con Raspberry Pi Camera on board</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Motion_con_Raspberry_Pi_Camera_on_board&amp;diff=6994"/>
		<updated>2019-05-07T13:34:24Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: Pagina svuotata&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Applicazioni_di_Raspberry_PI&amp;diff=6993</id>
		<title>Applicazioni di Raspberry PI</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Applicazioni_di_Raspberry_PI&amp;diff=6993"/>
		<updated>2019-05-07T13:33:25Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Videosorveglianza */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Web Server ==&lt;br /&gt;
&lt;br /&gt;
[http://tapion.it/server-con-un-raspberrypi-si-puo-fare-parte-2-nginx-php-fpm-wordpress-sqlit/ Usare il Raspberry Pi come Web Server]&lt;br /&gt;
&lt;br /&gt;
== Firewall ==&lt;br /&gt;
&lt;br /&gt;
[[Raspberry_Pi_Access_Point_WEP2#Firewall_.28iptables.29 | Una 'base' di partenza per un firewall 'manuale']]&lt;br /&gt;
&lt;br /&gt;
== Access Point ==&lt;br /&gt;
&lt;br /&gt;
[[Raspberry PI come access point: l'esempio dell'AP usato al non-corso]]&lt;br /&gt;
&lt;br /&gt;
[[Raspberry_Pi_Access_Point_WEP2 | Access Point con autenticazione WEP2, DNS e Firewall]]&lt;br /&gt;
&lt;br /&gt;
[[Raspberry_Pi_Access_Point | Access Point con autenticazione WEP2]]&lt;br /&gt;
&lt;br /&gt;
== Piratebox ==&lt;br /&gt;
&lt;br /&gt;
http://piratebox.cc/raspberry_pi&lt;br /&gt;
&lt;br /&gt;
== Freedombox ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Freedombox]]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.debian.org/FreedomBox Freedombox (Debian wiki)]&lt;br /&gt;
&lt;br /&gt;
[http://ftp.skolelinux.org/pub/freedombox/ Dowload images]&lt;br /&gt;
&lt;br /&gt;
== Applicazioni telefoniche ==&lt;br /&gt;
&lt;br /&gt;
[[Asterisk installazione base]]&lt;br /&gt;
&lt;br /&gt;
[[Configurazione di Ekiga]] client voip per pc&lt;br /&gt;
&lt;br /&gt;
[[Asterisk configurazione]]&lt;br /&gt;
&lt;br /&gt;
[[Generazione chiamate da Asterisk]]&lt;br /&gt;
&lt;br /&gt;
[[Debug di Asterisk]]&lt;br /&gt;
&lt;br /&gt;
[[NCID]]:Filtro per chiamate indesiderate&lt;br /&gt;
&lt;br /&gt;
== Domotica ==&lt;br /&gt;
&lt;br /&gt;
=== Segnali e Comandi ===&lt;br /&gt;
&lt;br /&gt;
[[Interfacciare un Rele']]&lt;br /&gt;
&lt;br /&gt;
[[Rivelatore di 230v]]&lt;br /&gt;
&lt;br /&gt;
[[Una ciabatta controllata da USB]]&lt;br /&gt;
&lt;br /&gt;
[[Leggere un pulsante su GPIO con antirimbalzo software]]&lt;br /&gt;
&lt;br /&gt;
=== Controllo consumi elettrici ===&lt;br /&gt;
&lt;br /&gt;
[[Misurare la corrente con un anello amperometrico]]&lt;br /&gt;
&lt;br /&gt;
[[Misurare la corrente dal contatore elettronico]]&lt;br /&gt;
&lt;br /&gt;
=== Temperature ===&lt;br /&gt;
&lt;br /&gt;
[[Raspberry_Pi-Lettura_Temperatura|Lettura Temperatura]]&lt;br /&gt;
&lt;br /&gt;
[[Misurare la Temperatura]]&lt;br /&gt;
&lt;br /&gt;
[[Termostato]]&lt;br /&gt;
&lt;br /&gt;
[[CronoTermostato|CronoTermostato (ThermoRed)]]&lt;br /&gt;
&lt;br /&gt;
[[Thermo]]&lt;br /&gt;
&lt;br /&gt;
== Lavagna multimediale ==&lt;br /&gt;
&lt;br /&gt;
== Laboratorio scolastico (linux terminal server) ==&lt;br /&gt;
&lt;br /&gt;
:[[LTSP|Laboratorio/Aula informatica LTSP]]&lt;br /&gt;
: ..&lt;br /&gt;
: ..&lt;br /&gt;
&lt;br /&gt;
== Remote console per server ==&lt;br /&gt;
&lt;br /&gt;
[[Collegare una porta seriale RS-232]]&lt;br /&gt;
&lt;br /&gt;
== PVR, DVB, TV ==&lt;br /&gt;
&lt;br /&gt;
[[PVR (Personal Video Recorder), DVB, gateway televisivo]]&lt;br /&gt;
&lt;br /&gt;
== Videosorveglianza ==&lt;br /&gt;
&lt;br /&gt;
[[Modulo Camera per Raspberry Pi]]&lt;br /&gt;
&lt;br /&gt;
[[Videosorveglianza con Motion]]&lt;br /&gt;
&lt;br /&gt;
[[Motion-mmal con Raspberry Pi Camera on board]]&lt;br /&gt;
&lt;br /&gt;
[[Appunti per un sistema di video, sorveglianza e streaming, indipendente]]&lt;br /&gt;
&lt;br /&gt;
== Radiocomandi ==&lt;br /&gt;
[[Accendere e spegnere 4 led tramite un ricevitore a infrarossi]]&lt;br /&gt;
&lt;br /&gt;
[[Comandare centralina allarme low cost 433Mhz con un raspberry]]&lt;br /&gt;
&lt;br /&gt;
== Raspberry e Arduino insieme: interfacciamento ==&lt;br /&gt;
Oltre ai vari metodi di interfacciamento di Raspberry PI con Arduino, tra cui il protocollo I2C, si può farlo attraverso la porta USB utilizzando la libreria Python Nampy. Maggiori informazioni si trovano qui [http://marcosbox.blogspot.it/2013/01/nanpy-usa-il-tuo-arduino-con-python.html]&lt;br /&gt;
&lt;br /&gt;
== Uno smart player audio da abbinare allo stereo casalingo ==&lt;br /&gt;
&lt;br /&gt;
Sto viluppando un player python basato su gstreamer senza interfaccia se non quella su dbus che segue lo standard mpris2 http://specifications.freedesktop.org/mpris-spec/latest/&lt;br /&gt;
Questo permetterebbe di usare ruspberry come player remoto senza consumare inutili risorse.&lt;br /&gt;
Seguono una cli su dbus per getire il player, una gui pygtk sempre su dbus e una interfaccia web con cherrypy sempre a partire da dbus.&lt;br /&gt;
Sarebbe interessante abbinare un dac amplifier magari basato su t-amp.&lt;br /&gt;
Per il momento il player è sviluppato all'interno di un software per l'automazione di una emittente radiofonica: http://autoradiobc.sf.net (vedi svn)&lt;br /&gt;
&lt;br /&gt;
== Cambiamonete / servizi a pagamento / Totem informativo ==&lt;br /&gt;
&lt;br /&gt;
Raspberry per gestire servizi a pagamento.&lt;br /&gt;
Gestire tramite python il protocollo cctalk http://en.wikipedia.org/wiki/CcTalk e quindi dispositivi per accettare monete e banconote.&lt;br /&gt;
Realizzare quindi servizi a pagamento tramite Totem informativi &amp;amp; Chioschi ...&lt;br /&gt;
Driver CCTALK per gettoniera già disponibile insieme ad hardware di test.&lt;br /&gt;
Aggiungere magari un sensore di prossimità per il risparmio energetico attivando il display solo in presenza di utenti.&lt;br /&gt;
&lt;br /&gt;
== Mini centrale di Controllo Accessi ==&lt;br /&gt;
&lt;br /&gt;
Il Raspberry può diventare una centralina in grado di controllare l’apertura di cancelli pedonali o automatici, porte scorrevoli o sezionali interfacciandola ad un lettore di badge magnetici commerciale. &lt;br /&gt;
Occorre implementare il protocollo Wiegand [ http://en.wikipedia.org/wiki/Wiegand_interface ] per dialogare attraverso un cavo dati di lunghezza fino a 100mt (in condizioni ottimali). La centralina potrebbe funzionare in stand-alone acquisendo in auto-apprendimento il codice delle tessere da autorizzare ad accedere oppure creare una lista di codici all’interno di un file modificabile da Raspbian. Eventualmente potrebbe essere previsto un buffer per contenere fino a un certo numero di timbrature, associate alla data e all’ora in cui è avvenuto il passaggio della tessera per effettuare una sorta di consultazione dello storico eventi.&lt;br /&gt;
&lt;br /&gt;
== Display LCD ==&lt;br /&gt;
&lt;br /&gt;
*[[Nokia 5110 LCD 84x48 px]]&lt;br /&gt;
&lt;br /&gt;
== Chiavette 3G USB ==&lt;br /&gt;
&lt;br /&gt;
*[[Huawei E353 HSPA+ Usb Stick]]&lt;br /&gt;
&lt;br /&gt;
*[[Input/Output tramite sms]]&lt;br /&gt;
&lt;br /&gt;
== Server Stampante Scanner  ==&lt;br /&gt;
*[[PrinterScannerServer]]&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
[[Personal Portable Server]]&lt;br /&gt;
&lt;br /&gt;
== Accesso remoto via Internet ==&lt;br /&gt;
[[SSH_Internet]]&lt;br /&gt;
&lt;br /&gt;
== Utilizzo di Telegram Istant Messenger ==&lt;br /&gt;
Telegram è un servizio di istant messaging disponibile per i principali sistemi operativi di dispositivi mobili e computer. Può essere utilizzato per interagire con il Raspberry Pi sia per inviare, sia per ricevere messaggi di testo, immagini, video e audio. E' molto utile sia per controllare e attuare sistemi (ad esempio possiamo aprire un cancello o accendere le luci o il riscaldamento inviando un messaggio), sia per ricevere risposta da sistemi (ad esempio foto o video da una telecamera). [[Utilizzo di Telegram IM]]&lt;br /&gt;
&lt;br /&gt;
== qui la lista continua con la vostra fantasia ==&lt;br /&gt;
&lt;br /&gt;
[[Accensione di un led]]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Motion_con_Raspberry_Pi_Camera_on_board&amp;diff=6992</id>
		<title>Motion con Raspberry Pi Camera on board</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Motion_con_Raspberry_Pi_Camera_on_board&amp;diff=6992"/>
		<updated>2019-05-07T13:25:43Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: Dave4rp ha spostato la pagina Motion con Raspberry Pi Camera on board a Motion-mmal con Raspberry Pi Camera on board&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#RINVIA [[Motion-mmal con Raspberry Pi Camera on board]]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Motion-mmal_con_Raspberry_Pi_Camera_on_board&amp;diff=6991</id>
		<title>Motion-mmal con Raspberry Pi Camera on board</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Motion-mmal_con_Raspberry_Pi_Camera_on_board&amp;diff=6991"/>
		<updated>2019-05-07T13:25:43Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: Dave4rp ha spostato la pagina Motion con Raspberry Pi Camera on board a Motion-mmal con Raspberry Pi Camera on board&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Installazione motion-mmal ==&lt;br /&gt;
&lt;br /&gt;
Non e` difficile installare la versione modificata di motion che utilizza il modulo camera del Raspberry Pi (invece del normale device /dev/videoN).&lt;br /&gt;
&lt;br /&gt;
Per installare tutte (o quasi) le dipendenze necessarie, installate la versione ufficiale dei repository:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo aptitude install motion&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Scaricate &amp;quot;motion-mmal&amp;quot; (io utilizzo &amp;quot;aria2&amp;quot;, potete utilizzare anche il classico &amp;quot;wget&amp;quot;):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
aria2c https://dl.dropboxusercontent.com/s/xdfcxm5hu71s97d/motion-mmal.tar.gz?dl=1&amp;amp;token_hash=AAGYMWIKASTf2niIdg5ZE4-rr3aKIH89MsPABamXg6GwOA&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Per comodita` ho creato due directory, una chiamata &amp;quot;Pictures&amp;quot; e l'altra &amp;quot;motion-mmalcam&amp;quot; (poi sara` piu` chiaro il perche`), nella seconda ovviamente decomprimeremo l'archivio precedentemente scaricato (e ci assicureremo che l'eseguibile abbia i dovuti permessi):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir Pictures motion-malcam&lt;br /&gt;
cd motion-malcam&lt;br /&gt;
tar xvzf ../motion-mmal.tar.gz&lt;br /&gt;
chmod 700 motion&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Se provaste ad eseguire ora il programma non funzionerebbe, manca ancora una &amp;quot;libreria&amp;quot;, installiamola:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo aptitude install libjpeg62&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modifichiamo il file di configurazione (fatelo secondo le vostre esigenze), riporto solo le modifiche:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
process_id_file /home/pi/motion-mmalcam/motion.pid&lt;br /&gt;
&lt;br /&gt;
logfile /home/pi/motion-mmalcam/motion.log&lt;br /&gt;
&lt;br /&gt;
rotate 180&lt;br /&gt;
&lt;br /&gt;
max_movie_time 120&lt;br /&gt;
&lt;br /&gt;
target_dir /home/pi/Pictures/&lt;br /&gt;
&lt;br /&gt;
snapshot_filename %Y%m%d%H%M%S-snapshot-%v&lt;br /&gt;
&lt;br /&gt;
picture_filename %Y%m%d%H%M%S-%q-%v&lt;br /&gt;
&lt;br /&gt;
movie_filename %Y%m%d%H%M%S-%v&lt;br /&gt;
&lt;br /&gt;
webcontrol_localhost off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ci siamo, eseguiamolo col comando:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
/home/pi/motion-mmalcam/motion -n -c /home/pi/motion-mmalcam/motion-mmalcam.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Per il &amp;quot;controllo&amp;quot; web, collegatevi col browser agli indirizzi:&lt;br /&gt;
; &amp;lt;nowiki&amp;gt;http://&amp;lt;IP o Nome del Raspberry Pi&amp;gt;:8080&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: per controllare/cambiare alcune impostazioni di configurazione (non l'ho provato)&lt;br /&gt;
; &amp;lt;nowiki&amp;gt;http://&amp;lt;IP o Nome del Raspberry Pi&amp;gt;:8081&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
: per visualizzare lo stream.&lt;br /&gt;
Ovviamente nella directory &amp;quot;Pictures&amp;quot; vi ritroverete le immagini ed i filmati delle rilevazioni di movimento effettuate durante il funzionamento.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
Per teminare il programma nel caso preferiate eseguirlo in background:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
/home/pi/motion-mmalcam/motion -n -c /home/pi/motion-mmalcam/motion-mmalcam.conf &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
usate il comando:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
kill `pidof motion`&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
http://www.raspberrypi.org/camera&lt;br /&gt;
&lt;br /&gt;
http://elinux.org/Rpi_Camera_Module&lt;br /&gt;
&lt;br /&gt;
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=43&amp;amp;t=44966&lt;br /&gt;
&lt;br /&gt;
http://www.raspberrypi.org/phpBB3/viewtopic.php?t=50243&amp;amp;p=389997&lt;br /&gt;
&lt;br /&gt;
http://www.raspberrypi.org/phpBB3/viewtopic.php?t=44966&amp;amp;p=379561#p374790&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_PI-Raspbian-Personalizzazioni&amp;diff=6739</id>
		<title>Raspberry PI-Raspbian-Personalizzazioni</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_PI-Raspbian-Personalizzazioni&amp;diff=6739"/>
		<updated>2018-12-16T18:29:13Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Uscita HDMI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Esempi e modifiche alla configurazione del sistema =&lt;br /&gt;
&lt;br /&gt;
== Swapfile ==&lt;br /&gt;
=== Disattivazione ===&lt;br /&gt;
&lt;br /&gt;
Comandi da utilizzare come 'root':&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
dphys-swapfile swapoff            # disattiva il file di swap&lt;br /&gt;
dphys-swapfile uninstall          # elimina il file di swap se presente&lt;br /&gt;
systemctl disable dphys-swapfile  # disattiva per successivi riavvii del sistema&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uscita HDMI ==&lt;br /&gt;
&lt;br /&gt;
Il rilevamento automatico funziona collegando un convertitore HDMI-&amp;gt;VGA ed un monitor (dovrebbe lo stesso funzionare con un monitor/televisore collegato in HDMI), se non e` cosi`, decommentate la riga &amp;quot;hdmi_force_hotplug=1&amp;quot; nel file &amp;quot;[[Raspberry_PI-Raspbian-Files_di_configurazione#config.txt|/boot/config.txt]]&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot-raspberry-config-hdmi force hotplug.png]]&lt;br /&gt;
&lt;br /&gt;
;Convertitori&lt;br /&gt;
:[[Convertitori_HDMI_to_VGA]]&lt;br /&gt;
&lt;br /&gt;
=== Monitor HDMI 24&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Il monitor e` senza audio ed e` riconosciuto, ma la risoluzione non e` ottimale.&lt;br /&gt;
&lt;br /&gt;
Questa volta ho utilizzato lo script di configurazione ufficiale:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
raspi-config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ho selezionato la risoluzione corretta e successivamente (questo se lo fate prima della risoluzione si ripristina) l'uscita audio sul jack (quello nero da 3,5mm).&lt;br /&gt;
&lt;br /&gt;
Non ne sono sicuro, ma dovrebbe aver configurato/attivato nel file &amp;quot;/boot/config.txt&amp;quot;, queste righe:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
hdmi_force_hotplug=1&lt;br /&gt;
hdmi_group=2&lt;br /&gt;
hdmi_mode=82&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L'uscita audio non e` &amp;quot;visibile&amp;quot;, se non dal comando &amp;quot;amixer cget numid=3&amp;quot; (l'ho trovato guardando i sorgenti di &amp;quot;raspi-config&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Per l'elenco delle impostazioni (alcune) si puo` usare il comando:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
vcgencmd get_config int&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:Per l'uscita audio potevo modificare manualmente il file &amp;quot;/boot/config.txt&amp;quot; inserendo la linea &amp;quot;hdmi_ignore_edid_audio=1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Riferimenti utili:'''&lt;br /&gt;
* https://elinux.org/RPiconfig&lt;br /&gt;
&lt;br /&gt;
=== VGA Monitor 7&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
##################################################################################&lt;br /&gt;
# Queste sono le righe di parametrizzazione/configurazione, riguardanti il monitor&lt;br /&gt;
# HD CCTVLED MONITOR 7&amp;quot; collegato con porta VGA (e adattatore HDMI -&amp;gt; VGA):&lt;br /&gt;
&lt;br /&gt;
# HD CCTV LED MONITOR&lt;br /&gt;
hdmi_drive=2&lt;br /&gt;
&lt;br /&gt;
# 1 = CEA, 2 = DVI&lt;br /&gt;
hdmi_group=2&lt;br /&gt;
&lt;br /&gt;
# CEA: 1 = VGA, 4 = 720p&lt;br /&gt;
# DVI: 9 = 800x600x60&lt;br /&gt;
# DVI: + di 60Hz non si auto configura correttamente&lt;br /&gt;
hdmi_mode=9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uscita AV Video Composito ==&lt;br /&gt;
&lt;br /&gt;
'''Modifiche al file &amp;quot;[[Raspberry_PI-Raspbian-Files_di_configurazione#config.txt|/boot/config.txt]]&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
=== TV Monitor 7&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
### Configurazione AV per TV 7&amp;quot;&lt;br /&gt;
framebuffer_width=480&lt;br /&gt;
framebuffer_height=320&lt;br /&gt;
#overscan_left=-128&lt;br /&gt;
#overscan_right=-128&lt;br /&gt;
overscan_top=-14&lt;br /&gt;
overscan_bottom=-14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TV Monitor 7&amp;quot; (Lettore CD portatile) ===&lt;br /&gt;
&lt;br /&gt;
Funzionano entrambe&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
### Config AV lettore CD portatile 7&amp;quot;&lt;br /&gt;
#framebuffer_width=300&lt;br /&gt;
#framebuffer_height=200&lt;br /&gt;
#overscan_left=-11&lt;br /&gt;
#overscan_right=-21&lt;br /&gt;
#overscan_top=-13&lt;br /&gt;
#overscan_bottom=-19&lt;br /&gt;
&lt;br /&gt;
### Config AV lettore CD portatile 7&amp;quot;&lt;br /&gt;
framebuffer_width=600&lt;br /&gt;
framebuffer_height=400&lt;br /&gt;
overscan_left=-4&lt;br /&gt;
overscan_right=-4&lt;br /&gt;
overscan_top=-13&lt;br /&gt;
overscan_bottom=-19&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TV Monitor 2,8&amp;quot; (MP4 Portable Game Player) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
### Config AV 2,8&amp;quot; MP4 portatile&lt;br /&gt;
### Riquadro libero da sovrapposizioni&lt;br /&gt;
### le scritte REC e le icone batteria&lt;br /&gt;
### non si sovrappongono all'immagine.&lt;br /&gt;
framebuffer_width=340&lt;br /&gt;
framebuffer_height=200&lt;br /&gt;
overscan_left=-16&lt;br /&gt;
overscan_right=-16&lt;br /&gt;
overscan_top=-16&lt;br /&gt;
overscan_bottom=-16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
### Config AV 2,8&amp;quot; MP4 portatile&lt;br /&gt;
### Miglior risoluzione in console&lt;br /&gt;
framebuffer_width=300&lt;br /&gt;
framebuffer_height=200&lt;br /&gt;
overscan_left=-18&lt;br /&gt;
overscan_right=-28&lt;br /&gt;
overscan_top=-25&lt;br /&gt;
overscan_bottom=-25&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hostname ==&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:Sembra che sia possibile evitare tutta la procedura seguente con un'unico comando, per esempio, cambiare l'hostname &amp;quot;raspberrypi&amp;quot; in &amp;quot;raspi&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green&amp;quot;&amp;gt;&lt;br /&gt;
sudo sed -i 's/raspberrypi/raspi/' /etc/hosts /etc/hostname; sudo reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:letto su: http://www.commandlinefu.com/commands/view/12183/rename-your-raspberry-pi?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+Command-line-fu+%28Command-Line-Fu%29&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cambiato e reso visibile in rete GNU/Linux con server DHCP e DNS il Raspberry Pi col nome &amp;quot;raspi&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Cambiato &amp;quot;raspberry&amp;quot; in &amp;quot;raspi&amp;quot; nel file &amp;quot;/etc/hostname&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot-raspberry-config-hostname.png]] &lt;br /&gt;
&lt;br /&gt;
Cambiato &amp;quot;raspberry&amp;quot; in &amp;quot;raspi&amp;quot; nel file &amp;quot;/etc/hosts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot-raspberry-config-hosts.png]]&lt;br /&gt;
&lt;br /&gt;
Commentato la riga &amp;quot;send host-name = gethostname();&amp;quot;, decommentato e cambiato la riga &amp;quot;send host-name &amp;quot;raspi&amp;quot;;&amp;quot; nel file &amp;quot;/etc/dhcp/dhclient.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot-raspberry-config-dhcp-client.png]]&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:Probabilmente quest'ultima operazione non e` necessaria, nelle ultime &amp;quot;prove&amp;quot; sembra funzionare correttamente il &amp;quot;gethostname()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== User (Cambio username default) ==&lt;br /&gt;
&lt;br /&gt;
L'username di default (Raspbian) e` &amp;quot;pi&amp;quot;, per cambiarlo prima si deve 'attivare' totalmente il root login:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
passwd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ora il problema sono tutti quei programmi in esecuzione dell'utente &amp;quot;pi&amp;quot; che non lasciano (o quasi) alternative, la piu` sbrigativa (siamo ancora 'root'):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue&amp;quot;&amp;gt;&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Al login, accreditiamoci come 'root' e diamo il comando (voi mettete il vostro nome):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue&amp;quot;&amp;gt;&lt;br /&gt;
usermod -d /home/davide -m -l davide pi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;-d&lt;br /&gt;
:Cambia la home utente (/home/davide e` la nuova)&lt;br /&gt;
;-m&lt;br /&gt;
:Sposta la home utente (/home/pi in /home/davide)&lt;br /&gt;
;-l&lt;br /&gt;
:Cambia lo &amp;quot;user login&amp;quot; (davide)&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=ESP8266/DHT22toMQTT&amp;diff=6718</id>
		<title>ESP8266/DHT22toMQTT</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=ESP8266/DHT22toMQTT&amp;diff=6718"/>
		<updated>2018-08-11T07:58:53Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
!File:IMMAGINE.png|300px&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;DHT22 to MQTT&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Sensore/i di temperatura e umidita`&lt;br /&gt;
|-&lt;br /&gt;
|Repository: https://github.com/dave4th/esp01_w_dht22_to_mqtt (DHT22-MQTT)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
[[Category:ESP8266]]&lt;br /&gt;
&lt;br /&gt;
= Descrizione =&lt;br /&gt;
&lt;br /&gt;
Sensore/i di temperatura e umidita` [[DHT22]], che invia dati ad un broker MQTT via wireless tramite [[ESP8266]].&lt;br /&gt;
&lt;br /&gt;
== Update 2018 08 11 ==&lt;br /&gt;
&lt;br /&gt;
Aggiornamenti con inserimento delle nuove funzioni di libreria, che calcolano anche la temperatura percepita e quella di condensazione del vapore.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Circuito elettrico/elettronico =&lt;br /&gt;
&lt;br /&gt;
[[File:Esp8266-dht.pdf]]&lt;br /&gt;
&lt;br /&gt;
= Programmazione =&lt;br /&gt;
&lt;br /&gt;
Per la programmazione dell'[[ESP8266]] si utilizza il framework [[ESP8266/Sming|Sming]].&lt;br /&gt;
&lt;br /&gt;
= Riferimenti =&lt;br /&gt;
&lt;br /&gt;
* [[ESP8266/Sming]]&lt;br /&gt;
* [[Centralina livello 1]]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1/Centralina_livello_2_PIR/Device_PIR_per_centralina_livello_2&amp;diff=6654</id>
		<title>Centralina livello 1/Centralina livello 2 PIR/Device PIR per centralina livello 2</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1/Centralina_livello_2_PIR/Device_PIR_per_centralina_livello_2&amp;diff=6654"/>
		<updated>2018-05-27T17:13:59Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Circuito elettrico/elettronico */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
!&amp;lt;source lang=[shell] gutter=false&amp;gt;&lt;br /&gt;
IMAGE: Quando faro` le foto (e se mi ricordo)!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Device PIR per Centralina livello 2&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Sensore di movimento (PIR) per centralina livello 2&lt;br /&gt;
|-&lt;br /&gt;
|Repository provvisorio: https://github.com/dave4th/level2pir_dev1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- = Device PIR per Centralina livello 2 = --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Elabora il segnale di un sensore di movimento, inviando una stringa alla [[Centralina_livello_1/Centralina_livello_2_PIR | centralina di livello 2]], per essere poi rielaborata e ritrasmessa a [[Centralina_livello_1 | centralina livello 1 ]]&lt;br /&gt;
&lt;br /&gt;
Per questo &amp;quot;device&amp;quot; sono stati utilizzati un'Attiny85, un PIR ed un'antenna RF433MHz per contenerne i consumi e riuscire (speriamo) ad avere dei sensori alimentati a batterie (e che durino).&lt;br /&gt;
&lt;br /&gt;
E` ancora tutto in versione molto preliminare, ma qualcosa funziona, quindi ho deciso di scrivere due righe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- = Descrizione = --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Circuito elettrico/elettronico =&lt;br /&gt;
&lt;br /&gt;
Un Attiny85 con un sensore di movimento PIR HC-SR501, piu` antenna trasmettitore RF433MHz (FS1000A, venduta in coppia col ricevitore XD-RF-5V):&lt;br /&gt;
&lt;br /&gt;
[[File:Attiny85-pir-rf433.pdf]]&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
Nel repository provvisorio: https://github.com/dave4th/level2pir_dev1&lt;br /&gt;
&lt;br /&gt;
Trovate alcune note utili&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
Upload tramite [[Arduino IDE]], utilizzando un [[Arduino/Genuino Uno]] come [[Arduino ISP]]&lt;br /&gt;
&lt;br /&gt;
Purtroppo non ci sono molte possibilita` di debug, niente seriale sull'Attiny, quindi consiglio d'usare un [[Arduino/Genuino Uno]] per le prove e poi l'Attiny85 quando qualcosa funziona ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Configurazione ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Note hardware e software ==&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Promemoria Chiavi/Codici =&lt;br /&gt;
&lt;br /&gt;
[[Centralina_livello_1#Topic_.28mqtt.29|Topic (mqtt)]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina_livello_1/Notes#Chiavi_e_codici.2C_esempi_da_ultimo_device|Chiavi e codici, esempi da ultimo device]]&lt;br /&gt;
&lt;br /&gt;
= Riferimenti =&lt;br /&gt;
&lt;br /&gt;
* [[Centralina livello 1]]&lt;br /&gt;
* [[Centralina livello 1/Centralina livello 2 PIR]]&lt;br /&gt;
&lt;br /&gt;
* https://forum.arduino.cc/index.php?topic=94905.0&lt;br /&gt;
* http://mchr3k.github.io/arduino-libs-manchester/&lt;br /&gt;
* https://github.com/mchr3k/arduino-libs-manchester&lt;br /&gt;
* http://www.instructables.com/id/Attiny85-RF-Transmitter-to-Arduino-Uno-Receiver-Ma/&lt;br /&gt;
* http://www.instructables.com/id/Receiving-and-sending-data-between-Attiny85/&lt;br /&gt;
* http://henrysbench.capnfatz.com/henrys-bench/arduino-sensors-and-input/arduino-hc-sr501-motion-sensor-tutorial/&lt;br /&gt;
* http://daveprojects.blogspot.it/2017/04/attiny85-sleep-mode-interrupt.html&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=File:Attiny85-pir-rf433.pdf&amp;diff=6653</id>
		<title>File:Attiny85-pir-rf433.pdf</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=File:Attiny85-pir-rf433.pdf&amp;diff=6653"/>
		<updated>2018-05-27T17:12:31Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1/Centralina_livello_2_PIR/Device_PIR_per_centralina_livello_2&amp;diff=6652</id>
		<title>Centralina livello 1/Centralina livello 2 PIR/Device PIR per centralina livello 2</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1/Centralina_livello_2_PIR/Device_PIR_per_centralina_livello_2&amp;diff=6652"/>
		<updated>2018-05-27T17:10:35Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Riferimenti */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
!&amp;lt;source lang=[shell] gutter=false&amp;gt;&lt;br /&gt;
IMAGE: Quando faro` le foto (e se mi ricordo)!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Device PIR per Centralina livello 2&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Sensore di movimento (PIR) per centralina livello 2&lt;br /&gt;
|-&lt;br /&gt;
|Repository provvisorio: https://github.com/dave4th/level2pir_dev1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- = Device PIR per Centralina livello 2 = --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Elabora il segnale di un sensore di movimento, inviando una stringa alla [[Centralina_livello_1/Centralina_livello_2_PIR | centralina di livello 2]], per essere poi rielaborata e ritrasmessa a [[Centralina_livello_1 | centralina livello 1 ]]&lt;br /&gt;
&lt;br /&gt;
Per questo &amp;quot;device&amp;quot; sono stati utilizzati un'Attiny85, un PIR ed un'antenna RF433MHz per contenerne i consumi e riuscire (speriamo) ad avere dei sensori alimentati a batterie (e che durino).&lt;br /&gt;
&lt;br /&gt;
E` ancora tutto in versione molto preliminare, ma qualcosa funziona, quindi ho deciso di scrivere due righe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- = Descrizione = --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Circuito elettrico/elettronico =&lt;br /&gt;
&lt;br /&gt;
Ancora non disegnato, ma si tratta di un Attiny85 con un sensore di movimento PIR HC-SR501, piu` antenna trasmettitore RF433MHz (FS1000A, venduta in coppia col ricevitore XD-RF-5V)&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
Nel repository provvisorio: https://github.com/dave4th/level2pir_dev1&lt;br /&gt;
&lt;br /&gt;
Trovate alcune note utili&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
Upload tramite [[Arduino IDE]], utilizzando un [[Arduino/Genuino Uno]] come [[Arduino ISP]]&lt;br /&gt;
&lt;br /&gt;
Purtroppo non ci sono molte possibilita` di debug, niente seriale sull'Attiny, quindi consiglio d'usare un [[Arduino/Genuino Uno]] per le prove e poi l'Attiny85 quando qualcosa funziona ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Configurazione ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Note hardware e software ==&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Promemoria Chiavi/Codici =&lt;br /&gt;
&lt;br /&gt;
[[Centralina_livello_1#Topic_.28mqtt.29|Topic (mqtt)]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina_livello_1/Notes#Chiavi_e_codici.2C_esempi_da_ultimo_device|Chiavi e codici, esempi da ultimo device]]&lt;br /&gt;
&lt;br /&gt;
= Riferimenti =&lt;br /&gt;
&lt;br /&gt;
* [[Centralina livello 1]]&lt;br /&gt;
* [[Centralina livello 1/Centralina livello 2 PIR]]&lt;br /&gt;
&lt;br /&gt;
* https://forum.arduino.cc/index.php?topic=94905.0&lt;br /&gt;
* http://mchr3k.github.io/arduino-libs-manchester/&lt;br /&gt;
* https://github.com/mchr3k/arduino-libs-manchester&lt;br /&gt;
* http://www.instructables.com/id/Attiny85-RF-Transmitter-to-Arduino-Uno-Receiver-Ma/&lt;br /&gt;
* http://www.instructables.com/id/Receiving-and-sending-data-between-Attiny85/&lt;br /&gt;
* http://henrysbench.capnfatz.com/henrys-bench/arduino-sensors-and-input/arduino-hc-sr501-motion-sensor-tutorial/&lt;br /&gt;
* http://daveprojects.blogspot.it/2017/04/attiny85-sleep-mode-interrupt.html&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1/Centralina_livello_2_PIR/Device_PIR_per_centralina_livello_2&amp;diff=6615</id>
		<title>Centralina livello 1/Centralina livello 2 PIR/Device PIR per centralina livello 2</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1/Centralina_livello_2_PIR/Device_PIR_per_centralina_livello_2&amp;diff=6615"/>
		<updated>2018-05-01T12:49:07Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: Creata pagina con '&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8p...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
!&amp;lt;source lang=[shell] gutter=false&amp;gt;&lt;br /&gt;
IMAGE: Quando faro` le foto (e se mi ricordo)!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Device PIR per Centralina livello 2&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Sensore di movimento (PIR) per centralina livello 2&lt;br /&gt;
|-&lt;br /&gt;
|Repository provvisorio: https://github.com/dave4th/level2pir_dev1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- = Device PIR per Centralina livello 2 = --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Elabora il segnale di un sensore di movimento, inviando una stringa alla [[Centralina_livello_1/Centralina_livello_2_PIR | centralina di livello 2]], per essere poi rielaborata e ritrasmessa a [[Centralina_livello_1 | centralina livello 1 ]]&lt;br /&gt;
&lt;br /&gt;
Per questo &amp;quot;device&amp;quot; sono stati utilizzati un'Attiny85, un PIR ed un'antenna RF433MHz per contenerne i consumi e riuscire (speriamo) ad avere dei sensori alimentati a batterie (e che durino).&lt;br /&gt;
&lt;br /&gt;
E` ancora tutto in versione molto preliminare, ma qualcosa funziona, quindi ho deciso di scrivere due righe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- = Descrizione = --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Circuito elettrico/elettronico =&lt;br /&gt;
&lt;br /&gt;
Ancora non disegnato, ma si tratta di un Attiny85 con un sensore di movimento PIR HC-SR501, piu` antenna trasmettitore RF433MHz (FS1000A, venduta in coppia col ricevitore XD-RF-5V)&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
Nel repository provvisorio: https://github.com/dave4th/level2pir_dev1&lt;br /&gt;
&lt;br /&gt;
Trovate alcune note utili&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
Upload tramite [[Arduino IDE]], utilizzando un [[Arduino/Genuino Uno]] come [[Arduino ISP]]&lt;br /&gt;
&lt;br /&gt;
Purtroppo non ci sono molte possibilita` di debug, niente seriale sull'Attiny, quindi consiglio d'usare un [[Arduino/Genuino Uno]] per le prove e poi l'Attiny85 quando qualcosa funziona ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Configurazione ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Note hardware e software ==&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Promemoria Chiavi/Codici =&lt;br /&gt;
&lt;br /&gt;
[[Centralina_livello_1#Topic_.28mqtt.29|Topic (mqtt)]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina_livello_1/Notes#Chiavi_e_codici.2C_esempi_da_ultimo_device|Chiavi e codici, esempi da ultimo device]]&lt;br /&gt;
&lt;br /&gt;
= Riferimenti =&lt;br /&gt;
&lt;br /&gt;
* [[Centralina livello 1]]&lt;br /&gt;
* [[Centralina livello 1/Centralina livello 2 PIR]]&lt;br /&gt;
&lt;br /&gt;
* https://forum.arduino.cc/index.php?topic=94905.0&lt;br /&gt;
* http://mchr3k.github.io/arduino-libs-manchester/&lt;br /&gt;
* https://github.com/mchr3k/arduino-libs-manchester&lt;br /&gt;
* http://www.instructables.com/id/Attiny85-RF-Transmitter-to-Arduino-Uno-Receiver-Ma/&lt;br /&gt;
* http://www.instructables.com/id/Receiving-and-sending-data-between-Attiny85/&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1/Centralina_livello_2_PIR&amp;diff=6614</id>
		<title>Centralina livello 1/Centralina livello 2 PIR</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1/Centralina_livello_2_PIR&amp;diff=6614"/>
		<updated>2018-05-01T12:27:43Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: Creata pagina con '&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8p...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
!&amp;lt;source lang=[shell] gutter=false&amp;gt;&lt;br /&gt;
IMAGE: Quando faro` le foto (e se mi ricordo)!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Centralina livello 2 - PIR&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Centralina livello 2 per raccolta ed invio segnali di sensori di movimento &amp;quot;PIR&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Repository provvisorio: https://github.com/dave4th/level2pir&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- = Centralina livello 2 - PIR = --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Raccoglie ed elabora i segnali provenienti da [[Centralina_livello_1/Centralina_livello_2_PIR/Device_PIR_per_centralina_livello_2 | sensori di movimento PIR (HC-SR501) pilotati da un attiny85]]&lt;br /&gt;
&lt;br /&gt;
E` ancora tutto in versione molto preliminare, ma qualcosa funziona, quindi ho deciso di scrivere due righe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- = Descrizione = --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Circuito elettrico/elettronico =&lt;br /&gt;
&lt;br /&gt;
Ancora non disegnato, ma si tratta di una scheda [[Arduino/Genuino Uno]] piu` scheda [[Arduino Ethernet Shield]] (clone), piu` antenna ricevitore RF433MHz (XD-RF-5V, venduta in coppia col trasmettitore FS1000A)&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
Nel repository provvisorio: https://github.com/dave4th/level2pir&lt;br /&gt;
&lt;br /&gt;
Trovate alcune note utili&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
Upload tramite Arduino IDE, ricordate di togliere la ethernet shield, senno` non carica.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Configurazione ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Note hardware e software ==&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Promemoria Chiavi/Codici =&lt;br /&gt;
&lt;br /&gt;
[[Centralina_livello_1#Topic_.28mqtt.29|Topic (mqtt)]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina_livello_1/Notes#Chiavi_e_codici.2C_esempi_da_ultimo_device|Chiavi e codici, esempi da ultimo device]]&lt;br /&gt;
&lt;br /&gt;
= Riferimenti =&lt;br /&gt;
&lt;br /&gt;
* [[Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
= Devices =&lt;br /&gt;
&lt;br /&gt;
* [[Centralina_livello_1/Centralina_livello_2_PIR/Device_PIR_per_centralina_livello_2 | Device PIR ]]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=6613</id>
		<title>Centralina livello 1</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Centralina_livello_1&amp;diff=6613"/>
		<updated>2018-05-01T11:58:08Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Devices */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;border:1px solid black;padding:10px;margin:10px background:#F5F6CE; border:1px solid #a7d7f9; vertical-align:top; color:#000; padding: 5px 10px 10px 8px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius:10px;&amp;quot; &amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
![[File:Livello1-Debug.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;hr&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;span style=&amp;quot;font-size:200%;font-weight:bold&amp;quot;&amp;gt;Centralina livello 1&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Centralina generale (?) gestione segnali&lt;br /&gt;
|-&lt;br /&gt;
|Repository: https://github.com/raspibo/Livello1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Progetti]]&lt;br /&gt;
&lt;br /&gt;
= Centralina  livello 1 =&lt;br /&gt;
&lt;br /&gt;
;ATTENZIONE&lt;br /&gt;
:Tutte le immagini sono puramente indicative, il progetto e` in pieno sviluppo, tutto e` passibile di modifiche, anche sostanziali.&lt;br /&gt;
:L'immagine di presentazione si riferisce alla sezione &amp;quot;debug&amp;quot;, realizzata con Dokuwiki e (ad oggi) non fa parte del progetto (o si ?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prima e sommaria descrizione ==&lt;br /&gt;
&lt;br /&gt;
Centralina di controllo segnali.&lt;br /&gt;
&lt;br /&gt;
:(Ad oggi)&lt;br /&gt;
:Acquisisce segnali, li suddivide in gruppi mono o multi utenza, dei quali: realizza grafici temporali, crea e gestisce allarmi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dal campo arrivano i valori della 'sensoristica' sottoforma di &amp;quot;Identificatore Valore&amp;quot;, da queste informazioni sono aggiunti i sensori che eventualmente non sono presenti e le relative 'liste' dei valori (sono generate due chiavi, una dell'utenza e l'altra dei valori), altrimenti viene solo accodato il valore nella rispettiva lista (aggiungendo data-ora-minuti-secondi).&lt;br /&gt;
&lt;br /&gt;
Acquisiti i sensori, e` possibile il loro raggruppamento (anche una sola utenza) ed il campionamento dei valori a tempi prestabiliti (generazione grafici tempo/valore).&lt;br /&gt;
&lt;br /&gt;
Sempre previo raggruppamento (sempre &amp;quot;anche di un solo sensore&amp;quot;), e` possibile attivare/disattivare i relativi allarmi, il classico ON/OFF, ma anche un'automatico (che per esempio attivi i sensori del solaio/cantine dalle 20 alle 8, quando e` certo che nessuno si rechi in quegli spazi).&lt;br /&gt;
&lt;br /&gt;
E poi il resto .. che sarebbe di arrivare non solo a leggere/interpretare segnali, ma anche a pilotare utenze (luci, serrande, elettrodomestici, ...)&lt;br /&gt;
&lt;br /&gt;
L'idea e` che tutto questo sia gestibile da:&lt;br /&gt;
# interfaccia web&lt;br /&gt;
#* browser&lt;br /&gt;
#* cellulare&lt;br /&gt;
# linea di comando&lt;br /&gt;
# terminali operatore (display+tastiere)&lt;br /&gt;
# pulsanti, lampade, selettori, ..&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
== Hardware e Software ==&lt;br /&gt;
&lt;br /&gt;
;Hardware&lt;br /&gt;
:Versione 1 - [[Raspberry Pi 3]], perche` completa di WiFi e Bluetooth&lt;br /&gt;
:Versione 2 (2018) - [[Raspberry Pi]] con chiavetta WiFi&lt;br /&gt;
&lt;br /&gt;
;Software&lt;br /&gt;
:MQTT Broker (Mosquitto), perche` in grado di dialogare con la maggior parte dei componenti (Arduino, ESP8266, eccetera)&lt;br /&gt;
:Redis, perche` servira` un database di appoggio e manipolazione per alcuni dati, e perche` servira` una struttura dati &amp;quot;manipolabile&amp;quot; (dovremo poter aggiungere e togliere &amp;quot;campi:valori&amp;quot; ad una &amp;quot;chiave&amp;quot;, e aggiungere/togliere chiavi a delle liste, ecc. ecc.)&lt;br /&gt;
:Nginx, non si puo` fare senza web server&lt;br /&gt;
:... e poi non so cos'altro&lt;br /&gt;
:Script cgi&lt;br /&gt;
:javascript&lt;br /&gt;
: ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Embedded page --&amp;gt;&lt;br /&gt;
{{:Raspberry_Pi-Raspbian_default_post-install}}&lt;br /&gt;
&lt;br /&gt;
== Access Point ==&lt;br /&gt;
&lt;br /&gt;
Installato/configurato &amp;quot;[[Raspberry Pi Access Point WEP2]]&amp;quot;, sfruttando il wifi integrato nel [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
Installazione dei pacchetti utili, necessari (e qualcuno inutile):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
apt-get install nginx fcgiwrap redis-server python3-redis mosquitto paho-mqtt ssl-cert php-fpm php7.0-xml python3-pip python3-pandas python3-cairosvg python3-cssselect git mosquitto-clients apt-file mc redis-tools aria2&lt;br /&gt;
pip3 install paho-mqtt python-telegram-bot pygal tinycss&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E` stato installato manualmente anche [http://www.dokuwiki.org dokuwiki], utilizzato per segnarsi appunti vari (e un po` di debug), e` facoltativo e non descritto le operazioni necessarie, ma i files di configurazione del web server si.&lt;br /&gt;
&lt;br /&gt;
E` necessario scaricare il repository con i programmi (script python per lo piu`), si puo` fare da normale utente, per esempio:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mkdir git&lt;br /&gt;
cd git&lt;br /&gt;
git clone https://github.com/raspibo/Livello1.git&lt;br /&gt;
cd Livello1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx ====&lt;br /&gt;
&lt;br /&gt;
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp etc/nginx/sites-available/level1 /etc/nginx/sites-available/&lt;br /&gt;
ln -s /etc/nginx/sites-enabled/level1 /etc/nginx/sites-enabled/&lt;br /&gt;
cp etc/nginx/dokuwiki* etc/nginx/fcgiwrap.conf /etc/nginx/&lt;br /&gt;
rm /etc/nginx/sites-enabled/default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abbiamo effettuato tutte le operazioni come &amp;quot;root&amp;quot;, ma assicuratevi che il proprietario sia corretto, se non lo e`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown root:root -R /etc/nginx/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo sytemctl restart nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
dovrebbe funzionare.&lt;br /&gt;
&lt;br /&gt;
==== Level1 (www) ====&lt;br /&gt;
&lt;br /&gt;
Ho messo tutti i files/script nella directory del web server.&lt;br /&gt;
&lt;br /&gt;
Li copiamo dal repository e settiamo il giusto proprietario:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu var/www/ /var/&lt;br /&gt;
chown www-data:www-data -R /var/www/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serve anche la scrittura in &amp;quot;www&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chmod 775 /var/www&lt;br /&gt;
chown :www-data -R /var/www    # oppure si poteva eliminare il &amp;quot;/&amp;quot; dal &amp;quot;chown&amp;quot; precedente&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nota&lt;br /&gt;
:I permessi sono 755, quindi i files sono eseguibili da chiunque.&lt;br /&gt;
:Potrebbe essere necessario creare la directory &amp;quot;/var/www/archive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Avvio ====&lt;br /&gt;
&lt;br /&gt;
All'avvio del sistema, devono andare in esecuzione alcuni script (quasi &amp;quot;daemons&amp;quot;) e rimanere attivi, per questo si deve modificare il file &amp;quot;/etc/rc.local&amp;quot; (lo trovate nel repository git):&lt;br /&gt;
&lt;br /&gt;
;/etc/rc.local&lt;br /&gt;
:Ho aggiunto le seguenti righe prima della &amp;quot;exit 0&amp;quot;&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Power On &amp;quot;Level 1&amp;quot;&lt;br /&gt;
DAEMON_NAME=mqtt2redis_d&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviata correttamente Livello 1, oppure mqtt2redis_d e\` gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio \&amp;quot;mqtt2redis_d\&amp;quot;&amp;quot;&lt;br /&gt;
                #/var/www/cgi-bin/mqtt2redis_init.d.sh start # 20180115&lt;br /&gt;
        su -c &amp;quot;/var/www/cgi-bin/mqtt2redis_init.d.sh start&amp;quot; pi&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Centralina level 1 [ri]avviata ..&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Start Telegram Bot&lt;br /&gt;
DAEMON_NAME=bot4livello1&lt;br /&gt;
PID=`ps -e -o pid,cmd | grep &amp;quot;$DAEMON_NAME[.]py&amp;quot; | awk '{ print $1 }'`&lt;br /&gt;
if [ $PID ]&lt;br /&gt;
        then&lt;br /&gt;
                echo &amp;quot;Non si e\` avviato il Telegram Bot, oppure era gia\` avviato:&amp;quot;&lt;br /&gt;
                echo &amp;quot;Actual PID is: $PID&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Avvio Telegram Bot&amp;quot;&lt;br /&gt;
                cd /home/pi/project/csv2image2telegram&lt;br /&gt;
                su pi -c &amp;quot;python3 bot4livello1.py &amp;amp;&amp;quot;&lt;br /&gt;
                # .. e un messaggio a centred quando si [ri]avvia&lt;br /&gt;
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type &amp;quot;alert&amp;quot; desc &amp;quot;Avvio bot4livello1.py&amp;quot; value &amp;quot;on&amp;quot; um &amp;quot;&amp;quot; date &amp;quot;$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)&amp;quot;&lt;br /&gt;
                cd /&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inoltre, visto che puo` capitare s'interrompano, specialmente nelle prove di nuovi [[Centralina_livello_1#Devices|devices]], sono predisposti dei &amp;quot;check orari&amp;quot; che nel caso, li riavviano:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.hourly/mqtt2redis_check /etc/cron.hourly/&lt;br /&gt;
cp -vapu etc/cron.hourly/bot4livello1_check /etc/cron.hourly/ # se installerete anche il bot telegram&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Backup ====&lt;br /&gt;
&lt;br /&gt;
Oltre ad un &amp;quot;backup&amp;quot; che si occupa di salvare tutti i computer's della rete, ho aggiunto uno script per salvare giornalmente il database redis, come ulteriore sicurezza, i files sono salvati nella directory &amp;quot;/root&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
cp -vapu etc/cron.daily/backupredis /etc/cron.daily/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rete ==&lt;br /&gt;
&lt;br /&gt;
Al momento e` previsto che sia tutto sotto WiFi (quella onboard) del [[Raspberry Pi 3]].&lt;br /&gt;
&lt;br /&gt;
Comunque bastera` modificare il firewall per accettare dati dalla ethernet se si rendesse necessario.&lt;br /&gt;
&lt;br /&gt;
Le centrali accessorie, tipo quella di [[CentRed|allarme]], che deve solo ricevere, non necessariamente dovranno trovarsi nella sottorete gestita da &amp;quot;livello 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Descrizione ==&lt;br /&gt;
&lt;br /&gt;
I 'segnali' arrivano sempre (?) a &amp;quot;MQTT broker&amp;quot;, vengono manipolati se necessario, ed inseriti nel database Redis.&lt;br /&gt;
&lt;br /&gt;
Dal database Redis sono di nuovo letti/scritti/modificati/manipolati ed inviati:&lt;br /&gt;
:e/o&lt;br /&gt;
::in report (testo, grafico, audio, video, ...)&lt;br /&gt;
:e/o&lt;br /&gt;
::alla centralina di allarme [[CentRed]]&lt;br /&gt;
:e/o&lt;br /&gt;
::reinviati a MQTT broker&lt;br /&gt;
:e/o&lt;br /&gt;
::inviati ad altre centraline livello 1&lt;br /&gt;
:e/o&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
=== Configurazione e Funzionamento ===&lt;br /&gt;
&lt;br /&gt;
(Sommariamente)&lt;br /&gt;
&lt;br /&gt;
Al primo avvio e` necesssario configurare prima il database Redis da utilizzare, poi quello della [[CentRed|centralina avvisi/allarmi]] (se avete intenzione di ricevere le comunicazioni relative agli allarmi e/o avvisi di malfunzionamenti).&lt;br /&gt;
&lt;br /&gt;
Una volta &amp;quot;letti&amp;quot; i segnali, e` opera dell'utente aggiungere alcune caratteristiche [[#Segnali]], fatto questo si passa alla creazione dei [[#Gruppi]].&lt;br /&gt;
&lt;br /&gt;
Definiti i [[#Gruppi]], si passa ad avviare i servizi necessari [[#Daemons]], che si occupano di generare i grafici Tempo-Valore/i o gestione degli allarmi/anomalie.&lt;br /&gt;
&lt;br /&gt;
== Arrivo dati e manipolazione ==&lt;br /&gt;
&lt;br /&gt;
I dati devono arrivare al broker MQTT nel formato:&lt;br /&gt;
&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
inviati nel topic:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fate riferimento alla [[#Tabella dati e valori]] per comprendere meglio il significato.&lt;br /&gt;
&lt;br /&gt;
Nell'immagine, una schermata dei test in corso, a sinistra gli errori di lettura, a destra un listato della &amp;quot;cgi-bin&amp;quot;, sotto i falsi dati inviati (mi servono per i test che sto` facendo ;) ), e in fondo i dati ricevuti (veri e falsi).&lt;br /&gt;
&lt;br /&gt;
[[File:Level1 201604170814.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mqtt2redis_d.py ===&lt;br /&gt;
&lt;br /&gt;
I dati MQTT vengono letti dal programma &amp;quot;mqtt2redis_d.py&amp;quot; che deve sempre essere in esecuzione (ho gia` preparato anche un &amp;quot;init.d&amp;quot;, che tengo ancora nella &amp;quot;cgi-bin&amp;quot;), questi li manipola inserendoli se non presenti, in due &amp;quot;chiavi&amp;quot; nel database (noSQL) Redis, la prima, e` per identificare il segnale:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
la seconda e` quella dei valori:&lt;br /&gt;
&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
valori che sono accodati ad ogni arrivo con l'aggiunta della data e ora, predisposti per una generazione di output in formato &amp;quot;csv&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== ''IMPORTANTE'' ==&lt;br /&gt;
&lt;br /&gt;
''Quello che segue non e` aggiornato di pari passo con l'aggiornamento del software e quant'altro necessario.''&lt;br /&gt;
&lt;br /&gt;
''Durante l'uso, nelle pagine di configurazione e modifica compaiono delle descrizioni che sono piu` veritiere/aggiornate, perche` scritte durante la stesura e/o modifica del software.''&lt;br /&gt;
&lt;br /&gt;
== Segnali ==&lt;br /&gt;
&lt;br /&gt;
Una volta pervenuto il primo valore di un segnale, e` possibile configurarlo inserendo alcuni dati che non sono presenti nella comunicazione MQTT:&lt;br /&gt;
&lt;br /&gt;
;Descrizione&lt;br /&gt;
:Meglio se breve, perche` usata anche nei riferimenti dei grafici, non solo per gli allarmi (per esempio: &amp;quot;ST1 Cucina&amp;quot; per sensore temperatura in cucina)&lt;br /&gt;
;UM (Unita` di misura)&lt;br /&gt;
;TempoRitardo&lt;br /&gt;
:Ancora non usata&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Specificare il range dei valori nel formato 0,100&lt;br /&gt;
:Utile per sonde che (per esempio) lavorano da 0 a 100 gradi&lt;br /&gt;
:Genera avviso/allarme se minore di o maggiore di&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Avviso se valore e` inferiore a quello impostato&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Aavviso se valore e` superiore a quello impostato&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:Previsto per i segnali analogici o negati&lt;br /&gt;
:Avviso quando valore uguale a ValoreOn&lt;br /&gt;
;Allarme&lt;br /&gt;
:Definire qua i valori che saranno usati come allarmi, per esempio: ValoreOn,ValoreMin&lt;br /&gt;
:Se sono impostati, ma non indicati qua, sono emessi dei semplici avvisi&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sonda temperatura (ovviamente falsa):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashTempMod Falsa2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Esempio di una configurazione di sensore di movimento (pir, ovviamente falso):&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-KeysHashPirMod Falso2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
== Gruppi ==&lt;br /&gt;
&lt;br /&gt;
Per realizzare i raggruppamenti ho utilizzato le chiavi Redis di tipo &amp;quot;sets&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Al momento ho pensato ai soli gruppi riguardanti gli allarmi e i grafici (per esempio quelli di due o piu`, sonde di temperatura).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Puoi benissimo creare un gruppo con un solo sensore.&lt;br /&gt;
&lt;br /&gt;
Al solito, ho pensato ad una chiave univoca d'inserimento dei dati in Redis '''sets:type:ID''' (gruppo:tipo:identificatore).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gruppo&lt;br /&gt;
|&lt;br /&gt;
* sets&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* alarms&lt;br /&gt;
* graph&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore)&lt;br /&gt;
|&lt;br /&gt;
(definito da utente, esempi:)&lt;br /&gt;
* TemperatureBagno&lt;br /&gt;
* TemperaturePianoTerra&lt;br /&gt;
* luigi&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I gruppi sono definiti dall'utente, ed ogni volta che viene creato un nuovo gruppo (deve avere almeno un'utenza altrimenti si autoelimina), viene gia` creato il &amp;quot;Timer&amp;quot; di &amp;quot;campionamento&amp;quot;/&amp;quot;ritardo nuovo allarme&amp;quot;, preimpostato a 5 minuti (sono previsti valori da 1 a 60 minuti).&lt;br /&gt;
&lt;br /&gt;
''La pagina d'inserimento permette di inserire una chiave con un nome qualsiasi, non ho ancora &amp;quot;bloccato&amp;quot; e/o previsto un controllo sull'identificatore assegnato.''&lt;br /&gt;
&lt;br /&gt;
=== sets:*:ID:Config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Timer&lt;br /&gt;
|&lt;br /&gt;
* da 1 60 minuti&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Funzionamento&lt;br /&gt;
|&lt;br /&gt;
* On&lt;br /&gt;
* Off&lt;br /&gt;
* Auto&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) dalle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! (Auto) alle&lt;br /&gt;
|&lt;br /&gt;
* HH&lt;br /&gt;
* MM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;graph&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
La chiave per questi gruppi e` previsto che sia: '''sets:graph:ID'''&lt;br /&gt;
&lt;br /&gt;
La chiave per il timer di campionamento e` previsto che sia: '''sets:graph:ID:Timer''' (ora e` generata automaticamente)&lt;br /&gt;
&lt;br /&gt;
La chiave per i dati campionati e la generazione del grafico (che sara` in formato csv) e` previsto che sia: '''sets:graph:ID:Valori''' (sara` creata ed aggiornata autonomamente, da un programma in python)&lt;br /&gt;
&lt;br /&gt;
==== Esempio &amp;quot;alarms&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Al momento come sopra, tranne che il Timer non servira` (o forse si, perche` sono previsti anche grafici dei PIR).&lt;br /&gt;
&lt;br /&gt;
==== Esempio d'inserimento gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Aggiungi chiavi &amp;quot;sets&amp;quot; Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysAddSets 1.png&lt;br /&gt;
File:Livello1-KeysAddSets 2.png&lt;br /&gt;
File:Livello1-KeysAddSets 3.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
::Nell'immagine e` gia` stato applicato il filtro '''*:graph:*'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModHash 1.png|Spostiamoci verso il basso e selezioniamo la seconda voce di modifica delle chiavi &amp;quot;hash&amp;quot;, quella relativa al &amp;quot;Config&amp;quot;:&lt;br /&gt;
File:Livello1-KeysModHash 2.png&lt;br /&gt;
File:Livello1-KeysModHash 3.png|e l'esempio di un allarme:&lt;br /&gt;
File:Livello1-KeysModHash 3a.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Modifica di un gruppo ====&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis &lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-KeysModSets 2.png&lt;br /&gt;
File:Livello1-KeysModSets 3.png|Credo si spieghi da sola ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Daemons ==&lt;br /&gt;
&lt;br /&gt;
Intanto: non sono veri e propri &amp;quot;demoni&amp;quot;, sono script che l'utente avvia e ferma al bisogno.&lt;br /&gt;
&lt;br /&gt;
Specialmente quello degli allarmi (che mi sta` rompendo al cellulare da stamattina ;) ), e` da avviare quando uscite di casa, e fermare prima di rientrare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Daemons part1.png&lt;br /&gt;
File:Livello1-Daemons part2.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;Tip&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grafici (files .csv) ==&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Manipolazione files Grafici&lt;br /&gt;
&lt;br /&gt;
Non c'e` molto da scrivere, si puo` visualizzarlo (la chiamata e` tramite GET perche` sia possibile tenere il refresh della pagina in automatico, mi sembra di aver previsto 5 minuti), copiarlo con un nome in archivio (la predisposizione e` per un nome con data e ora), eliminare (qualsiasi, anche dall'archivio).&lt;br /&gt;
&lt;br /&gt;
;TIP&lt;br /&gt;
:Salvate il &amp;quot;.csv&amp;quot; PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-CSV.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Allarmi ==&lt;br /&gt;
&lt;br /&gt;
Per ogni gruppo creato, e` possibile eseguire il controllo allarmi, servono opportune preimpostazioni (configurazioni), poi e` possibile eseguire il software dalla pagina '''Daemons''':&lt;br /&gt;
&lt;br /&gt;
[[File:Livello1-Allarmi-Daemons.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Si puo` notare in esecuzione solo quello relativo ad una falsa sonda di temperatura, relativo ai [[Centralina livello 1/Test allarmi|test eseguiti]].&lt;br /&gt;
&lt;br /&gt;
L'eseguibile e` &amp;quot;/var/www/cgi-bin/setsalarms_d.py&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== setsalarms_d.py ===&lt;br /&gt;
&lt;br /&gt;
Perche` possa &amp;quot;funzionare&amp;quot; servono alcuni requisiti:&lt;br /&gt;
*Deve esistere il gruppo ed avere una configurazione (che e` preimpostata alla creazione)&lt;br /&gt;
*Il gruppo deve essere &amp;quot;on&amp;quot; o in modalita` &amp;quot;auto&amp;quot; (per default e` &amp;quot;off&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Tutti sono avvisi (li ho chiamati &amp;quot;alert&amp;quot;), alcuni possono e devono invece diventare allarmi (&amp;quot;alarm&amp;quot;). Perche` siano definiti allarmi, devono essere inseriti nella voce &amp;quot;Allarme&amp;quot;, presente nella configurazione della sonda (sensore, PIR, o quello che e`).&lt;br /&gt;
&lt;br /&gt;
Tipi di &amp;quot;alert&amp;quot;:&lt;br /&gt;
;RangeValori&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero,[+-]Numero, una sonda 1wire pe esempio sarebbe: -55,+125&lt;br /&gt;
:;Alert&lt;br /&gt;
::Se il valore letto e` fuori dal range&lt;br /&gt;
;ValoreMin&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` inferiore&lt;br /&gt;
;ValoreMax&lt;br /&gt;
:Deve essere specificato nella forma [-]Numero&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` superiore&lt;br /&gt;
;ValoreOn&lt;br /&gt;
:0 o 1&lt;br /&gt;
:Al momento e` previsto per sola sensoristica come: finecorsa, PIR, e altri segnali on/off&lt;br /&gt;
:;Alert/Alarm&lt;br /&gt;
::Se il valore letto e` uguale&lt;br /&gt;
;Allarme&lt;br /&gt;
:Quello che e` allarme e non semplice avviso:&lt;br /&gt;
::ValoreOn&lt;br /&gt;
::ValoreMin&lt;br /&gt;
::ValoreMin,ValoreMax,ValoreOn&lt;br /&gt;
::...&lt;br /&gt;
&lt;br /&gt;
Per un'esempio di configurazione fate riferimento alla pagina [[Centralina livello 1/Test allarmi|Test Allarmi]].&lt;br /&gt;
&lt;br /&gt;
Il software invia gli avvisi/allarmi alla centralina [[CentRed]], e` questa poi ad occuparsi della trasmissione, discriminando il tipo dalla stringa con cui e` stato inviato. Altre informazioni alla pagina [[CentRed]].&lt;br /&gt;
&lt;br /&gt;
== Analizza e Modifica Valori ==&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto la possibilita` di manipolare i valori memorizzati nel database Redis.&lt;br /&gt;
&lt;br /&gt;
;MENU&lt;br /&gt;
:Seleziona e Manipola chiavi Redis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Selezione_Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sono ammesse solamente chiavi &amp;quot;:Valori&amp;quot;, la possibilita` di selezione dipende (al solito) dal filtro attivo nella pagina.&lt;br /&gt;
&lt;br /&gt;
Una volta scelta la chiave e cliccato su &amp;quot;Analizza e Modifica&amp;quot;, compare la pagina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=600px&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Livello1-Analizza_e_Modifica_Valori.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dove e` possibile:&lt;br /&gt;
* Visualizzare tutti i valori&lt;br /&gt;
* Creare il file &amp;quot;.csv&amp;quot; da elaborare successivamente tramite l'apposita pagina&lt;br /&gt;
* Eliminare i dati ormai obsoleti (attenzione che non ho filtrato le immissioni, e` possibile anche fare il contrario)&lt;br /&gt;
&lt;br /&gt;
== Tabella dati e valori ==&lt;br /&gt;
&lt;br /&gt;
Denominazione dei campi e attibuzione dei valori standard (piu` o meno)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;column-count:2;-moz-column-count:2;-webkit-column-count:2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tipo&lt;br /&gt;
|&lt;br /&gt;
* Temperatura&lt;br /&gt;
* PIR&lt;br /&gt;
* Finecorsa&lt;br /&gt;
* Proximity&lt;br /&gt;
* Livello&lt;br /&gt;
* Rele`&lt;br /&gt;
* Termostato&lt;br /&gt;
* Valvola&lt;br /&gt;
* Motore&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Descrizione&lt;br /&gt;
|&lt;br /&gt;
Breve (?) descrizione del segnale&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TipoIO&lt;br /&gt;
|&lt;br /&gt;
* I (Input/Ingresso)&lt;br /&gt;
* O (Output/Uscita)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segnale&lt;br /&gt;
|&lt;br /&gt;
* Analogico&lt;br /&gt;
* Digitale&lt;br /&gt;
* Testo&lt;br /&gt;
* I2C&lt;br /&gt;
* SPI&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Al momento l'ho soppresso, il tipo di segnale e` praticamente definito dal valore in entrata (per ora)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneC&lt;br /&gt;
|&lt;br /&gt;
* Casa&lt;br /&gt;
* Garage&lt;br /&gt;
* Giardino&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneP&lt;br /&gt;
|&lt;br /&gt;
* Piano0 / PianoZero&lt;br /&gt;
* Piano1 / PianoUno&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! PosizioneS&lt;br /&gt;
|&lt;br /&gt;
* Cucina1&lt;br /&gt;
* Camera2&lt;br /&gt;
* Bagno1&lt;br /&gt;
* ...&lt;br /&gt;
* Cantina&lt;br /&gt;
* EsternoSala&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID (Identificatore, Utenza/ITEM)&lt;br /&gt;
|&lt;br /&gt;
* 1&lt;br /&gt;
* 2&lt;br /&gt;
* 3&lt;br /&gt;
* ..&lt;br /&gt;
* Up&lt;br /&gt;
* Down&lt;br /&gt;
* Left&lt;br /&gt;
* Right&lt;br /&gt;
* (altro ?)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Convenzioni usate ad oggi:&lt;br /&gt;
* STn sonda/sensore temperatura [n = numero]&lt;br /&gt;
* RHn sonda/sensore umidita` relativa [n = numero]&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Definito dall'utente che programma i &amp;quot;remote&amp;quot;, ma meglio definire una struttura di base ..&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valori&lt;br /&gt;
|&lt;br /&gt;
* TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori&lt;br /&gt;
|&lt;br /&gt;
Assegnato automaticamente dal programma&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! UM (Unita` di Misura)&lt;br /&gt;
|&lt;br /&gt;
* °C&lt;br /&gt;
* V (tensione)&lt;br /&gt;
* A (assorbimento)&lt;br /&gt;
* ...&lt;br /&gt;
|&lt;br /&gt;
Questo e` previsto solo per le segnalazioni/avvisi/allarmi .. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! TempoRitardo (secondi)&lt;br /&gt;
|&lt;br /&gt;
* 0.000&lt;br /&gt;
* 1.002&lt;br /&gt;
* ...&lt;br /&gt;
* 99.000 (max impostabile)&lt;br /&gt;
|&lt;br /&gt;
Al momento non previsto, teoricamente i segnali dovrebbero arrivare gia` &amp;quot;filtrati&amp;quot; dai &amp;quot;remote&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! RangeValori&lt;br /&gt;
|&lt;br /&gt;
* 0,100&lt;br /&gt;
* -50,125&lt;br /&gt;
* 0,1&lt;br /&gt;
|&lt;br /&gt;
Da utilizzarsi per definire l'errore e generare una segnalazione di sonda guasta&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMin&lt;br /&gt;
|&lt;br /&gt;
* 10 (temperatura)&lt;br /&gt;
* 0 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sotto a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreMax&lt;br /&gt;
|&lt;br /&gt;
* 40 (temperatura)&lt;br /&gt;
* 1 (binari/digitali)&lt;br /&gt;
|&lt;br /&gt;
Sopra a questo valore dev'essere generato un'allarme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ValoreOn&lt;br /&gt;
|&lt;br /&gt;
* 1 (quando attivo a segnale on)&lt;br /&gt;
* 0 (quando attivo a segnale off)&lt;br /&gt;
* [Valore]&lt;br /&gt;
|&lt;br /&gt;
Valore da utilizzare per alert/alarm, e per definire se si tratta di un segnale negato (zero) e trattarlo di conseguenza&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Allarme&lt;br /&gt;
|&lt;br /&gt;
* ValoreOn&lt;br /&gt;
* ValoreMin&lt;br /&gt;
* ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin&lt;br /&gt;
* ValoreOn,ValoreMax&lt;br /&gt;
* ValoreOn,ValoreMin,ValoreMax&lt;br /&gt;
* ValoreMin,ValoreMax&lt;br /&gt;
|&lt;br /&gt;
Quali sono da trattare come allarmi, di default, se impostati, sono trattati come alert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data (e ora)&lt;br /&gt;
|&lt;br /&gt;
* 2016/03/13 20:40:08&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Valore&lt;br /&gt;
|&lt;br /&gt;
* 0&lt;br /&gt;
* 1&lt;br /&gt;
* 13&lt;br /&gt;
* ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Promemoria chiavi, codici e ... ==&lt;br /&gt;
&lt;br /&gt;
====== Dati (mqtt) ======&lt;br /&gt;
'''{ &amp;quot;ID&amp;quot; : &amp;quot;Identificatore&amp;quot;, &amp;quot;Valore&amp;quot; : &amp;quot;0&amp;quot; }'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Topic (mqtt) ======&lt;br /&gt;
'''TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria segnale di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori di livello 1 (redis) ======&lt;br /&gt;
'''TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria gruppi di livello 1 (redis) ======&lt;br /&gt;
;TYPE&lt;br /&gt;
:graph&lt;br /&gt;
:alarms&lt;br /&gt;
'''sets:TYPE:ID'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria configurazione gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Config'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Chiave primaria valori gruppi di livello 1 (redis) ======&lt;br /&gt;
'''sets:TYPE:ID:Valori'''&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Notes|Notes]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Primo avvio|Primo avvio]]&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/Test allarmi|Test allarmi]]&lt;br /&gt;
&lt;br /&gt;
= Devices =&lt;br /&gt;
&lt;br /&gt;
Ad oggi, ho predisposto/preparato:&lt;br /&gt;
* [[PorTHable]], che invia valori di temperatura&lt;br /&gt;
* [[ ESP8266/DS1820toMQTT | DS1820toMQTT ]], sensore/i di temperatura&lt;br /&gt;
* [[ ESP8266/PIRtoMQTT | PIRtoMQTT ]], sensore di movimento (PIR)&lt;br /&gt;
* [[ ESP8266/SerialToMQTT_Repeater | SerialToMQTT Repeater ]], che funziona da &amp;quot;repeater&amp;quot;, ritrasmette i dati ricevuti via seriale al broker MQTT&lt;br /&gt;
* [[ Thermo ]], che invia il valore della temperatura (solo di riferimento ad oggi, non le altre sonde)&lt;br /&gt;
* [[ ENC28J60-ATMEGA328P-DS18B20 | ENC28J60 + ATMEGA328P + DS18B20 ]], sensore di temperatura in ethernet&lt;br /&gt;
* [[ Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | ATMEGA328P + ESP8266 + DHT + Rain]], sensore temperatura/umidita` (dht) e pioggia (rain)&lt;br /&gt;
* [[ ESP8266/DHT22toMQTT | DHT22toMQTT ]], sensore di temperatura e umidita`&lt;br /&gt;
* [[ Centralina_livello_1/Dev_HTRL_wAE | ATMEGA328P + ESP8266 + DHT + Rain + Photoresistor]], sensore temperatura/umidita` (dht), pioggia (rain) e luminosita` (photoresistor).&amp;lt;br&amp;gt; Nuova e migliorata (?) versione del precedente [[Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | device]]&lt;br /&gt;
* [[ Cronotermostato settimanale ]]&lt;br /&gt;
* [[ Centralina_livello_1/Centralina_livello_2_PIR | Centralina livello 2 - PIR ]]&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
[[Centralina livello 1/telegram bot|Telegram Bot per Centralina livello 1]]&lt;br /&gt;
&lt;br /&gt;
= Problemi e soluzioni ? =&lt;br /&gt;
&lt;br /&gt;
;Eliminazione file di swap&lt;br /&gt;
:Non so se sia stato un problema e sia utile&lt;br /&gt;
::[[Raspberry_PI-Raspbian-Personalizzazioni#Disattivazione|Disattivazione file di swap]]&lt;br /&gt;
&lt;br /&gt;
;Redis - Errore salvataggio in background&lt;br /&gt;
:[https://jee-appy.blogspot.it/2016/04/can-not-save-in-background-fork-redis.html Can't save in background: fork: Cannot allocate memory Redis]&lt;br /&gt;
:[https://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory redis bgsave failed because fork Cannot allocate memory]&lt;br /&gt;
:[https://stackoverflow.com/questions/19581059/misconf-redis-is-configured-to-save-rdb-snapshots MISCONF Redis is configured to save RDB snapshots]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6589</id>
		<title>Raspberry Pi:network boot</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6589"/>
		<updated>2018-04-07T07:39:08Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* raspbian lite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi: Network boot (w/ debian 5) =&lt;br /&gt;
&lt;br /&gt;
[[Categoria:RPi]]&lt;br /&gt;
&lt;br /&gt;
Network boot realizzato con un server Debian Lenny (versione 5)&lt;br /&gt;
&lt;br /&gt;
Questa Debian Lenny, gia` configurata come server, fornisce i servizi DHCP, NFS e TFTP, quest'ultimo in particolare, invocato da &amp;quot;inetd&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
I pacchetti necessari dovrebbero essere: nfs-kernel-server dhcp3-server tftpd-hpa.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preparazione ==&lt;br /&gt;
&lt;br /&gt;
Occorre avviare il [[Raspberry Pi]] che s'intede utilizzare, verificando il numero &amp;quot;hardware address&amp;quot; della scheda di rete, un comando &amp;quot;ifconfig&amp;quot; lo mostra gia`, ed il seriale, che si ottiene leggendolo da &amp;quot;/proc/cpuinfo&amp;quot;, un &amp;quot;cat /proc/cpuinfo&amp;quot; e` sufficiente a leggerlo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== raspbian lite ===&lt;br /&gt;
&lt;br /&gt;
Scompattata lultima versione d'immagine raspberry pi, sono state copiate la &amp;quot;boot&amp;quot; in /var/lib/tftpboot/&amp;lt;seriale&amp;gt; e la root &amp;quot;/&amp;quot; in /opt/rpi/&amp;lt;seriale&amp;gt;, dove &amp;lt;seriale&amp;gt; e` il numero seriale del raspberry utilizzato.&lt;br /&gt;
&lt;br /&gt;
;Download&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
aria2c https://downloads.raspberrypi.org/raspbian_lite_latest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:oggi e` &amp;quot;2018-03-13-raspbian-stretch-lite.zip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Unzip&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
unzip -x 2018-03-13-raspbian-stretch-lite.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Mount&lt;br /&gt;
:Da qui, i comandi sono da eseguirsi come root&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
fdisk -l 2018-03-13-raspbian-stretch-lite.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Prendete nota dei numeri di &amp;quot;Boot Start&amp;quot; delle partizioni e montatele cosi`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t &amp;lt;filesystemtype&amp;gt; -o loop,offset=$((&amp;lt;start&amp;gt;*512)) &amp;lt;immagine&amp;gt; &amp;lt;punto di mount&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Per esempio&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t ext4 -o loop,offset=$((98304*512)) 2018-03-13-raspbian-stretch-lite.img /mnt&lt;br /&gt;
mount -t vfat -o loop,offset=$((8192*512)) 2018-03-13-raspbian-stretch-lite.img /mnt/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Copia&lt;br /&gt;
:Nelle destinazioni, si devono copiare i files (io ho rispettato i permessi e non scrivo il comando perche` ho usato un file manager).&lt;br /&gt;
::in &amp;quot;/opt/rpi/&amp;lt;seriale&amp;gt;&amp;quot;, copiate tutta la &amp;quot;root&amp;quot; (e` /mnt, dove avete montato il filesystem &amp;quot;/&amp;quot; dell'immagine), eliminando i files in &amp;quot;/boot&amp;quot; ma lasciando la directory.&lt;br /&gt;
::in &amp;quot;/var/lib/tftpboot/&amp;lt;seriale&amp;gt;, copiate il contenuto di &amp;quot;/mnt/boot&amp;quot;&lt;br /&gt;
;Modifica&lt;br /&gt;
:/var/lib/tftpboot/&amp;lt;seriale&amp;gt;/cmdline.txt&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.2.1:/opt/rpi/&amp;lt;seriale&amp;gt; rootfstype=ext3 rw ip=dhcp elevator=deadline rootwait&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Modifica&lt;br /&gt;
:/opt/rpi/&amp;lt;seriale&amp;gt;/etc/fstab &lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
proc            /proc           proc    defaults          0       0&lt;br /&gt;
192.168.2.1:/var/lib/tftpboot/&amp;lt;seriale&amp;gt;    /boot    nfs    defaults,vers=3    0    0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ricordate di sostituire &amp;lt;seriale&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== NFS ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/exports&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Raspberry Pi (1)&lt;br /&gt;
/opt/rpi/&amp;lt;seriale&amp;gt; 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
/var/lib/tftpboot/&amp;lt;seriale&amp;gt; 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poi i comandi seguenti, ricaricano la configurazione e mostrano quali sono le &amp;quot;esportazioni&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
exportfs -ra&lt;br /&gt;
exportfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DHCPD ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/dhcp3/dhcpd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
host rpi {&lt;br /&gt;
  hardware ethernet b8:27:eb:35:65:6a;  # hardware address&lt;br /&gt;
  option tftp-server-name &amp;quot;192.168.2.1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E il restart del demone (e` una debian 5, ricordate ?):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
/etc/init.d/dhcp3-server restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TFTP ===&lt;br /&gt;
&lt;br /&gt;
Era gia` attivo, la riga e` nel file &amp;quot;/etc/inetd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#:BOOT: TFTP service is provided primarily for booting.  Most sites&lt;br /&gt;
#       run this only on machines acting as &amp;quot;boot servers.&amp;quot;&lt;br /&gt;
tftp           dgram   udp     wait    root  /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SD Card ===&lt;br /&gt;
&lt;br /&gt;
Tranne la versione 3, per tutti i [[Raspberry Pi]] e` ncessario disporre di una SD Card formattata in fat32 con il file &amp;quot;bootcode.bin&amp;quot;, che potete copiare dalla &amp;quot;/boot&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un'esempio/promemoria di com'e` stata partizionata e feormattata la SD Card (report di &amp;quot;fdisk -l &amp;lt;sdcard&amp;gt;&amp;quot;, e creazione filesystem):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# fdisk -l /dev/mmcblk0&lt;br /&gt;
Disk /dev/mmcblk0: 241.3 MiB, 252968960 bytes, 494080 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0x3a2c78c6&lt;br /&gt;
&lt;br /&gt;
Device         Boot Start    End Sectors   Size Id Type&lt;br /&gt;
/dev/mmcblk0p1       2048 494079  492032 240.3M  b W95 FAT32&lt;br /&gt;
&lt;br /&gt;
# mkfs.vfat /dev/mmcblk0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== troubleshoot (risolvere i problemi) ==&lt;br /&gt;
&lt;br /&gt;
=== L'utente &amp;quot;pi&amp;quot; non ha permessi di scrittura nella propria &amp;quot;home&amp;quot; directory ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown pi:pi /home/pi&lt;br /&gt;
chown pi:pi /homepi.bash*&lt;br /&gt;
chown pi:pi /homepi.profile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi 3B+ ===&lt;br /&gt;
Gia` predisposto per l'avvio da rete se non trova una SD Card o altro, si avvia solo se trova il file &amp;quot;bootcode.bin&amp;quot; e lo cerca nella root del servizio &amp;quot;tftp&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Copiare il file &amp;quot;bootcode.bin&amp;quot; nella &amp;quot;/var/lib/tftpboot&amp;quot; (se e` la directory del vostro tftp).&lt;br /&gt;
&lt;br /&gt;
Dopodiche`, si comporta come gli altri, cerca la [sotto]directory col nome del suo numero seriale ..&lt;br /&gt;
&lt;br /&gt;
=== Permessi/Proprietario della/nella &amp;quot;/boot&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
L'errore e` capitato nell'upgrade del kernel:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
Removing 'diversion of /boot/overlays/w1-gpio.dtbo to /usr/share/rpikernelhack/overlays/w1-gpio.dtbo by rpikernelhack'&lt;br /&gt;
dpkg-divert: error: unable to change ownership of target file '/boot/overlays/w1-gpio.dtbo.dpkg-divert.tmp': Invalid argument&lt;br /&gt;
...&lt;br /&gt;
Removing 'diversion of /boot/start.elf to /usr/share/rpikernelhack/start.elf by rpikernelhack'&lt;br /&gt;
dpkg-divert: error: unable to change ownership of target file '/boot/start.elf.dpkg-divert.tmp': Invalid argument&lt;br /&gt;
Removing 'diversion of /boot/start_cd.elf to /usr/share/rpikernelhack/start_cd.elf by rpikernelhack'&lt;br /&gt;
dpkg-divert: error: unable to change ownership of target file '/boot/start_cd.elf.dpkg-divert.tmp': Invalid argument&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correggere il &amp;quot;mount&amp;quot; della directory nel file &amp;quot;fstab&amp;quot; (/opt/rpi/&amp;lt;seriale&amp;gt;/etc/fstab):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
proc            /proc           proc    defaults          0       0&lt;br /&gt;
192.168.4.1:/var/lib/tftpboot/&amp;lt;seriale&amp;gt;  /boot  nfs  defaults,vers=3  0  0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry_PI:_network_boot_explained]]&lt;br /&gt;
* [https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/ Raspberry Pi boot modes]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6588</id>
		<title>Raspberry Pi:network boot</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6588"/>
		<updated>2018-04-07T07:38:24Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* troubleshoot (risolvere i problemi) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi: Network boot (w/ debian 5) =&lt;br /&gt;
&lt;br /&gt;
[[Categoria:RPi]]&lt;br /&gt;
&lt;br /&gt;
Network boot realizzato con un server Debian Lenny (versione 5)&lt;br /&gt;
&lt;br /&gt;
Questa Debian Lenny, gia` configurata come server, fornisce i servizi DHCP, NFS e TFTP, quest'ultimo in particolare, invocato da &amp;quot;inetd&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
I pacchetti necessari dovrebbero essere: nfs-kernel-server dhcp3-server tftpd-hpa.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preparazione ==&lt;br /&gt;
&lt;br /&gt;
Occorre avviare il [[Raspberry Pi]] che s'intede utilizzare, verificando il numero &amp;quot;hardware address&amp;quot; della scheda di rete, un comando &amp;quot;ifconfig&amp;quot; lo mostra gia`, ed il seriale, che si ottiene leggendolo da &amp;quot;/proc/cpuinfo&amp;quot;, un &amp;quot;cat /proc/cpuinfo&amp;quot; e` sufficiente a leggerlo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== raspbian lite ===&lt;br /&gt;
&lt;br /&gt;
Scompattata lultima versione d'immagine raspberry pi, sono state copiate la &amp;quot;boot&amp;quot; in /var/lib/tftpboot/&amp;lt;seriale&amp;gt; e la root &amp;quot;/&amp;quot; in /opt/rpi/&amp;lt;seriale&amp;gt;, dove &amp;lt;seriale&amp;gt; e` il numero seriale del raspberry utilizzato.&lt;br /&gt;
&lt;br /&gt;
;Download&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
aria2c https://downloads.raspberrypi.org/raspbian_lite_latest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:oggi e` &amp;quot;2018-03-13-raspbian-stretch-lite.zip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Unzip&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
unzip -x 2018-03-13-raspbian-stretch-lite.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Mount&lt;br /&gt;
:Da qui, i comandi sono da eseguirsi come root&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
fdisk -l 2018-03-13-raspbian-stretch-lite.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Prendete nota dei numeri di &amp;quot;Boot Start&amp;quot; delle partizioni e montatele cosi`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t &amp;lt;filesystemtype&amp;gt; -o loop,offset=$((&amp;lt;start&amp;gt;*512)) &amp;lt;immagine&amp;gt; &amp;lt;punto di mount&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Per esempio&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t ext4 -o loop,offset=$((98304*512)) 2018-03-13-raspbian-stretch-lite.img /mnt&lt;br /&gt;
mount -t vfat -o loop,offset=$((8192*512)) 2018-03-13-raspbian-stretch-lite.img /mnt/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Copia&lt;br /&gt;
:Nelle destinazioni, si devono copiare i files (io ho rispettato i permessi e non scrivo il comando perche` ho usato un file manager).&lt;br /&gt;
::in &amp;quot;/opt/rpi/&amp;lt;seriale&amp;gt;&amp;quot;, copiate tutta la &amp;quot;root&amp;quot; (e` /mnt, dove avete montato il filesystem &amp;quot;/&amp;quot; dell'immagine), eliminando i files in &amp;quot;/boot&amp;quot; ma lasciando la directory.&lt;br /&gt;
::in &amp;quot;/var/lib/tftpboot/&amp;lt;seriale&amp;gt;, copiate il contenuto di &amp;quot;/mnt/boot&amp;quot;&lt;br /&gt;
;Modifica&lt;br /&gt;
:/var/lib/tftpboot/&amp;lt;seriale&amp;gt;/cmdline.txt&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.2.1:/opt/rpi/&amp;lt;seriale&amp;gt; rootfstype=ext3 rw ip=dhcp elevator=deadline rootwait&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Modifica&lt;br /&gt;
:/opt/rpi/&amp;lt;seriale&amp;gt;/etc/fstab &lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
proc            /proc           proc    defaults          0       0&lt;br /&gt;
192.168.2.1:/var/lib/tftpboot/&amp;lt;seriale&amp;gt;    /boot    nfs    defaults    0    0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ricordate di sostituire &amp;lt;seriale&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== NFS ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/exports&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Raspberry Pi (1)&lt;br /&gt;
/opt/rpi/&amp;lt;seriale&amp;gt; 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
/var/lib/tftpboot/&amp;lt;seriale&amp;gt; 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poi i comandi seguenti, ricaricano la configurazione e mostrano quali sono le &amp;quot;esportazioni&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
exportfs -ra&lt;br /&gt;
exportfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DHCPD ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/dhcp3/dhcpd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
host rpi {&lt;br /&gt;
  hardware ethernet b8:27:eb:35:65:6a;  # hardware address&lt;br /&gt;
  option tftp-server-name &amp;quot;192.168.2.1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E il restart del demone (e` una debian 5, ricordate ?):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
/etc/init.d/dhcp3-server restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TFTP ===&lt;br /&gt;
&lt;br /&gt;
Era gia` attivo, la riga e` nel file &amp;quot;/etc/inetd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#:BOOT: TFTP service is provided primarily for booting.  Most sites&lt;br /&gt;
#       run this only on machines acting as &amp;quot;boot servers.&amp;quot;&lt;br /&gt;
tftp           dgram   udp     wait    root  /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SD Card ===&lt;br /&gt;
&lt;br /&gt;
Tranne la versione 3, per tutti i [[Raspberry Pi]] e` ncessario disporre di una SD Card formattata in fat32 con il file &amp;quot;bootcode.bin&amp;quot;, che potete copiare dalla &amp;quot;/boot&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un'esempio/promemoria di com'e` stata partizionata e feormattata la SD Card (report di &amp;quot;fdisk -l &amp;lt;sdcard&amp;gt;&amp;quot;, e creazione filesystem):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# fdisk -l /dev/mmcblk0&lt;br /&gt;
Disk /dev/mmcblk0: 241.3 MiB, 252968960 bytes, 494080 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0x3a2c78c6&lt;br /&gt;
&lt;br /&gt;
Device         Boot Start    End Sectors   Size Id Type&lt;br /&gt;
/dev/mmcblk0p1       2048 494079  492032 240.3M  b W95 FAT32&lt;br /&gt;
&lt;br /&gt;
# mkfs.vfat /dev/mmcblk0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== troubleshoot (risolvere i problemi) ==&lt;br /&gt;
&lt;br /&gt;
=== L'utente &amp;quot;pi&amp;quot; non ha permessi di scrittura nella propria &amp;quot;home&amp;quot; directory ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown pi:pi /home/pi&lt;br /&gt;
chown pi:pi /homepi.bash*&lt;br /&gt;
chown pi:pi /homepi.profile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi 3B+ ===&lt;br /&gt;
Gia` predisposto per l'avvio da rete se non trova una SD Card o altro, si avvia solo se trova il file &amp;quot;bootcode.bin&amp;quot; e lo cerca nella root del servizio &amp;quot;tftp&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Copiare il file &amp;quot;bootcode.bin&amp;quot; nella &amp;quot;/var/lib/tftpboot&amp;quot; (se e` la directory del vostro tftp).&lt;br /&gt;
&lt;br /&gt;
Dopodiche`, si comporta come gli altri, cerca la [sotto]directory col nome del suo numero seriale ..&lt;br /&gt;
&lt;br /&gt;
=== Permessi/Proprietario della/nella &amp;quot;/boot&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
L'errore e` capitato nell'upgrade del kernel:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
Removing 'diversion of /boot/overlays/w1-gpio.dtbo to /usr/share/rpikernelhack/overlays/w1-gpio.dtbo by rpikernelhack'&lt;br /&gt;
dpkg-divert: error: unable to change ownership of target file '/boot/overlays/w1-gpio.dtbo.dpkg-divert.tmp': Invalid argument&lt;br /&gt;
...&lt;br /&gt;
Removing 'diversion of /boot/start.elf to /usr/share/rpikernelhack/start.elf by rpikernelhack'&lt;br /&gt;
dpkg-divert: error: unable to change ownership of target file '/boot/start.elf.dpkg-divert.tmp': Invalid argument&lt;br /&gt;
Removing 'diversion of /boot/start_cd.elf to /usr/share/rpikernelhack/start_cd.elf by rpikernelhack'&lt;br /&gt;
dpkg-divert: error: unable to change ownership of target file '/boot/start_cd.elf.dpkg-divert.tmp': Invalid argument&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Correggere il &amp;quot;mount&amp;quot; della directory nel file &amp;quot;fstab&amp;quot; (/opt/rpi/&amp;lt;seriale&amp;gt;/etc/fstab):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
proc            /proc           proc    defaults          0       0&lt;br /&gt;
192.168.4.1:/var/lib/tftpboot/&amp;lt;seriale&amp;gt;  /boot  nfs  defaults,vers=3  0  0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry_PI:_network_boot_explained]]&lt;br /&gt;
* [https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/ Raspberry Pi boot modes]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6571</id>
		<title>Raspberry Pi:network boot</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6571"/>
		<updated>2018-04-03T09:44:39Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* troubleshoot (risolvere i problemi) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi: Network boot (w/ debian 5) =&lt;br /&gt;
&lt;br /&gt;
[[Categoria:RPi]]&lt;br /&gt;
&lt;br /&gt;
Network boot realizzato con un server Debian Lenny (versione 5)&lt;br /&gt;
&lt;br /&gt;
Questa Debian Lenny, gia` configurata come server, fornisce i servizi DHCP, NFS e TFTP, quest'ultimo in particolare, invocato da &amp;quot;inetd&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
I pacchetti necessari dovrebbero essere: nfs-kernel-server dhcp3-server tftpd-hpa.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preparazione ==&lt;br /&gt;
&lt;br /&gt;
Occorre avviare il [[Raspberry Pi]] che s'intede utilizzare, verificando il numero &amp;quot;hardware address&amp;quot; della scheda di rete, un comando &amp;quot;ifconfig&amp;quot; lo mostra gia`, ed il seriale, che si ottiene leggendolo da &amp;quot;/proc/cpuinfo&amp;quot;, un &amp;quot;cat /proc/cpuinfo&amp;quot; e` sufficiente a leggerlo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== raspbian lite ===&lt;br /&gt;
&lt;br /&gt;
Scompattata lultima versione d'immagine raspberry pi, sono state copiate la &amp;quot;boot&amp;quot; in /var/lib/tftpboot/&amp;lt;seriale&amp;gt; e la root &amp;quot;/&amp;quot; in /opt/rpi/&amp;lt;seriale&amp;gt;, dove &amp;lt;seriale&amp;gt; e` il numero seriale del raspberry utilizzato.&lt;br /&gt;
&lt;br /&gt;
;Download&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
aria2c https://downloads.raspberrypi.org/raspbian_lite_latest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:oggi e` &amp;quot;2018-03-13-raspbian-stretch-lite.zip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Unzip&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
unzip -x 2018-03-13-raspbian-stretch-lite.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Mount&lt;br /&gt;
:Da qui, i comandi sono da eseguirsi come root&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
fdisk -l 2018-03-13-raspbian-stretch-lite.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Prendete nota dei numeri di &amp;quot;Boot Start&amp;quot; delle partizioni e montatele cosi`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t &amp;lt;filesystemtype&amp;gt; -o loop,offset=$((&amp;lt;start&amp;gt;*512)) &amp;lt;immagine&amp;gt; &amp;lt;punto di mount&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Per esempio&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t ext4 -o loop,offset=$((98304*512)) 2018-03-13-raspbian-stretch-lite.img /mnt&lt;br /&gt;
mount -t vfat -o loop,offset=$((8192*512)) 2018-03-13-raspbian-stretch-lite.img /mnt/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Copia&lt;br /&gt;
:Nelle destinazioni, si devono copiare i files (io ho rispettato i permessi e non scrivo il comando perche` ho usato un file manager).&lt;br /&gt;
::in &amp;quot;/opt/rpi/&amp;lt;seriale&amp;gt;&amp;quot;, copiate tutta la &amp;quot;root&amp;quot; (e` /mnt, dove avete montato il filesystem &amp;quot;/&amp;quot; dell'immagine), eliminando i files in &amp;quot;/boot&amp;quot; ma lasciando la directory.&lt;br /&gt;
::in &amp;quot;/var/lib/tftpboot/&amp;lt;seriale&amp;gt;, copiate il contenuto di &amp;quot;/mnt/boot&amp;quot;&lt;br /&gt;
;Modifica&lt;br /&gt;
:/var/lib/tftpboot/&amp;lt;seriale&amp;gt;/cmdline.txt&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.2.1:/opt/rpi/&amp;lt;seriale&amp;gt; rootfstype=ext3 rw ip=dhcp elevator=deadline rootwait&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Modifica&lt;br /&gt;
:/opt/rpi/&amp;lt;seriale&amp;gt;/etc/fstab &lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
proc            /proc           proc    defaults          0       0&lt;br /&gt;
192.168.2.1:/var/lib/tftpboot/&amp;lt;seriale&amp;gt;    /boot    nfs    defaults    0    0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ricordate di sostituire &amp;lt;seriale&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== NFS ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/exports&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Raspberry Pi (1)&lt;br /&gt;
/opt/rpi/&amp;lt;seriale&amp;gt; 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
/var/lib/tftpboot/&amp;lt;seriale&amp;gt; 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poi i comandi seguenti, ricaricano la configurazione e mostrano quali sono le &amp;quot;esportazioni&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
exportfs -ra&lt;br /&gt;
exportfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DHCPD ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/dhcp3/dhcpd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
host rpi {&lt;br /&gt;
  hardware ethernet b8:27:eb:35:65:6a;  # hardware address&lt;br /&gt;
  option tftp-server-name &amp;quot;192.168.2.1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E il restart del demone (e` una debian 5, ricordate ?):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
/etc/init.d/dhcp3-server restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TFTP ===&lt;br /&gt;
&lt;br /&gt;
Era gia` attivo, la riga e` nel file &amp;quot;/etc/inetd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#:BOOT: TFTP service is provided primarily for booting.  Most sites&lt;br /&gt;
#       run this only on machines acting as &amp;quot;boot servers.&amp;quot;&lt;br /&gt;
tftp           dgram   udp     wait    root  /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SD Card ===&lt;br /&gt;
&lt;br /&gt;
Tranne la versione 3, per tutti i [[Raspberry Pi]] e` ncessario disporre di una SD Card formattata in fat32 con il file &amp;quot;bootcode.bin&amp;quot;, che potete copiare dalla &amp;quot;/boot&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un'esempio/promemoria di com'e` stata partizionata e feormattata la SD Card (report di &amp;quot;fdisk -l &amp;lt;sdcard&amp;gt;&amp;quot;, e creazione filesystem):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# fdisk -l /dev/mmcblk0&lt;br /&gt;
Disk /dev/mmcblk0: 241.3 MiB, 252968960 bytes, 494080 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0x3a2c78c6&lt;br /&gt;
&lt;br /&gt;
Device         Boot Start    End Sectors   Size Id Type&lt;br /&gt;
/dev/mmcblk0p1       2048 494079  492032 240.3M  b W95 FAT32&lt;br /&gt;
&lt;br /&gt;
# mkfs.vfat /dev/mmcblk0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== troubleshoot (risolvere i problemi) ==&lt;br /&gt;
&lt;br /&gt;
;L'utente &amp;quot;pi&amp;quot; non ha permessi di scrittura nella propria &amp;quot;home&amp;quot; directory&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown pi:pi /home/pi&lt;br /&gt;
chown pi:pi /homepi.bash*&lt;br /&gt;
chown pi:pi /homepi.profile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Raspberry Pi 3B+&lt;br /&gt;
:Gia` predisposto per l'avvio da rete se non trova una SD Card o altro, si avvia solo se trova il file &amp;quot;bootcode.bin&amp;quot; e lo cerca nella root del servizio &amp;quot;tftp&amp;quot;.&lt;br /&gt;
:Copiare il file &amp;quot;bootcode.bin&amp;quot; nella &amp;quot;/var/lib/tftpboot&amp;quot; (se e` la directory del vostro tftp).&lt;br /&gt;
:Dopodiche`, si comporta come gli altri, cerca la [sotto]directory col nome del suo numero seriale ..&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry_PI:_network_boot_explained]]&lt;br /&gt;
* [https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/ Raspberry Pi boot modes]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6544</id>
		<title>Raspberry Pi:network boot</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6544"/>
		<updated>2018-03-25T05:48:03Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi: Network boot (w/ debian 5) =&lt;br /&gt;
&lt;br /&gt;
[[Categoria:RPi]]&lt;br /&gt;
&lt;br /&gt;
Network boot realizzato con un server Debian Lenny (versione 5)&lt;br /&gt;
&lt;br /&gt;
Questa Debian Lenny, gia` configurata come server, fornisce i servizi DHCP, NFS e TFTP, quest'ultimo in particolare, invocato da &amp;quot;inetd&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
I pacchetti necessari dovrebbero essere: nfs-kernel-server dhcp3-server tftpd-hpa.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preparazione ==&lt;br /&gt;
&lt;br /&gt;
Occorre avviare il [[Raspberry Pi]] che s'intede utilizzare, verificando il numero &amp;quot;hardware address&amp;quot; della scheda di rete, un comando &amp;quot;ifconfig&amp;quot; lo mostra gia`, ed il seriale, che si ottiene leggendolo da &amp;quot;/proc/cpuinfo&amp;quot;, un &amp;quot;cat /proc/cpuinfo&amp;quot; e` sufficiente a leggerlo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== raspbian lite ===&lt;br /&gt;
&lt;br /&gt;
Scompattata lultima versione d'immagine raspberry pi, sono state copiate la &amp;quot;boot&amp;quot; in /var/lib/tftpboot/&amp;lt;seriale&amp;gt; e la root &amp;quot;/&amp;quot; in /opt/rpi/&amp;lt;seriale&amp;gt;, dove &amp;lt;seriale&amp;gt; e` il numero seriale del raspberry utilizzato.&lt;br /&gt;
&lt;br /&gt;
;Download&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
aria2c https://downloads.raspberrypi.org/raspbian_lite_latest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:oggi e` &amp;quot;2018-03-13-raspbian-stretch-lite.zip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Unzip&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
unzip -x 2018-03-13-raspbian-stretch-lite.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Mount&lt;br /&gt;
:Da qui, i comandi sono da eseguirsi come root&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
fdisk -l 2018-03-13-raspbian-stretch-lite.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Prendete nota dei numeri di &amp;quot;Boot Start&amp;quot; delle partizioni e montatele cosi`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t &amp;lt;filesystemtype&amp;gt; -o loop,offset=$((&amp;lt;start&amp;gt;*512)) &amp;lt;immagine&amp;gt; &amp;lt;punto di mount&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Per esempio&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t ext4 -o loop,offset=$((98304*512)) 2018-03-13-raspbian-stretch-lite.img /mnt&lt;br /&gt;
mount -t vfat -o loop,offset=$((8192*512)) 2018-03-13-raspbian-stretch-lite.img /mnt/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Copia&lt;br /&gt;
:Nelle destinazioni, si devono copiare i files (io ho rispettato i permessi e non scrivo il comando perche` ho usato un file manager).&lt;br /&gt;
::in &amp;quot;/opt/rpi/&amp;lt;seriale&amp;gt;&amp;quot;, copiate tutta la &amp;quot;root&amp;quot; (e` /mnt, dove avete montato il filesystem &amp;quot;/&amp;quot; dell'immagine), eliminando i files in &amp;quot;/boot&amp;quot; ma lasciando la directory.&lt;br /&gt;
::in &amp;quot;/var/lib/tftpboot/&amp;lt;seriale&amp;gt;, copiate il contenuto di &amp;quot;/mnt/boot&amp;quot;&lt;br /&gt;
;Modifica&lt;br /&gt;
:/var/lib/tftpboot/&amp;lt;seriale&amp;gt;/cmdline.txt&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.2.1:/opt/rpi/&amp;lt;seriale&amp;gt; rootfstype=ext3 rw ip=dhcp elevator=deadline rootwait&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Modifica&lt;br /&gt;
:/opt/rpi/&amp;lt;seriale&amp;gt;/etc/fstab &lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
proc            /proc           proc    defaults          0       0&lt;br /&gt;
192.168.2.1:/var/lib/tftpboot/&amp;lt;seriale&amp;gt;    /boot    nfs    defaults    0    0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ricordate di sostituire &amp;lt;seriale&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== NFS ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/exports&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Raspberry Pi (1)&lt;br /&gt;
/opt/rpi/&amp;lt;seriale&amp;gt; 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
/var/lib/tftpboot/&amp;lt;seriale&amp;gt; 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poi i comandi seguenti, ricaricano la configurazione e mostrano quali sono le &amp;quot;esportazioni&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
exportfs -ra&lt;br /&gt;
exportfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DHCPD ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/dhcp3/dhcpd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
host rpi {&lt;br /&gt;
  hardware ethernet b8:27:eb:35:65:6a;  # hardware address&lt;br /&gt;
  option tftp-server-name &amp;quot;192.168.2.1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E il restart del demone (e` una debian 5, ricordate ?):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
/etc/init.d/dhcp3-server restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TFTP ===&lt;br /&gt;
&lt;br /&gt;
Era gia` attivo, la riga e` nel file &amp;quot;/etc/inetd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#:BOOT: TFTP service is provided primarily for booting.  Most sites&lt;br /&gt;
#       run this only on machines acting as &amp;quot;boot servers.&amp;quot;&lt;br /&gt;
tftp           dgram   udp     wait    root  /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SD Card ===&lt;br /&gt;
&lt;br /&gt;
Tranne la versione 3, per tutti i [[Raspberry Pi]] e` ncessario disporre di una SD Card formattata in fat32 con il file &amp;quot;bootcode.bin&amp;quot;, che potete copiare dalla &amp;quot;/boot&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un'esempio/promemoria di com'e` stata partizionata e feormattata la SD Card (report di &amp;quot;fdisk -l &amp;lt;sdcard&amp;gt;&amp;quot;, e creazione filesystem):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# fdisk -l /dev/mmcblk0&lt;br /&gt;
Disk /dev/mmcblk0: 241.3 MiB, 252968960 bytes, 494080 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0x3a2c78c6&lt;br /&gt;
&lt;br /&gt;
Device         Boot Start    End Sectors   Size Id Type&lt;br /&gt;
/dev/mmcblk0p1       2048 494079  492032 240.3M  b W95 FAT32&lt;br /&gt;
&lt;br /&gt;
# mkfs.vfat /dev/mmcblk0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== troubleshoot (risolvere i problemi) ==&lt;br /&gt;
&lt;br /&gt;
;L'utente &amp;quot;pi&amp;quot; non ha permessi di scrittura nella propria &amp;quot;home&amp;quot; directory&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown pi:pi /home/pi&lt;br /&gt;
chown pi:pi /homepi.bash*&lt;br /&gt;
chown pi:pi /homepi.profile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry_PI:_network_boot_explained]]&lt;br /&gt;
* [https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/ Raspberry Pi boot modes]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6543</id>
		<title>Raspberry Pi:network boot</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6543"/>
		<updated>2018-03-24T19:09:24Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* raspbian lite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi: Network boot (w/ debian 5) =&lt;br /&gt;
&lt;br /&gt;
[[Categoria:RPi]]&lt;br /&gt;
&lt;br /&gt;
Network boot realizzato con un server Debian Lenny (versione 5)&lt;br /&gt;
&lt;br /&gt;
Questa Debian Lenny, gia` configurata come server, fornisce i servizi DHCP, NFS e TFTP, quest'ultimo in particolare, invocato da &amp;quot;inetd&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
I pacchetti necessari dovrebbero essere: nfs-kernel-server dhcp3-server tftpd-hpa.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preparazione ==&lt;br /&gt;
&lt;br /&gt;
Occorre avviare il [[Raspberry Pi]] che s'intede utilizzare, verificando il numero &amp;quot;hardware address&amp;quot; della scheda di rete, un comando &amp;quot;ifconfig&amp;quot; lo mostra gia`, ed il seriale, che si ottiene leggendolo da &amp;quot;/proc/cpuinfo&amp;quot;, un &amp;quot;cat /proc/cpuinfo&amp;quot; e` sufficiente a leggerlo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== raspbian lite ===&lt;br /&gt;
&lt;br /&gt;
Scompattata lultima versione d'immagine raspberry pi, sono state copiate la &amp;quot;boot&amp;quot; in /var/lib/tftpboot/&amp;lt;seriale&amp;gt; e la root &amp;quot;/&amp;quot; in /opt/rpi/&amp;lt;seriale&amp;gt;, dove &amp;lt;seriale&amp;gt; e` il numero seriale del raspberry utilizzato.&lt;br /&gt;
&lt;br /&gt;
;Download&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
aria2c https://downloads.raspberrypi.org/raspbian_lite_latest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:oggi e` &amp;quot;2018-03-13-raspbian-stretch-lite.zip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Unzip&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
unzip -x 2018-03-13-raspbian-stretch-lite.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Mount&lt;br /&gt;
:Da qui, i comandi sono da eseguirsi come root&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
fdisk -l 2018-03-13-raspbian-stretch-lite.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Prendete nota dei numeri di &amp;quot;Boot Start&amp;quot; delle partizioni e montatele cosi`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t &amp;lt;filesystemtype&amp;gt; -o loop,offset=$((&amp;lt;start&amp;gt;*512)) &amp;lt;immagine&amp;gt; &amp;lt;punto di mount&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Per esempio&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t ext4 -o loop,offset=$((98304*512)) 2018-03-13-raspbian-stretch-lite.img /mnt&lt;br /&gt;
mount -t vfat -o loop,offset=$((8192*512)) 2018-03-13-raspbian-stretch-lite.img /mnt/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Copia&lt;br /&gt;
:Nelle destinazioni, si devono copiare i files (io ho rispettato i permessi e non scrivo il comando perche` ho usato un file manager).&lt;br /&gt;
::in &amp;quot;/opt/rpi/&amp;lt;seriale&amp;gt;&amp;quot;, copiate tutta la &amp;quot;root&amp;quot; (e` /mnt, dove avete montato il filesystem &amp;quot;/&amp;quot; dell'immagine), eliminando i files in &amp;quot;/boot&amp;quot; ma lasciando la directory.&lt;br /&gt;
::in &amp;quot;/var/lib/tftpboot/&amp;lt;seriale&amp;gt;, copiate il contenuto di &amp;quot;/mnt/boot&amp;quot;&lt;br /&gt;
;Modifica&lt;br /&gt;
:/var/lib/tftpboot/&amp;lt;seriale&amp;gt;/cmdline.txt&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.2.1:/opt/rpi/&amp;lt;seriale&amp;gt; rootfstype=ext3 rw ip=dhcp elevator=deadline rootwait&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Modifica&lt;br /&gt;
:/opt/rpi/&amp;lt;seriale&amp;gt;/etc/fstab &lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
proc            /proc           proc    defaults          0       0&lt;br /&gt;
192.168.2.1:/var/lib/tftpboot/&amp;lt;seriale&amp;gt;    /boot    nfs    defaults    0    0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ricordate di sostituire &amp;lt;seriale&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== NFS ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/exports&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Raspberry Pi (1)&lt;br /&gt;
/opt/rpi/7a35656a 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
/var/lib/tftpboot/7a35656a 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poi i comandi seguenti, ricaricano la configurazione e mostrano quali sono le &amp;quot;esportazioni&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
exportfs -ra&lt;br /&gt;
exportfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DHCPD ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/dhcp3/dhcpd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
host rpi {&lt;br /&gt;
  hardware ethernet b8:27:eb:35:65:6a;  # hardware address&lt;br /&gt;
  option tftp-server-name &amp;quot;192.168.2.1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E il restart del demone (e` una debian 5, ricordate ?):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
/etc/init.d/dhcp3-server restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TFTP ===&lt;br /&gt;
&lt;br /&gt;
Era gia` attivo, la riga e` nel file &amp;quot;/etc/inetd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#:BOOT: TFTP service is provided primarily for booting.  Most sites&lt;br /&gt;
#       run this only on machines acting as &amp;quot;boot servers.&amp;quot;&lt;br /&gt;
tftp           dgram   udp     wait    root  /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SD Card ===&lt;br /&gt;
&lt;br /&gt;
Tranne la versione 3, per tutti i [[Raspberry Pi]] e` ncessario disporre di una SD Card formattata in fat32 con il file &amp;quot;bootcode.bin&amp;quot;, che potete copiare dalla &amp;quot;/boot&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un'esempio/promemoria di com'e` stata partizionata e feormattata la SD Card (report di &amp;quot;fdisk -l &amp;lt;sdcard&amp;gt;&amp;quot;, e creazione filesystem):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# fdisk -l /dev/mmcblk0&lt;br /&gt;
Disk /dev/mmcblk0: 241.3 MiB, 252968960 bytes, 494080 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0x3a2c78c6&lt;br /&gt;
&lt;br /&gt;
Device         Boot Start    End Sectors   Size Id Type&lt;br /&gt;
/dev/mmcblk0p1       2048 494079  492032 240.3M  b W95 FAT32&lt;br /&gt;
&lt;br /&gt;
# mkfs.vfat /dev/mmcblk0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== troubleshoot (risolvere i problemi) ==&lt;br /&gt;
&lt;br /&gt;
;L'utente &amp;quot;pi&amp;quot; non ha permessi di scrittura nella propria &amp;quot;home&amp;quot; directory&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown pi:pi /home/pi&lt;br /&gt;
chown pi:pi /homepi.bash*&lt;br /&gt;
chown pi:pi /homepi.profile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry_PI:_network_boot_explained]]&lt;br /&gt;
* [https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/ Raspberry Pi boot modes]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6542</id>
		<title>Raspberry Pi:network boot</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6542"/>
		<updated>2018-03-24T19:08:42Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* raspbian lite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi: Network boot (w/ debian 5) =&lt;br /&gt;
&lt;br /&gt;
[[Categoria:RPi]]&lt;br /&gt;
&lt;br /&gt;
Network boot realizzato con un server Debian Lenny (versione 5)&lt;br /&gt;
&lt;br /&gt;
Questa Debian Lenny, gia` configurata come server, fornisce i servizi DHCP, NFS e TFTP, quest'ultimo in particolare, invocato da &amp;quot;inetd&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
I pacchetti necessari dovrebbero essere: nfs-kernel-server dhcp3-server tftpd-hpa.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preparazione ==&lt;br /&gt;
&lt;br /&gt;
Occorre avviare il [[Raspberry Pi]] che s'intede utilizzare, verificando il numero &amp;quot;hardware address&amp;quot; della scheda di rete, un comando &amp;quot;ifconfig&amp;quot; lo mostra gia`, ed il seriale, che si ottiene leggendolo da &amp;quot;/proc/cpuinfo&amp;quot;, un &amp;quot;cat /proc/cpuinfo&amp;quot; e` sufficiente a leggerlo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== raspbian lite ===&lt;br /&gt;
&lt;br /&gt;
Scompattata lultima versione d'immagine raspberry pi, sono state copiate la &amp;quot;boot&amp;quot; in /var/lib/tftpboot/&amp;lt;seriale&amp;gt; e la root &amp;quot;/&amp;quot; in /opt/rpi/&amp;lt;seriale&amp;gt;, dove &amp;lt;seriale&amp;gt; e` il numero seriale del raspberry utilizzato.&lt;br /&gt;
&lt;br /&gt;
;Download&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
aria2c https://downloads.raspberrypi.org/raspbian_lite_latest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:oggi e` &amp;quot;2018-03-13-raspbian-stretch-lite.zip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Unzip&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
unzip -x 2018-03-13-raspbian-stretch-lite.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Mount&lt;br /&gt;
:Da qui, i comandi sono da eseguirsi come root&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
fdisk -l 2018-03-13-raspbian-stretch-lite.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Prendete nota dei numeri di &amp;quot;Boot Start&amp;quot; delle partizioni e montatele cosi`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t &amp;lt;filesystemtype&amp;gt; -o loop,offset=$((&amp;lt;start&amp;gt;*512)) &amp;lt;immagine&amp;gt; &amp;lt;punto di mount&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Per esempio&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t ext4 -o loop,offset=$((98304*512)) 2018-03-13-raspbian-stretch-lite.img /mnt&lt;br /&gt;
mount -t vfat -o loop,offset=$((8192*512)) 2018-03-13-raspbian-stretch-lite.img /mnt/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Copia&lt;br /&gt;
:Nelle destinazioni, si devono copiare i files (io ho rispettato i permessi e non scrivo il comando perche` ho usato un file manager).&lt;br /&gt;
::in &amp;quot;/opt/rpi/&amp;lt;seriale&amp;gt;&amp;quot;, copiate tutta la &amp;quot;root&amp;quot; (e` /mnt, dove avete montato il filesystem &amp;quot;/&amp;quot; dell'immagine), eliminando i files in &amp;quot;/boot&amp;quot; ma lasciando la directory.&lt;br /&gt;
::in &amp;quot;/var/lib/tftpboot/&amp;lt;seriale&amp;gt;, copiate il contenuto di &amp;quot;/mnt/boot&amp;quot;&lt;br /&gt;
;Modifica&lt;br /&gt;
:/var/lib/tftpboot/&amp;lt;seriale&amp;gt;/cmdline.txt&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.2.1:/opt/rpi/7a35656a rootfstype=ext3 rw ip=dhcp elevator=deadline rootwait&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
;Modifica&lt;br /&gt;
:/opt/rpi/&amp;lt;seriale&amp;gt;/etc/fstab &lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
proc            /proc           proc    defaults          0       0&lt;br /&gt;
192.168.2.1:/var/lib/tftpboot/&amp;lt;seriale&amp;gt;    /boot    nfs    defaults    0    0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ricordate di sostituire &amp;lt;seriale&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== NFS ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/exports&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Raspberry Pi (1)&lt;br /&gt;
/opt/rpi/7a35656a 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
/var/lib/tftpboot/7a35656a 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poi i comandi seguenti, ricaricano la configurazione e mostrano quali sono le &amp;quot;esportazioni&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
exportfs -ra&lt;br /&gt;
exportfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DHCPD ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/dhcp3/dhcpd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
host rpi {&lt;br /&gt;
  hardware ethernet b8:27:eb:35:65:6a;  # hardware address&lt;br /&gt;
  option tftp-server-name &amp;quot;192.168.2.1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E il restart del demone (e` una debian 5, ricordate ?):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
/etc/init.d/dhcp3-server restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TFTP ===&lt;br /&gt;
&lt;br /&gt;
Era gia` attivo, la riga e` nel file &amp;quot;/etc/inetd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#:BOOT: TFTP service is provided primarily for booting.  Most sites&lt;br /&gt;
#       run this only on machines acting as &amp;quot;boot servers.&amp;quot;&lt;br /&gt;
tftp           dgram   udp     wait    root  /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SD Card ===&lt;br /&gt;
&lt;br /&gt;
Tranne la versione 3, per tutti i [[Raspberry Pi]] e` ncessario disporre di una SD Card formattata in fat32 con il file &amp;quot;bootcode.bin&amp;quot;, che potete copiare dalla &amp;quot;/boot&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un'esempio/promemoria di com'e` stata partizionata e feormattata la SD Card (report di &amp;quot;fdisk -l &amp;lt;sdcard&amp;gt;&amp;quot;, e creazione filesystem):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# fdisk -l /dev/mmcblk0&lt;br /&gt;
Disk /dev/mmcblk0: 241.3 MiB, 252968960 bytes, 494080 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0x3a2c78c6&lt;br /&gt;
&lt;br /&gt;
Device         Boot Start    End Sectors   Size Id Type&lt;br /&gt;
/dev/mmcblk0p1       2048 494079  492032 240.3M  b W95 FAT32&lt;br /&gt;
&lt;br /&gt;
# mkfs.vfat /dev/mmcblk0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== troubleshoot (risolvere i problemi) ==&lt;br /&gt;
&lt;br /&gt;
;L'utente &amp;quot;pi&amp;quot; non ha permessi di scrittura nella propria &amp;quot;home&amp;quot; directory&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown pi:pi /home/pi&lt;br /&gt;
chown pi:pi /homepi.bash*&lt;br /&gt;
chown pi:pi /homepi.profile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry_PI:_network_boot_explained]]&lt;br /&gt;
* [https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/ Raspberry Pi boot modes]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6541</id>
		<title>Raspberry Pi:network boot</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6541"/>
		<updated>2018-03-24T18:43:41Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi: Network boot (w/ debian 5) =&lt;br /&gt;
&lt;br /&gt;
[[Categoria:RPi]]&lt;br /&gt;
&lt;br /&gt;
Network boot realizzato con un server Debian Lenny (versione 5)&lt;br /&gt;
&lt;br /&gt;
Questa Debian Lenny, gia` configurata come server, fornisce i servizi DHCP, NFS e TFTP, quest'ultimo in particolare, invocato da &amp;quot;inetd&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
I pacchetti necessari dovrebbero essere: nfs-kernel-server dhcp3-server tftpd-hpa.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preparazione ==&lt;br /&gt;
&lt;br /&gt;
Occorre avviare il [[Raspberry Pi]] che s'intede utilizzare, verificando il numero &amp;quot;hardware address&amp;quot; della scheda di rete, un comando &amp;quot;ifconfig&amp;quot; lo mostra gia`, ed il seriale, che si ottiene leggendolo da &amp;quot;/proc/cpuinfo&amp;quot;, un &amp;quot;cat /proc/cpuinfo&amp;quot; e` sufficiente a leggerlo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== raspbian lite ===&lt;br /&gt;
&lt;br /&gt;
Scompattata lultima versione d'immagine raspberry pi, sono state copiate la &amp;quot;boot&amp;quot; in /var/lib/tftpboot/&amp;lt;seriale&amp;gt; e la root &amp;quot;/&amp;quot; in /opt/rpi/&amp;lt;seriale&amp;gt;, dove &amp;lt;seriale&amp;gt; e` il numero seriale del raspberry utilizzato.&lt;br /&gt;
&lt;br /&gt;
;Download&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
aria2c https://downloads.raspberrypi.org/raspbian_lite_latest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:oggi e` &amp;quot;2018-03-13-raspbian-stretch-lite.zip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Unzip&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
unzip -x 2018-03-13-raspbian-stretch-lite.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Mount&lt;br /&gt;
:Da qui, i comandi sono da eseguirsi come root&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
fdisk -l 2018-03-13-raspbian-stretch-lite.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Prendete nota dei numeri di &amp;quot;Boot Start&amp;quot; delle partizioni e montatele cosi`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t &amp;lt;filesystemtype&amp;gt; -o loop,offset=$((&amp;lt;start&amp;gt;*512)) &amp;lt;immagine&amp;gt; &amp;lt;punto di mount&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Per esempio&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t ext4 -o loop,offset=$((98304*512)) 2018-03-13-raspbian-stretch-lite.img /mnt&lt;br /&gt;
mount -t vfat -o loop,offset=$((8192*512)) 2018-03-13-raspbian-stretch-lite.img /mnt/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Copia&lt;br /&gt;
:Nelle destinazioni, si devono copiare i files (io ho rispettato i permessi e non scrivo il comando perche` ho usato un file manager).&lt;br /&gt;
::in &amp;quot;/opt/rpi/&amp;lt;seriale&amp;gt;&amp;quot;, copiate tutta la &amp;quot;root&amp;quot; (e` /mnt, dove avete montato il filesystem &amp;quot;/&amp;quot; dell'immagine), eliminando i files in &amp;quot;/boot&amp;quot; ma lasciando la directory.&lt;br /&gt;
::in &amp;quot;/var/lib/tftpboot/&amp;lt;seriale&amp;gt;, copiate il contenuto di &amp;quot;/mnt/boot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== NFS ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/exports&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Raspberry Pi (1)&lt;br /&gt;
/opt/rpi/7a35656a 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
/var/lib/tftpboot/7a35656a 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poi i comandi seguenti, ricaricano la configurazione e mostrano quali sono le &amp;quot;esportazioni&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
exportfs -ra&lt;br /&gt;
exportfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DHCPD ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/dhcp3/dhcpd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
host rpi {&lt;br /&gt;
  hardware ethernet b8:27:eb:35:65:6a;  # hardware address&lt;br /&gt;
  option tftp-server-name &amp;quot;192.168.2.1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E il restart del demone (e` una debian 5, ricordate ?):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
/etc/init.d/dhcp3-server restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TFTP ===&lt;br /&gt;
&lt;br /&gt;
Era gia` attivo, la riga e` nel file &amp;quot;/etc/inetd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#:BOOT: TFTP service is provided primarily for booting.  Most sites&lt;br /&gt;
#       run this only on machines acting as &amp;quot;boot servers.&amp;quot;&lt;br /&gt;
tftp           dgram   udp     wait    root  /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SD Card ===&lt;br /&gt;
&lt;br /&gt;
Tranne la versione 3, per tutti i [[Raspberry Pi]] e` ncessario disporre di una SD Card formattata in fat32 con il file &amp;quot;bootcode.bin&amp;quot;, che potete copiare dalla &amp;quot;/boot&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un'esempio/promemoria di com'e` stata partizionata e feormattata la SD Card (report di &amp;quot;fdisk -l &amp;lt;sdcard&amp;gt;&amp;quot;, e creazione filesystem):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# fdisk -l /dev/mmcblk0&lt;br /&gt;
Disk /dev/mmcblk0: 241.3 MiB, 252968960 bytes, 494080 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0x3a2c78c6&lt;br /&gt;
&lt;br /&gt;
Device         Boot Start    End Sectors   Size Id Type&lt;br /&gt;
/dev/mmcblk0p1       2048 494079  492032 240.3M  b W95 FAT32&lt;br /&gt;
&lt;br /&gt;
# mkfs.vfat /dev/mmcblk0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== troubleshoot (risolvere i problemi) ==&lt;br /&gt;
&lt;br /&gt;
;L'utente &amp;quot;pi&amp;quot; non ha permessi di scrittura nella propria &amp;quot;home&amp;quot; directory&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
chown pi:pi /home/pi&lt;br /&gt;
chown pi:pi /homepi.bash*&lt;br /&gt;
chown pi:pi /homepi.profile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry_PI:_network_boot_explained]]&lt;br /&gt;
* [https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/ Raspberry Pi boot modes]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6540</id>
		<title>Raspberry Pi:network boot</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6540"/>
		<updated>2018-03-24T17:54:10Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* SD Card */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi: Network boot (w/ debian 5) =&lt;br /&gt;
&lt;br /&gt;
[[Categoria:RPi]]&lt;br /&gt;
&lt;br /&gt;
Network boot realizzato con un server Debian Lenny (versione 5)&lt;br /&gt;
&lt;br /&gt;
Questa Debian Lenny, gia` configurata come server, fornisce i servizi DHCP, NFS e TFTP, quest'ultimo in particolare, invocato da &amp;quot;inetd&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
I pacchetti necessari dovrebbero essere: nfs-kernel-server dhcp3-server tftpd-hpa.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preparazione ==&lt;br /&gt;
&lt;br /&gt;
Occorre avviare il [[Raspberry Pi]] che s'intede utilizzare, verificando il numero &amp;quot;hardware address&amp;quot; della scheda di rete, un comando &amp;quot;ifconfig&amp;quot; lo mostra gia`, ed il seriale, che si ottiene leggendolo da &amp;quot;/proc/cpuinfo&amp;quot;, un &amp;quot;cat /proc/cpuinfo&amp;quot; e` sufficiente a leggerlo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== raspbian lite ===&lt;br /&gt;
&lt;br /&gt;
Scompattata lultima versione d'immagine raspberry pi, sono state copiate la &amp;quot;boot&amp;quot; in /var/lib/tftpboot/&amp;lt;seriale&amp;gt; e la root &amp;quot;/&amp;quot; in /opt/rpi/&amp;lt;seriale&amp;gt;, dove &amp;lt;seriale&amp;gt; e` il numero seriale del raspberry utilizzato.&lt;br /&gt;
&lt;br /&gt;
;Download&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
aria2c https://downloads.raspberrypi.org/raspbian_lite_latest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:oggi e` &amp;quot;2018-03-13-raspbian-stretch-lite.zip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Unzip&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
unzip -x 2018-03-13-raspbian-stretch-lite.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Mount&lt;br /&gt;
:Da qui, i comandi sono da eseguirsi come root&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
fdisk -l 2018-03-13-raspbian-stretch-lite.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Prendete nota dei numeri di &amp;quot;Boot Start&amp;quot; delle partizioni e montatele cosi`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t &amp;lt;filesystemtype&amp;gt; -o loop,offset=$((&amp;lt;start&amp;gt;*512)) &amp;lt;immagine&amp;gt; &amp;lt;punto di mount&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Per esempio&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t ext4 -o loop,offset=$((98304*512)) 2018-03-13-raspbian-stretch-lite.img /mnt&lt;br /&gt;
mount -t vfat -o loop,offset=$((8192*512)) 2018-03-13-raspbian-stretch-lite.img /mnt/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Copia&lt;br /&gt;
:Nelle destinazioni, si devono copiare i files (io ho rispettato i permessi e non scrivo il comando perche` ho usato un file manager).&lt;br /&gt;
::in &amp;quot;/opt/rpi/&amp;lt;seriale&amp;gt;&amp;quot;, copiate tutta la &amp;quot;root&amp;quot; (e` /mnt, dove avete montato il filesystem &amp;quot;/&amp;quot; dell'immagine), eliminando i files in &amp;quot;/boot&amp;quot; ma lasciando la directory.&lt;br /&gt;
::in &amp;quot;/var/lib/tftpboot/&amp;lt;seriale&amp;gt;, copiate il contenuto di &amp;quot;/mnt/boot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== NFS ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/exports&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Raspberry Pi (1)&lt;br /&gt;
/opt/rpi/7a35656a 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
/var/lib/tftpboot/7a35656a 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poi i comandi seguenti, ricaricano la configurazione e mostrano quali sono le &amp;quot;esportazioni&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
exportfs -ra&lt;br /&gt;
exportfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DHCPD ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/dhcp3/dhcpd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
host rpi {&lt;br /&gt;
  hardware ethernet b8:27:eb:35:65:6a;  # hardware address&lt;br /&gt;
  option tftp-server-name &amp;quot;192.168.2.1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E il restart del demone (e` una debian 5, ricordate ?):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
/etc/init.d/dhcp3-server restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TFTP ===&lt;br /&gt;
&lt;br /&gt;
Era gia` attivo, la riga e` nel file &amp;quot;/etc/inetd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#:BOOT: TFTP service is provided primarily for booting.  Most sites&lt;br /&gt;
#       run this only on machines acting as &amp;quot;boot servers.&amp;quot;&lt;br /&gt;
tftp           dgram   udp     wait    root  /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SD Card ===&lt;br /&gt;
&lt;br /&gt;
Tranne la versione 3, per tutti i [[Raspberry Pi]] e` ncessario disporre di una SD Card formattata in fat32 con il file &amp;quot;bootcode.bin&amp;quot;, che potete copiare dalla &amp;quot;/boot&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un'esempio/promemoria di com'e` stata partizionata e feormattata la SD Card (report di &amp;quot;fdisk -l &amp;lt;sdcard&amp;gt;&amp;quot;, e creazione filesystem):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# fdisk -l /dev/mmcblk0&lt;br /&gt;
Disk /dev/mmcblk0: 241.3 MiB, 252968960 bytes, 494080 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0x3a2c78c6&lt;br /&gt;
&lt;br /&gt;
Device         Boot Start    End Sectors   Size Id Type&lt;br /&gt;
/dev/mmcblk0p1       2048 494079  492032 240.3M  b W95 FAT32&lt;br /&gt;
&lt;br /&gt;
# mkfs.vfat /dev/mmcblk0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry_PI:_network_boot_explained]]&lt;br /&gt;
* [https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/ Raspberry Pi boot modes]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6539</id>
		<title>Raspberry Pi:network boot</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6539"/>
		<updated>2018-03-24T17:27:27Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi: Network boot (w/ debian 5) =&lt;br /&gt;
&lt;br /&gt;
[[Categoria:RPi]]&lt;br /&gt;
&lt;br /&gt;
Network boot realizzato con un server Debian Lenny (versione 5)&lt;br /&gt;
&lt;br /&gt;
Questa Debian Lenny, gia` configurata come server, fornisce i servizi DHCP, NFS e TFTP, quest'ultimo in particolare, invocato da &amp;quot;inetd&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
I pacchetti necessari dovrebbero essere: nfs-kernel-server dhcp3-server tftpd-hpa.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preparazione ==&lt;br /&gt;
&lt;br /&gt;
Occorre avviare il [[Raspberry Pi]] che s'intede utilizzare, verificando il numero &amp;quot;hardware address&amp;quot; della scheda di rete, un comando &amp;quot;ifconfig&amp;quot; lo mostra gia`, ed il seriale, che si ottiene leggendolo da &amp;quot;/proc/cpuinfo&amp;quot;, un &amp;quot;cat /proc/cpuinfo&amp;quot; e` sufficiente a leggerlo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== raspbian lite ===&lt;br /&gt;
&lt;br /&gt;
Scompattata lultima versione d'immagine raspberry pi, sono state copiate la &amp;quot;boot&amp;quot; in /var/lib/tftpboot/&amp;lt;seriale&amp;gt; e la root &amp;quot;/&amp;quot; in /opt/rpi/&amp;lt;seriale&amp;gt;, dove &amp;lt;seriale&amp;gt; e` il numero seriale del raspberry utilizzato.&lt;br /&gt;
&lt;br /&gt;
;Download&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
aria2c https://downloads.raspberrypi.org/raspbian_lite_latest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:oggi e` &amp;quot;2018-03-13-raspbian-stretch-lite.zip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Unzip&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
unzip -x 2018-03-13-raspbian-stretch-lite.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Mount&lt;br /&gt;
:Da qui, i comandi sono da eseguirsi come root&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
fdisk -l 2018-03-13-raspbian-stretch-lite.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Prendete nota dei numeri di &amp;quot;Boot Start&amp;quot; delle partizioni e montatele cosi`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t &amp;lt;filesystemtype&amp;gt; -o loop,offset=$((&amp;lt;start&amp;gt;*512)) &amp;lt;immagine&amp;gt; &amp;lt;punto di mount&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Per esempio&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t ext4 -o loop,offset=$((98304*512)) 2018-03-13-raspbian-stretch-lite.img /mnt&lt;br /&gt;
mount -t vfat -o loop,offset=$((8192*512)) 2018-03-13-raspbian-stretch-lite.img /mnt/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Copia&lt;br /&gt;
:Nelle destinazioni, si devono copiare i files (io ho rispettato i permessi e non scrivo il comando perche` ho usato un file manager).&lt;br /&gt;
::in &amp;quot;/opt/rpi/&amp;lt;seriale&amp;gt;&amp;quot;, copiate tutta la &amp;quot;root&amp;quot; (e` /mnt, dove avete montato il filesystem &amp;quot;/&amp;quot; dell'immagine), eliminando i files in &amp;quot;/boot&amp;quot; ma lasciando la directory.&lt;br /&gt;
::in &amp;quot;/var/lib/tftpboot/&amp;lt;seriale&amp;gt;, copiate il contenuto di &amp;quot;/mnt/boot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== NFS ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/exports&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Raspberry Pi (1)&lt;br /&gt;
/opt/rpi/7a35656a 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
/var/lib/tftpboot/7a35656a 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poi i comandi seguenti, ricaricano la configurazione e mostrano quali sono le &amp;quot;esportazioni&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
exportfs -ra&lt;br /&gt;
exportfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DHCPD ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/dhcp3/dhcpd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
host rpi {&lt;br /&gt;
  hardware ethernet b8:27:eb:35:65:6a;  # hardware address&lt;br /&gt;
  option tftp-server-name &amp;quot;192.168.2.1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E il restart del demone (e` una debian 5, ricordate ?):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
/etc/init.d/dhcp3-server restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TFTP ===&lt;br /&gt;
&lt;br /&gt;
Era gia` attivo, la riga e` nel file &amp;quot;/etc/inetd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#:BOOT: TFTP service is provided primarily for booting.  Most sites&lt;br /&gt;
#       run this only on machines acting as &amp;quot;boot servers.&amp;quot;&lt;br /&gt;
tftp           dgram   udp     wait    root  /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SD Card ===&lt;br /&gt;
&lt;br /&gt;
Tranne la versione 3, per tutti i [[Raspberry Pi]] e` ncessario disporre di una SD Card formattata in fat32 con il file &amp;quot;bootcode.bin&amp;quot;, che potete copiare dalla &amp;quot;/boot&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un'esempio (il report di &amp;quot;fdisk -l &amp;lt;sdcard&amp;gt;&amp;quot;):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# fdisk -l /dev/mmcblk0&lt;br /&gt;
Disk /dev/mmcblk0: 241.3 MiB, 252968960 bytes, 494080 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0x3a2c78c6&lt;br /&gt;
&lt;br /&gt;
Device         Boot Start    End Sectors   Size Id Type&lt;br /&gt;
/dev/mmcblk0p1       2048 494079  492032 240.3M  b W95 FAT32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry_PI:_network_boot_explained]]&lt;br /&gt;
* [https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/ Raspberry Pi boot modes]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6538</id>
		<title>Raspberry Pi:network boot</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi:network_boot&amp;diff=6538"/>
		<updated>2018-03-24T10:38:02Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: Creata pagina con '= Raspberry Pi: Network boot (w/ debian 5) =  Categoria:RPi  Network boot realizzato con un server Debian Etch (versione 5)  Questa Debian Etch, gia` configurata come serv...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspberry Pi: Network boot (w/ debian 5) =&lt;br /&gt;
&lt;br /&gt;
[[Categoria:RPi]]&lt;br /&gt;
&lt;br /&gt;
Network boot realizzato con un server Debian Etch (versione 5)&lt;br /&gt;
&lt;br /&gt;
Questa Debian Etch, gia` configurata come server, fornisce i servizi DHCP, NFS e TFTP, quest'ultimo in particolare, invocato da &amp;quot;inetd&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
I pacchetti necessari dovrebbero essere: nfs-kernel-server dhcp3-server tftpd-hpa.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preparazione ==&lt;br /&gt;
&lt;br /&gt;
Occorre avviare il [[Raspberry Pi]] che s'intede utilizzare, verificando il numero &amp;quot;hardware address&amp;quot; della scheda di rete, un comando &amp;quot;ifconfig&amp;quot; lo mostra gia`, ed il seriale, che si ottiene leggendolo da &amp;quot;/proc/cpuinfo&amp;quot;, un &amp;quot;cat /proc/cpuinfo&amp;quot; e` sufficiente a leggerlo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== raspbian lite ===&lt;br /&gt;
&lt;br /&gt;
Scompattata lultima versione d'immagine raspberry pi, sono state copiate la &amp;quot;boot&amp;quot; in /var/lib/tftpboot/&amp;lt;seriale&amp;gt; e la root &amp;quot;/&amp;quot; in /opt/rpi/&amp;lt;seriale&amp;gt;, dove &amp;lt;seriale&amp;gt; e` il numero seriale del raspberry utilizzato.&lt;br /&gt;
&lt;br /&gt;
;Download&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
aria2c https://downloads.raspberrypi.org/raspbian_lite_latest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:oggi e` &amp;quot;2018-03-13-raspbian-stretch-lite.zip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Unzip&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
unzip -x 2018-03-13-raspbian-stretch-lite.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Mount&lt;br /&gt;
:Da qui, i comandi sono da eseguirsi come root&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
fdisk -l 2018-03-13-raspbian-stretch-lite.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Prendete nota dei numeri di &amp;quot;Boot Start&amp;quot; delle partizioni e montatele cosi`:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t &amp;lt;filesystemtype&amp;gt; -o loop,offset=$((&amp;lt;start&amp;gt;*512)) &amp;lt;immagine&amp;gt; &amp;lt;punto di mount&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Per esempio&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
mount -t ext4 -o loop,offset=$((98304*512)) 2018-03-13-raspbian-stretch-lite.img /mnt&lt;br /&gt;
mount -t vfat -o loop,offset=$((8192*512)) 2018-03-13-raspbian-stretch-lite.img /mnt/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Copia&lt;br /&gt;
:Nelle destinazioni, si devono copiare i files (io ho ripettato i permessi e non scrivo il comando perche` ho usato un file manager).&lt;br /&gt;
::in &amp;quot;/opt/rpi/&amp;lt;seriale&amp;gt;&amp;quot;, copiate tutta la &amp;quot;root&amp;quot; (e` /mnt, dove avete montato il filesystem &amp;quot;/&amp;quot; dell'immagine), eliminando i files in &amp;quot;/boot&amp;quot; ma lasciando la directory.&lt;br /&gt;
::in &amp;quot;/var/lib/tftpboot/&amp;lt;seriale&amp;gt;, copiate il contenuto di &amp;quot;/mnt/boot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== NFS ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/exports&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# Raspberry Pi (1)&lt;br /&gt;
/opt/rpi/7a35656a 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
/var/lib/tftpboot/7a35656a 192.168.2.0/255.255.255.0(rw,no_subtree_check,no_root_squash,async)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Poi i comandi seguenti, ricaricano la configurazione e mostrano quali sono le &amp;quot;esportazioni&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
exportfs -ra&lt;br /&gt;
exportfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DHCPD ===&lt;br /&gt;
&lt;br /&gt;
Ho aggiunto queste righe al file &amp;quot;/etc/dhcp3/dhcpd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
host rpi {&lt;br /&gt;
  hardware ethernet b8:27:eb:35:65:6a;  # hardware address&lt;br /&gt;
  option tftp-server-name &amp;quot;192.168.2.1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E il restart del demone (e` una debian 5, ricordate ?):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
/etc/init.d/dhcp3-server restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TFTP ===&lt;br /&gt;
&lt;br /&gt;
Era gia` attivo, la riga e` nel file &amp;quot;/etc/inetd.conf&amp;quot;:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
#:BOOT: TFTP service is provided primarily for booting.  Most sites&lt;br /&gt;
#       run this only on machines acting as &amp;quot;boot servers.&amp;quot;&lt;br /&gt;
tftp           dgram   udp     wait    root  /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SD Card ===&lt;br /&gt;
&lt;br /&gt;
Tranne la versione 3, per tutti i [[Raspberry Pi]] e` ncessario disporre di una SD Card formattata in fat32 con il file &amp;quot;bootcode.bin&amp;quot;, che potete copiare dalla &amp;quot;/boot&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un'esempio (il report di &amp;quot;fdisk -l &amp;lt;sdcard&amp;gt;&amp;quot;):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;background-color:black;color:white;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
# fdisk -l /dev/mmcblk0&lt;br /&gt;
Disk /dev/mmcblk0: 241.3 MiB, 252968960 bytes, 494080 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0x3a2c78c6&lt;br /&gt;
&lt;br /&gt;
Device         Boot Start    End Sectors   Size Id Type&lt;br /&gt;
/dev/mmcblk0p1       2048 494079  492032 240.3M  b W95 FAT32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riferimenti ==&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry_PI:_network_boot_explained]]&lt;br /&gt;
* [https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/ Raspberry Pi boot modes]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi&amp;diff=6537</id>
		<title>Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Raspberry_Pi&amp;diff=6537"/>
		<updated>2018-03-24T09:08:10Z</updated>

		<summary type="html">&lt;p&gt;Dave4rp: /* Raspberry: root su hard disk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Alimentare il Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry_PI-Alimentazione|Alimentazione]]&lt;br /&gt;
* [[Alcuni dati sull'assorbimento del Raspberry PI]]&lt;br /&gt;
&lt;br /&gt;
=== Procurarsi una memoria di massa (SD Card)===&lt;br /&gt;
&lt;br /&gt;
Lista di schede funzionanti e non funzionanti: http://elinux.org/RPi_SD_cards&lt;br /&gt;
&lt;br /&gt;
Altro [http://openelec.tv/forum/124-raspberry-pi/40411-what-sd-card-works-for-you elenco] fatto da utenti [http://openelec.tv/ OpenElec] su RaspPi.&lt;br /&gt;
&lt;br /&gt;
=== Installazione e configurazione del Sistema Operativo ===&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry_PI-Raspbian-Installazione|Installazione Raspbian]]&lt;br /&gt;
* [[Raspberry_Pi-Raspbian_default_post-install|Raspbian default post-install]]&lt;br /&gt;
** [[Raspberry_PI-Raspbian-Configurazione|Configurazione Raspbian]]&lt;br /&gt;
** [[Raspberry_PI-Raspbian-Personalizzazioni|Configurazioni Personalizzate Raspbian]]&lt;br /&gt;
* [[Raspberry PI-Rasbian-Senza Monitor|Installazione/Uso Raspbian senza Monitor]]&lt;br /&gt;
** [[Raspberry_PI-Raspbian-Desktop_Remoto|Configurazione per utilizzo VNC (variante DHCP)]]&lt;br /&gt;
* [[Raspberry_PI-Raspbian-Upgrade|Upgrade Raspbian]]&lt;br /&gt;
* [[Raspberry_PI-Raspbian-Files_di_configurazione|Files di configurazione Raspbian]]&lt;br /&gt;
&lt;br /&gt;
* altra distro ..&lt;br /&gt;
** altra config ..&lt;br /&gt;
&lt;br /&gt;
=== Collegare il Raspberry PI (Periferiche) ===&lt;br /&gt;
&lt;br /&gt;
* Rete Ethernet&lt;br /&gt;
** [[Raspberry_PI-Rete_Ethernet|Collegamenti Ethernet]]&lt;br /&gt;
* Periferiche WiFi&lt;br /&gt;
** [[Raspberry_PI-WiFi_Client|Installazione e configurazione WiFi client]]&lt;br /&gt;
*Periferiche USB&lt;br /&gt;
**[[Huawei E353 HSPA+ Usb Stick|Chiavetta 3G Huawei E353]]&lt;br /&gt;
*Dischi fissi&lt;br /&gt;
** [[Raspberry PI-boot da piu' hard disk|boot da hard disk multipli]]&lt;br /&gt;
&lt;br /&gt;
Una valida lista di periferiche compatibili: http://elinux.org/RPi_VerifiedPeripherals&lt;br /&gt;
&lt;br /&gt;
Va in particolare tenuta in considerazione per verificare quali periferiche hanno problemi noti (se non è segnalata come non funzionante, ma è comunque supportato da Linux, probabilmente funzionerà)&lt;br /&gt;
&lt;br /&gt;
=== Audio ===&lt;br /&gt;
&lt;br /&gt;
* [[Uscita Audio Onboard]]&lt;br /&gt;
&lt;br /&gt;
=== Video ===&lt;br /&gt;
&lt;br /&gt;
* [[Gert's VGA board for Raspberry PI B+ using off the shelf components]]&lt;br /&gt;
* [[Convertitori HDMI to VGA]]&lt;br /&gt;
&lt;br /&gt;
=== Uso da &amp;quot;personal computer&amp;quot; (impariamo il linguaggio della shell) ===&lt;br /&gt;
=== Sviluppo di software con Raspberry PI ===&lt;br /&gt;
=== L'architettura del Raspberry PI ===&lt;br /&gt;
=== I bus: i2c (chiamato anche twi) ===&lt;br /&gt;
&lt;br /&gt;
[[Collegare dispositivi I2C]]&lt;br /&gt;
&lt;br /&gt;
[[Input analogico I2C: MCP3424]]&lt;br /&gt;
&lt;br /&gt;
[[GPIO aggiuntivi MCP23x17]]&lt;br /&gt;
&lt;br /&gt;
=== I bus: la porta seriale ===&lt;br /&gt;
&lt;br /&gt;
[[Collegare una porta seriale RS-232]]&lt;br /&gt;
&lt;br /&gt;
=== I bus: 1wire dallas ===&lt;br /&gt;
&lt;br /&gt;
[[1Wire e il sensore di temperatura ds18s10]]&lt;br /&gt;
&lt;br /&gt;
=== I bus: SPI ===&lt;br /&gt;
&lt;br /&gt;
[[Collegare dispositivi SPI]]&lt;br /&gt;
&lt;br /&gt;
[[Input Analogico SPI: gli integrati MCP300x]]&lt;br /&gt;
&lt;br /&gt;
[[GPIO aggiuntivi MCP23x17]]&lt;br /&gt;
&lt;br /&gt;
[[Nokia 5110 LCD 84x48 px]]&lt;br /&gt;
&lt;br /&gt;
=== Interfacciamento di sensori/attuatori ===&lt;br /&gt;
&lt;br /&gt;
[[Interfacciare una Fotoresistenza]]&lt;br /&gt;
&lt;br /&gt;
=== Raspberry Pi Boot Modes ===&lt;br /&gt;
&lt;br /&gt;
==== root &amp;quot;/&amp;quot; su hard disk ====&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry_PI-nfs_root|Installazione della root su nfs]]&lt;br /&gt;
* [[Raspberry PI-boot con piu' hard disk|Boot con piu' hard disk]]&lt;br /&gt;
&lt;br /&gt;
==== Network boot ====&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry_PI:_network_boot_explained]]&lt;br /&gt;
* [[Raspberry Pi:network boot]]&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting ===&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry_PI-Troubleshooting-Rete|Problemi di rete]]&lt;br /&gt;
* [[Raspberry_PI-Troubleshooting-AlimentazioneUSB|Problemi di alimentazione di dispositivi USB]]&lt;br /&gt;
* [[Raspberry Pi/Troubleshooting/Bootloader|Bootloader/Firmware]]&lt;br /&gt;
&lt;br /&gt;
=== Links utili ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.raspberrypi.org Raspberry Pi]&lt;br /&gt;
* [http://www.raspberrypi.org/resources/ Raspberry Pi (Resources)]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Raspberry_Pi Raspberry Pi (Wikipedia)]&lt;br /&gt;
* [http://elinux.org/RPi_Hub Raspberry Pi (elinux.org)]&lt;br /&gt;
* [http://code.google.com/p/webiopi/ webiopi (Raspberry Pi REST framework to control GPIO and more)]&lt;br /&gt;
* [https://projects.drogon.net/raspberry-pi/wiringpi/ WiringPi (wiring-like library written in C and should be usable from C++ and many other languages with suitable wrappers)]&lt;br /&gt;
* [http://www.themagpi.com/ TheMagPi (A Magazine for Raspberry Pi Users)]&lt;br /&gt;
* [http://www.cl.cam.ac.uk/freshers/raspberrypi/tutorials/os/ Un tutorial per la creazione di un sistema operativo (embrionale) in Assembler su RaspberryPi CC-3.0-by-sa]&lt;br /&gt;
* [http://www.intertech.com/Blog/intertechs-complete-raspberry-pi-materials-lab-10/ Intertech, 10 lezioni base (java)] (Il link punta all'ultimo, dove sono inclusi gli altri, le lezioni sono anche scaricabili)&lt;br /&gt;
* [http://raspmap.tsar.in/ Raspberry Pi component map]&lt;br /&gt;
* [http://pi.gadgetoid.com/pinout Raspberry Pi Pinout Rev.2]&lt;br /&gt;
* [http://lowvoltagelabs.com/2014/05/08/raspberry-pi-gpio-pinout-business-card/ Raspberry Pi Pinout Business Card (da infilzare nei pin)]&lt;/div&gt;</summary>
		<author><name>Dave4rp</name></author>
	</entry>
</feed>