Hallo
Ich scheitere mal wieder an diesen beiden Sachen
subs {
sub logwin {
my ($window)=@_;
Log 3,"Fenster offen, bitte schließen: $window";
fhem_set("ECHO_G2A0P30883710027 speak Fenster $window schließen");
set_Exec ("$window",500,"logwin",$window);
}
}
{ if (["^fensterkontakt:open"] and [sensor_flur:temperature] < 12 ) {set_Exec ("$DEVICE",100,'logwin',"$DEVICE")}}
{ if (["^fensterkontakt:^close"]) {del_Exec ("$DEVICE")}}
bekomme ich diese Fehlermeldung
eval condition: Bareword "fensterkontakt_wohnzimmer" not allowed while "strict subs" in use at
Einen zweiten Versuch
DOIF { if (["^fensterkontakt:open"] and [balkon_xiaomi_sensor:temperature] < 15) {set_Timer ("WINDOW $DEVICE",600)}}\
{ if (["^fensterkontakt:close"]) {del_Exec ("WINDOW $DEVICE")}}\
{ if (["^$SELF:^WINDOW"]) {my ($window,$device)=split(" ","$EVENT");;{fhem_set(" telegram msg Dieses Fenster steht offen $DEVICE bitte schliesse es bald auch diese Fenster sind noch zu schliessen [fenster_offen:open_window] ");;set_State("Ansage Schließen")};;set_Exec ("WINDOW $device",1800)}}
Hier wird der zweite Block nicht ausgeführt.
Falscher Stelle hier gepostet vielleicht doch besser nach Anfänger verschieben ? ???
Poste Ausgabe von list von deinem definierten DOIF.
Hier eine list der beiden doif
Internals:
.AttrList disable:0,1 loglevel:0,1,2,3,4,5,6 notexist checkReadingEvent:0,1 addStateEvent:1,0 weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading
.FhemMetaInternals 1
DEF subs {
sub logwin {
my ($window)=@_;
Log 3,"Fenster offen, bitte schließen: $window";
fhem_set("telegram_andre msg Fenster $window schließen");
set_Exec ("$window",900,"logwin",$window);
}
}
{ if (["^fensterkontakt*:open"] and ["sensor_flur:temperature"] < 15) {set_Exec ("$DEVICE",1800,'logwin',"$DEVICE")}}
{ if (["^fensterkontakt:close"]) {del_Exec ("$DEVICE")}}
DOIFDEV ^global$|^fensterkontakt|sensor_flur|^fensterkontakt*
FUUID 608b0fae-f33f-c2a9-ddd7-33ab66d7534de0f0
FVERSION 98_DOIF.pm:0.243050/2021-04-21
MODEL Perl
NAME di_Fenster_offen
NR 712
NTFY_ORDER 50-di_Fenster_offen
STATE initialized
TYPE DOIF
VERSION 24305 2021-04-21 21:04:50
.attraggr:
.attrminint:
READINGS:
2021-04-30 12:15:47 Device sensor_flur
2021-04-30 12:15:47 block_01 executed
2021-04-30 12:09:35 block_02 executed
2021-04-30 12:08:58 error eval condition: Bareword "fensterkontakt_wohnzimmer" not allowed while "strict subs" in use at (eval 38876) line 1.
2021-04-30 11:58:07 mode enabled
2021-04-30 11:58:07 state initialized
Regex:
accu:
collect:
cond:
:
0:
"^fensterkontakt*:open" ^fensterkontakt*:open
"sensor_flur:temperature" sensor_flur:temperature
1:
"^fensterkontakt:close" ^fensterkontakt:close
condition:
0 if (::EventDoIf('^fensterkontakt*',$hash,'open',0) and ::EventDoIf('sensor_flur',$hash,'temperature',0) < 15) {set_Exec ("$DEVICE",1800,'logwin',"$DEVICE")}
1 if (::EventDoIf('^fensterkontakt',$hash,'close',0)) {del_Exec ("$DEVICE")}
helper:
DEVFILTER ^global$|^fensterkontakt|sensor_flur|^fensterkontakt*
NOTIFYDEV global|fensterkontakt.*|.*sensor_flur.*|fensterkontakt*.*
event battery: ok,temperature: 18.2,humidity: 45,1: 7.0,dewpoint: 6.1
globalinit 1
last_timer 0
sleeptimer -1
triggerDev sensor_flur
triggerEvents:
battery: ok
temperature: 18.2
humidity: 45
1: 7.0
dewpoint: 6.1
triggerEventsState:
battery: ok
temperature: 18.2
humidity: 45
1: 7.0
dewpoint: 6.1
internals:
perlblock:
0 block_01
1 block_02
ptimer:
fensterkontakt_wohnzimmer:
cond fensterkontakt_wohnzimmer
count 0
name fensterkontakt_wohnzimmer
sec 1800
subname logwin
hash:
readings:
trigger:
uiTable:
Attributes:
DbLogExclude .*
room Doif
Internals:
.AttrList disable:0,1 loglevel:0,1,2,3,4,5,6 notexist checkReadingEvent:0,1 addStateEvent:1,0 weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading
.FhemMetaInternals 1
DEF { if (["^fensterkontakt:open"]) {set_Exec ("WINDOW $DEVICE",30)};set_State("Fenter ist offen")}
{ if (["^fensterkontakt:close"]) {del_Exec ("WINDOW $DEVICE")};set_State("Fenster ist zu")}
{ if (["^$SELF:^WINDOW"]) {my ($window,$device)=split(" ","$EVENT");Log 3,"Fenster offen, bitte schließen: $device";set_Exec ("WINDOW $device",80)};set_State("Fenster immer noch offen")}
FUUID 608b07da-f33f-c2a9-6633-f244c90dba3be46a
FVERSION 98_DOIF.pm:0.243050/2021-04-21
MODEL Perl
NAME di_window
NOTIFYDEV fensterkontakt.*,di_window.*,global
NR 711
NTFY_ORDER 50-di_window
STATE Fenster ist zu
TYPE DOIF
VERSION 24305 2021-04-21 21:04:50
.attraggr:
.attrminint:
READINGS:
2021-04-30 12:09:35 Device fensterkontakt_wohnzimmerfenster
2021-04-30 12:08:58 block_01 executed
2021-04-30 12:09:35 block_02 executed
2021-04-29 22:32:12 mode enabled
2021-04-30 12:09:35 state Fenster ist zu
Regex:
accu:
collect:
cond:
:
0:
"^fensterkontakt:open" ^fensterkontakt:open
1:
"^fensterkontakt:close" ^fensterkontakt:close
2:
"^di_window:^WINDOW" ^di_window:^WINDOW
condition:
0 if (::EventDoIf('^fensterkontakt',$hash,'open',0)) {set_Exec ("WINDOW $DEVICE",30)};set_State("Fenter ist offen")
1 if (::EventDoIf('^fensterkontakt',$hash,'close',0)) {del_Exec ("WINDOW $DEVICE")};set_State("Fenster ist zu")
2 if (::EventDoIf('^di_window',$hash,'^WINDOW',0)) {my ($window,$device)=split(" ","$EVENT");Log 3,"Fenster offen, bitte schließen: $device";set_Exec ("WINDOW $device",80)};set_State("Fenster immer noch offen")
helper:
DEVFILTER ^global$|^fensterkontakt|^di_window
NOTIFYDEV global|fensterkontakt.*|di_window.*
event close
globalinit 1
last_timer 0
sleeptimer -1
triggerDev fensterkontakt_wohnzimmerfenster
triggerEvents:
battery: 100
voltage: 3005
temperature: 30
linkquality: 93
close
closed
triggerEventsState:
battery: 100
voltage: 3005
temperature: 30
linkquality: 93
close
state: closed
internals:
perlblock:
0 block_01
1 block_02
2 block_03
ptimer:
WINDOW fensterkontakt_wohnzimmer:
count 0
name WINDOW fensterkontakt_wohnzimmer
sec 30
subname
time 1619777368.07207
hash:
readings:
trigger:
uiTable:
Attributes:
DbLogExclude .*
room Doif
Zielsetzung ist bei offenen Fenster und kälter als 15 Grad mir eine Nachricht zu schicken mit wiederholung.
beim schließen der Fenster den Timer zu löschen.
Die Erklärung zu deinem regEx if (["^fensterkontakt*:open"]
steht hier: https://regex101.com/r/MwEg9N/1
Ich halte das für nicht sinnvoll bzw. falsch. Ob das DOIF anders sieht?
Ob das den Fehler produziert? Wahrscheinlich nicht ...
* habe ich entfernt wenn du das meinst. Wie das reingekommen ist keine Ahnung geht aber trotzdem nicht.
Was wäre denn sinnvoll ich möchte gern alle Fenster abfragen und die beginnen nun mal alle mit fensterkontakt
Wo hast du das Beispiel gefunden?
set_Exec wurde um bedingte Wiederholung erweitert, so dass bestimmte alte Aufrufe umgestellt werden müssen, siehe https://forum.fhem.de/index.php/topic,114263.msg1097296.html#msg1097296
Es gilt die aktuelle Doku, hier: https://fhem.de/commandref_DE.html#DOIF_set_Exec
Es gibt übrigens in der Commandref zu set_Exec ein Beispiel für "Fenster offen"-Meldung mit Wiederholung, welches die neue Syntax zur "bedingten Wiederholung" nutzt.
{if ([^fensterkontakt:state] eq "open") {
set_Exec("timer",'30+$count*60','fhem("ECHO_G2A0P30883710027 speak fenster offen")','$count < 3')
} else {
del_Exec("timer")
}
}
funktioniert bei mir nicht, hatte ich auch schon probiert diesen code es werden keinen offenen Fenster erkannt wie es aussieht
siehe list
nternals:
.AttrList disable:0,1 loglevel:0,1,2,3,4,5,6 notexist checkReadingEvent:0,1 addStateEvent:1,0 weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading
CFGFN
DEF {if ([^fensterkontakt:state] eq "open") {
set_Exec("timer",'30+$count*60','fhem("ECHO_G2A0P30883710027 speak fenster offen")','$count < 3')
} else {
del_Exec("timer")
}
}
FUUID 608bf40f-f33f-c2a9-ecb3-72fa9d7b26f53424
MODEL Perl
NAME di_window1
NOTIFYDEV global
NR 4565
NTFY_ORDER 50-di_window1
STATE initialized
TYPE DOIF
VERSION 24305 2021-04-21 21:04:50
.attraggr:
.attrminint:
READINGS:
2021-04-30 14:17:24 mode enabled
2021-04-30 14:17:24 state initialized
Regex:
accu:
collect:
condition:
0 if ([^fensterkontakt:state] eq "open") {
set_Exec("timer",'30+$count*60','fhem_set("ECHO_G2A0P30883710027 speak fenster offen")','$count < 3')
} else {
del_Exec("timer")
}
helper:
DEVFILTER ^global$
NOTIFYDEV global
globalinit 1
last_timer 0
sleeptimer -1
perlblock:
0 block_01
uiTable:
Attributes:
DbLogExclude .
Wenn ich das so schreibe geht es
{if ([fensterkontakt_wohnzimmer:state] eq "open")
^ funktioniert wohl nicht
Dir ist bewusst, dass das nur ein Beispiel für ein Fenster ist, welches mit "fensterkontakt" im Namen anfängt.
nein war mir nicht bewußt
^fensterkontakt bedeutet doch das alle devices mit fensterkontakt im Namen erkannt werden
oder etwa nicht
Zitat von: andre07 am 30 April 2021, 14:34:17
nein war mir nicht bewußt
^fensterkontakt bedeutet doch das alle devices mit fensterkontakt im Namen erkannt werden
oder etwa nicht
alle Fenster die mit "fensterkontakt"
anfangen, siehe Bedeutung von ^ in einschlägiger regex-Doku.
Da der Timer im Beispiel "timer" heißt, kann immer nur ein Timer gleichzeitig laufen. Testen kannst du es auf jeden Fall mit einem Device.
Wenn es dann funktioniert, dann kannst du als Herausforderung das Beispiel auf mehrere Fenster abändern.
Zitat von: andre07 am 30 April 2021, 14:34:17
nein war mir nicht bewußt
^fensterkontakt bedeutet doch das alle devices mit fensterkontakt im Namen erkannt werden
oder etwa nicht
Was denkst Du warum ich den Link extra für Dich gespeichert und gepostet hatte? Da steht doch exakt drin was mit DEINEM regExp passiert?! Wenn man keine Ahnung hat ist dieses Tool eine gute Probierstube um zu lernen!
Sollte mich wohl mit diesen Regex beschäftigen und wenigstens die Grundlagen etwas besser kennen
{if (["^fensterkontakt.*:open"]) {
set_Exec("timer",'30+$count*60','fhem_set("telegram msg fenster offen")','$count < 3')
} else {
del_Exec("timer")
}
}
Zitat von: andre07 am 30 April 2021, 17:24:50
Sollte mich wohl mit diesen Regex beschäftigen und wenigstens die Grundlagen etwas besser kennen
{if (["^fensterkontakt.*:open"]) {
set_Exec("timer",'30+$count*60','fhem_set("telegram msg fenster offen")','$count < 3')
} else {
del_Exec("timer")
}
}
Ja, regex sind nicht ganz eingängig, da muss man seine Erfahrungen sammeln - das haben wir alle mal gemacht.
Jetzt musst du noch den Namen des Timers ersetzen, durch etwas, was vom Device abhängt, siehe dein erstes Beispiel.
.* kannst du übrigens beim DOIF weglassen.
ja ,wollte mich an den ersten jetzt auch noch versuchen.
Würde das so funktionieren oder benötige ich ein weiteres fhem_set
"timer",'30+$count*60','fhem_set("telegram msg fenster offen","push send fenster offen")','$count < 3'
Zitat von: andre07 am 30 April 2021, 17:52:22
ja ,wollte mich an den ersten jetzt auch noch versuchen.
Würde das so funktionieren oder benötige ich ein weiteres fhem_set
"timer",'30+$count*60','fhem_set("telegram msg fenster offen","push send fenster offen")','$count < 3'
nein, fhem_set bekommt nur einen String als Parameter, siehe: https://fhem.de/commandref_DE.html#DOIF_Spezifische_Perl-Funktionen_im_Perl-Modus
So klappt das mit dem DOif
ubs {
sub fenster {
my ($window)=@_;
Log 3,"Fenster offen, bitte schließen: $window";
fhem_set("telegram_andre msg Fenster $window schließen");
set_Exec ("$window",30,"fenster('$window')");
}
}
{ if (["^fensterkontakt.*:open"] and [balkon_xiaomi_sensor:temperature] < 15) {set_Exec("$DEVICE",80,"fenster ('$DEVICE') ")}}
{ if (["^fensterkontakt.*:^close"]) {del_Exec ("$DEVICE")}}
set_Exec ("timer",'60','fhem_set("telegram msg fenster offen")', 'fhem_set("lüefter on")')
set_Exec ("timer",'60','fhem_set("telegram msg fenster offen")', set_Exec ("timer1",'20','fhem_set("lüefter on")' )
Ich bräuchte sowas wie das "wait" im normalen DoIF um mehrere Device nacheinander mit verzögerung zu schalten...
wait geht natürlich auch über set_Exec:
Im 10-Sekundenabstand:
set_Exec("timer1",10,'fhem_set"bla1 on"');
set_Exec("timer2",20,'fhem_set"bla2 on"');
set_Exec("timer2",30,'fhem_set"bla3 on"');
...
oder im 10-Sekundentakt über eine Array
@{$_befehle}=("lampe1 on","lampe2 on","lampe1 off","lampe2 off");;set_Exec("timer",10,'fhem_set"$_befehle[$count]"','$count < @{$_befehle}')}
Das zweite sieht ganz interressant aus gleich mal umsetzten Danke