Hallo zusammen,
ich möchte gerne ein DOIF haben, welches mir in einem bestimmten Zeitraum den Rolladen herunterfährt, rechtzeitig vor dem Sonnenaufgang. Wenn der Sonnenaufgang allerdings nach etwa 7 Uhr ist, dann kann das Rollo gleich oben bleiben und braucht nicht herunterfahren.
Dazu habe ich folgendes DOIF gebaut:
Internals:
DEF ([{sunset("HORIZON=-9.0",0,"21:00","23:59")}])
(
set Rolladen_Schlafzimmer open
)
DOELSEIF([{sunrise("HORIZON=-9.0",0,"12:35","12:36")}] && $hour <=12 && $min <=55)
(
##set Rolladen_Schlafzimmer closed,
set alarmbot message DF_Rolladen_Schlafzimmer cmd_2
)
DOELSEIF([$SELF:steuern] eq "long" && [?Rolladen_Schlafzimmer:pct] == 0)
(
set Rolladen_Schlafzimmer open
)
DOELSEIF([$SELF:steuern] eq "long" && [?Rolladen_Schlafzimmer:pct] != 0)
(
set Rolladen_Schlafzimmer closed
)
FUUID 5d7ab959-f33f-4040-95aa-a8a8daab93c3df7a
MODEL FHEM
NAME DF_Rolladen_Schlafzimmer
NOTIFYDEV global,DF_Rolladen_Schlafzimmer
NR 535
NTFY_ORDER 50-DF_Rolladen_Schlafzimmer
STATE cmd_2
TYPE DOIF
VERSION 21224 2020-02-18 18:45:49
READINGS:
2020-03-10 12:35:00 cmd 2
2020-03-10 12:35:00 cmd_event timer_2
2020-03-10 12:35:00 cmd_nr 2
2020-03-10 12:33:54 mode enabled
2020-03-10 12:35:00 state cmd_2
2020-03-10 06:18:10 steuern long
2020-03-10 12:33:54 timer_01_c01 10.03.2020 21:00:00
2020-03-10 12:35:00 timer_02_c02 11.03.2020 12:35:00
Regex:
accu:
cond:
DF_Rolladen_Schlafzimmer:
2:
steuern ^DF_Rolladen_Schlafzimmer$:^steuern:
3:
steuern ^DF_Rolladen_Schlafzimmer$:^steuern:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::DOIF_time_once($hash,0,$wday)
1 ::DOIF_time_once($hash,1,$wday) && $hour <=12 && $min <=55
2 ::ReadingValDoIf($hash,'DF_Rolladen_Schlafzimmer','steuern') eq "long" && ::ReadingValDoIf($hash,'Rolladen_Schlafzimmer','pct') == 0
3 ::ReadingValDoIf($hash,'DF_Rolladen_Schlafzimmer','steuern') eq "long" && ::ReadingValDoIf($hash,'Rolladen_Schlafzimmer','pct') != 0
days:
do:
0:
0 set Rolladen_Schlafzimmer open
1:
0 set alarmbot message DF_Rolladen_Schlafzimmer cmd_2
2:
0 set Rolladen_Schlafzimmer open
3:
0 set Rolladen_Schlafzimmer closed
4:
helper:
DEVFILTER ^global$|^DF_Rolladen_Schlafzimmer$
NOTIFYDEV global|DF_Rolladen_Schlafzimmer
event timer_2
globalinit 1
last_timer 2
sleeptimer -1
timerdev
timerevent timer_2
triggerDev
timerevents:
timer_2
timereventsState:
timer_2
triggerEvents:
timer_2
triggerEventsState:
timer_2
interval:
intervalfunc:
localtime:
0 1583870400
1 1583926500
readings:
all DF_Rolladen_Schlafzimmer:steuern
realtime:
0 21:00:00
1 12:35:00
time:
0 {sunset("HORIZON=-9.0",0,"21:00","23:59")}
1 {sunrise("HORIZON=-9.0",0,"12:35","12:36")}
timeCond:
0 0
1 1
timer:
0 0
1 0
timers:
0 0
1 1
triggertime:
1583870400:
localtime 1583870400
hash:
1583926500:
localtime 1583926500
hash:
uiState:
uiTable:
Attributes:
do always
room Rolladen,Solar_PV,_doif
Konkret geht es um die Bedingung
DOELSEIF([{sunrise("HORIZON=-9.0",0,"12:35","12:36")}] && $hour <=12 && $min <=55)
Zum testen habe ich die Zeiten mal an aktuelle gegebenheiten angepasst.
Die Bedingung
DOELSEIF([{sunrise("HORIZON=-9.0",0,"12:35","12:36")}] )
funktioniert einwandfrei.
Auch die Variablen $hour und $min geben den erwarteten Wert aus.
Wenn ich allerdings die Abfrage dazu schreibe, dann wird der entsprechende Zweig nicht mehr ausgeführt.
Die Anweisung mit dem Rolladen habe ich bewusst auskommentiert, damit dieser beim testen nicht dauernd hoch und runter fährt.
Was mache ich falsch?
Im Bedingungsteil kann ich doch perl verwenden, also gehe ich davon aus, dass die verwendung der Variablen $hour und $min nicht falsch ist.
Wenn ich die Variablen in ein Reading schreiben lasse, geben sie die erwarteten Zahlen aus.
Wenn ich das DOIF initialisiere, mit sunrise()-Zeiten in der Zukunft, dann werden auch die Trigger entsprechend gesetzt.
Zum entsprechenden Zeitpunkt findet aber keine Aktion statt.
Danke für eure Ideen, und viele Grüße,
Stephan
Hallo,
hast Du Dir mal das Modul AutoShuttersControl angesehen?
Da kannst Du sehr vieles einstellen.
Was soll "&& $hour <=12 && $min <=55" bringen, wenn Du sowieso frühestens um 12:35 Uhr und spätestens um 12:36 Uhr triggerst?
Um wieviel Uhr hat est nicht funktioniert, und was hat ein "list" des DOIFs dabei gezeigt?
Hi,
Danke für eure Antworten. AutoShutterControl ist ein bisschen mit Spatzen auf Kanonen geworfen. Aber evtl eine Option.
Wobei mein Wunsch für mich gar nicht so kompliziert klingt.
@amenomade:
ZitatWas soll "&& $hour <=12 && $min <=55" bringen, wenn Du sowieso frühestens um 12:35 Uhr und spätestens um 12:36 Uhr triggerst?
Nichts. Eben deshalb wundert es mich ja, dass es nicht ausgeführt wird.
ZitatZum testen habe ich die Zeiten mal an aktuelle gegebenheiten angepasst.
Der Sinn dahinter ist folgender:
Ich möchte, dass der Rolladen zwischen (im test-Beispiel) 12:35 und 12:36 abhängig vom Sonnenstand herunterfährt, aber *nicht* mehr, wenn die Zeit nach 12:55 ist. Im Beispielfall *kann* dieser Fall nicht eintreten, deshalb müsste das DOIF jedes mal auslösen -> was es nicht tut.
In der Produktivversion ist die config wie folgt:
DOELSEIF([{sunrise("HORIZON=-9.0",0,"04:00","07:01")}] && $hour <=6 && $min <=59)
ZitatUm wieviel Uhr hat est nicht funktioniert, und was hat ein "list" des DOIFs dabei gezeigt?
um 12:36, list siehe mein erster Post.
Danke für deine Mühe,
Grüße,
Stephan
Zitat von: abc2006 am 10 März 2020, 18:58:16DOELSEIF([{sunrise("HORIZON=-9.0",0,"04:00","07:01")}] && $hour <=6 && $min <=59)
Die Minuten dürften
immer kleiner oder gleich 59 sein. Der letzte Teil der Bedingung ist also immer wahr und damit überflüssig.
Ansonsten würde ich es wie hier im Beispiel versuchen:
http://fhem.de/commandref_DE.html#DOIF_Kombination_von_Ereignis_und_Zeitsteuerung_mit_logischen_Abfragen
Sorry, das "list" hatte ich übersehen.
Also, der hat aber doch um 12:35 getriggert
2020-03-10 12:35:00 cmd 2
2020-03-10 12:35:00 cmd_event timer_2
2020-03-10 12:35:00 cmd_nr 2
2020-03-10 12:33:54 mode enabled
2020-03-10 12:35:00 state cmd_2
Ich glaube aber nicht, dass man an der Stelle ## haben darf. Entferne einfach komplett den nicht gewünschten Befehl.
##set Rolladen_Schlafzimmer closed,
Zitat von: amenomade am 10 März 2020, 19:23:47
Also, der hat aber doch um 12:35 getriggert
2020-03-10 12:35:00 cmd 2
2020-03-10 12:35:00 cmd_event timer_2
2020-03-10 12:35:00 cmd_nr 2
2020-03-10 12:33:54 mode enabled
2020-03-10 12:35:00 state cmd_2
Richtig, sieht zumindest im list so aus. Der Befehl wurde aber nicht ausgeführt (keine Meldung im Telegram).
Dieses Verhalten ist in diesem konkreten Fall reproduzierbar.
Zitat
Ich glaube aber nicht, dass man an der Stelle ## haben darf. Entferne einfach komplett den nicht gewünschten Befehl.
##set Rolladen_Schlafzimmer closed,
Zumindest funktioniert es einwandfrei, sobald aus der Bedingung der Teil "&& $min <=55" verschwunden ist, wie xenos1984 vorgeschlagen hat.
Dann erhalte ich auch die Meldungen im Telegram, egal ob da der Befehl mit ## davor steht oder ob ich ihn raus lösche.
Bleibt die Frage, obs an dem $min liegt. Aber ich hab keine Ahnung, wie ich das testen könnte?
Grüße,
Stephan
Zitat von: xenos1984 am 10 März 2020, 19:12:14
Die Minuten dürften immer kleiner oder gleich 59 sein. Der letzte Teil der Bedingung ist also immer wahr und damit überflüssig.
Du hast völlig recht!
Zitat von: xenos1984 am 10 März 2020, 19:12:14
Ansonsten würde ich es wie hier im Beispiel versuchen:
http://fhem.de/commandref_DE.html#DOIF_Kombination_von_Ereignis_und_Zeitsteuerung_mit_logischen_Abfragen
das musste ich dreimal lesen, bis ich es jetzt kapiert habe.
DOELSEIF([{sunrise("HORIZON=-9.0",0,"14:13","14:14")}] && [06:25-15:00])
Macht irgendwie (mehr) Sinn.. Dass ich da nicht drauf gekommen bin...
Unabhängig davon müsste es aber mit $hour und $min auch funktionieren, *gerade weil* minute immer kleiner ist als 59...
Grüße,
Stephan
Hallo Stephan,
ob Du schon den Perlmodus und normalen Modus verstanden hast - bin ich nicht sicher:
ZitatDas Modul verfügt über zwei Modi: FHEM-Modus und Perl-Modus. Der Modus eines definierten DOIF-Devices wird automatisch aufgrund der Definition vom Modul erkannt (FHEM-Modus beginnt mit einer runden Klammer auf).
https://fhem.de/commandref_DE.html#DOIF_Perl_Modus
Ich habe es jedenfalls nicht verstanden. Aber ich kann mir vorstellen - innerhalb () gehen Perl Variable nicht.
Zitat<Perl-Zeitvariablen>
Variablen für Zeit- und Datumsangaben, $sec, $min, $hour, $mday, $month, $year, $wday, $yday, $isdst, $week, $hms, $hm, $md, $ymd, $we, $twe
Gruß Otto
Zitat von: Otto123 am 11 März 2020, 14:23:18
Ich habe es jedenfalls nicht verstanden. Aber ich kann mir vorstellen - innerhalb () gehen Perl Variable nicht.
Moin Otto,
ich würde sagen, innerhalb () geht PERL:
Internals:
CFGFN
DEF
(ReadingsVal("$SELF","test",99) == 12)
(setreading $SELF test 17)
DOELSE
(setreading $SELF test 88)
FUUID 5e68f1a4-f33f-4040-8a5d-208ea4925ee2bfec
MODEL FHEM
NAME DF_test17
NOTIFYDEV global
NR 2586438
NTFY_ORDER 50-DF_test17
STATE cmd_2
TYPE DOIF
VERSION 21224 2020-02-18 18:45:49
READINGS:
2020-03-11 15:11:55 cmd 2
2020-03-11 15:11:55 cmd_event DF_test17
2020-03-11 15:11:55 cmd_nr 2
2020-03-11 15:11:53 mode enabled
2020-03-11 15:11:55 state cmd_2
2020-03-11 15:11:55 test 88
Regex:
accu:
attr:
cmdState:
wait:
waitdel:
condition:
0 ReadingsVal("DF_test17","test",99) == 12
do:
0:
0 setreading DF_test17 test 17
1:
0 setreading DF_test17 test 88
helper:
DEVFILTER ^global$
NOTIFYDEV global
globalinit 1
last_timer 0
sleeptimer -1
timerdev
timerevent
timerevents
timereventsState
triggerDev
DOIF_eventa:
cmd_nr: 2
cmd: 2
cmd_event: DF_test17
cmd_2
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: DF_test17
state: cmd_2
uiState:
uiTable:
Attributes:
Ich würde sagen, es gehen sogar nicht-fhem-Spezifische Sachen:
Internals:
CFGFN
DEF (my $var=17; $var == 17)
(setreading $SELF test 17)
DOELSE
(setreading $SELF test 88)
FUUID 5e68f1a4-f33f-4040-8a5d-208ea4925ee2bfec
MODEL FHEM
NAME DF_test17
NOTIFYDEV global
NR 2586438
NTFY_ORDER 50-DF_test17
STATE cmd_1
TYPE DOIF
VERSION 21224 2020-02-18 18:45:49
READINGS:
2020-03-11 15:13:59 cmd 1
2020-03-11 15:13:59 cmd_event DF_test17
2020-03-11 15:13:59 cmd_nr 1
2020-03-11 15:13:55 mode enabled
2020-03-11 15:13:59 state cmd_1
2020-03-11 15:13:59 test 17
Regex:
accu:
attr:
cmdState:
wait:
waitdel:
condition:
0 my $var=17; $var == 17
do:
0:
0 setreading DF_test17 test 17
1:
0 setreading DF_test17 test 88
helper:
DEVFILTER ^global$
NOTIFYDEV global
globalinit 1
last_timer 0
sleeptimer -1
timerdev
timerevent
timerevents
timereventsState
triggerDev
DOIF_eventa:
cmd_nr: 1
cmd: 1
cmd_event: DF_test17
cmd_1
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: DF_test17
state: cmd_1
uiState:
uiTable:
Attributes:
Aber: Nein, der Unterschied ist mir nicht klar. Liegt vermutlich daran, dass ich den Perl-Modus noch nicht eingesetzt habe, weil ich keinen Fall habe, von dem ich weiss, dass mir der Perl-Modus einen Vorteil bringt ...
Abgesehen davon funktioniert das DOIF, wenn ich das $min weglasse - das $hour steht dann noch da...
Danke für deinen Hinweis,
Stephan
Mal zum Verständnis. Die Bedingung im DOIF FHEM-Modus ist intern auch Perl, da könntest du prinzipiell alles machen, was in Perl geht, da es mit eval ausgewertet wird. Ob es sinnvoll ist, ist eine andere Frage.
Eine Definition:
DOIF (ReadingsVal("$SELF","test",99) == 12) (setreading $SELF test 17)
ist allerdings nicht sinnvoll, da es hier keinen Trigger gibt (Angaben in eckigen Klammern) - setreading würde nie ausgeführt werden.
Der DOIF Perl-Modus kann im Gegensatz zum DOIF FHEM-Modus beliebig viele unabhängige Zweige in einer Definition verwalten, es lassen sich ebenfalls Instanzvariablen nutzen (sie behalten ihren Wert auch bis zum nächsten Trigger) und man kommt weitgehend ohne FHEM-Interpreter aus, der sonst FHEM-Befehle in Perl-Funktionsaufrufe übersetzen muss, was Rechenzeit kostet.
Hi Damian,
danke für deine Aufklärung, da sind tatsächlich interessante features dabei ...
Zitat von: Damian am 11 März 2020, 17:17:04
ist allerdings nicht sinnvoll...
Stimmt. War aber auch nicht die Absicht, mir ist nur nix sinnvolles perliges eingefallen, was ich sonst hätte schreiben können... Mit checkall wirds geprüft und ausgeführt:)
Hast du eine Idee, warum $min in obiger Konstellation ein Problem verursachen könnte?
Viele Grüße,
Stephan
Zitat von: abc2006 am 11 März 2020, 17:25:34
Hi Damian,
danke für deine Aufklärung, da sind tatsächlich interessante features dabei ...
Stimmt. War aber auch nicht die Absicht, mir ist nur nix sinnvolles perliges eingefallen, was ich sonst hätte schreiben können... Mit checkall wirds geprüft und ausgeführt:)
Hast du eine Idee, warum $min in obiger Konstellation ein Problem verursachen könnte?
Viele Grüße,
Stephan
Bei mir funktioniert alles wie erwartet:
CFGFN
DEF ([17:53] && $hour <=17 && $min <=55)
FUUID 5e69161f-f33f-c0d4-6989-689478d16f838566
MODEL FHEM
NAME time
NOTIFYDEV global
NR 2209
NTFY_ORDER 50-time
STATE cmd_1
TYPE DOIF
VERSION 20929 2020-01-10 09:44:35
READINGS:
2020-03-11 17:53:00 cmd 1
2020-03-11 17:53:00 cmd_event timer_1
2020-03-11 17:53:00 cmd_nr 1
2020-03-11 17:52:35 mode enabled
2020-03-11 17:53:00 state cmd_1
2020-03-11 17:53:00 timer_01_c01 12.03.2020 17:53:00
sunrise liefert auch nur eine Triggerzeit.
Da fällt mir gerade ein, dass die Abfrage ($hour <=17 && $min <=55) sicherlich nicht das ist, was du erwartest, denn
für z. B. 16:56 ist sie nicht wahr ;)
Nicht umsonst habe ich mir die Zeitintervalle ausgedacht oder die Variable $hm, mit der man sinnvollerweise abfragen kann ($hm lt "17:55"), da ist auch ("16:56" lt "17:55") wahr ;)