Frage zu Watchdog

Begonnen von rz259, 06 März 2013, 21:44:52

Vorheriges Thema - Nächstes Thema

rz259

Hallo,

ich möchte meine Garage überwachen, ob das Garagentor auch geschlossen ist. Wenn das Tor länger als 15 Minuten offen ist, dann soll eine Mail/SMS verschickt werden. Das funktioniert auch schon soweit, allerdings wird der Watchdog nur einmal ausgeführt und dann nicht mehr. Ich will aber, dass der Watchdog wieder zurückgesetzt wird.

Mein Konstrukt sieht so aus:

define WatchdogGarage watchdog Reedkontakt1:open 00:15:00 Reedkontakt1:closed {\
  FB_mail("xxx", "Garagentor offen", "Garagentor ist bereits seit 15 Minuten offen");;\
  "trigger WatchdogGarage ." \
}

Mit dem trigger-Kommando will ich erreichen, dass der Watchdog wieder reaktiviert wird, aber er bleibt auf "triggered".
Was mache ich falsch?

Vielen Dank für eure Hilfe,

Rudi

ollir

Hi Rudi,

bei mir funktioniert am Ende dieses: (hier aus dem Forum)
Versuch mal anstatt: "trigger WatchdogGarage ."

setstate WatchdogGarage defined

VG
Olaf

rz259

Hi Olaf,

bei mir geht's leider  nicht. Mein Code sieht jetzt folgendermaßen aus:

define WatchdogGarage watchdog Reedkontakt1:open 00:15:00 Reedkontakt1:closed {\
  FB_mail("xxx", "Garagentor offen", "Garagentor ist bereits seit 15 Minuten offen");;\
  "setstate WatchdogGarage defined";; \
}

Irgendwas mache ich vermutlich verkehrt ... bloß was?


Rudi

ollir

ich vermute, das die Syntax falsch ist.

FB_mail("xxx", "Garagentor offen", "Garagentor ist bereits seit 15 Minuten offen");;\
"setstate WatchdogGarage defined";; \
}

FB_mail("xxx", "Garagentor offen", "Garagentor ist bereits seit 15 Minuten offen")};;\
setstate WatchdogGarage defined

VG
Olaf

MisterEltako

Hi!

in {...} steht doch Perlcode, also muss ein FHEM-Kommando auch "in fhem(....):

define WatchdogGarage watchdog Reedkontakt1:open 00:15:00 Reedkontakt1:closed {\
           FB_mail("xxx", "Garagentor offen", "Garagentor ist bereits seit 15 Minuten offen");;\
          fhem("setstate WatchdogGarage defined");;\
}

Ob das watchdog so richtig ist, kann ich nicht sagen, da ich es nicht verwende. Der o.g. Syntax müsste so aber richtig sein.

MfG, MisterEltako
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

rudolfkoenig

1. Wenn man Perl {} verwendet, dann muessen fhem Kommandos mit der Funktion fhem("") ausgefuehrt werden.
2. Konstrukte der Sorte {}; xxx funktionieren nicht, man muss alles in einem {} stecken.
3. trigger watchdog . resettet den Trigger, dieser wartet also im obigen Beispiel also wieder auf dem Open.
4. Ich finde die watchdog Implementation zu kompliziert, ich will es so Vereinfachen:
- regexp1 aktiviert den watchdog
- wenn innerhalb der angegebener Zeit kein regexp2 eintrifft, wird es ausgeloest.
- wenn regexp2 eintrifft (egal ob ausgeloest oder nicht) wird erneut auf regexp1 gewartet.
"trigger .", SAME und "regexp1WontReactivate" faellt weg.

Beispiele:
# FHT80b ueberwachung
define wd1 watchdog myFht 00:30 myFht set myFht date
# Mail bei Fenster Offen
define wd2 watchdog window:open 00:30 window:closed "mail_me window-open"
# FIT
define wd3 .* 30:00 myFit "alarm_fit.sh"


Ich vermute, dass ich irgendwelche Anwendungsfaelle uebersehe. Koennt Ihr bitte auch darueber nachdenken?

rz259

Hallo MisterEltako,

vielen Dank für den Stups in die richtige Richtung - genau das war es. Das hatte ich zwar schon gelesen, aber natürlich wieder nicht dran gedacht;-( Jetzt funktioniert der Watchdog perfekt.

Danke,

Rudi

snx

Zitat von: rudolfkoenig am 07 März 2013, 12:00:00
1. Wenn man Perl {} verwendet, dann muessen fhem Kommandos mit der Funktion fhem("") ausgefuehrt werden.
2. Konstrukte der Sorte {}; xxx funktionieren nicht, man muss alles in einem {} stecken.
3. trigger watchdog . resettet den Trigger, dieser wartet also im obigen Beispiel also wieder auf dem Open.
4. Ich finde die watchdog Implementation zu kompliziert, ich will es so Vereinfachen:
- regexp1 aktiviert den watchdog
- wenn innerhalb der angegebener Zeit kein regexp2 eintrifft, wird es ausgeloest.
- wenn regexp2 eintrifft (egal ob ausgeloest oder nicht) wird erneut auf regexp1 gewartet.
"trigger .", SAME und "regexp1WontReactivate" faellt weg.

Beispiele:
# FHT80b ueberwachung
define wd1 watchdog myFht 00:30 myFht set myFht date
# Mail bei Fenster Offen
define wd2 watchdog window:open 00:30 window:closed "mail_me window-open"
# FIT
define wd3 .* 30:00 myFit "alarm_fit.sh"


Ich vermute, dass ich irgendwelche Anwendungsfaelle uebersehe. Koennt Ihr bitte auch darueber nachdenken?

Ich fände die angesprochene Vereinfachung eine enorme Hilfe.
Man würde Code sparen und  Fehlepotenzial vermeiden, ich stoße eigentlich bei jedem Watchdog wieder drüber ;)
Und mir is noch kein Anwendungsfall unter gekommen, bei dem der Watchdog nur einmal "losgelassen" werden soll und danach die ganze Zeit "in seiner Hütte sitzt"...

Rince

Oh, das wäre wirklich enorm praktisch.

Mir fällt auch nix ein, wo man einen watchdog nur 1x bräuchte.


Aber ich möchte in diesem Fall zu bedenken geben:
Wenn der Watchdog umgestellt wird, wird sich dessen Syntax ändern (deshalb machst du es ja ;)
Entweder du behältst Abwärtskompatibilität bei, oder alle Watchdogs müssen angepasst werden
Alle im Forum existierenden Watchdog Threads stimmen nicht mehr (also die jeweiligen Lösungen mit . etc)

Daher meine Vorschlag:
Wir sollten einen Forumsbereich einrichten:
"Geändert: nicht mehr funktionierende Lösungen", in welchen diese Threads verschoben werden.

Selbiger Bereich sollte von der Forumssuche idealerweise ausgeschlossen werden.
Mir fallen nach etwas Überlegung bestimmt noch mehr Beispiele ein, außer dem Watchdog (wir hatten vor 1 Jahr doch schon mal so eine Diskussion, weiß nur nicht mehr weshalb)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

der-Lolo

Meiner bescheidenen Meinung nach könnte man auf den Watchdog komplett verzichten und stattdessen einen Hinweis auf das DOIF verbreiten. Bestehende watchdogs würden weiterhin funktionieren, neue werden mithilfe des DOIFs übersichtlich und verständlich gestaltet.

Damian

Zitat von: der-Lolo am 16 November 2014, 09:06:51
Meiner bescheidenen Meinung nach könnte man auf den Watchdog komplett verzichten und stattdessen einen Hinweis auf das DOIF verbreiten. Bestehende watchdogs würden weiterhin funktionieren, neue werden mithilfe des DOIFs übersichtlich und verständlich gestaltet.

zumal in der kommenden Version von DOIF auch der andere Fall abgedeckt sein wird: "tue etwas, wenn eine bestimmte Zeit etwas nicht passiert"  :)

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ryker

#11
Ich habe auch noch eine Frage zu einem watchdog.

Also ich habe in meinem NetAtmo-Innendevice zwei Readings "CO2Warning" und "CO2Alert".
Diese stehen jeweils entweder auf on oder off.
Im EventManager sehe ich auhc, dass Events generiert werden, wenn sich dieser Wert dort ändert.
Darauf habe ich nun jeweils einen WatchDog erstellt. z.b. wie folgt:

defmod Netatmo_Msg_CO2_Warning watchdog netatmo_Dxx_xx_xx_xx_xx_xx:CO2Warning:on 00:05:00 \
netatmo_Dxx_xx_xx_xx_xx_xx:CO2Warning:off {\
  my $co2=ReadingsVal("netatmo_Dxx_xx_xx_xx_xx_xx","co2","");;\
  Telegram("😨 <b>CO2-Warnung</b>\n","Aktueller CO2-Gehalt im Wohnzimmer: $co2 ppm \nEs sollte gelüftet werden!")\
}
attr Netatmo_Msg_CO2_Warning autoRestart 1

Das regex zum "hören" auf das Event muss so stimmen. Ich hab das anderswo auch schon so im Einsatz. Nur eben dort direkt auf state (also device:value) Also muss doch auch ein Device:Reading:value funktionieren, oder liege ich da falsch ?
Der Watchdog ist auch activ und steht auf defined. Leider reagiert der Watchdog überhaupt gar nicht auf das Event.
Woran kann das liegen ?








frank

commandref:
The syntax for <regexp1> and <regexp2> is the same as the regexp for notify.
zwischen "readingname:" und "value" existiert im event immer ein leerzeichen.

deshalb muss dieses leerzeichen auch in der regex auftauchen.
also jeweils noch ein punkt (ein beliebiges zeichen) vor "on" und "off"

Zitatdefmod Netatmo_Msg_CO2_Warning watchdog netatmo_Dxx_xx_xx_xx_xx_xx:CO2Warning:.on 00:05:00 \
netatmo_Dxx_xx_xx_xx_xx_xx:CO2Warning:.off {\
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Ryker

Mir war das Leerzeichen schon im EventManager zwar aufgefallen, aber hab mir nichts weiter dabei gedacht.
OK, danke werde ich versuchen mit dem Punkt.

Ryker

#14
Habs mit dem Punkt probiert, geht aber leider auch nicht. Der Watchdog wird weiterhin nicht getriggert.

Jetzt hab ich alles umgebaut und setze über ein Notify den Status in Form von "OK", "Warning" oder "Alert" an einem Dummy.
Der Watchdog wird jetzt durch den Dummy getriggert, aber nur, wenn man dort den Punkt nicht mit angibt.

defmod Netatmo_Msg_CO2_Warning watchdog NetAtmo_CO2_State:Warning 00:05:00 \
NetAtmo_CO2_State:OK {\
  my $co2=ReadingsVal("netatmo_Dxx_xx_xx_xx_xx_xx","co2","");;\
  Telegram("😨 <b>CO2-Warnung</b>\n","Aktueller CO2-Gehalt im Wohnzimmer: $co2 ppm \nEs sollte gelüftet werden!")\
}
attr Netatmo_Msg_CO2_Warning autoRestart 1

Ich sehe da nicht mehr durch. Es wird zwar nun getriggert und nach 5Min schickt er dann die Telegram-Meldung raus.
Wenn ich aber innerhalb von 5Min wieder das Dummy "NetAtmo_CO2_State" auf OK setze, dann bricht er aber den Watchdog nicht ab, sondern die Meldung kommt trotzdem.
Hab hier aber auch schon probiert  beim regexp2 den Punkt mit anzugeben, also "NetAtmo_CO2_State:.OK" -hilft aber auch nicht.

Ich weiß nicht was da nun wieder falsch ist. In anderen Watchdogs bei mir funktioniert das aber tadellos und die sehen sehr ähnlich aus.
Ich stehe gerade total auf dem Schlauch.

TomLee

Eventuell, habs nicht überprüft, liegt es an dem Zeilenumbruch den Du nach <timespec> vornimmst ?

Ryker

#16
Danke. Es war wirklich der Zeilenumbruch. Nun klappt es.