Hallo,
ich möchte meinen Rollladen per DOIF Steuern.
Normalerweise soll der Rolladen zwischen 16 und 22 Uhr bei Sonnenuntergang + Offset zu gehen und morgen bei Sonnenaufgang zwischen 6:30 und 9 Uhr aufgehen. Am Samstag und Sonntag soll der Rolladen Morgens später aufgehen. Hier meine Definitionen.
##Rolladen sind zwischen Sonnenuntergang und Sonnenaufgang geschlossen, sonst auf
([{sunset(int(rand(600)), "16:00", "22:00")}]-[{sunrise(int(rand(600)), "06:30", "9:00")} | AT ]) (set AnkleideZimmer_Rolladen off)
DOELSEIF
([{sunset(int(rand(600)), "16:00", "22:00")}]-[{sunrise(int(rand(600)), "07:30", "9:00")} | 6 ]) (set AnkleideZimmer_Rolladen off)
DOELSEIF
([{sunset(int(rand(600)), "16:00", "22:00")}]-[{sunrise(int(rand(600)), "08:30", "9:00")} | 0 ]) (set AnkleideZimmer_Rolladen off)
DOELSE
(set AnkleideZimmer_Rolladen on)
Leider passierte heute Morgen nichts. Wo ist mein Fehler?
Danke
Stefan
Zitat von: bommel-bs am 17 März 2018, 11:48:46
Wo ist mein Fehler?
Hi Stefan,
also hier ist erstmal der Fehler dass du nicht die komplette Definition inkl Attribute gepostet hast.
ein List vom DOIF wäre besser. :-)
generell vermute ich dass die Variante mit |AT, |6 und |0 nur bei direkten Zeiten geht und nicht bei einem Zeitbereich. Da bin ich mir aber nicht 100%ig sicher.
Hallo,
hier alle Zeilen aus der fhem.cfg:
define di_AnkleideZimmer_Rolladen DOIF ##Rolladen sind zwischen Sonnenuntergang und Sonnenaufgang geschlossen, sonst auf\
([{sunset(int(rand(600)), "16:00", "22:00")}]-[{sunrise(int(rand(600)), "06:30", "9:00")} | AT ]) (set AnkleideZimmer_Rolladen off)\
DOELSEIF\
([{sunset(int(rand(600)), "16:00", "22:00")}]-[{sunrise(int(rand(600)), "07:30", "9:00")} | 6 ]) (set AnkleideZimmer_Rolladen off)\
DOELSEIF\
([{sunset(int(rand(600)), "16:00", "22:00")}]-[{sunrise(int(rand(600)), "08:30", "9:00")} | 0 ]) (set AnkleideZimmer_Rolladen off)\
DOELSE \
(set AnkleideZimmer_Rolladen on)
attr di_AnkleideZimmer_Rolladen room 99_System
frank meinte das Ergebnis von list di_AnkleideZimmer_Rolladen
Gruß Otto
Ich würde an der Stelle ohnehin nicht mit Zeiträumen, sondern mit Zeitpunkten arbeiten.
Kurz, weil mobil...
Das stimmt was KernSani sagt, hab ich bei mir auch so gemacht (und ich glaube das hatte einen Grund :D ):
DOIF ([Es ist früh])(Rollo hoch) DOELSEIF ([Es ist Abend])(Rollo runter)
Oder konkret aus der Raw Def
defmod di_RolloJedenTag DOIF ([06:20|8] or [08:00|7]) (set Rollo.*:FILTER=NAME!=RolloKUR:FILTER=STATE!=auf auf) DOELSEIF ([{sunrise("REAL",0,"6:30","09:15")}]) (set Rollo.*:FILTER=STATE!=auf auf) DOELSEIF ([18:00:00] and [AlleAnwesend] eq "absent") (set Rollo.* zu) DOELSEIF ([23:00]) (set Rollo.*:FILTER=STATE=auf zu) DOELSEIF ([{sunrise(0,"05:30","06:20")}] and [AlleAnwesend] eq "present") (set RolloB.* auf)
Gruß Otto
Zitat von: Otto123 am 17 März 2018, 14:00:24
frank meinte das Ergebnis von list di_AnkleideZimmer_Rolladen
Gruß Otto
Den Befehl list kannte ich noch gar nicht.
Wie vorgeschlagen habe ich jetzt mit Zeitpunkten gearbeitet.
Eine Frage habe ich noch mit sunset und rand
Der Rolladen soll nicht vor 6:30 Uhr + bis 600 Sekunden aufgehen.
Hier mein Versuch.
([{sunrise(int(rand(600)), "[06:30]+int(rand(600))", "9:00")} | AT ]) (set AnkleideZimmer_Rolladen on)
Doch statt zwieschen 6:30 und 6:40 Uhr kam jetzt 6:05:50 Uhr als Schaltzeit heraus.
Wie muß ich hier rechnen?
Hi,
Das Konstrukt geht dort so nicht, ersten sind die [] Klammern an der Stelle meines Wissens nicht einsetzbar und Du würdest eine Zeit mit einer Zahl addieren. Ich bin nicht sicher was dabei passiert.
Du müsstest die Zeit in eine Zahl wandeln und dann addieren und dann zurück in eine Zeit wandeln.
Das geht beim DOIF einfacher mit attr <> wait int(rand(600)) und der Bedingung ([{sunrise("REAL",0,"06:30", "9:00")} | AT ])
Gruß Otto
Hallo Otto,
danke für deine Antwort. Ich werde mal mit wait testen.
Hier meine aktuelle Lösung:
##Rolladen sind zwischen Sonnenuntergang und Sonnenaufgang geschlossen, sonst auf
([({sunrise(0,"07:30", "9:00")} + int(rand(600))) ] and StefanUrlaub:state eq "1" ) (set AnkleideZimmer_Rolladen on)
DOELSEIF
([({sunrise(0,"06:30", "9:00")} + int(rand(600))) | AT]) (set AnkleideZimmer_Rolladen on)
DOELSEIF
([({sunrise(0,"07:30", "9:00")} + int(rand(600))) | 6]) (set AnkleideZimmer_Rolladen on)
DOELSEIF
([({sunrise(0,"08:30", "9:00")} + int(rand(600))) | 7]) (set AnkleideZimmer_Rolladen on)
DOELSEIF
([({sunset(-600, "16:00", "22:00")} + int(rand(600))) ]) (set AnkleideZimmer_Rolladen off)
Was leider nicht funktioniert ist der erste Teil.
Der Dummy StefanUrlaub steht auf 1 aber der Rolladen ging um 6:30 rauf.
nternals:
DEF ##Rolladen sind zwischen Sonnenuntergang und Sonnenaufgang geschlossen, sonst auf
([({sunrise(0,"07:30", "9:00")} + int(rand(600))) ] and StefanUrlaub:state eq "1" ) (set AnkleideZimmer_Rolladen on)
DOELSEIF
([({sunrise(0,"06:30", "9:00")} + int(rand(600))) | AT]) (set AnkleideZimmer_Rolladen on)
DOELSEIF
([({sunrise(0,"07:30", "9:00")} + int(rand(600))) | 6]) (set AnkleideZimmer_Rolladen on)
DOELSEIF
([({sunrise(0,"08:30", "9:00")} + int(rand(600))) | 7]) (set AnkleideZimmer_Rolladen on)
DOELSEIF
([({sunset(-600, "16:00", "22:00")} + int(rand(600))) ]) (set AnkleideZimmer_Rolladen off)
NAME di_AnkleideZimmer_Rolladen
NR 555
NTFY_ORDER 50-di_AnkleideZimmer_Rolladen
STATE cmd_2
TYPE DOIF
READINGS:
2018-04-03 06:30:31 cmd 2
2018-04-03 06:30:31 cmd_event timer_2
2018-04-03 06:30:31 cmd_nr 2
2018-04-03 07:36:40 error condition c01: syntax error, line 1, near "StefanUrlaub:"
2018-04-03 06:30:31 state cmd_2
2018-04-03 07:36:40 timer_01_c01 04.04.2018 07:36:27
2018-04-03 06:30:31 timer_02_c02 04.04.2018 06:35:37|AT
2018-04-03 07:34:48 timer_03_c03 04.04.2018 07:33:17|6
2018-04-03 08:37:59 timer_04_c04 04.04.2018 08:30:51|7
2018-04-02 20:31:02 timer_05_c05 03.04.2018 20:31:17
condition:
0 DOIF_time_once($hash,0,$wday) and StefanUrlaub:state eq "1"
1 DOIF_time_once($hash,1,$wday,"AT")
2 DOIF_time_once($hash,2,$wday,"6")
3 DOIF_time_once($hash,3,$wday,"7")
4 DOIF_time_once($hash,4,$wday)
days:
1 AT
2 6
3 7
devices:
do:
0:
0 set AnkleideZimmer_Rolladen on
1:
0 set AnkleideZimmer_Rolladen on
2:
0 set AnkleideZimmer_Rolladen on
3:
0 set AnkleideZimmer_Rolladen on
4:
0 set AnkleideZimmer_Rolladen off
5:
helper:
event timer_1
globalinit 1
last_timer 5
sleeptimer -1
timerdev
timerevent timer_2
timereventsState
triggerDev
timerevents:
timer_2
triggerEvents:
timer_1
internals:
interval:
itimer:
localtime:
0 1522820187
1 1522816537
2 1522819997
3 1522823451
4 1522780277
readings:
realtime:
0 07:36:27
1 06:35:37
2 07:33:17
3 08:30:51
4 20:31:17
regexp:
all:
state:
STATE:
time:
0 ({sunrise(0,"07:30","9:00")}+int(rand(600)))
1 ({sunrise(0,"06:30","9:00")}+int(rand(600)))
2 ({sunrise(0,"07:30","9:00")}+int(rand(600)))
3 ({sunrise(0,"08:30","9:00")}+int(rand(600)))
4 ({sunset(-600,"16:00","22:00")}+int(rand(600)))
timeCond:
0 0
1 1
2 2
3 3
4 4
timer:
0 0
1 0
2 0
3 0
4 0
timers:
0 0
1 1
2 2
3 3
4 4
triggertime:
1522780277:
localtime 1522780277
hash:
1522816537:
localtime 1522816537
hash:
1522819997:
localtime 1522819997
hash:
1522820187:
localtime 1522820187
hash:
1522823451:
localtime 1522823451
hash:
Attributes:
room 99_System
Hat einer eine Idee, wie ich die Varuale richtig einbaue?
Danke
Stefan
mach mal [StefanUrlaub:state]
Zitat von: Frank_Huber am 03 April 2018, 12:20:32
mach mal [StefanUrlaub:state]
Unknown command [StefanUrlaub:state], try help.
*facepalm* :-)
ALT:
##Rolladen sind zwischen Sonnenuntergang und Sonnenaufgang geschlossen, sonst auf
([({sunrise(0,"07:30", "9:00")} + int(rand(600))) ] and StefanUrlaub:state eq "1" ) (set AnkleideZimmer_Rolladen on)
NEU:
##Rolladen sind zwischen Sonnenuntergang und Sonnenaufgang geschlossen, sonst auf
([({sunrise(0,"07:30", "9:00")} + int(rand(600))) ] and [StefanUrlaub:state] eq "1" ) (set AnkleideZimmer_Rolladen on)
Hallo Frank,
danke. Mal sehen wann der Rolladen morgen aufgeht.
Stefan
Ob es greift siehst im DOIF.
in den Readings sollte jetzt ein e_StefanUrlaub_state reading zu finden sein.
Ein e_StefanUrlaub_state gibt es in den Readings leider nicht.
Hier gibt s nur
state und 5 timer
Ich denke dazu muss StefanUrlaub oder ein anderer Beteiligter mal irgendwie einen Event erzeugen.
Otto, das kann sein.
Die readings werden aber auch nach dem editieren vom DEF nicht gleich sichtbar aktualisiert.
Einmal Browser refresh mach ich da immer um den aktuellen Stand zu haben.
spätestens morgen früh weis bommel-bs ja ob es geht. :-)
Unter Probably associated with finde ich jetzt StefanUrlaub 1
Leider ging der Rolladen wieder um 6:30 Uhr auf :-(
Ich hatte gestern die Reihenfolge noch einmal geändert. Hier die aktuellen internals:
Internals:
DEF ##Rolladen sind zwischen Sonnenuntergang und Sonnenaufgang geschlossen, sonst auf
([({sunrise(0,"08:30", "9:00")} + int(rand(600))) | 7]) (set AnkleideZimmer_Rolladen on)
DOELSEIF
([({sunrise(0,"07:30", "9:00")} + int(rand(600))) ] and [StefanUrlaub:STATE] eq "1" ) (set AnkleideZimmer_Rolladen on)
DOELSEIF
([({sunrise(0,"07:30", "9:00")} + int(rand(600))) | 6]) (set AnkleideZimmer_Rolladen on)
DOELSEIF
([({sunrise(0,"06:30", "9:00")} + int(rand(600))) | AT]) (set AnkleideZimmer_Rolladen on)
DOELSEIF
([({sunset(-600, "16:00", "22:00")} + int(rand(600))) ]) (set AnkleideZimmer_Rolladen off)
NAME di_AnkleideZimmer_Rolladen
NR 555
NTFY_ORDER 50-di_AnkleideZimmer_Rolladen
STATE cmd_4
TYPE DOIF
READINGS:
2018-04-03 22:44:27 Device StefanUrlaub
2018-04-04 06:37:01 cmd 4
2018-04-04 06:37:01 cmd_event timer_4
2018-04-04 06:37:01 cmd_nr 4
2018-04-04 06:37:01 state cmd_4
2018-04-04 08:35:06 timer_01_c01 05.04.2018 08:39:43|7
2018-04-04 07:32:31 timer_02_c02 05.04.2018 07:31:07
2018-04-04 07:33:46 timer_03_c03 05.04.2018 07:36:15|6
2018-04-04 06:37:01 timer_04_c04 05.04.2018 06:35:43|AT
2018-04-03 21:54:56 timer_05_c05 04.04.2018 20:28:14
condition:
0 DOIF_time_once($hash,0,$wday,"7")
1 DOIF_time_once($hash,1,$wday) and ReadingValDoIf($hash,'StefanUrlaub','STATE') eq "1"
2 DOIF_time_once($hash,2,$wday,"6")
3 DOIF_time_once($hash,3,$wday,"AT")
4 DOIF_time_once($hash,4,$wday)
days:
0 7
2 6
3 AT
devices:
1 StefanUrlaub
all StefanUrlaub
do:
0:
0 set AnkleideZimmer_Rolladen on
1:
0 set AnkleideZimmer_Rolladen on
2:
0 set AnkleideZimmer_Rolladen on
3:
0 set AnkleideZimmer_Rolladen on
4:
0 set AnkleideZimmer_Rolladen off
5:
helper:
event timer_2
globalinit 1
last_timer 5
sleeptimer -1
timerdev
timerevent timer_4
triggerDev
timerevents:
timer_4
timereventsState:
state: 1
triggerEvents:
timer_2
triggerEventsState:
state: 1
internals:
interval:
itimer:
localtime:
0 1522910383
1 1522906267
2 1522906575
3 1522902943
4 1522866494
readings:
1 StefanUrlaub:STATE
all StefanUrlaub:STATE
realtime:
0 08:39:43
1 07:31:07
2 07:36:15
3 06:35:43
4 20:28:14
regexp:
0:
1:
2:
3:
4:
all:
state:
STATE:
time:
0 ({sunrise(0,"08:30","9:00")}+int(rand(600)))
1 ({sunrise(0,"07:30","9:00")}+int(rand(600)))
2 ({sunrise(0,"07:30","9:00")}+int(rand(600)))
3 ({sunrise(0,"06:30","9:00")}+int(rand(600)))
4 ({sunset(-600,"16:00","22:00")}+int(rand(600)))
timeCond:
0 0
1 1
2 2
3 3
4 4
timer:
0 0
1 0
2 0
3 0
4 0
timers:
0 0
1 1
2 2
3 3
4 4
trigger:
triggertime:
1522866494:
localtime 1522866494
hash:
1522902943:
localtime 1522902943
hash:
1522906267:
localtime 1522906267
hash:
1522906575:
localtime 1522906575
hash:
1522910383:
localtime 1522910383
hash:
Attributes:
room 99_System
cmd4 wurde korrekt ausgeführt:
DOELSEIF
([({sunrise(0,"06:30", "9:00")} + int(rand(600))) | AT]) (set AnkleideZimmer_Rolladen on)
DOELSEIF
2018-04-04 06:37:01 cmd 4
2018-04-04 06:37:01 cmd_event timer_4
2018-04-04 06:37:01 cmd_nr 4
Es sollte heute aber Timer 2 ausgeführt werden.
StefanUrlaub ist 1
Haha
Das habe ich genau gewusst! Aber woher soll das DOIF das wissen. Du musst dann bei den anderen schon sagen, dass diese nur gueltig sind, wenn kein Urlaub!
Gruss Christoph
Dann liegt hier wohl ein Mißverständnis vor. Ich war davon ausgegangen, das das erste zutreffende ausgeführt wird und dann Schluß ist. In diesen Fall wurde das letzte passende ausgeführt.
Moin
Nein! Um 6:30 Uhr war die Sonne aufgegangen, und damit hat das gegriffen! Um 7:30 ist es noch einmal passiert, da Du ja Urlaub hast und die Sonne aufgegangen ist!
Gruss Christoph
Hallo Christoph,
Du hast recht.
Nur wurde die zweite Aktion um 7:30 Ubr nicht ausgeführt. Hier muss wohl noch ein Fehler sein.
Gruß
Stefan
Zitat von: Frank_Huber am 03 April 2018, 12:20:32
mach mal [StefanUrlaub:state]
Moin,
ich weiß nicht genau, aber meiner Meinung nach ist dies jetzt [StefanUrlaub:
STATE] eq "1" etwas anderes. Aber eventuell ist DOIF Fehlertolerant oder hat wie so oft seine eigene Logik.
Merke
STATE ist ein
Internal und muss in DOIF eigentlich so geschrieben werden &STATE
state ist ein
Reading Falls für STATE nichts extra definiert oder im Modul vorgesehen ist, wird der state Wert nach STATE übernommen und beide Werte sind gleich.
Gruß Otto
([({sunrise(0,"06:30", "9:00")} + int(rand(600))) | AT]) (set AnkleideZimmer_Rolladen on)
solche Definitionen sind kritisch zu sehen, denn durch die zufällige Verschiebung, kann es passieren, dass Mehrfach hintereinander geschaltet wird:
z. B.
1. rand(600)-> 0
2. rand(600)-> 100 -> Zeitschaltpunkt später als Tag zuvor -> Wiederholung der Ausführung am gleichen Tag
3. rand (600) -> 300 -> s. o.
Es wird also ggf. am gleichen Tage der Befehl solange wiederholt, bis die nächst zu berechnende Zeit in der Vergangenheit liegt -> nächster Tag
Es funktioniert nur sinnvoll ohne do always in Wechselwirkung mit anderen Zweigen, die sich abwechseln.
Eleganter löst man es mit wait in kombination mit waitWithTimer
attr wait rand(600)
attr waitWithTimer 1
Hallo,
nach studieren der Commandref und ausprobieren habe ich die Lösung gefunden:
([({sunrise(0,"07:30", "9:00")} + int(rand(600))) | AT] and [StefanUrlaub::$STATE] eq "1" ) (set AnkleideZimmer_Rolladen on)
Danke für eure Hilfe.
Stefan
Hi Stefan,
Schön, dass es klappt und danke, dass du die Lösung gepostet hast. Schreibst du dann bitte noch [Gelöst] vor das Subject des ersten Posts? Danke :)
Moin Stefan,
schön das es eine Lösung gibt, aber kannst Du mir den erklären? Was bewirkt jetzt :$ ? Hab ich noch nie gesehen.
[StefanUrlaub::$STATE]
Gruß Otto
Zitat von: Otto123 am 06 April 2018, 09:01:46
schön das es eine Lösung gibt, aber kannst Du mir den erklären? Was bewirkt jetzt :$ ? Hab ich noch nie gesehen.
[StefanUrlaub::$STATE]
schließe mich Otto's Frage an.
Nach meinem Kenntnisstand müsste
[StefanUrlaub] das selbe bewirken.
Zitat von: Frank_Huber am 06 April 2018, 09:06:53
Nach meinem Kenntnisstand müsste [StefanUrlaub] das selbe bewirken.
Meiner Meinung nach: sogar das Richtige :D
Ich bezweifle irgendwie, dass das jetzige Konstrukt ohne Fehler läuft.
Gruß Otto
neue DOIF-Version siehe hier: https://forum.fhem.de/index.php/topic,86579.msg791116.html#msg791116
Was ::$ genau bewirkt weiß ich auch nicht.In der commandref habe ich mal nach STATE gesucht und folgendes gefunden
Liste der Devices in der Gruppe "windows", die mit "rooms" enden, deren Status (nicht state-Reading) "on" ist:
[@"rooms$"::$STATE eq "on" and $group eq "windows"]
Darauf habe ich StefanUrlaub::$STATE ausprobiert und es lief.
Gruß
Stefan
Zitat von: bommel-bs am 06 April 2018, 20:52:14
Was ::$ genau bewirkt weiß ich auch nicht.In der commandref habe ich mal nach STATE gesucht und folgendes gefunden
Liste der Devices in der Gruppe "windows", die mit "rooms" enden, deren Status (nicht state-Reading) "on" ist:
[@"rooms$"::$STATE eq "on" and $group eq "windows"]
Darauf habe ich StefanUrlaub::$STATE ausprobiert und es lief.
Gruß
Stefan
Das ist der Teil der Commandref zu DOIF-Aggregationsfunktionen, die Intern aus mehreren Schleifendurchläufen bestehen um Werte zu aggregiert - das willst du aber nicht.
Wenn du einfach nur den Status abfragen willst, dann brauchst du nur angeben:
[StefanUrlaub] eq "1"
Das ist das Gleiche wie
[StefanUrlaub:&STATE] eq "1"
und das ist meistens das Gleiche, wie das Reading state:
[StefanUrlaub:state] eq "1"
Such dir eins aus, aber nicht
[StefanUrlaub::$STATE] eq "1"
denn, wenn es irgendwie funktioniert, dann nur zufällig ;)