Notify auf Wert "verlassen" triggern

Begonnen von alanblack, 28 Juli 2022, 19:34:26

Vorheriges Thema - Nächstes Thema

alanblack

Hallo zusammen,
da bei Zigbee es wohl "normal" ist, dass Devices ab und zu auf "unreachable" gehen, hatte ich mit ein Notify gebaut, welches mir das meldet:
defmod Mach_Zigbee_Ausfall notify ?G_.+_.+:unreachable { &Mach_Etwas($NAME) }
Allerdings kann es sein, dass meine Mädels mal Lichter über einen "normalen" Lichtschalter aus- und vielleicht auch wieder einschalten. Also benötige ich ein zweites Notify, welches das "Problem" als gelöst markiert. Das hier passt leider nicht:
defmod Mach_Zigbee_Reaktiviert notify ?G_.+_.+:(?!unreachable) { &Mach_EtwasAnderes($NAME) }
Es sollte eigentlich triggern, wenn der state auf etwas außer "unreachable" wechselt. Tut es aber leider nicht. Warum, funzt es nicht, bzw. wie würde es gehen?

Danke im Voraus!

Grüße
FHEM 6.0 auf raspi3&ODROID XU4 mit HMLAN und HM-MOD-RPI-PCB, LaCrosse via JeeLink, COC868 und CUL433, Xiaomi Aqara+div. Zigbee via deCONZ, Dooya via SIGNALDuino, ZWave mit Danalock
Jeder Witz kann ein Einzeiler sein mit genügend Semikolons

Otto123

Hi,

notify kennt aber Dein Problem ;)
ZitatAttribute
...
ignoreRegexp regexp
Es ist nicht immer einfach ein Regexp zu bauen, was etwas _nicht_ matcht. Dieses Attribut hilft in diesen Fällen: das Event wird ignoriert, falls es den angegebenen Regexp matcht. Syntax ist gleich wie in der Definition.

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

alanblack

Hi Otto,
Zitat von: Otto123 am 28 Juli 2022, 19:55:38
Hi,

notify kennt aber Dein Problem ;)
danke an den "Meister-der-Doku"! Hatte ich überhaupt nicht auf dem Schirm, dass notify das so kann.

Prinzipiell funktioniert das... aber da brauche ich noch etwas anderes: Denkfehler in der Problemstellung, denn dies feuert natürlich - wie auch das "gedachte" (?!unreachable) es tun würde - bei jeder Änderung des state von allen Devices, die auf ?G_.+_.+ passen. 10-20 / Minute! Nicht gut!

Wie kann man auf "OldValue" triggern? Denn wenn "OldValue" auf "unreachable" steht, müsste das passen.

Grüße
FHEM 6.0 auf raspi3&ODROID XU4 mit HMLAN und HM-MOD-RPI-PCB, LaCrosse via JeeLink, COC868 und CUL433, Xiaomi Aqara+div. Zigbee via deCONZ, Dooya via SIGNALDuino, ZWave mit Danalock
Jeder Witz kann ein Einzeiler sein mit genügend Semikolons

Otto123

OldValue() kannst Du maximal im Ausführungsteil des notify abfragen?
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

alanblack

Zitat von: Otto123 am 28 Juli 2022, 21:25:47
OldValue() kannst Du maximal im Ausführungsteil des notify abfragen?
Hatte ich so befürchtet. Ok, also rühre ich mal ignoreRegexp und 'if OldVal(<device>) eq "unreachable"' zusammen und es geht - wobei ich wahrscheinlich das ignoreRegexp dann weglassen könnte.
Ist zwar unschön, dass das Notify und diese If-Abfrage jetzt recht oft unsinnig durchlaufen werden, aber die Erhöhung der Systemlast hält sich in Grenzen.

Ich lasse diesen Thread mal offen. Vielleicht liest Rudi das hier noch und hat eine zündende Idee, wie er einen Trigger auf OldValue einfach und performant umsetzen kann.

Grüße
FHEM 6.0 auf raspi3&ODROID XU4 mit HMLAN und HM-MOD-RPI-PCB, LaCrosse via JeeLink, COC868 und CUL433, Xiaomi Aqara+div. Zigbee via deCONZ, Dooya via SIGNALDuino, ZWave mit Danalock
Jeder Witz kann ein Einzeiler sein mit genügend Semikolons

rudolfkoenig

Weiss nicht, ob als zuendende Idee zaehlt aber man kann das Problem auch mit einem notify und ohne Attribute loesen:
defmod Mach_Zigbee_Ausfall notify ?G_.+_.+:.* {\
  if($EVENT eq "unreachable") {\
    Mach_Etwas($NAME);\
  } elsif(OldVal($NAME) eq "unreachable") {\
    Mach_EtwasAnderes($NAME);\
  }\
}

Ansonsten wuerde ich mir keine grossen Sorgen ueber einen zusaetzlichen notfiy machen, insb. wenn NOTIFYDEV gesetzt ist.

Etwas Off-Topic: mein perl mag ?G_.+_.+ nicht, list ?G_.+_.+ erzeugt:
ZitatPERL WARNING: devspec2array ?G_.+_.+: Sequence (?G...) not recognized in regex; marked by <-- HERE in m/^(?G <-- HERE _.+_.+)$/ at fhem.pl line 1350.

alanblack

Hallo Rudi,
Zitat von: rudolfkoenig am 29 Juli 2022, 10:10:50
Weiss nicht, ob als zuendende Idee zaehlt aber man kann das Problem auch mit einem notify und ohne Attribute loesen:
defmod Mach_Zigbee_Ausfall notify ?G_.+_.+:.* {\
  if($EVENT eq "unreachable") {\
    Mach_Etwas($NAME);\
  } elsif(OldVal($NAME) eq "unreachable") {\
    Mach_EtwasAnderes($NAME);\
  }\
}

Ich schrieb ja schon, dass ich ignoreRegexp  dann auch weglassen könnte. Mein Notify ist fast 100% identisch zu Deinem.
Zitat
Ansonsten wuerde ich mir keine grossen Sorgen ueber einen zusaetzlichen notfiy machen, insb. wenn NOTIFYDEV gesetzt ist.
Hmmm... leider habe ich hier noch eines der Notifies ohne Notifydev. Daher bin ich noch nicht wirklich glücklich mit der Lösung, auch wenn sie funktioniert.
Zitat
Etwas Off-Topic: mein perl mag ?G_.+_.+ nicht, list ?G_.+_.+ erzeugt:
Da bin ich bei Dir. Ich hatte es mal händisch entwickelt, um UG, EG, OG und DG mit zwei durch Underscores getrennten Gerätegruppen zu erfassen. Als Notify funktioniert es, auch wenn ich deinen Fehler reproduzieren kann. Geht das besser?

Grüße
FHEM 6.0 auf raspi3&ODROID XU4 mit HMLAN und HM-MOD-RPI-PCB, LaCrosse via JeeLink, COC868 und CUL433, Xiaomi Aqara+div. Zigbee via deCONZ, Dooya via SIGNALDuino, ZWave mit Danalock
Jeder Witz kann ein Einzeiler sein mit genügend Semikolons

Damian

Zitat von: alanblack am 29 Juli 2022, 22:14:17
leider habe ich hier noch eines der Notifies ohne Notifydev. Daher bin ich noch nicht wirklich glücklich mit der Lösung, auch wenn sie funktioniert.

Du könntest den Zweizeiler in DOIF definieren, das arbeitet immer mit NOTIFYDEV.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rudolfkoenig

ZitatAls Notify funktioniert es [...]
Bin erstaunt und ratlos.

alanblack

Zitat von: Damian am 29 Juli 2022, 23:45:40
Du könntest den Zweizeiler in DOIF definieren, das arbeitet immer mit NOTIFYDEV.
Okay, mein erster DOIF-Versuch:
defmod DI_ZigbeeKontrolle DOIF ["?G_.+_.+:unreachable"] { &Mach_Etwas($NAME) } DOELSIF (OldVal($NAME) eq "unreachable") { &Mach_EtwasAnderes($NAME) }
Abgesehen davon dass mich das Notifydev "global" verwundert (macht das überhaupt Sinn?), funktioniert das DOIF leider nicht.
Kannst Du mir bitte einen Tipp geben, wo mein Fehler liegt. Danke!
Dabei ist mir beim Lesen der Commandref zu DOIF und selbst probieren ein Fehler dort aufgefallen. Bei http://fhem.de/commandref_DE.html#DOIF_Perl_Modus steht
Zitatattr di_warning do always
Mache ich also ein
Zitatattr DI_ZigbeeKontrolle do always
bekomme ich
ZitatDI_ZigbeeKontrolle: unknown attribute do. Type 'attr DI_ZigbeeKontrolle ?' for a detailed list.

Grüße
FHEM 6.0 auf raspi3&ODROID XU4 mit HMLAN und HM-MOD-RPI-PCB, LaCrosse via JeeLink, COC868 und CUL433, Xiaomi Aqara+div. Zigbee via deCONZ, Dooya via SIGNALDuino, ZWave mit Danalock
Jeder Witz kann ein Einzeiler sein mit genügend Semikolons

Damian

Zitat von: alanblack am 30 Juli 2022, 19:16:36
Okay, mein erster DOIF-Versuch:
defmod DI_ZigbeeKontrolle DOIF ["?G_.+_.+:unreachable"] { &Mach_Etwas($NAME) } DOELSIF (OldVal($NAME) eq "unreachable") { &Mach_EtwasAnderes($NAME) }
Abgesehen davon dass mich das Notifydev "global" verwundert (macht das überhaupt Sinn?), funktioniert das DOIF leider nicht.
Kannst Du mir bitte einen Tipp geben, wo mein Fehler liegt. Danke!
Dabei ist mir beim Lesen der Commandref zu DOIF und selbst probieren ein Fehler dort aufgefallen. Bei http://fhem.de/commandref_DE.html#DOIF_Perl_Modus stehtMache ich also ein bekomme ich
Grüße

$NAME gibt es beim DOIF nicht, das heißt hier $DEVICE bzw. $device als Perlvariable

Die Bedingung von DOIF muss immer in runde Klammern:

DOIF (["?G_.+_.+:unreachable"])

Sonst immer list vom Device posten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

alanblack

Zitat von: Damian am 30 Juli 2022, 21:39:28
Sonst immer list vom Device posten.

defmod DI_ZigbeeKontrolle DOIF (["?G_.+_.+:unreachable"]) { &Mach_Etwas($device) } DOELSEIF (OldVal($device) eq "unreachable") { &Mach_EtwasAnderes($device) }

setstate DI_ZigbeeKontrolle initialized
setstate DI_ZigbeeKontrolle 2022-07-30 22:00:16 cmd 0
setstate DI_ZigbeeKontrolle 2022-07-30 22:00:16 mode enabled
setstate DI_ZigbeeKontrolle 2022-07-30 22:00:16 state initialized

Damit gibt es ein Notifydev ".*(?G_.+_.+).*,global", aber leider auch den Fehler wie Rudi bei list bemerkte:
Zitatdevspec2array .*(?G_.+_.+).*,global: Sequence (?G...) not recognized in regex; marked by <-- HERE in m/^(.*(?G <-- HERE _.+_.+).*)$/ at fhem.pl line 1349.
Offensichtlich behandeln Notify einerseits und list sowie DOIF andererseits die Regex beim Device unterschiedlich.

Ich glaube, ich versuche mal, das Problem von einer anderen Seite anzugehen.

Grüße


FHEM 6.0 auf raspi3&ODROID XU4 mit HMLAN und HM-MOD-RPI-PCB, LaCrosse via JeeLink, COC868 und CUL433, Xiaomi Aqara+div. Zigbee via deCONZ, Dooya via SIGNALDuino, ZWave mit Danalock
Jeder Witz kann ein Einzeiler sein mit genügend Semikolons

Damian

Zitat von: alanblack am 30 Juli 2022, 22:11:13
defmod DI_ZigbeeKontrolle DOIF (["?G_.+_.+:unreachable"]) { &Mach_Etwas($device) } DOELSEIF (OldVal($device) eq "unreachable") { &Mach_EtwasAnderes($device) }

setstate DI_ZigbeeKontrolle initialized
setstate DI_ZigbeeKontrolle 2022-07-30 22:00:16 cmd 0
setstate DI_ZigbeeKontrolle 2022-07-30 22:00:16 mode enabled
setstate DI_ZigbeeKontrolle 2022-07-30 22:00:16 state initialized

Damit gibt es ein Notifydev ".*(?G_.+_.+).*,global", aber leider auch den Fehler wie Rudi bei list bemerkte:Offensichtlich behandeln Notify einerseits und list sowie DOIF andererseits die Regex beim Device unterschiedlich.

Ich glaube, ich versuche mal, das Problem von einer anderen Seite anzugehen.

Grüße

Regex-Auswertung geschieht auf der Perlebene, da hat das jeweilige Modul wenig Einfluss drauf. Diese Meldung passt zur Meldung vom Notify, die Rudi bereits gepostet hast.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF