[gelöst] DOIF Verständnisfrage

Begonnen von bommel-bs, 17 März 2018, 11:48:46

Vorheriges Thema - Nächstes Thema

bommel-bs

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

Frank_Huber

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.

bommel-bs

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


Otto123

frank meinte das Ergebnis von list  di_AnkleideZimmer_Rolladen


Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

KernSani

Ich würde an der Stelle ohnehin nicht mit Zeiträumen, sondern mit Zeitpunkten arbeiten.


Kurz, weil mobil...
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Otto123

#5
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

bommel-bs

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?

Otto123

#7
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

bommel-bs

Hallo Otto,

danke für deine Antwort. Ich werde mal mit wait testen.

bommel-bs

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

Frank_Huber

mach mal [StefanUrlaub:state]

bommel-bs

Zitat von: Frank_Huber am 03 April 2018, 12:20:32
mach mal [StefanUrlaub:state]


Unknown command [StefanUrlaub:state], try help.

Frank_Huber

*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)

bommel-bs

Hallo Frank,

danke. Mal sehen wann der Rolladen morgen aufgeht.

Stefan

Frank_Huber

Ob es greift siehst im DOIF.
in den Readings sollte jetzt ein e_StefanUrlaub_state reading zu finden sein.