Inteligentny dom i serwerownia (smart home and server room)
Cele
- - zabezpieczenie pomieszczeń (mieszkanie, garaż, serwerownia) przed zalaniem i pożarem,
- - zarządzanie temperaturą w pomieszczeniach (ogrzewaniem, klimatyzacją),
- - monitorowanie zużycia mediów (woda, prąd),
- - automatyzacja oświetlenia w niektórych sytuacjach,
- - monitoring ruchu w pomieszczeniach (włącznie z "cichym alarmem"),
- - kontrolowanie niektórych urządzeń (np. oświetlenie choinki),
- - możliwość łączenia wielu sieci z-wave w jedną (osobne budynki),
- - praca w pełni automatyczna bez udziału człowieka
Założenia
TEORETYCZNE
System w założeniu ma byc w pełni autonomiczny - najpierw zapobiegać, a następnie informować.
W przypadku zalania pierwszym zadaniem systemu jest zamknięcie zaworów, a następnie jeśli tak zdefiniowano w systemie poinformować dźwiękowo, a w kolejnym kroku wiadomością tekstową na komunikator gg oraz sms.
System "uzbraja" się po 20 minutach (jeśli opcja jest włączona) od opuszczenia domu informując wiadomością tekstową o uzbrojeniu systemu, a po naruszeniu stref automatycznie wysyła powiadomienie i "rozbraja" system.
System może uzbrajać się w wyznaczonym czasie o ile tak zdefiniowano.
System potrafi włączać/wyłączać wybrane urządzenia w wybranym przedziale czasowym (telewizor, choinka, radio, etc.).
System powinien poinformować po uzbrojeniu o otwartych oknach, włączonych urządzeniach. System powinien wyłączyć ustalone urządzenia po uzbrojeniu.
System powinien kontrolować temperature na zewnątrz i wewnątrz oraz czujniki ruchu i na tej podstawie ustawiać termostaty grzejników.
TECHNICZNE
System ma zapisywać wszystkie "zgłoszenia" z z-wave do tablicy notifications, natomiast komendy BASIC do tabeli basic, a aktualne ustawienia termostatów do tabeli thermostat, przełączników do tabeli switches. Wszystkie zgłoszenia "żyję" (wake up) zapisywane są w tabeli wakeup. Parametery pogodowe ze stacji pogodowej zapisywać mają się do tabeli data. Zgłoszenia z UPSa o braku napięcia zapisywane mają być w tabeli ups. Inne urządzenia typu telewizor, paralka, etc. ich stan ma być zapisywany do tabelki other.
Schematy tabel:
basic - zapisane akcje "basic" typu on/off
basicLastState - ostatnie stany urządzeń on/off
battery - stan baterii urządzeń
data - dane ze stacji pogodowej
flood - dane wystąpienia ostatnich "zalań"
nodes - lista urządzeń (w tym czy node ignorowane czy urządzenie typu alarmowego, etc.)
nodesActionHistory -
notifications - wszystkie zdarzenia w sieci z-wave
other - stan urządzeń niezwiązanych z z-wave (np. telewizor)
parameters -
power -
powerUsage -
security -
sensors -
sensorsLastState -
stateGet - harmonogram wymuszonego 'budzenia' wybranch urządzeń
switches -
temperature -
thermostat - harmonogram pracy termostatów
tv - harmonogram włączania/wyłączania telewizora
ups - zdarzenia związane z ups'em (zaniki napięcia)
wakeup -
wakeupLastStat -
zones - działanie konkretnej czujki w konkretnym dniu tygodnia o konkretnych godzinach (np. kiedy jesteśmy w pracy), efektem wyzwolenia alarmu jest wyłącznie SMS/GG (bez alarmu dźwiękowego - i tak nikt na to nie reaguje;p)
nodesActionHistory - podsumowanie node'ów zliczających (pralka, zmywarka, etc.)
notifications - wszystkie akcje w sieci z-wave
other - inne urządzenia (np. telewizor), które nie są obsługiwane przez z-wave
parameters - dodatkowe ustawienia wpływające na działanie sieci (np autoalarm)
power - aktualne wskazania node'ów zliczających prąd
zonesAction - jednokrotne działanie (raz na dzień) konkretnej czujki w konkretnym dniu tygodnia o konkretnych godzinach (np. kiedy chcemy wiedzieć kiedy ktoś wraca do domu), efektem wyzwolenia alarmu jest wyłącznie SMS/GG
zonesAlarms - działanie alarmu dźwiękowego w przypadku zgłoszenia zalania przez konkretną czujkę w konkretnym dniu tygodnia o konkretnych godzinach (np. w nocy)
zonesFree - dezaktywacja tabeli zones dla wybranych dat (np. święto, kiedy jesteśmy w domu)
zonesLight - ustawienia włączania/wyłączania światła zależnie od zadziałania konkretnej czujki
zonesPower - ustawienia cykliczne włączania/wyłączania urządzeń (np. choinki)
zonesStart - wykonywanie akcji po konkrentych akcjach
zonesThermo - ustawienia temperatury termostatu zależnie od pory dnia (np. w łazience zazwyczaj po kąpieli chcemy wysuszyć łazienkę jak i ręczniki)
autoalarm - alarm załącza się po 20 minutach od zamknięcia drzwi, gdy w domu nie było żadnego ruchu, alarm automatycnzie rozbraja się po naruszenie w przeciągu 15 minut dwóch stref (2 czujników) wysyłając smsa i komunikat gg.
Parametry (tabela "parameters")
Wszystkie niezbędne parametry do poprawnego wystartowania aplikacji muszą znajdować się w pliku /etc/zwave.conf, natomiast zmienne parametry zapisane w tabeli parameteres, takie jak:
- alarmDisabled [0/1] - Wyłączenie [1] alarmu dzwiękowego (zonesAlarms) - alarm ma informować o np. zalaniu, nie chcemy niepotrzebnych alarmów, gdy np. wyjedziemy na wakacje
- sensorAlwaysOn [0/1] - Włączenie [1] alarmu (zonesXXX)
- thermoClean [0/1] - automatyczne cotygodniowe otwieranie/zamykanie głowic (opcja w przygotowaniu)
- autoAlarm [0/1] - włączenie [1] alarmu automatycznego
- alarmOn [0/1] - uzbrojenie [1] alarmu automatycznego
System operacyjny
- Debian 6.0.7 (Squeeze) - 3.2.0-0.bpo.4-486 #1 Debian 3.2.46-1+deb7u1~bpo60+1 i686 GNU/Linux
- Debian 7.8 (Wheezy) - 3.18.7+ #755 PREEMPT Thu Feb 12 17:14:31 GMT 2015 armv6l GNU/Linux
- Debian 8 (Jessie) - 3.2.0-4-686-pae #1 SMP Debian 3.2.65-1+deb7u2
- OpenSUSE 13.1 - 3.11.10-21-desktop #1 SMP PREEMPT Mon Jul 21 15:28:46 UTC 2014 (9a9565d) x86_64 x86_64 x86_64 GNU/Linux
Pakiety
- 1. open-zwave - obsługa sieci Z-Wave (różnego rodzaju czujniki)
- 2. libgammu-dev - wysyłanie alarmów na telefon komórkowy [SMS]
- 3. libgadu-dev - wysyłanie alarmów na komunikator [GaduGadu]
- 4. libmysqlclient-dev - zapis zdarzeń do bazy
- 5. libssh - komunikacja z innymi urządzeniami
- 6. libcurl - komunikacja z innymi urządzeniami nadzorującymi
Ogólne uwagi
- Brak łączności przeważnie rozładowuje urządzenia bateryjne (STELLA Z, Living Connect Z, ZG8101).
- Łączenie różnych sieci z wykorzystaniem jednej bazy generuje "duży" ruch - problem w przypadku limitowanego transferu.
- Terminal HP T5700 może posłużyć jako centrala przez około dwa lata (jeśli gromadzimy dane).
- Dwa lata zbiernia danych to średnio 4 miliony rekordów w tabeli notifications (cała baza to 800MB).
- Bateria baterii nierówna, na czarnej liście: Panasonic CR123A (zakupiona w MediaMarkcie), tanie wielopaki.
- Na zewnątrz stosujemy baterie typu "Lithium" (litowa), inne nie są warte uwagi (zima panowie i panie;).
- Twórce USB należałoby "rozstrzelać" - należy pamiętać, gdzie jakie urządzenie się podłącza i jak długi kabel (typowy problem z kamerkami USB).
- Raspberry Pi i jego pseudo USB to zawsze jakieś problemy (nie przesadzajmy z ilością urządzeń).
- Instrukcje dołączone do urządzeń z-wave przeważnie wprowadzają w błąd (np. niedokładny z błędami opis dołączenia urządzenia do sieci z-wave).
Urządzenia
- 1. Adapter Z-Wave Z-Stick S2 DSA02203-ZWEU (10c4:ea60)
- 2. Czujnik zalania Z-Wave ST812
- 3. Stacja pogodowa WS-3500
- 4. Czujnik temperatury USB (0c45:7401)
- 5. Modem Huawei USB (12d1:1003)
- 6. Terminal HP T5700
- 7. UPS
- 8. Multi sensor Z-Wave DSB05
Instalacja baterii 2014-10-01 Wymiana baterii 2015-01-29 (akumulatorki) Wybudzanie co godzine Problemy przy niskim stanie baterii - fałszywe alarmy Wpis z dnia 2015-01-31 - 9. Sygnalizator alarmowy Z-Wave SE812
- 10. Przełącznik ścienny pojedyńczy srebrny Z-Wave TZ66S
- 11. Przełącznik gniazda Z-Wave AN158 z miernikiem
- 12. Elektrozawory kulowe 1/2" TKB DQ215 z modułem Z-Wave Micro Double Switch DSC35103 wraz z przełącznikiem ściennym
- 13. Głowica termostatyczna Z-Wave Living Connect Z
Instalacja baterii 2013-12-20 Wymiana baterii 2015-04-06 Wybudzanie co 5 minut Problemy baterie rozładowane przez awarie terminala Wpis z dnia 2015-04-06 - 14. Czujnik drzwiowy/okienny Z-Wave Fibaro FGK107 ciemny brąz
Instalacja baterii 2013-12-20 Wymiana baterii 2016-05-10 Wybudzanie co godzine Problemy bardzo łatwo przypadkowo wykonać reset pamięci przy wymianie baterii Wpis z dnia 2016-05-13 - 15. Przełącznik gniazda sieciowego Z-Wave DSC24
- 16.Głowica termostatyczna Z-Wave STELLA Z
Instalacja baterii 2014-02-26 Wymiana baterii 2014-12-26 Wybudzanie co 15 minut Problemy na razie brak Wpis z dnia 2015-01-31 - 17. Czujnik otwarcia drzwi garażowych Z-Wave ZG8101
- 18. Raspberry Pi Model B i Raspberry Pi 2 model B
- 19. Elektrozawory kulowe 1/2" TKB DQ215 z modułem przełącznika Z-Wave 2x1,5 kW PAN06 wraz z przełącznikiem ściennym
- 20. Kontroler IR+Czuj.Temp. Z-Wave AC Extender ZXT-120
- 21. Czujnik Z-Wave ruchu, temp., światła, otw.drzwi/okna PSM02
Instalacja baterii 2014-12-05 Wymiana baterii [jeszcze działa] Wybudzanie co godzine Problemy 1raz zawiesił się Wpis z dnia 2015-01-31 - 22. Modem Huawei E173s (12d1:1c05)
- 23. Terminal HP T5740 - 3GB MEM, 40GB ATA, 160GB SATA
- 24. Przełącznik gniazda sieciowego Z-Wave Duewi IP20 + Adapter AC
- 25. Czujnik Z-Wave ruchu, temp., światła, otw.drzwi/okna PST02-A 4 in 1 Multi-Sensor
Instalacja baterii 2015-06-05 Wymiana baterii [jeszcze działa] Wybudzanie co godzine Problemy nowy chipset Wpis z dnia 2015-06-05 - 26. Czujnik drzwiowy/okienny Z-Wave SM103
- 27. Czujnik dymu i temperatury Z-Wave Popp
Instalacja baterii 2015-08-24 Wymiana baterii [jeszcze działa] Wybudzanie co godzine Problemy błędna instrukcja, problem z włączeniem do sieci z-wave Wpis z dnia 2015-08-29 - 28. Terminal HP T610 - 10GB MEM, 128GB SATA SSD
- 29. CC2531 - Adapter Zigbee
- 30. Tp-Link UH700
Instalacja baterii | 2013-10-03 | Wymiana baterii | [jeszcze działa] | Wybudzanie | co godzine | Problemy | na razie brak | Wpis z dnia | 2015-01-31 |
Serce najnowszej "domowej" wersji systemu ;)
Serce nowej "domowej" wersji systemu ;)
Serce starej "domowej" wersji systemu ;)
Przykłady użycia
-: "Pralkowy budzik" :-
Niekiedy człowiek zapomina kiedy wstawił pranie... tak więc może mały algorytm:)
Ustawiamy ZWAVE_WASHER z podłączonym miernikiem napięcia (Z-Wave DSC24), a następnie nasza pralka:
- gdy jest wyłączona nie pobiera prądu
- podczas startu pobiera nie więcej niż 20W
- podczas wstępnej pracy pobiera więcej niż 20W
- gdy kończy pranie pobiera mniej niż 15W
W efekcie na GG dostaniemy komunikaty o rozpoczęciu prania, zakończeniu prania oraz wyłączeniu pralki, oraz sms'a o zakończeniu prania.
Każde pranie zostanie zapisane w tabeli nodesActionHistory (node, czas startu oraz zakończenia, a także kWh)
-: "Nowoczesny" budzik :) :-
A gdyby tak zamiast zwykłego budzika użyć telewizora? Np. w poniedziałek rano budzi o 6:30 na programie 4.
tv_id | tv_weekday | tv_hour | tv_minutes | tv_no | tv_action | tv_keys | tv_lastaction | tv_active | tv_timestamp |
---|---|---|---|---|---|---|---|---|---|
1 | 1 | 6 | 30 | 1 | POWERON | KEY_TV;KEY_4 | NULL | 1 | 2014-07-28 23:56:37 |
-: Termostat :-
W łazience chcemy grzać tylko, gdy jest potrzeba dlatego ja ustawiłem sobie termostat według tego schematu:
id | thermonode | actiontimestart | actiontimeend | value | active | comment | timestamp |
---|---|---|---|---|---|---|---|
1 | 11 | 05:00:00 | 06:30:00 | 26 | 1 | Przed pracą | 2013-12-25 23:42:15 |
2 | 11 | 06:40:00 | 20:00:00 | 19 | 1 | w pracy | 2013-12-26 11:29:29 |
3 | 11 | 20:10:00 | 22:00:00 | 21 | 1 | mycie | 2013-12-25 00:57:56 |
4 | 11 | 22:10:00 | 23:59:00 | 28 | 1 | suszenie | 2013-12-26 11:29:40 |
5 | 11 | 01:00:00 | 04:00:00 | 18 | 1 | spanie | 2013-12-25 00:59:34 |
-: Światło :-
W przedpokoju przydałoby się automatyczne zapalanie światła (Node 8), gdy przychodzimy np. z zakupów (Node 12), a gasło gdy już nie będzie ruchu w korytarzu (Node 5):
id | sensorNode | lightNode | timeStart | timeEnd | endNode | timestamp |
---|---|---|---|---|---|---|
1 | 12 | 8 | 15:00:00 | 23:59:00 | 5 | 2013-12-26 12:04:48 |
-: Garaż :-
W garażu przydałoby się automatyczne zapalanie światła (Node 5) i wlączanie radia (Node 4). Światło włączane/wyłączane, gdy brama (Node 2) podniesiona/zamknięta, natomiast radio wyłączane, gdy nie ma ruchu (Node 3).
id | sensorNode | lightNode | timeStart | timeEnd | endNode | timestamp |
---|---|---|---|---|---|---|
1 | 2 | 5 | 15:00:00 | 23:59:00 | 2 | 2015-04-26 12:04:48 |
2 | 2 | 4 | 01:00:00 | 23:59:00 | 3 | 2015-04-26 12:04:48 |
-: Choinka :-
W święta choinka (Node 9) powinna sama się włączać o godzinie 15.30 i wyłączać o 23.40, system w wyznaczonym czasie próbuje włączyć/wyłączyć urządzenie (actiontimestart - actiontimeend) sprawdzając czy rezultat jest zgodny z zapisanym (result)
id | powernode | actiontimestart | actiontimeend | value | nomove | status | active | comment | commandclass | result | timestamp |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 9 | 15:30:00 | 22:00:00 | 255 | NULL | 0 | 1 | choinka włączenie | 37 | 1 | 2013-12-22 22:30:28 |
2 | 9 | 23:40:00 | 23:59:00 | 0 | 30 | 0 | 1 | choinka wyłączenie | 37 | 0 | 2013-12-20 23:40:14 |
-: Radio :-
Przychodząc z pracy miło byłoby, gdyby radio (Node 9) uruchamiało się same po otwarciu drzwi wejściowych (Node 12) ale jeśli nie było ruchu w korytarzu (Node 5) przez ostatnie 60 minut.
id | sensorNode | lightNode | timeStart | timeEnd | endNode | startedQry | dependsOnNode | dependsLastAction | active | timestamp |
---|---|---|---|---|---|---|---|---|---|---|
4 | 12 | 9 | 15:00:00 | 23:50:00 | NULL | 1 | 5 | 60 | 1 | 2014-01-10 16:02:30 |
-: Serwerownia :-
Logując się do serwera wypadałoby wiedzieć jakie panują warunki w serwerowni
Dopisujemy do pliku .bashrc:
yellow='\e[1;33m'
white='\e[1;37m'
echo -ne "${yellow}"
echo "------------------------------- Server Room --------------------------------"
echo
echo -ne "${white}"
mysql -u info -h {ip bazy danych} weather -e "SELECT CONCAT('Temperature: ',temp,'°C'),CONCAT('Last updated: ', timestamp) FROM temperature WHERE node = {node}" | sed -n 2p
W wyniku otrzymamy przy każdym logowaniu
------------------------------- Server Room --------------------------------
Temperature: 18°C Last updated: 2015-03-24 19:38:22
Przykładowe pomiary zużycia prądu
- Zmywarka BOSCH - program 70 stopni - czas 2:30 - zużycie 1.219 - 1.271 kWh
- Pralka Electrolux - program 60 stopni - czas 2:10 - zużycie 1.112 kWh
- Radio - zużycie 1W
Czujnik temperatury USB
Sciagnij i skompiluj oprogramowanie TEMPered
Stacja pogodowa
Ściągnij i skompiluj oprogramowanie open3600
Dla nowszych sprzętów niezbędne są poprawki w kodzie:
int write_data(WEATHERSTATION ws, int address, int number,
...
if (writedata!=NULL)
{
set_RTS(ws,1);
nanodelay(DELAY_CONST);
}
...
set_DTR(ws,0);
nanodelay(DELAY_CONST);
void nanodelay(long ns)
{
struct timespec req = {0};
req.tv_sec = 0;
req.tv_nsec = ns;
while(nanosleep(&req,&req) == -1) {
continue;
}
// delay_loop((unsigned long) ((float) ns * spins_per_ns));
}
long calibrate()
{
clock_t current;
unsigned long spins, adjust;
return 1;
UPS
Skonfiguruj zapis do bazy w przypadku wystąpienia zaniku napięcia dodając wpisy w /etc/apcupsd/onbattery oraz /etc/apcupsd/offbattery:
onbattery:
mysql weather << EOF
UPDATE ups SET endTime = startTime WHERE endTime IS NULL;
INSERT INTO ups (startTime) VALUES (NOW());
EOF
offbattery:
mysql weather << EOF
UPDATE ups SET endTime = NOW() WHERE endTime IS NULL;
EOF
Modem Huawei
Jeśli modem pracuje w trybie Hilink przełącz w tryb standardowego modemu:
http://192.168.1.1/html/switchProjectMode.html
Wyłącz funkcję CD-drive, aby uniknąć ciągłego rozłączania modemu, wydając polecenie w minicom'ie:
AT^U2DIAG=0
Sprawdź poprawność działania modemu ustawiając opcje programu gammu-config takie jak np. port (np. /dev/ttyUSB1), a następnie wydając polecenie:
echo "testowa " | gammu --sendsms TEXT {TWÓJ NUMER KOMÓRKI}
Ustaw w udev symlink dla urządzenia, np. /etc/udev/rules.d/98-modem.rules
KERNEL=="ttyUSB*", ATTRS{modalias}=="usb:v12D1p1001*", ATTRS{bInterfaceNumber}=="00", ATTRS{bInterfaceProtocol}=="ff", SUBSYSTEMS=="usb", SYMLINK+="ttyS20"
CRON
Do crona dopisz skrypt sprawdzający czy program działa, jeśli nie to skrypt spróbuje ponownie uruchomić system.
PROCESS=`ps aux | grep MinOZW | wc -l`
if [ $PROCESS -lt 2 ] ; then
echo "Run MinOZW"
cd /srv/_ZWAVE
/usr/local/bin/MinOZW >debug.txt
fi
Z-Wave
Ściągnij i zainstaluj open-zwave:
svn checkout http://open-zwave.googlecode.com/svn/trunk/ open-zwave
cd open-zwave/cpp/build/linux
make
Ustaw w udev symlink dla urządzenia, np. /etc/udev/rules.d/97-zwave.rules
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="ttyS21"
Dla urządzenia AEOTEC MultiSensor oraz Z-Wave Fibaro FGK107 wyłącz raportowanie, sensor ma wygenerować zwyczajne powiadomienie (usuń setasreport="true"):
<CommandClass id="32" name="COMMAND_CLASS_BASIC" version="1" request_flags="4" after_mark="true" mapping="48" setasreport="true">
Dla urządzenia Z-Wave STELLA Z jeśli w konfiguracji znajdują sie te dwie linie:
<Value type="decimal" genre="user" instance="1" index="2" label="Heating 1" units="C" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="0.0" />
<Value type="decimal" genre="user" instance="1" index="8" label="Heat Econ" units="C" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="0.0" />
zamień na
<Value type="decimal" genre="user" instance="1" index="1" label="Heating 1" units="C" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="0.0" />
<Value type="decimal" genre="user" instance="1" index="11" label="Heat Econ" units="C" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="0.0" />
Dla urządzenia współpracującego z elektrozaworami (np. PAN06), usuwamy informacje o zbytecznych instancjach (zawsze otwieramy/zamykamy zawory parami - ciepła i zimna woda).
<CommandClass id="32" name="COMMAND_CLASS_BASIC" version="1" request_flags="5" mapping="37">
<Instance index="1" />
</CommandClass>
<CommandClass id="37" name="COMMAND_CLASS_SWITCH_BINARY" version="1" request_flags="5">
<Instance index="1" />
<Value type="bool" genre="user" instance="1" index="0" label="Switch" units="" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="True" />
</CommandClass>
 
Dla urządzenia PSM02 ustaw temperature w stopniach Celsjusza (gdzie "x" to numer urządzenia), zmień czasy powiadomień: 
COMMIx,112,1,5,8 /* temperatura C */
COMMIx,112,1,12,1 /* Lux co 30 minut */
COMMIx,112,1,8,5 /* Raport ruch co 40s */
COMMIx,112,1,13,1 /* Temperatura co 30 minut */
COMMIx,112,1,6,64 /* Zmiana temperatury o ok. stopień wyślij raport /*
 
Dla urządzenia PST02-A ustaw temperature w stopniach Celsjusza (gdzie "x" to numer urządzenia), zmień czasy powiadomień, etc.: 
COMMIx,112,1,21,0
COMMIx,112,1,8,8
COMMIx,112,1,7,22
COMMIx,112,1,6,0
COMMIx,112,1,5,9
COMMIx,132,1,0,3600
COMMIx,132,1,4,240
Zmień również konfiguracje w xml'u (jeśli domyślna różni sie od niżej przedstawionej):
<CommandClass id="32" name="COMMAND_CLASS_BASIC" version="1" request_flags="4" after_mark="true" mapping="48">
...
<CommandClass id="48" name="COMMAND_CLASS_SENSOR_BINARY" version="1" request_flags="4" create_vars="false">
<Instance index="1" />
<Value type="bool" genre="user" instance="1" index="0" label="Motion Sensor" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="False" />
<Value type="bool" genre="user" instance="1" index="1" label="Door/Window Sensor" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="True" />
<Value type="bool" genre="user" instance="1" index="2" label="Tamper Sensor" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="True" />
<SensorMap index="2" type="8" />
<SensorMap index="1" type="10" />
<SensorMap index="0" type="12" />
</CommandClass>
...
<Associations num_groups="2">
<Group index="1" max_associations="8" label="Reports" auto="true">
<Node id="1" />
</Group>
<Group index="2" max_associations="8" label="Light Control" auto="true">
<Node id="1" />
</Group>
</Associations>
Dla Raspberry Pi w Makefile dodajemy biblioteke rt:
$(LD) $(LDFLAGS) -o $@ $< $(LIBS) -pthread -ludev -L/usr/lib/mysql -lmysqlclient -L/usr/local/lib -lgadu -lGammu -lstdc++ -lssh -lrt
Repozytorium: https://github.com/wzator/z-wave-homeLogic
Dla wersji 1 lub lepszej:
Oprogramowanie (wersja ALFA), zastąpić plik w folderze open-zwave/cpp/example/MinOZW/Main.cpp, oraz Makefile.
Dokopiuj pliki ServerSocket.cpp,ServerSocket.h,Socket.cpp,Socket.h,SocketException.h, do folderu /cpp/src/
Wykonaj make clean
, a następnie make
oraz make install
z głównego katalogu openzwave.
Dla wersji poniżej wersji 1.0:
Oprogramowanie (wersja ALFA), zastąpić plik w folderze open-zwave/cpp/example/linux/MinOZW/Main.cpp, oraz Makefile.
Wymagany plik konfiguracyjny /etc/zwave.conf:
LOGLEVEL 0
PREFIX HOME
MYSQL_HOST localhost
MYSQL_USERNAME dbuser
MYSQL_PASSWORD dbpass
MYSQL_DATABASE dbbase
MYSQL_PORT 0
GG_UID ggNumber
GG_PASSWORD ggPassword
GG_ALARMTO1 ggNumber
GG_ALARMTO2 ggNumber
SMS_PHONE1 telNumber
SMS_PHONE2 telNumber
SMS_DEVICE /dev/ttyS20
SMS_CONNECTION at19200
SMS_COMMANDS {0 - nie czytaj skrzynki wiadomości, 1 - odczytuj i wykonuj skrzynkę}
SMS_LOCATION {adres startowy skrzynki sms, np 0 lub 100000 - gammu geteachsms}
#Z-WAVE
ZWAVE_DEVICE /dev/ttyS21
ZWAVE_ALARM_NODE {NUMER URZĄDZENIA - ALARM}
ZWAVE_LIGHT_NODE {NUMER URZĄDZENIA - WŁĄCZNIK ŚWIATŁA}
ZWAVE_DOOR_NODE {NUMER URZĄDZENIA - KONTAKTRON DRZWI WEJŚCIOWYCH)
ZWAVE_VALVE_NODE1 {NUMER URZĄDZENIA - SIŁOWNIKI ZAWORÓW nr 1 - 100)
ZWAVE_THERMOSTAT_NODE {NUMER URZĄDZENIA - TERMOSTAT NP W ŁAZIENCE}
ZWAVE_POWER_NODE1 {NUMER URZĄDZENIA - WŁĄCZNIK GNIAZDKA nr 1 - 100}
ZWAVE_WASHER {NUMER URZĄDZENIA - PRALKA}
ZWAVE_DISHWASHER {NUMER URZĄDZENIA - ZMYWARKA}
#TV_SAMSUNG
TV_SAMSUNG_IP {IP TELEWIZORA}
TV_SAMSUNG_PORT 55000
TV_SMART {IP Raspberry Pi}
TV_LOGIN {LOGIN na Raspberry Pi}
TV_PASS {HASŁO na Raspberry Pi}
TV_START {skrypt uruchamiający TV na Raspberry Pi}
TV_OFF {skrypt wyłaczający TV na Raspberry Pi}
skrypt TV_ON:
#!/bin/sh
echo "on 0" | /usr/bin/cec-client -s
killall -9 kodi.bin
skrypt TV_OFF:
#!/bin/sh
echo "standby 0" | /usr/bin/cec-client -s
oraz tabelki w bazie danych (aktualne wersje w repozytorium):
CREATE TABLE IF NOT EXISTS `data` (
`timestamp` bigint(14) NOT NULL DEFAULT '0',
`rec_date` date NOT NULL DEFAULT '0000-00-00',
`rec_time` time NOT NULL DEFAULT '00:00:00',
`temp_in` decimal(3,1) NOT NULL DEFAULT '0.0',
`temp_out` decimal(3,1) DEFAULT '0.0',
`dewpoint` decimal(3,1) DEFAULT '0.0',
`rel_hum_in` tinyint(3) NOT NULL DEFAULT '0',
`rel_hum_out` tinyint(3) DEFAULT '0',
`windspeed` decimal(3,1) NOT NULL DEFAULT '0.0',
`wind_direction` char(3) NOT NULL DEFAULT '',
`wind_angle` decimal(3,1) NOT NULL DEFAULT '0.0',
`wind_chill` decimal(3,1) NOT NULL DEFAULT '0.0',
`rain_1h` decimal(5,1) NOT NULL DEFAULT '0.0',
`rain_24h` decimal(5,1) NOT NULL DEFAULT '0.0',
`rain_1w` decimal(6,1) NOT NULL DEFAULT '0.0',
`rain_1m` decimal(6,1) NOT NULL DEFAULT '0.0',
`rain_total` decimal(7,1) NOT NULL DEFAULT '0.0',
`rel_pressure` decimal(7,1) NOT NULL DEFAULT '0.0',
`abs_pressure` decimal(7,1) NOT NULL DEFAULT '0.0',
`tendency` varchar(10) NOT NULL DEFAULT '',
`forecast` varchar(7) NOT NULL DEFAULT '',
UNIQUE KEY `timestamp` (`timestamp`),
KEY `rec_date` (`rec_date`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `notifications` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`homeid` int(11) NOT NULL,
`node` int(11) DEFAULT NULL,
`genre` int(11) DEFAULT NULL,
`commandclass` int(11) DEFAULT NULL,
`instance` int(11) DEFAULT NULL,
`index` int(11) DEFAULT NULL,
`label` varchar(255) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
`type` varchar(32) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
`units` varchar(32) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
`valueINT` bigint(20) DEFAULT NULL,
`valueSTRING` varchar(64) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
`timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `timestamp` (`timestamp`),
KEY `label` (`label`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `nodes` (
`id` int(11) NOT NULL,
`name` varchar(1024) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
`created` datetime NOT NULL,
`type` enum('POWER','BATTERY','','') DEFAULT NULL,
`replaced` date DEFAULT NULL,
`ignoreNode` int(11) DEFAULT '0',
`mtimestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `other` (
`object` varchar(8) NOT NULL,
`status` int(11) DEFAULT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`object`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `security` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`camera` int(11) NOT NULL,
`filename` varchar(120) NOT NULL,
`frame` int(11) NOT NULL,
`file_type` int(11) NOT NULL,
`time_stamp` datetime NOT NULL,
`event_time_stamp` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `time_stamp` (`time_stamp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `wakeup` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`homeid` int(11) NOT NULL,
`node` int(11) NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `basic` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parentId` int(11) DEFAULT NULL,
`homeid` int(11) NOT NULL,
`node` int(11) NOT NULL,
`instance` int(11) NOT NULL,
`valueINT` int(11) NOT NULL,
`timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `timestamp` (`timestamp`),
KEY `valueINT` (`valueINT`),
KEY `valueINT_2` (`valueINT`,`timestamp`),
KEY `node` (`node`,`valueINT`),
KEY `parentId` (`parentId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `switches` (
`node` int(11) NOT NULL,
`status` int(11) NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`node`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `thermostat` (
`node` int(11) NOT NULL,
`temp` double NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`node`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `tv` (
`tv_id` int(11) NOT NULL AUTO_INCREMENT,
`tv_weekday` int(11) NOT NULL,
`tv_hour` int(11) NOT NULL,
`tv_minutes` int(11) NOT NULL,
`tv_no` int(11) DEFAULT NULL,
`tv_action` enum('POWERON','POWEROFF','','') NOT NULL,
`tv_keys` varchar(1024) DEFAULT NULL,
`tv_lastaction` date DEFAULT NULL,
`tv_active` int(11) DEFAULT '0',
`tv_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`tv_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
CREATE TABLE IF NOT EXISTS `zones` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dayOfWeek` int(11) NOT NULL,
`startHour` int(11) NOT NULL,
`startMinutes` int(11) NOT NULL,
`endHour` int(11) NOT NULL,
`endMinutes` int(11) NOT NULL,
`active` int(11) NOT NULL,
`node` int(11) DEFAULT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `zonesAction` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dayOfWeek` int(11) NOT NULL,
`startHour` int(11) NOT NULL,
`startMinutes` int(11) NOT NULL,
`endHour` int(11) NOT NULL,
`endMinutes` int(11) NOT NULL,
`query` int(11) DEFAULT NULL,
`node` int(11) DEFAULT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `zonesAlarms` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`node` int(11) DEFAULT NULL,
`dayOfWeek` int(11) NOT NULL,
`startHour` int(11) NOT NULL,
`startMinutes` int(11) NOT NULL,
`endHour` int(11) NOT NULL,
`endMinutes` int(11) NOT NULL,
`alarms` int(11) DEFAULT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Akcje kiedy alarm ma dzwonic';
CREATE TABLE IF NOT EXISTS `ups` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`startTime` datetime NOT NULL,
`endTime` datetime DEFAULT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `zonesFree` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='wolne tak wiec bez alarmu dla tego okresu';
CREATE TABLE IF NOT EXISTS `zonesLights` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sensorNode` int(11) NOT NULL,
`lightNode` int(11) NOT NULL,
`timeStart` time NOT NULL,
`timeEnd` time NOT NULL,
`endNode` int(11) DEFAULT NULL,
`startedQry` int(11) DEFAULT NULL,
`dependsOnNode` int(11) DEFAULT NULL,
`dependsLastAction` int(11) DEFAULT NULL,
`active` int(11) DEFAULT NULL, `timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `zonesPower` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`powernode` int(11) NOT NULL,
`actiontimestart` time NOT NULL,
`actiontimeend` time DEFAULT NULL,
`value` int(11) NOT NULL,
`nomove` int(11) DEFAULT NULL,
`status` int(11) DEFAULT NULL,
`active` int(11) DEFAULT NULL,
`comment` varchar(255) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
`commandclass` int(11) NOT NULL,
`result` int(11) NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `zonesThermo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`thermonode` int(11) NOT NULL,
`actiontimestart` time NOT NULL,
`actiontimeend` time DEFAULT NULL,
`value` double NOT NULL,
`active` int(11) DEFAULT NULL,
`comment` varchar(255) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
DELIMITER $$
DROP TRIGGER IF EXISTS basic_update $$
CREATE TRIGGER basic_update AFTER INSERT ON basic
FOR EACH ROW
BEGIN
IF(NEW.valueINT = '255') THEN
UPDATE security SET event_time_stamp = DATE_FORMAT(NOW(),'%Y%m%d%H%i%S') ORDER BY id DESC LIMIT 1;
END IF;
END
DROP TRIGGER IF EXISTS `SWITCHES`;
DELIMITER //
CREATE TRIGGER `SWITCHES` AFTER INSERT ON `notifications`
FOR EACH ROW BEGIN
IF (NEW.label = 'Switch' AND NEW.valueINT IS NOT NULL) THEN
INSERT INTO switches (node,status,timestamp) VALUES (NEW.node,NEW.valueINT,NOW())
ON DUPLICATE KEY UPDATE status = NEW.valueINT, switches.timestamp = NOW();
END IF;
IF (NEW.commandclass = 67 AND NEW.valueINT IS NOT NULL) THEN
INSERT INTO thermostat (node,temp,timestamp) VALUES (NEW.node,NEW.valueINT,NOW())
ON DUPLICATE KEY UPDATE thermostat.temp = NEW.valueINT, thermostat.timestamp = NOW();
END IF;
END
//
DELIMITER ;
Historia
Wersja v0.2015XXZZ- poprawka zonesStart (zły warunek daty)
- poprawka LOCK (sms), wysyłaj potwierdzenie SMS gdy UPDATE poprawny- komenda KILL
Wersja v0.20150815
- synchronizacja z repo openzwave (poprawki)
- poprawka czasu dla autoalarmu
- zmiany w kodzie związane z "przestarzałymi" funkcjami
Wersja v0.20150711
- jedna globalna StateMachine dla smsów (wycieki pamięci)
- ignorowanie ignorowanych nodes w przypadku autoalarmu
- poprawka [if] warunku dla pralki/zmywarki
Wersja v0.20150705
- dodanie pierwszej wersji auto alarmu
- ignorowanie wartości zero z wake up'a
Wersja v0.20150611
- poprawka thread'a smsowego (jeśli zajęty nie czytaj skrzynki)
- import zmian w stosie z-wave (nowe urządzenia)
Wersja v0.20150530
- i znowu poprawki w tv (dłuższy czas pomiędzy "przyciskami")
- migracja z forka na thread'a dla smsów wraz z dodaniem mutexów
- poprawka dla pralki (krótkie programy)
- poprawka skrzynki smsowej (co wersja gammu to inny punkt startowy)
Wersja v0.20150506
- kolejne poprawki w tv (przełączanie kanałów)
- poprawka lokalizacyjna (zawsze kropka w zmiennoprzecinkowych)
- dodanie testowe tabeli zonesStart
Wersja v0.20150501
- dodany prefix (gdy mamy "wiele" sieci z-wave)
- poprawka czyszczenia zmiennej (problem z wyłączaniem światła)
- partitions dla notifications (według roku)
Wersja v0.20150416
- kolejne poprawki w pralce i zmywarce
- poprawki przy odczytywaniu smsów (nie exitujemy procesu)
Wersja v0.20150403
- dodanie "maszyny odpowiadającej" na akcje smsowe
- wstęp do łączenia sieci z-wave w jedną (mieszkanie, garaż, etc.)
Wersja v0.20150330
- dodanie wstępne możliwości odbierania smsów, poprawienie algorytmu zmywarka
- wstęp do lokalizacji
- podstawowe komendy smsowe
Wersja v0.20150327
- poprawienie algorytmu zmywarka, dodanie ignorowania alarmów z konkretnych urządzeń (tabela nodes)
Wersja v0.20150324
- dodanie algorytmu zmywarka na podstawie algorytmu pralka
Wersja v0.20141130
- dopracowanie "algorytmu pralka", dodanie powiadomień smsowych o zakończeniu praniu, zapisywanie do historii prań
Wersja v0.20141124
- pralka (start/stop) wersja podstawowa - komunikaty na gg o rozpoczęciu prania i o zakończeniu
Wersja v0.20141120
- nowe polecenia z konsoli COMMI,COMMS
- nowa tabela stateGet (wymuszone odświeżanie stanu urządzenia)
Wersja v0.20141116
- nowe polecenia z konsoli (CONF,STATE,etc.)
Wersja v0.20141109
- support dla wielu zaworów
Wersja v0.20140728
- automatyczne włączanie/wyłączanie TV SAMSUNG
Wersja v0.20140724
- support dla CEC w Raspberry Pi (TV ON/OFF)
- support dla SAMSUNG REMOTE (zdalny pilot)
Wersja v0.20140110 (zgodna z 1.0.791)
- zmiany w tabeli zonesLights
- poprawki dla strtol()
Wersja v0.20140103
- poprawka dla PINGa TV SAMSUNG (segfault i socket())
- zmiana dla zonesLights (światło ma gasnąć tylko po akcji nody głównej)
Wersja v0.20131229
- dodanie wsparcia dla TV SAMSUNG (na razie PING)
- zmiany w tabeli basic (rodzic dla akcji)
- małe czyszczenie kodu i poprawki (dla zonesLight)
Wersja v0.20131226
- dodane wsparcia dla zonesThermo (zarządzanie temperatura termostatów np. w łazience)
- dodanie w zonesLight parametru endNode (po akcji drugiej nody wykonaj daną akcje)
- dodanie wsparcia dla siłowników zaworów
Wersja v0.20131221
- poprawka dla zonesPower (dodanie sekcji krytycznej)
Wersja v0.20131220
- dodanie wsparcia dla tabeli zonesPower (sterowanie urządzeniami uruchomianymi cyklicznie)
Wersja v0.20131116
- dodanie wsparcia dla tabeli zonesLights (sterowanie światłem)
Wersja v0.20131111
- dodane wsparcie dla tabeli zonesFree
- dodane wsparcie dla włącznika światła, polecenia LIGHTON1 oraz LIGHTOFF1
Wersje poprzednie
- połączenie nowego open-zwave z open-zwave-controller (błędy kompilacji)
- dodanie fragmentów kodu z DomoZWave (obsługa wysyłania poleceń do z-wave, notyfikacje, etc.)
- dodanie wsparcia dla mysql
- dodanie wsparcia dla gg (libgadu)
- dodanie wsparcia dla sms (libgammu)
- nowe tabele (zone, zonesAlarm, etc)
Dostępne polecenia SMSowe
- FREEDAY - wyłącz alarmy "ruchu" na dzień dzisiejszy (tabela zonesFree)
- ALWAYSON - włącz alarm ciągły (sensorAlwaysOn = 1)
- ALWAYSOFF - wyłącz alarm ciągły (sensorAlwaysOn = 0)
- LOCK - włącz auto alarm
- UNLOCK - wyłącz auto alarm
Dostępne polecenia na porcie 6004
- ALARMON - włączenie alarmu dźwiękowego (ZWAVE_ALARM_NODE)
- ALARMOFF - wyłączenie alarmu dźwiękowego (ZWAVE_ALARM_NODE)
- ALIST - lista urządzeń Z-wave
- BASICAx - wyślij polecenie BASIC do wszystkich instancji node x (1-99) - BASICA2,4 - node 2 wartość 4
- BASICIx - wyślij polecenie BASIC do wybranej instancji node x (1-99) - BASIC2,4,3 - node 2 wartość 4 instancja 3
- CONFx - wyślij polecenie konfiguracyjne dla node x (1-99) - CONF2,17,24 - node 2 parametr 17 wartość 24
- COMMIx - wyślij polecenie typu liczbowego do node x - COMMI2,64,1,0,5 - node 2 polecenie 64 (thermostat mode) instancja 1 index 0 wartość 5
- COMMSx - wyślij polecenie typu tekstowego do node x - COMMS2,64,1,0,Off - node 2 polecenie 64 (thermostat mode) instancja 1 index 0 wartość Off (dla listy)
- DELROUTEx - usuń drogę dla node x (1-99)
- NEWROUTEx - wyznacz nową drogę node x (1-99) do kontrolera
- KILLx - usuń martwego noda x (1-99) z sieci z-wave
- LIGHTON1 - włączenie światła (wg. ZWAVE_LIGHT_NODE)
- LIGHTOFF1 - wyłączenie światła (wg. ZWAVE_LIGHT_NODE)
- STATEx - odśwież parametry node x (1-99)
- POWERON1 - włączenie gniazdka 1-99 (wg. ZWAVE_POWER_NODEx)
- POWEROFF1 - wyłączenie gniazdka 1-99 (wg. ZWAVE_POWER_NODEx)
- REFRESHx - odśwież Node x (1-99)
- SMSTEST - test wysyłki SMS (SMS_PHONE1,SMS_PHONE2)
- SAVECONFIG - zapisz aktualna konfigurację
- UPDATEx - aktualizuj sąsiadów jakich ma Node x (1-99)
- VALVEONx - otwarcie zaworów node x (wg. ZWAVE_VALVE_NODEx)
- VALVEOFFx - zamknięcie zaworów node x (wg. ZWAVE_VALVE_NODEx)
- TVON - włącz TV
- TVOFF - wyłącz TV
- TVKEYTV - przełącz na TV
Montaż urządzeń
Przełącznik ścienny pojedyńczy srebrny Z-Wave TZ66S
Aby zainstalować w standardowej puszcze (pomarańczowej):
- spiłować boki (inaczej nie wejdzie)
- usunąć tył puszki (gdzieś kable muszą się zmieścic)
- w instalacji muszą być przynajmniej 3 żyły
Podłączamy wg.
- L - przewód fazowy (brązowy kabel)
- L` - przewód od żarówki (niebieski)
- N - przewód "zerowy"(tu wykorzystałem nieużywane uziemienie;)
Konfiguracja urządzeń
Sygnalizator alarmowy Z-Wave SE812
<Node id="6" name="" location="" basic="4" generic="16" specific="0" type="Binary Switch" listening="false" frequentListening="true" beaming="true" routing="true" max_baud_rate="40000" version="3" query_stage="Probe1">
<Manufacturer id="0060" name="Everspring">
<Product type="000c" id="0001" name="SE812 Siren" />
</Manufacturer>
<CommandClasses>
<CommandClass id="32" name="COMMAND_CLASS_BASIC" version="1" request_flags="4" mapping="37">
<Instance index="1" />
</CommandClass>
<CommandClass id="37" name="COMMAND_CLASS_SWITCH_BINARY" version="1" request_flags="4">
<Instance index="1" />
<Value type="bool" genre="user" instance="1" index="0" label="Switch" units="" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="False" />
</CommandClass>
<CommandClass id="114" name="COMMAND_CLASS_MANUFACTURER_SPECIFIC" version="1" request_flags="4">
<Instance index="1" />
</CommandClass>
<CommandClass id="128" name="COMMAND_CLASS_BATTERY" version="1" request_flags="4">
<Instance index="1" />
<Value type="byte" genre="user" instance="1" index="0" label="Battery Level" units="%" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="100" />
</CommandClass>
<CommandClass id="132" name="COMMAND_CLASS_WAKE_UP" version="1" request_flags="2" create_vars="false">
<Instance index="1" />
</CommandClass>
<CommandClass id="133" name="COMMAND_CLASS_ASSOCIATION" version="1" request_flags="4">
<Instance index="1" />
<Associations num_groups="1">
<Group index="1" max_associations="5" label="Reports" auto="true">
<Node id="1" />
</Group>
</Associations>
</CommandClass>
<CommandClass id="134" name="COMMAND_CLASS_VERSION" version="1" request_flags="4">
<Instance index="1" />
<Value type="string" genre="system" instance="1" index="0" label="Library Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="6" />
<Value type="string" genre="system" instance="1" index="1" label="Protocol Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="2.64" />
<Value type="string" genre="system" instance="1" index="2" label="Application Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="1.03" />
</CommandClass>
</CommandClasses>
</Node>
Czujnik zalania Z-Wave ST812
<Node id="3" name="" location="" basic="4" generic="161" specific="2" type="Routing Alarm Sensor" listening="false" frequentListening="false" beaming="true" routing="true" max_baud_rate="40000" version="3" query_stage="Probe1">
<Manufacturer id="0060" name="Everspring">
<Product type="000b" id="0001" name="ST812 Flood Detector" />
</Manufacturer>
<CommandClasses>
<CommandClass id="32" name="COMMAND_CLASS_BASIC" version="1" request_flags="4" after_mark="true" mapping="113">
<Instance index="1" />
</CommandClass>
<CommandClass id="112" name="COMMAND_CLASS_CONFIGURATION" version="1" request_flags="4">
<Instance index="1" />
</CommandClass>
<CommandClass id="113" name="COMMAND_CLASS_ALARM" version="0">
<Instance index="1" />
<Value type="byte" genre="user" instance="1" index="0" label="Alarm Type" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="0" />
<Value type="byte" genre="user" instance="1" index="1" label="Alarm Level" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="0" />
</CommandClass>
<CommandClass id="114" name="COMMAND_CLASS_MANUFACTURER_SPECIFIC" version="1" request_flags="4">
<Instance index="1" />
</CommandClass>
<CommandClass id="128" name="COMMAND_CLASS_BATTERY" version="1" request_flags="4">
<Instance index="1" />
<Value type="byte" genre="user" instance="1" index="0" label="Battery Level" units="%" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="100" />
</CommandClass>
<CommandClass id="132" name="COMMAND_CLASS_WAKE_UP" version="2" request_flags="2">
<Instance index="1" />
<Value type="int" genre="system" instance="1" index="0" label="Wake-up Interval" units="Seconds" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="-2147483648" max="2147483647" value="3600" />
<Value type="int" genre="system" instance="1" index="1" label="Minimum Wake-up Interval" units="Seconds" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="-2147483648" max="2147483647" value="60" />
<Value type="int" genre="system" instance="1" index="2" label="Maximum Wake-up Interval" units="Seconds" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="-2147483648" max="2147483647" value="16777215" />
<Value type="int" genre="system" instance="1" index="3" label="Default Wake-up Interval" units="Seconds" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="-2147483648" max="2147483647" value="3600" />
<Value type="int" genre="system" instance="1" index="4" label="Wake-up Interval Step" units="Seconds" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="-2147483648" max="2147483647" value="1" />
</CommandClass>
<CommandClass id="133" name="COMMAND_CLASS_ASSOCIATION" version="1" request_flags="4">
<Instance index="1" />
<Associations num_groups="2">
<Group index="1" max_associations="1" label="Group 1" auto="true">
<Node id="1" />
</Group>
<Group index="2" max_associations="3" label="Group 2" auto="false" />
</Associations>
</CommandClass>
<CommandClass id="134" name="COMMAND_CLASS_VERSION" version="1" request_flags="4">
<Instance index="1" />
<Value type="string" genre="system" instance="1" index="0" label="Library Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="6" />
<Value type="string" genre="system" instance="1" index="1" label="Protocol Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="2.64" />
<Value type="string" genre="system" instance="1" index="2" label="Application Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="1.03" />
</CommandClass>
<CommandClass id="156" name="COMMAND_CLASS_SENSOR_ALARM" version="1" request_flags="4">
<Instance index="1" />
<Value type="byte" genre="user" instance="1" index="5" label="Flood" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="0" />
</CommandClass>
</CommandClasses>
</Node>