Hallo zusammen,
ich möchte gern bei einem Reading auslesen, wie alt die letzte Statusänderung ist.
Die Idee ist es so zu lösen:
{ time() - time_str2num(ReadingsTimestamp("HM_3DBD00_Sw_04", "state",0));; }
Leider führt das zu keinem sinningen Ergebnis.
136103.586527109 ist doch etwas viel, da es sich um rund 1,5 Tage handeln sollte.
Könnt Ihr mir hier bitte helfen?
Viele Grüße
Der Tom
Ähm, 136103 Sekunden sind doch 1.58 Tage wenn ich richtig rechne.
Gruß
Hans
Hallo Hans,
ja stimmt...die .586527109 machen die Rechnung wohl zu nichte...
Sind das Millisekunden? - Wie bekomme ich diese denn weg?
Oder habe ich einen Gedankenfehler?
Grüße
Der Tom
{ int(time() - time_str2num(ReadingsTimestamp("HM_3DBD00_Sw_04", "state",0)));; }
Aber wieso hast du einen Float-Wert mit der normalen time()-Funktion? Oder hast du die HighRes-Funktion genommen?
Gruß
Hans
Hallo Hans,
das Ergebnis passt jetzt.
Kannst Du mir den Unterschied zwischen time und int(time erlären?
P.S. Zu Deinen Fragen muss ich leider etwas betröppelt zurückschauen und zugeben, dass ich die Frage nicht verstanden habe, da mir beide Begriffe nichts sagen.
Grüße
Der Tom
Dafür gibt es seit kurzem
ReadingsAge($$$)
ReadingsAge($device,$reading,$default)
Default muss ein Datumsformat sein yyyy-mm-dd HH:mm:ss
An zu wenden wie ReadingsVal und Konsorten.
Und wer sich für den Code dahinter interessiert
sub ReadingsAge($$$)
{
my ($device,$reading,$default) = @_;
my $ts = ReadingsTimestamp($device,$reading,undef)
return time() - time_str2num($ts) if(defined($ts));
return $default;
}
Hallo zusammen,
vielen Dank für die bisherigen Informationen.
Könnt Ihr mal bitte einen Blick auf dieses DOIF werfen?
Stimmt der Systax so?
(([Winterzeit:state] eq "on") and ([(ReadingsAge("HM_3DBD00_Sw_04","state","dd")/86400)] > 5)) (set Tablet_Wohnzimmer ttsSay Heizung zu warm)
Der spannende Teil ist der in der Mitte ([(ReadingsAge("HM_3DBD00_Sw_04","state","dd")/86400)] > 5)
Ziel ist es, dass wenn das state-datum von HM_3DBD00_Sw_04 größer als 5 Tage ist, soll eine Aktion erfolgen.
Danke fürs helfen
Grüße
Der Tom
(ReadingsAge("HM_3DBD00_Sw_04","state","dd")/86400)
Was soll das /86400
So bekommst Du das alter des Readings in Sekunden
(ReadingsAge("HM_3DBD00_Sw_04","state","1970-01-01 12:00:00"))
Das letzte ist nur der default Wert, also was genommen werden soll wenn man kein Ergebniss bekommt. Bei meinem default bekommt man ein alter von paar millionen glaube
/86400 teilt die Sekunden in Tage.
Ein Tag hat 86400 Sekunden.
Ich möchte nicht mit Sekunden, sondern mit Tagen rechnen.
Grüße
Der Tom
Das wäre dann aber mal ein altes Reading ;D
Gut dann nur den default Wert bitte beachten. Sonst bekommst immer 1 raus als default
Zitat von: Tommyland78 am 03 April 2016, 13:40:58
Hallo zusammen,
vielen Dank für die bisherigen Informationen.
Könnt Ihr mal bitte einen Blick auf dieses DOIF werfen?
Stimmt der Systax so?
(([Winterzeit:state] eq "on") and ([(ReadingsAge("HM_3DBD00_Sw_04","state","dd")/86400)] > 5)) (set Tablet_Wohnzimmer ttsSay Heizung zu warm)
Der spannende Teil ist der in der Mitte ([(ReadingsAge("HM_3DBD00_Sw_04","state","dd")/86400)] > 5)
Ziel ist es, dass wenn das state-datum von HM_3DBD00_Sw_04 größer als 5 Tage ist, soll eine Aktion erfolgen.
Danke fürs helfen
Grüße
Der Tom
Beim DOIF kann man "sec" als Option angeben:
([HM_3DBD00_Sw_4:state:sec]/86400 > 5)
Gruß
Damian
Hallo Damian,
wie sieht denn der komplette String aus?
so?
([ReadingsAge(HM_3DBD00_Sw_4:state:sec)/86400] > 5)
Grüße
Der Tom
Zitat von: Tommyland78 am 03 April 2016, 21:42:27
Hallo Damian,
wie sieht denn der komplette String aus?
so?
([ReadingsAge(HM_3DBD00_Sw_4:state:sec)/86400] > 5)
Grüße
Der Tom
Nein, so wie ihn angegeben habe. Die Funktionalität von ReadingsAge steckt da schon drin. Also:
([Winterzeit:state] eq "on" and [HM_3DBD00_Sw_4:state:sec]/86400 > 5) (set Tablet_Wohnzimmer ttsSay Heizung zu warm)
Ah...verstehe.
Das habe ich bisher in keiner Doku gefunden.
Nun, der Suchbegriff sollte schon die Herausforderung sein...
gibt es neben "sec" auch noch andere Ausgabemöglichkeiten?
day etc?
Grüße
Der Tom
Zitat von: Tommyland78 am 03 April 2016, 22:11:08
Ah...verstehe.
Das habe ich bisher in keiner Doku gefunden.
Nun, der Suchbegriff sollte schon die Herausforderung sein...
gibt es neben "sec" auch noch andere Ausgabemöglichkeiten?
day etc?
Grüße
Der Tom
z. Zt. gibt es nur sec.
http://fhem.de/commandref_DE.html#DOIF_Zeitspanne_eines_Readings_seit_der_letzten_Aenderung