Shelly und on-for-timer (MQTT/HTTP)

Begonnen von gestein, 04 November 2021, 11:10:46

Vorheriges Thema - Nächstes Thema

gestein

Hallo,

ich habe meine Shellys über MQTT in fhem eingebunden (per MQTT2-Devices).
Dazu benutze ich die templates.

Allerdings fehlte mir immer das "richtige" "on-for-timer", dass die Shellys eigentlich anbieten.
Nach ein paar Diskussionen mit dem Support von Shelly ist klar, dass (derzeit) weder ein Timer per MQTT gesetzt werden kann, noch dass irgendwie ein Update eines laufenden Timers über MQTT kommt.

Um "on-for-timer" zu nutzen, muss man also auf http-Requests zurückgreifen.
Meine Lösung dafür möchte hier kurz vorstellen, vielleicht kann es jemand brauchen.

1) zuerst mal nutze ich die Funktionen aus "99_myShellyUtils.pm" von supernova1963:
https://forum.fhem.de/index.php/topic,102369.0.html

2) Im MQTT2-Device werden dann die folgenden Attribute ergänzt:
2a) setList:
on-for-timer {  shelly_HttpRequest($NAME,ReadingsVal($NAME,"ip","").",relay/0?turn=on&timer=".$EVTPART1)}
off-for-timer {  shelly_HttpRequest($NAME,ReadingsVal($NAME,"ip","").",relay/0?turn=off&timer=".$EVTPART1)}


2b) readingList:
shellies/<shelly-id>/relay/0:.* { shelly_HttpRequest($NAME,ReadingsVal($NAME,"ip","").",relay/0?")}
   Der Eintrag ist zusätzlich zu dem für das "state"-Reading anzulegen.

Für andere Kanäle (z.B. auf einem Shelly 2.5) müsste man die Nummer bei "relay" anpassen.

Damit funktioniert das "on-for-timer" und das "off-for-timer" auf dem Shelly.
Es scheint auch keine Seiteneffekte zu geben, wenn man in einem MQTT2-Event (heißt das so?) einen Http-Request absetzt.

Vielleicht kann sich das mal jemand mit mehr Erfahrung anschauen, wahrscheinlich kann man das einfacher oder eventuell auch besser lösen oder man muss noch irgendwas berücksichtigen.
Für Anmerkungen/Verbesserungen bin ich jederzeit offen.

lg, Gerhard

p.s.: Man könnte - während ein Timer auf dem Shelly läuft - über ein at periodisch den Status des Relay abfragen, dann würde man den Timer im Reading "timer_remaining" runterlaufen sehen.