Zeit und Ereignisgesteuertes DOIF

Begonnen von fireball, 05 November 2020, 21:05:22

Vorheriges Thema - Nächstes Thema

fireball

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é

amenomade

Ich würde mit
([16:00-22:00] and [BM_Garage04:luminance:d] < 100) (set Aussenbeleuchtung on) DOELSEIF ([22:00]) (set Aussenbeleuchtung off)probieren
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

fireball

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é


Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

fireball

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

fireball

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é
   


rabehd

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?
Auch funktionierende Lösungen kann man hinterfragen.

fireball

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é

Damian

#8
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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

fireball

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é



Damian

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

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

fireball

Ok, aber ich brauch bei der Variante für die 3 Zahlen einen Platzhalter, sowas wie ein ddd oder ... Bei den regex.
Vg Rene

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF