Gemäß Trick der Woche http://www.fhemwiki.de/wiki/Trick_der_Woche (http://www.fhemwiki.de/wiki/Trick_der_Woche) habe ich folgenden Code getestet
define FlurLicht notify Bewegungsmelder_Flur:motion:.* { if (Value("Licht_Flur1") eq "off") { fhem ("set Licht_Flur on ;; define FlurLicht_aus at +00:04:16 set Licht_Flur off") } else { fhem ("delete FlurLicht_aus ;; define FlurLicht_aus at +00:04:16 set Licht_Flur off") }} bzw. umgeschrieben für mein FS20-System:
Internals:
CFGFN
DEF Flur_innen_dummy.on { if (Value("Flur_innen_Licht") eq "off") { fhem ("set Flur_innen_Licht on ; define FlurLicht_aus at +00:00:30 set Flur_innen_Licht off") } else { fhem ("delete FlurLicht_aus ; define FlurLicht_aus at +00:00:30 set Flur_innen_Licht off") }}
NAME Flur_innen_Licht_N
NR 797
NTFY_ORDER 50-Flur_innen_Licht_N
REGEXP Flur_innen_dummy.on
STATE 2015-03-09 18:29:23
TYPE notify
Attributes:
room Flur innen
Ich muss in diesem Flur vier Bewegungsmelder FS20PIRU einsetzen, da der Flur mehrfach verzweigt und die Reichweite der Melder klein ist. Dafür gibt es vier Notifys in diesem Stil:
Internals:
DEF Flur_innen_BWM_OFEN:on.* set Flur_innen_dummy on
NAME Flur_innen_BWM_OFEN_N
NOTIFYDEV Flur_innen_BWM_OFEN
NR 352
NTFY_ORDER 50-Flur_innen_BWM_OFEN_N
REGEXP Flur_innen_BWM_OFEN:on.*
STATE 2015-03-09 18:29:23
TYPE notify
Attributes:
disable 0
room Flur innen
Alle BWM setzen ein "on-old-for-timer 1" als Bewegungssignal ab und setzen denselben Flur_innen_dummy auf "on".
Die BWM und können per setting innerhalb von 8 Sekunden wieder senden, was gewollt ist.
Das Ergebnis ist dies:
2015-03-09_18:29:22 Flur_innen_Licht off
2015-03-09_18:29:22 Flur_innen_Licht on
2015-03-09_18:29:22 Flur_innen_Licht off
2015-03-09_18:29:23 Flur_innen_Licht on
2015-03-09_18:29:49 Flur_innen_Licht off
2015-03-09_18:29:15 Flur_innen_dummy on
2015-03-09_18:29:18 Flur_innen_dummy on
2015-03-09_18:29:22 Flur_innen_dummy on
2015-03-09_18:29:23 Flur_innen_dummy on
Das Licht schaltet ein, doch sobald mehrere Melder ein "on-for-timer 1" senden geht das Licht aus, wieder an wieder aus, fast im Sekundentakt.
Das Lofile sagt:
2015.03.09 18:29:15 3: Flur_innen_Licht_N return value: FlurLicht_aus already defined, delete it first
2015.03.09 18:29:22 3: FS20 set Flur_innen_Licht on
2015.03.09 18:29:22 3: set Flur_innen_Licht on ; define FlurLicht_aus at +00:00:30 set Flur_innen_Licht off : FlurLicht_aus already defined, delete it first
2015.03.09 18:29:22 3: Flur_innen_Licht_N return value: FlurLicht_aus already defined, delete it first
2015.03.09 18:29:23 3: FS20 set Flur_innen_Licht on
Im Eventlog kommen auch die häufigen "off"-Signale durch und schalten aus - während man durch den Flur geht.
Eigentlich müsste der Timer FlurLicht_aus jedes Mal gelöscht werden, wenn das Licht schon an ist, das da hakt etwas und ich komme nicht drauf was???
------------------------------------------------------------------
Dann hab' ich das mit DOIF probiert: siehe http://www.fhemwiki.de/wiki/DOIF (http://www.fhemwiki.de/wiki/DOIF).
define schalter_d dummy
define di_Schalter DOIF ([Bewegungsmelder] eq "motion" ) (set schalter_d on, set schalter_d off)
attr di_Schalter do always
define di_Licht DOIF ([schalter_d] eq "on") (set Licht on) DOELSE (set Licht off)
attr di_Licht wait 0:300
umgesetzt bei mir mit:
Internals:
DEF ([Flur_innen_dummy:?on]) (set Flur_innen_Licht on) DOELSE (set Flur_innen_Licht off)
NAME Flur_innen_Licht_DI
NR 398
NTFY_ORDER 50-Flur_innen_Licht_DI
STATE disabled
TYPE DOIF
Readings:
2015-03-09 17:49:59 cmd_event Flur_innen_dummy
2015-03-09 17:49:59 cmd_nr 2
2015-03-09 17:48:59 e_Flur_innen_dummy_events off
2015-03-09 17:53:23 state disabled
2015-03-09 17:49:59 wait_timer no timer
Condition:
0 EventDoIf('Flur_innen_dummy',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on')
Devices:
0 Flur_innen_dummy
all Flur_innen_dummy
Do:
0 set Flur_innen_Licht on
1 set Flur_innen_Licht off
Helper:
last_timer 0
sleepdevice Flur_innen_dummy
sleeptimer -1
triggerDev Flur_innen_dummy
triggerEvents:
off
Internals:
Readings:
State:
Timerfunc:
Trigger:
all Flur_innen_dummy
Attributes:
disable 0
group Auto_Dimmersteuerung_Flur
room Flur innen
wait 0:60
und
Internals:
DEF ([Flur_innen_BWM_OFEN] eq "on-old-for-timer 1" ) (set Flur_innen_dummy on, set Flur_innen_dummy off)
NAME Flur_innen_BWM_OFEN_di
NR 397
NTFY_ORDER 50-Flur_innen_BWM_OFEN_di
STATE initialized
TYPE DOIF
Readings:
2015-03-09 18:52:45 state initialized
Condition:
0 InternalDoIf('Flur_innen_BWM_OFEN','STATE','') eq "on-old-for-timer 1"
Devices:
0 Flur_innen_BWM_OFEN
all Flur_innen_BWM_OFEN
Do:
0 set Flur_innen_dummy on, set Flur_innen_dummy off
Helper:
last_timer 0
sleeptimer -1
Internals:
0 Flur_innen_BWM_OFEN:STATE
all Flur_innen_BWM_OFEN:STATE
State:
Timerfunc:
Attributes:
disable 0
do always
group Auto_Dimmersteuerung_Flur
room Flur innen
Das hatte genau dasselbe falsche Verhalten erzeugt wir mit Notify.
2015-03-09_18:08:35 Flur_innen_Licht on
2015-03-09_18:08:51 Flur_innen_Licht off
2015-03-09_18:24:01 Flur_innen_Licht off
2015-03-09_18:24:03 Flur_innen_Licht off
2015-03-09_18:24:09 Flur_innen_Licht off
2015-03-09_18:26:30 Flur_innen_Licht off
2015-03-09_18:26:32 Flur_innen_Licht off
Natürlich hatte ich disable 0 bzw. 1 jeweils die richtigen Module aktiviert/deaktiviert.
Hier kamen auch immer jede Menge off Befehle durch, obwohl die wait-Funktion den off eigentlich verzögern sollte.
Ich steh' auf'm Schlauch! Woran liegt das?
Fall gelöst -
ein echt blöder Fehler von mir, aber ich kam nicht so leicht darauf.
Vielleicht passiert das ja noch jemand, deshalb hier die Erklärung der Ursache.
Die FS20 PIRU waren von mir falsch programmiert worden. Früher wurde auf Kanal 1 direkt geschaltet, später über FHEM indirekt auf Kanal 2. Dann muss man Kanal 1 abstellen klar. Im dunklen Flur in etwas Zeitdruck habe ich dann in der FS20-PIRU-Anleitung in einer Tabelle die Codierung zum Ausschalten des Kanal 2 gesucht - und gefunden.
Leider habe ich mich verlesen und den Code für "AUS"-Senden programmiert, anstelle den Kanal zu deaktivieren. Echt blöd, aber unter Zeitdruck vertut man sich schon mal... .
Inzwischen geht alles - egal ob mit DOIF oder notify (wobei ich DOIF klar bevorzuge...)