Moin! :)
Ich hab da noch ein Verständnisproblem mit cmdState.
Mein Bewegungsmelder der Auffahrt habe ich mal an eine Lampe im Flur zwecks test gekoppelt. Ich lese aus, ob Motion ein "on*" von sich gibt und es dunkel ist und dann schalte ich für 5 Minuten die Lampe im Flur an, dann geht sie aus.
define test1 DOIF ([auffahrt_HM_BM1:motion] =~ "on" and [auffahrt_HM_BM1:brightness] < 70)
(set fl_Lava on-for-timer 300)
Nun erzeugt das ja einen state cmd_1, ich bräuchte aber 2 states, also on und off, sonst ist ja die Anzeige nicht korrekt.
Also nochmal nachgelesen und ein DOELSE (set fl_Lava off) hinzugefügt.
Die cmdStates hab ich mit on|off angegeben.
Aber irgendwie funktioniert das noch nicht wie gewünscht. Wo ist der Haken? Muss ich auf irgendwas besonders achten?
Besten Dank!
Stefan
Edit: jetzt hab ich über die States hier gelesen: https://forum.fhem.de/index.php/topic,50284.0.html und bin verwirrt :) ein do always hab ich nicht drin...
Statt DOELSE (set fl_Lava off)
nimm DOELSEIF ([fl_Lava] eq "off")
, dann ist der Status off, wenn die Lampe ausgeht.
Was aber nur geht, wenn fl_Lava auch was zurück gibt. Sonst müsstest du den on-for-Timer in Fhem parallel erzeugen (mit evtl. Abweichungen) oder das Aus-Signal auch vom DOIF ausgeben.
define test1 DOIF ([auffahrt_HM_BM1:motion] =~ "on" and [auffahrt_HM_BM1:brightness] < 70) (set fl_Lava on)
DOELSE (set fl_Lava off)
attr test1 wait 0:300
attr test1 cmdStates on|off
Nebenbei würde ich [?auffahrt_HM_BM1:brightness] < 70 nehmen, sonst wird der Timer bei jeder Helligkeitsveränderung neu angetriggert (je nach Bewegungsmelder notwendig)
Evtl. brauchst du auch noch ein
attr test1 do always
was aber, wie das Fragezeichen, vom Bewegungsmelder abhängig ist.
Danke :)
Also ich schalte zur Zeit eine Intertechno IT-1500 ohne Rückmeldung. Der Bewegungsmelder ist ein Homematic außen (hab gerade die Nummer nicht zur Hand, gibt ja nur einen).
Das mit dem ? klingt logisch. Ich werde jetzt mal ein wenig testen und mich dann wieder melden. Danke an Euch beide!
Grüße
Stefan
Leider geht die Lampe immer an und nicht wieder aus. :(
Ich hab mal die Events geloggt:
2016.03.11 23:38:59 2 : IT set fl_Lava on
2016-03-11 23:38:59 IT fl_Lava on
2016-03-11 23:38:59 DOIF test_bm cmd_nr: 1
2016-03-11 23:38:59 DOIF test_bm cmd_event: auffahrt_HM_BM1
2016-03-11 23:38:59 DOIF test_bm on
2016-03-11 23:38:59 CUL_HM auffahrt_HM_BM1 battery: ok
2016-03-11 23:38:59 CUL_HM auffahrt_HM_BM1 brightness: 56
2016-03-11 23:38:59 CUL_HM auffahrt_HM_BM1 cover: closed
2016-03-11 23:44:44 CUL_HM auffahrt_HM_BM1 battery: ok
2016-03-11 23:44:44 CUL_HM auffahrt_HM_BM1 brightness: 56
2016-03-11 23:44:44 CUL_HM auffahrt_HM_BM1 cover: closed
das do always hab ich raus, aber das ? hab ich drin, weil der BM halt ständig seinen Status mitteilt...
Hier mal der momentane code:
define test_bm DOIF ([auffahrt_HM_BM1:motion] =~ "on" and [?auffahrt_HM_BM1:brightness] < 60)\
(set fl_Lava on)\
DOELSE (set fl_Lava off)
attr test_bm cmdState on|off
attr test_bm room Auffahrt
attr test_bm wait 0:300
In deiner Eventlist sehe ich auffahrt_HM_BM1:motion gar nicht.
Nee da ist ja auch gar keiner lang gegangen... Der meldet nur die Helligkeit und die Lampe geht an
Zitat von: Esteban am 12 März 2016, 00:43:37
Nee da ist ja auch gar keiner lang gegangen... Der meldet nur die Helligkeit und die Lampe geht an
Dein Bewegungsmelder produziert dann ein Event und das Reading motion steht immer auf on. Das Problem lässt sich schnell lösen, indem man statt das Reading nur das Event auswertet, bei dir:
statt:
[auffahrt_HM_BM1:motion] =~ "on" ...
[auffahrt_HM_BM1:"motion"] ...
Gruß
Damian
Danke!
define test_bm DOIF ([auffahrt_HM_BM1:"motion"] and [?auffahrt_HM_BM1:brightness] < 70)\
(set fl_Lava on)\
DOELSE (set fl_Lava off)
attr test_bm cmdState on|off
attr test_bm room Auffahrt
attr test_bm wait 0:300
Das ist jetzt aus der FHEM.cfg
Ist denn die Abfrage auf die Helligkeit jetzt so in Ordnung und auch das wait-attribut und die States so optimal?
Ich hab das jetzt so verstanden, dass wait 0:300 jetzt 300 Sekunden die Lampe an schaltet und danach wieder aus. Nur haut das nicht hin, die Lampe brennt rund 10 Minuten. Das ist irgendwie verwirrend. Kann man anstelle des wait nicht das on-for-timer lösen? Was ist da die bessere Wahl?
Schönen Sonntag!
Grüße
Stefan
Zitat von: Esteban am 13 März 2016, 12:16:40Ich hab das jetzt so verstanden, dass wait 0:300 jetzt 300 Sekunden die Lampe an schaltet und danach wieder aus. Nur haut das nicht hin, die Lampe brennt rund 10 Minuten.
Was sagt denn der Eventmonitor dazu?
Zitat von: Esteban am 13 März 2016, 12:16:40Kann man anstelle des wait nicht das on-for-timer lösen? Was ist da die bessere Wahl?
Das Wider habe ich doch schon oben aufgeführt. Machbar ist es aber.
Hallo!
Hier mal der Event-Log. Ich hab ne andere Lampe genommen, die in Reichweite war... :)
2016-03-14 19:09:59 DOIF test_bm wait_timer: no timer
2016-03-14 19:09:59 IT gal_LED_Lese on
2016-03-14 19:09:59 DOIF test_bm cmd_nr: 1
2016-03-14 19:09:59 DOIF test_bm cmd_event: auffahrt_HM_BM1
2016-03-14 19:09:59 DOIF test_bm on
2016-03-14 19:09:59 CUL_HM auffahrt_HM_BM1 brightness: 72
2016-03-14 19:09:59 CUL_HM auffahrt_HM_BM1 motion: on (to VCCU)
2016-03-14 19:09:59 CUL_HM auffahrt_HM_BM1 motionCount: 111_next:116s
2016-03-14 19:09:59 CUL_HM auffahrt_HM_BM1 motion
2016-03-14 19:09:59 CUL_HM auffahrt_HM_BM1 trigDst_VCCU: noConfig
2016-03-14 19:09:59 CUL_HM auffahrt_HM_BM1 trigger_cnt: 111
2016-03-14 19:12:28 DOIF test_bm wait_timer: 14.03.2016 19:17:28 cmd_2 auffahrt_HM_BM1
2016-03-14 19:12:28 CUL_HM auffahrt_HM_BM1 battery: ok
2016-03-14 19:12:28 CUL_HM auffahrt_HM_BM1 brightness: 72
2016-03-14 19:12:28 CUL_HM auffahrt_HM_BM1 cover: closed
2016-03-14 19:17:35 DOIF test_bm wait_timer: no timer
2016-03-14 19:17:36 IT gal_LED_Lese off
2016-03-14 19:17:36 DOIF test_bm cmd_nr: 2
2016-03-14 19:17:36 DOIF test_bm cmd_event: auffahrt_HM_BM1
2016-03-14 19:17:36 DOIF test_bm off
2016-03-14 19:17:36 CUL_HM auffahrt_HM_BM1 battery: ok
2016-03-14 19:17:36 CUL_HM auffahrt_HM_BM1 brightness: 72
2016-03-14 19:17:36 CUL_HM auffahrt_HM_BM1 cover: closed
Das DOIF schaut jetzt so aus
define test_bm DOIF ([auffahrt_HM_BM1:"motion"] and [?auffahrt_HM_BM1:brightness] < 120)\
(set gal_LED_Lese on)\
DOELSE (set gal_LED_Lese off)
attr test_bm cmdState on|off
attr test_bm room Auffahrt
attr test_bm wait 0:300
300 Sekunden sind bei mir aber irgendwie 7,5 Minuten... mir fehlt da die Logik! :)
Zitat300 Sekunden sind bei mir aber irgendwie 7,5 Minuten... mir fehlt da die Logik!
Immer wenn [auffahrt_HM_BM1:"motion"] triggert, werden die 300 s neu gestartet. Die Lampe geht 300s nach dem letzten Trigger aus.
ahh danke! Jetzt hats Bing gemacht.
generell ist das ja auch sinnvoll, sofern wieder ein Motion-Event ausgelöst wird - aber nur dann.
Irgendwie ist es so noch nicht zufriedenstellend... ;)
Probier mal Folgendes:
define test_bm DOIF ([auffahrt_HM_BM1:"motion"] and [?auffahrt_HM_BM1:brightness] < 120) \
(set gal_LED_Lese on) (set gal_LED_Lese off) \
DOELSE (set gal_LED_Lese off)
attr test_bm cmdState off|off
attr test_bm room Auffahrt
attr test_bm wait 0,300
Allerdings wird z.Zt. statt "an" noch "cmd_1_1" angezeigt, aber da ist schon eine Änderung angekündigt.
Danke!
Nun ist es so, dass die Lampe nur 3 Minuten brennt :)
2016-03-15 07:30:34 IT gal_LED_Lese on
2016-03-15 07:30:34 DOIF test_bm cmd_nr: 1
2016-03-15 07:30:34 DOIF test_bm cmd_seqnr: 1
2016-03-15 07:30:34 DOIF test_bm cmd_event: auffahrt_HM_BM1
2016-03-15 07:30:34 DOIF test_bm cmd_1_1
2016-03-15 07:30:34 DOIF test_bm wait_timer: 15.03.2016 07:35:34 cmd_1_2 auffahrt_HM_BM1
2016-03-15 07:30:34 CUL_HM auffahrt_HM_BM1 brightness: 98
2016-03-15 07:30:34 CUL_HM auffahrt_HM_BM1 motion: on (to VCCU)
2016-03-15 07:30:34 CUL_HM auffahrt_HM_BM1 motionCount: 113_next:116s
2016-03-15 07:30:34 CUL_HM auffahrt_HM_BM1 motion
2016-03-15 07:30:34 CUL_HM auffahrt_HM_BM1 trigDst_VCCU: noConfig
2016-03-15 07:30:34 CUL_HM auffahrt_HM_BM1 trigger_cnt: 113
2016-03-15 07:33:18 DOIF test_bm wait_timer: no timer
2016-03-15 07:33:19 IT gal_LED_Lese off
2016-03-15 07:33:19 DOIF test_bm cmd_nr: 2
2016-03-15 07:33:19 DOIF test_bm cmd_event: auffahrt_HM_BM1
2016-03-15 07:33:19 DOIF test_bm off
2016-03-15 07:33:19 CUL_HM auffahrt_HM_BM1 battery: ok
2016-03-15 07:33:19 CUL_HM auffahrt_HM_BM1 brightness: 105
2016-03-15 07:33:19 CUL_HM auffahrt_HM_BM1 cover: closed
Dadurch ist nun das Problem, dass der Bewegungsmelder nicht erneut auslöst, weil er ja noch "gesperrt" ist. Anscheinend wird hier sofort bei der nächsten Meldung des Bewegunsmelders auf off geschaltet...
Lass mal den DOELSIF-Zweig ganz weg. Hatte die ganzen anderen Meldungen nicht berücksichtigt :-[. (War schon spät ;)).
Hehe, kenne ich :)
Danke! Ist eingebaut. Allerdings ist mein Arm gerade nicht so lang um den Bewegungsmelder auslösen zu können, mache ich heute Abend wenn ich wieder zu Hause bin :)
Edit: state off|off ist so richtig?
Zitat von: Esteban am 15 März 2016, 10:06:07Edit: state off|off ist so richtig?
Nach der Änderung gibt es nur einen benennbaren State, der andere wird (z.Zt noch (https://forum.fhem.de/index.php/topic,49109.msg424219.html#msg424219)) automatisch vergeben. Kannst du also auch ganz weglassen.
Oder
attr test_bm cmdState off schreiben.
attr test_bm cmdState off|off war richtig, als es zwei Zweige gab. Half aber auch nicht wirklich weiter, weil ja der State
cmd_1_1 der interessante ist, und der wird wie gesagt noch nicht benannt.
also ich hab jetzt
define test_bm DOIF ([auffahrt_HM_BM1:"motion"] and [?auffahrt_HM_BM1:brightness] < 220)\
(set gal_LED_Lese on) (set gal_LED_Lese off)
attr test_bm cmdState off
attr test_bm room Auffahrt
attr test_bm wait 0,300
hier die Events:
2016.03.15 19:46:54 2 : IT set gal_LED_Lese on
2016-03-15 19:46:55 IT gal_LED_Lese on
2016-03-15 19:46:55 DOIF test_bm cmd_nr: 1
2016-03-15 19:46:55 DOIF test_bm cmd_seqnr: 1
2016-03-15 19:46:55 DOIF test_bm cmd_event: auffahrt_HM_BM1
2016-03-15 19:46:55 DOIF test_bm cmd_1_1
2016-03-15 19:46:55 DOIF test_bm wait_timer: 15.03.2016 19:51:55 cmd_1_2 auffahrt_HM_BM1
2016-03-15 19:46:55 CUL_HM auffahrt_HM_BM1 brightness: 77
2016-03-15 19:46:55 CUL_HM auffahrt_HM_BM1 motion: on (to VCCU)
2016-03-15 19:46:55 CUL_HM auffahrt_HM_BM1 motionCount: 117_next:116s
2016-03-15 19:46:55 CUL_HM auffahrt_HM_BM1 motion
2016-03-15 19:46:55 CUL_HM auffahrt_HM_BM1 trigDst_VCCU: noConfig
2016-03-15 19:46:55 CUL_HM auffahrt_HM_BM1 trigger_cnt: 117
2016-03-15 19:48:23 DOIF test_bm wait_timer: no timer
2016-03-15 19:48:23 DOIF test_bm cmd_nr: 2
2016-03-15 19:48:23 DOIF test_bm cmd_event: auffahrt_HM_BM1
2016-03-15 19:48:23 DOIF test_bm
2016-03-15 19:48:23 CUL_HM auffahrt_HM_BM1 battery: ok
2016-03-15 19:48:23 CUL_HM auffahrt_HM_BM1 brightness: 77
2016-03-15 19:48:23 CUL_HM auffahrt_HM_BM1 cover: closed
Ist jetzt 19:54 und die Lampe brennt noch :/
2016-03-15 19:48:23 CUL_HM auffahrt_HM_BM1 gibt es ein Event von "auffahrt_HM_BM1" damit wird die Bedingung unwahr und nimmt den Status "cmd_2" an. Damit wird der Wait-Timer zurückgesetzt bevor (set gal_LED_Lese off) ausgeführt werden konnte. Deshalb brennt die Lampe um 19:54 immer noch.
Da nur eine Bedingung da ist, sollte man do always oder do resetwait setzen. Damit gibt es keinen "imaginären" cmd_2-Fall.
Bei do always wird der Timer bei wiederholtem "motion" nicht verlängert bei do resetwait wohl.
Dieses Beispiel steht seit geraumer Zeit in der Commandref von 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
Vielleicht geht es so:
define test_bm DOIF ([auffahrt_HM_BM1:"motion"] and [?auffahrt_HM_BM1:brightness] < 220 and ([?test_bm] eq "cmd_2" or [?test_bm] eq "initialized")
(set gal_LED_Lese on) ()
DOELSEIF ([[test_bm] eq "cmd_1"])
(set gal_LED_Lese off)
und die Attribute
selftrigger 1
wait 0,299:1
stateFormat {Value("test_bm") eq "cmd_1_1" ? "on" : "off"}
mit dieser DOIF-Version: https://forum.fhem.de/index.php/topic,49109.msg424219.html#msg424219
Bei motion-Event wird die Lampe eingeschaltet, brennt 299 s, dann wird weitergeschaltet und nach 1 s geht das Licht aus. Erst dann kann ein weiteres motion-Event den Vorgang erneut starten.
Damian: oh well, ja am Anfang denkt man man macht was anderes und am Ende des Threads kommt dann was raus, was auch in der Commandref steht 8) Das tut mir leid. Ich danke Dir!
Ellert: danke danke! Ich werde beides testen: vorweg den Tipp von Damian berücksichtigen und später/morgen deine Version!
Besten Dank! :)
supi, mit doreset wait... gehts!
2016.03.15 21:52:23 2 : IT set gal_LED_Lese on
2016-03-15 21:52:23 structure gal_PC_LED on
2016-03-15 21:52:23 IT gal_LED_Lese on
2016-03-15 21:52:23 DOIF test_bm cmd_nr: 1
2016-03-15 21:52:23 DOIF test_bm cmd_seqnr: 1
2016-03-15 21:52:23 DOIF test_bm cmd_event: auffahrt_HM_BM1
2016-03-15 21:52:23 DOIF test_bm cmd_1_1
2016-03-15 21:52:23 DOIF test_bm wait_timer: 15.03.2016 21:57:23 cmd_1_2 auffahrt_HM_BM1
2016-03-15 21:52:23 CUL_HM auffahrt_HM_BM1 brightness: 99
2016-03-15 21:52:23 CUL_HM auffahrt_HM_BM1 motion: on (to VCCU)
2016-03-15 21:52:23 CUL_HM auffahrt_HM_BM1 motionCount: 121_next:116s
2016-03-15 21:52:23 CUL_HM auffahrt_HM_BM1 motion
2016-03-15 21:52:23 CUL_HM auffahrt_HM_BM1 trigDst_VCCU: noConfig
2016-03-15 21:52:23 CUL_HM auffahrt_HM_BM1 trigger_cnt: 121
2016-03-15 21:53:31 CUL_HM auffahrt_HM_BM1 battery: ok
2016-03-15 21:53:31 CUL_HM auffahrt_HM_BM1 brightness: 99
2016-03-15 21:53:31 CUL_HM auffahrt_HM_BM1 cover: closed
2016-03-15 21:57:23 DOIF test_bm wait_timer: no timer
2016.03.15 21:57:23 2 : IT set gal_LED_Lese off2016-03-15 21:57:23 structure gal_PC_LED undefined
2016-03-15 21:57:23 IT gal_LED_Lese off
2016-03-15 21:57:23 DOIF test_bm cmd_nr: 1
2016-03-15 21:57:23 DOIF test_bm cmd_seqnr: 2
2016-03-15 21:57:23 DOIF test_bm cmd_event: auffahrt_HM_BM1
2016-03-15 21:57:23 DOIF test_bm off
2016-03-15 21:59:43 CUL_HM auffahrt_HM_BM1 battery: ok
2016-03-15 21:59:43 CUL_HM auffahrt_HM_BM1 brightness: 99
2016-03-15 21:59:43 CUL_HM auffahrt_HM_BM1 cover: closed
also um nochmal auf den Threadtitel zu kommen... doreset wait bedeutet, dass er den State zurücksetzt und wieder auf die definierte Bedingung wartet, richtig?