[Gelöst] DOIF mit Zeitschaltung und überprüfung. Verständnisfrage?

Begonnen von Gear, 19 Mai 2019, 11:40:46

Vorheriges Thema - Nächstes Thema

Gear

Guten Morgen Zusammen,

ich würde gerne eine Zeitschaltuhr haben, welche nicht nur auf 13Uhr und 14Uhr reagiert.

Ist es möglich, das DOIF kontinuierlich prüfen zulassen in dem Zeitraum?
Mir geht es darum, wenn der Zustand des Device (in dem Fall der Roborock, habe ich noch nicht eingebaut, weil ich erst das mit der Zeit zum laufen bringen wollte) sich ändert, dass der CMD erneut ausgeführt wird.

defmod DOIF.Roborock DOIF ([13:00-14:00] and [?Dummy.Presence] eq "Abwesend")\
(set WHG.Roborock Start)
attr DOIF.Roborock do always


Ich hoffe ihr könnt mir helfen.
Einen schönen Sonntag wünsche ich euch.

Beste Grüße
Gear
> ODroid H3 => OMV => Docker => FHEM <
Fritz!Box 7590, Fritz!Repeater 6000, MQTT, RaspberryMatic, Zigbee2MQTT, ESP32, ESP8266, Shelly, Grafana ...
> 3D-Druck <

rabehd

#1
ZitatIst es möglich, das DOIF kontinuierlich prüfen zulassen in dem Zeitraum?

https://forum.fhem.de/index.php/topic,43638.0.html
Zu empfehlen wäre ein Blick in die Commandref:
https://commandref.fhem.de/commandref_DE.html#DOIF_repeatcmd

ZitatMir geht es darum, wenn der Zustand des Device (in dem Fall der Roborock, habe ich noch nicht eingebaut, weil ich erst das mit der Zeit zum laufen bringen wollte) sich ändert, dass der CMD erneut ausgeführt wird.
Verstehe ich nicht. Vielleicht kannst Du Deine Gesamtabsicht beschreiben?
Auch funktionierende Lösungen kann man hinterfragen.

Gear

Ok, danke, da habe ich nach den falschen Befriffen gesucht...  ::)
> ODroid H3 => OMV => Docker => FHEM <
Fritz!Box 7590, Fritz!Repeater 6000, MQTT, RaspberryMatic, Zigbee2MQTT, ESP32, ESP8266, Shelly, Grafana ...
> 3D-Druck <

Per

Zitat von: Gear am 19 Mai 2019, 11:40:46Ist es möglich, das DOIF kontinuierlich prüfen zulassen in dem Zeitraum?
Ich glaube, du hast die Funktion von DOIF noch nicht verstanden!


Damian

Es ist vermutlich nur ein Verständnisproblem. Das DOIF-Modul arbeitet ereignisgesteuert, dh. wenn sich ein Zustand eines Gerätes ändert, welches Events generiert, dann wird DOIF sofort wach und reagiert darauf. Dafür braucht man normalerweise nicht ständig einen Zustand abzufragen (engl. polling), was unnötig Performance frisst.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Gear

Ich bin zwar Zeitlich noch nicht dazu gekommen, mein Vorhaben umzusetzen, aber mein Vorhaben ist folgendes.
Mir ist bewust, dass DOIF ereignisgesteuert ist.

Ich möchte in meinem Fall gerne, dass der Roborock jeden Tag saugt.
Die Bedingungen sind folgende:

Anwesenheit
Ein Flag, welches nach dem Start des Roborock gesetzt wird um zu erkennen ob er schon gesaugt hat.
Wochentag: Mo-Fr
Urlaubskalender
Reisekalender
Uhrzeit: 13 - 16

Mir ist klar, dass wenn alle Bedingungen TRUE sind und 13Uhr ist, dann wird der CMD ausgeführt.
Was aber, wenn es 14Uhr ist und alle Bedinungen TRUE werden, aber nicht zum selben Zeitpunkt.

Ich weiß auf, dass ein "?" sagt, dass es eine Status abfrage ist, somit müsste ich ja irgendwie alles als Separate Abfrage machen, damit wenn die letzte Bedingung auf TRUE springt.
> ODroid H3 => OMV => Docker => FHEM <
Fritz!Box 7590, Fritz!Repeater 6000, MQTT, RaspberryMatic, Zigbee2MQTT, ESP32, ESP8266, Shelly, Grafana ...
> 3D-Druck <

Damian

Zitat von: Gear am 23 Mai 2019, 13:09:18
Ich bin zwar Zeitlich noch nicht dazu gekommen, mein Vorhaben umzusetzen, aber mein Vorhaben ist folgendes.
Mir ist bewust, dass DOIF ereignisgesteuert ist.

Ich möchte in meinem Fall gerne, dass der Roborock jeden Tag saugt.
Die Bedingungen sind folgende:

Anwesenheit
Ein Flag, welches nach dem Start des Roborock gesetzt wird um zu erkennen ob er schon gesaugt hat.
Wochentag: Mo-Fr
Urlaubskalender
Reisekalender
Uhrzeit: 13 - 16

Mir ist klar, dass wenn alle Bedingungen TRUE sind und 13Uhr ist, dann wird der CMD ausgeführt.
Was aber, wenn es 14Uhr ist und alle Bedinungen TRUE werden, aber nicht zum selben Zeitpunkt.

Ich weiß auf, dass ein "?" sagt, dass es eine Status abfrage ist, somit müsste ich ja irgendwie alles als Separate Abfrage machen, damit wenn die letzte Bedingung auf TRUE springt.

Bsp.:

([13:00-14:00] and [Dummy.Presence] eq "Abwesend")

Es gibt hier Zeittrigger um: 13:00 Uhr und 14:00 Uhr
und Ereignistrigger von Dummy.Presence

-um 13:00 wird der Ausdruck überprüft -> Ausdruck wahr, wenn Dummy.Presence abwesend, sonst unwahr
-jedes Mal wenn Dummy.Presence ein Event sendet wird der Ausdruck überprüft -> Ausdruck wahr im Zeitintervall, wenn Dummy.Presence abwesend, sonst unwahr
-um 14:00 wird ebenfalls der Ausdruck überprüft -> Ausdruck unwahr, da Zeitintervall unwahr

siehe: https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitintervallen
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Gear

Ok gut, verstehe.

([13:00-16:00] and [Dummy.Presence] eq "Abwesend" and [Dummy.Presence.Reise] eq "Nein" and [Dummy.Presence.Urlaub] eq "Nein")
(set WHG.Roborock start)
DOELSE
()


Aber wie verhindere ich, dass er ein zweites mal reinigt?
Also angenommen, er reinigt um 13Uhr und ich komme um 15Uhr nach Hause und gehe nach ein paar Minuten wieder? (der Presence Status ändert sich dann)
Gibt es da eine Möglichkeit, dass es nur einmal pro Tag ausgeführt wird?



Edit:
Ich habe das mal so umgesetzt, ich weiß nicht ob es die schöne Lösung ist oder nicht.
([13:00-16:00] and [Dummy.Presence] eq "Abwesend" and [Dummy.Presence.Reise] eq "Nein" and [Dummy.Presence.Urlaub] eq "Nein")
(set WHG.Roborock start)
DOELSEIF ([00:00])
()




Edit:
Und wenn FHEM neu gestartet wird, dann wird ja auch das DOIF neu initialisiert und somit würde es erneut triggern.
> ODroid H3 => OMV => Docker => FHEM <
Fritz!Box 7590, Fritz!Repeater 6000, MQTT, RaspberryMatic, Zigbee2MQTT, ESP32, ESP8266, Shelly, Grafana ...
> 3D-Druck <

Damian

Zitat von: Gear am 23 Mai 2019, 14:00:15
Ok gut, verstehe.

([13:00-16:00] and [Dummy.Presence] eq "Abwesend" and [Dummy.Presence.Reise] eq "Nein" and [Dummy.Presence.Urlaub] eq "Nein")
(set WHG.Roborock start)
DOELSE
()


Aber wie verhindere ich, dass er ein zweites mal reinigt?
Also angenommen, er reinigt um 13Uhr und ich komme um 15Uhr nach Hause und gehe nach ein paar Minuten wieder? (der Presence Status ändert sich dann)
Gibt es da eine Möglichkeit, dass es nur einmal pro Tag ausgeführt wird?



Edit:
Ich habe das mal so umgesetzt, ich weiß nicht ob es die schöne Lösung ist oder nicht.
([13:00-16:00] and [Dummy.Presence] eq "Abwesend" and [Dummy.Presence.Reise] eq "Nein" and [Dummy.Presence.Urlaub] eq "Nein")
(set WHG.Roborock start)
DOELSEIF ([00:00])
()




Edit:
Und wenn FHEM neu gestartet wird, dann wird ja auch das DOIF neu initialisiert und somit würde es erneut triggern.

([13:00-16:00] and [Dummy.Presence] eq "Abwesend" and [Dummy.Presence.Reise] eq "Nein" and [Dummy.Presence.Urlaub] eq "Nein")
(set WHG.Roborock start)


reicht schon, um 16:00 wechselt der Zustand automatisch in cmd_2, damit ist das Modul für den nächsten Tag vorbereitet.

Kein do always setzen, sonst gibt es Wiederholung. Nach dem Hochfahren des System passiert erst mal nichts, da der gespeicherte Zustand übernommen wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Gear

Das mag sein, dass deine Ausführung reicht, ja.

Wenn ich das in meinem System mache und es ändert sich "Dummy.Presence" von Abwesend zu Anwesend, dann macht er cmd_2 der nicht definiert ist.
Somit ist cmd_1 nicht mehr aktiv und wenn ich dann wieder auf Abwesend gehe, dann führt er cmd_1 aus.

Ich hoffe du verstehst was ich meine.

2019-05-23 18:38:20 DOIF DOIF.Roborock cmd_nr: 1
2019-05-23 18:38:20 DOIF DOIF.Roborock cmd: 1
2019-05-23 18:38:20 DOIF DOIF.Roborock cmd_event: Dummy.Presence
2019-05-23 18:38:20 DOIF DOIF.Roborock cmd_1
2019-05-23 18:38:22 DOIF DOIF.Roborock cmd_nr: 2
2019-05-23 18:38:22 DOIF DOIF.Roborock cmd: 2
2019-05-23 18:38:22 DOIF DOIF.Roborock cmd_event: Dummy.Presence
2019-05-23 18:38:22 DOIF DOIF.Roborock cmd_2
2019-05-23 18:38:23 DOIF DOIF.Roborock cmd_nr: 1
2019-05-23 18:38:23 DOIF DOIF.Roborock cmd: 1
2019-05-23 18:38:23 DOIF DOIF.Roborock cmd_event: Dummy.Presence
2019-05-23 18:38:23 DOIF DOIF.Roborock cmd_1
2019-05-23 18:38:25 DOIF DOIF.Roborock cmd_nr: 2
2019-05-23 18:38:25 DOIF DOIF.Roborock cmd: 2
2019-05-23 18:38:25 DOIF DOIF.Roborock cmd_event: Dummy.Presence
2019-05-23 18:38:25 DOIF DOIF.Roborock cmd_2
> ODroid H3 => OMV => Docker => FHEM <
Fritz!Box 7590, Fritz!Repeater 6000, MQTT, RaspberryMatic, Zigbee2MQTT, ESP32, ESP8266, Shelly, Grafana ...
> 3D-Druck <

amenomade

Du hast Recht, und Damian hat etwa übersehen, dass Du nicht möchtest, dass es ein 2. Mal reinigt.
Ohne do always und ohne DOELSE / DOELSEIF, ist ein DOELSE implizit, was man eigentlich hier nicht will.
Deine Lösung mit DOELSEIF sollte funktionieren.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Gear

> ODroid H3 => OMV => Docker => FHEM <
Fritz!Box 7590, Fritz!Repeater 6000, MQTT, RaspberryMatic, Zigbee2MQTT, ESP32, ESP8266, Shelly, Grafana ...
> 3D-Druck <