FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Frood42 am 31 Januar 2020, 23:53:46

Titel: define im DOIF drin
Beitrag von: Frood42 am 31 Januar 2020, 23:53:46
Guten Tag,
irgendwie scheint das mal wieder schwer zu sein mit dem Syntax klar zu kommen, deswegen muss ich eine Anfängerfrage stellen.
Sobald ich mehrere sets im define drin habe, das im DOIF ist, geht das define nicht mehr!
defmod di_motion_light_floor DOIF ([HM_MOTION_ENTRANCE:"motion:.on"]) (set floor1_lights on ;; sleep 2 ;; set floor2_lights on ;; (define off_lights_floor at +00:10:00 set floor1_lights off ;; sleep 1 ;; set floor2_lights off ))

Ich habe schon überall noch mehr Klammern versucht, das define sogar mal so definiert:
defmod di_motion_light_floor DOIF ([HM_5FEAAA_MOTION_ENTRANCE:"motion:.on"]) (set floor1_lights on ;; sleep 2 ;; set floor2_lights on ;; (define off_lights_floor at +00:10:00 { fhem("set floor1_lights off ;; set floor2_lights off")} ))

--> es wird alles ok ausgeführt, aber das define nicht angelegt.

So klappt es prima mit nur einer Aktion im define:
defmod di_motion_light_floor DOIF ([HM_MOTION_ENTRANCE:"motion:.on"]) (set floor1_lights on ;; sleep 2 ;; set floor2_lights on ;; define off_lights_floor at +00:10:00 set floor1_lights off)

Woran kann es denn noch liegen?

Danke und Grüße, Frood
Titel: Antw:define im DOIF drin
Beitrag von: Frank_Huber am 31 Januar 2020, 23:55:34
Commandref lesen, doif grundlagen. [emoji6]
Der Befehlstrenner ist das Komma, nicht das doppelte Semikolon.

Gesendet von meinem Doogee S60 mit Tapatalk

Titel: Antw:define im DOIF drin
Beitrag von: amenomade am 01 Februar 2020, 00:18:26
Zitat von: Frank_Huber am 31 Januar 2020, 23:55:34
Commandref lesen, doif grundlagen. [emoji6]
Der Befehlstrenner ist das Komma, nicht das doppelte Semikolon.

Gesendet von meinem Doogee S60 mit Tapatalk
Mit sleep muss man aber doch Semikolon benutzen.
Aber lieber das Attribut wait vom DOIF benutzen, statt sleeps und am Ende noch ein define at !

(Bedingung)
   (set floor1 on)
   (set floor2 on)
   (set floor1 off)
   (set floor 2 off)
attr ... wait 0,2,600,2

Mit noch do resetwait bleibt es on, wenn vor den 10 Mn wieder ein event motion kommt.
Titel: Antw:define im DOIF drin
Beitrag von: Otto123 am 01 Februar 2020, 00:22:49
Dein code erzeugt leichten Würgereiz  :o

Ein define im define mit at - ich weiß nicht genau wieviele ; man setzen muss - minimum 4!

https://commandref.fhem.de/#command

Also man kann sicher ein DOIF derart missbrauchen, aber irgendwie grenzt das an Schändung, ich würde nicht weiter versuchen den Code zum laufen zu bekommen. amenomade hat während ich schrieb schon den Weg aufgezeigt ;)

Gruß Otto
Titel: Antw:define im DOIF drin
Beitrag von: Frood42 am 05 Februar 2020, 11:22:39
Ähm naja, ok. Ich muss auch öfters brechen bei dem Code, so ist es nicht...

Aber wie könnte man das denn nun besser machen?
- ich reagiere auf den Bewegungsmelder
- möchte eine Aktion ausführen oder mehrere --> Lichter an
- und möchte eine Aktion (oder mehrere) einplanen --> Lichter nach 15 Minuten wieder aus

Wieviele andere Optionen hat man denn noch für so etwas?

Viele Grüße,
Frood
Titel: Antw:define im DOIF drin
Beitrag von: Damian am 05 Februar 2020, 11:29:04
Zitat von: Frood42 am 05 Februar 2020, 11:22:39
Ähm naja, ok. Ich muss auch öfters brechen bei dem Code, so ist es nicht...
..

Wieviele andere Optionen hat man denn noch für so etwas?

Warum fragst du nach anderen Optionen? Es gibt prinzipiell beliebig viele. ;)

Nimm doch einfach die Option, die dir bereits sinnvollerweise vorgeschlagen wurde. Oder brauchst noch die Übersetzung für deine Aktoren?

z. B.

DOIF ([HM_MOTION_ENTRANCE:"motion:.on"]) (set floor1_lights on) (set floor2_lights) (set floor1_lights off)

wait 0,2,600
Titel: Antw:define im DOIF drin
Beitrag von: Frood42 am 05 Februar 2020, 12:10:35
Aber das habe ich doch schon. Der einzige Unterschied ist, dass es ohne sleep ist und stattdessen das wait.

DOIF ([HM_MOTION_ENTRANCE:"motion:.on"]) (set floor1_lights on) (set floor2_lights) (set floor1_lights off)
oder
defmod di_motion_light_floor DOIF ([HM_MOTION_ENTRANCE:"motion:.on"]) (set floor1_lights on ;; sleep 2 ;; set floor2_lights on ;; (define off_lights_floor at +00:10:00 set floor1_lights off ;; sleep 1 ;; set floor2_lights off ))

Ist das jetzt so komplett anders, nur weil man es ohne Sleep macht? Meine Zeile funktioniert auch ohne Sleep nicht...

Zudem war der Sinn von dem hier:
define off_lights_floor at +00:10:00

Dass es ja aktualisiert werden kann.

Ich weiss nicht was passiert, wenn z.B. das DOIF alle 4 Minuten ausgelöst wird und ein wait 0,2,600 dafür sorgt, dass das Licht immer wieder nach 10 Minuten ausgeht...
Das eingeplante Ausschalten muss ja ggfs immer wieder überschrieben werden mit einem neuen Zeitstempel in 10 Minuten in der Zukunft.
Titel: Antw:define im DOIF drin
Beitrag von: Otto123 am 05 Februar 2020, 12:49:11
Vielleicht nochmal nachgefragt: Was soll eigentlich passieren?
Flur Lichter an und nach 10 min wieder aus - und wenn motion dann nachtriggern ohne aus?
Mein Melder steht auf 120 sec und wenn sich innerhalb 180 sec was bewegt geht das Licht nicht aus:

defmod di_Flurlicht DOIF ([PIR1:"motion:.on"] and (!isday("REAL")?1:0 or [?PIRWg:brightness] < 130)) (set SW01_Sw01 on)(set SW01_Sw01 off)
attr di_Flurlicht do resetwait
attr di_Flurlicht room Flur
attr di_Flurlicht wait 0,180


Funktioniert bei Dir set floor._lights on ? Oder warum brauchst Du 2 (1) sec Pause - weil es schön aussieht?
Dann mach (set floor1_lights on, set floor2_lights on) (set floor1_lights off, set floor2_lights off)
und wait 0:2,180:1

Dann mach (set floor1_lights on)( set floor2_lights on) (set floor1_lights off)( set floor2_lights off)
und wait 0,2,180,181

Aber wenn es unbedingt Dein Code sein soll, dann musst Du meinen Hinweis mit den Semikolons beachten! Und eben noch etwas probieren.

Gruß Otto
Titel: Antw:define im DOIF drin
Beitrag von: Frood42 am 05 Februar 2020, 13:24:00
Hi Otto,

ich glaube Du hast gleich mehrere Raffinessen kombiniert  ;)
Mit dem
attr di_Flurlicht do resetwait
erwirkst Du dass nichts aus geht, wenn sich innerhalb 180 etwas bewegt... oder? Damit wird der timer sozusagen resetted.

Das Problem mit dem Timer überschreiben habe ich an mehreren Stellen...

Es soll einfach etwas angeschaltet werden wenn Bewegung registriert wird und nach dieser Bewegung nach x Minuten wieder ausgeschaltet.
Und das soll passieren, auch wenn ich alle 2 Minuten die Bewegung registriere. Ein erneutes Anschalten, wenn etwas an ist, ist ok - da passiert nichts. Nur das Ausschalten muss eben weiter nach hinten verschoben werden.
An einer Stelle (einem Monitor) wäre es auch gut wenn mein DOIF wüsste, dass etwas schon AN ist, und das Anmachen nicht noch mal wiederholt, aber das ist advanced...

Grüße,
Frood

Titel: Antw:define im DOIF drin
Beitrag von: Otto123 am 05 Februar 2020, 14:20:35
Naja dann hab ich es doch richtig verstanden. Dann sieht doch der Code übersichtlicher aus - oder?
resetwait startet quasi den Timer neu, solange er nicht abgelaufen ist geht nichts aus.
Titel: Antw:define im DOIF drin
Beitrag von: Frood42 am 05 Februar 2020, 14:32:36
Das werde ich mal probieren!
Viiiiielen Dank
Titel: Antw:define im DOIF drin
Beitrag von: amenomade am 05 Februar 2020, 18:34:51
Zitat von: Frood42 am 05 Februar 2020, 13:24:00

Mit dem
attr di_Flurlicht do resetwait
erwirkst Du dass nichts aus geht, wenn sich innerhalb 180 etwas bewegt... oder? Damit wird der timer sozusagen resetted.

Ja... wie schon hier erwähnt...https://forum.fhem.de/index.php/topic,107977.msg1019620.html#msg1019620
Titel: Antw:define im DOIF drin
Beitrag von: Frood42 am 06 Februar 2020, 21:03:33
Also, das funktioniert! Vielen Dank. Allerdings mal wieder etwas holprig. Sie entscheidenden Erkenntnisse erreicht man am Ende nur durch Ausprobieren.

defmod di_motion_light_floor DOIF ([HM_5FEAAA_MOTION_ENTRANCE:"motion:.on"]) (set floor1_lights on) (set floor2_lights on) (set floor1_lights off) (set floor2_lights off)
attr di_motion_light_floor do resetwait
attr di_motion_light_floor wait 0,1,900,901


Die Readings zu diesem DOIF färben sich ja bei einer Aktualisierung Rot. Dadurch kann man auch sehr schön sehen, dass nur

wait_timer 06.02.2011 11:10:21 cmd_1_3 HM_5FEAAA_MOTION_ENTRANCE 2020-02-06 11:55:21

aktualisiert wurde. und nicht cmd oder cmd_event

Daraus ergibt sich noch eine abschliessende Frage;

Bedeutet die nicht-Aktualisierung und nicht rot-Färbung der readings cmd und cmd_event,
dass auch die ersten zwei commands (light on) bei wiederholtem motion:.on innheralb von 900 Sek. nicht ausgeführt werden?

Viele Grüße,
Frood
Titel: Antw:define im DOIF drin
Beitrag von: Frood42 am 06 Februar 2020, 21:21:39
Noch ein wenig mehr für den Brechreiz  :o
Dieser hier konnte dadurch auch verbessert werden  ::) Der hatte aber bis auf wiederholtes Anschalten prima funktioniert  ;D

defmod di_motion_monitor_kitchen DOIF ([HM_5FEBBB_MOTION_KITCHEN:"motion:.on"]) {system ("/opt/fhem/bin/fhemswitchmonitor.sh on &") ;; fhem("defmod stop_Monitor at +00:00:10 {system (\"/opt/fhem/bin/fhemswitchmonitor.sh off &\")}")  ;; fhem("modify stop_Monitor +01:00:00")}


Gude!
Titel: Antw:define im DOIF drin
Beitrag von: Otto123 am 07 Februar 2020, 10:09:56
Zitat von: Frood42 am 06 Februar 2020, 21:03:33
Daraus ergibt sich noch eine abschliessende Frage;

Bedeutet die nicht-Aktualisierung und nicht rot-Färbung der readings cmd und cmd_event,
dass auch die ersten zwei commands (light on) bei wiederholtem motion:.on innheralb von 900 Sek. nicht ausgeführt werden?
Moin,

theoretisch kann bei Dir der Timer nach 240 sec abgebrochen werden (wenn den HM BM auf "Standard" steht) Also die ersten beiden Befehle müssten immer laufen die eine sec kann nicht abgebrochen werden.
Aber: keiner der Befehle wird wiederholt wenn der Timer immer abgebrochen wird. Aber das ist ja so gewollt?!

Den würde ich so machen:
defmod di_motion_monitor_kitchen DOIF ([HM_5FEBBB_MOTION_KITCHEN:"motion:.on"]) ("/opt/fhem/bin/fhemswitchmonitor.sh on")("/opt/fhem/bin/fhemswitchmonitor.sh off")
attr di_motion_monitor_kitchen resetwait
attr di_motion_light_floor wait 0,3600


Zum lesen: https://fhem.de/commandref_DE.html#command

Oder ich habe ihn nicht verstanden. Warum erst 10 sekunden und dann 1h - ist mir nicht klar ?

Wegen dem holprig: Ja mein Vorschlag war falsch, habe es oben korrigiert ;)

Gruß Otto
Titel: Antw:define im DOIF drin
Beitrag von: Frood42 am 07 Februar 2020, 10:36:36
Fast ganz genauso habe ich es gemacht. Mann bin ich gut. Habe ja fast - zumindest temporär - und partiell - das Otto-fhem-Level erreicht  :o :o :o Awesome


defmod di_motion_monitor_kitchen DOIF ([HM_5FEBBB_MOTION_KITCHEN:"motion:.on"]) ({system("/opt/fhem/bin/fhemswitchmonitor.sh on")}) ({system("/opt/fhem/bin/fhemswitchmonitor.sh off")})
attr di_motion_monitor_kitchen resetwait
attr di_motion_light_floor wait 0,3600


Allerdings habe ich keine Ahnung warum der Timer nach 240 sec abgebrochen werden kann. Aber ich glaube dabei ging es auch um die alte Version , ne.

Bei den Lichtern im Flur bin ich mir nicht sicher, manchmal geht da nur eins (floor1_lights) aus, und nicht beide (floor2_lights und floor1_lights) aber das muss man mal beobachten....  :o
Titel: Antw:define im DOIF drin
Beitrag von: Otto123 am 07 Februar 2020, 10:42:19
system() ist an der Stelle unnütz!
Zitatwarum der Timer nach 240 sec abgebrochen werden
Weil der BM nur alle 240 sec (im BM einstellbar) eine Bewegung registriert. D.h. erst frühestens nach 240 sec kann ein neuer Event kommen, der das DOIF wieder triggert.

Dei Beobachtung kannst Du ja loggen, ist meist besser als das Gefühl. Es muss ja einen Grund geben (die Frage hast DU nicht beantwortet) warum Du 1 sec zeit lässt. Ich nehme an weil das Dinger sind die man nicht mit einem IO gleichzeitig beschicken kann?

Gruß Otto
Titel: Antw:define im DOIF drin
Beitrag von: Frood42 am 07 Februar 2020, 12:33:17
Ok, aber der Timer wird ja dann nach 240 sec nicht abgebrochen, wenn dann eine Bewegung registriert wird,  sondern neu bestellt, also wieder auf 900,901 in der Zukunft, oder?

Ja, das mit der einen Sekunde unterschied habe ich gemacht, weil es den Eindruck erweckt hat, dass das Ikea GW nicht zwei Befehle auf einmal verarbeiten kann. Also beim Einschalten sieht es einfach besser aus wenn die Lichter den Gang entlang angehen, aber beim Ausgehen dachte ich es liegt daran dass das GW das nicht kann, weil einmal eine Lampe anblieb. Dass eine anblieb habe ich aber auch noch mal beobachtet, das muss ich mal genauer beobachten, oder am besten loggen... yes.
Titel: Antw:define im DOIF drin
Beitrag von: Otto123 am 07 Februar 2020, 12:44:45
Zitatnach 240 sec nicht abgebrochen, wenn dann eine Bewegung registriert wird,  sondern neu bestellt
Ja ...
...es liegt im Auge des Betrachters:  :D zurückgesetzt auf den Ausgangswert und neu gestartet.
Titel: Antw:define im DOIF drin
Beitrag von: Frood42 am 17 Februar 2020, 15:44:03
Also der Käse der läuft so prima.
Bei einem attr di_motion_light_floor wait 0,1,3600,1  muss man sagen, dass die Werte wohl immer ein Delta zu dem vorigen Wert darstellen / bedeuten...
Ein attr di_motion_light_floor wait 0,1,3600,3601 bewirkt, dass der 4. Befehl 3601 nach dem 3. Befehl ausgeführt wird.
Titel: Antw:define im DOIF drin
Beitrag von: Otto123 am 17 Februar 2020, 18:41:47
Stimmt, ist so auch dokumentiert :)
ZitatDie Verzögerungszeit bezieht sich immer auf den vorherigen Befehl.
War mir glaub ich nicht so bewusst ;)
Titel: Antw:define im DOIF drin
Beitrag von: Frood42 am 06 März 2020, 22:08:42
Kann man denn anstatt einem
(set floor2_lights on) und (set floor2_lights off)
wait 0,900

genausogut ein

(set floor2_lights on-for-timer 900)
verwenden? Das erscheint mir einfacher, kürzer.
Titel: Antw:define im DOIF drin
Beitrag von: Frank_Huber am 06 März 2020, 22:12:58
Zitat von: Frood42 am 06 März 2020, 22:08:42
Kann man denn anstatt einem
(set floor2_lights on) und (set floor2_lights off)
wait 0,900

genausogut ein

(set floor2_lights on-for-timer 900)
verwenden? Das erscheint mir einfacher, kürzer.
Wenn dein aktor das zulässt, klar!

Gesendet von meinem S68Pro mit Tapatalk

Titel: Antw:define im DOIF drin
Beitrag von: Otto123 am 06 März 2020, 22:27:24
Zitat von: Frood42 am 06 März 2020, 22:08:42
verwenden? Das erscheint mir einfacher, kürzer.
Wenn es das Ziel ist die Befehle kurz zu halten klar ;)

Der große Unterschied ist das nachtriggern! Das (set on) (set off) mit dem wait Timer sendet ein on und wenn immer wieder durch Bewegung innerhalb des Timers ein Reset des Timers erfolgt erst ganz am Ende ein off.
Ein set on-for-timer sendet bei jedem trigger ein on-for-timer. Hängt davon ab ob der Aktor das kann und "verkraftet". Es gab glaub ich Aktoren, die kurz ausgehen.

Gruß Otto