FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: doman75 am 07 Februar 2019, 15:06:49

Titel: selftrigger
Beitrag von: doman75 am 07 Februar 2019, 15:06:49
hallo, ich habe eine DOIF zum Testen, das schaltet einfahc mal einen Dummy on und off. Drücke ich auf Aus beim DOIF, geht der dummy aus und das DOIF auch, drücke ich auf An beim DOIF, geht das DOIF auf An und der Dummy ebenso, aber nachden 10 Sekunden wait geht nur der Dummy auf aus und das DOIF bleibt auf An, es steht immer da das cmd1_2 ausgeführt wurde, niemals cmd2, das kann ja aber nicht sein nur da geht ja der Dummy aus. Jemand eine Idee was ich falsch mache oder wie ich es machen kann?

Grüße
Swen


defmod TEST DOIF ([$Self] eq "on") (set DummyTest on) (set TEST off)\
DOELSEIF\
([$Self] eq "off") (set DummyTest off)\
\

attr TEST cmdState on|off
attr TEST eventMap on:An off:Aus
attr TEST setList on off
attr TEST wait 0,10
Titel: Antw:selftrigger
Beitrag von: Damian am 07 Februar 2019, 18:07:19
Der erste Zweig wurde als von cmd_1 auf on umdefiniert und von cmd_2 auf off. Damit kann der Zustand des Moduls nur on sein und im zweiten Zweig statt cmd_2  off.
Titel: Antw:selftrigger
Beitrag von: doman75 am 07 Februar 2019, 18:44:32
Naja das weiss ich im ersten Teil "on" wird ja dasselbe Doif  ja mit set TEST off  gesetzt, der Teil im "off" Bereich wird ja auch ausgeführt nur der Status ändert sich nicht mit auf oft. Ich weiss nicht wie ich es besser erklären soll, vielleicht einfach mal die Raw importieren.
Titel: Antw:selftrigger
Beitrag von: Damian am 07 Februar 2019, 18:49:26
Zitat von: doman75 am 07 Februar 2019, 18:44:32
Naja das weiss ich im ersten Teil "on" wird ja dasselbe Doif  ja mit set TEST off  gesetzt, der Teil im "off" Bereich wird ja auch ausgeführt nur der Status ändert sich nicht mit auf oft. Ich weiss nicht wie ich es besser erklären soll, vielleicht einfach mal die Raw importieren.

set Test off befindet sich im ersten Zweig, daher on

Edit: Was du willst, ist eher: cmdState on,off|off
Titel: Antw:selftrigger
Beitrag von: doman75 am 08 Februar 2019, 06:47:09
Das stimmt mit on,off|off hatte ich schon getestet und das hat funtkioniert. Aber mir ist nicht klar warum es ohne das zusätzliche off f+r cmd1_2 nicht geht, im cmd1_2 (set TEST off) triggert das DOIF sich ja im Prinzip selber auf cmd2. Was im cmd2 steht "(set DummyTest off)" wird ja auch ausgeführt nur der eigene DOIF Status bleibt bei cmd1_2 hängen.
Titel: Antw:selftrigger
Beitrag von: Damian am 08 Februar 2019, 07:44:12
Zitat von: doman75 am 08 Februar 2019, 06:47:09
Das stimmt mit on,off|off hatte ich schon getestet und das hat funtkioniert. Aber mir ist nicht klar warum es ohne das zusätzliche off f+r cmd1_2 nicht geht, im cmd1_2 (set TEST off) triggert das DOIF sich ja im Prinzip selber auf cmd2. Was im cmd2 steht "(set DummyTest off)" wird ja auch ausgeführt nur der eigene DOIF Status bleibt bei cmd1_2 hängen.

Das tut er gerade nicht, das Modul triggert sich normalerweise nicht selbst, siehe Attribut selftrigger.
Titel: Antw:selftrigger
Beitrag von: doman75 am 08 Februar 2019, 07:58:48

2019-02-08 07:55:41.225 DOIF TEST cmd_nr: 1
2019-02-08 07:55:41.225 DOIF TEST cmd_seqnr: 1
2019-02-08 07:55:41.225 DOIF TEST cmd: 1.1
2019-02-08 07:55:41.225 DOIF TEST cmd_event: set_on_cmd_1
2019-02-08 07:55:41.225 DOIF TEST An
2019-02-08 07:55:41.228 DOIF TEST wait_timer: 08.02.2019 07:55:51 cmd_1_2 set_on_cmd_1
2019-02-08 07:55:51.230 DOIF TEST wait_timer: no timer
2019-02-08 07:55:51.236 DOIF TEST cmd_nr: 2
2019-02-08 07:55:51.236 DOIF TEST cmd: 2
2019-02-08 07:55:51.236 DOIF TEST cmd_event: set_off_cmd_2
2019-02-08 07:55:51.236 DOIF TEST Aus
2019-02-08 07:55:51.240 DOIF TEST cmd_nr: 1
2019-02-08 07:55:51.240 DOIF TEST cmd_seqnr: 2
2019-02-08 07:55:51.240 DOIF TEST cmd: 1.2
2019-02-08 07:55:51.240 DOIF TEST cmd_event: set_on_cmd_1
2019-02-08 07:55:51.240 DOIF TEST An


Also da ich nicht $Self schreibe nehme ich an es erkennt gar nicht das es sich um sich selbst ahnelt beim Befehl "set TEST off", im eventlog sieht man aber sehr schön das cmd2 sehr wohl ausgelöst wird, aber  der letzte Befehl eben cmd1_2 ist.
Titel: Antw:selftrigger
Beitrag von: doman75 am 08 Februar 2019, 08:01:10
ich habe jetzt beim wait attr mal 0,10:10 gesetzt um cmd2 zu verzögern aber das greift gar nicht. Ist die Syntax falsch?
Titel: Antw:selftrigger
Beitrag von: amenomade am 25 Februar 2019, 18:09:05
Zitat von: doman75 am 08 Februar 2019, 07:58:48

Also da ich nicht $Self schreibe nehme ich an es erkennt gar nicht das es sich um sich selbst ahnelt beim Befehl "set TEST off"
Und Du nimmst falsch an.
Zitat von: CommandRefStandardmäßig unterbindet das DOIF-Modul Selbsttriggerung. D. h. das Modul reagiert nicht auf Events, die es selbst direkt oder indirekt auslöst.
Niemand hat von $SELF geredet.
Titel: Antw:selftrigger
Beitrag von: doman75 am 26 Februar 2019, 08:12:26
Zitat von: amenomade am 25 Februar 2019, 18:09:05
Und Du nimmst falsch an.Niemand hat von $SELF geredet.
Warum wird es dann ausgeführt? Im Auszug der log sieht man ja eindeutig das cmd_2 ausgeführt wird, obwohl keine attribut selftrigger gesetzt ist.
Titel: Antw:selftrigger
Beitrag von: Ellert am 26 Februar 2019, 18:05:00
Nach Ablauf des wait im ersten Zweig wird set TEST off ausgeführt und das DOIF wechselt in cmd_2.
Erst erst nach Abschluss des set, ist der erste Zweig abgeschlossen und danach befindet sich DOIF wieder in Zustand 1, wie nach jeder Abarbeitung des ersten Zweigs (cmd _nr 1, cmd_seq 2 => cmd_1)

Das hat mit Selbsttriggerung nichts zu tun, damit wird die hier http://forum.fhem.de/index.php/topic,41859.0.html beschriebene LOOP wieder eingeschaltet.
Titel: Antw:selftrigger
Beitrag von: doman75 am 26 Februar 2019, 18:45:25
Ein loop ist das nicht cmd1 wird ja nicht wieder angetriggert.
Titel: Antw:selftrigger
Beitrag von: amenomade am 26 Februar 2019, 19:08:30
Also nochmal:

([$Self] eq "on") <--- das ist Bedingung1 mit trigger auf self
     (set DummyTest on) <--- das ist Befehl 1.1
     (set TEST off) <--- das ist Befehl 1.2
DOELSEIF
([$Self] eq "off")  <--- das ist Bedingung2 mit trigger auf self
    (set DummyTest off) <--- das ist Befehl 2
attr TEST setList on off <--- damit bedeutet set TEST on = set TEST cmd_1 und set TEST off = set TEST cmd_2 ---- als Befehle

Du druckst auf on
Bedingung1 triggert => die Befehle 1.1 und 1.2 werden ausgeführt
- Befehl 1.1 sofort = dummy geht on
- Befehl 1.2 nach 10 Sek = set DOif off = set DOIF cmd_2 = führe Befehl 2 aus, aber ohne das DOIF zu triggern (selftriggern), sprich ohne dass Bedingung1 und Bedingung2 wieder bewertet werden und deswegen neue Befehle gestartet werden. Dummy geht aus (das ist eh Befehl 2)
- Und hier endet die Sequenz, die von Bedingung1 getriggert vom Knopfdruck gestartet wurde. Das DOIF wird auf Zustand 1.2 (An) gesetzt

EDIT: korrigiert nach https://forum.fhem.de/index.php/topic,97050.msg911998.html#msg911998 Bedingung1 triggert
Titel: Antw:selftrigger
Beitrag von: tomspatz am 26 Februar 2019, 19:57:07
Darf ich das hier mal Kapern mit der Frage nach $Self = $SELF

LG
Tom
Titel: Antw:selftrigger
Beitrag von: amenomade am 26 Februar 2019, 20:19:40
Naja... Eigentlich hast Du Recht, es sollte genau $SELF sein. Die Bedingungen mit $Self würden wahrscheinlich nie triggern. Aber er druckt auf den Knöpfe An oder Aus in der WebUI, um die jeweilige Zweige zu starten. Führt zum gleichen Ergebnis
Titel: Antw:selftrigger
Beitrag von: Ellert am 26 Februar 2019, 23:59:01
Zitat von: doman75 am 26 Februar 2019, 18:45:25
Ein loop ist das nicht cmd1 wird ja nicht wieder angetriggert.
Das hast Du richtig verstanden.
Titel: Antw:selftrigger
Beitrag von: doman75 am 27 Februar 2019, 13:25:38
Zitat von: doman75 am 08 Februar 2019, 08:01:10
ich habe jetzt beim wait attr mal 0,10:10 gesetzt um cmd2 zu verzögern aber das greift gar nicht. Ist die Syntax falsch?

und warum funkioniert das mit dem wait nicht?

RAW Definition DOIF

defmod TEST DOIF ([$Self] eq "on") (set DummyTest on) (set TEST off)\
DOELSEIF\
([$Self] eq "off") (set DummyTest off)\
\

attr TEST cmdState on|off
attr TEST eventMap on:An off:Aus
attr TEST loglevel 6
attr TEST room VatiTest
attr TEST setList on off
attr TEST verbose 5
attr TEST wait 0,10:10

setstate TEST An
setstate TEST 2019-02-08 08:48:48 .eM off
setstate TEST 2019-02-27 13:23:10 cmd 1.2
setstate TEST 2019-02-27 13:23:10 cmd_event set_on_cmd_1
setstate TEST 2019-02-27 13:23:10 cmd_nr 1
setstate TEST 2019-02-27 13:23:10 cmd_seqnr 2
setstate TEST 2019-02-07 15:02:45 mode enabled
setstate TEST 2019-02-27 13:23:10 state on
setstate TEST 2019-02-27 13:23:10 wait_timer no timer


RAW Definition Dummy
Zitat
defmod DummyTest dummy
attr DummyTest event-min-interval .*:60
attr DummyTest event-on-update-reading .*
attr DummyTest room VatiTest
attr DummyTest setList on off

setstate DummyTest off
setstate DummyTest 2019-02-27 13:23:10 state off
Titel: Antw:selftrigger
Beitrag von: tomspatz am 27 Februar 2019, 13:57:20
ZitatNaja... Eigentlich hast Du Recht, es sollte genau $SELF sein. Die Bedingungen mit $Self würden wahrscheinlich nie triggern. Aber er druckt auf den Knöpfe An oder Aus in der WebUI, um die jeweilige Zweige zu starten. Führt zum gleichen Ergebnis

hmmmm das meinte ich schon ernst  :( gibt es einen Unterschied zwischen $SELF und $Self außer der Schreibweise.
LG
Tom
Titel: Antw:selftrigger
Beitrag von: doman75 am 27 Februar 2019, 14:04:09
Zitat von: tomspatz am 27 Februar 2019, 13:57:20
hmmmm das meinte ich schon ernst  :( gibt es einen Unterschied zwischen $SELF und $Self außer der Schreibweise.
LG
Tom

ich habe es mal in meinem oben geposteten dummy so und so geschrieben das verhalten bleibt das gleiche
Titel: Antw:selftrigger
Beitrag von: amenomade am 27 Februar 2019, 18:19:58
Zitat von: doman75 am 27 Februar 2019, 13:25:38
und warum funkioniert das mit dem wait nicht?

Das wait funktioniert:
Zitat2019-02-08 07:55:41.228 DOIF TEST wait_timer: 08.02.2019 07:55:51 cmd_1_2 set_on_cmd_1
2019-02-08 07:55:51.230 DOIF TEST wait_timer: no timer

Zwischen 07:55:41 und 07:55:51 sind es genau 10 Sekunden (ok, minus 2 ms)


Also bisher tut das DOIF was er soll.

In Perl ist übrigens die Schreibweise wichtig. $SELF und $Self sind 2 total unterschiedliche Variablen. $SELF != $Self
Titel: Antw:selftrigger
Beitrag von: doman75 am 27 Februar 2019, 18:41:39
Aber bei cmd2 die 10 Sekunden greifen nicht, also die 10 nach dem doppelpunkt
Titel: Antw:selftrigger
Beitrag von: amenomade am 27 Februar 2019, 18:46:07
Wenn Du auf dem Knopf "Aus" druckst sagst Du dem DOIF "führe Zweig 2 sofort aus". Es gibt kein "Trigger", der nach 10 Sek vom Befehl verfolgt werden soll.
Titel: Antw:selftrigger
Beitrag von: doman75 am 27 Februar 2019, 20:06:26
Wieso funktionieren dann die 10 Sekunden im cmd1_2. Da klicke ich doch auch auf in. Was ist der Unterschied zwischen den on klick und den off klick?
Titel: Antw:selftrigger
Beitrag von: amenomade am 27 Februar 2019, 20:44:42
Zitat von: doman75 am 27 Februar 2019, 20:06:26
Wieso funktionieren dann die 10 Sekunden im cmd1_2. Da klicke ich doch auch auf in. Was ist der Unterschied zwischen den on klick und den off klick?
Weil er zwischen 2 Befehle ist.
Hättest Du
Zitatwait 8,10:12
, würde die 8 nicht funktionieren (1.1  würde sofort schalten), die 10 aber doch (1.2 würde 10 Sek nach 1.1 schalten)
Der erste wait ist zwischen Trigger und Befehl. Da hast Du aber kein echtes Trigger: dein DOIF macht nicht etwas, weil er getriggert wurde, sondern weil Du auf "An" oder "Aus" klickst.
Der zweite wait ist zwischen Befehl und Befehl.

Dein DOIF triggert nie. Er führt nur die Befehle aus, weil Du klickst. Dein DOIF würde genau gleich funktionieren, wenn Du es so schreiben würdest:
([ABX] eq "on")
   (set DummyTest on) (set TEST off)
DOELSEIF
([8A27XY] eq "off")
   (set DummyTest off)

oder (1)
   (set DummyTest on) (set TEST off)
DOELSEIF
(1)
   (set DummyTest off)

Deswegen war es egal, ob $Self oder $SELF. $nix oder $lol hätte das gleiche gemacht


Titel: Antw:selftrigger
Beitrag von: Per am 28 Februar 2019, 13:42:24
Setz doch einen Dummy-Befehl dazwischen
()(Cmd1)(Cmd2)
wait 0,10,10