[gelöst] Verlängerter Licht toggle mit PIR Sensor und Zwangsaus

Begonnen von holle75, 30 März 2024, 20:23:56

Vorheriges Thema - Nächstes Thema

holle75

Ist es zu einfach oder ich zu bl...?

Wollte ganz kurz mal was basteln:

define ZirkusOben_Bad_Licht_DOIF DOIF ([ZirkusOben_TASTER_Bad_Links:press_short] >= 0) (set ZirkusOben_LICHT_Bad_Spiegel toggle) (set ZirkusOben_LICHT_Bad_Spiegel off)
attr ZirkusOben_Bad_Licht_DOIF do always
attr ZirkusOben_Bad_Licht_DOIF wait 0:600

Taster soll an oder ausschalten (Toggle, weil andere Automatismen vorher schon einen Zustand hervorgerufen haben könnten, deswegen kein An/Aus). Falls an, nach spätestens 10 Minuten aus.
Das Licht schaltet für den Bruchteil einer Sekunde an und sofort wieder aus. Verstehe ich nicht.
Event Monitor beobachtet und da kommt brav bei einmal tastern EIN Event ala

2024-03-30 20:10:23 HM485 ZirkusOben_TASTER_Bad_Links press_short: 11
2024-03-30 20:10:23 HM485 ZirkusOben_TASTER_Bad_Links press_short_11
2024-03-30 20:11:26 HM485 ZirkusOben_TASTER_Bad_Links press_short: 12
2024-03-30 20:11:26 HM485 ZirkusOben_TASTER_Bad_Links press_short_12

Das "press_short_12" als Beispiel mit Underscore sollte nicht triggern (weil dann würde ich verstehen, warum das Licht gleich wieder ausgeht).
Ich habe die Kombi wait und do always noch nirgendwo verwendet. Hängts da?


Jemand eine Idee?

Damian

statt Doppelpunkt ein Komma beim wait setzen
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

Oh Boy ...

Gedankt sei deinen Argusaugen, Damian.

holle75

... mmmh, interessanterweise läuft das DOIF trotzdem ins wait und lässt sich dann auch nicht dazu bewegen, do always cmd_1.1 erneut auszuführen.

Per

Was, wenn
Zitat von: holle75 am 30 März 2024, 20:23:56andere Automatismen
in den 10 min zuschlagen?

Es ist empfehlenswert, alle Mechanismen für ein Ausgabedevice zusammenzufassen, zumal DOIF das ermöglicht.

Damian

Zitat von: holle75 am 30 März 2024, 22:53:50... mmmh, interessanterweise läuft das DOIF trotzdem ins wait und lässt sich dann auch nicht dazu bewegen, do always cmd_1.1 erneut auszuführen.

Wenn ein Zweig begonnen hat, kann er vorzeitig nur durch einen anderen Zweig beendet werden
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

Danke euch, mmh, da gebt ihr mir eine Aufgabe. Per hat Recht, Damian hat mein Problem bestätigt, wie ich jetzt aber die neue Aufgabenstellung als Kombi löse, fällt mir gerade ein wenig schwer.

define ZirkusOben_PIR13_Licht_DOIF DOIF ([ZirkusOben_TASTER_PIR:state] =~ "press" and [?Wetterstation:luminosity] < 13000 and ([?ZirkusOben_LICHT_Bad_Spiegel] eq "off" or [?$SELF:cmd] eq "1.1") and [?$SELF:cmd] ne "2.1") (set ZirkusOben_LICHT_Bad_Spiegel on) (set ZirkusOben_LICHT_Bad_Spiegel off) \
DOELSEIF (["ZirkusOben_TASTER_Bad_Links:press_short"]) () ()
attr ZirkusOben_PIR13_Licht_DOIF do resetwait
attr ZirkusOben_PIR13_Licht_DOIF wait 0,600:0,45

Das ist das DOIF welches bei entsprechender Dunkelheit und Bewegung das Licht einschaltet und nach einer Weile, wenn nicht weiter Bewegung, wieder ausschaltet. Unterbrechen kann ich das Ganze auch manuell, indem ich einen Taster betätige.

Da mein Mädchen der Meinung ist, tagsüber solle auch Licht sein und dementsprechend den Taster betätigt, aber generell "vergisst" das manuell angeschaltete Licht auch wieder auszuschalten, will ich einen Zwangsstop einbauen.... ohne den Rest der Logik zu verlieren.

define ZirkusOben_Bad_Licht_DOIF DOIF ([ZirkusOben_TASTER_Bad_Links:press_short] >= 0) (set ZirkusOben_LICHT_Bad_Spiegel toggle) (set ZirkusOben_LICHT_Bad_Spiegel off)
attr ZirkusOben_Bad_Licht_DOIF do always
attr ZirkusOben_Bad_Licht_DOIF wait 0:600

Deswegen habe ich das zweite DOIF addiert (welches nicht das tut was ich gerne hätte).

Das jetzt zu kombinieren, fällt mir schwer. do resetwait für das zweite DOIF habe ich auch mal probiert, aber ja, es macht "nur" wie Damian es beschreibt.

Eingebungen von euch?

Per

Kannst du den Status der Lichtaktoren nicht abfragen?

holle75

#8
Guten Morgen Per,

define ZirkusOben_PIR13_Licht_DOIF DOIF ([ZirkusOben_TASTER_PIR:state] =~ "press" and [?Wetterstation:luminosity] < 13000 and ([?ZirkusOben_LICHT_Bad_Spiegel] eq "off" or [?$SELF:cmd] eq "1.1") and [?$SELF:cmd] ne "2.1") (set ZirkusOben_LICHT_Bad_Spiegel on) (set ZirkusOben_LICHT_Bad_Spiegel off) \
DOELSEIF (["ZirkusOben_TASTER_Bad_Links:press_short"]) () ()
attr ZirkusOben_PIR13_Licht_DOIF do resetwait
attr ZirkusOben_PIR13_Licht_DOIF wait 0,600:0,45

das ist der Lichtaktor:
[?ZirkusOben_LICHT_Bad_Spiegel] eq "off"oder ich verstehe deine Frage falsch?

der Bewegungsmelder ist das:
[ZirkusOben_TASTER_PIR:state] =~ "press" und gibt regelmäßig events so lange man sich bewegt 

Das UrsprungsDOIF ist recht smart (meine Damian hat mir vor Jahren dabei geholfen). Licht schaltet an (wenn dunkel genug) so lange man sich bewegt, die Verlängerung kann mit dem Taster unterbrochen werden ... und dann wird das Wiederanschalten für 45 Sekunden verhindert (das, weil sonst die Bewegung cmd_1.1 sofort wieder triggern würde, da man sich ja noch immer im Bad bewegt).

Meine primäre Herausforderung ist, wie ich überhaupt die zusätzliche Idee umsetzen könnte. Auch separat. Sekundär, wie ich es ins UrsprungsDOIF einarbeite.
Da mein Mädchen der Meinung ist, tagsüber solle auch Licht sein und dementsprechend den Taster betätigt,
aber generell "vergisst" das manuell angeschaltete Licht auch wieder auszuschalten, will ich einen Zwangsstop einbauen
.... ohne den Rest der Logik zu verlieren.

EDIT:

mmh, fies, es gibt noch ein notify welches stumpf bei Tasterdruck toggelt. Nur mit dem Wissen von diesem ergibt das was ich schreibe Sinn ;) ... entschuldigung
define ZirkusOben_NOTIFY_Bad_Spiegel_Licht notify (ZirkusOben_TASTER_Bad_Links:press_short:.*) set ZirkusOben_LICHT_Bad_Spiegel toggle
daraus habe ich jetzt temporär ein DOIF gemacht (was ich eben gerne der Idee entsprechend umändern oder integrieren möchte)
define ZirkusOben_Bad_Licht_DOIF DOIF (["ZirkusOben_TASTER_Bad_Links:press_short"]) (set ZirkusOben_LICHT_Bad_Spiegel toggle)
attr ZirkusOben_Bad_Licht_DOIF do always


holle75

#9
Wie kann es passieren, dass dieser Thread geschlossen war? Muss ich das verbockt haben, oder ....

Keiner eine Idee? War ich doch nicht zu blöd, sondern die Frage gar nicht sooo unkomplex ;)

holle75

#10
irgendwie erscheint mir das overkill (ungalant), aber was Besseres fällt mir nicht ein und sollte (mal die Tage verfolgen) funktionieren:

define ZirkusOben_PIR13_Licht_DOIF DOIF ([ZirkusOben_TASTER_PIR:state] =~ "press" and [?Wetterstation:luminosity] < 13000 and ([?ZirkusOben_LICHT_Bad_Spiegel] eq "off" or [?$SELF:cmd] eq "1.1") and [?$SELF:cmd] ne "2.1") (set ZirkusOben_LICHT_Bad_Spiegel on) (set ZirkusOben_LICHT_Bad_Spiegel off) \
DOELSEIF (["ZirkusOben_TASTER_Bad_Links:press_short"]) () ()
setuuid ZirkusOben_PIR13_Licht_DOIF 5cc5cdcb-f33f-6bb4-b241-ea54df6dc7619b2d
attr ZirkusOben_PIR13_Licht_DOIF do resetwait
attr ZirkusOben_PIR13_Licht_DOIF wait 0,600:0,45

define ZirkusOben_Bad_Licht_DOIF DOIF (["ZirkusOben_TASTER_Bad_Links:press_short"]) (set ZirkusOben_LICHT_Bad_Spiegel toggle) \
DOELSEIF ([ZirkusOben_LICHT_Bad_Spiegel] eq "on" and [?ZirkusOben_PIR13_Licht_DOIF:cmd] ne "1.1") (set ZirkusOben_LICHT_Bad_Spiegel off)
attr ZirkusOben_Bad_Licht_DOIF do always
attr ZirkusOben_Bad_Licht_DOIF selftrigger all
attr ZirkusOben_Bad_Licht_DOIF wait 0:900