FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: Torxgewinde am 06 Juli 2024, 16:46:10

Titel: 👀 Inaktive Geräte detektieren, Geräteausfall erkennen, last_seen, DOIF
Beitrag von: Torxgewinde am 06 Juli 2024, 16:46:10
Ich möchte euch eine einfache Möglichkeit vorstellen, um aufzulisten, welche Geräte länger nicht mehr aktiv waren. Es gibt sicherlich noch viele andere Methoden, diese könnt ihr gerne als Antwort beisteuern.

Bei Zigbee2MQTT gibt es eine Variable namens "last_seen", die ideal dafür geeignet ist, inaktive Geräte herauszufiltern. Falls ihr allerdings ein anderes FHEM-Device ohne solch ein "last_seen"-Reading habt, könnt ihr es recht einfach als Userreading hinzufügen. Je nach Gerät kann das Userreading ohne Filter aktualisiert werden, sodass es auf jede Änderung reagiert und diese widerspiegelt. Einige Geräte haben jedoch auch etwas wie "Uptime" oder ähnliche Variablen, die ebenfalls anzeigen, dass das Gerät noch aktiv ist. Um diese dann einheitlich herausfiltern zu können, bietet es sich an, auch hier ein "last_seen"-Reading hinzuzufügen.

Hier ist ein minimales DOIF im Perl-Modus, das jede Minute alle Geräte auswertet und im Status auflistet, bei welchen Geräten "last_seen" älter als 24 Stunden ist:
defmod OutdatedLastSeen.doif DOIF # Block to be executed at startup and every N seconds\
init {[+00:01:00];;\
    my @toIgnore = ("Geraet_1_das_ignoriert_werden_soll",\
                    "Device_2_to_ignore");;\
    \
    my $l = [?@".*":last_seen:($_/1000)+60*60*24 < time(),"-"];;\
    \
    my $result = join ',',\
                 grep { my $word = $_;; not grep { $word eq $_ } @toIgnore }\
                 split ',', $l;;\
    $result = '-' if $result eq '';;\
    \
    set_State($result);;\
}
attr OutdatedLastSeen.doif alias Last Seen
}

Sofern ein FHEM-Device nicht bereits ein "last_seen" Reading hat, kann man dies als Userreading hinzufügen. Hier als Beispiel ein Thermometer:
attr Thermometer.Keller.device userReadings last_seen {\
    return int(time() * 1000);;\
}

Sofern ein Gerät eine passendere Variable hat, wie zum Beispiel bei einem Tasmota-Device ein Reading 'Uptime', kann man das Userreading darauf aktualisieren lassen.
attr shellystecker02 userReadings last_seen:Uptime:.* {\
    return int(time() * 1000);;\
}

Wenn man einmal die Liste der lange inaktiven Geräte in dem DOIF-Device hat, kann man sich bei Änderungen eine Nachricht auf das Handy schicken um das mal genauer zu prüfen. In das Perl-Array "@toIgnore" trägt man die Geräte ein, die zwar ein "last_seen" Reading haben, von denen man aber keine weitere Info erhalten möchte.
Titel: Aw: 👀 Inaktive Geräte detektieren, Geräteausfall erkennen, last_seen, DOIF
Beitrag von: Icinger am 07 Juli 2024, 19:49:57
Dafür gibts fix und fertig das Modul ReadingsWatcher (https://fhem.de/commandref_DE.html#readingsWatcher

Hierbei kannst du sogar für verschiedene Readings desselben Devices verschiedene Timeouts angeben.

lg, Stefan
Titel: Aw: 👀 Inaktive Geräte detektieren, Geräteausfall erkennen, last_seen, DOIF
Beitrag von: Benni am 07 Juli 2024, 22:45:06
Ich hatte da auch mal was ohne zusätzliche Module, lediglich unter Verwendung eines at gebastelt  ;) 

https://forum.fhem.de/index.php?topic=131019.msg1252195#msg1252195

gb#