Offene Fenstermeldung wiederholung

Begonnen von andre07, 28 April 2021, 16:58:50

Vorheriges Thema - Nächstes Thema

andre07

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.


andre07

Falscher Stelle hier gepostet vielleicht doch besser nach Anfänger verschieben ? ???

Damian

Poste Ausgabe von list von deinem definierten DOIF.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

andre07

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.

Otto123

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

andre07

* 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


Damian

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

Damian

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

andre07

#8
{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

Damian

Dir ist bewusst, dass das nur ein Beispiel für ein Fenster ist, welches mit "fensterkontakt" im Namen anfängt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

andre07

nein war mir nicht bewußt
^fensterkontakt bedeutet doch das alle devices mit fensterkontakt im Namen erkannt werden
oder etwa nicht

Damian

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.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

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!
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

andre07

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")
}
}

Damian

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