[gelöst] DOIF Verständnisfrage

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

Vorheriges Thema - Nächstes Thema

bommel-bs

Ein e_StefanUrlaub_state gibt es in den Readings leider nicht.

Hier gibt s nur
state und 5 timer

Otto123

Ich denke dazu muss StefanUrlaub oder ein anderer Beteiligter mal irgendwie einen Event erzeugen.
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

Frank_Huber

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. :-)

bommel-bs

Unter Probably associated with finde ich jetzt StefanUrlaub 1

bommel-bs

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

Frank_Huber

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

bommel-bs

Es sollte heute aber Timer 2 ausgeführt werden. 
StefanUrlaub ist 1

pc1246

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
HP T610
Onkyo_AVR;Enigma2; SB_Server; SB_Player; HM-USB; PhilipsTV; harmony hub; Jeelink mit PCA301; Somfy; S7-300; LGW; HUE; HM-IP auf Charly; div

bommel-bs

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.

pc1246

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
HP T610
Onkyo_AVR;Enigma2; SB_Server; SB_Player; HM-USB; PhilipsTV; harmony hub; Jeelink mit PCA301; Somfy; S7-300; LGW; HUE; HM-IP auf Charly; div

bommel-bs

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

Otto123

#26
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
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

Damian

([({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


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

bommel-bs

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

KernSani

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 :)
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...