Wie kann ich Meldungen generieren, wenn Events für ein bestimmtes Reading ausbleiben?
defmod WD_Sensor_D327_alive watchdog MQTT2_zigbee_0x12345678:linkquality.* 00:00:10 SAME {\
my $message = "$SELF\n";;\
$message .= "$DEV, $NAME, $EVENT, $TYPE";;\
fhem("set myTelegramBot _msg @#haus $message");;\
fhem("trigger $SELF .");;\
}
Das hier funktioniert einmalig, aber auch erst dann, wenn bereits ein Event für das Reading erkannt wurde.
Danach triggert es sich nicht selber wieder. Und es kommt keine weitere Meldung.
Erst nach einem
setreading MQTT2_zigbee_0x12345678 linkquality -10
läuft der Watchdog los.
Nach verstreichen der 10 Sekunden, wird der COde-Teil ausgeführt.
Danach.... nichts mehr :(
Wie kann ich erreichen, dass der Watchdog von selber los läuft, und wie kann ich erreichen, dass der Watchdog mir, bei ausbleibenden Events, immer wieder ausgeführt wird?
Lies die Doku nochmal genau durch. Dann findest Du auch das Attribut für den restart.
autoRestart macht doch das gleiche wie fhem("trigger $SELF .");
Ich hatte es trotzdem getestet und auch das hat nicht funktioniert.
Zitat von: GunterB am 10 August 2023, 14:22:14autoRestart macht doch das gleiche wie fhem("trigger $SELF .");
Das sehe ich völlig anders. Aber meine watchdog devices funktionieren ja auch.
Zitat von: GunterB am 10 August 2023, 13:10:36Wie kann ich erreichen, dass der Watchdog von selber los läuft, und wie kann ich erreichen, dass der Watchdog mir, bei ausbleibenden Events, immer wieder ausgeführt wird?
Zur ersten Satzhälfte: Hast Du in dem device, das die events erzeugt, irgendwelche event-on-quatsch Attribute gesetzt?
Zur zweiten Hälfte: attribut autoRestart. Ob Du es glaubst oder nicht.
Zum autoRestart, das sagt die Hilfe:
Wenn dieses Attribut gesetzt ist, wird der Watchdog nach dem er getriggert wurde, automatisch wieder in den Zustand defined gesetzt (Wartet also wieder auf Aktivierung durch regexp1)
Aber regexp1 wird ja garnicht getriggert, weil keine Events kommen. Das ist ein Reichweiten Problem, ich möchte aber informiert werden wenn Meldungen ausbleiben.
Im nächsten Schritt möchte ich die Intervalle über den Code anpassen.
Eigentlich müsste doch der WD direkt nach dem definieren los laufen?
Tut er aber nicht.
In trigger WD_Sensor_D327_alive . hilft weiter und ich sehe dann ein : Next: 11:59:33
Nach den 10 Sekunden kommt die Meldung, aber danach keine mehr.
Es sollte doch solange jede 10 Sekunden eine Meldung kommen, bis wieder "reglemäßige" Events empfangen werden.
define WD_Sensor_D327_alive watchdog MQTT2_zigbee_0x12345678:linkquality.* 00:00:10 SAME {\
my $message = "$SELF\n";;\
$message .= "$DEV, $NAME, $EVENT, $TYPE";;\
fhem("set myTelegramBot _msg @#Haus $message");;\
}
attr WD_Sensor_D327_alive DbLogExclude .*
attr WD_Sensor_D327_alive autoRestart 1
attr WD_Sensor_D327_alive verbose 5
# CMD {
#my $message = "$SELF\n";
#$message .= "$DEV, $NAME, $EVENT, $TYPE";
#fhem("set myTelegramBot _msg @#Haus $message");
#}
# DEF MQTT2_zigbee_0x12345678:linkquality.* 00:00:10 SAME {
#my $message = "$SELF\n";
#$message .= "$DEV, $NAME, $EVENT, $TYPE";
#fhem("set myTelegramBot _msg @#Haus $message");
#}
# FUUID ********************************************
# NAME WD_Sensor_D327_alive
# NOTIFYDEV MQTT2_zigbee_0x12345678,WD_Sensor_D327_alive
# NR 262
# NTFY_ORDER 50-WD_Sensor_D327_alive
# RE1 MQTT2_zigbee_0x12345678:linkquality.*
# RE2 MQTT2_zigbee_0x12345678:linkquality.*
# STATE defined
# TO 10
# TYPE watchdog
# eventCount 19
# READINGS:
# 2023-08-10 13:04:37 Activated activated
# 2023-08-10 13:05:37 Reset reset
# 2023-08-10 13:05:37 Triggered triggered
# 2023-08-10 12:47:10 state defined
# 2023-08-10 13:04:37 triggeredByDev MQTT2_zigbee_0x12345678
# 2023-08-10 13:04:37 triggeredByEvent linkquality: -10
#
setstate WD_Sensor_D327_alive defined
setstate WD_Sensor_D327_alive 2023-08-10 13:04:37 Activated activated
setstate WD_Sensor_D327_alive 2023-08-10 13:05:37 Reset reset
setstate WD_Sensor_D327_alive 2023-08-10 13:05:37 Triggered triggered
setstate WD_Sensor_D327_alive 2023-08-10 12:47:10 state defined
setstate WD_Sensor_D327_alive 2023-08-10 13:04:37 triggeredByDev MQTT2_zigbee_0x12345678
setstate WD_Sensor_D327_alive 2023-08-10 13:04:37 triggeredByEvent linkquality: -10
Kein event-on-
define MQTT2_zigbee_0x12345678 MQTT2_DEVICE zigbee_0x12345678
attr MQTT2_zigbee_0x12345678 alias MQTT2_zigbee_D327 (Öltank)
attr MQTT2_zigbee_0x12345678 devicetopic zigbee2mqtt/0x12345678
attr MQTT2_zigbee_0x12345678 jsonMap water_leak:state
attr MQTT2_zigbee_0x12345678 model zigbee2mqtt_Water_Leak_Sensor
attr MQTT2_zigbee_0x12345678 readingList $DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr MQTT2_zigbee_0x12345678 room 7. UG Oelltank,MQTT2_DEVICE
attr MQTT2_zigbee_0x12345678 stateFormat Leak: state
# CID zigbee_0x12345678
# DEF zigbee_0x12345678
# FUUID 64ac525a-f33f-4fdf-0926-196cf3d8edffdf96
# IODev myMQTT2
# LASTInputDev myMQTT2
# MSGCNT 1
# NAME MQTT2_zigbee_0x12345678
# NR 245
# STATE Leak: false
# TYPE MQTT2_DEVICE
# eventCount 15
# myMQTT2_CONN myMQTT2_172.17.0.2_33118
# myMQTT2_MSGCNT 1
# myMQTT2_TIME 2023-08-06 12:35:32
# JSONMAP:
# water_leak state
# READINGS:
# 2023-08-06 12:35:30 IODev myMQTT2
# 2023-07-10 20:47:54 associatedWith MQTT2_mqttjs_c6b7d2d9
# 2023-07-10 21:20:17 attrTemplateVersion 20200904
# 2023-08-10 12:52:28 battery -11
# 2023-08-06 12:35:32 battery_low false
# 2023-08-10 13:04:37 linkquality -10
# 2023-08-06 12:35:32 state false
# 2023-08-06 12:35:32 tamper false
#
setstate MQTT2_zigbee_0x12345678 Leak: false
setstate MQTT2_zigbee_0x12345678 2023-08-06 12:35:30 IODev myMQTT2
setstate MQTT2_zigbee_0x12345678 2023-07-10 20:47:54 associatedWith MQTT2_mqttjs_c6b7d2d9
setstate MQTT2_zigbee_0x12345678 2023-07-10 21:20:17 attrTemplateVersion 20200904
setstate MQTT2_zigbee_0x12345678 2023-08-10 12:52:28 battery -11
setstate MQTT2_zigbee_0x12345678 2023-08-06 12:35:32 battery_low false
setstate MQTT2_zigbee_0x12345678 2023-08-10 13:04:37 linkquality -10
setstate MQTT2_zigbee_0x12345678 2023-08-06 12:35:32 state false
setstate MQTT2_zigbee_0x12345678 2023-08-06 12:35:32 tamper false
Jetzt habe ich zumindest verstanden, was Du überhaupt bezweckst. Du willst eigentlich den ersten event überwachen. Dafür ist watchdog der falsche Ansatz.
Schau mal, ob Dir das hier weiterhilft: https://commandref.fhem.de/#readingsWatcher
Danke! Passt super!
defmod myRS_timeout notify myRS:deadDevs:.* {\
my $dead = ReadingsNum($NAME,"dead",-1);;\
\
if ( $dead != 0 ) {\
my $message = "#$SELF\n";;\
$message .= "#Zigbee #dead ${dead}\n";;\
my @deadDevs = split ',', ReadingsVal($NAME,"deadDevs","");;\
\
foreach(@deadDevs){\
my $myDef = "$_";;\
my $alias = AttrVal($myDef,"alias","");;\
my $readingsWatcher = AttrVal($myDef,"readingsWatcher","");;\
my $myDef_rdsage = ReadingsAge($myDef,"linkquality",-1);;\
my $myDef_rdsage_fmt = $myDef_rdsage;;\
\
if ($alias eq "") {\
$message .= "<b><u>${myDef}</u></b>\n";;\
} else {\
$message .= "<b><u>${alias}</u></b>\n";;\
}\
\
## 7200s = 2h\
my $newRDSW = "7200,, linkquality";;\
if ($newRDSW ne $readingsWatcher) {\
fhem("attr $myDef readingsWatcher $newRDSW");;\
}\
\
$message .= "${myDef_rdsage_fmt}\n";;\
my $myDef_state = InternalVal($myDef,"STATE","");;\
$message .= "${myDef_state}\n";;\
}\
\
fhem("set myTelegramBot _msg $message");;\
}\
}
attr myRS_timeout disabledAfterTrigger 600
Globaler readingsWatcher:
defmod myRS readingsWatcher global
attr myRS interval 60
attr myRS readingActivity none
Zigbee Device:
attr MQTT2_zigbee_0x12345678 readingsWatcher 7200,, linkquality