[gelöst] Watchdog mit if Verknüpfung

Begonnen von T3mplate, 22 Januar 2017, 11:37:04

Vorheriges Thema - Nächstes Thema

T3mplate

Hallo,

zu dem genannten Thema gibt es zahlreiche Einträge, die ich sorgsam gelesen habe.
Teilweise sind diese etwas älter und weichen von dem aktuellen Syntax ab, teilweise sind diese für meine Umsetzung nicht passend. Einige waren ähnlich zu meinem Fall, mein Problem konnte ich aber dennoch nicht lösen.

Kurz gesagt:
Ich habe folgendes Szenario für meine Waschmaschine nachgebaut: http://www.meintechblog.de/2014/02/homematic-funk-steckdose-mit-leistungsmessung-dein-trockner-ist-fertig-0-31-eur/
Funktioniert mit deutlichen Änderungen sehr gut und zuverlässig.
Ich möchte aber noch eine Erinnerung ergänzen, falls wir nach einer gewissen Zeit die Wäsche noch immer nicht aus der Maschine geholt haben.

Dazu habe ich einen Watchdog definiert, der mit der Fertigstellung der Maschine startet und nach einer gewissen Zeit prüfen soll, ob wir den Drehschalter an der Maschine noch immer nich auf "off" gedreht haben. Das merkt man daran, dass der Stromverbrauch von 3,4 Watt auf 0,2 Watt fällt.

define WMwatchdog_Reminder watchdog WMBetrieb:standby 00:00:10 {if (ReadingsNum("Keller_WallPlug","power","") < 20) {fhem("set push msg 'Keller' 'Bitte noch die Waschmaschine ausräumen'")}}
attr WMwatchdog_Reminder autoRestart 1
attr WMwatchdog_Reminder room Keller_BG


Die Zeit "00:00:10" und der Verbrauch "< 20" ist aktuell wegen Testzwecken so gesetzt und wird natürlich angepasst.

Im Log wird mir das mit "Unknown command (ReadingsNum("Keller_WallPlug","power",""), try help" kommentiert.

Verstehen kann ich das nicht, weil der Code an anderen Stellen so funktioniert:
#WMBetrieb unter 10kw auf Standby setzen. Der Watchdog prüft dann, ob der Wert länger als 2 Minuten gehalten wird.
define WMBetriebAus notify Keller_WallPlug:power.* {fhem ("set WMBetrieb off") if (ReadingsNum("Keller_WallPlug","power","") <= 10 && Value("WMBetrieb") eq "on")}
attr WMBetriebAus room Keller_BG


Hat jemand eine Idee? Ich habe schon 50 Kombinationen mit ' statt ", ";" und etlichen Leerzeichen versucht.

Otto123

Moin,

es liegt nicht an Deinem ReadingsNum es liegt am watchdog -> https://fhem.de/commandref_DE.html#watchdog
Da fehlt noch ein Ausdruck. Entweder SAME oder ein regExp

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

T3mplate

Zitat von: Otto123 am 22 Januar 2017, 11:48:14
Moin,

es liegt nicht an Deinem ReadingsNum es liegt am watchdog -> https://fhem.de/commandref_DE.html#watchdog
Da fehlt noch ein Ausdruck. Entweder SAME oder ein regExp

Gruß Otto

Super. Vielen Dank für den Hinweis.
Ich habe mehrere Watchdogs laufen und selbst definiert, aber auf diesen Fehler war ich nicht gekommen...

Aufgrund deiner Anmerkung habe ich mich gefragt, warum ich überhaupt ein "if" verwende. Schließlich ist meine Endbedingung für den Watchdog ja "Wenn die Watt-Zahl unter 1 fällt" und nichts anderes.
Wenn ich aber alles richtig verstanden habe, dann wird das regExp Schema von notify verwendet. Da man dort nicht "ReadingsNum("Keller_WallPlug","power","") < 20" oder "Keller_WallPlug:power < 20" nehmen kann, helfen sich alle mit solchen Codes:
notify LaCrosse_2A:temperature:.* { if(ReadingsVal("LaCrosse_2A","temperature","") > 9)
Also quasi genau das was ich auch schon mache.

Wenn es doch kürzer geht, dann würde ich mich über einen Hinweis freuen.
Ansonsten sieht das Endergebnis jetzt so aus:
define WMwatchdog_Reminder watchdog WMBetrieb:standby 00:50:00 WMBetrieb:on {if (ReadingsNum('Keller_WallPlug','power','') > 1) {fhem("set push msg 'Keller' 'Bitte noch die Waschmaschine ausräumen'");;}}

Otto123

Kürzer? Du kannst noch das nachgestellte if aus Deinem notify nehmen, das spart zwei Klammern und ist eine Besonderheit von Perl soweit ich weiß.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

T3mplate

Ja dann verzichte ich auf das kürzer. Ich brauche noch das klassische if-then-Else Schema.

Mein Endausbau sieht jetzt so aus:
define WMwatchdog_Reminder2 watchdog WMBetrieb:standby 03:00:00 WMBetrieb:on {if ((ReadingsNum("Keller_WallPlug","power","") > 1) && ($hour < 23) && ($hour > 7)) {fhem("set push msg 'Keller' 'Die Wäsche ist seit 3 Stunden in der Waschmaschine'");;} else {fhem ("defmod WMReminder2 at 07:30:00 set push msg 'Keller' 'Du hast gestern die Wäsche vergessen.'")} }

Nach 3h wird eine Nachricht gesendet, außer es ist zwischen 23 und 7 Uhr, dann wird erst am Folgetag eine Nachricht versendet. Ich hoffe das werde ich nie brauchen :)