Hallo,
ich betreibe einen "normalen" Bewegungsmelder an einem FS 20 Sendemodul (http://www.elv.de/fs20-s4m-2-4-kanal-sendemodul.html), damit ich den Bewegungsmelder in FHEM nutzen kann. Der Bewegungsmelder simuliert einen Tastendruck, sobald sich etwas bewegt, und FHEM soll dann abhängig von anderen Parametern (Nacht, ...) eine Lampe schalten:
define PIR_Ost_aus notify Bewegungsmelder_Ost:dimdown {\
if (Value("PIR_Automatik") eq "on" && Value("isNACHT") eq "on" && Value("Licht_Ost") ne "on") {\
fhem "set Licht_Ost on-for-timer 320";;\
fhem "delete PIR_O_aus";;\
fhem "define PIR_O_aus at +00:05:00 set Bewegungsmelder_Ost off";;\
} else {\
fhem "delete PIR_O_aus";;\
fhem "define PIR_O_aus at +00:05:00 set Bewegungsmelder_Ost off";;\
}\
}
Das funktioniert auch. Im Log sieht's dann so aus:
2013.12.18 09:49:25 3: FS20 set Licht_Nord on-for-timer 320
2013.12.18 09:49:25 3: delete PIR_CP_aus : Please define PIR_CP_aus first
2013.12.18 09:49:30 3: FS20 set Licht_Ost on-for-timer 320
2013.12.18 09:49:30 3: delete PIR_O_aus : Please define PIR_O_aus first
2013.12.18 09:49:31 3: FS20 set Licht_Ost on-for-timer 320
2013.12.18 09:49:32 3: FS20 set Licht_Ost on-for-timer 320
2013.12.18 09:49:33 3: FS20 set Licht_Ost on-for-timer 320
2013.12.18 09:49:33 3: FS20 set Licht_Ost on-for-timer 320
2013.12.18 09:49:34 3: FS20 set Licht_Ost on-for-timer 320
2013.12.18 09:49:35 3: FS20 set Licht_Ost on-for-timer 320
2013.12.18 09:49:36 3: FS20 set Licht_Ost on-for-timer 320
2013.12.18 09:49:36 3: FS20 set Licht_Ost on-for-timer 320
2013.12.18 09:49:37 3: FS20 set Licht_Ost on-for-timer 320
2013.12.18 09:49:38 3: FS20 set Licht_Ost on-for-timer 320
2013.12.18 09:49:39 3: FS20 set Licht_Ost on-for-timer 320
2013.12.18 09:49:39 3: FS20 set Licht_Ost on-for-timer 320
2013.12.18 09:49:40 3: FS20 set Licht_Ost on-for-timer 320
2013.12.18 09:49:41 3: FS20 set Licht_Ost on-for-timer 320
...
Da der Bewegungsmelder immer einen sehr langen Tastendruck simuliert, habe ich versucht, FHEM dazu zu bewegen, nicht entsprechend viele Sendebefehle an die Lampe zu senden:
define FHEM_init_INITIALIZED notify global:INITIALIZED set vEntprellen on
define FHEM_init_REREADCFG notify global:REREADCFG set vEntprellen on
...
define vEntprellen dummy
define PIR_Ost_aus notify Bewegungsmelder_Ost:dimdown {\
if (ReadingsVal("vEntprellen","state","") eq "on"){\
fhem "set vEntprellen off";;\
fhem "delete resetEntprellen";;\
fhem "define resetEntprellen at +00:00:30 set vEntprellen on";;\
if (Value("PIR_Automatik") eq "on" && Value("isNACHT") eq "on" && Value("Licht_Ost") ne "on") {\
fhem "set Licht_Ost on-for-timer 320";;\
fhem "delete PIR_O_aus";;\
fhem "define PIR_O_aus at +00:05:00 set Bewegungsmelder_Ost off";;\
} else {\
fhem "delete PIR_O_aus";;\
fhem "define PIR_O_aus at +00:05:00 set Bewegungsmelder_Ost off";;\
}\
}\
}
Im Log steht dann Folgendes:
09:15:17 vEntprellen (dummy) state: off
09:15:17 Licht_Ost (FS20) state: on-for-timer 320
09:15:17 Bewegungsmelder_Ost (FS20) state: dimdown
09:15:18 Bewegungsmelder_Ost (FS20) state: dimdown
09:15:19 Bewegungsmelder_Ost (FS20) state: dimdown
09:15:28 Bewegungsmelder_Ost (FS20) state: dimdown
Die Lampe bekommt also wie gewünscht nur einen Einschaltbefehl (nachtriggerbar nach 30sec.).
Allerdings schaltet die Lampe in dieser Konfiguration fast nie wirlkich ein. Hat jemand eine Idee, woran das liegen kann und wie man das ggf. löst?
Danke
Ich denke, dass die Schaltabstände zu kurz sind, bzw der lange Tastendruck das Problem ist. Im Einschaltfall (also Bewegung) sendet dein Konstrukt offenbar sekündlich, sei's nun durch dauerndes Auslösen des Events oder durch Simulation eines SEHR langen Tastedrucks. Oder beidem. Damit ist das Sendekontingent deines Senders nach irgendwas um die 2 Minuten bereits aufgebraucht und danach sendet der eine Weile nix mehr.
Um das zu umgehen, kann man bei den FS20 und HM PIRI und PIRA den Sendeintervall einstellen, sodass z.b. nur alle x Sekunden gesendet wird. Bei Schaltern, die das Licht eine gewisse Zeit einchalten sollen, wenn Bewegung im Raum ist, empfiehlt sich da immer der längste Intervall, das sind 120 Sekunden (!).
Man kann ausrechnen, dass jeder Auslösintervall der kürzer als ca. 8 Sekunden ist, bei hinreichend langer Bewegungsdauer vor dem Melder zu Problemen führt. Bei längeren Intervallen erholt sich das Sendekontingent schneller als es verbraucht wird (obwohl dennoch jede Menge unnützer Traffik durch die Luft ginge)
Mit anderen Worten: Dein Problem ist vermutlich schon in der Idee, das s4m zu verwenden, bei dem man soweit ich mich erinnere den Sendeinterval NICHT einstellen kann. Das muss früher oder später schief laufen.
Im übrigen finde ich auch dein Entprellkonstrukt irgendwie übermässig kompliziert, aber vielleicht hab ichs beim überfliegen auch nur nicht verstanden.
Beim Einsatz eines "echten" S20 oder HM PIR könnte man sich ausserdem den "isNacht" sparen, da man dann eine Heilligkeitsgrenze am PIR selber definieren kann. Das hat den Vorteil, dass das Licht auch angeht, wenns Tagsüber wegen z.b. Gewitter mal sehr dunkel wird.
Hallo Zrrronggg!
ja, verstehe ich und sehe ich genau so. Ich setze anderswo auch die PIRAs ein. Dort habe ich die Sendeabstände auch auf 2min. gestellt. Ich berücksichtige allerdings nicht die Helligkeit, da ich so generell erfassen kann, ob/wann sich etwas bewegt.
An den Sendekontingenten wird es aber vielleicht nicht liegen, da ich im Sendelog sehe, dass der S4M immer weiter Simon sendet. Und nach meiner codierten 30sec. Pause kommt ja auch wieder der von mir generierte Einschaltbefehl. Der on-for-Timer Befehl wird also gesendet, doch der Empfänger gehr nicht immer an.
Komisch, oder?
ZitatIch berücksichtige allerdings nicht die Helligkeit, da ich so generell erfassen kann, ob/wann sich etwas bewegt.
Das mache ich über 2 Kanäle, einer mit Helligkeit, der andere ohne.
ZitatDer on-for-Timer Befehl wird also gesendet, doch der Empfänger gehr nicht immer an.
Komisch, oder?
Ja, da war ich auch schon drüber gestolpert, aber ich bin mir trotzdem nicht sicher, das der Hase da irgendwo im Pfeffer liegt. Irgendwie finde ich dein Konstrukt auch auf den ersten Blick unübersichtlich, ich müsste 10 Minuten Zeit investieren das komplett zu verstehen.
Seufz. Also gut.
Dein ursprüngliches Konstrukt:
Zitatdefine PIR_Ost_aus notify Bewegungsmelder_Ost:dimdown {\
if (Value("PIR_Automatik") eq "on" && Value("isNACHT") eq "on" && Value("Licht_Ost") ne "on") {\
fhem "set Licht_Ost on-for-timer 320";;\
fhem "delete PIR_O_aus";;\
fhem "define PIR_O_aus at +00:05:00 set Bewegungsmelder_Ost off";;\
} else {\
fhem "delete PIR_O_aus";;\
fhem "define PIR_O_aus at +00:05:00 set Bewegungsmelder_Ost off";;\
}\
}
ist ja in der in diesem Forum irgendwie modern gewordenen "ich streu noch paar Semikolons und FHEMs ein und lasse dafür paar Klammern weg und wenn ich Glück hab gehts noch" Schreibweise verfasst.
(du merkst ich bin kein Fan davon)
Ich würde ich so schreiben (Einzeiler, nicht super übersichtlich, die Kritik muss ich mir von den Fans der obigen Schreibweise gefallen lassen):
define PIR_Ost_aus notify Bewegungsmelder_Ost:dimdown {if (Value("PIR_Automatik") eq "on" && Value("isNACHT") eq "on" && Value("Licht_Ost") ne "on") {fhem ("set Licht_Ost on-for-timer 320 ;; delete PIR_O_aus ;; define PIR_O_aus at +00:05:00 set Bewegungsmelder_Ost off")} else {fhem ("delete PIR_O_aus ;; define PIR_O_aus at +00:05:00 set Bewegungsmelder_Ost off)}}
Und DAS (ebenso wie deines natürlich) funktioniert schon deswegen NICHT sauber, weil du am Anfang
ZitatValue("Licht_Ost") ne "on"
überprüfst, aber tatsächlich später
Zitatset Licht_Ost on-for-timer 320
setzt. D.h. das Licht ist an, ABER der Check schlägt trotzdem immer an, da on ungleich on-for-timer.
D.H. dein ganze IF-Konstrukt ist IMMER wahr. IMMER.
Daher sendet JEDE Auslösung des PIR auch munter reichlich weitere set Licht_Ost on-for-timer 320.
Als erstes würde ich also anstatt
Zitatset Licht_Ost on-for-timer 320
einfach nur
Zitatset Licht_Ost on
senden.
Damit sollten erstmal die ausgesendeten Einschaltbefehle runtergehen.
Also:
define PIR_Ost_aus notify Bewegungsmelder_Ost:dimdown {if (Value("PIR_Automatik") eq "on" && Value("isNACHT") eq "on" && Value("Licht_Ost") ne "on") {fhem ("set Licht_Ost on ;; delete PIR_O_aus ;; define PIR_O_aus at +00:05:00 set Bewegungsmelder_Ost off")} else {fhem ("delete PIR_O_aus ;; define PIR_O_aus at +00:05:00 set Bewegungsmelder_Ost off)}}
Ich würde ausserdem den Test if
Zitat(Value("PIR_Automatik") eq "on"
NICHT durchführen, und vielmehr das Umschalten von PIR_Automatik auf ON, das define PIR_Ost_aus erst anlegen lassen. Das gibt weniger Load in FHEM, weil dann die Bewegung gar nicht erst was triggert, wenn PIR_Automatik=off sowieso nix passiern soll.
Das ganze Entprellkonstrukt ist meiner Auffassung nach überflüssig und wesentlich zu komplex. Warum das nun nicht macht was du intendiert hast analysier ich mal nicht.
Zuletzt: Wenn du unbedingt on-for-timer senden willst (bringt hier aber eigentlich keine Punkte), kanst du das Thema auch umgehen indem du anstatt auf
ZitatValue("Licht_Ost") ne "on"
auf
Value("Licht_Ost") eq "off"
testest.
Ganz allgemein: Valuetests müssen sorgfältig überlegt werden. FS20 kennt z.b. 16 Zustände (soweit ich mich erinnere). Da macht ein Test schon mal was anderes als man denkt.
Ich schalge vor: Versuch erstmal meine Zeile da und dann sehen wir weiter.
Aber Sendekontingentprobleme im s4m wirst du trotzdem kriegen.
Hallo Zrrronggg!
ich prüfe
Value("Licht_Ost") ne "on"
tatsächlich bewußt, da ich verhindern will, dass das Licht sich nach 320sec ausschaltet, sofern es vorher manuell eingeschaltet wurde.
Ich werde Deine Kurzschreibweise einmal probieren.
Komisch ist allerdings trotzdem, dass das das Licht sich häufiger einschaltet, wenn ich bspw.
fhem "set Licht_Ost on-for-timer 320";;\
dreimal hinereinander schreibe.
Dann ist bspw. Folgendes passiert:
2013.12.23 22:55:58 2: Got message for undefined device 00bd68, and failed to guess type from msg 'Ack' - ignoring
2013.12.23 22:56:05 3: FS20 set Licht_Ost on-for-timer 320
2013.12.23 22:56:05 3: FS20 set Licht_Ost on-for-timer 320
2013.12.23 22:56:06 3: FS20 set Licht_Ost on-for-timer 320
2013.12.23 22:56:06 3: delete PIR_O_aus : Please define PIR_O_aus first
2013.12.23 22:56:06 3: delete resetEntprellen : Please define resetEntprellen first
2013.12.23 22:56:40 3: FS20 set Licht_Ost on-for-timer 320
2013.12.23 22:56:40 3: FS20 set Licht_Ost on-for-timer 320
2013.12.23 22:56:40 3: FS20 set Licht_Ost on-for-timer 320
2013.12.23 22:56:40 3: delete resetEntprellen : Please define resetEntprellen first
Um 22:56:05 ging das Licht nicht an, aber um22:56:40.
Das verstehe ich nicht.
Zitatich prüfe
Value("Licht_Ost") ne "on"
tatsächlich bewußt, da ich verhindern will, dass das Licht sich nach 320sec ausschaltet, sofern es vorher manuell eingeschaltet wurde.
Ah, ungenannte Nebenbedingungen. Tsss.
So oder so, das schützt dich nicht vor der Sendeflut wenn du den Bewegungsmelder auslöst. Wie gesagt ist es bei deinem Konstrukt eigentlich auch überflüssig, on-for-timer zu senden. Wenn du nur "on" sendest geht's auch (und auch ohne entprellen) und an UND an den Aktor werden nicht zig Befehle gesendet.
Deine sonstigen Effekte würde ich im Zweifel erstmal hintenanstellen.
Probiere meinen einzeiler, und zwar nur mit "on" und dann sehen wir weiter.
Hallo stobor,
ich habe was sehr Ähnliches wie Du probiert und hänge auch fest. Wie bist Du damals weitergekommen?
Hm. Auf einen über ein Jahr alten Thread mit "ich habe irgendwas Ähnliche aber nicht weiter Genanntes versucht und irgendwelche aber nicht weiter genannte Probleme" wirst du vermutlich keine sinnvolle Antwort erhalten.
Fürchte ich. ;)