Centralina livello 1: differenze tra le versioni

Da raspibo.
(Tools)
(Install)
 
(13 revisioni intermedie di un utente non mostrate)
Riga 50: Riga 50:
  
 
;Hardware
 
;Hardware
:[[Raspberry Pi 3]], perche` completa di WiFi e Bluetooth
+
:Versione 1 - [[Raspberry Pi 3]], perche` completa di WiFi e Bluetooth
 +
:Versione 2 (2018) - [[Raspberry Pi]] con chiavetta WiFi
  
 
;Software
 
;Software
Riga 61: Riga 62:
 
: ...
 
: ...
  
=== Access Point ===
+
<!-- Embedded page -->
 +
{{:Raspberry_Pi-Raspbian_default_post-install}}
 +
 
 +
== Access Point ==
  
 
Installato/configurato "[[Raspberry Pi Access Point WEP2]]", sfruttando il wifi integrato nel [[Raspberry Pi 3]].
 
Installato/configurato "[[Raspberry Pi Access Point WEP2]]", sfruttando il wifi integrato nel [[Raspberry Pi 3]].
  
Modificato il file "/etc/hosts", aggiunto il nome del pc, perche` i clients direttamente collegati possano utilizzare il nome e non l'indirizzo:
+
== Install ==
  
 +
Installazione dei pacchetti utili, necessari (e qualcuno inutile):
 +
<pre style="background-color:black;color:white;overflow:auto">
 +
sudo su
 +
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
 +
pip3 install python-telegram-bot pygal
 +
</pre>
 +
 +
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.
 +
 +
E` necessario scaricare il repository con i programmi (script python per lo piu`), si puo` fare da normale utente, per esempio:
 +
<pre style="background-color:black;color:white;overflow:auto">
 +
mkdir git
 +
cd git
 +
git clone https://github.com/raspibo/Livello1.git
 +
cd Livello1
 +
</pre>
 +
 +
==== Nginx ====
 +
 +
Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:
 +
<pre style="background-color:black;color:white;overflow:auto">
 +
sudo su
 +
cp etc/nginx/sites-available/level1 /etc/nginx/sites-available/
 +
ln -s /etc/nginx/sites-enabled/level1 /etc/nginx/sites-enabled/
 +
cp etc/nginx/dokuwiki* etc/nginx/fcgiwrap.conf /etc/nginx/
 +
rm /etc/nginx/sites-enabled/default
 +
</pre>
 +
 +
Abbiamo effettuato tutte le operazioni come "root", ma assicuratevi che il proprietario sia corretto, se non lo e`:
 +
<pre style="background-color:black;color:white;overflow:auto">
 +
sudo su
 +
chown root:root -R /etc/nginx/
 +
</pre>
 +
 +
Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:
 +
<pre style="background-color:black;color:white;overflow:auto">
 +
sudo sytemctl restart nginx
 +
</pre>
 +
dovrebbe funzionare.
 +
 +
==== Level1 (www) ====
 +
 +
Ho messo tutti i files/script nella directory del web server.
 +
 +
Li copiamo dal repository e settiamo il giusto proprietario:
 +
<pre style="background-color:black;color:white;overflow:auto">
 +
sudo su
 +
cp -vapu var/www/ /var/
 +
chown www-data:www-data -R /var/www/
 +
</pre>
 +
 +
Serve anche la scrittura in "www":
 +
<pre style="background-color:black;color:white;overflow:auto">
 +
sudo su
 +
chmod 775 /var/www
 +
chown :www-data -R /var/www    # oppure si poteva eliminare il "/" dal "chown" precedente
 +
</pre>
 +
 +
;Nota
 +
:I permessi sono 755, quindi i files sono eseguibili da chiunque.
 +
:Potrebbe essere necessario creare la directory "/var/www/archive"
 +
 +
==== Avvio ====
 +
 +
All'avvio del sistema, devono andare in esecuzione alcuni script (quasi "daemons") e rimanere attivi, per questo si deve modificare il file "/etc/rc.local" (lo trovate nel repository git):
 +
 +
;/etc/rc.local
 +
:Ho aggiunto le seguenti righe prima della "exit 0"
 
<pre style="color:green;overflow:auto">
 
<pre style="color:green;overflow:auto">
127.0.0.1      localhost
+
# Power On "Level 1"
::1             localhost ip6-localhost ip6-loopback
+
DAEMON_NAME=mqtt2redis_d
ff02::1         ip6-allnodes
+
PID=`ps -e -o pid,cmd | grep "$DAEMON_NAME[.]py" | awk '{ print $1 }'`
ff02::2        ip6-allrouters
+
if [ $PID ]
 +
        then
 +
                echo "Non si e\` avviata correttamente Livello 1, oppure mqtt2redis_d e\` gia\` avviato:"
 +
                echo "Actual PID is: $PID"
 +
        else
 +
                echo "Avvio \"mqtt2redis_d\""
 +
                #/var/www/cgi-bin/mqtt2redis_init.d.sh start # 20180115
 +
        su -c "/var/www/cgi-bin/mqtt2redis_init.d.sh start" pi
 +
                # .. e un messaggio a centred quando si [ri]avvia
 +
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type "alert" desc "Centralina level 1 [ri]avviata .." value "on" um "" date "$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)"
 +
fi
 +
 
 +
# Start Telegram Bot
 +
DAEMON_NAME=bot4livello1
 +
PID=`ps -e -o pid,cmd | grep "$DAEMON_NAME[.]py" | awk '{ print $1 }'`
 +
if [ $PID ]
 +
        then
 +
                echo "Non si e\` avviato il Telegram Bot, oppure era gia\` avviato:"
 +
                echo "Actual PID is: $PID"
 +
         else
 +
                echo "Avvio Telegram Bot"
 +
                cd /home/pi/project/csv2image2telegram
 +
                su pi -c "python3 bot4livello1.py &"
 +
                # .. e un messaggio a centred quando si [ri]avvia
 +
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type "alert" desc "Avvio bot4livello1.py" value "on" um "" date "$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)"
 +
                cd /
 +
fi
 +
</pre>
 +
 
 +
Inoltre, visto che puo` capitare s'interrompano, specialmente nelle prove di nuovi [[Centralina_livello_1#Devices|devices]], sono predisposti dei "check orari" che nel caso, li riavviano:
 +
<pre style="background-color:black;color:white;overflow:auto">
 +
sudo su
 +
cp -vapu etc/cron.hourly/mqtt2redis_check /etc/cron.hourly/
 +
cp -vapu etc/cron.hourly/bot4livello1_check /etc/cron.hourly/ # se installerete anche il bot telegram
 +
</pre>
  
#127.0.1.1      level1        # Ho dovuto eliminare il doppione
+
==== Backup ====
127.0.1.1      errorlevel
+
  
192.168.3.1    level1
+
Oltre ad un "backup" 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 "/root":
 +
<pre style="background-color:black;color:white;overflow:auto">
 +
sudo su
 +
cp -vapu etc/cron.daily/backupredis /etc/cron.daily/
 
</pre>
 
</pre>
Fra i clients il nome dovrebbe essere risolto automaticamente da "dnsmasq" (ricordarsi di verificare).
 
  
 
== Rete ==
 
== Rete ==
Riga 144: Riga 251:
  
 
valori che sono accodati ad ogni arrivo con l'aggiunta della data e ora, predisposti per una generazione di output in formato "csv".
 
valori che sono accodati ad ogni arrivo con l'aggiunta della data e ora, predisposti per una generazione di output in formato "csv".
 +
 +
== ''IMPORTANTE'' ==
 +
 +
''Quello che segue non e` aggiornato di pari passo con l'aggiornamento del software e quant'altro necessario.''
 +
 +
''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.''
  
 
== Segnali ==
 
== Segnali ==
Riga 150: Riga 263:
  
 
;Descrizione
 
;Descrizione
:Meglio se breve, perche` usata anche nei riferimenti dei grafici, non solo per gli allarmi
+
:Meglio se breve, perche` usata anche nei riferimenti dei grafici, non solo per gli allarmi (per esempio: "ST1 Cucina" per sensore temperatura in cucina)
 
;UM (Unita` di misura)
 
;UM (Unita` di misura)
 
;TempoRitardo
 
;TempoRitardo
Riga 159: Riga 272:
 
:Genera avviso/allarme se minore di o maggiore di
 
:Genera avviso/allarme se minore di o maggiore di
 
;ValoreMin
 
;ValoreMin
:Allarme se valore e` inferiore a quello impostato
+
:Avviso se valore e` inferiore a quello impostato
 
;ValoreMax
 
;ValoreMax
:Allarme se valore e` superiore a quello impostato
+
:Aavviso se valore e` superiore a quello impostato
 
;ValoreOn
 
;ValoreOn
 
:Previsto per i segnali analogici o negati
 
:Previsto per i segnali analogici o negati
:Allarme quando valore uguale a ValoreOn
+
:Avviso quando valore uguale a ValoreOn
 
;Allarme
 
;Allarme
:Predisposta ma non implementata
+
:Definire qua i valori che saranno usati come allarmi, per esempio: ValoreOn,ValoreMin
 +
:Se sono impostati, ma non indicati qua, sono emessi dei semplici avvisi
  
 
Esempio di una configurazione di sonda temperatura (ovviamente falsa):
 
Esempio di una configurazione di sonda temperatura (ovviamente falsa):
Riga 486: Riga 600:
 
! PosizioneP
 
! PosizioneP
 
|
 
|
* Piano0
+
* Piano0 / PianoZero
* Piano1
+
* Piano1 / PianoUno
 
* ...
 
* ...
 
|}
 
|}
Riga 498: Riga 612:
 
* Bagno1
 
* Bagno1
 
* ...
 
* ...
 +
* Cantina
 +
* EsternoSala
 
|}
 
|}
  
Riga 512: Riga 628:
 
* Right
 
* Right
 
* (altro ?)
 
* (altro ?)
 +
* ...
 +
 +
Convenzioni usate ad oggi:
 +
* STn sonda/sensore temperatura [n = numero]
 +
* RHn sonda/sensore umidita` relativa [n = numero]
 
* ...
 
* ...
 
|
 
|
Riga 672: Riga 793:
 
* [[ Centralina_livello_1/Dev_HTRL_wAE | ATMEGA328P + ESP8266 + DHT + Rain + Photoresistor]], sensore temperatura/umidita` (dht), pioggia (rain) e luminosita` (photoresistor).<br> Nuova e migliorata (?) versione del precedente [[Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | device]]
 
* [[ Centralina_livello_1/Dev_HTRL_wAE | ATMEGA328P + ESP8266 + DHT + Rain + Photoresistor]], sensore temperatura/umidita` (dht), pioggia (rain) e luminosita` (photoresistor).<br> Nuova e migliorata (?) versione del precedente [[Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | device]]
 
* [[ Cronotermostato settimanale ]]
 
* [[ Cronotermostato settimanale ]]
 +
* [[ Centralina_livello_1/Centralina_livello_2_PIR | Centralina livello 2 - PIR ]]
  
 
= Tools =
 
= Tools =
Riga 687: Riga 809:
 
:[https://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory redis bgsave failed because fork Cannot allocate memory]
 
:[https://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory redis bgsave failed because fork Cannot allocate memory]
 
:[https://stackoverflow.com/questions/19581059/misconf-redis-is-configured-to-save-rdb-snapshots MISCONF Redis is configured to save RDB snapshots]
 
:[https://stackoverflow.com/questions/19581059/misconf-redis-is-configured-to-save-rdb-snapshots MISCONF Redis is configured to save RDB snapshots]
 +
 +
;Redis - Errore avvio del server
 +
:Dopo un ripristino del sistema ho avuto dei problemi di permessi al file "dump.rdb" (che ho voluto ricopiare per riprendermi alcune impostazioni), ho reimpostato in "redis:redis" (directory "/var/lib/redis" inclusa) il proprietario e settato i permessi a 660.
 +
 +
;I daemon non vengono eseguiti dalle pagine web
 +
:Non sono stati corretti i permessi della directory del webserver "/var/www" [[#Level1_.28www.29]]

Versione attuale delle 16:22, 28 set 2020

Livello1-Debug.png

Centralina livello 1
Centralina generale (?) gestione segnali
Repository: https://github.com/raspibo/Livello1

Indice

[modifica] Centralina livello 1

ATTENZIONE
Tutte le immagini sono puramente indicative, il progetto e` in pieno sviluppo, tutto e` passibile di modifiche, anche sostanziali.
L'immagine di presentazione si riferisce alla sezione "debug", realizzata con Dokuwiki e (ad oggi) non fa parte del progetto (o si ?)


[modifica] Prima e sommaria descrizione

Centralina di controllo segnali.

(Ad oggi)
Acquisisce segnali, li suddivide in gruppi mono o multi utenza, dei quali: realizza grafici temporali, crea e gestisce allarmi.


Dal campo arrivano i valori della 'sensoristica' sottoforma di "Identificatore Valore", 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).

Acquisiti i sensori, e` possibile il loro raggruppamento (anche una sola utenza) ed il campionamento dei valori a tempi prestabiliti (generazione grafici tempo/valore).

Sempre previo raggruppamento (sempre "anche di un solo sensore"), 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).

E poi il resto .. che sarebbe di arrivare non solo a leggere/interpretare segnali, ma anche a pilotare utenze (luci, serrande, elettrodomestici, ...)

L'idea e` che tutto questo sia gestibile da:

  1. interfaccia web
    • browser
    • cellulare
  2. linea di comando
  3. terminali operatore (display+tastiere)
  4. pulsanti, lampade, selettori, ..
  5. ...

[modifica] Hardware e Software

Hardware
Versione 1 - Raspberry Pi 3, perche` completa di WiFi e Bluetooth
Versione 2 (2018) - Raspberry Pi con chiavetta WiFi
Software
MQTT Broker (Mosquitto), perche` in grado di dialogare con la maggior parte dei componenti (Arduino, ESP8266, eccetera)
Redis, perche` servira` un database di appoggio e manipolazione per alcuni dati, e perche` servira` una struttura dati "manipolabile" (dovremo poter aggiungere e togliere "campi:valori" ad una "chiave", e aggiungere/togliere chiavi a delle liste, ecc. ecc.)
Nginx, non si puo` fare senza web server
... e poi non so cos'altro
Script cgi
javascript
...

[modifica] Setup

Al primo avvio la nuova SD Card visualizza una schermata di "Resizing file system", seguito da un riavvio del sistema.

Al prompt si entra (login) con username pi, password raspberry e si procede ad una configurazione minima del sistema:

sudo su
raspi-config

Qualche esempio di cose da fare:

password
hostname <centred>
locale <en>
timezone <rome>
keyboard layout <en-US>
wifi country <it>

ed eventuali (SSH nella ultime release non e` attivo di default):

5 Interfacing options
P2 SSH Enable

Uscendo, il tool (raspi-config) richiede di riavviare il sistema.

[modifica] Upgrade

sudo su
apt-get update
apt-get upgrade
reboot # se ha aggiornato pacchetti del kernel, o in caso di dubbi

[modifica] Access Point

Installato/configurato "Raspberry Pi Access Point WEP2", sfruttando il wifi integrato nel Raspberry Pi 3.

[modifica] Install

Installazione dei pacchetti utili, necessari (e qualcuno inutile):

sudo su
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
pip3 install python-telegram-bot pygal

E` stato installato manualmente anche 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.

E` necessario scaricare il repository con i programmi (script python per lo piu`), si puo` fare da normale utente, per esempio:

mkdir git
cd git
git clone https://github.com/raspibo/Livello1.git
cd Livello1

[modifica] Nginx

Copiare i nuovi files di configurazione dal repository ed eliminare il web server configurato di default:

sudo su
cp etc/nginx/sites-available/level1 /etc/nginx/sites-available/
ln -s /etc/nginx/sites-enabled/level1 /etc/nginx/sites-enabled/
cp etc/nginx/dokuwiki* etc/nginx/fcgiwrap.conf /etc/nginx/
rm /etc/nginx/sites-enabled/default

Abbiamo effettuato tutte le operazioni come "root", ma assicuratevi che il proprietario sia corretto, se non lo e`:

sudo su
chown root:root -R /etc/nginx/

Potreste gia` riavviare il web server, ma non abbiamo ancora completato, riavvieremo il sistema alla fine di tutto, ma se volete:

sudo sytemctl restart nginx

dovrebbe funzionare.

[modifica] Level1 (www)

Ho messo tutti i files/script nella directory del web server.

Li copiamo dal repository e settiamo il giusto proprietario:

sudo su
cp -vapu var/www/ /var/
chown www-data:www-data -R /var/www/

Serve anche la scrittura in "www":

sudo su
chmod 775 /var/www
chown :www-data -R /var/www    # oppure si poteva eliminare il "/" dal "chown" precedente
Nota
I permessi sono 755, quindi i files sono eseguibili da chiunque.
Potrebbe essere necessario creare la directory "/var/www/archive"

[modifica] Avvio

All'avvio del sistema, devono andare in esecuzione alcuni script (quasi "daemons") e rimanere attivi, per questo si deve modificare il file "/etc/rc.local" (lo trovate nel repository git):

/etc/rc.local
Ho aggiunto le seguenti righe prima della "exit 0"
# Power On "Level 1"
DAEMON_NAME=mqtt2redis_d
PID=`ps -e -o pid,cmd | grep "$DAEMON_NAME[.]py" | awk '{ print $1 }'`
if [ $PID ]
        then
                echo "Non si e\` avviata correttamente Livello 1, oppure mqtt2redis_d e\` gia\` avviato:"
                echo "Actual PID is: $PID"
        else
                echo "Avvio \"mqtt2redis_d\""
                #/var/www/cgi-bin/mqtt2redis_init.d.sh start # 20180115
        su -c "/var/www/cgi-bin/mqtt2redis_init.d.sh start" pi
                # .. e un messaggio a centred quando si [ri]avvia
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type "alert" desc "Centralina level 1 [ri]avviata .." value "on" um "" date "$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)"
fi

# Start Telegram Bot
DAEMON_NAME=bot4livello1
PID=`ps -e -o pid,cmd | grep "$DAEMON_NAME[.]py" | awk '{ print $1 }'`
if [ $PID ]
        then
                echo "Non si e\` avviato il Telegram Bot, oppure era gia\` avviato:"
                echo "Actual PID is: $PID"
        else
                echo "Avvio Telegram Bot"
                cd /home/pi/project/csv2image2telegram
                su pi -c "python3 bot4livello1.py &"
                # .. e un messaggio a centred quando si [ri]avvia
                redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type "alert" desc "Avvio bot4livello1.py" value "on" um "" date "$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)"
                cd /
fi

Inoltre, visto che puo` capitare s'interrompano, specialmente nelle prove di nuovi devices, sono predisposti dei "check orari" che nel caso, li riavviano:

sudo su
cp -vapu etc/cron.hourly/mqtt2redis_check /etc/cron.hourly/
cp -vapu etc/cron.hourly/bot4livello1_check /etc/cron.hourly/ # se installerete anche il bot telegram

[modifica] Backup

Oltre ad un "backup" 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 "/root":

sudo su
cp -vapu etc/cron.daily/backupredis /etc/cron.daily/

[modifica]