DOIF-Aussetzen nach erneutem Triggern möglich?

Begonnen von swsmily, 11 Oktober 2023, 21:41:19

Vorheriges Thema - Nächstes Thema

swsmily

Hallo,

Ich habe im Bad einen Bewegungsmelder der "open" sendet, wenn Bewegung erkannt wurde, und "closed", wenn eine Minute lang keine Bewegung mehr erkannt wurde.
Über ein DOIF wird ein HUE-Lightstripe entsprechend der Uhrzeit unterschiedlich gesteuert (Tagsüber hell, abends geringere Helligkeit, Nachts nur sehr gedimmt).
Das funktioniert auch an sich perfekt. Aber, wenn man auf dem stillen Örtchen sitzt, kann es schon vorkommen, dass man zu still sitzt und das Licht nach einer Minute aus geht. Man fängt dann an, kurz zu winken, um nicht im Dunkeln zu sitzen.

Meine Überlegung wäre daher, wenn der Bewegungsmelder innerhalb von z.b. 10 Sekunden, nachdem er "closed" gemeldet hat wieder "open" meldet, dass für 5 Minuten das Licht so bleibt, wie es im "open" - Status war, auch wenn der Bewegungsmelder wieder "closed" gesendet hat.

Mir fehlt leider nur der Ansatz, wie man das umsetzen kann.

Kurz gesagt, ich will wenn Bewegungsmelder "open" innerhalb nach 10 Sekunden "closed" meldet das DOIF für 5 Minuten pausiert, damit das Licht auch ohne Bewegung anbleibt.
Wie wäre sowas möglich?

Danke schön mal für eure Hilfe!

Per

#1
Du könntest das Alter des letzten Status abfragen
[?$SELF:sec] < 10
und davon den Case und damit das Wait abhängig machen.

frank

schalte doch einfach die lampe über den bm immer nur ein mit "on-for-timer 300".
also kein ausschalten über den bm. 
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

DL8EI Ralph

Zitat von: Per am 12 Oktober 2023, 00:05:07Du könntest das Alter des letzten Status abfragen
[?$SELF:sec] < 10
und davon den Case und damit das Wait abhängig machen.

Moin,
die Idee ist sicherlich gut, aber beurteilen kann ich das nicht wirklich, weil ich das leider nicht verstanden habe.
Solltest Du mal Zeit haben, dann kläre mich bitte auf und ich bitte um ein Beispiel. Von der Hiroglyphe hörte ich noch nie. Danke im voaus.
Fernmelde-Opa übernahm FHEM-Installation und kämpft sich so durch.
Installation hat FS20, Homematic und einge exotische Teile.

swsmily

Zitat von: frank am 12 Oktober 2023, 09:41:05schalte doch einfach die lampe über den bm immer nur ein mit "on-for-timer 300".
also kein ausschalten über den bm. 

genau das will ich nicht, denn dann würde das Licht ja auch ausschalten, wenn man sich längere Zeit im Bad bewegt, denn der Bewegungsmelder meldet nur einmal das "open".
Ebenso würde es unnötig lang an sein, wenn man nur kurz im Bad war.

Zitat von: DL8EI Ralph am 12 Oktober 2023, 10:47:54
Zitat von: Per am 12 Oktober 2023, 00:05:07Du könntest das Alter des letzten Status abfragen
[?$SELF:sec] < 10
und davon den Case und damit das Wait abhängig machen.

Moin,
die Idee ist sicherlich gut, aber beurteilen kann ich das nicht wirklich, weil ich das leider nicht verstanden habe.
Solltest Du mal Zeit haben, dann kläre mich bitte auf und ich bitte um ein Beispiel. Von der Hiroglyphe hörte ich noch nie. Danke im voaus.

Das verstehe ich tatsächlich auch nicht wirklich.


Ich hab mir heute über den Tag überlegt, ein DOIF zu bauen, welches den Readings-Timestamp vom Bewegungsmelder in ein extra Reading schreibt, wenn er closed meldet. Wir open gemeldet, vergleicht das DOIF den aktuellen Zeitstempel mit dem vorher gespeicherten. Dann könnte dieses DOIF das eigentliche LICHT-DOIF deaktivieren und nach 5 Minuten wieder aktivieren und set checkall setzen.

Werde mich melden, wenn ich es so umgesetzt habe und es funktioniert. Bin aber für andere/schönere/bessere Lösungen auch offen  ;D

Damian

Zeig doch mal deine bisherige Definition.

Angelehnt an das Beispiel aus der Commandref zu DOIF:

ZitatDie Nachbildung eines on-for-timers lässt sich wie folgt realisieren:


define di_on_for_timer ([Bewegungsmelder:"open"])
(set light on)
(set light off)
attr di_on_for_timer do resetwait
attr di_on_for_timer wait 0,600

Bedeutet: Beim Event "open" wird das Licht immer auf 5 Minuten verlängert.

Es macht für mich wenig Sinn das nur innerhalb der ersten 10 Sekunden zu tun - du weißt doch gar nicht wie lange die Sitzung dauern wird :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

swsmily

Zitat von: Damian am 12 Oktober 2023, 21:59:21Zeig doch mal deine bisherige Definition.

############## Automatiksteuerung ANFANG
######## bei Bewegung
#### CMD 1 : HELL -- 08:00 bis 20:45 oder Tag(Dämmerung 6)
(
([Bewegungsmelder_Bad:state] eq "open") and
([Badlicht] eq "auto") and
(([?Daemmerung:state] >= "4" and [?Daemmerung:state] <= "8" ) or ([08:00 - 20:45]))
)
## Hell
(
IF ([HUE_Bad:effect] eq "colorloop")
(set HUE_Bad effect none),
set HUE_Bad rgb FFE0C1 : transitiontime 5
)


#### CMD 2 : MITTEL -- 20:45 bis 08:00 - Dekolicht an
DOELSEIF (
([Bewegungsmelder_Bad:state] eq "open") and
([Badlicht] eq "auto") and
([?Dekolicht] eq "on") and
(([?Daemmerung:state] >= "9" or [?Daemmerung:state] <= "3") and ([?20:45 - 08:00]))
)
## Türkis
(
IF ([HUE_Bad:effect] eq "colorloop")
(set HUE_Bad effect none),
set HUE_Bad rgb 3E5894
)


#### CMD 3 : DUNKEL -- 20:45 bis 08:00 - Dekolicht aus
DOELSEIF (
([Bewegungsmelder_Bad:state] eq "open") and
([Badlicht] eq "auto") and
([?Dekolicht] eq "off") and
(([?Daemmerung:state] >= "9" or [?Daemmerung:state] <= "3") and ([?20:45 - 08:00]))
)
## dunkel
(
IF ([HUE_Bad:effect] eq "colorloop")
(set HUE_Bad effect none),
set HUE_Bad rgb 141617
)


######## keine Bewegung
#### CMD 4 : AUS - Dekolicht aus
DOELSEIF (
([Bewegungsmelder_Bad:state] eq "closed") and
([Dekolicht] eq "off") and
([Badlicht] eq "auto")
)
## Ausschalten
(
## Ausschalten
(
IF ([HUE_Bad:effect] eq "colorloop")
(set HUE_Bad effect none),
set HUE_Bad rgb 000000 : transitiontime 50
)


#### CMD 5 : AUS - Dekolicht an
DOELSEIF (
([Bewegungsmelder_Bad:state] eq "closed") and
([Dekolicht] eq "on") and
([Badlicht] eq "auto")
)
## Ausschalten
(
IF ([HUE_Bad:effect] eq "colorloop")
(set HUE_Bad effect none),
set HUE_Bad rgb 000000 : transitiontime 50
)

################ Automatiksteuerung ENDE

weitere CMDs gibts noch, wenn der Dummy Badlicht auf Hell oder ähnliches gestellt wird. Dann wird aber die Automatik über den Bewegungsmelder ignoriert.
Zitat von: Damian am 12 Oktober 2023, 21:59:21Bedeutet: Beim Event "open" wird das Licht immer auf 5 Minuten verlängert.

Das Event "open" kommt nur bei der ersten erkannten Bewegung. Closed erst eine Minute später, wenn keine Bewegung mehr erkannt wurde. Das ist im Grunde auch vollkommen ausreichend, wenn man nur mal kurz im Bad ist. Ich verstehe das on-for-timer so, dass es immer mindestens 5 Minuten an wäre. Selbst wenn ich nur kurz rein und raus gehe. Würde ich aber 10 Minuten im Bad tanzen, sendet der Bewegungsmelder in der ganzen Zeit kein erneutes open - also wäre ja nach 5 Minuten (durch das on-for-timer) das Licht aus.


Zitat von: Damian am 12 Oktober 2023, 21:59:21Es macht für mich wenig Sinn das nur innerhalb der ersten 10 Sekunden zu tun - du weißt doch gar nicht wie lange die Sitzung dauern wird :)

Genau deshalb versuche ich eine Lösung zu bauen. Man beginnt die "Sitzung", bewegt sich zu wenig innerhalb der einen Minute --> Bewegungsmelder sendet "closed". Da das Licht dunkler wird (wird langsam auf 0 gedimmt), bewegt man sich genug --> Licht wird wieder hell. Genau ab dem Moment will ich die Automatik für 5 Minuten aussetzen.
Also ja, es wird weiter passieren, dass einmalig nach einer Minute das Licht beginnt Richtung 0 zu dimmen, wird dann aber innerhalb von 10 Sekunden (durch Winken oder ähnliches) der Bewegungsmelder erneut ausgelöst und sendet open, dann soll die Automatik kurzzeitg ausgesetzt werden.

swsmily

Hier meine Lösung, mal sehen, wie sie auf Dauer funktioniert:

([Bewegungsmelder_Bad:state] eq "closed" and [Badlicht] eq "auto" and [?Bad_Zustand_halten:Zustand_halten] eq "off")
({ fhem 'setreading Bad_Zustand_halten closedwann ' .time_str2num(ReadingsTimestamp('Bewegungsmelder_Bad','state','0'))})


DOELSEIF ([Bewegungsmelder_Bad:state] eq "closed" and [Badlicht] eq "auto" and [?Bad_Zustand_halten:Zustand_halten] eq "on")
({ fhem 'setreading Bad_Zustand_halten closedwann ' .time_str2num(ReadingsTimestamp('Bewegungsmelder_Bad','state','0'))})
(set Badlicht_schalten enable)
(set Badlicht_schalten checkall)
(setreading Bad_Zustand_halten Zustand_halten off)



DOELSEIF ([Bewegungsmelder_Bad:state] eq "open" and [Badlicht] eq "auto")
({ fhem 'setreading Bad_Zustand_halten openwann ' .time_str2num(ReadingsTimestamp('Bewegungsmelder_Bad','state','0'))})
(setreading Bad_Zustand_halten opennach {([Bad_Zustand_halten:openwann] - [Bad_Zustand_halten:closedwann])})

(IF ([Bad_Zustand_halten:opennach] <= 10)
(
setreading Bad_Zustand_halten Zustand_halten on,
set Badlicht_schalten disable
))


DOELSEIF ([Badlicht] ne "auto" and [?Bad_Zustand_halten:Zustand_halten] eq "on")
(set Badlicht_schalten enable)
(set Badlicht_schalten checkall)
(setreading Bad_Zustand_halten Zustand_halten off)
dazu folgendes Attribut wait:
0:0,300,1,1:0,2

Per

Jetzt habe ich wieder einen PC, am Handy hatte ich dafür keine Lust.
Beispiel mit :sec

([Bewegungsmelder_Bad:state] eq "closed" and [Badlicht] eq "auto" and [?$SELF:sec] < 10)
(set Badlicht an)
(set Badlicht aus)
DOELSEIF ([Bewegungsmelder_Bad:state] eq "closed" and [Badlicht] eq "auto" and [?$SELF:sec] >= 10)
(set Badlicht an)
(set Badlicht aus)
attr wait 60:300

Plan B (da du die Lampen direkt steuerst): kurzes Flackern (reicht ja eine Farbe, dann sitzt man nicht im Dunklen) vor dem Ausschalten (wie beim Treppenlicht), und wenn in diesem Status eine Bewegung erkannt wird -> 5 min Timer (re)starten.

swsmily

Zitat von: Per am 15 Oktober 2023, 15:10:08Beispiel mit :sec

Danke für das Beispiel. Ausprobiert habe ich es noch nicht, aber so wie ich es verstehe würde, das Licht letzendlich dennoch in beiden Fällen immer ausgehen, da an und aus direkt nacheinander ausgeführt werden. Muss aber zugeben, :sec kannte ich bisher nicht und werde ich mal mit Dummys testen, um die Funktionsweise richtig zu verstehen.

Zitat von: Per am 15 Oktober 2023, 15:10:08Plan B (da du die Lampen direkt steuerst): kurzes Flackern (reicht ja eine Farbe, dann sitzt man nicht im Dunklen) vor dem Ausschalten (wie beim Treppenlicht), und wenn in diesem Status eine Bewegung erkannt wird -> 5 min Timer (re)starten.

So ähnlich hab ich es mit meiner Lösung umgesetzt. Da das Licht bei "closed" immer langsam runterdimmt (set HUE_Bad rgb 000000 : transitiontime 50 - bewirkt dass vom IST-Licht zu aus 5 Sekunden vergehen), bemerkt man es bevor man im Dunkeln sitzt.

Das ist meine aktuelle Lösung, mit einem zusätzlich IF drin, welches 90 Sekunden nach dem letzten "closed" das "Zustand halten" wieder deaktiviert und damit das eigentliche Badlicht_steuern-DOIF wieder aktiviert.
([Bewegungsmelder_Bad:state] eq "closed" and [Badlicht] eq "auto" and [?Bad_Zustand_halten:Zustand_halten] eq "off")
({ fhem 'setreading Bad_Zustand_halten closedwann ' .time_str2num(ReadingsTimestamp('Bewegungsmelder_Bad','state','0'))})


DOELSEIF ([Bewegungsmelder_Bad:state] eq "closed" and [Badlicht] eq "auto" and [?Bad_Zustand_halten:Zustand_halten] eq "on")
({ fhem 'setreading Bad_Zustand_halten closedwann ' .time_str2num(ReadingsTimestamp('Bewegungsmelder_Bad','state','0'))})
(set Badlicht_schalten enable)
(set Badlicht_schalten checkall)
(setreading Bad_Zustand_halten Zustand_halten off)



DOELSEIF ([Bewegungsmelder_Bad:state] eq "open" and [Badlicht] eq "auto")
({ fhem 'setreading Bad_Zustand_halten openwann ' .time_str2num(ReadingsTimestamp('Bewegungsmelder_Bad','state','0'))})
(setreading Bad_Zustand_halten opennach {([Bad_Zustand_halten:openwann] - [Bad_Zustand_halten:closedwann])})

(IF ([Bad_Zustand_halten:opennach] <= 10)
(
setreading Bad_Zustand_halten Zustand_halten on,
set Badlicht_schalten disable
)
)

(IF ([Bad_Zustand_halten:opennach] > 90)
(
(set Badlicht_schalten enable)
(set Badlicht_schalten checkall)
(setreading Bad_Zustand_halten Zustand_halten off)
)
)

DOELSEIF ([Badlicht] ne "auto" and [?Bad_Zustand_halten:Zustand_halten] eq "on")
(set Badlicht_schalten enable)
(set Badlicht_schalten checkall)
(setreading Bad_Zustand_halten Zustand_halten off)

attr Bad_Zustand_halten wait 0:0,300,1,1:0,2

Übers Wochenende hat es gut funktioniert (natürlich auch mal bewusst ruhig gesessen, damit der Bewegungsmelder "closed" meldet). Licht dunkelte nach einer Minute langsam ab --> man winkt kurz --> Licht wurde wieder hell --> bisschen was im Handy gelesen und auch FHEM-Status kontrolliert --> Licht blieb auf dem aktuellen Status, auch wenn Bewegungsmelder bereits wieder "closed" gemeldet hat.

Bin damit sehr zufrieden. Und ich danke euch für eure Unterstützung!