Inteligentny dom i serwerownia (smart home and server room)

Z-wave DOM

 

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

  1. Debian 6.0.7 (Squeeze) - 3.2.0-0.bpo.4-486 #1 Debian 3.2.46-1+deb7u1~bpo60+1 i686 GNU/Linux
  2. Debian 7.8 (Wheezy) - 3.18.7+ #755 PREEMPT Thu Feb 12 17:14:31 GMT 2015 armv6l GNU/Linux
  3. Debian 8 (Jessie) - 3.2.0-4-686-pae #1 SMP Debian 3.2.65-1+deb7u2
  4. 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

  1. Brak łączności przeważnie rozładowuje urządzenia bateryjne (STELLA Z, Living Connect Z, ZG8101).
  2. Łączenie różnych sieci z wykorzystaniem jednej bazy generuje "duży" ruch - problem w przypadku limitowanego transferu.
  3. Terminal HP T5700 może posłużyć jako centrala przez około dwa lata (jeśli gromadzimy dane).
  4. Dwa lata zbiernia danych to średnio 4 miliony rekordów w tabeli notifications (cała baza to 800MB).
  5. Bateria baterii nierówna, na czarnej liście: Panasonic CR123A (zakupiona w MediaMarkcie), tanie wielopaki.
  6. Na zewnątrz stosujemy baterie typu "Lithium" (litowa), inne nie są warte uwagi (zima panowie i panie;).
  7. 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).
  8. Raspberry Pi i jego pseudo USB to zawsze jakieś problemy (nie przesadzajmy z ilością urządzeń).
  9. 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)
    Z-Wave Z-Stick S2 DSA02203-ZWEU
  • 2. Czujnik zalania Z-Wave ST812
    Z-Wave ST812

  • Instalacja baterii2013-10-03Wymiana baterii[jeszcze działa]Wybudzanieco godzineProblemyna razie brakWpis z dnia2015-01-31

     

  • 3. Stacja pogodowa WS-3500
    WS-3500
  • 4. Czujnik temperatury USB (0c45:7401)
    Temper
  • 5. Modem Huawei USB (12d1:1003)
    Huawei
  • 6. Terminal HP T5700
    T5700
  • 7. UPS
    ES 700
  • 8. Multi sensor Z-Wave DSB05
    DSB05
    Instalacja baterii2014-10-01Wymiana baterii2015-01-29 (akumulatorki)Wybudzanieco godzineProblemyprzy niskim stanie baterii - fałszywe alarmyWpis z dnia2015-01-31

     

  • 9. Sygnalizator alarmowy Z-Wave SE812
    SE812
  • 10. Przełącznik ścienny pojedyńczy srebrny Z-Wave TZ66S
    TZ66S
  • 11. Przełącznik gniazda Z-Wave AN158 z miernikiem
    AN158
  • 12. Elektrozawory kulowe 1/2" TKB DQ215 z modułem Z-Wave Micro Double Switch DSC35103 wraz z przełącznikiem ściennym
    TKB DQ215
  • 13. Głowica termostatyczna Z-Wave Living Connect Z
    Z-Wave Living Connect Z
    Instalacja baterii2013-12-20Wymiana baterii2015-04-06Wybudzanieco 5 minutProblemybaterie rozładowane przez awarie terminalaWpis z dnia2015-04-06

     

  • 14. Czujnik drzwiowy/okienny Z-Wave Fibaro FGK107 ciemny brąz
    Fibaro FGK107
    Instalacja baterii2013-12-20Wymiana baterii2016-05-10Wybudzanieco godzineProblemybardzo łatwo przypadkowo wykonać reset pamięci przy wymianie bateriiWpis z dnia2016-05-13

     

  • 15. Przełącznik gniazda sieciowego Z-Wave DSC24
    Z-Wave DSC24
  • 16.Głowica termostatyczna Z-Wave STELLA Z
    Z-Wave Stella Z
    Instalacja baterii2014-02-26Wymiana baterii2014-12-26Wybudzanieco 15 minutProblemyna razie brakWpis z dnia2015-01-31

     

  • 17. Czujnik otwarcia drzwi garażowych Z-Wave ZG8101
    Z-Wave ZG8101
  • 18. Raspberry Pi Model B i Raspberry Pi 2 model B
    Raspberry PI
  • 19. Elektrozawory kulowe 1/2" TKB DQ215 z modułem przełącznika Z-Wave 2x1,5 kW PAN06 wraz z przełącznikiem ściennym
    TKB DQ215

  • 20. Kontroler IR+Czuj.Temp. Z-Wave AC Extender ZXT-120
    ZXT 120
  • 21. Czujnik Z-Wave ruchu, temp., światła, otw.drzwi/okna PSM02
    Z-Wave PSM02
    Instalacja baterii2014-12-05 Wymiana baterii[jeszcze działa]Wybudzanieco godzineProblemy1raz zawiesił sięWpis z dnia2015-01-31

     

  • 22. Modem Huawei E173s (12d1:1c05)
    E173s
  • 23. Terminal HP T5740 - 3GB MEM, 40GB ATA, 160GB SATA
    T5740
  • 24. Przełącznik gniazda sieciowego Z-Wave Duewi IP20 + Adapter AC
    Duewi IP20
  • 25. Czujnik Z-Wave ruchu, temp., światła, otw.drzwi/okna PST02-A 4 in 1 Multi-Sensor
    Z-Wave PSM02
    Instalacja baterii2015-06-05 Wymiana baterii[jeszcze działa]Wybudzanieco godzineProblemynowy chipsetWpis z dnia2015-06-05

     

  • 26. Czujnik drzwiowy/okienny Z-Wave SM103
    SM103
  • 27. Czujnik dymu i temperatury Z-Wave Popp
    Popp
    Instalacja baterii2015-08-24 Wymiana baterii[jeszcze działa]Wybudzanieco godzineProblemybłędna instrukcja, problem z włączeniem do sieci z-waveWpis z dnia2015-08-29

     

 

Serce nowej "domowej" wersji systemu ;)

HP T5740 + z-wave + Huawei

 

Serce starej "domowej" wersji systemu ;)

HP T5700 + z-wave + Huawei

 

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:

  1. gdy jest wyłączona nie pobiera prądu
  2. podczas startu pobiera nie więcej niż 20W
  3. podczas wstępnej pracy pobiera więcej niż 20W
  4. 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_idtv_weekdaytv_hourtv_minutestv_notv_actiontv_keystv_lastactiontv_activetv_timestamp
116301POWERONKEY_TV;KEY_4NULL12014-07-28 23:56:37

 

-: Termostat :-

W łazience chcemy grzać tylko, gdy jest potrzeba dlatego ja ustawiłem sobie termostat według tego schematu:

 

idthermonodeactiontimestartactiontimeendvalueactivecommenttimestamp
111 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):

 

idsensorNode 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).

idsensorNode 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.

idsensorNodelightNodetimeStarttimeEndendNodestartedQrydependsOnNodedependsLastActionactivetimestamp
412915:00:0023:50:00NULL156012014-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

 

  1. Zmywarka BOSCH - program 70 stopni - czas 2:30 - zużycie 1.219 - 1.271 kWh
  2. Pralka Electrolux - program 60 stopni - czas 2:10 - zużycie 1.112 kWh
  3. 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 [email protected] $< $(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>