Suche Möglichkeit herauszufinden, wann ein Device aktualisiert wurde

Begonnen von betonmoewe, 04 Oktober 2016, 13:50:11

Vorheriges Thema - Nächstes Thema

betonmoewe

Hallo Leute,

schone wieder ich ...

Ich habe mittlerweile einige mySensors Devices im Einsatz. Leider Habe ich derzeit 1 Device, welches alle paar Tage mal ausfällt (ich denke, schlechtes Sendemodul). Darauf hin ist mir die Idee gekommen, einfach zu überwachen, wann bei einem Device zum letzten mal ein Reading geändert wurde (z.B. mittels ReadingAge) und darauf hinzuweisen, wenn dies bei einem Device zu lange her ist (da kein activity reading vorhanden). Nun wäre es jedoch mühsam, je nach Device Art alle Readings einzeln zu überprüfen.
Nun die Frage: gibt es eigentlich eine Abfrage die ermittelt, wann sich irgendein Reading geändert hat ohne das Reading genauer zu spezifizieren? Oder aber: gibt es eine Möglichkeit, eine Schleife über alle Readings eines Devices zu definieren(um z.B,. den kleinsten ReadingAge Wert zu ermitteln), ohne dass den ganauen Namen der einzelnen Readings genau angeben muss ???? Dies würde mir sehr helfen, um ein Activity userreading zu bauen.

Viele Grüße

Die Betonmöwe

CoolTux

devspec2array damit kannst eine schleife über alle Devices eines bestimmten Types oder mit einer anderen bestimmten Eigenschaft machen. Aber das abzufragende Reading sollte schon bekannt sein. Zur Not halt state sofern es immer aktuallisiert wird.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

christiang

Hab das über ein userreading timestamp gelöst, der bei jedem event im mysensors device neu geschrieben wird.

attr <device> userReadings  timestamp:.* { time() }

Damit wird bei jedem event ein utc timestamp aktualisiert. Kannst natürlich auch mit anderen Formaten machen

betonmoewe

das mit dem Reading ist halt deshalb so unbestimmt, da es bei dem einen Sensor mal der BAtteriesatus ist, der als letztes übertragen wurde (alle anderen Werte sind gleich geblieben), mal ist es die Temperatur, mal ob der Boden feucht oder trocken ist. Auch gibt es bei mir Sensoren, die bis zu 6 Werte übermitteln. Schön wäre es. wenn ich einfach den Timestamp der letzten Änderung (egal ob Batterie oder ein anderes Reading) ermitteln könnte um eine Meldung zu schalten, wenn > X Strunden seit dem letzten Wechsel (mit at alle 10 Minuten überprüfen lassen). Mangels Idee habe ich jetzt einen Zwischenschritt gemacht (da alle wichtigen Sensoren mqtt Devices sind): ich habe eine readingsGroup über alle transmission-states gebaut (da habe ich dann einen Zeitstempel ohne dass das eigentliche Reading genannt werden muss). Jetzt muss ich diesen TimeStamp nur noch auswerten können (in readingsGroup geht ja nur VALUE so weit ich weiss).

Die Betonmoewe

betonmoewe

@christiang
grad überschnitten: das wäre natürlich noch besser ...

betonmoewe

@christiang:
ich habe jetzt bei den zu überwachenden Sensoren Dein userReading eingefügt und eine readingsGroup gebaut (inkl. Umsetzung nach Farbe > 48 Std = absent, > 24 Std = rot etc. Sieht erst einmal gut aus. Jetzt muss ich mir nur noch eine Funktion zur Alarmierung überlegen.

Danke nochmals für Deinen Tipp!

Die Betonmoewe

gloob

Ich habe für jedes Device einen Watchdog angelegt:

define Watchdog_MySensors_195 watchdog MYSENSOR_195 01:10:00 SAME set pushmsg message 'MySensors 195 ist tot!'
attr Watchdog_MySensors_195 autoRestart 1
attr Watchdog_MySensors_195 room MySensors


Hier mit lasse ich mir immer eine Push Benachrichtigung schicken wenn ein Sensor aussteigt

So bekomme ich eine Push Benachrichtigung wenn keine Message mehr nach 1 Stunde und 10 Minuten kommt.
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

Hauswart

Zitat von: betonmoewe am 04 Oktober 2016, 17:23:15
@christiang:
ich habe jetzt bei den zu überwachenden Sensoren Dein userReading eingefügt und eine readingsGroup gebaut (inkl. Umsetzung nach Farbe > 48 Std = absent, > 24 Std = rot etc. Sieht erst einmal gut aus. Jetzt muss ich mir nur noch eine Funktion zur Alarmierung überlegen.

Danke nochmals für Deinen Tipp!

Die Betonmoewe
Kannst du uns die ReadingsGroup zur Verfügung stellen?
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

Ma_Bo

Ich habe mir für wichtige Geräte jeweils ein DOIF zur Überwachung angelegt.

Siehe commandref:

ZitatZurücksetzen des Waittimers für das gleiche Kommando   back

Im Gegensatz zu do always wird ein Waittimer mit dem Attribut do resetwait auch dann zurückgesetzt, wenn die gleiche Bedingung wiederholt wahr wird.
Damit können Ereignisse ausgelöst werden, wenn etwas innerhalb einer Zeitspanne nicht passiert.
Das Attribut do resetwait impliziert eine beliebige Wiederholung wie do always. Diese lässt sich allerdings mit dem Attribut repeatsame einschränken s. u.

Anwendungsbeispiel: Meldung beim Ausbleiben eines Events

define di_push DOIF ([Tempsensor])(set pushmsg "sensor failed again")
attr di_push wait 1800
attr di_push do resetwait
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

Omega

Ich mache das auch mit DOIF. Zusätzlich setze ich für das Gateway noch ein connect ab

set MySensorsGateway_3 connect

In den meisten Fällen reicht das aus, um das Gateway wieder mitspielen zu lassen.
NUC6i3SYH (FHEM 5.8 in VM)
Homematic: HMLAN, HMUSB, HM-Sec-SD, HM-CC-RT-DN, HM-TC-IT, ... + diverse weitere
LaCrosseGateway, ESPEasy
ZWave

betonmoewe

ich habe jetzt folgende readingsGroup s definiert:
define MYSENSOR_lastReadingsGroup readingsGroup .*:timestamp
attr MYSENSOR_lastReadingsGroup valueFormat {return "48" if( time() - $VALUE > 172800 );;;; return "24" if( time() - $VALUE > 86400 );;;; return "12" if( time() - $VALUE > 43200 );;;; return "6" if( time() - $VALUE > 21600 );;;; return "0"}
attr MYSENSOR_lastReadingsGroup valueIcon {'timestamp.48' => 'unknown@red','timestamp.24' => 'general_ok@red','timestamp.12' => 'general_ok@orange','timestamp.6' => 'general_ok@yellow','timestamp.0'  => 'general_ok@green'}
define MYSENSOR_BatteryLevelGroup readingsGroup .*:batterylevel
attr MYSENSOR_BatteryLevelGroup valueFormat {return "0" if( $VALUE < 1 );;;; return "25" if( $VALUE < 25 );;;; return "50" if( $VALUE < 50 );;;; return "75" if( $VALUE < 75 );;;; return "100"}
attr MYSENSOR_BatteryLevelGroup valueIcon {'batterylevel.0' => 'measure_battery_0@red','batterylevel.25' => 'measure_battery_25@red','batterylevel.50' => 'measure_battery_50@orange','batterylevel.75' => 'measure_battery_75@green','batterylevel.100'  => 'measure_battery_100@green'}


damit habe ich zum einen alle Batterie Readings und zum anderen die timestamp.Readings im Überbick. Die Alarmierung kommt noch...

Grüße

die Betonmöwe