FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: wowogiengen am 27 September 2017, 21:54:23

Titel: DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: wowogiengen am 27 September 2017, 21:54:23
Hallo,
ich möchte bei mir jede Nacht um 00:00 die Sollraumtemperatur im Bad runternehmen, wenn sie zuvor auf einem höheren Wert gesetzt war:
Dachte mir, das geht so:

defmod HeizungsReset DOIF ( [00:00] and ([HzgSetBad:desired-temp] > 29)) (set HzgSetBad desired-temp 25)

Also, wenn der Thermostat sagt, ich will 30 Grad haben und es zufälligerweise genau 00:00 ist, dann soll die Solltemperatur wieder auf 25 °C zurückgeschalten werden.
Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: Frank_Huber am 27 September 2017, 22:03:57
Das sollte passen. Mach noch ein DOELSEIF drunter ohne Befehl oder setze das Attribut do auf always.

Kannst aber auch [HzgSetBad:desired-temp] ne "25" machen, dann wird es  auf 25 gesetzt wenn es nicht 25 ist.

Gesendet von meinem S3_32 mit Tapatalk

Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: CoolTux am 27 September 2017, 22:08:45
Ich würde es so machen


defmod HeizungsReset DOIF ( [00:00] and ([?HzgSetBad:desired-temp] > 29)) (set HzgSetBad desired-temp 25)
Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: Frank_Huber am 27 September 2017, 22:57:52
Ja, ist ressourcen schonender. 😉

Gesendet von meinem S3_32 mit Tapatalk

Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: wowogiengen am 28 September 2017, 18:38:29
Wieso ressourcenschonender?
Wegen dem ? vor dem Reading?
Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: Gisbert am 28 September 2017, 19:08:50
Zitat aus der commandref:

Trigger verhindern [?<devicename>], [?<devicename>:<readingname>], [?<devicename>:&<internalname>], [?<time specification>]
    Werden Status, Readings, Internals und Zeitangaben in der Bedingung mit einem Fragezeichen eingeleitet, triggern sie nicht.

sowie:
https://fhem.de/commandref_DE.html#DOIF_Zeitintervalle_Readings_und_Status_ohne_Trigger (https://fhem.de/commandref_DE.html#DOIF_Zeitintervalle_Readings_und_Status_ohne_Trigger)
Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: wowogiengen am 28 September 2017, 19:18:35
Wieso löst ein Zugriff auf das Reading einen Trigger aus?
Und welche(n)?
Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: Damian am 28 September 2017, 19:20:59
Zitat von: wowogiengen am 28 September 2017, 19:18:35
Wieso löst ein Zugriff auf das Reading einen Trigger aus?
Und welche(n)?

rate doch mal wann diese Bedingung ausgewertet wird:

DOIF ([HzgSetBad:desired-temp] > 29) ...
Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: wowogiengen am 28 September 2017, 20:52:25
Hallo Damian,
ich will nicht raten  :-\

Weil unter einem Trigger verstehe ich ein Ereignis, welches ausgelöst wird, wenn sich ein Zustand ändert.
Und der einzige Zustand, der sich hier ändert, ist das Setzen der Wunschtemperatur auf 25°C.
Durch das Auslesen des Readings wird doch kein Trigger ausgelöst?
Und wenn doch, wo kann man das nachlesen?
Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: Damian am 29 September 2017, 18:29:02
siehe: https://fhem.de/commandref_DE.html#DOIF_checkReadingEvent
Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: rvideobaer am 29 September 2017, 18:38:58
Hallo,

Thermostat Mode auto und templist ist zu einfach?
Weshalb muß man da ein DoIf bemühen?

Gruß Rolf
Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: wowogiengen am 29 September 2017, 20:31:59
Zitat von: Damian am 29 September 2017, 18:29:02
siehe: https://fhem.de/commandref_DE.html#DOIF_checkReadingEvent

Bezogen auf mein Beispiel mit dem Raumthermostat würde das heissen, dass mein DoIf auch dann die  Temperatur auswerten würde, wenn sich die Luftfeuchtigkeit im Raum ändert? Also ohne checkReadingEvent.

Inwieweit wirkt es sich dann positiv oder negativ auf die Performance aus, wenn man zuerst die Uhrzeit und dann die Temperatur prüft, oder umgekehrt?
Also:

defmod HeizungsReset DOIF ( [00:00] and ([HzgSetBad:desired-temp] > 29)) (set HzgSetBad desired-temp 25)
gegenüber
defmod HeizungsReset DOIF ( ([HzgSetBad:desired-temp] > 29) and [00:00]) (set HzgSetBad desired-temp 25)

bzw. dann noch besser
defmod HeizungsReset DOIF ( [00:00] and ([?HzgSetBad:desired-temp] > 29)) (set HzgSetBad desired-temp 25)
gegenüber
defmod HeizungsReset DOIF (([?HzgSetBad:desired-temp] > 29) and  [00:00]) (set HzgSetBad desired-temp 25)



Das Beispiel in der CommandRef verstehe ich nicht:

Angaben in eckigen Klammern, die mit einem Fragezeichen beginnen, führen zu keiner Triggerung des Moduls, sie dienen lediglich der Abfrage.

Anwendungsbeispiel: Licht soll zwischen 06:00 und 10:00 angehen, getriggert wird nur durch den Taster nicht um 06:00 bzw. 10:00 Uhr und nicht durch das Device Home

define di_motion DOIF ([?06:00-10:00] and [button] and [?Home] eq "present")(set lamp on-for-timer 600)
attr di_motion do always


Kann mir mal jemand ein Beispiel machen, wo man den Unterschied sehen kann, was mit oder ohne Fragezeichen tatsächlich ausführt?

Viele Grüße
Wolfgang
Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: wowogiengen am 29 September 2017, 20:39:39
Zitat von: rvideobaer am 29 September 2017, 18:38:58
Hallo,

Thermostat Mode auto und templist ist zu einfach?
Weshalb muß man da ein DoIf bemühen?

Gruß Rolf
Ich glaube, dass ich absichtlich von dem Auto-Modus und der Temperaturliste weggegangen bin, weil für meinen Anwendungsfall das nicht funktioniert:

Meine Frau sitzt im Rollstuhl, und in der Regel geht sie jeden zweiten Tag baden, und wenn sie baden geht, schalten wir in der Früh die FBH auf 30°C dass es abends ja nicht zu kalt ist im Bad für sie. Damit wir die Heizung aber nach dem Baden nicht vergessen können, wollte ich jede Nacht um 00:00 bei  Solltemperatur 30°C die Solltemperatur wieder auf 25°C runternehmen, was auch schon viel ist, aber grade so passt...

Den Automodus und die Temperaturliste kann ich aber nur so verwenden, dass ich an gleichen Wochentagen abwechselnd 30°C und Normaltemperatur einstelle, also z.B. Mo, Mi, Fr und So. Aber in der zweiten Woche wären die Badetage dann ja Di, Do und Sa. Und das versteht die Templist doch nicht?

Außerdem kann man dann nicht manuell eingreifen, ohne dass man am Abend wieder auf Auto stellen muss, wenn mal die Badetage doch anders wären.

Von daher habe ich es jetzt mal mit manueller Steuerung versucht, und um 00:00 dann wieder auf normale Temperatur zurück.

Bei kompletter Steuerung über FHEM könnte man sicher auch einen virtuellen Button "Badetag" definieren, der in der Früh dafür sorgt, dass von Auto auf manuell umgeschalten wird, und auf 30 °C Solltemperatur, sowie um 00:00 dann wieder auf Auto...
Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: Damian am 29 September 2017, 21:36:54
Zitat von: wowogiengen am 29 September 2017, 20:31:59
Bezogen auf mein Beispiel mit dem Raumthermostat würde das heissen, dass mein DoIf auch dann die  Temperatur auswerten würde, wenn sich die Luftfeuchtigkeit im Raum ändert? Also ohne checkReadingEvent.

Inwieweit wirkt es sich dann positiv oder negativ auf die Performance aus, wenn man zuerst die Uhrzeit und dann die Temperatur prüft, oder umgekehrt?
Also:

defmod HeizungsReset DOIF ( [00:00] and ([HzgSetBad:desired-temp] > 29)) (set HzgSetBad desired-temp 25)
gegenüber
defmod HeizungsReset DOIF ( ([HzgSetBad:desired-temp] > 29) and [00:00]) (set HzgSetBad desired-temp 25)

bzw. dann noch besser
defmod HeizungsReset DOIF ( [00:00] and ([?HzgSetBad:desired-temp] > 29)) (set HzgSetBad desired-temp 25)
gegenüber
defmod HeizungsReset DOIF (([?HzgSetBad:desired-temp] > 29) and  [00:00]) (set HzgSetBad desired-temp 25)



Das Beispiel in der CommandRef verstehe ich nicht:

Angaben in eckigen Klammern, die mit einem Fragezeichen beginnen, führen zu keiner Triggerung des Moduls, sie dienen lediglich der Abfrage.

Anwendungsbeispiel: Licht soll zwischen 06:00 und 10:00 angehen, getriggert wird nur durch den Taster nicht um 06:00 bzw. 10:00 Uhr und nicht durch das Device Home

define di_motion DOIF ([?06:00-10:00] and [button] and [?Home] eq "present")(set lamp on-for-timer 600)
attr di_motion do always


Kann mir mal jemand ein Beispiel machen, wo man den Unterschied sehen kann, was mit oder ohne Fragezeichen tatsächlich ausführt?

Viele Grüße
Wolfgang

1) ja, auch Feuchtigkeit oder jedes anderes Reading des Devices würde dein DOIF-Modul triggern.

2) Die Reihenfolge der Angaben spielt hier keine Rolle, dein Beispiel 1 entspricht Beispiel 2 bzw. 3 entspricht 4.

Für dich ist Beispiel 3 oder 4 das richtige, denn die Temperaturabfrage soll nur um 0:00 Uhr stattfinden.







Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: wowogiengen am 30 September 2017, 12:00:20
Zitat von: Damian am 29 September 2017, 21:36:54
1) ja, auch Feuchtigkeit oder jedes anderes Reading des Devices würde dein DOIF-Modul triggern.

2) Die Reihenfolge der Angaben spielt hier keine Rolle, dein Beispiel 1 entspricht Beispiel 2 bzw. 3 entspricht 4.

Für dich ist Beispiel 3 oder 4 das richtige, denn die Temperaturabfrage soll nur um 0:00 Uhr stattfinden.

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
Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: Damian am 30 September 2017, 12:14:20
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.




Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: wowogiengen am 30 September 2017, 13:00:44
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
Titel: Antw:DoIF jeden Tag um 00:00 etwas schalten ,wenn zweite Bedingung passt?
Beitrag von: Damian am 30 September 2017, 13:34:29
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."