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

Hallo, eigentlich ganz simpel, aber zwei Punkte bekomme ich einfach nicht hin.

- Ich möchte einen Bewegungsmelder eine Lampe für 5 Minuten einschalten lassen.
- Wenn in der Einschaltzeit ein erneuter Motion vom BW kommt, soll die Einschaltzeit verlängert werden.
- Wenn die Lampe vorher schon an war, soll sie nicht vom BW geschaltet werden, da er sie ja sonst nach der angelaufenen Zeit auschaltet
- Wenn wärend der Einschaltdauer der Lampe durch den BW MANUELL der Unterputz-Schalter betätigt wird, soll die BW-Logik abgebrochen werden.

Das sieht im Moment so aus

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

###check ob Licht manuell angeschaltet wurde

define Container_TASTER_linksDummy dummy
attr Container_TASTER_linksDummy room Anwesenheit
attr Container_TASTER_linksDummy group Zeitschalter

define Container_TASTER_linksNotify notify Container_TASTER_links sleep 2;; { fhem("set Container_TASTER_linksDummy ".ReadingsVal("Container_LICHT_Aussen_Strahler", "state", "")) };; { fhem("set Container_BEWEGUNGSMELDER_Zeitschalter initialize") }
attr Container_TASTER_linksNotify room Anwesenheit
attr Container_TASTER_linksNotify group Zeitschalter


Ich habe 3 Probleme:

- Irgendwie erscheint es mir nicht galant ;)
- Wenn ich über TabletUI oder sonstwie die Lampe direkt schalte (ohne den Unterputz-Schalter zu nutzen) funktioniert die Logik nicht mehr. Das ist so wie es im Moment ist auch klar. Dieser Part ist nur auf den Schalter gelegt, weil mir nichts einfällt wie ich es anders überhaupt lösen könnte.
- Ich schaffe es einfach nicht über  "set Container_BEWEGUNGSMELDER_Zeitschalter initialize" den Timer für das Ausschalten vom DOIF zu löschen. Sprich, egal wie, er schaltet mir wenn der Timer läuft bei Ende das Licht aus.

Über Logikunterstützung wäre ich dankbar

Grüße

H.

EDIT: Lösung


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

Brice

Evt. verstehe ich den letzten Teil (soll die BW-Logik abgebrochen werden) nicht. Ich löse ähnliches mit einem einfachen Notify:

define nty_LED notify Bewegungsmelder_Kueche:.* {
my $StatusLED=(ReadingsVal("LED","state","on"));
if ($StatusLED eq "off")
{
  {fhem "set LED on-for-timer 120"}
   }
}


- LED wird nicht durch Bewegungsmelder eingeschaltet, wenn schon an
- LED wird durch Bewegungsmelder für 120 sec eingeschaltet, wenn Zustand off ist
- wenn innerhalb der 120 sec der Schalter per Fernbedienung oder MobilePhone betätigt wird, wird der Zustand "on-for-timer" in "on" oder "off" geändert

Wozu soll die Bewegungsmelder-Logik nochmals abgebrochen werden?
FHEM auf RPi 4 4GB (Buster) | produktiv) CUL 868 für FS20 | S300TH | KS300 | Max!Cube als CUN 868 für TechemWZ | HM-MOD-RPI-PCB für HM | Z-Wave ZME_UZB1 | FRITZ!DECT 200 | HUE | Lightify | Echo Dot | WS3080

holle75

Hallo Brice, die Bewegungsmelder-Logik (der AUS Timer) soll abgebrochen werden damit das DOIF nicht nach dem Ablauf des Timers die Lampe, obwohl du sie manuell eingeschaltet hast, trotzdem abschaltet.

Das entspräche deinem:

Zitat von: Brice am 20 September 2015, 10:30:33
- wenn innerhalb der 120 sec der Schalter per Fernbedienung oder MobilePhone betätigt wird, wird der Zustand "on-for-timer" in "on" oder "off" geändert

Schaltet denn dein notify die Lampe erneut an, resp. verlängert die Anschaltzeit wenn in der AN-Phase erneut ein motion vom BW kommt? State der Lampe ist dann ja "on" und er würde nicht erneut auslösen.

Problem bei dem Homematic FunkBW ist, dass er nur max alle 4 Minuten triggert. Wenn du also 5 Minuten das Licht an hast, nach 4 Minuten erneut am BW eine Motion auslöst, das Licht nach einer weiteren Minute ausgeht ... dann stehst du 3 Minuten im Dunkeln bevor er wieder triggert. Daher kommt das ganze Übel ;) .... wenn das Ding ständig triggern würde wären die paar Sekunden im Dunkeln kein Problem.

holle75

ps: vielleicht wäre der beste workaround die Einschaltzeit auf 3:55 zu legen ? Mmh, würde alles extrem vereinfachen wenn ich so drüber nachdenke und ich könnte dein notify nutzen. Dann gäbe es nur die paar Sekunden im Dunkeln.

Brice

ok, mit Homematik kenne ich mich aus. Ich nutze FS20 PIRI, da sind die Sendeabstände (Zeit, die mindestens seit der letzten Auslösung vergangen sein muss) einstellbar (8, 24, 56, 120 sec). Im Bad wird per PIRI das Radio für 120 sec eingeschaltet, Sendeabstand ist auf 56 sec gesetzt. Der Timer verlängert sich jedesmal, also ist das Radio an, solange Bewegungen im Bad festgestellt werden.

edit:
Bewegungsmelder_Bad:on.* {if ((ReadingsVal("Radio_Bad","state","off") && ($hour >= 5 && $hour <= 22))){ fhem "set Radio_Bad on-for-timer 120" }}
Der Code scheint mir nicht logisch zu sein, aber es läuft....
FHEM auf RPi 4 4GB (Buster) | produktiv) CUL 868 für FS20 | S300TH | KS300 | Max!Cube als CUN 868 für TechemWZ | HM-MOD-RPI-PCB für HM | Z-Wave ZME_UZB1 | FRITZ!DECT 200 | HUE | Lightify | Echo Dot | WS3080

pnewman

Hallo,

ich habe einen Homematicbewegungsmelder für aussen direkt an dem Badezimmerdimmer HM angelernt.
Der Bewegungsmelder schaltet somit von sich aus das Licht für 5min ein und bei bewegungen innerhalb der Zeit bleibt es weiterhin an. Nach 4,5min flackert das Licht(mittlerweile wurde diese Funktion von mir deaktiviert) und geht danach aus wenn sich niemand bewegt.

Wenn ich zwischendurch das Licht selbst einschalte muss ich es auch wieder ausschalten, da es sonst an bleibt.
Wenn ich nach aktivierung des Bewegungsmelders das Licht manuell anschalte (Der bewegungsmelder schaltet das Licht nur auf 6%) bleibt das Licht so lange an bis ich es wieder ausschalte.

Dies ist dann Systemunabhängig.

Gruß
Ralf
Raspberry Pi3B+ / Nano-Cul 868 - MAX!=Heizung, HM-Lan - Rollo+Licht, JeeLink-Clone 868 - LaCrosse, JeeLink-Clone 868 - PCA301, CUL 434 - IT-Steckdosen+Fernbedienung

holle75

@Brice:

bedeutet das notify ignoriert die Abfrage ob Radio state = "off" wenn der Bewegungsmelder erneut triggert?  Interessant.

OT, welchen PIRI hast du verbaut? Brauche auch noch ein 24V Bewegungsmelder im Bad und such mich schon blöd.

EDIT: Sorry FS20 beim PIRI überlesen

@pnewman:

Im Prinzip hätte ich das gerne so. Würde es aber gerne in fhem umsetzen um noch andere Abhängigkeiten später reinzubringen.

Gigafix

Also die 4 Min bis zur erneuten Erkennung sind vermutlich auch änderbar auf minmal 15 sec - abhängig von dem Modell. Ist natürlich im Einzelfall auch recht lange. Weitere Infos siehe Infos dazu im WIKI. Hier ein kleiner Auszug:

Konfiguration über Register
Anzeige aller dekodierten Register
get <name> regList zeigt alle möglichen 'dekodierten' Register an. Hier findet man sowohl den Wertebereich als auch eine (sehr) kleine Beschreibung. Ausgabe:

   1: minInterval      |     literal        |          | minimum interval in sec options:240,60,120,30,15

minInterval
Minimaler Interval in Sekunden ab wann die nächste Bewegung registriert werden kann. Der Standard ist 240. Also nach einer Bewegungs-Meldung werden weitere Bewegungen für 4 Minuten ignoriert bis die nächste Meldung erfolgt.
VM Synology DS918 | CubieTruck |2x HMLAN | HMUSB | 3x HMWLAN | CCU2 | MAX-Cube | nanoCUL | ZWDongle |

holle75

ich bastel gerade an allen Varianten.

muß mal probieren, was die ganzen Register für Auswirkungen haben. Was mich wundert: wenn ich R-captInInterval auf "on" setze bekomme ich im EventMonitor immer ALLE Readings angezeigt. Entsprechend der in R-minInterval eingestellten Zeit.

Egal welches der Register ich umsetzte ist das so. Wenn ich alle Register auf die Defaults stelle bekomme ich nur

2015-09-20 13:03:01 CUL_HM Container_BEWEGUNGSMELDER battery: ok
2015-09-20 13:03:01 CUL_HM Container_BEWEGUNGSMELDER brightness: 205
2015-09-20 13:03:01 CUL_HM Container_BEWEGUNGSMELDER cover: closed


im EventMonitor. Mit EINEM umgestellten Register (egal welches) sieht es so aus:

2015-09-20 13:07:11 CUL_HM Container_BEWEGUNGSMELDER brightness: 205
2015-09-20 13:07:11 CUL_HM Container_BEWEGUNGSMELDER motion: on (to HM_LAN_FUNK)
2015-09-20 13:07:11 CUL_HM Container_BEWEGUNGSMELDER motionCount: 51_next:-
2015-09-20 13:07:11 CUL_HM Container_BEWEGUNGSMELDER motion
2015-09-20 13:07:11 CUL_HM Container_BEWEGUNGSMELDER trigger_cnt: 51
2015-09-20 13:08:41 CUL_HM Container_BEWEGUNGSMELDER brightness: 205
2015-09-20 13:08:41 CUL_HM Container_BEWEGUNGSMELDER motion: on (to HM_LAN_FUNK)
2015-09-20 13:08:41 CUL_HM Container_BEWEGUNGSMELDER motionCount: 52_next:116s
2015-09-20 13:08:41 CUL_HM Container_BEWEGUNGSMELDER motion
2015-09-20 13:08:41 CUL_HM Container_BEWEGUNGSMELDER trigDst_29A557: noConfig
2015-09-20 13:08:41 CUL_HM Container_BEWEGUNGSMELDER trigger_cnt: 52


da ich auf trigDst_29A557 trigger (was bei Default Einstellungen nur kommt wenn wirklich motion) funktioniert das jetzt alles nicht mehr.

motion ist immer auf "on", warum auch immer. Also bleibt mir nur trigDst_29A557 als Trigger. ..... und der wird wie gesagt bei Umgestellten Readings jetzt immer angezeigt.

Ist das Teil defekt ?

holle75

So, Alarm zurück, das Teil braucht scheinbar eine Weile bis es sich eingependelt hat nachdem man etwas an den Registern umgestellt hat. Habe jetzt folgendes Setup:

- minInterval am BW auf 15 Sekunden gesetzt
- diese cfg

define Container_BEWEGUNGSMELDER_Zeitschalter notify Container_BEWEGUNGSMELDER:trigDst_29A557.* { if ( Value("Container_LICHT_Aussen_Strahler") eq "off" &&  Value("Anwesenheit") eq "present" && ReadingsVal( "Container_BEWEGUNGSMELDER", "brightness", "") <= 120 ) { fhem ("set Container_LICHT_Aussen_Strahler on-for-timer 180") } }

funktioniert gut, allerdings mit dem erwarteten Effekt, dass die on-for-timer Zeit bei Motion nicht verlängert wird (weil Container_LICHT_Aussen_Strahler dann "on" ist). Wieso das bei Brice funktioniert weiss ich nicht. Oder umgekehrt warum bei mir nicht.

jetzt kann ich auch wieder das alte DOIF verwenden (ist mir irgendwie angenehmer) da sich an der Funktionalität ja nicht wirklich was geändert hat. Das alte Problem besteht weiterhin, durch das umsetzen der minInterval ist der Schmerz darüber aber nur halb so groß.

define Container_BEWEGUNGSMELDER_Zeitschalter DOIF ([Container_BEWEGUNGSMELDER:?trigDst_29A557] and [Container_BEWEGUNGSMELDER:brightness] < 120 and [Anwesenheit:state] eq "present" and [Container_LICHT_Aussen_Strahler:state] ne "on") (set Container_LICHT_Aussen_Strahler on-for-timer 235)

falls noch jemand eine Idee hat, gerne her damit. Ansonsten schon mal vielen Dank an alle.

H.




Damian

Zitat von: holle75 am 20 September 2015, 15:42:03

falls noch jemand eine Idee hat, gerne her damit. Ansonsten schon mal vielen Dank an alle.

H.

Zitat aus der Commandref zu DOIF:

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

define di_on_for_timer ([detector:?motion])
(set light on)
(set light off)
attr di_on_for_timer do resetwait
attr di_on_for_timer wait 0,30

Hiermit wird das Licht bei Bewegung eingeschaltet. Dabei wird, solange es brennt, bei jeder Bewegung die Ausschaltzeit neu auf 30 Sekunden gesetzt, "set light on" wird dabei nicht unnötig wiederholt.

Gruß

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

holle75

Hallo Damian, genaus damit habe ich es am Anfang gemacht und das hat auch (fast) funktioniert. Problem war u.a., dass ein Event (in meinem Fall Anwesenheit was in unregelmäßigen Abständen einen Event liefert) das DOIF resettet hatte -> Licht ging vor Ende des wait_timers aus. Warum weiss ich nicht.

Das sah dann so aus:

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

###check ob Licht manuell angeschaltet wurde

#define Container_TASTER_linksDummy dummy
#attr Container_TASTER_linksDummy room Anwesenheit
#attr Container_TASTER_linksDummy group Zeitschalter

#define Container_TASTER_linksNotify notify Container_TASTER_links sleep 2;; { fhem("set Container_TASTER_linksDummy ".ReadingsVal("Container_LICHT_Aussen_Strahler", "state", "")) };; { fhem("set Container_BEWEGUNGSMELDER_Zeitschalter initialize") }
#attr Container_TASTER_linksNotify room Anwesenheit
#attr Container_TASTER_linksNotify group Zeitschalter


Zweites Problem war das Einbinden der "Unterputz Schalter wird manuell betätigt"-Logik.

Und noch ein paar Probleme, weiss jetzt nicht mehr in welcher Version des Rumprobierens was genau. Ist nicht so einfach vor Bewegugsmeldern rumzuhüpfen und verschiedene Codes bei so vielen Abhängigkeiten durchzuprobieren.

H.

Damian

Zitat von: holle75 am 20 September 2015, 16:11:10
Hallo Damian, genaus damit habe ich es am Anfang gemacht und das hat auch (fast) funktioniert. Problem war u.a., dass ein Event (in meinem Fall Anwesenheit was in unregelmäßigen Abständen einen Event liefert) das DOIF resettet hatte -> Licht ging vor Ende des wait_timers aus. Warum weiss ich nicht.

H.

Wenn andere nicht triggern sollen, dann musst du Fragezeichen für reine Abfragen angeben:

define Container_BEWEGUNGSMELDER_Zeitschalter DOIF
([Container_BEWEGUNGSMELDER:?trigDst_29A557] and [?Container_BEWEGUNGSMELDER:brightness] < 120 and [?Anwesenheit:state] eq "present" and [?Container_TASTER_linksDummy:state] eq "off")
   (set Container_LICHT_Aussen_Strahler on) (set Container_LICHT_Aussen_Strahler off)


Gruß

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

holle75

Danke Damian, ich werde probieren. Gibt es noch einen Trick, wie ich die Abfrage von Container_TASTER_linksDummy direkt durch Container_LICHT_Aussen_Strahler ersetzen könnte um den Status vor einer Aktivierung (und damit Ausschaltung) des Zeitschalters abzufragen ohne dann das resetwait zu eliminieren?

Also statt:

define Container_BEWEGUNGSMELDER_Zeitschalter DOIF
([Container_BEWEGUNGSMELDER:?trigDst_29A557] and [?Container_BEWEGUNGSMELDER:brightness] < 120 and [?Anwesenheit:state] eq "present" and [?Container_TASTER_linksDummy:state] eq "off")
   (set Container_LICHT_Aussen_Strahler on) (set Container_LICHT_Aussen_Strahler off)
attr Container_BEWEGUNGSMELDER_Zeitschalter do resetwait
attr Container_BEWEGUNGSMELDER_Zeitschalter wait 0,120

so:

define Container_BEWEGUNGSMELDER_Zeitschalter DOIF
([Container_BEWEGUNGSMELDER:?trigDst_29A557] and [?Container_BEWEGUNGSMELDER:brightness] < 120 and [?Anwesenheit:state] eq "present" and [?Container_LICHT_Aussen_Strahler:state] eq "off")
   (set Container_LICHT_Aussen_Strahler on) (set Container_LICHT_Aussen_Strahler off)
attr Container_BEWEGUNGSMELDER_Zeitschalter do resetwait
attr Container_BEWEGUNGSMELDER_Zeitschalter wait 0,120

Sorry, es ist wirklich kompliziert in Worte zu fassen was ich möchte. Nochmal Zitat aus dem ersten Post

Zitat von: holle75 am 20 September 2015, 09:37:32
- Ich möchte einen Bewegungsmelder eine Lampe für 5 Minuten einschalten lassen.
- Wenn in der Einschaltzeit ein erneuter Motion vom BW kommt, soll die Einschaltzeit verlängert werden.
- Wenn die Lampe vorher schon an war, soll sie nicht vom BW geschaltet werden, da er sie ja sonst nach der abgelaufenen Zeit ausschaltet
- Wenn wärend der Einschaltdauer der Lampe  MANUELL der Unterputz-Schalter betätigt wird, soll die DOIF-Logik abgebrochen werden (Licht wird nicht nach WAIT abgeschaltet).

Problem:

- Wenn ich über TabletUI oder sonstwie die Lampe direkt schalte (ohne den Unterputz-Schalter zu nutzen) funktioniert die Logik nicht mehr. Das ist so wie es im Moment ist auch klar. Dieser Part ist nur auf den Schalter gelegt, weil mir nichts einfällt wie ich es anders überhaupt lösen könnte.

Grüße

H.

Damian

ja, jetzt wird es etwas tricky:

... and ([?Container_LICHT_Aussen_Strahler:state] eq "off" or [?Container_BEWEGUNGSMELDER_Zeitschalter] eq "cmd_1_1") ...

Gruß

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