FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: gestein am 01 März 2022, 11:10:59

Titel: trigger im perl-Modus?
Beitrag von: gestein am 01 März 2022, 11:10:59
Hallo,

ich habe versucht meine bisherige Steuerung für die Bewegungsmelder und die Lichter im Vorzimmer über ein DOIF im perrl-Modus zu ersetzen.
Allerdings muss ich gestehen, dass ich die Trigger im Def-Block nicht ganz verstehe.

Wenn man etwass wie das hier definiert, dachte ich, dass nur auf das Event "Zuhause:presence:home" getriggert wird.
defmod di_test DOIF Test {[Zuhause:"^presence:.home$"];;  set_Reading("testing",get_Reading("testing",0)? 0:1)}
Tatsächlich wird aber auf alle Events von "Zuhause" getriggert.

Das Presence-Device "Zuhause" hat nämlich jede Minute ein Update seines internen Abwesensheitszählers geschickt.
Und jede Minute wird das "set_Reading" ausgerufen.
In den Readings des DOIF steht nämlich:




DeviceZuhause2022-02-27 21:24:33
block_Testexecuted2022-02-27 21:24:34
e_Zuhause_eventsdurTimerPresence_cr: 2832,durTimerPresence: 47:11:492022-02-27 21:24:33


BWM_aus {[MQTT2_shellyix3_68C63AFA9B7B:"^input_0:.0$"];
if([MQTT2_shellyswitch25_E098068D4E95] eq "on") {
    fhem_set("MQTT2_shellyswitch25_E098068D4E95 on-for-timer [dyParameter:VZ.Licht_Dauer]");
start();
}
if([MQTT2_shellyswitch25_E098068D4E95_CH2] eq "on") {
fhem_set("MQTT2_shellyswitch25_E098068D4E95_CH2 on-for-timer [dyParameter:VZ.Licht_Dauer]");
start();
}
}


Und eigentlich dachte ich, dass ich mit dem ersten Block in einer Funktionsdefinition den Trigger definiere.
BWM_aus {[MQTT2_shellyix3_68C63AFA9B7B:"^input_0:.0$"];
if([MQTT2_shellyswitch25_E098068D4E95] eq "on") {
    fhem_set("MQTT2_shellyswitch25_E098068D4E95 on-for-timer ".ReadingsVal("dyParameter","VZ.Licht_Dauer","60"));
start();
}
if([MQTT2_shellyswitch25_E098068D4E95_CH2] eq "on") {
fhem_set("MQTT2_shellyswitch25_E098068D4E95_CH2 on-for-timer ".ReadingsVal("dyParameter","VZ.Licht_Dauer","60"));
start();
}
}


Also müsste mein DOIF auf alle Events der Form "MQTT2_shellyix3_68C63AFA9B7B:"^input_0:.0$"" reagieren, was es auch tut.
Aber es reagiert auch auf die Events "[MQTT2_shellyswitch25_E098068D4E95]".
Ist das die Intension?
Es wird auf alles reagiert, dass in der Form [...] irgendwo in der Funktion steht?

Danke, lg, Gerhard
Titel: Antw:trigger im perl-Modus?
Beitrag von: Damian am 01 März 2022, 11:27:51
Zitat von: gestein am 01 März 2022, 11:10:59

Es wird auf alles reagiert, dass in der Form [...] irgendwo in der Funktion steht?


ja, es wird auf alle Angaben [...] im Block getriggert, egal wo sie im Block stehen. Wenn du keinen Trigger haben willst, dann musst du angeben [?...]
Titel: Antw:trigger im perl-Modus?
Beitrag von: gestein am 01 März 2022, 11:34:44
Ah, Danke für den Hinweis. Das probiere ich gleich.

Blöde Frage vielleicht noch:
Wenn ich im Block auf einen Zeitraum prüfen (nicht triggern) will, der in den Readings eines anderen Devices steckt dann geht das insgesamt 3x "?". Richtig?
if([?[?dyParameter:VZ.Licht_Zeit1_time]-[?dyParameter:VZ.Licht_Zeit2_time]])

Danke, lg, Gerhard
Titel: Antw:trigger im perl-Modus?
Beitrag von: Damian am 01 März 2022, 11:58:37
Zitat von: gestein am 01 März 2022, 11:34:44
Ah, Danke für den Hinweis. Das probiere ich gleich.

Blöde Frage vielleicht noch:
Wenn ich im Block auf einen Zeitraum prüfen (nicht triggern) will, der in den Readings eines anderen Devices steckt dann geht das insgesamt 3x "?". Richtig?
if([?[?dyParameter:VZ.Licht_Zeit1_time]-[?dyParameter:VZ.Licht_Zeit2_time]])

Danke, lg, Gerhard

Nein, es wird bei Zeitintervallen nur das erste Fragezeichen gesetzt, sonst bekommst du Syntaxfehler - schon probiert?
Titel: Antw:trigger im perl-Modus?
Beitrag von: gestein am 01 März 2022, 12:07:28
War gerade am Schreiben, dass das nicht geht ;-)
Ja, schon probiert ...

Es kam die Fehlermeldung: "error: Wrong timespec : either HH:MM:SS or {perlcode}"

Danke für Deine Hilfe!
lg, Gerhard
Titel: Antw:trigger im perl-Modus?
Beitrag von: gestein am 02 März 2022, 15:28:55
Hallo,

mein Problem ist leider doch noch nicht gelöst.

Irgendwie scheinen die Events im Perl-Modus nicht richtig gefiltert zu werden.
Ich habe folgenden Filter:
BWM_ein {([MQTT2_shellyix3_68C63AFA9B7B:"^input_0:.1$"] or [Whg.Eingangstuer:"^state:.open$"]);
if([?[dyParameter:VZ.Licht_Zeit1_time]-[dyParameter:VZ.Licht_Zeit2_time]]) {
fhem_set("MQTT2_shellyswitch25_E098068D4E95 on");
}
}

Hier soll also die Funktion BWM_ein aufgerufen werden, wenn entweder der Eingang 0 des Shelly i3 von "0" auf "1" geht oder die Eingangstür aufgeht.
Anscheinend wird aber auch die Funktion aufgerufen, wenn die Eingangstür zugeht.
Zumindest steht das in den Readings. Oder interpretiere ich das falsch?





DeviceWhg.Eingangstuer2022-03-02 15:14:12
block_BWM_einexecuted2022-03-02 15:14:12
block_initexecuted2022-03-02 14:16:02
e_Whg.Eingangstuer_eventsclosed2022-03-02 15:14:12

Kann das sein?

Danke, lg, Gerhard
Titel: Antw:trigger im perl-Modus?
Beitrag von: Damian am 02 März 2022, 16:52:02
state erscheint nicht in der Eventzeile, siehe https://fhem.de/commandref_DE.html#DOIF_addStateEvent
Titel: Antw:trigger im perl-Modus?
Beitrag von: gestein am 02 März 2022, 22:40:51
Hallo,

Danke, das habe ich probiet, ändert aber nichts an meinem Problem.

Hier mal das ganze List meines DOIFs etwas vereinfacht mit nur einem Event pro Block:
defmod di_VZ.Beleuchtung2 DOIF ## "?" schaltet den Trigger in der Sub aus\
## https://forum.fhem.de/index.php/topic,126511.msg1211158.html#msg1211158\
subs {\
sub start {\
    $_sec=ReadingsVal("dyParameter","VZ.Licht_Dauer","");;\
## $_sec=240;;\
set_Reading("count",$_sec,1);;\
set_Reading("count_temp",$_sec,1);;\
set_Exec("countdown",1,'set_Reading ("count",$_sec-1-$count,1)','$count<$_sec');;\
}\
}\
\
\
BWM_ein {[MQTT2_shellyix3_68C63AFA9B7B:"^input_0:.1$"];;\
if([?[dyParameter:VZ.Licht_Zeit1_time]-[dyParameter:VZ.Licht_Zeit2_time]]) {\
fhem_set("MQTT2_shellyswitch25_E098068D4E95 on");;\
}\
}\
\
BWM_ein_Nacht {[MQTT2_shellyix3_68C63AFA9B7B:"^input_0:.1$"];;\
if([?[dyParameter:VZ.Licht_Zeit2_time]-[dyParameter:VZ.Licht_Zeit1_time]]) {\
if("[?MQTT2_shellyix3_68C63AFA9B7B:input_1]" eq "1") {\
fhem_set("MQTT2_shellyswitch25_E098068D4E95 on");;\
}\
fhem_set("MQTT2_shellyswitch25_E098068D4E95_CH2 on");;\
}\
}\
\
BWM_aus {[MQTT2_shellyix3_68C63AFA9B7B:"^input_0:.0$"];;\
if([?MQTT2_shellyswitch25_E098068D4E95] eq "on") {\
    fhem_set("MQTT2_shellyswitch25_E098068D4E95 on-for-timer ".ReadingsVal("dyParameter","VZ.Licht_Dauer","60"));;\
start();;\
}\
if([?MQTT2_shellyswitch25_E098068D4E95_CH2] eq "on") {\
fhem_set("MQTT2_shellyswitch25_E098068D4E95_CH2 on-for-timer ".ReadingsVal("dyParameter","VZ.Licht_Dauer","60"));;\
start();;\
}\
}\
\
init {set_Reading("count",0,1);;}
attr di_VZ.Beleuchtung2 addStateEvent 1
attr di_VZ.Beleuchtung2 comment https://forum.fhem.de/index.php/topic,111866.msg1208498.html#msg1208498\
defmod di_countdown DOIF start {$_sec=10;;;;set_Reading("count",$_sec,1);;;;set_Exec("countdown",1,'set_Reading ("count",$_sec-1-$count,1)','$count<$_sec')}\
attr di_countdown uiState {package ui_Table}\\
ring([$SELF:count],0,10,0,120,"Seconds",150,undef,0)\
\
BWM Tageslicht|BWM Nachtlicht|manuell an|auto aus
attr di_VZ.Beleuchtung2 group Lichtsteuerung
attr di_VZ.Beleuchtung2 room 0_Testing,Shelly,Zimmer->Vorzimmer
attr di_VZ.Beleuchtung2 stateFormat {ReadingsVal("$name","count","0")>0? ui_Table::ring(ReadingsVal("$name","count","0"),0,10,0,120,"",80,undef,0):ReadingsVal("$name","state","0")}
attr di_VZ.Beleuchtung2 verbose 5


MQTT2_shellyix3_68C63AFA9B7B: ein Shelly i3, der input 0 geht auf "1" wenn dort Spannung anliegt, und "0" wenn nicht.
MQTT2_shellyswitch25_E098068D4E95: der erste Kanal eines Shelly 2.5, der das große Deckenlicht schaltet
MQTT2_shellyswitch25_E098068D4E95_CH2: der zweite Kanal eines Shelly 2.5, der das kleine Nachlicht schaltet

Vereinfacht gesagt, soll das DOIF folgendes tun:
1) wenn der i3 seinen input 0 auf "1" legt, dann soll - abhängig von der Tageszeit - entweder das Deckenlicht oder das Nachtlicht eingeschaltet werden.
2) wenn input 0 wieder "0" wird, dann soll das Decken- oder das Nachtlicht nach x Sekunden wieder ausgehen.
3) wenn der input 2 des i3 auf "1" steht, dann sollen in der Nacht beide Lichter leuchten.

Wirkliches Verhalten:
Wenn der input 0 auf "1" geht, wird "BWM_ein" getriggert -> passt
gleichzeitig wird "BWM_ein_Nacht" getriggert -> passt
Aber auch "BWM_aus" wird getriggert -> passt nicht

Wenn dann der input 0 wieder auf "0" geht werden wieder alle drei getriggert!
Im log-file steht:
2022-03-02 22:33:33.597 MQTT2_DEVICE MQTT2_shellyix3_68C63AFA9B7B input_0: 1
2022-03-02 22:34:10.501 MQTT2_DEVICE MQTT2_shellyix3_68C63AFA9B7B input_0: 0


Wieso funktionieren meine Trigger nicht?
Danke, lg, Gerhard
Titel: Antw:trigger im perl-Modus?
Beitrag von: Damian am 02 März 2022, 23:02:34
ja, das ist richtig.

Bei der Definition:

[MQTT2_shellyix3_68C63AFA9B7B:"^input_0:.0$"]

gibt es einen Trigger bei irgendeinem Event von MQTT2_shellyix3_68C63AFA9B7B, allerdings ist der Ausdruck nur wahr, wenn auch das Event passt. Da du den Ausdruck nicht abfragst, wird ja der Rest im Block durchlaufen.

Du hast zwar Möglichkeiten, entweder den Ausdruck in die if-Abfrage hinzuzunehmen:

BWM_aus {if ([MQTT2_shellyix3_68C63AFA9B7B:"^input_0:.0$"] and [?MQTT2_shellyswitch25_E098068D4E95] eq "on") {...

oder eleganter, das Device als Regex in die Eventabfrage aufzunehmen, dann gibt es gar keine Triggerung des Blocks, so wie du es erwartest:

BWM_aus {["^MQTT2_shellyix3_68C63AFA9B7B$:^input_0:.0$"];;\
if([?MQTT2_shellyswitch25_E098068D4E95] eq "on") {\

Titel: Antw:trigger im perl-Modus?
Beitrag von: gestein am 03 März 2022, 09:28:58
Ah, jetzt lichtet sich der Nebel  ;)

Ich hatte die Definition des Triggers von anderen Beispielen und dem Wizard in fhem.
Aber so wie Du es erklärst, verstehe ich es.

Und vor allem: es klappt nun.

Vielen Dank!

Eine Frage bitte noch:
Werden in dem Trigger auch Bedingungen ausgewertet?
Also z.B.:
BWM_aus {(["^MQTT2_shellyix3_68C63AFA9B7B$:^input_0:.0$"] or Event2) and [?Zeitraum]); ...

Oder ist es besser das als if-Bedingung in der Trigger-Funktion anzuführen?

lg, Gerhard
Titel: Antw:trigger im perl-Modus?
Beitrag von: Damian am 03 März 2022, 09:32:40
Zitat von: gestein am 03 März 2022, 09:28:58
Ah, jetzt lichtet sich der Nebel  ;)

Ich hatte die Definition des Triggers von anderen Beispielen und dem Wizard in fhem.
Aber so wie Du es erklärst, verstehe ich es.

Und vor allem: es klappt nun.

Vielen Dank!

Eine Frage bitte noch:
Werden in dem Trigger auch Bedingungen ausgewertet?
Also z.B.:
BWM_aus {(["^MQTT2_shellyix3_68C63AFA9B7B$:^input_0:.0$"] or Event2) and [?Zeitraum]); ...

Oder ist es besser das als if-Bedingung in der Trigger-Funktion anzuführen?

lg, Gerhard

Nein, diese Bedingung würde zwar wahr oder falsch liefern, das Ergebnis wird von Perl jedoch verworfen.
Titel: Antw:trigger im perl-Modus?
Beitrag von: gestein am 03 März 2022, 09:45:27
Alles klar.
Also einen Trigger und eine if-Bedingung für den Rest.

Danke!
lg, Gerhard
Titel: Antw:trigger im perl-Modus?
Beitrag von: Damian am 03 März 2022, 14:42:03
Zitat von: gestein am 03 März 2022, 09:45:27
Alles klar.
Also einen Trigger und eine if-Bedingung für den Rest.

Danke!
lg, Gerhard

Oder eben den Trigger mit and/or in die if-Bedingung packen, genauso wie man es im FHEM-Modus gemacht hätte.