2018. már 04.

Domoticz automatizálási szabályok

írta: eNeS
Domoticz automatizálási szabályok

A Domoticz lényege az automatizálás lehetősége, mely a rendelkezésre álló szenzorok adatai alapján különböző vezérlőlogikák létrehozásában nyilvánul meg. Ezeket a Beállítás->Több lehetőség->Események alatti szinten (balra) találhatjuk meg:

domoticz_esemeny.jpg

Nem keverendő a "Több lehetőség" alatt (About felett) megjelenő Esemény ponttal, ami az eseménynaplót jelenti, ez utóbbinál csak megtekinteni tudjuk a bejövő adatokat, illetve a vezérlések sikeres/sikertelen lefutásának eredményét.. meg ha elírtunk valamit annak hibaüzenetét is. :)

domoticz_esemeny2.jpg

Az "Event name" mezőben adjunk egy nevet a szabálynak, alatta kiválasztható a szkript kódolásának típusa, ami lehet:

1/ Blockly

A Google által kifejlesztett Blockly egy vizuális programozási segédeszköz, lehetővé teszi, hogy könnyen és gyorsan összekattintgassuk a rendszerbe már felvett eszközökhöz különféle feltételes vezérléseket.
Előnye, hogy nem lehet elírni az eszközök nevét, mivel csak kiválasztani lehet, hátránya, hogy némileg kötöttebbek a lehetőségek.

domoticz_esemeny_blockly.jpg

2/ Lua

A Lua már egy igazi szövegbevitelt igénylő programozás lehetőség, meglehetősen flexibilis, a commandArray nevű tömb elemein keresztül lehet a Domoticz-ban felvett eszközök számára utasításokat küldeni. Ezt használom jelenleg szinte kizárólag.

Ha a "Device" vagyis eszközszintű kezelést választjuk, akkor csak azokat az eszközöket sorolja fel az alapértelmezetten generált for deviceName,deviceValue ciklusban, amiknek változott az állapota. Ezt az - alapból két kötőjellel a sor elején kikommentezett - if (deviceName=='eszköznév') then feltételekkel vizsgálhatjuk, ahol a deviceValue értékétől függően végezhetünk további műveleteket.
A jobb lent látható "Show current states" segítségével megtekinthetjük minden eszköz aktuális állapotát, és hogy milyen értéket jelent ez pontosan - az összehasonlító operátorok számára.
Ha "Time" vagy időzített kezelést választunk, akkor nagyjából percenként fogja végrehajtani az itt elhelyezett kódokat, én ezzel szoktam lekapcsolni a világítást pl időzítve az utolsó mozgás idejétől.

Példa (Device alapú):
Előszobai világítás bekapcsolása mozgásra, ha sötét van (luxmérő), és nincs bekapcsolva a nappali világítása sem, mert az pl bevilágítja az előszobát is:

commandArray = {}
for deviceName,deviceValue in pairs(devicechanged) do
 if (deviceName=='Előszoba mozgás') then 
  if deviceValue == "On" then        
   if (tonumber(otherdevices['Konyha fény']) < 1) 
and (otherdevices['Előszoba világítás'] == 'Off')
and (otherdevices['Nappali világítás'] == 'Off') then commandArray['Előszoba világítás']='On' end end end end
return commandArray

Van egy praktikus különbségszámító függvény, ami nem része az alap LUA motornak, ezért használatához be kell szúrni a kód elejére. (timedifference)
Ezzel már használható az alábbi mintakód (Time alapú), mely lekapcsolja a világítást, ha már több 300 másodperce nem mozgott senki arrafelé, és több mint 300 másodperce kapcsolták fel:

commandArray = {}

function timedifference(timestamp)
 y, m, d, H, M, S = 
timestamp:match("(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)") difference = os.difftime(os.time(),
os.time{year=y, month=m, day=d, hour=H, min=M, sec=S}) return difference end if (otherdevices['Előszoba világítás'] == "On") then if (timedifference(otherdevices_lastupdate['Előszoba mozgás']) > 300)
and (timedifference(otherdevices_lastupdate['Előszoba világítás']) > 300) then commandArray['Előszoba világítás']='Off' end end
return commandArray

Talán túlzásnak tűnik a dolog, mert ha nincs mozgás, ugyan hogy kapcsolták volna fel a világítást? Hát távoli paranccsal természetesen.

És akkor jöjjön némi automatizálási ízelítő: ("Device" Lua for ciklusába szúrandó az alábbi kódrészlet!)

if (deviceName=='Hálószoba világítás') then 
 if deviceValue == "Off" then
  if (tonumber(otherdevices['Háló fény']) < 20) then
   commandArray[1]={['Hálószoba LED szalag']='On'}
   commandArray[2]={['Hálószoba LED szalag']='Off AFTER 30'}
  end 

  if (timedifference(otherdevices_lastupdate['Nappali mozgás']) > 10) 
and (otherdevices['Nappali mozgás'] == 'Off') then if (otherdevices['Nappali világítás'] == 'On') then commandArray['Nappali világítás']='Off' end end
end end
return commandArray

A fenti kód a hálószobai világítás lekapcsolásakor felkapcsolja az ottani LED szalagot 30 másodpercre, ha 20 luxnál kevesebb a fény, majd megnézi, hogy mozog-e valaki a nappaliban, ha nem és megy ott a világítás, akkor azt is lekapcsolja. A commandArray-ban minden eszköznek egyszerre egy parancsot tudunk adni, a fenti példában látható, hogy A LED szalagnak egy másik tömbelemben adtam a második, időzített kikapcsolási parancsot, ezeket sorban hajtja végre. (azért kellett ez, mert az AFTER-nek másodpercben, a FOR-nak percben lehet megadni a paraméterét)

3/ DzVents

Továbbfejlesztett LUA szkriptelés, teljeskörűbb hozzáféréssel, mint a korábbi LUA esetében, jobban személyre szabható pl az időzített futtatás, globális felhasználói változók hozhatóak létre, stb. Meglehetősen kiforrott támogatással bír, és valóban komplex szabályok hozhatóak létre vele, mellyel még erősen ismerkedési fázisban vagyok.

4/ Python

Bár alapvetően a Python nyelvet jobban ismerem, mint a Luát, ennek támogatása a Domoticz-on belül viszonylag új, nem teljesen kiforrott és mivel a legtöbb szkriptemet már korábban megírtam Luában, még a Python-ra átállással várnék egy kicsit.

Szólj hozzá

programozás automatizálás szkript lua domoticz