Spisu treści:

Monitorowanie domu DIY za pomocą RaspberryPi i Cloud4Rpi: 5 kroków
Monitorowanie domu DIY za pomocą RaspberryPi i Cloud4Rpi: 5 kroków

Wideo: Monitorowanie domu DIY za pomocą RaspberryPi i Cloud4Rpi: 5 kroków

Wideo: Monitorowanie domu DIY za pomocą RaspberryPi i Cloud4Rpi: 5 kroków
Wideo: OMV 5 Raspberry Pi 4 Raspbian Buster | Tutorial 2024, Listopad
Anonim
Monitorowanie domu DIY za pomocą RaspberryPi i Cloud4Rpi
Monitorowanie domu DIY za pomocą RaspberryPi i Cloud4Rpi

Pewnego zimowego weekendu pojechałem do mojego wiejskiego domu i dowiedziałem się, że jest tam bardzo zimno. Coś się stało z prądem i wyłącznik RCD go wyłączył, a ogrzewanie też się wyłączyło. Miałem szczęście, że tam trafiłem, inaczej za kilka dni wszystko byłoby zamarznięte, co bardzo szkodzi rurom i kaloryferom.

Miałem kilka Raspberry Pi i czujnik termiczny, więc pomyślałem - dlaczego nie zrobię prostego urządzenia monitorującego? Poniższe instrukcje zakładają, że masz Raspberry Pi z konfiguracją Raspbian i połączeniem sieciowym. W moim przypadku jest to Raspberry Pi B+ z Raspbianem (2018–06–27-raspbian-stretch-lite).

Krok 1: Monitorowanie temperatury

Monitorowanie temperatury
Monitorowanie temperatury
Monitorowanie temperatury
Monitorowanie temperatury

Jak podłączyć czujnik temperatury DS18B20? Po prostu wyszukaj w Google, jak to zrobić, a zobaczysz wiele takich zdjęć:

W moim przypadku miałem przewody czarny, żółty i czerwony. Czarny to masa, idzie do pinu uziemienia, czerwony to zasilanie - idzie do pinu 3.3v, a żółty to dane - powinien iść do pinu GPIO4, z rezystorem 4,7 kOm podłączonym między danymi a zasilaniem. Uwaga, można podłączyć kilka czujników równolegle (są cyfrowe i mają różne adresy) wystarczy jeden rezystor. Po podłączeniu czujnika należy włączyć 1Wire w raspi-config:

sudo raspi-config

Przejdź do 5 opcji interfejsu, włącz P7 1-Wire i uruchom ponownie.

Następnie możesz sprawdzić, czy widzisz czujnik:

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

Powinieneś zobaczyć coś takiego:

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

28–00044eae2dff to nasz czujnik temperatury.

Sprzęt jest gotowy. Teraz muszę ustawić monitoring. Potrzebuję czegoś, co pokaże mi dane i powiadomi mnie, jeśli urządzenie jest na chwilę odłączone, nie ma zasilania lub temperatura jest niska. Oczywiście to nie może być samo raspberry pi, powinien być jakiś serwer lub usługa w Internecie, która monitoruje moje urządzenie.

Mogę stworzyć prosty serwer, zdobyć hosting i wszystko skonfigurować, ale szczerze mówiąc, nie chcę. Na szczęście ktoś już o tym pomyślał i stworzył cloud4rpi.io - panel sterowania w chmurze dla Twojego urządzenia.

Krok 2: Konfiguracja Cloud4Rpi.io

Konfigurowanie Cloud4Rpi.io
Konfigurowanie Cloud4Rpi.io

Cloud4Rpi zapewnia usługę, która umożliwia urządzeniu wysyłanie i odbieranie danych za pomocą protokołów MQTT lub HTTP. Mają bibliotekę kliencką dla Pythona, więc użyję Pythona.

Przykłady Pythona dostarczane z usługą Cloud4Rpi zawierają już kod czujnika temperatury DS18B20.

Poszedłem więc na https://cloud4rpi.io, założyłem konto i dodałem tam nowe urządzenie. Na stronie urządzenia znajduje się token - ciąg znaków identyfikujący urządzenie, który należy podać w programie wysyłającym dane.

Na początek zawsze dobrze jest zaktualizować menedżera pakietów i uaktualnić pakiety (uwaga: może to zająć kilka godzin, jeśli nie aktualizowałeś przez jakiś czas):

aktualizacja sudo apt-get && aktualizacja sudo apt-get

Następnie zainstaluj git, Python i jego menedżera pakietów Pip:

sudo apt-get zainstaluj git python python-pip

Następnie zainstaluj bibliotekę Python cloud4rpi:

sudo pip zainstaluj cloud4rpi

Wreszcie jestem gotowy do napisania programu sterującego. Zaczynam od przykładu dostępnego pod adresem

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

Główny plik programu to control.py - muszę go zmodyfikować do swoich potrzeb. Najpierw edytuj program i wklej token:

sudo nano control.py

Znajdź wiersz DEVICE_TOKEN='…'] i określ tam token urządzenia. Potem mogę po prostu uruchomić program: Działa i zgłasza temperaturę w zmiennej RoomTemp:

sudo python control.py

Działa i zgłasza temperaturę w zmiennej RoomTemp.

Zauważ, że wykrywa wszystkie czujniki onewire ds18b20

ds_czujniki = ds18b20. DS18B20.find_all()

i używa pierwszego znalezionego czujnika:

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

Ok, to było proste, bo przykładowy program ma wszystko, co jest wymagane do pracy z czujnikiem ds18b20 na Raspberry Pi. Teraz muszę znaleźć sposób na zgłoszenie stanu zasilania.

Krok 3: Monitorowanie UPS

Monitorowanie UPS
Monitorowanie UPS

Następną rzeczą, którą chcę monitorować, jest stan UPS, więc jeśli nastąpi przerwa w zasilaniu, będę o tym wiedział, zanim wszystko się rozłączy.

Mam UPS APC ze sterowaniem USB, więc szybko googlowałem i stwierdziłem, że potrzebuję apcupsd. https://www.anites.com/2013/09/monitoring-ups.html… Kilka razy próbowałem zainstalować go przez apt-get, ale z różnych powodów nie działało. Pokażę, jak zainstalować go ze źródeł.

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

Następnie edytuję plik apcupsd.conf, aby połączyć się z moim UPS przez USB.

sudo nano /etc/apcupsd/apcupsd.conf# #UPSCABLE smart UPSCABLE usb # #UPSTYPE apcsmart #URZĄDZENIE /dev/ttyS0 UPSTYPE usb URZĄDZENIE

Teraz mogę podłączyć kabel USB z UPS do RaspberryPi i sprawdzić, czy UPS zostanie znaleziony.

sudo apctest

Nie powinno dawać żadnych komunikatów o błędach.

Teraz należy uruchomić sevice apcupsd:

sudo systemctl start apcupsd

Aby zapytać o status UPS, mogę użyć polecenia statusu:

sudo /etc/init.d/apcupsd status

I wygeneruje coś takiego:

APC: 001, 035, 0855 DATA: 2018-10-14 16:55:30 +0300 HOSTNAME: vcontrol WERSJA: 3.14.14 (31 maja 2016) debian UPSNAME: vcontrol CABLE: USB Cable 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 V LOADPCT: 0,0 procent BCHARGE: 100,0 procent TIMELEFT: 293,3 minuty MBATTCHG: 5 procent MINTIMEL: 3 minuty MAXTIME: 0 sekund SENSE: Średni LOTRANS: 140,0 V HITRANS: 300,0 V ALARMDEL: 30 sekund BATTV: 14,2 V LASTXFER: Brak transferów od momentu włączenia NUMXFERS: 0 TONBATT: 0 sekund CUMONBATT: 0 sekund XOFFBATT: BRAK BATTV STATNO05000008: 3: 2014-06-10 NOMINV: 230 V NOMBATTV: 12,0 V NOMPOWER: 390 W FIRMWARE: 892. R3. I USB FW:R3 END APC: 2018-10-14 16:55:38 +0300

Potrzebuję statusu – którym jest wiersz „STATUS:”.

Biblioteka Cloud4rpi zawiera moduł „rpy.py”, który zwraca parametry systemu Raspberry Pi, takie jak nazwa hosta czy temperatura procesora. Ponieważ wszystkie te parametry są wynikiem uruchomienia niektórych poleceń i analizowania danych wyjściowych, zawiera również przydatną funkcję „parse_output”, która robi dokładnie to, czego potrzebuję. Oto jak uzyskać status mojego UPS:

def ups_status(): wynik = rpi.parse_output(r'STATUS\s+:\s+(S+)', ['/etc/init.d/apcupsd', 'status']) if wynik: zwróć wynik else: zwróć 'NIEZNANY'

Aby wysłać ten status do cloud4rpi, muszę zadeklarować zmienną UPSStatus i powiązać ją z moją funkcją ups_status: Teraz mogę uruchomić mój program:

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

I od razu widzę moją zmienną na stronie urządzenia cloud4rpi.

Krok 4: Przygotowanie do „produkcji”

Przygotowanie do „produkcji”
Przygotowanie do „produkcji”

Wszystko działa, a teraz muszę przygotować urządzenie do trybu nienadzorowanego.

Na początek dostosuję odstępy czasu. Interwał sondowania określa, jak często program sprawdza temperaturę i stan UPS - ustaw go na jedną sekundę.

Wyniki przesyłane są do chmury co 5 minut, a informacje diagnostyczne - co godzinę.

# StałeDATA_SENDING_INTERVAL = 300 # sek DIAG_SENDING_INTERVAL = 3600 # sek POLL_INTERVAL = 1 # sek

Kiedy status UPS się zmieni - nie chcę, żeby moje urządzenie czekało 5 minut i wysyłam dane natychmiast. Zmodyfikowałem więc nieco główną pętlę i wygląda to tak:

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

Testowanie: uruchom skrypt:

sudo python control.py

I mogę oglądać status UPS na stronie mojego urządzenia.

Jeśli wyłączę zasilanie UPS, status zmieni się w ciągu kilku sekund, więc wszystko działa. Teraz muszę uruchomić apcupsd i mój control.py przy starcie systemu. Usługa Apcupsd jest stara i aby uruchomić ją na współczesnym raspbianie, powinienem zmodyfikować plik /etc/init.d/apcupsd, dodając te wiersze gdzieś na górze:

### BEGIN INIT INFO# Zapewnia: apcupsd # Wymagane-Start: $all # Wymagane-Stop: # Domyślne-Start: 2 3 4 5 # Domyślne-Stop: # Krótki opis: Demon APC UPS… ### END INIT INFO#

Następnie włącz usługę:

sudo systemctl włącz apcupsd

Następnie uruchom usługę:

sudo systemctl start apcupsd

Teraz appcupsd zostanie uruchomiony przy starcie systemu.

Aby zainstalować control.py jako usługę, użyłem dostarczonego skryptu service_install.sh:

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

Teraz usługa jest uruchomiona i powinna przetrwać ponowne uruchomienie.

Krok 5: Konfiguracja panelu sterowania

Konfigurowanie panelu sterowania
Konfigurowanie panelu sterowania

Cloud4rpi pozwala mi skonfigurować panel sterowania dla mojego urządzenia. Możesz dodać „widżety” i powiązać je ze zmiennymi urządzeń.

Moje urządzenie udostępnia dwie zmienne tylko do odczytu - RoomTemp i UPSStatus:

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

Dodałem 3 widżety - Number for RoomTemp, Text for UPSStatus i Chart for RoomTemp.

Mogę ustawić alerty, więc otrzymuję wiadomość e-mail, gdy temperatura jest poza określonym zakresem, UPS przełączył się w tryb offline lub samo urządzenie nie wysyła danych w odpowiednim czasie. Teraz mogę być pewien, że mój domek na wsi jest w porządku i mogę otrzymywać powiadomienia kiedy coś jest nie tak, żebym mógł zadzwonić do sąsiadów i poprosić ich, żeby sprawdzili, co się dzieje. Oto rzeczywisty kod pliku control.py.

Zalecana: