DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?

Begonnen von wowogiengen, 27 September 2017, 21:54:23

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: wowogiengen am 30 September 2017, 12:00:20
Hallo Damian,
ausgehend von dem was ich in anderen Programmiersprachen gelernt habe, würde ich sagen, dass ich das Reading, welches weniger häufig wechselt als erstes angeben würde.
Weil, wenn das Reading dann nicht true ergibt, würde beim "and" das zweite Reading gar nicht mehr ausgewertet werden müssen.

Bis grade eben wollte ich die Uhrzeit als erste Bedingung angeben, und die Temperatur als zweites.
Aber nach ein bischen Überlegen:
die Uhrzeit wechselt eigentlich jede Sekunde, und die Temperatur etwas langsamer.
Somit zuerst auf die Temperatur abfragen und dann auf die Uhrzeit.
Wobei aber die Solltemperatur an dem in Frage kommenden Tag ja seit der Früh auf 30°C steht...

Viele Grüße
Wolfgang

ja, auch in Perl (das ist ja die DOIF-Bedingung in Wirklichkeit) gilt diese Regel, wenn bei and die erste Teilbedingung wahr ist wird der Rest nicht mehr ausgewertet.

Du musst dich von einer sequentiellen Abarbeitung von Befehlssequenzen lösen. Wir sind hier bei ereignisgesteuerter Abarbeitung von Befehlssequenzen.

(([?HzgSetBad:desired-temp] > 29) and  [00:00])  wird genau einmal am Tag überprüft, da ist es ziemlich egal wie rum die Befehle stehen.

Unabhängig davon kannst du davon ausgehen, dass niemals zwei Ereignisse gleichzeitig vom Modul begearbeitet werden können:

(([HzgSetBad:desired-temp] > 29) and  [00:00])

dh. Trigger von HzgSetBad und 00:00 wird niemals in FHEM gleichzeitig beim DOIF ankommen.




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

wowogiengen

Hallo,
dann frag ich einfach mal dumm weiter, wenn es dir nichts ausmacht... Vielleicht kann man die Antworten irgendwie ins WIKI einfliessen lassen?

Ich stelle mir FHEM so vor, dass irgendwo eine Schleife läuft (der Haupt-Thread sozusagen), welche zum einen den Input vom Funkmodul verarbeitet, daraus dann Readings für die Devices macht, und anhand der Readings dann eben das Ereignis generiert, dass sich das Reading des Device geändert hat.

An einer anderen Stelle prüft FHEM dann für jeden Befehl sag ich mal(also AT, DoIf, Notify und was weiss ich noch), ob irgendein Ereignis vorliegt, welches auf die Bedingung und den Status des Befehls passt. Wenn ja, wird der Befehl entsprechend weiterverarbeitet.
Aber dazu passt dann meine Vorstellung von dem DoIf und den Triggern nicht, dass diese nie gleichzeitig im DoIf ankommen.

Du schreibst, dass meine Bedingung genau 1 x am Tag geprüft wird. Dazu muss aber das DoIf wissen, wann es prüfen soll.
Wenn ich ein Intervall angegeben hätte, also z.B. von 22:00 bis 23:59, dann muss doch innerhalb dieses Zeitraums ständig geprüft werden, ob die Solltemperatur vielleicht bei 30°C liegt - außer die Ereignissteuerung weiß, dass das DoIf vom Reading der Solltemperatur abhängt und triggert dann das DoIf wenn die Solltemperatur von irgendwas auf 30°C umgestellt wird. Aber das passiert ja nur genau 1 x am Tag. Und dann auch nicht im Intervall oder um 00:00.

Wenn ich die Uhrzeit als Triggerquelle nehme, dann triggert diese doch das DoIf immer dann, wenn sie sich ändert, also nicht nur 1 x am Tag.

Bin etwas verwirrt  :-\

Viele Grüße
Wolfgang

Damian

Wie die internen FHEM-Mechanismen im einzelnen funktionieren, musst du im Developer-Bereich nachlesen.

zu Zeitintervallen: https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitintervallen

da steht, dass genau zwei mal getriggert wird.

[00:00] ist kein Zeitintervall, sondern ein Zeitpunkt, er ist nur im "Augenblick" der Triggerung, gesteuert von FHEM, wahr und sonst nie. Und da ein FHEM-Modul immer nur zu einem Event "geweckt" wird, welches es abarbeitet und die Kontrolle sofort zurückgibt, kann es niemals zwei verschiedene Events im Modul geben: z. B. Zeit-Event und Ereignis-Event.

Merke: "DOIF schaut nie eigenständig irgendwo nach, sondern macht etwas, wenn es dazu durch Ereignisse/Zeittrigger von FHEM aufgefordert wird."





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