Ich wollte mit ReadingsAge abfragen, ob sich bei einem Device seit 30 Tagen nichts verändert hat.
ReadingsAge(<devicename>,<reading>,<defaultvalue>)
gibt das Alter des Readings in Sekunden zurück.
Also:
DOIF ([16:00] and [ReadingsAge(Garage,input)>"720:00:00"]) (set PB message Das Auto muß geladen werden | Hinweis)
Als Fehlermeldung bekomme ich timer_02_c01 error: Wrong timespec ReadingsAge(Garage,input)>"720:00:00": either HH:MM:SS or {perlcode}
Wie habe ich die 30 Tage jetzt zu schreiben?
Aus der commandref:
ZitatReadingsAge(<devicename>,<reading>,<defaultvalue>)
gibt das Alter des Readings in Sekunden zurück.
Macht also für 30 Tage: 30*86400 = 2592000 Sekunden
Und für doif:
https://commandref.fhem.de/commandref_DE.html#DOIF_Zeitspanne_eines_Readings_seit_der_letzten_Aenderung (https://commandref.fhem.de/commandref_DE.html#DOIF_Zeitspanne_eines_Readings_seit_der_letzten_Aenderung)
Naja, wie von Dir ja korrekt zitiert, in Sekunden: 30 * 24 * 60 * 60 oder einfacher 30 * DAYSECONDS
Wieviele Fehler kann man eigentlich in einem einzigen Funktionsaufruf machen?
- Du willst Zahlenwerte vergleichen, da haben Anführungszeichen nix zu suchen
- Du hast bei ReadingsAge() den defaultwert vergessen
- In einem solchen Funktionsaufruf müssen die Namen in Anführungszeichen gesetzt werden
Außerhalb eines DOIF würde der Vergleich einfach so aussehen:
ReadingsAge('Garage','input',0)>30*DAYSECONDS
Wie Du das in einem DOIF unterbringst - keine Ahnung.
DOIF kommt mir nicht ins Haus.
Hallo ChristianD72,
in DOIF müsste es auch so funktionieren, wie betateilchen es in seinem Beitrag beschrieben hat.
Laut commandref für DOIF geht auf jeden Fall diese Definition (Zitat aus der commandref):
Zeitspanne eines Readings seit der letzten Änderung back
Bei Readingangaben kann die Zeitspanne mit [<Device>:<Reading>:sec] in Sekunden seit der letzten Änderung bestimmt werden.
Anwendungsbeispiel: Überwachung eines Temperatursensors
define di_monitor DOIF ([+01:00] and [?sensor:temperature:sec]>3600)(set pushbullet message sensor failed)
attr di_monitor do always
Wenn der Temperatursensor seit über einer Stunde keinen Temperaturwert geliefert hat, dann soll eine Nachricht erfolgen.
Viele Grüße Gisbert
Zitat von: betateilchen am 22 Juni 2024, 16:02:22Naja, wie von Dir ja korrekt zitiert, in Sekunden: 30 * 24 * 60 * 60 oder einfacher 30 * DAYSECONDS
Wieviele Fehler kann man eigentlich in einem einzigen Funktionsaufruf machen?
- Du willst Zahlenwerte vergleichen, da haben Anführungszeichen nix zu suchen
- Du hast bei ReadingsAge() den defaultwert vergessen
- In einem solchen Funktionsaufruf müssen die Namen in Anführungszeichen gesetzt werden
Außerhalb eines DOIF würde der Vergleich einfach so aussehen:
ReadingsAge('Garage','input',0)>30*DAYSECONDS
Wie Du das in einem DOIF unterbringst - keine Ahnung.
DOIF kommt mir nicht ins Haus.
Naja, den zahlenweret hatte ich zuerst drin, hat nicht funktioniert, daher kam ich auf die Angabe in Stunden, als das auch nicht geklpappt hatte, dachte ich der will es in Anführungszeichen.
Jetzt sieht es SO aus:
([16:00] and [ReadingsAge('Garage','input',0)>7200]) (set PB message Das Auto muß geladen werden | Hinweis)
Komisch, es kommt die selbe, identische Fehlermeldung:
timer_02_c01 error: Wrong timespec ReadingsAge('Garage','input',0)>7200: either HH:MM:SS or {perlcode}
Zitat von: Christian72D am 23 Juni 2024, 03:46:35Jetzt sieht es SO aus:
([16:00] and [ReadingsAge('Garage','input',0)>7200]) (set PB message Das Auto muß geladen werden | Hinweis)
Komisch, es kommt die selbe, identische Fehlermeldung:
timer_02_c01 error: Wrong timespec ReadingsAge('Garage','input',0)>7200: either HH:MM:SS or {perlcode}
Du schmeißt Perl und DOIF durcheinander.
Da es ein doif sein soll, mach' es doch einfach so, wie in dem von mir geposteten Link und von Gisbert nochmals zitierten Auszug aus der commandref zu doif:
([16:00] and [Garage:input:sec]>7200) (set PB message Das Auto muss geladen werden | Hinweis)
Zitat von: Christian72D am 23 Juni 2024, 03:46:35Jetzt sieht es SO aus:
Code Auswählen Erweitern
([16:00] and [ReadingsAge('Garage','input',0)>7200]) (set PB message Das Auto muß geladen werden | Hinweis)
Komisch, es kommt die selbe, identische Fehlermeldung:
Code Auswählen Erweitern
timer_02_c01 error: Wrong timespec ReadingsAge('Garage','input',0)>7200: either HH:MM:SS or {perlcode}
Probiers mal ohne die eckigen Klammern um das ReadingsAge. Also so:
([16:00] and ReadingsAge('Garage','input',0)>7200) (set PB message Das Auto muß geladen werden | Hinweis)
Zitat von: rih am 23 Juni 2024, 11:04:58Probiers mal ohne die eckigen Klammern um das ReadingsAge. Also so:
oder probier es gleich ganz ohne DOIF...
define at_test at *16:00:00 { fhem("set PB message Das Auto muß geladen werden | Hinweis") if ReadingsAge('Garage','input',0)>30*DAYSECONDS }
Moin,
ich klemme am gleichen Thema... Kann es sein das ReadingsAge irgendwann an seine Grenzen kommt?
ReadingsAge schaut doch auf das letzte mal, egal ob changed oder nicht. Also bei mir wirft ein Zigbee Gerät einen Status ins FHEM und obwohl ich "event-on-change-reading" habe stehten die Zeiten von "gerade eben" drin. Der Fenstersensor wurde vor etwa einem Monat mal ausgelöst.
Muss ich mir da eine Logik herumbauen?
Grüße
timestamp-on-change-reading
Readings werden immer geupdated. Das hat nichts mit dem Event zu tun. Für das erhalten des Timestamps gibt es das oben genannte Attribut.