Hauptmenü

ReadingsAge

Begonnen von Christian72D, 22 Juni 2024, 15:45:27

Vorheriges Thema - Nächstes Thema

Christian72D

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?

Nobbynews

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

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Gisbert

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
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Christian72D

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}

Nobbynews

#5
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)

rih

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)

betateilchen

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 }
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rspecht

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

marvin78

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.