Automatizálás ADA P1 Meterrel – így működik a JSON alapú szabályrendszer
Az ADA P1 Meter (és a hozzá kapcsolódó ADA rendszer) nem csak adatot gyűjt a mérőóráról és plugin eszközökről, hanem saját szabályrendszert is futtat.
Ez a szabályrendszer egy JSON fájlban él (általában rules.json), és egy beépített értelmező (interpreter.cpp) dolgozza fel.

Ezzel a felhasználó:
-
feltételekhez köthet HTTP hívásokat (pl. Shelly, Tasmota, saját REST API),
-
be tud avatkozni fogyasztók működésébe,
-
egyszerűen, kódelőismeret nélkül építhet automatizációt.
Ebben a cikkben végigmegyünk:
-
hogyan néz ki a
rules.json, -
hogyan kell felépíteni a feltételeket (
condition), -
hogyan működik az időzítés és az ismétlés,
-
hogyan használhatod a plugin adatokat (PZEM, Shelly, Tasmota, stb.),
-
kapni fogsz több konkrét szabálymintát.
1. A rules.json felépítése
A szabályrendszer egy JSON objektum, benne egy rules tömbbel:
1.1. Egy rule mezői
Kötelező / fontos mezők:
-
id
Egyedi azonosító. Ha üres vagy hiányzik, a rule gyakorlatilag kihagyásra kerül. -
enabled
true→ aktív,false→ teljesen figyelmen kívül hagyja a firmware. -
condition
Szöveges feltétel – akkor futnak az akciók, ha ez a kifejezés igaz (nem 0). -
min_timer_seconds
Minimum idő (mp-ben), ameddig a feltételnek folyamatosan igaznak kell lennie, mielőtt az akció lefut.-
0 → nincs késleltetés, „azonnali” rule.
-
-
repeat-
false→ egyszeri szabály: ha egyszer lefutott, vége. -
true→ ismétlődő szabály: a megadott késleltetéssel többször is lefuthat.
-
-
repeat_delay_seconds
Ismétlődő szabály esetén a két egymást követő végrehajtás között kötelező szünet (cooldown) másodpercben. -
actions
HTTP hívások listája, sorban végrehajtva:-
method:"GET"vagy"POST". -
url: hívandó URL (ha üres, az akció kimarad). -
body: POST esetén a küldendő JSON / adat (GET-nél üres lehet).
-
Opcionális, de hasznos:
-
name
Csak embernek szóló név, UI-ban, logban jól jön („Kávéfőző bekapcsolás”, stb.).
2. Miből dolgozik a szabályrendszer? – a dataJson
A szabályok nem a levegőbe lőnek: minden ciklusban kapnak egy aktuális „adatcsomagot” egy JSON-ben (itt hívjuk dataJson-nak). Ez tartalmazza többek között:
-
P1 mérő adatok:
-
pl.
voltage_phase_l1,current_phase_l1, -
instantaneous_power_import,instantaneous_power_export, -
active_import_energy_total, stb.
-
-
metaadatok:
-
os_version,local_ip,timestamp,meter_serial_number…
-
-
plugin adatok egy
pluginsobjektum alatt.
Példarészlet (rövidítve az általad küldöttből):
A feltételekben ezekre a kulcsokra tudsz hivatkozni.
3. Feltételnyelv: mit tud a condition?
A condition egy szöveg, amit az interpreter kiértékel.
Az eredmény egy szám, és akkor számít igaznak, ha nem 0.
3.1. Támogatott operátorok
-
Logikai:
-
||– VAGY -
&&– ÉS
-
-
Összehasonlítás:
-
==,!= -
>,<,>=,<=
-
-
Aritmetika:
-
+,-,*,/
-
-
Zárójelezés:
-
(...)– ahogy megszoktad
-
3.2. Változók, literálok
-
Ha az egész kifejezés egy kulcs név (pl.
instantaneous_power_import),
akkor az interpreter a JSON-ból kiolvassa. -
Ha pontot tartalmaz (
plugins.Shelly_power_02.value), akkor
beágyazott objektumokon mászik végig:plugins→Shelly_power_02→value. -
Ha nem kulcs, akkor megpróbálja számként értelmezni:
-
"10"→ 10 -
"0.705"→ 0.705 -
"true"→ 1 -
"false"→ 0 -
nem értelmezhető string → 0
-
Tehát ilyeneket simán írhatsz:
Ha egy kulcs nem létezik, az értéke gyakorlatilag 0 – ezért a feltétel soha nem lesz igaz, ha csak arra támaszkodsz. Ilyenkor érdemes ellenőrizni, jól írtad-e a nevet.
4. Időzítés és ismétlés: min_timer_seconds, repeat, repeat_delay_seconds
Itt jön a „varázs” rész: a szabály nem csak azt tudja, hogy most igaz-e a feltétel, hanem azt is, hogy mióta az.
A firmware minden rule-hoz belső állapotot tart fenn (RuleState), amiben tárolja:
-
fut-e timer,
-
mikor indult,
-
lefutottak-e már az akciók,
-
ismétlődik-e, mikor volt az utolsó futás.
4.1. min_timer_seconds – mennyi ideig legyen igaz a feltétel?
-
Ha
min_timer_seconds = 0:-
a feltétel első igaz pillanatában azonnal lefutnak az akciók (ha még nem futott le korábban).
-
-
Ha
min_timer_seconds > 0:-
amikor a feltétel először igaz lesz, elindul egy belső timer;
-
ha a feltétel folyamatosan igaz marad, és letelik ez az idő, akkor futnak az akciók;
-
ha közben a feltétel „leesik” (hamis lesz), a timer reset, kezdheti elölről, ha újra igaz.
-
Ezzel tudsz olyat csinálni, hogy:
„Csak akkor lépjen közbe a rendszer, ha már legalább 10 másodperce 3 kW fölött vagyok.”
4.2. repeat + repeat_delay_seconds – újrafuttatható szabály
-
Ha
repeat = false:-
a szabály egyszer fut – ha az akció lefutott,
completed = true, többé nem fut.
-
-
Ha
repeat = true:-
a szabály többször is futhat,
-
de két futás között legalább
repeat_delay_seconds-nek el kell telnie, -
plusz minden futásnál újra érvényesülnie kell a
min_timer_secondslogikának (ha nem 0).
-
Példa: ha percenként egyszer akarod ellenőrizni és kapcsolgatni a valamit:
5. Akciók: HTTP GET/POST
A actions tömbben definiálod, mit csináljon a szabály, ha a feltétel igaz (és az időzítés is letelt).
Egy akció:
-
GET: tipikusan eszköz parancsokhoz (Shelly, Tasmota, saját endpointok).
-
POST: ha JSON-t vagy más payloadot küldesz (pl. valami REST API-nak).
Az interpreter minden akcióra:
-
ellenőrzi, hogy az
urlnem üres, -
létrehoz egy HTTP kliens objektumot,
-
GET vagy POST kérést küld,
-
logolja a sikert / hibát a belső naplóban.
6. Példa: kávéfőző konnektor ki- és bekapcsolása
Vegyük a konkrét példádat egy Shelly pluggal (IP: 192.168.31.185). A kávéfőző be-kikapcsolását két rule-zal oldjuk meg.
6.1. Kávéfőző BE – ismétlődő szabály
Mit csinál?
-
Feltétel:
voltage_phase_l1 != 0
→ gyakorlatban „van feszültség a mérő szerint”. -
min_timer_seconds = 0
→ amint igaz a feltétel és éppen „szabad” a szabály, azonnal hívja az URL-t. -
repeat = true,repeat_delay_seconds = 120
→ max. 120 másodpercenként egyszer fut újra, ha közben a feltétel végig igaz marad.
Ez így egy „időnként bekapcsoló” rule, amit tipikusan valamilyen extra feltétellel kombinálsz (pl. konkrét időablak, PV termelés, stb.).
6.2. Kávéfőző KI – késleltetett kikapcsolás
Itt:
-
ugyanazt a feltételt használod (
voltage_phase_l1 != 0), ami tipikusan „mindig” igaz, amikor a mérő online, -
de a
min_timer_seconds = 60miatt csak akkor kapcsolja KI a kávéfőzőt, ha legalább 60 másodperce folyamatosan fennáll a feltétel, -
a
repeat+repeat_delay_secondsmiatt pedig ez a KI parancs 120 mp-es cooldown-nal ismétlődhet (ha így van értelme).
Reálisan egy ilyen „BE/KI” párost érdemes még további feltételekkel finomítani (időablak, plugin teljesítmény, stb.), de a mechanika jól látszik:
-
az egyik azonnali indítás,
-
a másik késleltetett visszakapcsolás / kikapcsolás.
7. Példák plugin alapú szabályokra
A plugins részben dinamikus kulcsok vannak, pl.:
Az interpreter ponttal tagolt kulcsfeloldást használ, tehát ilyen condition teljesen legális:
7.1. PZEM – túlterhelés L1-en
Itt:
-
ha az L1-en mért teljesítmény (PZEM) 5 másodpercnél tovább 2000 W felett van,
-
a rendszer kikapcsol egy Tasmota plugot (
Power Off), -
és ezt legfeljebb percenként egyszer teszi meg ugyanarra a feltételre.
7.2. Kombinált feltétel – hálózati limit + plugin
-
Ha vagy:
-
túl nagy az import (2,5 kW felett) ÉS beesik a fesz L1-en,
-
vagy az 1-es Shelly plug 1 kW felett van,
-
-
akkor 10 mp után lekapcsolja a Shelly 0. reléjét.
8. Tippek a szabályok tervezéséhez
-
Ne spammelj eszközöket
Harepeat = true, mindig állíts be ésszerűrepeat_delay_seconds-t (pl. 30–300 mp), különben nagyon sűrűn kaphatnak parancsot. -
Használj minimális időt zajos / billegő értékeknél
Áramszint, teljesítmény gyakran átugrik a határ körül → ilyenkor amin_timer_secondskisimítja a zajt. -
Mindig ellenőrizd a kulcsneveket
Ha elgépeled (pl.instantanous_power_import), az érték 0 lesz, és a condition soha nem igaz. A legjobb, ha a/jsonvagy/telegramválaszából copy-paste-elsz. -
Először csak logolj / tesztelj
Ha félsz az azonnali kapcsolgatástól, csinálhatsz olyan szabályt, ami egy saját HTTP endpointot hív (pl. egy debug szerverre), hogy lásd, milyen gyakran lenne akció. -
Egyszeri vs ismétlődő logika tisztán
-
repeat = falsejó egyszeri eseményekre (pl. „ha először léptem át ezt a küszöböt, csinálj valamit, aztán soha többé”). -
repeat = truekell, ha folyamatos felügyeletet akarsz (pl. fogyasztás limitálása, töltés szabályozása).
-

Hozzászólások
Még nincs hozzászólás, légy te az első!