Inhoudsopgave:
- Stap 1: Temperatuurbewaking
- Stap 2: Cloud4Rpi.io instellen
- Stap 3: UPS-bewaking
- Stap 4: Voorbereiden op “productie”
- Stap 5: Een configuratiescherm instellen
Video: DIY-huisbewaking met RaspberryPi en Cloud4Rpi - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:16
Op een winterweekend ging ik naar mijn landhuis en ontdekte dat het daar erg koud was. Er was iets met de elektriciteit gebeurd en de aardlekschakelaar had hem uitgeschakeld en ook de verwarming was uitgevallen. Ik had geluk dat ik daar kwam, anders zou binnen een paar dagen alles bevroren zijn, wat erg slecht is voor de leidingen en de radiatoren.
Ik had verschillende Raspberry Pi's in de buurt en een thermische sensor, dus ik dacht: waarom maak ik geen eenvoudig bewakingsapparaat? De onderstaande instructies gaan ervan uit dat je een Raspberry Pi met Raspbian en netwerkverbinding hebt ingesteld. In mijn geval is het Raspberry Pi B+ met Raspbian (2018-06-27-raspbian-stretch-lite).
Stap 1: Temperatuurbewaking
Hoe sluit ik een DS18B20 temperatuursensor aan? Google gewoon hoe je dit moet doen, en je zult veel foto's zien zoals deze:
In mijn geval had ik zwarte, gele en rode draden. De zwarte is aarde, gaat naar de grondpin, de rode is stroom - gaat naar 3,3 V-pin en de gele is data - moet naar de GPIO4-pin gaan, met een weerstand van 4,7 kOm aangesloten tussen data en voeding. Let op, u kunt verschillende sensoren aansluiten parallel (ze zijn digitaal en hebben verschillende adressen), hebt u slechts één weerstand nodig. Nadat u uw sensor hebt aangesloten, moet u 1Wire inschakelen in de raspi-config:
sudo raspi-config
Ga naar 5 interface-opties, schakel P7 1-Wire in en start opnieuw op.
Dan kun je testen of je de sensor kunt zien:
sudo modprobe w1-gpiosudo modprobe w1-thermls /sys/bus/w1/devices/
Je zou zoiets als dit moeten zien:
pi@vcontrol:~ $ ls /sys/bus/w1/devices/28–00044eae2dff w1_bus_master1
28–00044eae2dff is onze temperatuursensor.
Hardware is klaar. Nu moet ik het bewakingsgedeelte instellen. Ik heb iets nodig dat me de gegevens laat zien en me op de hoogte stelt als het apparaat een tijdje is losgekoppeld, als er geen stroom is of als de temperatuur laag is. Uiteraard kan dit geen raspberry pi zelf zijn, er zou een server of service op internet moeten zijn die mijn apparaat bewaakt.
Ik kan een eenvoudige server maken, een hosting krijgen en alles instellen, maar eerlijk gezegd wil ik dat niet. Gelukkig heeft iemand hier al over nagedacht en cloud4rpi.io gemaakt - een cloudconfiguratiescherm voor je apparaat.
Stap 2: Cloud4Rpi.io instellen
Cloud4Rpi biedt een service waarmee uw apparaat gegevens kan verzenden en ontvangen met behulp van MQTT- of HTTP-protocollen. Ze hebben een clientbibliotheek voor Python, dus ik zal Python gebruiken.
Python-voorbeelden die bij de Cloud4Rpi-service worden geleverd, bevatten al code voor de DS18B20-temperatuursensor.
Dus ging ik naar https://cloud4rpi.io, maakte een account aan en voegde daar een nieuw apparaat toe. De apparaatpagina heeft een token - een tekenreeks die het apparaat identificeert en die moet worden opgegeven in het programma dat gegevens verzendt.
Om te beginnen is het altijd een goed idee om een pakketbeheerder bij te werken en pakketten te upgraden (let op: het kan uren duren als je een tijdje niet hebt geüpgraded):
sudo apt-get update && sudo apt-get upgrade
Installeer vervolgens git, Python en zijn pakketbeheerder Pip:
sudo apt-get install git python python-pip
Installeer vervolgens de cloud4rpi Python-bibliotheek:
sudo pip installeer cloud4rpi
Eindelijk ben ik klaar om mijn controleprogramma te schrijven. Ik ga uit van een voorbeeld dat beschikbaar is op
git clone https://github.com/cloud4rpi/cloud4rpi-raspberrypi… cloud4rpicd cloud4rpi
Het hoofdprogrammabestand is control.py - ik moet het aanpassen aan mijn behoeften. Bewerk eerst het programma en plak een token:
sudo nano control.py
Zoek een regel DEVICE_TOKEN='…'] en geef daar een apparaattoken op. Daarna kan ik gewoon het programma uitvoeren: het werkt en meldt een temperatuur in de RoomTemp-variabele:
sudo python control.py
Het werkt en rapporteert een temperatuur in de RoomTemp-variabele.
Merk op dat het alle onewire ds18b20-sensoren ontdekt
ds_sensors = ds18b20. DS18B20.find_all()
en gebruikt de eerst gevonden sensor:
RoomTemp': { 'type': 'numeric', 'bind': ds_sensors [0] if ds_sensors else Geen }
Oké, dat was makkelijk, want het voorbeeldprogramma heeft alles wat nodig is om met de ds18b20-sensor op de Raspberry Pi te werken. Nu moet ik de manier vinden om de stroomstatus te melden.
Stap 3: UPS-bewaking
Het volgende dat ik wil controleren, is de UPS-status, dus als er een stroomstoring is, weet ik dat voordat alles wordt verbroken.
Ik heb een APC UPS met USB-besturing, dus ik ging snel googlen en ontdekte dat ik apcupsd nodig had. https://www.anites.com/2013/09/monitoring-ups.html… Ik heb verschillende keren geprobeerd om het te installeren via apt-get, en het werkte om verschillende redenen niet voor mij. Ik zal laten zien hoe het te installeren vanuit de bronnen.
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
Vervolgens bewerk ik apcupsd.conf om via usb verbinding te maken met mijn UPS.
sudo nano /etc/apcupsd/apcupsd.conf# #UPSCABLE smart UPSCABLE usb # #UPSTYPE apcsmart #DEVICE /dev/ttyS0 UPSTYPE usb-APPARAAT
Nu kan ik de USB-kabel van UPS naar RaspberryPi pluggen en testen of UPS zou worden gevonden.
sudo apctest
Het zou u geen foutmeldingen moeten geven.
Nu moet sevice apcupsd worden gestart:
sudo systemctl start apcupsd
Om de status van de UPS op te vragen kan ik een statuscommando gebruiken:
sudo /etc/init.d/apcupsd status
En het zou zoiets als dit opleveren:
APC: 001, 035, 0855DATUM: 2018-10-14 16:55:30 +0300 HOSTNAME: vcontrol VERSIE: 3.14.14 (31 mei 2016) debian UPSNAME: vcontrol KABEL: USB-kabel DRIVER: USB UPS-stuurprogramma UPSMODE: stand-alone STARTTIJD: 2018-10-14 16:54:28 +0300 MODEL: Back-UPS XS 650CI STATUS: ONLINE LINEV: 238,0 Volt LOADPCT: 0,0 procent BCHARGE: 100,0 procent TIMELEFT: 293,3 minuten MBATCHG: 5 procent MINTIMEL: 3 minuten MAXTIME: 0 Seconden SENSE: Medium LOTRANS: 140,0 Volt HITRANS: 300,0 Volt ALARMDEL: 30 Seconden BATTV: 14,2 Volt LASTXFER: Geen overdrachten sinds inschakelen NUMXFERS: 0 TONBATT: 0 Seconden CUMONBATT: 0 Seconden XOFFBATT 0000X24 SERIAL 0xATNOFLAG: 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
Ik heb een status nodig, namelijk de regel "STATUS:".
Cloud4rpi-bibliotheek bevat een module 'rpy.py' die Raspberry Pi-systeemparameters zoals hostnaam of cpu-temperatuur retourneert. Aangezien al die parameters resultaten zijn van het uitvoeren van enkele opdrachten en het ontleden van uitvoer, bevat het ook een handige functie 'parse_output' die precies doet wat ik nodig heb. Zo krijg ik mijn UPS-status:
def ups_status(): resultaat = rpi.parse_output(r'STATUS\s+:\s+(S+)', ['/etc/init.d/apcupsd', 'status']) if result: return resultaat else: return 'ONBEKEND'
Om deze status naar cloud4rpi te sturen, moet ik een variabele UPSStatus declareren en deze aan mijn ups_status-functie binden: Nu kan ik mijn programma uitvoeren:
variabelen = { 'RoomTemp': { 'type': 'numeric', 'bind': ds_sensors [0] }, 'UPSStatus': { 'type': 'string', 'bind': ups_status } }
En ik kan mijn variabele meteen zien op de cloud4rpi-apparaatpagina.
Stap 4: Voorbereiden op “productie”
Alles werkt en nu moet ik mijn apparaat voorbereiden op de modus zonder toezicht.
Om te beginnen ga ik tijdsintervallen aanpassen. Poll-interval bepaalt hoe vaak het programma controleert op temperatuur en UPS-status - stel dit in op één seconde.
Resultaten worden elke 5 minuten naar de cloud gestuurd, en diagnostische informatie - elk uur.
# ConstantenDATA_SENDING_INTERVAL = 300 # sec DIAG_SENDING_INTERVAL = 3600 # sec POLL_INTERVAL = 1 # sec
Als de UPS-status verandert, wil ik niet dat mijn apparaat 5 minuten wacht en verzend ik de gegevens onmiddellijk. Dus ik heb de hoofdlus iets aangepast en het ziet er als volgt uit:
data_timer = 0diag_timer = 0 prevUPS = 'ONLINE' while True: newUPS = ups_status() if (data_timer <= 0) of (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
Testen: script uitvoeren:
sudo python control.py
En ik kan de UPS-status bekijken op mijn apparaatpagina.
Als ik de stroom van de UPS uitzet, verandert de status binnen een paar seconden, dus alles werkt. Nu moet ik apcupsd en mijn control.py starten bij het opstarten van het systeem. Apcupsd-service is oud en om het op moderne raspbian te starten, moet ik het bestand /etc/init.d/apcupsd wijzigen door deze regels ergens bovenaan toe te voegen:
### BEGIN INIT INFO# Biedt: apcupsd # Required-Start: $all # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: APC UPS-daemon… ### END INIT INFO#
Schakel vervolgens de service in:
sudo systemctl activeer apcupsd
Start dan de dienst:
sudo systemctl start apcupsd
Nu wordt apcupsd gestart bij het opstarten van het systeem.
Om control.py als een service te installeren, heb ik het meegeleverde script service_install.sh gebruikt:
sudo bash service_install.sh ~/cloud4rpi/control.py
Nu is de service gestart en moet deze een herstart overleven.
Stap 5: Een configuratiescherm instellen
Met Cloud4rpi kan ik een configuratiescherm voor mijn apparaat instellen. U kunt "widgets" toevoegen en deze aan apparaatvariabelen binden.
Mijn apparaat biedt twee alleen-lezen variabelen: RoomTemp en UPSStatus:
variabelen = { 'RoomTemp': { 'type': 'numeric', 'bind': ds_sensors [0] }, 'UPSStatus': { 'type': 'string', 'bind': ups_status } }
Ik heb 3 widgets toegevoegd - Nummer voor RoomTemp, Tekst voor UPSStatus en een grafiek voor RoomTemp.
Ik kan waarschuwingen instellen, zodat ik een e-mail ontvang wanneer de temperatuur buiten het gespecificeerde bereik ligt, de UPS offline is gegaan of het apparaat zelf geen gegevens verzendt wanneer dat zou moeten. Nu weet ik zeker dat mijn landhuis in orde is en kan ik een melding krijgen als er iets aan de hand is, kan ik buren bellen en vragen wat er aan de hand is. Hier is de eigenlijke code van de control.py.
Aanbevolen:
Hoe te beginnen met RaspberryPi: 9 stappen
Hoe te beginnen met RaspberryPi: in deze instructable laat ik je zien hoe je op een andere manier met RashpberryPi kunt beginnen
DIY slimme weegschaal met wekker (met wifi, ESP8266, Arduino IDE en Adafruit.io): 10 stappen (met afbeeldingen)
DIY Slimme Weegschaal Met Wekker (met Wi-Fi, ESP8266, Arduino IDE en Adafruit.io): In mijn vorige project ontwikkelde ik een slimme weegschaal met Wi-Fi. Het kan het gewicht van de gebruiker meten, het lokaal weergeven en naar de cloud sturen. U kunt hier meer informatie over krijgen op onderstaande link: https://www.instructables.com/id/Wi-Fi-Smart-Scale-wi
Een goedkope IoT-luchtkwaliteitsmonitor op basis van RaspberryPi 4: 15 stappen (met afbeeldingen)
Een goedkope IoT-luchtkwaliteitsmonitor op basis van RaspberryPi 4: Santiago, Chili tijdens een winterse milieunoodsituatie hebben het voorrecht om in een van de mooiste landen ter wereld te wonen, maar helaas zijn het niet allemaal rozen. Chili heeft tijdens het winterseizoen veel last van luchtverontreiniging, ma
Temperatuur bewaken en opnemen met Bluetooth LE en RaspberryPi 9 stappen (met afbeeldingen) Antwoorden op al uw "Hoe?"
Monitor en registreer temperatuur met Bluetooth LE en RaspberryPi: deze instructie gaat over het samenstellen van een multi-node temperatuurbewakingssysteem met Bluetooth LE-sensorbug van Blue Radios (BLEHome) en RaspberryPi 3B Dankzij de ontwikkeling van de Bluetooth LE-standaard is er nu direct beschikbaar
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino - Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter - RC Helikopter - RC-vliegtuig met Arduino: 5 stappen (met afbeeldingen)
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino | Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter | RC Helikopter | Rc-vliegtuig met Arduino: een Rc-auto besturen | Quadcopter | Drone | RC vliegtuig | RC-boot, we hebben altijd een ontvanger en zender nodig, stel dat we voor RC QUADCOPTER een 6-kanaals zender en ontvanger nodig hebben en dat type TX en RX is te duur, dus we gaan er een maken op onze