Od dłuższego czasu jestem posiadaczem Czujnika opadów deszczu YL-83. Urządzenie posiada wyjście analogowe i cyfrowe. Z uwagi na to, że raspberry pi nie posiada wyjścia analogowego ( w przeciwieństwie do Arduino ), nie możemy odczytać dokładnej wartości opadów. Otrzymamy tylko informacje o przejściu urządzenia w stan niski lub wysoki. Jeśli chodzi o opady deszczu w zupełności nam wystarczy informacja czy i jak długo padało.
O ile podłączenie i napisanie prostego skryptu do obsługi czujnika w raspberry nie jest trudne, o tyle podłączenie go do Domoticza stanowiło dla mnie nie lada wyzwanie. Domyślnie Domoticz nie obsługuje urządzeń komunikujących się poprzez zmianę stanu ( np. czujnik ruchu, czujnik wilgotności gleby czy powyższy czujnik opadów ). W sieci jest kilka rozwiązań, ale wydały mi się one delikatnie mówiąc skomplikowane. Można podłączyć czujniki przez MySensors ( trzeba tworzyć bezprzewodowe czujniki ) lub skrypty lua. Jednak niedawno odkryłem sposób komunikacji pomiędzy Raspberry a Domoticzem poprzez JSON (JavaScript Object Notation).
W dużym uproszczeniu JSON pobiera dane z czujników podłączanych do Raspberry i przekazuje je do Domoticza. Składnia komendy wygląda następująco:
http://<username:password@>domoticz-ip/json.htm?api-call
Teraz pozostaje jakoś to opchnąć do Domoticza i czekać na deszcz.
Podłączenie czujnika deszczu do Raspberry.
Podłączenie pinów:
- VCC podpinamy do 5V RPi
- DO podłączamy do GPIO ( u mnie pin 27 )
- GDN do GND)
- AO pozostaje wolny
Prosty skrypt sprawdzający stan na pinie w raspberry:
#!/usr/bin/python import RPi.GPIO as io water_sensor = 27 io.setmode(io.BCM) io.setup(water_sensor, io.IN) try: if io.input(water_sensor): print("Brak opadów") else: print("Opady deszczu") finally: io.cleanup()
Integracja czujnika deszczu z Domoticzem.
Dodajemy wirtualny czujnik, ustawiamy na Przekaźnik ( Obsługa gniazdek WIFI, czyli jak to zrobić bez kabli. ). W zakładce /Konfiguracja/Urządzenia sprawdzamy idx naszego wirtualnego czujnika. W edycji możemy zmienić sobie ikonę z żarówki na kropelkę.
Teraz musimy przygotować komendę JSON do odczytania stanu urządzenia na raspberry i przesłania jej do odpowiedniego przełącznika w Domoticzu. U nie wygląda tak:
http://192.168.X.XXX:8080/json.htm?type=command¶m=switchlight&idx=21&switchcmd=Off
Na początku adres IP i port Domoticza. Dalej komenda ustawiająca parametr czujnika, dla którego w Domoticzu idx wynosi 21 na OFF. Czyli jeśli czujnik deszczu nie wykrywa opadów to ustaw przełącznik na wyłączony. Przy wykryciu deszczu komenda powinna wyglądać jak poniżej:
http://192.168.X.XXX:8080/json.htm?type=command¶m=switchlight&idx=21&switchcmd=On
Gotowy skrypt do obsługi czujnika i wysłania danych do Domoticza wygląda tak:
#!/usr/bin/python import urllib import urllib2 import time import RPi.GPIO as io water_sensor = 23 io.setmode(io.BCM) io.setup(water_sensor, io.IN) try: if io.input(water_sensor): active_time = time.time() print("No Rain Detected") url = 'http://192.168.1.105:8080/json.htm?type=command&param=switchlight&idx=2&switchcmd=Off' request = urllib2.Request(url) response = urllib2.urlopen(request) else: active_time = time.time() print("Rain Detected") url2 = 'http://192.168.1.105:8080/json.htm?type=command&param=switchlight&idx=2&switchcmd=On' request = urllib2.Request(url2) response = urllib2.urlopen(request) except KeyboardInterrupt: print "\nUser Halt!" finally: io.cleanup()
W water_sensor ustawiamy swój pin, pod który podpięliśmy czujnik i idx urzadzenia w Domoticzu, nadajemy nazwę skryptu i uprawnienia ( sudo chmod 777 rain.sh – na wszelki wypadek ) .Uruchamiamy skrypt:
./rain.sh
Po wykryciu wody
Tak wygląda to w logach.
Pozostaje dodać tylko odpowiedni wpis w cronie aby sprawdzać co 5 minut czy pada deszcz.
pi@raspberrypi:crontab -e
i na końcu pliku wpisujemy :
* 5 * * * /home/pi/domoticz/scripts/rain.sh
I to wszystko.
Jest to w pewnym sensie sposób uniwersalny. Możemy tak zintegrować takie czujniki jak ruchu czy wilgotności gleby ( w zakresie mokro sucho ).
[…] Czujnik deszczu […]
PolubieniePolubione przez 1 osoba
Witaj,
Fajne artykuły , wpisałem kod rain.sh i nie działa mi 😦 wywala błędy…
PolubieniePolubienie
Proszę o więcej szczegółów. Po Świętach spróbuję pomóc.
PolubieniePolubienie
Może ja coś źle robię :), na początek jak osadzić te linie w pliku?
Ja prowadzam przez nano i wykonując poleceniem jak podano, wyskakują błędy począwszy od import urlib2 po składnię if io.input i else:
PolubieniePolubienie
A czy pierwszy skrypt z posta działa ? Jeżeli jest ok to przejdziemy do skryptu integrującego czujnik z Domoticzem. Skrypt jest prosty. Podpiąć pod określony pin i polać woda czujnik sprawdzając czy zareaguje.
Daj znać czy działa.
PolubieniePolubienie
Ani pierwszy , ani drugi nie zaskakuje. W pierwszym mam błąd if, dodałem dwie spacje przed i przeszedł dalej , ale przy print(„Brak opadów” błąd. i tak co, linię… w pierwszym podobne błędy 😦
PolubieniePolubienie
W jednym i drugim mam błąd. Rozpatrując pierwszy – przy linii8 i 9 – if, i print(„brak opadów”)
PolubieniePolubienie
Najprawdopodobniej WordPress psuje kodowanie. Miałem już taki problem z innym skryptem opisywanym na blogu. Sukcesywnie poprawiam i sprowadzam prawidłowość kodowania. Zauważyłem, że skrypty w tym poście są wklejone bez znaczników kodu. Wstawię znaczniki, sprawdzę swój skrypt i dam znać. Proszę o cierpliwość.
PolubieniePolubienie
Jest to skrypt pythona a nie bash
PolubieniePolubienie
Na pi3 nie działa. Brakuje biblioteki urllib2
PolubieniePolubienie
Witam
Nie rozumiem dlaczego „Domyślnie Domoticz nie obsługuje urządzeń komunikujących się poprzez zmianę stanu ( np. czujnik ruchu, czujnik wilgotności gleby czy powyższy czujnik opadów ).” Przecież można taki czujnik podłączyć bezpośrednio do GPIO w raspberry i czytać stan jako GPIO.
/usr/local/bin/gpio export 20 out
/usr/local/gpio export 26 in
/usr/local/gpio edge 26 falling
Przykład z https://forbot.pl/blog/kurs-raspberry-pi-projekty-domoticz-kamera-gpio-id27448
Dlaczego potrzebny jest skrypt JSON?
PolubieniePolubienie