[gelöst] DOIF und on-for-timer

Begonnen von tndx, 01 August 2019, 11:45:30

Vorheriges Thema - Nächstes Thema

tndx

Guten Morgen,

leider bekomme ich meine präsenzmeldergesteuerte Beleuchtung nicht mittels DOIF ans laufen.

Ich habe folgenden Ausdruck der auch grundsätzlich funktioniert. Die Erwartungshaltung wäre, dass wenn die Bedingung erfüllt is und die Aktion ausgeführt wurde, alle 55s geschaut wird, ob die Bedingung noch erfüllt ist und dann die Aktion einmalig ausgeführt wird u.s.w.:

DOIF ([GWC_Pres:1.PRESENCE_DETECTION_STATE] eq "yes" and ([GWC_Pres:1.ILLUMINATION] < 11 or [GWC_Licht_Decke] eq "on")) (set GWC_Licht_Decke on-for-timer 60)

Ich habe versucht, mit unterschiedlichen Kombination aus "do:always", "repeatcmd:55" oder "cmdpause:55", den Ausdruck zu optimieren, bin aber zu keinem zufriedenstellenden Ergebnis gekommen.

Das Problem dabei ist, dass entweder der Funkverkehr explodiert, indem die Aktion mehrfach in der Sekunde ausgeführt wird, der Ausführungsteil gar nicht verlassen wird, oder die Aktion schlicht gar nicht ausgeführt wird.

Ich habe mir zwar sowohl die CommandRef und die Beispiele darin als auch einige Forumsbeiträge angeschaut, aber irgendwas ist immer im Detail anders, so dass es am Ende nie ganz zu meiner Aufgabenstellung passt.  :(

Danke im Voraus.

Otto123

Hi,

ich versteh die Aufgabe nicht richtig, aber ich vermute mal was:
defmod di_Flurlicht DOIF ([PIR1:"motion:.on"] and (!isday("REAL")?1:0 or [?PIRWg:brightness] < 130)) (set SW01_Sw01 on)(set SW01_Sw01 off)
attr di_Flurlicht do resetwait
attr di_Flurlicht room Flur
attr di_Flurlicht wait 0,180

Der motion Sensor liefert frühestens nach 120 sec ein erneutes motion on. Damit wird also solange im Bereich Bewegung ist das Licht an sein.

Warum willst Du alle 55 sec schauen ob PRESENCE ist? Liefern die Geräte keine Events? Also eventuell auch einfach DOIF () (Licht an) DOELSE (Lich aus) ?

on-for-timer ist für "nachtriggern" eigentlich nicht so schick. Ich bin nicht sicher ob das ohne "Lücke" funktioniert.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Per

Zitat von: Otto123 am 01 August 2019, 12:48:01!isday("REAL")?1:0
Ist das nicht doppeltgemoppelt?

@tndx: Zuerst musst du heraus bekommen, wie dein PRESENCE Device meldet, an und aus oder nur an für die Dauer der Bewegung.
Danach richtet sich der Rest.

Otto123

Zitat von: Per am 01 August 2019, 14:04:17
Ist das nicht doppeltgemoppelt?
Vielleicht, ich hatte mal ein Problem damit, dass derzeit {!isday("REAL")}nichts liefert. :)
Dann hatte ich so eine Diskussion über boolsche Vergleiche gelesen ...
Seit dem mach ich es so :)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

tndx

Hi Otto,

Zitat von: Otto123 am 01 August 2019, 12:48:01
Warum willst Du alle 55 sec schauen ob PRESENCE ist? Liefern die Geräte keine Events? Also eventuell auch einfach DOIF () (Licht an) DOELSE (Lich aus) ?

on-for-timer ist für "nachtriggern" eigentlich nicht so schick. Ich bin nicht sicher ob das ohne "Lücke" funktioniert.

der Präsenzmelder reagiert zwar auch auf kleine Bewegungen, aber wenn man ganz regungslos im Raum ist, kann er auch sagen PRESENCE:no, deswegen kommt "DOELSE (Lich aus)" nicht in Frage. Deswegen lasse ich das Licht grundsätzlich 60 s an und möchte vor Ablauf dieser 60s (= 55s) prüfen, ob PRESENCE:yes ist. Nachtriggern mit "on-for-timer" funktioniert ganz wunderbar ohne Lücke, nur passiert das im Moment entweder zu häufig oder gar nicht.

Mir ist klar, dass viele Wege nach Rom führen, aber gibt es für die Art, wie ich das lösen wollte, eine Lösung?

rabehd

Ich würde mal bei PRESENCE anfangen.
Was setzt PRESENCE auf yes und was auf no?
Wird es geupdatet (und löst einen  event aus)?
Auch funktionierende Lösungen kann man hinterfragen.

Otto123

#6
Präsenz eventuell "glätten"? Ich mache das mit meiner Anwesenheit so:
Abgewandelt :)
defmod di_Dev_Otto DOIF ([st_Dev_Otto] eq "absent")(set Lampe off) DOELSEIF ([st_Dev_Otto] eq "present")(set Lampe on)
attr di_Dev_Otto wait 300

Lampe brennt bei present sofort für mindestens 5 min.
Das wiederholte Einschalten bei an könntest Du mit set Lampe:FILTER=state!=on on verhindern.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

tndx

Zitat von: Otto123 am 01 August 2019, 16:02:13
Lampe brennt bei present sofort für mindestens 5 min.

Ich interpretiere das so:
- ist st_Dev_Otto "absent", schalte das Licht in 5 Minuten aus
- ist st_Dev_Otto "present", schalte das Licht sofort ein

was passiert in den 5 Minuten, in denen die Befehlsausführung von dem DOIF-Zweig verzögert wird, wird da geschaut, ob die Bedingung noch erfüllt ist und andernfalls in den DOELSEIF-Zweig gesprungen? Oder wird erst das Licht ausgeschaltet und dann wieder nach der Bedingung geschaut? Letzteres würde bei längerer Anwesenheit mit zwischendurch erkannter Abwesenheit "ein Licht aus / Licht an" bedeuten, und das möchte ich vermeiden.

Zitat von: rabehd am 01 August 2019, 15:39:45
Was setzt PRESENCE auf yes und was auf no?
Wird es geupdatet (und löst einen  event aus)?

Das ist ein Präsenzmelder (HMIP-SMI), der, wie gesagt, bei völliger Bewegungslosigkeit auf PRESENCE=no schaltet, und das möchte ich ausfiltern.


Unabhängig von der inhaltlichen Aufgabenstellung: wie unterbreche ich ein DOIF für eine Zeit X? Nicht die Befehlsausführung in einem bestimmten Zweig, sondern den ganzen DOIF-Konstrukt? Wie gesagt, mit der CommandRef bin ich nicht schlau (genug) geworden.

Otto123

#8
Zitat von: tndx am 01 August 2019, 19:49:53
was passiert in den 5 Minuten, in denen die Befehlsausführung von dem DOIF-Zweig verzögert wird, wird da geschaut, ob die Bedingung noch erfüllt ist und andernfalls in den DOELSEIF-Zweig gesprungen? Oder wird erst das Licht ausgeschaltet und dann wieder nach der Bedingung geschaut? Letzteres würde bei längerer Anwesenheit mit zwischendurch erkannter Abwesenheit "ein Licht aus / Licht an" bedeuten, und das möchte ich vermeiden.
Warum sollte das denn passieren? Dann wäre ich ja immer kurz offline  :)
Wenn während der 5 min ein Wechsel stattfindet passiert nach außen nichts, der Zustand wechselt und es wird wiederholt cmd_2 ausgeführt.
Funktioniert bei mir einwandfrei. Allerdings keine Lampe sondern nur ein dummy von dem weitere Strukturen abhängen.
Zitat Doku
ZitatEine bereits ausgelöste Verzögerung wird zurückgesetzt, wenn während der Wartezeit ein Kommando eines anderen DO-Falls, ausgelöst durch ein neues Ereignis, ausgeführt werden soll.

Zitat von: tndx am 01 August 2019, 19:49:53
Unabhängig von der inhaltlichen Aufgabenstellung: wie unterbreche ich ein DOIF für eine Zeit X? Nicht die Befehlsausführung in einem bestimmten Zweig, sondern den ganzen DOIF-Konstrukt? Wie gesagt, mit der CommandRef bin ich nicht schlau (genug) geworden.
Das ist relativ unspezifisch gefragt, es gibt set <> disable/enable. Da DOIF kein disabledForIntervals hat, müsstest Du das glaub ich mit einem zweiten Gerät machen. Ich glaub dazu gab es schon mal eine Diskussion.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

tndx

#9
Zitat von: Otto123 am 01 August 2019, 23:37:25
Zitat Doku [...]

OK, damit hast Du mich überzeugt. Dieser Satz ist mir bei der Fülle an Information bis jetzt verborgen geblieben... Werde es so bei Gelegenheit testen.

Vielen Dank!

Edit: Habe es nun ausprobiert, funktioniert exakt so, wie ich es ursprünglich haben wollte, wenn auch ohne "on-for timer" :)

Danke nochmal!