FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Tommyland78 am 02 April 2016, 11:05:34

Titel: { time() - time_str2num}
Beitrag von: Tommyland78 am 02 April 2016, 11:05:34
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
Titel: Antw:{ time() - time_str2num}
Beitrag von: Hans Franz am 02 April 2016, 11:18:04
Ähm, 136103 Sekunden sind doch 1.58 Tage wenn ich richtig rechne.

Gruß
Hans
Titel: Antw:{ time() - time_str2num}
Beitrag von: Tommyland78 am 02 April 2016, 11:28:37
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
Titel: Antw:{ time() - time_str2num}
Beitrag von: Hans Franz am 02 April 2016, 12:19:30
{ 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
Titel: Antw:{ time() - time_str2num}
Beitrag von: Tommyland78 am 02 April 2016, 12:26:35
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
Titel: Antw:{ time() - time_str2num}
Beitrag von: CoolTux am 02 April 2016, 12:48:41
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.
Titel: Antw:{ time() - time_str2num}
Beitrag von: CoolTux am 02 April 2016, 12:52:26
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;
}
Titel: Antw:{ time() - time_str2num}
Beitrag 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
Titel: Antw:{ time() - time_str2num}
Beitrag von: CoolTux am 03 April 2016, 13:49:14

(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
Titel: Antw:{ time() - time_str2num}
Beitrag von: Tommyland78 am 03 April 2016, 14:04:35
/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
Titel: Antw:{ time() - time_str2num}
Beitrag von: CoolTux am 03 April 2016, 14:07:18
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
Titel: Antw:{ time() - time_str2num}
Beitrag von: Damian am 03 April 2016, 20:06:17
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
Titel: Antw:{ time() - time_str2num}
Beitrag 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
Titel: Antw:{ time() - time_str2num}
Beitrag von: Damian am 03 April 2016, 21:49:15
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)
Titel: Antw:{ time() - time_str2num}
Beitrag 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
Titel: Antw:{ time() - time_str2num}
Beitrag von: Damian am 03 April 2016, 22:14:15
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