Sommario:

Monitoraggio della casa fai da te con RaspberryPi e Cloud4Rpi: 5 passaggi
Monitoraggio della casa fai da te con RaspberryPi e Cloud4Rpi: 5 passaggi

Video: Monitoraggio della casa fai da te con RaspberryPi e Cloud4Rpi: 5 passaggi

Video: Monitoraggio della casa fai da te con RaspberryPi e Cloud4Rpi: 5 passaggi
Video: Умный выключатель в круглый подрозетник с радио повторителем, легкая и быстрая установка 2024, Novembre
Anonim
Monitoraggio della casa fai-da-te con RaspberryPi e Cloud4Rpi
Monitoraggio della casa fai-da-te con RaspberryPi e Cloud4Rpi

Un fine settimana invernale sono andato nella mia casa di campagna e ho scoperto che lì faceva molto freddo. Era successo qualcosa con l'elettricità e l'interruttore RCD l'aveva spento, e anche il riscaldamento si era spento. Sono stato fortunato a venire lì, altrimenti in diversi giorni si sarebbe tutto congelato, il che è molto negativo per i tubi e i radiatori.

Avevo diversi Raspberry Pi in giro e un sensore termico, quindi ho pensato: perché non creare un semplice dispositivo di monitoraggio? Le istruzioni seguenti presuppongono che tu abbia un Raspberry Pi con Raspbian e una connessione di rete configurata. Nel mio caso è Raspberry Pi B+ con Raspbian (2018–06–27-raspbian-stretch-lite).

Passaggio 1: monitoraggio della temperatura

Monitoraggio della temperatura
Monitoraggio della temperatura
Monitoraggio della temperatura
Monitoraggio della temperatura

Come collegare un sensore di temperatura DS18B20? Cerca su Google come fare e vedrai molte immagini come questa:

Nel mio caso avevo fili neri, gialli e rossi. Il nero è massa, va al pin Ground, il rosso è alimentazione - va al pin 3.3v e il giallo è dati - dovrebbe andare al pin GPIO4, con un resistore da 4,7 kOm collegato tra dati e alimentazione. Nota, è possibile collegare diversi sensori in parallelo (sono digitali, e hanno indirizzi diversi), è necessaria una sola resistenza. Dopo aver collegato il sensore, dovresti abilitare 1Wire nel raspi-config:

sudo raspi-config

Vai a 5 Opzioni di interfaccia, abilita P7 1-Wire e riavvia.

Quindi puoi testare se riesci a vedere il sensore:

sudo modprobe w1-gpiosudo modprobe w1-thermls /sys/bus/w1/devices/

Dovresti vedere qualcosa del genere:

pi@vcontrol:~ $ ls /sys/bus/w1/devices/28–00044eae2dff w1_bus_master1

28–00044eae2dff è il nostro sensore di temperatura.

L'hardware è pronto. Ora devo impostare la parte di monitoraggio. Ho bisogno di qualcosa che mi mostri i dati e mi avvisi se il dispositivo è scollegato per un po' o non c'è alimentazione o la temperatura è bassa. Ovviamente questo non può essere lo stesso raspberry pi, dovrebbe esserci un server o un servizio in Internet che monitora il mio dispositivo.

Posso creare un server semplice, ottenere un hosting e configurare tutto, ma onestamente non voglio. Fortunatamente, qualcuno ci ha già pensato e ha creato cloud4rpi.io, un pannello di controllo cloud per il tuo dispositivo.

Passaggio 2: configurazione di Cloud4Rpi.io

Configurazione di Cloud4Rpi.io
Configurazione di Cloud4Rpi.io

Cloud4Rpi fornisce un servizio che consente al tuo dispositivo di inviare e ricevere dati utilizzando i protocolli MQTT o HTTP. Hanno una libreria client per Python, quindi userò Python.

Gli esempi Python forniti con il servizio Cloud4Rpi contengono già il codice per il sensore di temperatura DS18B20.

Quindi sono andato su https://cloud4rpi.io, ho creato un account e ho aggiunto un nuovo dispositivo lì. La pagina del dispositivo ha un token, una stringa che identifica il dispositivo e che dovrebbe essere specificata nel programma che invia i dati.

Per cominciare, è sempre una buona idea aggiornare un gestore di pacchetti e aggiornare i pacchetti (nota: possono volerci ore se non esegui l'aggiornamento da un po' di tempo):

sudo apt-get update && sudo apt-get upgrade

Quindi, installa git, Python e il suo gestore di pacchetti Pip:

sudo apt-get install git python python-pip

Quindi, installa la libreria Python cloud4rpi:

sudo pip install cloud4rpi

Finalmente sono pronto per scrivere il mio programma di controllo. Parto da un esempio disponibile su

git clone https://github.com/cloud4rpi/cloud4rpi-raspberrypi… cloud4rpicd cloud4rpi

Il file del programma principale è control.py - devo modificarlo per le mie esigenze. Innanzitutto, modifica il programma e incolla un token:

sudo nano control.py

Trova una riga DEVICE_TOKEN='…'] e specifica lì un token del dispositivo. Dopodiché posso semplicemente eseguire il programma: funziona e riporta una temperatura nella variabile RoomTemp:

sudo python control.py

Funziona e riporta una temperatura nella variabile RoomTemp.

Nota che scopre tutti i sensori onewire ds18b20

ds_sensors = ds18b20. DS18B20.find_all()

e usa il primo sensore trovato:

RoomTemp': { 'type': 'numeric', 'bind': ds_sensors[0] if ds_sensors else Nessuno }

Ok, è stato facile, perché il programma di esempio ha tutto ciò che è necessario per funzionare con il sensore ds18b20 su Raspberry Pi. Ora devo trovare il modo di segnalare lo stato di alimentazione.

Passaggio 3: monitoraggio dell'UPS

Monitoraggio UPS
Monitoraggio UPS

La prossima cosa che voglio monitorare è lo stato dell'UPS, quindi se c'è un'interruzione di corrente, lo saprò prima che tutto si disconnetta.

Ho un UPS APC con controllo USB, quindi ho cercato rapidamente su Google e ho scoperto che avevo bisogno di apcupsd. https://www.anites.com/2013/09/monitoring-ups.html… Ho provato più volte a installarlo tramite apt-get e non funzionava per me per vari motivi. Mostrerò come installarlo dai sorgenti.

wget https://sourceforge.net/projects/apcupsd/files/ap…tar xvf apcupsd-3.14.14.tar.gz cd apcupsd-3.14.14./configure --enable-usb sudo make sudo make install

Quindi modifico apcupsd.conf per connettermi al mio UPS tramite USB.

sudo nano /etc/apcupsd/apcupsd.conf# #UPSCABLE smart UPSCABLE usb # #UPSTYPE apcsmart #DEVICE /dev/ttyS0 UPSTYPE usb DEVICE

Ora posso collegare il cavo USB da UPS a RaspberryPi e verificare se l'UPS viene trovato.

sudo aptest

Non dovrebbe darti messaggi di errore.

Ora dovrebbe essere avviato il servizio apcupsd:

sudo systemctl start apcupsd

Per interrogare lo stato dell'UPS posso utilizzare un comando di stato:

sudo /etc/init.d/apcupsd status

E produrrebbe qualcosa del genere:

APC: 001, 035, 0855 DATA: 2018-10-14 16:55:30 +0300 HOSTNAME: vcontrol VERSIONE: 3.14.14 (31 maggio 2016) debian UPSNAME: vcontrol CAVO: Cavo USB DRIVER: USB UPS Driver MODALITÀ UPS: Stand Alone STARTTIME: 2018-10-14 16:54:28 +0300 MODEL: Back-UPS XS 650CI STATO: ONLINE LINEV: 238.0 Volt LOADPCT: 0.0 Percent BCHARGE: 100.0 Percent TIMELEFT: 293,3 Minuti MBATTCHG: 5 Percent MINTIMEL: 3 Minuti MAXTIME: 0 Secondi SENSE: Medio LOTRANS: 140.0 Volt HITRANS: 300.0 Volt ALARMDEL: 30 Secondi BATTV: 14,2 Volt LASTXFER: Nessun trasferimento dall'accensione NUMXFERS: 0 TONBATT: 0 Secondi CUMONBATT: 0 Secondi XOFFBATT: N/A BATTNOX STATFLAG0294508 314050000X: 2014-06-10 NOMINV: 230 Volt NOMBATTV: 12.0 Volt NOMPOWER: 390 Watt FIRMWARE: 892. R3. I USB FW:R3 END APC: 2018-10-14 16:55:38 +0300

Ho bisogno di uno stato, che è la riga "STATUS:".

La libreria Cloud4rpi contiene un modulo "rpy.py" che restituisce i parametri di sistema di Raspberry Pi come il nome host o la temperatura della CPU. Poiché tutti questi parametri sono risultati dell'esecuzione di alcuni comandi e dell'analisi dell'output, contiene anche una pratica funzione "parse_output" che fa esattamente ciò di cui ho bisogno. Ecco come ottenere lo stato del mio UPS:

def ups_status(): result = rpi.parse_output(r'STATUS\s+:\s+(S+)', ['/etc/init.d/apcupsd', 'status']) if risultato: return risultato else: return 'SCONOSCIUTO'

Per inviare questo stato a cloud4rpi, devo dichiarare una variabile UPSStatus e associarla alla mia funzione ups_status: Ora posso eseguire il mio programma:

variabili = { 'RoomTemp': { 'type': 'numeric', 'bind': ds_sensors[0] }, 'UPSStatus': { 'type': 'string', 'bind': ups_status } }

E posso vedere immediatamente la mia variabile nella pagina del dispositivo cloud4rpi.

Passaggio 4: preparazione alla "produzione"

Prepararsi alla “produzione”
Prepararsi alla “produzione”

Tutto funziona e ora devo preparare il mio dispositivo alla modalità non presidiata.

Per cominciare, regolerò gli intervalli di tempo. L'intervallo di polling definisce la frequenza con cui il programma controlla la temperatura e lo stato dell'UPS - impostalo su un secondo.

I risultati vengono inviati al cloud ogni 5 minuti e le informazioni diagnostiche ogni ora.

# ConstantsDATA_SENDING_INTERVAL = 300 # sec DIAG_SENDING_INTERVAL = 3600 # sec POLL_INTERVAL = 1 # sec

Quando lo stato dell'UPS cambia, non voglio che il mio dispositivo aspetti 5 minuti e invio i dati immediatamente. Quindi ho leggermente modificato il ciclo principale e sembra così:

data_timer = 0diag_timer = 0 prevUPS = 'ONLINE' while True: newUPS = ups_status() if (data_timer <= 0) o (newUPS != prevUPS): device.publish_data() data_timer = DATA_SENDING_INTERVAL prevUPS = newUPS if diag_timer <= 0: device.publish_diag() diag_timer = DIAG_SENDING_INTERVAL sleep(POLL_INTERVAL) diag_timer -= POLL_INTERVAL data_timer -= POLL_INTERVAL

Test: esegui lo script:

sudo python control.py

E posso controllare lo stato dell'UPS sulla pagina del mio dispositivo.

Se spengo l'alimentazione dell'UPS, lo stato cambia in un paio di secondi, quindi tutto funziona. Ora devo avviare apcupsd e il mio control.py all'avvio del sistema. Il servizio Apcupsd è vecchio e per avviarlo su un moderno raspbian, dovrei modificare il file /etc/init.d/apcupsd, aggiungendo queste righe da qualche parte in alto:

### BEGIN INIT INFO# Fornisce: apcupsd # Required-Start: $all # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: # Breve descrizione: APC UPS daemon… ### END INIT INFORMAZIONI#

Quindi abilita il servizio:

sudo systemctl abilita apcupsd

Quindi avvia il servizio:

sudo systemctl start apcupsd

Ora apcupsd verrà avviato all'avvio del sistema.

Per installare control.py come servizio, ho utilizzato lo script service_install.sh fornito:

sudo bash service_install.sh ~/cloud4rpi/control.py

Ora il servizio è avviato e dovrebbe sopravvivere a un riavvio.

Passaggio 5: configurazione di un pannello di controllo

Configurazione di un pannello di controllo
Configurazione di un pannello di controllo

Cloud4rpi mi consente di configurare un pannello di controllo per il mio dispositivo. Puoi aggiungere "widget" e associarli alle variabili del dispositivo.

Il mio dispositivo fornisce due variabili di sola lettura: RoomTemp e UPSStatus:

variabili = { 'RoomTemp': { 'type': 'numeric', 'bind': ds_sensors[0] }, 'UPSStatus': { 'type': 'string', 'bind': ups_status } }

Ho aggiunto 3 widget: Numero per RoomTemp, Testo per UPSStatus e Grafico per RoomTemp.

Posso impostare avvisi, quindi ricevo un'e-mail quando la temperatura è fuori dall'intervallo specificato, UPS è andato offline o il dispositivo stesso non invia dati quando dovrebbe. Ora posso essere sicuro che la mia casa di campagna è a posto e posso essere avvisato quando qualcosa non va, così posso telefonare ai vicini e chiedere loro di controllare cosa sta succedendo. Ecco il codice effettivo di control.py.

Consigliato: