Alter von Reading effizient überprüfen

Begonnen von Hanjo, 29 April 2021, 21:30:41

Vorheriges Thema - Nächstes Thema

Hanjo

Hallo,

Ich möchte bei meiner Jalousie den Zustand (fährt hoch, fährt runter, angehalten) erkennen. Als sinnvollen Input kann ich dazu lediglich den status heranziehen (0% = geöffnet / 100% = geschlossen). Meine Logik ist

  • Wird status größer, fährt die Jalousie herunter
  • Wird status kleiner, fährt die Jalousie hoch
  • Ändert sich status länger als zehn Sekunden nicht mehr, oder ist status gleich 0 oder 100 hat die Jalousie angehalten

Derzeit sieht meine Lösung so aus:
defmod Jalousie.UpdateMotor DOIF ([JalousieOst:status:d] == 0 or [JalousieOst:status:d] == 100 or [+10] and [JalousieOst:status:sec] > 10) (
setreading JalousieOst motor stop
) DOELSEIF ([JalousieOst:status:diff] > 0) (
setreading JalousieOst motor down
) DOELSEIF ([JalousieOst:status:diff] < 0) (
setreading JalousieOst motor up
)


Ich bin damit aber nicht wirklich zufrieden, da ich einen Trigger benötige, der alle zehn Sekunden überprüft, ob der status älter als zehn Sekunden ist. Ohne do always löst das DOIF zwar nicht erneut aus, aber der Timer läuft halt trotzdem permanent.

Gibt es hier eine elegantere Lösung?

Danke & Gruß
Hanjo

cwagner

Eine Anregung wäre das Attribut oldreadings auf status in Verbindung mit event-on-change-reading für status. status ändert sich dann nur, wenn Jalousie in Bewegung ist. Den Status würde ich als Trigger nehmen und vergleichen, ob das vorherige Reading größer oder kleiner ist. Mit event-on-change-reading sorgst Du auch dafür, dass in Dein System entlastet wird von redundanten Aktualisierungen.

Herzliche Grüße

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB