Neuigkeiten:

Am Sonntag den 8.12.2024 kann es ab ca. 8:00 Uhr zu kurzzeitigen Einschränkungen / Ausfällen bei den Diensten des FHEM Vereines kommen.
Die Server müssen mal gewartet und dabei neu gestartet werden ;)

Hauptmenü

👀 Inaktive Geräte detektieren, Geräteausfall erkennen, last_seen, DOIF

Begonnen von Torxgewinde, 06 Juli 2024, 16:46:10

Vorheriges Thema - Nächstes Thema

Torxgewinde

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.

Icinger

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
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Benni

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#