Differenze tra le versioni di "Centralina livello 1"
Riga 360: | Riga 360: | ||
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` | + | L'eseguibile e` "/var/www/cgi-bin/setsalarms_d.py". |
− | Perche` possa "funzionare" | + | === 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 | ||
+ | ::... | ||
== Analizza e Modifica Valori == | == Analizza e Modifica Valori == |
Versione delle 18:04, 6 gen 2017
Centralina livello 1 |
Centralina generale (?) gestione segnali |
Repository: https://github.com/raspibo/Livello1 |
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 ?)
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:
- interfaccia web
- browser
- cellulare
- linea di comando
- terminali operatore (display+tastiere)
- pulsanti, lampade, selettori, ..
- ...
Hardware e Software
- Hardware
- Raspberry Pi 3, perche` completa di WiFi e Bluetooth
- 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
- ...
Access Point
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:
127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters #127.0.1.1 level1 # Ho dovuto eliminare il doppione 127.0.1.1 errorlevel 192.168.3.1 level1
Fra i clients il nome dovrebbe essere risolto automaticamente da "dnsmasq" (ricordarsi di verificare).
Rete
Al momento e` previsto che sia tutto sotto WiFi (quella onboard) del Raspberry Pi 3.
Comunque bastera` modificare il firewall per accettare dati dalla ethernet se si rendesse necessario.
Le centrali accessorie, tipo quella di allarme, che deve solo ricevere, non necessariamente dovranno trovarsi nella sottorete gestita da "livello 1".
Descrizione
I 'segnali' arrivano sempre (?) a "MQTT broker", vengono manipolati se necessario, ed inseriti nel database Redis.
Dal database Redis sono di nuovo letti/scritti/modificati/manipolati ed inviati:
- e/o
- in report (testo, grafico, audio, video, ...)
- e/o
- alla centralina di allarme CentRed
- e/o
- reinviati a MQTT broker
- e/o
- inviati ad altre centraline livello 1
- e/o
- ...
Configurazione e Funzionamento
(Sommariamente)
Al primo avvio e` necesssario configurare prima il database Redis da utilizzare, poi quello della centralina avvisi/allarmi (se avete intenzione di ricevere le comunicazioni relative agli allarmi e/o avvisi di malfunzionamenti).
Una volta "letti" i segnali, e` opera dell'utente aggiungere alcune caratteristiche #Segnali, fatto questo si passa alla creazione dei #Gruppi.
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.
Arrivo dati e manipolazione
I dati devono arrivare al broker MQTT nel formato:
{ "ID" : "Identificatore", "Valore" : "0" }
inviati nel topic:
TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo
Fate riferimento alla #Tabella dati e valori per comprendere meglio il significato.
Nell'immagine, una schermata dei test in corso, a sinistra gli errori di lettura, a destra un listato della "cgi-bin", sotto i falsi dati inviati (mi servono per i test che sto` facendo ;) ), e in fondo i dati ricevuti (veri e falsi).
mqtt2redis_d.py
I dati MQTT vengono letti dal programma "mqtt2redis_d.py" che deve sempre essere in esecuzione (ho gia` preparato anche un "init.d", che tengo ancora nella "cgi-bin"), questi li manipola inserendoli se non presenti, in due "chiavi" nel database (noSQL) Redis, la prima, e` per identificare il segnale:
TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID
la seconda e` quella dei valori:
TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori
valori che sono accodati ad ogni arrivo con l'aggiunta della data e ora, predisposti per una generazione di output in formato "csv".
Segnali
Una volta pervenuto il primo valore di un segnale, e` possibile configurarlo inserendo alcuni dati che non sono presenti nella comunicazione MQTT:
- Descrizione
- Meglio se breve, perche` usata anche nei riferimenti dei grafici, non solo per gli allarmi
- UM (Unita` di misura)
- TempoRitardo
- Ancora non usata
- RangeValori
- Specificare il range dei valori nel formato 0,100
- Utile per sonde che (per esempio) lavorano da 0 a 100 gradi
- Genera avviso/allarme se minore di o maggiore di
- ValoreMin
- Allarme se valore e` inferiore a quello impostato
- ValoreMax
- Allarme se valore e` superiore a quello impostato
- ValoreOn
- Previsto per i segnali analogici o negati
- Allarme quando valore uguale a ValoreOn
- Allarme
- Predisposta ma non implementata
Esempio di una configurazione di sonda temperatura (ovviamente falsa):
Esempio di una configurazione di sensore di movimento (pir, ovviamente falso):
Gruppi
Per realizzare i raggruppamenti ho utilizzato le chiavi Redis di tipo "sets".
Al momento ho pensato ai soli gruppi riguardanti gli allarmi e i grafici (per esempio quelli di due o piu`, sonde di temperatura).
- Tip
- Puoi benissimo creare un gruppo con un solo sensore.
Al solito, ho pensato ad una chiave univoca d'inserimento dei dati in Redis sets:type:ID (gruppo:tipo:identificatore).
Gruppo |
|
---|
Tipo |
|
---|
ID (Identificatore) |
(definito da utente, esempi:)
|
---|
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 "Timer" di "campionamento"/"ritardo nuovo allarme", preimpostato a 5 minuti (sono previsti valori da 1 a 60 minuti).
La pagina d'inserimento permette di inserire una chiave con un nome qualsiasi, non ho ancora "bloccato" e/o previsto un controllo sull'identificatore assegnato.
sets:*:ID:Config
Descrizione |
Breve (?) descrizione |
---|
Timer |
|
---|
Funzionamento |
|
---|
(Auto) dalle |
|
---|
(Auto) alle |
|
---|
Esempio "graph"
La chiave per questi gruppi e` previsto che sia: sets:graph:ID
La chiave per il timer di campionamento e` previsto che sia: sets:graph:ID:Timer (ora e` generata automaticamente)
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)
Esempio "alarms"
Al momento come sopra, tranne che il Timer non servira` (o forse si, perche` sono previsti anche grafici dei PIR).
Esempio d'inserimento gruppo
- MENU
- Aggiungi chiavi "sets" Redis
- MENU
- Seleziona e Manipola chiavi Redis
- Nell'immagine e` gia` stato applicato il filtro *:graph:*
Modifica di un gruppo
- MENU
- Seleziona e Manipola chiavi Redis
Daemons
Intanto: non sono veri e propri "demoni", sono script che l'utente avvia e ferma al bisogno.
Specialmente quello degli allarmi (che mi sta` rompendo al cellulare da stamattina ;) ), e` da avviare quando uscite di casa, e fermare prima di rientrare.
- MENU
- Manipolazione files Grafici
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).
- Tip
- Salvate il ".csv" PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.
Grafici (files .csv)
- MENU
- Manipolazione files Grafici
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).
- TIP
- Salvate il ".csv" PRIMA di eliminare la/e chiave/i dei valori dal database, se volete tenere una qualche 'traccia'.
Allarmi
Per ogni gruppo creato, e` possibile eseguire il controllo allarmi, servono opportune preimpostazioni (configurazioni), poi e` possibile eseguire il software dalla pagina Daemons:
Si puo` notare in esecuzione solo quello relativo ad una falsa sonda di temperatura, relativo ai test eseguiti.
L'eseguibile e` "/var/www/cgi-bin/setsalarms_d.py".
setsalarms_d.py
Perche` possa "funzionare" servono alcuni requisiti:
- 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")
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
- ...
Analizza e Modifica Valori
Ho aggiunto la possibilita` di manipolare i valori memorizzati nel database Redis.
- MENU
- Seleziona e Manipola chiavi Redis
Sono ammesse solamente chiavi ":Valori", la possibilita` di selezione dipende (al solito) dal filtro attivo nella pagina.
Una volta scelta la chiave e cliccato su "Analizza e Modifica", compare la pagina:
Dove e` possibile:
- Visualizzare tutti i valori
- Creare il file ".csv" da elaborare successivamente tramite l'apposita pagina
- Eliminare i dati ormai obsoleti (attenzione che non ho filtrato le immissioni, e` possibile anche fare il contrario)
Tabella dati e valori
Denominazione dei campi e attibuzione dei valori standard (piu` o meno)
Tipo |
|
---|
Descrizione |
Breve (?) descrizione del segnale |
---|
TipoIO |
|
---|
Segnale |
|
Al momento l'ho soppresso, il tipo di segnale e` praticamente definito dal valore in entrata (per ora) |
---|
PosizioneC |
|
---|
PosizioneP |
|
---|
PosizioneS |
|
---|
ID (Identificatore, Utenza/ITEM) |
|
Definito dall'utente che programma i "remote", ma meglio definire una struttura di base .. |
---|
Valori |
|
Assegnato automaticamente dal programma |
---|
UM (Unita` di Misura) |
|
Questo e` previsto solo per le segnalazioni/avvisi/allarmi .. |
---|
TempoRitardo (secondi) |
|
Al momento non previsto, teoricamente i segnali dovrebbero arrivare gia` "filtrati" dai "remote" |
---|
RangeValori |
|
Da utilizzarsi per definire l'errore e generare una segnalazione di sonda guasta |
---|
ValoreMin |
|
Sotto a questo valore dev'essere generato un'allarme |
---|
ValoreMax |
|
Sopra a questo valore dev'essere generato un'allarme |
---|
ValoreOn |
|
Valore da utilizzare per alert/alarm, e per definire se si tratta di un segnale negato (zero) e trattarlo di conseguenza |
---|
Allarme |
|
Quali sono da trattare come allarmi, di default, se impostati, sono trattati come alert |
---|
TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori
Data (e ora) |
|
---|
Valore |
|
---|
Promemoria chiavi, codici e ...
Dati (mqtt)
{ "ID" : "Identificatore", "Valore" : "0" }
Topic (mqtt)
TipoIO/PosizioneC/PosizioneP/PosizioneS/Tipo
Chiave primaria segnale di livello 1 (redis)
TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID
Chiave primaria valori di livello 1 (redis)
TipoIO:PosizioneC:PosizioneP:PosizioneS:Tipo:ID:Valori
Chiave primaria gruppi di livello 1 (redis)
- TYPE
- graph
- alarms
sets:TYPE:ID
Chiave primaria configurazione gruppi di livello 1 (redis)
sets:TYPE:ID:Config
Chiave primaria valori gruppi di livello 1 (redis)
sets:TYPE:ID:Valori
Riferimenti
Devices
Ad oggi, ho predisposto/preparato:
- PorTHable, che invia valori di temperatura
- DS1820toMQTT , sensore/i di temperatura
- PIRtoMQTT , sensore di movimento (PIR)
- SerialToMQTT Repeater , che funziona da "repeater", ritrasmette i dati ricevuti via seriale al broker MQTT
- Thermo , che invia il valore della temperatura (solo di riferimento ad oggi, non le altre sonde)
- ENC28J60 + ATMEGA328P + DS18B20 , sensore di temperatura in ethernet
- ATMEGA328P + ESP8266 + DHT + Rain, sensore temperatura/umidita` (dht) e pioggia (rain)