GELÖST DOIF / Bewegungsmelder in Kombi mit manuellem Schalter / kniffelige Logik

Begonnen von holle75, 20 September 2015, 09:37:32

Vorheriges Thema - Nächstes Thema

holle75

Yeees, das Geht! Dankeschön.

define Container_BEWEGUNGSMELDER_Zeitschalter DOIF ([Container_BEWEGUNGSMELDER:?motion] and [?Container_BEWEGUNGSMELDER:brightness] < 120 and [?Anwesenheit:state] eq "present" and ([?Container_LICHT_Aussen_Strahler:state] eq "off" or [?Container_BEWEGUNGSMELDER_Zeitschalter] eq "cmd_1_1")) (set Container_LICHT_Aussen_Strahler on) (set Container_LICHT_Aussen_Strahler off)
attr Container_BEWEGUNGSMELDER_Zeitschalter do resetwait
attr Container_BEWEGUNGSMELDER_Zeitschalter wait 0,180
attr Container_BEWEGUNGSMELDER_Zeitschalter room Anwesenheit
attr Container_BEWEGUNGSMELDER_Zeitschalter group Zeitschalter
attr Container_BEWEGUNGSMELDER_Zeitschalter initialize initialized


... verlängern der Wait_time plus/trotz Vorhercheck ob die Lampe an ist funktioniert vorzüglich. Wenn du mir jetzt noch einen Tip geben kannst, wie ich bei Betätigen des Schalters das DOIF abbrechen kann um das Ausschalten (wenn noch in der Wait_Time der Schalter betätigt wird) zu verhindern ....? Also ein Reset/Abbruch des DOIF´s egal wo es gerade steckt. Dachte mal mit Initialize würde das gehen, aber wenn ich die commandref richtig verstanden habe, behält das DOIF dann die Timer.

Danke und Gruß

H.

Damian

Zitat von: holle75 am 20 September 2015, 19:24:44
Yeees, das Geht! Dankeschön.

define Container_BEWEGUNGSMELDER_Zeitschalter DOIF ([Container_BEWEGUNGSMELDER:?motion] and [?Container_BEWEGUNGSMELDER:brightness] < 120 and [?Anwesenheit:state] eq "present" and ([?Container_LICHT_Aussen_Strahler:state] eq "off" or [?Container_BEWEGUNGSMELDER_Zeitschalter] eq "cmd_1_1")) (set Container_LICHT_Aussen_Strahler on) (set Container_LICHT_Aussen_Strahler off)
attr Container_BEWEGUNGSMELDER_Zeitschalter do resetwait
attr Container_BEWEGUNGSMELDER_Zeitschalter wait 0,180
attr Container_BEWEGUNGSMELDER_Zeitschalter room Anwesenheit
attr Container_BEWEGUNGSMELDER_Zeitschalter group Zeitschalter
attr Container_BEWEGUNGSMELDER_Zeitschalter initialize initialized


... verlängern der Wait_time plus/trotz Vorhercheck ob die Lampe an ist funktioniert vorzüglich. Wenn du mir jetzt noch einen Tip geben kannst, wie ich bei Betätigen des Schalters das DOIF abbrechen kann um das Ausschalten (wenn noch in der Wait_Time der Schalter betätigt wird) zu verhindern ....? Also ein Reset/Abbruch des DOIF´s egal wo es gerade steckt. Dachte mal mit Initialize würde das gehen, aber wenn ich die commandref richtig verstanden habe, behält das DOIF dann die Timer.

Danke und Gruß

H.

Das ist einfach, du musst einen weiteren Zweig mit DOELSEIF ohne Ausführungsteil einfügen:

... DOELSEIF ([Taster] eq "on")

Aber bedenke, dass solange das Licht an ist, dein DOIF ja außer Gefecht gesetzt ist, bis du das Licht, wie auch immer, wieder ausschaltest.


Gruß

Damian

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

holle75

Wie eine EINS. Vielen Dank Damian!

define Container_BEWEGUNGSMELDER_Zeitschalter DOIF ([Container_BEWEGUNGSMELDER:?motion] and [?Container_BEWEGUNGSMELDER:brightness] < 120 and [?Anwesenheit:state] eq "present" and ([?Container_LICHT_Aussen_Strahler:state] eq "off" or [?Container_BEWEGUNGSMELDER_Zeitschalter] eq "cmd_1_1")) (set Container_LICHT_Aussen_Strahler on) (set Container_LICHT_Aussen_Strahler off) DOELSEIF ([Container_TASTER_links] =~ "press_short")
attr Container_BEWEGUNGSMELDER_Zeitschalter do resetwait
attr Container_BEWEGUNGSMELDER_Zeitschalter wait 0,180
attr Container_BEWEGUNGSMELDER_Zeitschalter room Anwesenheit
attr Container_BEWEGUNGSMELDER_Zeitschalter group Zeitschalter
attr Container_BEWEGUNGSMELDER_Zeitschalter initialize initialized

Mumpitz

Hallo zusammen

ich hoffe es ist nicht unhöflich wenn ich einen als gelöst markierten Thread nochmals aufmache und nochmals eine Frage dazu stelle:
Ich habe die genau gleichen Anforderungen an den Beweungsmeldet wie holle75. Allerdings habe ich als Taster, mit welchem ich die Lampe einschalten kann, keinen Homematic Taster, sondern einen normalen Homematic Schaltaktor

ich habe bis jetzt definiert:

([Bewegungsmelder_OG:?motion] and [Rollladen_Galerie] eq "ab" and ([?Licht_Esszimmer:state] eq "off" or [?Bewegungsmelder_OG] eq "cmd_1_1")) (set Licht_Esszimmer on)(set Licht_Esszimmer off)

do resetwait
initialize initialized
wait 0,180


ich möchte nun, wenn ich den Lichtschalter in dieser Zeit manuell Drücke, der per DOIF programmierte on for timer von 20 minuten ausgelöst wird...

ist verständlich was ich möchte?

CoolTux

Aus der Commandref


Zitat
Sollen Verzögerungen innerhalb von Befehlsfolgen stattfinden, so müssen diese Komandos in eigene Klammern gesetzt werden, das Modul arbeitet dann mit Zwischenzuständen.

Beispiel: Bei einer Befehlssequenz, hier: (set lamp1 on, set lamp2 on), soll vor dem Schalten von lamp2 eine Verzögerung von einer Sekunde stattfinden. Die Befehlsfolge muss zunächst mit Hilfe von Klammerblöcke aufgespaltet werden: (set lamp1 on)(set lamp2 on). Nun kann mit dem wait-Attribut nicht nur für den Beginn der Sequenz, sondern für jeden Klammerblock eine Verzögerung, getrennt mit Komma, definieren werden, hier also: wait 0,1. Damit wird lamp1 sofort, lamp2 nach einer Sekunden geschaltet.

Beispieldefinition bei mehreren DO-Blöcken mit mehreren Sequenzen:

DOIF (Bedingung1)
(set ...) ## erster Befehl der ersten Sequenz soll um eine Sekunde verzögert werden
(set ...) ## zweiter Befehl der ersten Sequenz soll um 2 Sekunden verzögert werden
DOELSE (Bedingung2)
(set ...) ## erster Befehl der zweiten Sequenz soll um 3 Sekunden verzögert werden
(set ...) ## zweiter Befehl der zweiten Sequenz soll um 0,5 Sekunden verzögert werden

attr <DOIF-modul> wait 1,2:3,0.5

Für Kommandos ohne Verzögerung werden Sekundenangaben ausgelassen oder auf Null gesetzt. Die Verzögerungen werden nur auf Events angewandt und nicht auf Zeitsteuerung. Eine 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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Mumpitz

Besten Dank, aber das ist mir alles klar!

Wie gesagt, es funktioniert ja auch mit meinem Wait und dem Timer, wenn das Licht_Esszimmer durch den Bewegungsmelder ausgelöst wird. Ich möchte nun jedoch zusätzlich, dass wenn ich in dieser Zeit auf den Einschalter drücke, die Lampe einschaltet und nicht durch nach meinen definierten 180 Sekunden (siehe mein Wait Attribut) wieder abschaltet. Sondern dann, wenn ich eben diesen Schalter drücke, soll der dortige Befehl (in diesem Fall soll das Licht 20min eingeschaltet bleiben) umgesetzt sein. Das habe ich mit diesem DOIF realisiert:

([?20:00-06:00] and [Licht_Esszimmer:?on]) (set Licht_Esszimmer on) (set Licht_Esszimmer off)

do resetwait
wait 0,120


Weisst Du jetzt was ich meine?

CoolTux


([?20:00-06:00] and [Licht_Esszimmer:?on]) (set Licht_Esszimmer on) (set Licht_Esszimmer off) DOELSIF ([Licht_Esszimmer:on]) (set Licht_Esszimmer on)
wait 0,120:0


Meinst so in etwa? Gedankenstoß
Ich sehe keine 180 Sekunden und keine 20min. Wo hast Du die?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Mumpitz

Entschuldigung  :)

also, die 180 Sekunden sind beim Einschalten des Bewegungsmelders.

Die 20 minuten beim doif wenn ich manuel auf den Schalter drücke. Habe das Wait Attribut falsch abgeschrieben:
Zitat([?20:00-06:00] and [Licht_Esszimmer:?on]) (set Licht_Esszimmer on) (set Licht_Esszimmer off)

do resetwait
wait 0,120

sollte hier heissen:
wait 0,1200

CoolTux


([?20:00-06:00] and [Licht_Esszimmer:?on]) (set Licht_Esszimmer on) (set Licht_Esszimmer off) DOELSIF ([Licht_Esszimmer:on]) ()

do resetwait
wait 0,1200:0



versuch mal so, ich gehe davon aus das Dein Lichtschalter Licht_Esszimmer ein Unterputz Aktor ist ist selbst sofort schaltet. Alles was Du brauchst ist eine Zustandsänderung Deines DOIF's
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Mumpitz

Dein Vorschlag hat nicht geklappt. Ist nachvollziehbar, weil sobald die Lampe durch den Bewegungsmelder eingeschaltet wird springt er automatisch auf cmd_2, weil da [Lichtschalter:on] die Bedingung zutrifft! dadurch werden die Timer des Bewegungsmelder sofort deletet!

Anderer Lösungsvorschlag?

CoolTux

Hast Recht. Hätte mir auch auffallen müssen. Ist knifflige, im Moment fällt mir nichts ein.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Mumpitz

Dann hoffe ich doch, dass Damian hier mal vorbei schaut :)


Gesendet von iPad mit Tapatalk

Volker!

Setze das doif des Bewegungsmelders mal testweise auf auf inaktiv wenn das Licht noch an ist. Sollte das Licht dann an bleiben kannst du mit dem doif des Schalters das ganze automatisieren.

joshi04

Hallo Mumpitz,
ist ja schon ein wenig her und außerdem ist der Thread als gelöst markiert. Daher sinkt vermutlich die Wahrscheinlichkeit, das hier noch viele Helfer vorbeikommen, außer sie suchen selbst nach einer Lösung  ;)

Ich denke, ich habe eine ähnliche Anwendung und bin dadurch drauf gestoßen. Derzeit teste ich folgende Logik:

([FL_Bewegungsmelder:"motion"] and ## wird ausgelöst, wenn der Bewegungsmelder das Event "motion" meldet
[?FL_Bewegungsmelder:brightness] <80 and ## UND das reading für die Helligkeit weniger als 70
[?HM_3D9CF2] ne "HM_3D9CF2_Btn_01 Short") ## UND der Status der FB nicht auf dem Taster für an steht
(set HM_43B16D_Dim on)(set HM_43B16D_Dim off, setreading $DEVICE state sensing, setreading $DEVICE motion sensing)
## dann wird zunächst der Aktuator an geschaltet und als zweites der Aktuator wieder aus, sowie die beiden reading des Bewegungsmelder zurückgesetzt
DOELSEIF ([HM_3D9CF2] eq "HM_3D9CF2_Btn_01 Short") ## wird ausgelöst, für die FB das entsprechende Event kommt
(set HM_43B16D_Dim on)(set HM_43B16D_Dim off, setreading HM_3D9CF2 state HM_3D9CF2_Btn_02 Short)
## dann wird zunächst der Aktuator an geschaltet und als zweites der Aktuator wieder aus, sowie die beiden reading des Bewegungsmelder zurückgesetzt
DOELSEIF ([HM_3D9CF2] eq "HM_3D9CF2_Btn_02 Short") ## wird ausgelöst, für die FB das entsprechende Event kommt
(set HM_43B16D_Dim off)
## dann wird der Aktuator ausgeschaltet
## hinzu gehören die beiden Attribute
## wait 0,130:0,1800:0: erster Befehl der ersten Bedingung wird sofort ausgefürt. zweiter Befehl der ersten Bedingung wird um 130 Sekunden verzögert,
##   erster Befehl der zweiten Bedingung wird sofort ausgeführt, zweiter Befehl der zweiten Bedingung wird um 1800 Sekunden verzögert,
##   erster Befehl der dritten Bedingung wird sofort ausgeführt. (letzter Doppelpunkz gehört nicht zum Attribut.)
## resetwait: damit die Timer zurückgesetzt werden, wenn die Bedingung zwischenzeitlich erneut wahr wird, z.B. das Triggern des Bewegungsmelders nach 120 Sekunden.
## Der Bewegungsmelder ist eingestellt auf eine erneute Sendung nach 120 Sekunden und erneute Sendung, wenn während dieser 120 Sekunden eine Bewegung festgestellt wird.


Die Einbindung des Schalter ist noch ungetestet und sicherlich noch falsch, als Platzhalter aber schon mal drin.
Vielleicht erreicht es Dich noch und Du kannst für Dich daraus etwas ableiten.
Schöne Grüße,
John

Edith: motion muss in Anführungsstriche, sonst wird auch bei anderen Events getriggert. Getestet, leicht überarbeitet und bei mir noch deutlich erweitert, führt hier aber mM nicht zu Mehrwert.
NUC: 2xJeeLink, PCA301/TX35DTH; HueBridge, LivingColors; vair-monitor (CO2); HMLan, Winmatic, HM-CC-RT-DN, HM-TC-IT-WM-W-EU, HM-ES-TX-WM, HM-WDS10-TH-O, HM-ES-PMSw1-Pl, HM-SEC-SC-2, HM-SEC-SCo; AVM DECT 200; panStamp; smartVISU

Per

Ich habe ein ähnliches Problem mit Steckdosen, welche durch das Programm automatisch und durch das Webfrontend/am Gerät selbst manuell geschaltet werden können. Oder das Gerät ändert seinen Status eigenständig ( >:().
Um nicht mit Unmengen Hilfsvariablen und Notifys zu arbeiten, schreibe ich gerade ein "Device" MANU, welches für solche Zwecke den Auslöse-Ort erkennt und speichert. Damit kann man hinterher granular unterscheiden, wer wie geschaltet hat und was man damit machen will.
Denke, dass ich nächste Woche die erste Beta veröffentliche.