niedziela, 29 maja 2016

JSON i wymiana danych w Domoticz

JSON (JavaScript Object Notation) to format wymiany danych i może być przetwarzany przez wiele języków programowania, w tym język Python, popularny dla Rasberry Pi.

JSON może wymieniać dane między serwerem, czyli np. Rasberry Pi, a aplikacją klienta, czyli np. Domoticz.

Format ten możemy wykorzystać w projektach na Rasberry Pi pisanych np. w Pythonie lub innym języku programowania i wykorzystać np. do obsługi nietypowych czujników, których nie obsługuje sam Domoticz lub innych urządzeń.

Komendy JSON dla Domoticz opisane są na stronie WIKI Domoticz -> Link

Komunikację JSON możemy sprawdzić wpisując w adres przeglądarki internetowej:

Ogólny adres:
http://ip-domoticz:port/json.htm?type=rodzaj_komendy

Komendy jakie możemy wykorzystać w Domoticz pokazuje poniższy obrazek


Czyli, w moim przypadku będzie, to: http://192.168.3.105:8080/json.htm?type=rodzaj_komendy

Wpisując: http://192.168.3.105:8080/json.htm?type=devices&rid
zobaczymy wszystkie urządzenia, jakie mamy w Domoticz

Możemy też zobaczyć status konkretnego urządzenia wpisując jego IDX, odczytamy go wchodząc w Konfiguracja -> Urządzenia w Domoticz


Jak widać np. dla urządzenia Kwiatki Idx wynosi 38, więc po wpisaniu:

http://192.168.3.105:8080/json.htm?type=devices&rid=38

zobaczymy status urządzenia Kwiatki

Można również odczytać status grupy urządzeń widocznych w menu Domoticz, czyli Przełączniki, Temperatura, Pogoda, Użytkowe, wpisując dla:

np. dla przełączników:
http://192.168.3.105:8080/json.htm?type=command¶m=getlightswitches

lub odczytać wschód i zachód słońca:
http://192.168.3.105:8080/json.htm?type=command¶m=getSunRiseSet

Bardziej przydatne może być sterowanie przełącznikami, np dla przełącznika o idx = 21, komenda będzie taka:

Włączenie:
http://192.168.3.105:8080/json.htm?type=command¶m=switchlight&idx=21&switchcmd=On

Wyłączenie:
http://192.168.3.105:8080/json.htm?type=command¶m=switchlight&idx=21&switchcmd=Off

W Pythonie do pobierania i przesyłania adresów sieciowych służy moduł urllib2, więcej o tym module możemy poczytać na tej stronie -> Link

Możemy napisać dowolny program, który będzie pobierał i przesyłał dane do Domoticz.

Prosty program, który włączy lampkę, odczeka 2 sekundy i wyłączy wygląda tak:


Kod programu jest do pobrania stąd -> Link

sobota, 28 maja 2016

Czujnik poziomu węgla na nadajniku MySensors

W komentarzach do wpisu na blogu opisującym bezprzewodowy czujnik poziomu węgla w zasobniku -> Link Mac C napisał, że chciałby wykorzystać czujnik w Domoticz i aby wyświetlał ilość węgla w procentach.

Zrobiłem, to w następujący sposób, oczywiście wymagana jest bramka MySensors jako odbiornik, opis tu -> Link

Najpierw, aby przetestować czy wszystko działa napisałem kod programu, który wyświetla odległość w cm i podaje wartość w procentach, przy założeniu, że 100% to jest 60 cm.

Schemat podłączenia będzie taki sam, jak w opisie bezprzewodowego czujnika węgla z diodami led.


Trig - podłączamy do pinu 3
Echo - do pinu 4
Vcc - 5V
GND - do GND

Kod programu wygląda tak


Do pobrania jest stąd -> Link

Jeżeli włączymy serial monitor, to wyświetla się odległość w cm i podaje ile to jest procent, przy założeniu, że 60 cm, to jest 100 %.


W kodzie programu na początku definiujemy odległość max.


Program przelicza odległość na procenty, tylko w przypadku ilości węgla 100% będzie wtedy, gdy zbiornik będzie pełny, a odległość będzie wynosiła 0, czyli w powyższym kodzie należy od wartości 100% odjąć wartość w procentach zmierzonej odległości, czyli:

Definiujemy sobie nową zmienną ilosc (int ilosc;)

i wtedy ilość węgla w zasobniku w procentach będzie, to ilosc = 100 - procent

Kod programu teraz wygląda tak:


Kod do pobrania stąd -> Link

Teraz w serial monitorze program wyświetla procentową ilość węgla, przy założeniu, że 60 cm (definiujemy sobie to na początku programu przy int max = 60;) będzie to pusty zbiornik.


Teraz, aby przesyłać dane do Domoticz przez bramkę MySensors, należy dodać wpisy w kodzie programu, zgodnie z tym, co opisałem wcześniej w wpisie Prezentacja i przesyłanie danych w nadajnikach MySensors -> Link

Jako typ czujnika gw.present wykorzystam S_WEIGHT , a rodzaj zmiennej MyMessage - V_IMPEDANCE, zgodnie z opisem, na stronie MySensors dla wagi pod pozycją 12 -> Link

Kod programu jest do pobrania tu -> Link

Po wgraniu, w logach Domoticz -> Konfiuguracja -> Logi powinna się pojawić nazwa programu


Teraz już wystarczy wejść w Konfiguracja -> Urządzenia i powinien być widoczny czujnik


Wystarczy już kliknąć w zieloną strzałkę, wpisać nazwę i kliknąć Dodaj urzadzenie


Urządzenie będzie widoczne w zakładce Użytkowe


W kodzie programu do celów demonstracji ustawiłem na końcu delay(1000); - czas w milisekundach, ale myślę, że można go ustawić na czas aktualizacji np. co pół godziny, czyli na 1800000 milisekund.

Działanie czujnika widać na poniższym filmie


czwartek, 26 maja 2016

Prezentacja i przesyłanie danych w nadajnikach MySensors

Dzisiaj opiszę jak odbywa się przesyłanie danych z nadajników MySensors do bramki MySensors i do Domoticz.

Najnowsza biblioteka MySensors wersja 1.5 -> Link używa dwóch głównych klas:
MySensor i MyMessage

Inicjalizacja danych - MyMessage

MyMessage tworzy kontener do przechowywania danych, aby można było je wysłać do bramki MySensors, wpisujemy je zawsze na początku programu.

Polecenie MyMessage wygląda tak: MyMessage msg(child-sensor-id, rodzaj-zmiennej);

W nawiasie child-sensor-id identyfikuje podłączony czujnik, definiujemy go na początku programu poleceniem:

#define nazwa kolejny numer czujnika

Czyli, gdy mamy np. kilka czujników np. temperatury i wilgotności, to na początku programu definiujemy:

#define child_id_temp 1
#define child_id_wilg 2

Na stronie MySensors napisali -> Link, że gdy mamy tylko jeden czujnik, to przy definicji ilości czujników wpisujemy 0, czyli np. #define child-id 0.

Druga wartość podana w nawiasie określa rodzaj zmiennych, jakie będą przesyłane do bramki MySensors, mamy je określone na stronie -> Link w czwartej kolumnie

Przykładowo dla czujnika temperatury i wilgotności, będzie to wyglądać tak:

MyMessage msgtemp(child_id_temp, V_TEMP);
MyMessage msgwilg(child_id_wilg, V_HUM);

Po MyMessage nadajemy sobie dowolną nazwę, czyli jak wyżej, dla temperatury: msgtemp, a dla wilgotności: msgwilg

Te dane wpisujemy zawsze na początku programu, przed void setup()

UWAGA!!!
Przed wpisem MyMessage należy umieścić wpis:

MySensor gw;

Prezentacja - gw.present

Czujniki podłączane do nadajnika MySensors muszą najpierw przedstawić (zaprezentować) dane do kontrolera, odbywa się, to poleceniem:

gw.present(child-sensor-id, typ-czujnika);

Typy czujników są określone na stronie -> Link w pierwszej kolumnie, czyli dla powyższego przykładu, dla czujnika temperatury i wilgotności, polecenie będzie wyglądać tak:

gw.present(child_id_temp, S_TEMP);
gw.present(child_id_wilg, S_HUM);

Prezentację wpisujemy w void setup() czyli instrukcjach, które wykonywane są tylko raz na początku programu.

Dane jakie należy wpisać dla różnych rodzajów czujników podane są w poniższej tabeli


Inicjowanie gw.begin ()

Polecenie:

gw.begin();

uruchamia bibliotekę MySensors, odbiera dane z kontrolera i zapisuje w statycznej pamięci eproom Arduino, dane te są kasowane, po restarcie Arduino.

Polecenie gw.begin; umieszczamy przed prezentacją gw.preset w void setup().

Import bibliotek MySensors
Aby nasz program działał poprawnie na samym początku kodu programu należy umieścić wpis importujący biblioteki MySensors, czyli:



Przesyłanie danych - gw.send(msg.set(dane));

Polecenie to przesyła dane do bramki MySensors i dalej do Domoticz, umieszczamy je w pętli void loop()

W tym przykładzie będzie, to wyglądać tak:
gw.send(msgtemp.set(temp, 1));
gw.send(msgwilg.set(wilg, 1));


Kod programu dla nadajnika MySensors, w którym wykorzystałem typowy program do odczytu z czujnika DHT11 będzie wyglądał tak:


Kod do pobrania stąd -> Link

Myślę, że teraz każdy będzie mógł sobie napisać sam program, do odczytu dowolnych czujników z nadajnika MySensors

niedziela, 22 maja 2016

Bezprzewodowy czujnik poziomu węgla do zasobnika pieca

Znajomy posiada w domu piec na eko groszek z zasobnikiem na węgiel i czasem zapomina dosypywać węgla i gaśnie mu w piecu.

Wykonałem więc nadajnik z ultradźwiękowym czujnikiem odległości HC-SR04, który przekazuje dane do odbiornika bezprzewodowo za pomocą modułu NRF24L01.

Całkowity koszt razem z obudowami i zasilaczami 5V, to około 100 zł.

Gotowy odbiornik i nadajnik wygląda tak, jak na zdjęciu niżej.


Wykorzystałem:

- 2 x Arduino Mini Pro 5V
- 2 x NRF24L01
- HC-SR04
- buzer 5V
- diody led czerwona, zółta i 3 szt. zielona
- rezytsory 100 ohm, 110 ohm i 190 ohm
- 2 x stabilizator 3,3V
- 2 x kondensator 10uF
- 2 x zasilacz 5V
- obudowy plastikowe

Zmontowałem, to na płytce z OSH Park -> Link, przy zamówieniu 12 szt. płytek koszt za jedną płytkę wyniósł 7,50 zł.

Diody led i buzer zamontowałem na płytce uniwersalnej.

Schemat nadajnika


Schemat odbiornika


Kod programu do nadajnika -> Link

Kod programu do odbiornika -> Link

Kod programu odbiornika, jest napisany tak, że gdy poziom węgla spadnie do 57 cm od góry, włącza się buzer na 5 sekund i świeci czerwona dioda i jeżeli nie dosypiemy węgla, buzer włączy się znowu za pół godziny na 5 sekund, po dosypaniu węgla trzeba nacisnąć przycisk reset, który wyprowadziłem za pomocą przycisku na obudowie lub odczekać pół godziny.


Zasobnik na węgiel wygląda tak


Ponieważ zastosowałem 5 diod, które informują o stanie węgla, to 57 cm podzieliłem na 4, co daje około 14cm i gdy poziom węgla spadnie o 14 cm gasną kolejne diody, aż do 57 cm i wtedy świeci się czerwona dioda i włącza buzer na 5 sekund.

Działanie czujnika widać na poniższym filmie.

niedziela, 8 maja 2016

Sterowanie gniazdkami 433 MHz bezpośrednio z Raspberry Pi z Domoticz

Dzisiaj opiszę jak sterować gniazdkami 433 MHz bezpośrednio z Raspberry Pi, ponieważ z zastosowaniem nadajnika MySensors pojawiały się problemy i ostatecznie nie sprawdziło się.

Tak jak jest napisane w poprzednim poście -> Link sterowane będą gniazdka Kemot poprzez moduł radiowy FS100A 433 MHz.



Moduł radiowy 433 MHz należy podłączyć w następujący sposób:

Odbiornik: pin DATA - GPIO 27
Nadajnik: pina DATA - GPIO 17


No i oczywiście należy podłączyć do GND i VCC

Piny Rasberry Pi


Po podłączeniu należy odczytać kody pilota, będzie tez wymagany program Wirinig Pi, jak go zainstalować opisałem w tym poście -> Link

Gdy mamy już zainstalowany WiringPi ściągamy ten plik -> Link

Rozpakowujemy na komputerze i kopiujemy do Rasberry Pi katalog RPi_utils, teraz otwieramy terminal Raspberry Pi i wpisujemy kolejno:

cd RPi_utils

make all

Teraz uruchamiamy program do odczytu kodów pilota poleceniem:

sudo ./RFSniffer

Po wciśnięciu przycisków pilota powinniśmy zobaczyć odczytane kody pilota


Zapisujemy sobie kody dla poszczególnych przycisków w pliku tekstowym, będą one nam później potrzebne.


Teraz możemy przetestować wybrany kod poleceniem:

sudo ./codesend 4212049

Gdy kody działają przechodzimy do Domoticz.

Wchodzimy w Konfiguracja -> Sprzęt i dodajemy wirtualne urządzenie Dummy wpisujemy nazwę np. 433 MHz i klikamy Dodaj


Teraz u góry klikamy: Utwórz wirtualne czujniki


Wpisujemy nazwę np. Gniazdko A i dodajemy kolejne gniazdka np. Gniazdko B, C


Teraz wchodzimy w Przełączniki i w wybranym gniazdku klikamy Edycja i w Włącz akcję wpisujemy:

script:///home/pi/RPi_utils/codesend 4212049

gdzie po codesend wpisujemy kod włączenia gniazdka i tak samo w Wyłącz akcję po codesend kod wyłączenia.


Klikamy Zapisz i analogicznie robimy dla kolejnych gniazdek.

Jeżeli wszystko zrobimy dobrze, możemy już sterować gniazdkami z poziomu Domoticz.

Nadajnik na napięciu 5V i antence 17 cm, ma u mnie zasięg przez 2 ściany i przez strop na piętro niżej. Dla większego zasięgu można nadajnik zasilić osobnym napięciem 12V z wspólną masą z Rasberry Pi.

sobota, 7 maja 2016

Sterowanie gniazdkami 433 MHz z MySensors

Ostatnio zamówiłem gniazdka Kemot sterowane pilotem na częstotliwości 433 MHz.
Gniazdka wyglądają, tak na zdjęciu niżej i za komplet 3 gniazdek i pilota zapłaciłem 59 zł.


Aby sterować gniazdkami z poziomu Domoticz będzie jeszcze potrzebny moduł radiowy FS100A 433 MHz, możemy, go kupić na Allegro za około 4 zł.
Moduł wygląda tak


Po lewej stronie mamy nadajnik, a po prawej odbiornik.

Do pinu oznaczonego ANT należy przylutować odcinek 17 cm przewodu, który będzie pełnił rolę anteny.

Będzie nam jeszcze potrzebne Arduino, aby odczytać kody pilota, a nadajnik podłączymy do nadajnika MySensors, czyli Arduino Nano lub Mini Pro z stabilizatorem 3,3V + NRF24l01.


Powyżej schemat nadajnika MySensors na Arduino Mini Pro 5V

Oczywiście wymagana jest również bramka MySenors podłączona do Rasberry Pi z zainstalowanym Domoticz, którą opisałem tu -> Link

Aby odczytać kody pilota, będzie potrzebne samo Arduino z podłączonym odbiornikiem 433 MHz.

Odbiornik posiada piny: VCC, DATA i GND, łączymy więc piny VCC do 5V, GND do GND i DATA do pinu 2 w Arduino.

Potrzebna będzie biblioteka RCSwitch, którą kopiujemy do katalogu libraries, tam gdzie mamy program Arduino.

Bibliotekę możemy sciągnąć stąd -> Link

Po skopiowaniu biblioteki uruchamiamy Arduino i Plik -> Przykłady i wybieramy program ReceiveDemo_Advanced i wgrywamy do Arduino


Uruchamiamy monitor szeregowy i po wciśnięciu przycisku na pilocie powinny się wyświetlać odebrane kody.
Interesują nas kody po Decimal:


Kody dla gniazdek A,B,C dla ON i OFF kopiujemy (Ctrl+C) do programu do nadajnika MySensors -> Link


Nadajnik 433 MHz podłączamy DATA do pinu 3 w Arduino i VCC - 5V i GND do GND.

Po wgraniu wchodzimy do panelu Domoticz w Konfiguracja - > Urządzenia i klikając w zielone strzałki dla Typ Lighting 2 dodajemy kolejno gniazdka, ja je nazwałem Gniazdko A,B,C


Teraz w menu Przełączniki powinniśmy zobaczyć przełączniki dla gniazdek


Jeśli wszystko zrobimy dobrze powinno działać włączani i wyłączanie gniazdek.