FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: fireball am 05 November 2020, 21:05:22

Titel: Zeit und Ereignisgesteuertes DOIF
Beitrag von: fireball am 05 November 2020, 21:05:22
Hi Leute,

ich steh grad auf dem Schlauch... DOIF raubt mir immer die Nerven... ganz einfaches Beispiel:
([16:00-22:00] and [BM_Garage04:luminance:d] < 100) (set Aussenbeleuchtung on) DOELSE (set Aussenbeleuchtung off)

Ich möchte, dass wenn in der Zeit zwischen 16 und 22 Uhr die Außensensor sagt es ist dunkel, dass die Außenbeleuchtung angeschalten wird, diese aber immer um 22 Uhr ausgeht.
Jetzt ist der Außensensor aber direkt unter eine Lampe, die durch einen Bewegungsmelder angeschaltet wird.
Also zwischendruch wird die "luminance" mal wieder größer > 100. Dann geht das Licht aus, dann wieder an...

Ich möchte aber das der Befehl quasi nur einmal ausgeführt wird. repeatcmd = 0 hilft nicht....
Habt ihr da einen Rat?
Ist es überhaupt sinnvoll die Zeit mit reinzubringen? es wird ja abends nur einmal dunkel, aber dann müsste ich die Zeit im DOELSE setzen fürs ausschalten, richtig?!

VG+Danke
René
Titel: Antw:Zeit und Ereignisgesteuertes DOIF
Beitrag von: amenomade am 05 November 2020, 23:20:57
Ich würde mit
([16:00-22:00] and [BM_Garage04:luminance:d] < 100) (set Aussenbeleuchtung on) DOELSEIF ([22:00]) (set Aussenbeleuchtung off)probieren
Titel: Antw:Zeit und Ereignisgesteuertes DOIF
Beitrag von: fireball am 07 November 2020, 09:10:36
Moinsen, danke! Ich glaub das wars... es läuft... Das DOELSIF is da echt besser als DOELSE...

Brauch ich das repeatcmd = 0 jetzt noch?

VG
René

Titel: Antw:Zeit und Ereignisgesteuertes DOIF
Beitrag von: Damian am 07 November 2020, 09:22:34
Es steht in der Einleitung der Commmandref zu DOIF:

ZitatDas DOIF-Modul arbeitet mit Zuständen. Jeder Ausführungszweig DOIF/DOELSEIF..DOELSEIF/DOELSE stellt einen eigenen Zustand dar (cmd_1, cmd_2, usw.). Das Modul merkt sich den zuletzt ausgeführten Ausführungszweig und wiederholt diesen standardmäßig nicht. Ein Ausführungszweig wird erst dann wieder ausgeführt, wenn zwischenzeitlich ein anderer Ausführungszweig ausgeführt wurde, also ein Statuswechsel des DOIF-Moduls stattgefunden hat. Dieses Verhalten ist sinnvoll, um zu verhindern, dass zyklisch sendende Sensoren (Temperatur, Feuchtigkeit, Helligkeit, usw.) zu ständiger Wiederholung des selben Befehls oder Befehlsabfolge führen.

In deinem Fall brauchst du keinerlei Attribute zu setzen.
Titel: Antw:Zeit und Ereignisgesteuertes DOIF
Beitrag von: fireball am 07 November 2020, 09:41:11
Moinsen,

danke für die schnelle Antwort. Ich nutze ja Fhem seid 4 Jahren... aber das DOIF / notify etc... puhhh damit tu ich mich immer wieder schwer...
Titel: Antw:Zeit und Ereignisgesteuertes DOIF
Beitrag von: fireball am 10 November 2020, 10:16:26
Hi Damian,

kannst du mir bei einem anderen DOIF nochmal auf die Sprünge helfen?
Thema "Urlaubssteuerung über Kalender"

Ich habe einen Kalenderview_Rene für meinen Kalender und ein DOIF, welches überprüft, ob ein Eintrag für Urlaub vorhanden ist.
Im CLAVIEW sieht der Eintrag wie folgt aus:
today_001_summary Urlaub

Mein DOIF funktioniert und man sieht es auch im Ereignismonitor

(["Kalenderview_Rene:today_\d\d\d_summary.*[U|u]rlaub.*"]) (set Urlaub on) DOELSE (set Urlaub off)

Der Dummy Urlaub wird eingeschaltet.

Lösche ich den Eintrag Urlaub raus und der Kalenderview aktualisert sich nach einem bestimmten Intervall, dann geht das DOIF aber nicht in den DOELSE Zweig, auch wenn kein Eintrag mit "Urlaub" mehr vorhanden ist.

Wenn ich das DOIF manuell mit "checkall" ausführe gehts. Von alleine wird der DOELSE Zweig aber nicht ausgeführt...

VG René
   

Titel: Antw:Zeit und Ereignisgesteuertes DOIF
Beitrag von: rabehd am 10 November 2020, 13:39:25
ZitatLösche ich den Eintrag Urlaub raus und der Kalenderview aktualisert sich nach einem bestimmten Intervall,

Führt das zu einem Event von Kalenderview_Rene:today_\d\d\d_summary?
Titel: Antw:Zeit und Ereignisgesteuertes DOIF
Beitrag von: fireball am 10 November 2020, 14:29:32
Hi,

wenn ich den Kalenderview manuell update, dann für deine Frage zu keinem Event, aber wenn ich ein .* hinten anfüge, dann kommen Events :
also:
Kalenderview_Rene:today_\d\d\d_summary
=> kein Eintrag im Eventlog

Kalenderview_Rene:today_\d\d\d_summary.*
=> diese Einträge

2020-11-10 14:24:00 CALVIEW Kalenderview_Rene today_001_summary: Restmüll
2020-11-10 14:24:00 CALVIEW Kalenderview_Rene today_002_summary: Hans Geburtstag

VG
René
Titel: Antw:Zeit und Ereignisgesteuertes DOIF
Beitrag von: Damian am 10 November 2020, 21:00:11
Diese Art der Abfrage ["Device:event"] kann niemals in den DOELSE-Fall laufen, da sie entweder triggert beim passenden Ereignis (DO-Fall) oder sie triggert gar nicht, wenn es kein passendes Ereignis gibt. Dh. sie kann nicht triggern und falsch sein.
Titel: Antw:Zeit und Ereignisgesteuertes DOIF
Beitrag von: fireball am 10 November 2020, 21:34:59
Hi Damian,

sowas ähnliches hatte ich mir gedacht, ist das Event da... passt es, aber sonst nicht...
hast du für mich den entscheidenen Hinweis?
Das Ereignis ist ja :

2020-11-10 20:02:41 CALVIEW Kalenderview_Rene today_001_summary: Hans Geburtstag
2020-11-10 20:02:41 CALVIEW Kalenderview_Rene today_002_summary: Restmüll
2020-11-10 20:02:41 CALVIEW Kalenderview_Rene today_003_summary: Urlaub

Also entwender ich brauch ein ! passt nicht für meinen String

oder einen Stringvergleich... es funktioniert doch sowas hier mit Zahlen..

Es soll aus einem Reading, das z. B. ein Prozentzeichen beinhaltet, nur der Zahlenwert für den Vergleich genutzt werden:

define di_heating DOIF ([adjusting:actuator:d] < 10) (set heating off) DOELSE (set heating on)

Wie komme ich mit DOIF Device:Event an Urlaub ran?! also quasi an EVENTPART1

Also sowas hier in der Art...
["Kalenderview_Rene:today_\d\d\d_summary:.*] eq "Urlaub")
Wenn es dann kein Event mehr gibt, welches auf Urlaub passt, dann wäre das doch der DOELSE...

VG
René


Titel: Antw:Zeit und Ereignisgesteuertes DOIF
Beitrag von: Damian am 10 November 2020, 21:49:18
Zitat von: fireball am 10 November 2020, 21:34:59
Hi Damian,

sowas ähnliches hatte ich mir gedacht, ist das Event da... passt es, aber sonst nicht...
hast du für mich den entscheidenen Hinweis?
Das Ereignis ist ja :

2020-11-10 20:02:41 CALVIEW Kalenderview_Rene today_001_summary: Hans Geburtstag
2020-11-10 20:02:41 CALVIEW Kalenderview_Rene today_002_summary: Restmüll
2020-11-10 20:02:41 CALVIEW Kalenderview_Rene today_003_summary: Urlaub

Also entwender ich brauch ein ! passt nicht für meinen String

oder einen Stringvergleich... es funktioniert doch sowas hier mit Zahlen..

Es soll aus einem Reading, das z. B. ein Prozentzeichen beinhaltet, nur der Zahlenwert für den Vergleich genutzt werden:

define di_heating DOIF ([adjusting:actuator:d] < 10) (set heating off) DOELSE (set heating on)

Wie komme ich mit DOIF Device:Event an Urlaub ran?! also quasi an EVENTPART1

Also sowas hier in der Art...
["Kalenderview_Rene:today_\d\d\d_summary:.*] eq "Urlaub")
Wenn es dann kein Event mehr gibt, welches auf Urlaub passt, dann wäre das doch der DOELSE...

VG
René

In diesem Fall solltest du besser Readings abfragen, die kannst du auf Inhalt abfragen.

Das geht dann aber nicht mit Regex.

z. B. (Kalenderview_Rene:today_001_summary] eq "Hans Geburtstag")...

Titel: Antw:Zeit und Ereignisgesteuertes DOIF
Beitrag von: fireball am 10 November 2020, 22:06:29
Ok, aber ich brauch bei der Variante für die 3 Zahlen einen Platzhalter, sowas wie ein ddd oder ... Bei den regex.
Vg Rene
Titel: Antw:Zeit und Ereignisgesteuertes DOIF
Beitrag von: Damian am 10 November 2020, 22:15:41
Zitat von: fireball am 10 November 2020, 22:06:29
Ok, aber ich brauch bei der Variante für die 3 Zahlen einen Platzhalter, sowas wie ein ddd oder ... Bei den regex.
Vg Rene

Platzhalter ist ja bereits regex - das geht an der Stelle nicht.