Hauptmenü

define im DOIF drin

Begonnen von Frood42, 31 Januar 2020, 23:53:46

Vorheriges Thema - Nächstes Thema

Frood42

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

Frank_Huber

Commandref lesen, doif grundlagen. [emoji6]
Der Befehlstrenner ist das Komma, nicht das doppelte Semikolon.

Gesendet von meinem Doogee S60 mit Tapatalk


amenomade

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.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

#3
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Frood42

Ä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

Damian

#5
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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Frood42

#6
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.

Otto123

#7
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Frood42

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


Otto123

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.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Frood42

Das werde ich mal probieren!
Viiiiielen Dank

amenomade

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
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Frood42

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

Frood42

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!

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz