Cuprins:

Monitorizare casă DIY cu RaspberryPi și Cloud4Rpi: 5 pași
Monitorizare casă DIY cu RaspberryPi și Cloud4Rpi: 5 pași

Video: Monitorizare casă DIY cu RaspberryPi și Cloud4Rpi: 5 pași

Video: Monitorizare casă DIY cu RaspberryPi și Cloud4Rpi: 5 pași
Video: Ultimate Raspberry Pi v. ZIMA Board Showdown! 2024, Noiembrie
Anonim
Monitorizare casă DIY cu RaspberryPi și Cloud4Rpi
Monitorizare casă DIY cu RaspberryPi și Cloud4Rpi

Într-un weekend de iarnă, m-am dus la casa mea de la țară și am aflat că era foarte frig acolo. Ceva se întâmplase cu electricitatea și întrerupătorul RCD îl oprise și încălzirea s-a oprit și ea. Am avut norocul că am venit acolo, altfel în câteva zile totul ar fi fost înghețat, ceea ce este foarte rău pentru țevi și radiatoare.

Aveam câteva Raspberry Pi în jur și un senzor termic, așa că m-am gândit - de ce nu fac un dispozitiv simplu de monitorizare? Instrucțiunile de mai jos presupun că aveți configurat un Raspberry Pi cu Raspbian și conexiunea de rețea. În cazul meu, este Raspberry Pi B + cu Raspbian (2018-06-27-raspbian-stretch-lite).

Pasul 1: Monitorizarea temperaturii

Monitorizarea temperaturii
Monitorizarea temperaturii
Monitorizarea temperaturii
Monitorizarea temperaturii

Cum se conectează un senzor de temperatură DS18B20? Doar google cum să faceți acest lucru și veți vedea o mulțime de imagini de genul acesta:

În cazul meu aveam fire negre, galbene și roșii. Negrul este împământat, merge la pinul de masă, roșu este putere - merge la pinul de 3,3v, iar galbenul este de date - ar trebui să meargă la pinul GPIO4, cu rezistor de 4,7 kOm conectat între date și putere. Notă, puteți conecta mai mulți senzori în paralel (sunt digitale și au adrese diferite), aveți nevoie de un singur rezistor. După conectarea senzorului, ar trebui să activați 1Wire în raspi-config:

sudo raspi-config

Mergeți la 5 opțiuni de interfață, activați P7 1-Wire și reporniți.

Apoi puteți testa dacă vedeți senzorul:

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

Ar trebui să vedeți așa ceva:

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

28–00044eae2dff este senzorul nostru de temperatură.

Hardware-ul este gata. Acum trebuie să configurez partea de monitorizare. Am nevoie de ceva care să-mi arate datele și să mă anunțe dacă dispozitivul este deconectat o perioadă de timp sau dacă nu există curent sau temperatura este scăzută. Evident, acesta nu poate fi raspberry pi în sine, ar trebui să existe un server sau un serviciu pe internet care să-mi monitorizeze dispozitivul.

Pot să creez un server simplu, să primesc o găzduire și să configurez totul, dar cu sinceritate, nu vreau. Din fericire, cineva s-a gândit deja la acest lucru și a creat cloud4rpi.io - un panou de control cloud pentru dispozitivul dvs.

Pasul 2: Configurarea Cloud4Rpi.io

Configurarea Cloud4Rpi.io
Configurarea Cloud4Rpi.io

Cloud4Rpi oferă un serviciu care permite dispozitivului dvs. să trimită și să primească date folosind protocoalele MQTT sau HTTP. Au o bibliotecă client pentru Python, așa că voi folosi Python.

Exemplele Python care vin cu serviciul Cloud4Rpi conțin deja cod pentru senzorul de temperatură DS18B20.

Așa că m-am dus la https://cloud4rpi.io, am creat un cont și am adăugat un nou dispozitiv acolo. Pagina dispozitivului are un simbol - un șir care identifică dispozitivul și care ar trebui specificat în programul care trimite date.

Pentru început, este întotdeauna o idee bună să actualizați un manager de pachete și să actualizați pachetele (notă: poate dura câteva ore dacă nu ați făcut upgrade de ceva timp):

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

Apoi, instalați git, Python și managerul de pachete Pip:

sudo apt-get install git python python-pip

Apoi, instalați biblioteca Python cloud4rpi:

sudo pip instalează cloud4rpi

În sfârșit, sunt gata să scriu programul meu de control. Încep de la un exemplu disponibil la

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

Fișierul principal al programului este control.py - Trebuie să îl modific pentru nevoile mele. Mai întâi, editați programul și lipiți un simbol:

sudo nano control.py

Găsiți o linie DEVICE_TOKEN = '…'] și specificați acolo un jeton de dispozitiv. După aceea, pot pur și simplu să rulez programul: funcționează și raportează o temperatură în variabila RoomTemp:

sudo python control.py

Funcționează și raportează o temperatură în variabila RoomTemp.

Rețineți că descoperă toți senzorii onewire ds18b20

ds_sensors = ds18b20. DS18B20.find_all ()

și folosește primul senzor găsit:

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

Ok, a fost ușor, deoarece programul eșantion are tot ceea ce este necesar pentru a funcționa cu senzorul ds18b20 pe Raspberry Pi. Acum trebuie să găsesc modalitatea de raportare a stării puterii.

Pasul 3: Monitorizarea UPS

Monitorizare UPS
Monitorizare UPS

Următorul lucru pe care vreau să îl monitorizez este starea UPS-ului, așa că, dacă există întreruperi de curent, voi ști despre asta înainte ca totul să se deconecteze.

Am un UPS APC cu control USB, așa că am căutat rapid pe Google și am constatat că am nevoie de apcupsd. https://www.anites.com/2013/09/monitoring-ups.html… Am încercat de mai multe ori să îl instalez prin apt-get și nu funcționa pentru mine din diferite motive. Vă voi arăta cum să îl instalați din surse.

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

Apoi editez apcupsd.conf pentru a mă conecta la UPS-ul meu prin USB.

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

Acum pot conecta cablul USB de la UPS la RaspberryPi și pot testa dacă va fi găsit UPS.

sudo apctest

Nu ar trebui să vă ofere niciun mesaj de eroare.

Acum sevice apcupsd ar trebui să fie pornit:

sudo systemctl pornește apcupsd

Pentru interogarea stării UPS pot folosi o comandă de stare:

sudo /etc/init.d/apcupsd status

Și ar produce un astfel de lucru:

APC: 001, 035, 0855 DATA: 2018-10-14 16:55:30 +0300 NOM DE GAZNĂ: vcontrol VERSIUNE: 3.14.14 (31 mai 2016) debian NUMEU UPS: vcontrol CABLU: Cablu USB DRIVER: USB UPS Driver UPSMODE: Stand Alone STARTTIME: 2018-10-14 16:54:28 +0300 MODEL: Back-UPS XS 650CI STATUS: ONLINE LINEV: 238,0 Volts LOADPCT: 0,0 Procent BCHARGE: 100,0 Procent TIMELEFT: 293,3 Minute MBATTCHG: 5 Procente MINTIMEL: 3 Minute MAXTIME: 0 secunde SENSE: mediu LOTRANS: 140,0 volți HITRANS: 300,0 volți ALARMDEL: 30 secunde BATTV: 14,2 volți LASTXFER: Fără transferuri de la turnon NUMXFERS: 0 TONBATT: 0 secunde CUMONBATT: 0 secunde XOFFBATT: N / A STATFLAG: 0x0500: 0x0500: 0x0500: 2014-06-10 NOMINV: 230 volți NOMBATTV: 12,0 volți NOMPOWER: 390 wați FIRMWARE: 892. R3. I USB FW: R3 END APC: 2018-10-14 16:55:38 +0300

Am nevoie de o stare - care este linia „STATUS:”.

Biblioteca Cloud4rpi conține un modul „rpy.py” care returnează parametrii sistemului Raspberry Pi, cum ar fi numele gazdei sau temperatura cpu. Deoarece toți acești parametri sunt rezultatele executării unor comenzi și analizei de ieșire, conține și o funcție utilă „parse_output” care face exact ceea ce am nevoie. Iată cum să obțin statutul meu UPS:

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

Pentru a trimite această stare către cloud4rpi, trebuie să declar o variabilă UPSStatus și să o leg de funcția mea ups_status: Acum pot rula programul meu:

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

Și îmi pot vedea imediat variabila pe pagina dispozitivului cloud4rpi.

Pasul 4: Pregătirea pentru „producție”

Pregătirea pentru „producție”
Pregătirea pentru „producție”

Totul funcționează și acum trebuie să-mi pregătesc dispozitivul în modul nesupravegheat.

Pentru început, voi ajusta intervalele de timp. Intervalul de sondare definește cât de des programul verifică temperatura și starea UPS - setați-l la o secundă.

Rezultatele sunt trimise în cloud la fiecare 5 minute, iar informațiile de diagnosticare - la fiecare oră.

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

Când starea UPS se schimbă - nu vreau ca dispozitivul meu să aștepte 5 minute și trimit date imediat. Așa că am modificat ușor bucla principală și arată astfel:

data_timer = 0diag_timer = 0 prevUPS = 'ONLINE' în timp ce True: newUPS = ups_status () if (data_timer <= 0) or (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

Testare: rulați scriptul:

sudo python control.py

Și pot viziona starea UPS pe pagina dispozitivului meu.

Dacă opresc alimentarea UPS-ului, starea se schimbă în câteva secunde, deci totul funcționează. Acum trebuie să pornesc apcupsd și control.py la pornirea sistemului. Serviciul Apcupsd este vechi și pentru al porni pe raspbian modern, ar trebui să modific fișierul /etc/init.d/apcupsd, adăugând aceste linii undeva în partea de sus:

### BEGIN INIT INFO # Oferă: apcupsd # Required-Start: $ all # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: APC UPS daemon … ### END INIT INFO #

Apoi activați serviciul:

sudo systemctl activează apcupsd

Apoi porniți serviciul:

sudo systemctl pornește apcupsd

Acum apcupsd va fi pornit la pornirea sistemului.

Pentru a instala control.py ca serviciu, am folosit scriptul service_install.sh furnizat:

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

Acum serviciul este început și trebuie să supraviețuiască unei reporniri.

Pasul 5: Configurarea unui panou de control

Configurarea unui panou de control
Configurarea unui panou de control

Cloud4rpi îmi permite să configurez un panou de control pentru dispozitivul meu. Puteți adăuga „widget-uri” și le puteți asocia cu variabilele dispozitivului.

Dispozitivul meu oferă două variabile de numai citire - RoomTemp și UPSStatus:

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

Am adăugat 3 widgeturi - Număr pentru RoomTemp, Text pentru UPSStatus și o diagramă pentru RoomTemp.

Pot configura alerte, așa că primesc un e-mail când temperatura este în afara intervalului specificat, UPS-ul a deconectat sau dispozitivul în sine nu trimite date când ar trebui. Acum pot fi sigur că casa mea de țară este ok și pot fi informat când ceva nu este în regulă, așa că pot telefona vecinii și le pot cere să verifice ce se întâmplă. Iată codul real al controlului.py.

Recomandat: