Centralina livello 1: differenze tra le versioni

Da raspibo.
(Grafici (files .csv))
(Install)
 
(19 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 360: Riga 474:
 
Si puo` notare in esecuzione solo quello relativo ad una falsa sonda di temperatura, relativo ai [[Centralina livello 1/Test allarmi|test eseguiti]].
 
Si puo` notare in esecuzione solo quello relativo ad una falsa sonda di temperatura, relativo ai [[Centralina livello 1/Test allarmi|test eseguiti]].
  
L'eseguibile e` il "/var/www/cgi-bin/setsalarms_d.py".
+
L'eseguibile e` "/var/www/cgi-bin/setsalarms_d.py".
  
Perche` possa "funzionare" devono esistere alcuni requisiti:
+
=== setsalarms_d.py ===
 +
 
 +
Perche` possa "funzionare" servono alcuni requisiti:
 
*Deve esistere il gruppo ed avere una configurazione (che e` preimpostata alla creazione)
 
*Deve esistere il gruppo ed avere una configurazione (che e` preimpostata alla creazione)
 
*Il gruppo deve essere "on" o in modalita` "auto" (per default e` "off")
 
*Il gruppo deve essere "on" o in modalita` "auto" (per default e` "off")
 +
 +
Tutti sono avvisi (li ho chiamati "alert"), alcuni possono e devono invece diventare allarmi ("alarm"). Perche` siano definiti allarmi, devono essere inseriti nella voce "Allarme", presente nella configurazione della sonda (sensore, PIR, o quello che e`).
 +
 +
Tipi di "alert":
 +
;RangeValori
 +
:Deve essere specificato nella forma [-]Numero,[+-]Numero, una sonda 1wire pe esempio sarebbe: -55,+125
 +
:;Alert
 +
::Se il valore letto e` fuori dal range
 +
;ValoreMin
 +
:Deve essere specificato nella forma [-]Numero
 +
:;Alert/Alarm
 +
::Se il valore letto e` inferiore
 +
;ValoreMax
 +
:Deve essere specificato nella forma [-]Numero
 +
:;Alert/Alarm
 +
::Se il valore letto e` superiore
 +
;ValoreOn
 +
:0 o 1
 +
:Al momento e` previsto per sola sensoristica come: finecorsa, PIR, e altri segnali on/off
 +
:;Alert/Alarm
 +
::Se il valore letto e` uguale
 +
;Allarme
 +
:Quello che e` allarme e non semplice avviso:
 +
::ValoreOn
 +
::ValoreMin
 +
::ValoreMin,ValoreMax,ValoreOn
 +
::...
 +
 +
Per un'esempio di configurazione fate riferimento alla pagina [[Centralina livello 1/Test allarmi|Test Allarmi]].
 +
 +
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]].
  
 
== Analizza e Modifica Valori ==
 
== Analizza e Modifica Valori ==
Riga 453: Riga 600:
 
! PosizioneP
 
! PosizioneP
 
|
 
|
* Piano0
+
* Piano0 / PianoZero
* Piano1
+
* Piano1 / PianoUno
 
* ...
 
* ...
 
|}
 
|}
Riga 465: Riga 612:
 
* Bagno1
 
* Bagno1
 
* ...
 
* ...
 +
* Cantina
 +
* EsternoSala
 
|}
 
|}
  
Riga 479: Riga 628:
 
* Right
 
* Right
 
* (altro ?)
 
* (altro ?)
 +
* ...
 +
 +
Convenzioni usate ad oggi:
 +
* STn sonda/sensore temperatura [n = numero]
 +
* RHn sonda/sensore umidita` relativa [n = numero]
 
* ...
 
* ...
 
|
 
|
Riga 636: Riga 790:
 
* [[ ENC28J60-ATMEGA328P-DS18B20 | ENC28J60 + ATMEGA328P + DS18B20 ]], sensore di temperatura in ethernet
 
* [[ ENC28J60-ATMEGA328P-DS18B20 | ENC28J60 + ATMEGA328P + DS18B20 ]], sensore di temperatura in ethernet
 
* [[ Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | ATMEGA328P + ESP8266 + DHT + Rain]], sensore temperatura/umidita` (dht) e pioggia (rain)
 
* [[ Centralina_livello_1/ATMEGA328P-ESP8266-DHT-Rain | ATMEGA328P + ESP8266 + DHT + Rain]], sensore temperatura/umidita` (dht) e pioggia (rain)
 +
* [[ ESP8266/DHT22toMQTT | DHT22toMQTT ]], sensore di temperatura e umidita`
 +
* [[ 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 ]]
 +
* [[ Centralina_livello_1/Centralina_livello_2_PIR | Centralina livello 2 - PIR ]]
  
 
= Tools =
 
= Tools =
  
 
[[Centralina livello 1/telegram bot|Telegram Bot per Centralina livello 1]]
 
[[Centralina livello 1/telegram bot|Telegram Bot per Centralina livello 1]]
 +
 +
= Problemi e soluzioni ? =
 +
 +
;Eliminazione file di swap
 +
:Non so se sia stato un problema e sia utile
 +
::[[Raspberry_PI-Raspbian-Personalizzazioni#Disattivazione|Disattivazione file di swap]]
 +
 +
;Redis - Errore salvataggio in background
 +
:[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]
 +
:[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]
 +
 +
;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 sen