Domoticz automatizálási szabályok
2018. március 04. í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

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 commandArray = {} 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

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

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.

A bejegyzés trackback címe:

https://bitekmindenhol.blog.hu/api/trackback/id/tr9413715558

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

heyjoe 2018.06.08. 09:40:49

Szia!
A posztjaid hatására én is beüzemeltem egy Domoticz-ot az Orange Pi-n, és nagyon tetszik.
Két kérdésem lenne, hátha tudsz segíteni:
a domoticz mqtt-ben mikor kell az svalue-t, és mikor az nvalue-t használni? Első tippre az svalue-ben megy a string, az nvalue-ben a szám, de ez nem igaz, hiszen sok eszköz küldi az svalueben a számszerű értékét.
A másik: hogyan tudnám azt figyelni, ha egy counter értéke az elmúlt fél órában változott (és ha igen, akkor egy kapcsoló értékét állítsa ON-ra)

eNeS 2018.06.08. 18:17:45

Örülök, hogy nem csak én használom. :) Az MQTT paramétereket én is próba és hiba módszerrel kísérleteztem ki, a bináris szenzorok, pl mozgásérzékelő és kapcsolók általában az nvalue vagy numeric value mezőt használják ahol 0 vagy 1 szokott lenni az érték, a többi érzékelő az svalue vagyis string value mezőben közli az értékeket, van amelyik többet is ";"-vel elválasztva. Bár a kapcsolóknak van speciális "command":"switchlight" + "switchcmd" paraméterük is, illetve a Többes választókapcsoló pedig "svalue1"-ben küldi a választott szint számát.

eNeS 2018.06.08. 18:26:39

@heyjoe: Valószínűleg úgy kezdenék neki, hogy létrehoznék egy felhasználói változót (több lehetőség-felhasználói változók). Device eventre aktiválódó LUA szkriptben figyelném a Countert, - mely remélhetőleg változáskor triggerel ilyet, még sose használtam Countert - összehasonlítanám a felh. változó értékével, megnézném a timedifference() segítségével mindkettő mikor változott utoljára, ha változott, akkor betenni az aktuális értékét a felh. változóba, és ha a fél órán belül van, akkor kiadni a kapcsolónak az ON parancsot

heyjoe 2018.06.08. 21:38:37

@eNeS: Köszi!
Nagyon ügyes cucc ez a Domoticz, megkedveltem, bár még nem mindenhol tiszta a logikája (sokszor úgy érzem, hogy egymáshoz logikusan kapcsolódó funkciók szét vannak dobva, pl. az alaprajznál, de aztán megszokja az ember)
Most egyelőre ugyanabban a python scriptben vizsgálom, amiben a counternek küldöm az adatokat, de ki fogom próbálni az általad javasoltat.
Egyébként egy villámlás-számlálóhoz kell (www.domoticz.com/forum/viewtopic.php?f=4&t=17000), csak nem csupán számlálni akarom, hanem figyelmeztetni is magamat, hogy jön a gond :) De szépen jött is a jelzés az előbb a telefonra, hogy villámlott 30 km-s körzetben, szóval az alapok már jók.
Domoticz-en belül scriptelésre még csak a Blockly-t használtam, valahogy még a cronból indított python scripteknél jobban tudom, mikor-mi történik, de majd azért igyekszem a lehetőségeit jobban kihasználni.

heyjoe 2018.06.27. 10:19:09

Tegnap este frissítettem az új stable-re, ma reggelre eltűntek az időzítéseim, csak egy undefined felirat fogadott. A megoldás Chrome-ban a nyitott fejlesztői eszközöknél (CTRL+SHIFT+I) egy gyorsítótár nélküli újrabetöltés (CTRL+F5)

eNeS 2018.07.26. 19:36:36

@heyjoe: Igen, én vártam még egy hónapot a frissítéssel, mert sejtettem, hogy néhány változás nagy lesz az előző stabilhoz képest. Pl az alaprajzokat sem lehet mostmár lecserélni, adatbázisba másolja, nem fájlrendszerből tölti be, és a kép skálázása is változott, aminek annyira nem örültem, mert nem fekvő képet használtam eddig - szóval újrarajzolás és minden ikon újra felhelyezése. Technikai változás, hogy a Selector switch szintnevei mostmár base64 kódoltak, így a DBoard guimat is frissítenem kell, mert elugrott minden elnevezés, illetve az akciók/parancssorokat URL enkódolták, mikor importálásra került az adatbázisba, és némelyiket javítanom kellett...