Zeitdifferenz zwischen letzten Schaltzeitpunkt - jetzt und DOIF

Begonnen von patlabor, 08 Oktober 2014, 18:26:33

Vorheriges Thema - Nächstes Thema

patlabor

Hallo zusammen,

ich versuche gerade unseren Heißwasserboiler in der Küche mit einem Zwischenstecker über fhem zu steuern.
Seit Jahren benutze ich hierfür einfach eine normale Zeitschaltuhr, die einfach 4 mal am Tag zu festen Zeiten den Boiler für 15 min einschaltet.
Über fhem will ich es jetzt so hinbiegen, das der Beuler zu den gleichen Zeiten geschaltet wird, wenn jemand zuhause ist, und zusätzlich wenn gerade jemand nachhause kommt, und der Boiler vorher mindestens 5 Std ausgeschaltet war.

Leider habe ich nicht die geringste Ahnung, wie ich die differenz zwischen dem letzen schaltvorgang und jetzt herausbekomme.

mit {time_str2num(OldTimestamp("ku_boiler"))} habe ich schonmal den Zeitpunkt des letzten schaltens des boilers rausbekommen, aber woher nehme ich die aktuelle zeit?

das ganze will ich dann mit DOIF folgendermaßen "verschalten"

define di_boiler DOIF
([08:00|8] an [bewohner:state] eq "home") (set ku_boiler on-for-timer 1280)
DOELSEIF ([09:00|7] an [bewohner] eq "home") (set ku_boiler on-for-timer 1280)
DOELSEIF ([12:30] and [bewohner] eq "home") (set ku_boiler on-for-timer 1280)
DOELSEIF([16:00] and [bewohner] eq "home") (set ku_boiler on-for-timer 1280)
DOELSEIF ([19:00] and [bewohner] eq "home") (set ku_boiler on-for-timer 1280)
DOELSEIF ([bewohner] eq "home") (set ku_boiler on-for-timer 1280)


da ich die sache mit der Zeit noch nicht raus habe, habe ich erst mal nur versucht das ein nachhausekommen ein einschalten auslösen soll, aber leider funktioniert das nicht.
während die ersten 5 bedingungen zu funktionieren scheinen, löst die letzte bedingung folgende fehlermeldung aus:

perl error in condition: DOIF_time_once($hash->{timer}{0},$wday,"8") an InternalDoIf('bewohner','STATE','') eq "home": syntax error at (eval 15977) line 1, near ") an "



Puschel74

#1
Hallo,

die Fehlermeldung kommt vermutlich von hier:
([08:00|8] an [bewohner:state] eq "home") (set ku_boiler on-for-timer 1280)
Das an sollte wohl and heissen.

Die momentane Uhrzeit hole ich mir im notify so:
my $now=sprintf("%02d:%02d",$hour,$min);
In einem anderen notify (auf meiner Versuchsinstallation) klappt auch $hms für Stunden, Minuten und Sekunden.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

patlabor

super, danke

genau daran hat es gelegen. weis nicht wie oft ich das überlesen habe, aber jetzt geht es.

jetzt fehlt mir nurnoch rauszubekommen woher ich die aktuelle Zeit nehme

patlabor

So, habe jetzt mal etwas weiter versucht und bin zu folgenden Ergebnis gekommen

([08:00|8] and [bewohner] eq "home") (set ku_boiler on-for-timer 1280)
DOELSEIF ([09:00|7] and [bewohner] eq "home") (set ku_boiler on-for-timer 1280)
DOELSEIF ([12:30] and [bewohner] eq "home") (set ku_boiler on-for-timer 1280)
DOELSEIF([16:00] and [bewohner] eq "home") (set ku_boiler on-for-timer 1280)
DOELSEIF ([19:00] and [bewohner] eq "home") (set ku_boiler on-for-timer 1280)
DOELSEIF ([bewohner] eq "home" and {time_str2num(InternalVal("CUL_0","CUL_0_TIME","1999-01-01 00:00:00"))-time_str2num(OldTimestamp("ku_boiler"))} > "10800") (set ku_boiler on-for-timer 1280)


Die Perl Funkton in der letzten Bedingung spuckt tatsächlich den Zeitraum in Sekunden aus, die vergangen sind seit das letzte mal geschaltet wurde. Leider wird aber das > "10800" ignoriert, und der Boiler wird enfach eingeschaltet sobald wieder jemand nachhause kommt.

Damian

Zitat von: patlabor am 08 Oktober 2014, 20:41:46
So, habe jetzt mal etwas weiter versucht und bin zu folgenden Ergebnis gekommen

([08:00|8] and [bewohner] eq "home") (set ku_boiler on-for-timer 1280)
DOELSEIF ([09:00|7] and [bewohner] eq "home") (set ku_boiler on-for-timer 1280)
DOELSEIF ([12:30] and [bewohner] eq "home") (set ku_boiler on-for-timer 1280)
DOELSEIF([16:00] and [bewohner] eq "home") (set ku_boiler on-for-timer 1280)
DOELSEIF ([19:00] and [bewohner] eq "home") (set ku_boiler on-for-timer 1280)
DOELSEIF ([bewohner] eq "home" and {time_str2num(InternalVal("CUL_0","CUL_0_TIME","1999-01-01 00:00:00"))-time_str2num(OldTimestamp("ku_boiler"))} > "10800") (set ku_boiler on-for-timer 1280)


Die Perl Funkton in der letzten Bedingung spuckt tatsächlich den Zeitraum in Sekunden aus, die vergangen sind seit das letzte mal geschaltet wurde. Leider wird aber das > "10800" ignoriert, und der Boiler wird enfach eingeschaltet sobald wieder jemand nachhause kommt.

In der Bedingung darfst du keine geschweiften Klammern zusätzlich angeben (genauso, wie bei if in Perl), also:

... and (time_str2num(InternalVal("CUL_0","CUL_0_TIME","1999-01-01 00:00:00"))-time_str2num(OldTimestamp("ku_boiler"))) > 10800)

aber das sollte auch einfacher gehen:

... and (time-time_str2num(OldTimestamp("ku_boiler"))) > 10800)

Gruß

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