Watchdog mittels DOIF funktioniert nicht zuverlässig

Begonnen von m8ichael, 02 Dezember 2023, 12:46:09

Vorheriges Thema - Nächstes Thema

m8ichael

Hallo zusammen,

irgendwie funktioniert mein Watchdog zum Ausschalten der Geschirrspülmaschine nicht korrekt. So verwende ich einen Schalter mit Leistungsmessung. Ziel ist, dass dieser ausgeschaltet wird, wenn die Leistung innerhalb von einer halben Stunde unter 15 Watt liegt. Tatsächlich schaltet das DOIF manchmal den Schalter aus, obwohl eben dieser Zeitraum noch nicht erreicht ist (wobei ich jetzt mal testweise den Zeitraum sogar auf 60 Minuten erhöht habe). Könnt ihr in der u. a. Definition des DOIFs einen Bug entdecken? Ich stehe irgendwie auf dem Schlauch.

defmod di.eg.ku.Geschirrspuelmaschine DOIF ([div.Schalter14] eq "on" and [?di.eg.ku.Geschirrspuelmaschine] =~ "cmd_4|initialize|initialized")({SignalTextVersenden("\@michael","Steckdose Geschirrspüle ist an.")})\
DOELSEIF ([div.Schalter14.Power:power] > 15 and [?di.eg.ku.Geschirrspuelmaschine] eq "cmd_1")({SignalTextVersenden("\@michael","Geschirrspülmaschine läuft.")})\
DOELSEIF ([div.Schalter14.Power:power] < 15 and [?di.eg.ku.Geschirrspuelmaschine] =~ "cmd_2|cmd_1")({info_ansagen("Die Geschirrspülmaschine ist fertig.","Die Geschirrspülmaschine ist fertig.")}, set div.Schalter14 off)\
DOELSEIF ([div.Schalter14] eq "off" and [?di.eg.ku.Geschirrspuelmaschine] =~ "cmd_3|cmd_1")({SignalTextVersenden("\@michael","Geschirrspülmaschine ist aus.")})
attr di.eg.ku.Geschirrspuelmaschine do resetwait
attr di.eg.ku.Geschirrspuelmaschine wait 0:0:3600:0

setstate di.eg.ku.Geschirrspuelmaschine cmd_2
setstate di.eg.ku.Geschirrspuelmaschine 2023-12-02 12:35:17 Device div.Schalter14.Power
setstate di.eg.ku.Geschirrspuelmaschine 2023-12-02 12:35:07 cmd 2
setstate di.eg.ku.Geschirrspuelmaschine 2023-12-02 12:35:07 cmd_event div.Schalter14.Power
setstate di.eg.ku.Geschirrspuelmaschine 2023-12-02 12:35:07 cmd_nr 2
setstate di.eg.ku.Geschirrspuelmaschine 2023-12-02 12:35:17 e_div.Schalter14.Power_power 2015
setstate di.eg.ku.Geschirrspuelmaschine 2023-12-02 12:35:10 e_div.Schalter14_STATE on
setstate di.eg.ku.Geschirrspuelmaschine 2023-09-01 17:30:42 mode enabled
setstate di.eg.ku.Geschirrspuelmaschine 2023-12-02 12:35:07 state cmd_2
setstate di.eg.ku.Geschirrspuelmaschine 2023-12-02 11:03:32 wait_timer no timer

Laut Log des Werts "Power" lag dieser bis zum Ausschalten stets oberhalb von 15:

2023-12-02_10:59:09 div.Schalter14.Power power: 2065
2023-12-02_10:59:20 div.Schalter14.Power power: 2047
2023-12-02_10:59:54 div.Schalter14.Power power: 2065
2023-12-02_11:00:29 div.Schalter14.Power power: 2047
2023-12-02_11:00:48 div.Schalter14.Power power: 2064
2023-12-02_11:02:14 div.Schalter14.Power power: 2041
2023-12-02_11:02:48 div.Schalter14.Power power: 2062
2023-12-02_11:03:34 div.Schalter14.Power power: 0

Um 11:03 Uhr erfolgte dann - wie auch im Log erkennbar - die Abschaltung. Merkwürdig ist, dass dieses Verhalten nicht immer auftritt.

Gruß
Michael

Aurel_B

Hmmm, bist du sicher, dass div.Schalter14.Power IMMER über 15 lag? Was ich mal machen würde: speichere doch wenn das DOIF cmd_3 == Geschirsspüler abschalten auslöst den Wert von div.Schalter14.Power z.B. in einem Reading im DOIF. So mache ich jeweils das Debugging wenn ein DOIF nicht so will wie ich möchte.

Vielleicht wäre es hilfreich, wenn du statt die Momentanwerte einen Mittelwert verwendest. Unser Geschirrspüler verbraucht z.B. z.T. nur wenige Watt obwohl noch ein Programm am laufen ist (=Umwälzpumpe und Heizstab sind aus, er lässt etwas einwirken oder ist in der Trocknenphase). Dann kann schon mehrere Minuten kaum etwas verbraucht werden. Triggert dein DOIF genau in diesem Moment, schaltet es den GS fälschlicherweise aus. Ich verwende hierfür eine angepasste Perl Funktion "movingAverage", siehe Wiki resp. https://forum.fhem.de/index.php?topic=123080.msg1176127#msg1176127

Per

Zitat von: Aurel_B am 03 Dezember 2023, 15:58:17. Triggert dein DOIF genau in diesem Moment...
Ob das DOIF etwas triggert, weiß ich nicht, dürfte aber auch egal sein.
Wichtig ist, durch was das DOIF getriggert wird. Und das kann man im Eventview nachschauen.

Nebenbei gibt es ausreichend Beispiele für Waschmaschinen, Geschirrspüler dürfen sich wenig unterscheiden.

m8ichael

Moin!

Zitat von: Aurel_B am 03 Dezember 2023, 15:58:17Hmmm, bist du sicher, dass div.Schalter14.Power IMMER über 15 lag?

Was meinst du mit 'immer'? Laut dem Protokoll lag da in der Wait-Zeit nichts unter 15. Nach meinem bisherigen Verständnis müsste der Wert doch mindestens 60 Minuten durchgängig diesen Wert unterschreiten, ehe der Trigger auslöst. Oder habe ich da resetwait falsch verstanden?

Gruß
Michael

Aurel_B

Andere Frage: was passiert, wenn du do resetwait weglässt?