Hauptmenü

{ time() - time_str2num}

Begonnen von Tommyland78, 02 April 2016, 11:05:34

Vorheriges Thema - Nächstes Thema

Tommyland78

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

Hans Franz

Ähm, 136103 Sekunden sind doch 1.58 Tage wenn ich richtig rechne.

Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

Tommyland78

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

Hans Franz

{ 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
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

Tommyland78

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

CoolTux

#5
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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

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;
}
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Tommyland78

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

CoolTux


(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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Tommyland78

/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

CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tommyland78

Hallo Damian,

wie sieht denn der komplette String aus?
so?

([ReadingsAge(HM_3DBD00_Sw_4:state:sec)/86400] > 5)

Grüße
Der Tom

Damian

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)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tommyland78

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

Damian

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


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF