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
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