[GELÖST] Auf ausbleibende Events eines Readings reagieren ->readingsWatcher

Begonnen von GunterB, 10 August 2023, 13:10:36

Vorheriges Thema - Nächstes Thema

GunterB

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?

betateilchen

Lies die Doku nochmal genau durch. Dann findest Du auch das Attribut für den restart.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

GunterB

autoRestart macht doch das gleiche wie fhem("trigger $SELF .");

Ich hatte es trotzdem getestet und auch das hat nicht funktioniert.

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

GunterB

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.

Code (WD_Sensor_D327_alive) Auswählen
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-
Code (MQTT2_zigbee_0x12345678) Auswählen
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


betateilchen

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
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

GunterB

Danke! Passt super!

Code (myRS_timeout) Auswählen
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:
Code (myRS) Auswählen
defmod myRS readingsWatcher global
attr myRS interval 60
attr myRS readingActivity none

Zigbee Device:
Code (MQTT2_zigbee_0x12345678) Auswählen
attr MQTT2_zigbee_0x12345678 readingsWatcher 7200,, linkquality