Innholdsfortegnelse:

DIY husovervåking med RaspberryPi og Cloud4Rpi: 5 trinn
DIY husovervåking med RaspberryPi og Cloud4Rpi: 5 trinn

Video: DIY husovervåking med RaspberryPi og Cloud4Rpi: 5 trinn

Video: DIY husovervåking med RaspberryPi og Cloud4Rpi: 5 trinn
Video: How to Build Green IoT Application: Things peak, Blynk and Node MCU 2024, November
Anonim
DIY husovervåking med RaspberryPi og Cloud4Rpi
DIY husovervåking med RaspberryPi og Cloud4Rpi

En vinterhelg dro jeg til landstedet mitt, og fant ut at det var veldig kaldt der. Noe hadde skjedd med strøm og jordfeilbryter hadde slått den av, og oppvarmingen gikk også av. Jeg var heldig som kom dit, ellers hadde alt på flere dager vært frosset ned, noe som er veldig dårlig for rørene og radiatorene.

Jeg hadde flere Raspberry Pi’er rundt, og en termisk sensor, så jeg tenkte - hvorfor lager jeg ikke en enkel overvåkingsenhet? Instruksjonene nedenfor forutsetter at du har konfigurert en Raspberry Pi med Raspbian og nettverkstilkobling. I mitt tilfelle er det Raspberry Pi B+ med Raspbian (2018–06–27-raspbian-stretch-lite).

Trinn 1: Temperaturovervåking

Temperaturovervåking
Temperaturovervåking
Temperaturovervåking
Temperaturovervåking

Hvordan koble til en DS18B20 temperatursensor? Bare google hvordan du gjør dette, så ser du mange bilder som dette:

I mitt tilfelle hadde jeg svarte, gule og røde ledninger. Den svarte er jordet, går til jordpinnen, den røde er strøm - går til 3,3v pinne, og den gule er data - skal gå til GPIO4 -pinnen, med 4,7 kOm motstand tilkoblet mellom data og strøm. Merk, du kan koble til flere sensorer parallelt (de er digitale og har forskjellige adresser) trenger du bare en motstand. Etter at du har koblet til sensoren, bør du aktivere 1Wire i raspi-config:

sudo raspi-config

Gå til 5 grensesnittalternativer, aktiver P7 1-Wire og start på nytt.

Deretter kan du teste om du kan se sensoren:

sudo modprobe w1-gpiosudo modprobe w1-thermls/sys/buss/w1/enheter/

Du bør se noe slikt:

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

28–00044eae2dff er temperatursensoren vår.

Maskinvaren er klar. Nå må jeg sette opp overvåkningsdelen. Jeg trenger noe som viser meg dataene og varsler meg hvis enheten er koblet fra en stund eller det ikke er strøm, eller temperaturen er lav. Dette kan åpenbart ikke være bringebær pi selv, det bør være en server eller tjeneste på internett som overvåker enheten min.

Jeg kan lage en enkel server, få en hosting og sette opp alt, men ærlig, jeg vil ikke. Heldigvis har noen allerede tenkt på dette og opprettet cloud4rpi.io - et skykontrollpanel for enheten din.

Trinn 2: Konfigurere Cloud4Rpi.io

Sette opp Cloud4Rpi.io
Sette opp Cloud4Rpi.io

Cloud4Rpi tilbyr en tjeneste som lar enheten sende og motta data ved hjelp av MQTT- eller HTTP -protokoller. De har et klientbibliotek for Python, så jeg bruker Python.

Python -eksempler som følger med Cloud4Rpi -tjenesten inneholder allerede kode for DS18B20 temp -sensor.

Så jeg gikk til https://cloud4rpi.io, opprettet en konto og la til en ny enhet der. Enhetssiden har et token - en streng som identifiserer enheten, og som bør spesifiseres i programmet som sender data.

Til å begynne med er det alltid en god idé å oppdatere en pakkeleder og oppgradere pakker (merk: det kan ta timer hvis du ikke har oppgradert på en stund):

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

Installer deretter git, Python og pakkebehandleren Pip:

sudo apt-get install git python python-pip

Installer deretter cloud4rpi Python -bibliotek:

sudo pip installer cloud4rpi

Til slutt er jeg klar til å skrive kontrollprogrammet mitt. Jeg starter fra et eksempel tilgjengelig på

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

Hovedprogramfilen er control.py - jeg må endre den etter mine behov. Rediger først programmet og lim inn et token:

sudo nano control.py

Finn en linje DEVICE_TOKEN = '…'] og angi et enhetstoken der. Etter det kan jeg bare kjøre programmet: Det fungerer og rapporterer en temperatur i RoomTemp -variabelen:

sudo python control.py

Det fungerer og rapporterer en temperatur i RoomTemp -variabelen.

Vær oppmerksom på at den oppdager alle onewire ds18b20 sensorer

ds_sensors = ds18b20. DS18B20.find_all ()

og bruker den først funnet sensoren:

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

Ok, det var enkelt, fordi prøveprogrammet har alt som kreves for å fungere med ds18b20 -sensor på Raspberry Pi. Nå må jeg finne måten å rapportere strømstatus på.

Trinn 3: UPS -overvåking

UPS -overvåking
UPS -overvåking

Det neste jeg vil overvåke er UPS -status, så hvis det er strømbrudd, vil jeg vite om det før alt kobles fra.

Jeg har en APC UPS med USB -kontroll, så jeg googlet raskt og fant ut at jeg trenger apcupsd. https://www.anites.com/2013/09/monitoring-ups.html… Jeg prøvde flere ganger å installere det via apt-get, og det fungerte ikke for meg av forskjellige årsaker. Jeg viser hvordan du installerer det fra kildene.

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

Deretter redigerer jeg apcupsd.conf for å koble til UPS -en min via usb.

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

Nå kan jeg koble USB -kabelen fra UPS til RaspberryPi og teste om UPS ville bli funnet.

sudo apctest

Det skal ikke gi deg noen feilmeldinger.

Nå bør sevice apcupsd startes:

sudo systemctl start apcupsd

For å spørre UPS -status kan jeg bruke en statuskommando:

sudo /etc/init.d/apcupsd status

Og det ville gi noe som dette:

APC: 001, 035, 0855DATO: 2018-10-14 16:55:30 +0300 HOSTNAME: vcontrol VERSION: 3.14.14 (31. mai 2016) debian UPSNAME: vcontrol CABLE: USB Cable DRIVER: USB UPS Driver UPSMODE: Stand Alone STARTTID: 2018-10-14 16:54:28 +0300 MODELL: Back-UPS XS 650CI STATUS: ONLINE LINEV: 238.0 Volt LOADPCT: 0.0 Prosent BCHARGE: 100.0 Prosent TIDLEFT: 293.3 minutter MBATTCHG: 5 prosent MINTIMEL: 3 minutter MAXTIME: 0 sekunder SENSE: Middels LOTRANS: 140,0 volt HITRANS: 300,0 volt ALARMDEL: 30 sekunder BATTV: 14,2 volt LASTXFER: Ingen overføringer siden turnon NUMXFERS: 0 TONBATT: 0 sekunder CUMONBATT: 0 sekunder XOFFBATT: N/A STATFLAG: 0x0TAT08: 0x0TAT08: 0x0TAT08: 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

Jeg trenger en status - som er linjen "STATUS:".

Cloud4rpi -biblioteket inneholder en modul ‘rpy.py’ som returnerer Raspberry Pi -systemparametere, for eksempel vertsnavn eller cpu -temperatur. Siden alle disse paramene er et resultat av å kjøre noen kommandoer og analysere utdata, inneholder den også en praktisk 'parse_output' -funksjon som gjør akkurat det jeg trenger. Slik får du UPS -statusen min:

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

For å sende denne statusen til cloud4rpi, må jeg deklarere en variabel UPSStatus og binde den til ups_status -funksjonen min: Nå kan jeg kjøre programmet mitt:

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

Og jeg kan umiddelbart se variabelen min på cloud4rpi -enhetssiden.

Trinn 4: Forberedelse til "produksjon"

Forbereder seg på "produksjon"
Forbereder seg på "produksjon"

Alt fungerer, og nå må jeg forberede enheten til uovervåket modus.

Til å begynne med skal jeg justere tidsintervaller. Avstemningsintervallet definerer hvor ofte programmet sjekker temperatur og UPS -status - sett det til ett sekund.

Resultatene sendes til skyen hvert 5. minutt, og diagnostisk informasjon - hver time.

# KonstanterDATA_SENDING_INTERVAL = 300 # sek DIAG_SENDING_INTERVAL = 3600 # sek POLL_INTERVAL = 1 # sek

Når UPS -statusen endres - jeg vil ikke at enheten skal vente i 5 minutter, og jeg sender data umiddelbart. Så jeg har endret hovedløkken litt, og den ser slik ut:

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

Testing: run script:

sudo python control.py

Og jeg kan se UPS -status på enhetssiden min.

Hvis jeg slår av UPS -strømmen, endres statusen i løpet av et par sekunder, så alt fungerer. Nå må jeg starte apcupsd og control.py på systemoppstarten. Apcupsd -tjenesten er gammel, og for å starte den på moderne raspbian, bør jeg endre /etc/init.d/apcupsd -filen ved å legge til disse linjene et sted øverst:

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

Aktiver deretter tjenesten:

sudo systemctl aktiver apcupsd

Start deretter tjenesten:

sudo systemctl start apcupsd

Nå vil apcupsd startes ved systemoppstart.

For å installere control.py som en tjeneste, brukte jeg det medfølgende service_install.sh -skriptet:

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

Nå er tjenesten startet, og den skal overleve en omstart.

Trinn 5: Konfigurere et kontrollpanel

Sette opp et kontrollpanel
Sette opp et kontrollpanel

Cloud4rpi lar meg sette opp et kontrollpanel for enheten min. Du kan legge til "widgets" og knytte dem til enhetsvariabler.

Enheten min har to skrivebeskyttede variabler - RoomTemp og UPSStatus:

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

Jeg la til 3 widgets - Nummer for RoomTemp, Tekst for UPSStatus og et diagram for RoomTemp.

Jeg kan konfigurere varsler, så jeg mottar en e -post når temperaturen er utenfor det angitte området, UPS gikk frakoblet eller enheten selv ikke sender data når den skulle. Nå kan jeg være sikker på at huset mitt er ok, og jeg kan bli varslet når noe er galt, så jeg kan ringe naboer og be dem sjekke hva som skjer. Her er den faktiske koden til control.py.

Anbefalt: