Hallo,
folgendes DOIF Statement versuche ich einzusetzen, um zu erkennen, wenn ein Sensor länger als 30 min off ist.
Ich habe 7 solcher Sensoren, die alle ein Reading "temperature3" haben.
Wenn mein Gateway offline ist, und somit auch alle 7 Sensoren für fhem offline sind, erhalte ich aber immer nur eine Meldung, statt 7.
Leider blicke ich mit der Device und Reading Angabe beim DOIF noch nicht ganz durch.
define di_devicewarning30 DOIF ([":temperature3"]) \
(\
({ SendStdMsg("FHEM - Device-Offline Warning from device: $DEVICE", "Attention! \n$DEVICE is offline longer than 30 min");;;;\
my $counter=ReadingsVal("DeviceOfflineWarning30","count",0);;;;\
$counter = $counter+1;;;;\
fhem("setreading DeviceOfflineWarning30 count $counter");;;;}),\
(setreading DeviceOfflineWarning30 $DEVICE off)\
)\
attr di_devicewarning30 do resetwait
attr di_devicewarning30 notexist "novalue"
attr di_devicewarning30 room FhemMonitor
attr di_devicewarning30 wait 1800
Hi,
bzgl. deinem DOIF Problem kann ich dir leider nicht helfen...
(wenn es aber prinzipiell funktioniert, weil 1x löst es ja aus, dann könnte es evtl. auch an der "Parametrierung" liegen. Also so Attribute wie do Always etc. / aber wie gesagt DOIF ist nicht so meine Baustelle)
Aber es gibt ein Modul zumindest einen Thread über ein Modul was so etwas (ähnliches) macht wie du erreichen willst:
https://forum.fhem.de/index.php/topic,8821.0.html (https://forum.fhem.de/index.php/topic,8821.0.html)
Gruß, Joachim
Dein DOIF triggert auf ein Event.
[":temperature3"]
Nach dem Event rennt der Timer los. Kommt innerhalb der 1800 Sekunden kein neues trigger-Event, wird der Befehl ausgelöst. Thats all.
Der Befehl kann also maximal alle 1800 Sekunden wiederholt ausgeführt werden...
Also ich würde das aus meiner bescheidenen Erfahrung so deuten:
du bekommst Events:
TempsensorA:temperature3 21°
TempsensorB:temperature3 21°
TempsensorC:temperature3 21°
Jetzt kommt dein DOIF dazu:
DOIF: Warte 1800 Sekunden
Nach 100 Sekunden:
DOIF: Warte 1700 Sekunden
TempsensorA:temperature3 21°
DOIF: Warte 1800 Sekunden (resetwait)
Nach 100 Sekunden:
DOIF: Warte 1700 Sekunden
TempsensorB:temperature3 21°
DOIF: Warte 1800 Sekunden (resetwait)
TempsensorC:temperature3 21°
DOIF: Warte 1800 Sekunden (resetwait)
Bedeutet: Solange irgendeiner der Temperatursensoren (nein, um korrekt zu sein, überhaupt irgendein beliebiges Device in Fhem) ein ":temperature3"-Event auslöst, wird der Timer zurückgesetzt und fängt von vorne an zu Zählen.
Soweit isses dir sicher klar, aber darin liegt eigentlich auch schon die Lösung:
Wenn jetzt alle Temperatursensoren versagen, bis auf einen einzigen, und der liefert alle 60 Sekunden einen Wert, macht dein DOIF - gar nichts (auch nicht korrekt, es resettet natürlich den Timer. Aber es sendet keine Nachricht)
Wenn jetzt gar kein Event mehr kommt, läuft der Timer ab, und das DOIF führt das CMD (1) aus. Ob in dem Device jetzt das letzte, welches gesendet hat, drinsteht, oder vielleicht gar keines, kann ich dir so offline (bin nicht zuhause) nicht sagen.
Auf jeden Fall wirst du so erstmal nicht herausfinden, welches Device nicht gesendet hat. (und auch keine 7 Meldungen erhalten).
Lösungsansätze (Ideen) von mir:
1. 7 DOIF's machen. Funktion vor Schönheit :P
2. ein DOIF machen, und für jedes Device einen DOELSEIF-Zweig mit eigenem Timer und entsprechend angepasster Meldung
3. Ich muss gleich mal suchen, man kann irgendwo auslesen, wieviel Zeit seit dem letzten Update eines Readings vergangen ist (oder so ähnlich). Das könnte man dann regelmäßig prüfen, und dementsprechend Informationen ausgeben.
Hier:
http://fhem.de/commandref_DE.html#DOIF_Zeitspanne_eines_Readings_seit_der_letzten_Aenderung
Vielleicht hilft dir das weiter..
Grüße
Stephan
Zitat von: abc2006 am 21 Dezember 2016, 23:42:51
3. Ich muss gleich mal suchen, man kann irgendwo auslesen, wieviel Zeit seit dem letzten Update eines Readings vergangen ist (oder so ähnlich). Das könnte man dann regelmäßig prüfen, und dementsprechend Informationen ausgeben.
ReadingsAge ;-)
Zitat von: jojop2 am 21 Dezember 2016, 22:42:33
Hallo,
folgendes DOIF Statement versuche ich einzusetzen, um zu erkennen, wenn ein Sensor länger als 30 min off ist.
Ich habe 7 solcher Sensoren, die alle ein Reading "temperature3" haben.
Wenn mein Gateway offline ist, und somit auch alle 7 Sensoren für fhem offline sind, erhalte ich aber immer nur eine Meldung, statt 7.
Leider blicke ich mit der Device und Reading Angabe beim DOIF noch nicht ganz durch.
define di_devicewarning30 DOIF ([":temperature3"]) \
(\
({ SendStdMsg("FHEM - Device-Offline Warning from device: $DEVICE", "Attention! \n$DEVICE is offline longer than 30 min");;;;\
my $counter=ReadingsVal("DeviceOfflineWarning30","count",0);;;;\
$counter = $counter+1;;;;\
fhem("setreading DeviceOfflineWarning30 count $counter");;;;}),\
(setreading DeviceOfflineWarning30 $DEVICE off)\
)\
attr di_devicewarning30 do resetwait
attr di_devicewarning30 notexist "novalue"
attr di_devicewarning30 room FhemMonitor
attr di_devicewarning30 wait 1800
DOIF ([":temperature3"]) (defmod at_$DEVICE at +00:30 Attention! \n$DEVICE is offline longer than 30 min)
attr di_devicewarning30 do always
attr di_devicewarning30 notexist "novalue"
attr di_devicewarning30 room FhemMonitor
Der Einzeiler sollte schon funktionieren.
Gruß
Damian
@
jojop2: schau mal hier (https://forum.fhem.de/index.php/topic,62501.0.html) (für
resetwait gilt das gleiche wie für
wait).
Zitat von: Damian am 22 Dezember 2016, 09:40:29defmod at_$DEVICE at ...
Das hast du in dein Herz geschlossen?! ;D
Zitat von: Per am 22 Dezember 2016, 12:21:38
@jojop2: schau mal hier (https://forum.fhem.de/index.php/topic,62501.0.html) (für resetwait gilt das gleiche wie für wait).
Das hast du in dein Herz geschlossen?! ;D
ja, das ist eine Kombination aus DOIF und at, die tatsächlich auch Sinn macht. In diesem Fall ergänzen sich beide Module, denn normalerweise braucht der DOIF-User ja kein at mehr.
Herzlichen Dank an alle Mitwirkenden, vor allem an Damian für sein super DOIF Modul und seinen Support.
Gruß
Johannes