Innehållsförteckning:

DIY husövervakning med RaspberryPi och Cloud4Rpi: 5 steg
DIY husövervakning med RaspberryPi och Cloud4Rpi: 5 steg

Video: DIY husövervakning med RaspberryPi och Cloud4Rpi: 5 steg

Video: DIY husövervakning med RaspberryPi och Cloud4Rpi: 5 steg
Video: The Choice is Ours (2016) Official Full Version 2024, November
Anonim
DIY husövervakning med RaspberryPi och Cloud4Rpi
DIY husövervakning med RaspberryPi och Cloud4Rpi

En vinterhelg gick jag till mitt hus och fick reda på att det var väldigt kallt där. Något hade hänt med el och jordfelsbrytaren hade stängt av och värmen gick också. Jag hade tur att jag kom dit, annars hade på flera dagar allt varit fryst vilket är mycket dåligt för rören och radiatorerna.

Jag hade flera Raspberry Pi och en termosensor, så jag tänkte - varför gör jag inte en enkel övervakningsenhet? Instruktionerna nedan förutsätter att du har en Raspberry Pi med Raspbian och nätverksanslutning konfigurerad. I mitt fall är det Raspberry Pi B+ med Raspbian (2018–06–27-raspbian-stretch-lite).

Steg 1: Temperaturövervakning

Temperaturövervakning
Temperaturövervakning
Temperaturövervakning
Temperaturövervakning

Hur ansluter jag en DS18B20 temperaturgivare? Googla bara hur du gör så ser du många bilder som den här:

I mitt fall hade jag svarta, gula och röda ledningar. Den svarta är jordad, går till jordstift, den röda är ström - går till 3,3v stift och den gula är data - ska gå till GPIO4 -stift, med 4,7 kOm motstånd anslutet mellan data och effekt. Observera att du kan ansluta flera sensorer parallellt (de är digitala och har olika adresser) behöver du bara ett motstånd. När du har anslutit din sensor bör du aktivera 1Wire i raspi-config:

sudo raspi-config

Gå till 5 gränssnittsalternativ, aktivera P7 1-Wire och starta om.

Sedan kan du testa om du kan se sensorn:

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

Du borde se något så här:

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

28–00044eae2dff är vår temperatursensor.

Hårdvaran är klar. Nu måste jag konfigurera övervakningsdelen. Jag behöver något som visar mig data och meddelar mig om enheten är frånkopplad ett tag eller om det inte finns någon ström eller temperaturen är låg. Uppenbarligen kan detta inte vara hallon pi själv, det borde finnas någon server eller tjänst på internet som övervakar min enhet.

Jag kan skapa en enkel server, skaffa en värd och ställa in allt, men det vill jag inte. Lyckligtvis har någon redan tänkt på detta och skapat cloud4rpi.io - en molnkontrollpanel för din enhet.

Steg 2: Konfigurera Cloud4Rpi.io

Konfigurera Cloud4Rpi.io
Konfigurera Cloud4Rpi.io

Cloud4Rpi tillhandahåller en tjänst som låter din enhet skicka och ta emot data med MQTT- eller HTTP -protokoll. De har ett klientbibliotek för Python, så jag använder Python.

Python -exempel som följer med Cloud4Rpi -tjänsten innehåller redan kod för DS18B20 temp -sensor.

Så jag gick till https://cloud4rpi.io, skapade ett konto och lade till en ny enhet där. Enhetssidan har en token - en sträng som identifierar enheten och som bör anges i programmet som skickar data.

Till att börja med är det alltid en bra idé att uppdatera en pakethanterare och uppgradera paket (observera: det kan ta timmar om du inte har uppgraderat på ett tag):

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

Installera sedan git, Python och dess pakethanterare Pip:

sudo apt-get install git python python-pip

Installera sedan cloud4rpi Python -bibliotek:

sudo pip installera cloud4rpi

Slutligen är jag redo att skriva mitt kontrollprogram. Jag utgår från ett exempel som finns på

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

Den huvudsakliga programfilen är control.py - jag måste ändra den efter mina behov. Redigera först programmet och klistra in en token:

sudo nano control.py

Hitta en rad DEVICE_TOKEN = '…'] och ange en enhetstoken där. Efter det kan jag helt enkelt köra programmet: Det fungerar och rapporterar en temperatur i RoomTemp -variabeln:

sudo python control.py

Det fungerar och rapporterar en temperatur i RoomTemp -variabeln.

Observera att den upptäcker alla onewire ds18b20 -sensorer

ds_sensors = ds18b20. DS18B20.find_all ()

och använder den först hittade sensorn:

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

Ok, det var enkelt, eftersom provprogrammet har allt som krävs för att fungera med ds18b20 -sensorn på Raspberry Pi. Nu måste jag hitta sättet att rapportera strömstatus.

Steg 3: UPS -övervakning

UPS -övervakning
UPS -övervakning

Nästa sak jag vill övervaka är UPS -status, så om det blir strömavbrott kommer jag att veta om det innan allt kopplas bort.

Jag har en APC UPS med USB -kontroll, så jag googlade snabbt och fann att jag behöver apcupsd. https://www.anites.com/2013/09/monitoring-ups.html… Jag försökte installera det flera gånger via apt-get, och det fungerade inte för mig av olika skäl. Jag visar hur du installerar det från källorna.

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

Sedan redigerar jag apcupsd.conf för att ansluta till min UPS via usb.

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

Nu kan jag ansluta USB -kabeln från UPS till RaspberryPi och testa om UPS skulle hittas.

sudo apctest

Det ska inte ge dig några felmeddelanden.

Nu ska sevice apcupsd startas:

sudo systemctl start apcupsd

För att fråga UPS -status kan jag använda ett statuskommando:

sudo /etc/init.d/apcupsd status

Och det skulle mata ut något så här:

APC: 001, 035, 0855DATUM: 2018-10-14 16:55:30 +0300 HOSTNAME: vcontrol VERSION: 3.14.14 (31 maj 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 procent BCHARGE: 100,0 procent TIMELEFT: 293,3 minuter MBATTCHG: 5 procent MINTIMEL: 3 minuter MAXTIME: 0 sekunder SENSE: Medium LOTRANS: 140,0 volt HITRANS: 300,0 volt ALARMDEL: 30 sekunder BATTV: 14,2 volt LASTXFER: Inga överföringar sedan vändning 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

Jag behöver en status - som är raden "STATUS:".

Cloud4rpi -biblioteket innehåller en modul 'rpy.py' som returnerar Raspberry Pi -systemparametrar som värdnamn eller CPU -temperatur. Eftersom alla dessa parametrar är resultatet av att köra några kommandon och analysera utdata, innehåller den också en praktisk "parse_output" -funktion som gör precis vad jag behöver. Så här får jag min UPS -status:

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

För att skicka denna status till cloud4rpi måste jag deklarera en variabel UPSStatus och binda den till min ups_status -funktion: Nu kan jag köra mitt program:

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

Och jag kan omedelbart se min variabel på cloud4rpi -enhetssidan.

Steg 4: Förberedelse för "produktion"

Förbereder för "produktion"
Förbereder för "produktion"

Allt fungerar, och nu måste jag förbereda min enhet till obevakat läge.

Till att börja med ska jag justera tidsintervallen. Omfrågningsintervallet definierar hur ofta programmet kontrollerar temperatur och UPS -status - ställ in det på en sekund.

Resultaten skickas till molnet var 5: e minut och diagnostisk information - varje timme.

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

När UPS -status ändras - jag vill inte att min enhet ska vänta i 5 minuter, och jag skickar data direkt. Så jag har modifierat huvudslingan något och det ser ut så här:

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

Testa: kör skript:

sudo python control.py

Och jag kan se UPS -status på min enhets sida.

Om jag stänger av UPS -strömmen ändras status på ett par sekunder, så allt fungerar. Nu måste jag starta apcupsd och min control.py vid systemstart. Apcupsd -tjänsten är gammal och för att starta den på modern raspbian bör jag ändra filen /etc/init.d/apcupsd genom att lägga till dessa rader någonstans högst upp:

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

Aktivera sedan tjänsten:

sudo systemctl aktivera apcupsd

Starta sedan tjänsten:

sudo systemctl start apcupsd

Nu startas apcupsd vid systemstart.

För att installera control.py som en tjänst använde jag det medföljande scriptet service_install.sh:

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

Nu startas tjänsten och den ska överleva en omstart.

Steg 5: Konfigurera en kontrollpanel

Konfigurera en kontrollpanel
Konfigurera en kontrollpanel

Cloud4rpi låter mig konfigurera en kontrollpanel för min enhet. Du kan lägga till "widgets" och binda dem till enhetsvariabler.

Min enhet har två skrivskyddade variabler - RoomTemp och UPSStatus:

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

Jag lade till tre widgets - Nummer för RoomTemp, Text för UPSStatus och ett diagram för RoomTemp.

Jag kan ställa in varningar, så jag får ett e -postmeddelande när temperaturen är utanför det angivna intervallet, UPS gick offline eller själva enheten skickar inte data när det ska. Nu kan jag vara säker på att mitt hus är ok och jag kan meddelas när något är fel, så jag kan ringa grannar och be dem kontrollera vad som händer. Här är den faktiska koden för control.py.

Rekommenderad: