Szabályrendszer

A beépített szabálymotor egyszerű feltételek alapján HTTP parancsokat küld más eszközöknek, így az ADA P1 Meter önállóan – külön automatizációs szerver nélkül – tud bojlert kapcsolni, dugaljat vezérelni, értesítést küldeni.

Tipikus forgatókönyvek:

  • Bojler bekapcs, ha napelemből >1,5 kW többlet van legalább 1 percig
  • Shelly kikapcs, ha fogyasztás >5 kW legalább 30 másodpercig
  • Webhook értesítés Discordra, ha visszatáplálás kezdődik
  • Home Assistant esemény csúcs-tarifa aktiválódására

Hogyan működik

A motor minden újonnan érkező adatnál (10 másodpercenként) kiértékeli az összes engedélyezett szabályt. Egy szabály három részből áll:

  1. Feltétel (condition) – egy kifejezés, ami igazra vagy hamisra értékelődik ki
  2. Minimum tartási idő (min_timer_seconds) – a feltételnek ennyi ideig folyamatosan igaznak kell lennie
  3. Akciók (actions) – egy vagy több HTTP kérés, amik lefutnak

Szabály formátuma (JSON)

Teljes szabálykészlet:

{
  "rules": [
    {
      "id": "bojler_be",
      "enabled": true,
      "condition": "instantaneous_power_export > 1.5",
      "min_timer_seconds": 60,
      "repeat": true,
      "repeat_delay_seconds": 300,
      "actions": [
        {
          "method": "GET",
          "url": "http://192.168.1.50/relay/0?turn=on"
        }
      ]
    }
  ]
}

Mezők

MezőTípusKötelezőJelentés
idstringigenEgyedi azonosító (állapot-követéshez)
enabledboolnem (def: true)Ki/be kapcsolás törlés nélkül
conditionstringigenA kifejezés (max 512 karakter)
min_timer_secondsintnem (def: 0)Tartási idő – a feltételnek eddig igaznak kell lennie
repeatboolnem (def: false)Egyszeri (false) vagy ismétlődő (true)
repeat_delay_secondsintnemIsmétlődésnél a minimális várakozás (cooldown)
actionsarrayigenLegalább egy akció, mindegyik {"method", "url", "body"}

Akció formátuma

{
  "method": "GET",
  "url": "http://192.168.1.10/toggle",
  "body": ""
}
MezőTípusJelentés
methodstring"GET" (alap) vagy "POST"
urlstringA meghívandó URL
bodystringPOST esetén a kérés törzse (JSON szöveg vagy egyszerű string)

Kifejezések nyelve

A feltételek egy egyszerű, JavaScript-szerű kifejezéseket kezelnek.

Változók

A kifejezésben hivatkozhatsz bármilyen mezőre, ami a JSON válaszban szerepel:

instantaneous_power_import
voltage_phase_l1
current_tariff

Beágyazott objektumok (pl. plugins) pontos elérésűek:

plugins.temp_kitchen.value
plugins.boiler_power.value

Operátorok

Összehasonlítás:

>   <   >=   <=   ==   !=

Logikai:

&&   ||

Matematikai:

+   -   *   /

Csoportosítás zárójelekkel:

(voltage_phase_l1 + voltage_phase_l2) / 2 > 230

Típuskonverzió

  • Számok – lebegőpontos és egész számok egyaránt
  • Szövegek – automatikusan számmá alakítódnak, ha számot tartalmaznak ("1.234"1.234)
  • Logikai értékektrue → 1, false → 0
  • Szöveges "true"/"false" – ugyanaz, 1 / 0
  • Null / hiányzó – 0

Példák (egyszerűek)

1. Boiler bekapcs, ha napelem-többlet van

{
  "id": "boiler_be",
  "condition": "instantaneous_power_export > 1.5",
  "min_timer_seconds": 60,
  "repeat": true,
  "repeat_delay_seconds": 120,
  "actions": [
    {"method": "GET", "url": "http://192.168.1.50/relay/0?turn=on"}
  ]
}

Magyarázat:

  • Akkor fut le, ha legalább 1,5 kW visszatáplálás van
  • A feltételnek 60 másodpercig folyamatosan igaznak kell lennie (a felhők mozgása ne kapcsolgassa állandóan)
  • Utána 2 percig nem próbálkozik újra

2. Boiler kikapcs, ha fogyasztás nő

{
  "id": "boiler_ki",
  "condition": "instantaneous_power_import > 0.5",
  "min_timer_seconds": 30,
  "repeat": true,
  "repeat_delay_seconds": 120,
  "actions": [
    {"method": "GET", "url": "http://192.168.1.50/relay/0?turn=off"}
  ]
}

3. Csúcsfogyasztás figyelmeztetés Discord webhookon

{
  "id": "csucs_alarm",
  "condition": "instantaneous_power_import > 5.0",
  "min_timer_seconds": 10,
  "repeat": true,
  "repeat_delay_seconds": 600,
  "actions": [
    {
      "method": "POST",
      "url": "https://discord.com/api/webhooks/XXXXX/YYYYY",
      "body": "{\"content\":\"⚠️ Csúcsfogyasztás! Több mint 5 kW vételezés.\"}"
    }
  ]
}

4. Napi első export-pillanat → Home Assistant esemény

Egyszeri, nem ismétlődő:

{
  "id": "reggeli_termeles",
  "condition": "instantaneous_power_export > 0.1",
  "min_timer_seconds": 0,
  "repeat": false,
  "actions": [
    {
      "method": "POST",
      "url": "http://192.168.1.5:8123/api/events/pv_started_today",
      "body": "{\"source\":\"ada-p1-meter\"}"
    }
  ]
}

A "repeat": false miatt ez a szabály egyszer fut le, és amíg a készülék újra nem indul, nem fut le újra.

Összetett példák

Hőmérséklet-alapú kapcsolás

Ha van egy hőmérőd, ami a /write végponton room_temp kulccsal küldi az értéket:

{
  "id": "futes_be_hideg_volt",
  "condition": "plugins.room_temp.value < 19 && current_tariff == 0002",
  "min_timer_seconds": 60,
  "repeat": true,
  "repeat_delay_seconds": 600,
  "actions": [
    {"method": "GET", "url": "http://192.168.1.80/switch/heating/turn/on"}
  ]
}

Magyarázat: szobahőmérséklet 19 °C alatt ÉS éjszakai tarifa alatt kapcsol.

Több feltétel több akcióval

{
  "id": "napelem_csucs",
  "condition": "(instantaneous_power_export > 2.0) && (voltage_phase_l1 > 240)",
  "min_timer_seconds": 30,
  "repeat": true,
  "repeat_delay_seconds": 300,
  "actions": [
    {"method": "GET", "url": "http://192.168.1.50/relay/0?turn=on"},
    {"method": "GET", "url": "http://192.168.1.51/relay/0?turn=on"},
    {
      "method": "POST",
      "url": "http://192.168.1.5:8123/api/events/high_export",
      "body": "{\"kw\":2.0}"
    }
  ]
}

Dinamikus árazáshoz igazítás

Ha a tőzsdei ár magas, nem járatod a bojlert:

{
  "id": "boiler_olcso_idoben",
  "condition": "current_stock_price < 20 && plugins.boiler_temp.value < 55",
  "min_timer_seconds": 120,
  "repeat": true,
  "repeat_delay_seconds": 900,
  "actions": [
    {"method": "GET", "url": "http://192.168.1.50/relay/0?turn=on"}
  ]
}

Szabályok feltöltése

Webes felületről (ajánlott)

A dashboardon a „Szabályok" menüpontban vizuálisan szerkeszthetsz. Itt láthatod is, melyik szabály mikor futott le legutóbb.

API-ból

curl -X POST http://okosvillanyora.local:8989/rules \
     -H "Content-Type: application/json" \
     -d @rules.json

Lekérdezés

curl http://okosvillanyora.local:8989/rules

Törlés

curl -X DELETE http://okosvillanyora.local:8989/rules

Globális engedélyezés/tiltás

Minden szabály egyszerre:

# Szabálymotor kikapcs
curl http://okosvillanyora.local:8989/rules/disable

# Szabálymotor bekapcs
curl http://okosvillanyora.local:8989/rules/enable

Fontos tudnivalók

  • Legfeljebb 50 szabály értékelődik egy passzban, de gyakorlatilag nincs korlát a használható mennyiségre
  • Egy kifejezés maximum 512 karakter hosszú lehet
  • Az akciók HTTP timeoutja rövid (~1,2 mp), ne kontaktálj lassú külső szolgáltatást
  • Ha az url üres, az akció kihagyásra kerül
  • A POST body lehet sima szöveg vagy JSON – a Content-Type automatikusan application/json lesz
  • Globális KI kapcsoló: a dashboardból és a /rules/disable végpontról is letiltható az egész rendszer
  • Az állapot (tartási timer, utolsó futás) memóriában él – áramszünet után újra számolódik
  • Egy repeat: false szabály addig nem fut le újra, amíg a készülék újra nem indul vagy törölöd és újra létrehozod

Hibakereséshez: ACK log

Minden szabály-futás egy belső eseménynaplóba (ACK log) kerül. Ezt lekérdezheted:

curl http://okosvillanyora.local:8989/acklog

A naplóban láthatod:

  • Hogy a szabály feltétele mikor vált igazra
  • Hány másodperc után futott le
  • Milyen URL-t hívott meg
  • Milyen HTTP státuszkódot kapott válaszként