FHEM Forum

FHEM => Automatisierung => Thema gestartet von: lbijl am 08 Dezember 2020, 12:49:23

Titel: Notify Regexp
Beitrag von: lbijl am 08 Dezember 2020, 12:49:23
Hallo zusammen,

ich habe eine PVAnlage Kostal Piko 4.3 auch erfolgreich im FHEM angelegt. Dort werden regelmäßig Werte ausgelesen.
Ein Wert ist der AC.Power, zeigt die aktuelle Produktionsleistung in Watt an.
Habe einen Notify definiert, der eine Lampe schalten soll, wenn der Wert eine Grenze von "500" überschreitet.
Das klappt leider nicht.
Internals:
   CFGFN     
   DEF        PVAnlage:AC.Power:>"500" set Ecklampe on
   FUUID      5fcf4ca4-f33f-09d5-1dc1-79e9ade04432a8e4
   NAME       Notify_PVAnlage
   NOTIFYDEV  PVAnlage
   NR         2058
   NTFY_ORDER 50-Notify_PVAnlage
   REGEXP     PVAnlage:AC.Power:>"500"
   STATE      active
   TRIGGERTIME 1607427621.08894
   TYPE       notify
   READINGS:
     2020-12-08 12:41:07   state           active
Attributes:


Titel: Antw:Notify Regexp
Beitrag von: rudolfkoenig am 08 Dezember 2020, 13:47:44
Vermutlich fehlt es hier an den Grundlagen (will sagen, die Frage gehoert in den Anfaengerforum):
- mit einem Regexp kann man nicht vergleichen.
- fuer sowas muss man bei notify nach perl wechseln:
defmod Notify_PVAnlagen notify PVAnlage:AC.Power.* { fhem("set Ecklampe on" if(ReadingsNum("PVAnlage", "AC.Power", 0") > 500) }
- fuer einfache Aufgaben kann man mit DOIF (statt notify) perl vermeiden, dafuer muss man aber DOIF Syntax lernen.
Titel: Antw:Notify Regexp
Beitrag von: lbijl am 08 Dezember 2020, 17:50:00
Vielen herzlichen Dank, ja die Grundlagen... :-)
Das hatte ich vermutet.
Leider wirft er mir einen Fehler aus:

Can't find string terminator '"' anywhere before EOF at (eval 8152) line 1.
Titel: Antw:Notify Regexp
Beitrag von: rudolfkoenig am 08 Dezember 2020, 18:42:05
Mein Fehler, es soll heissen:
defmod Notify_PVAnlagen notify PVAnlage:AC.Power.* { fhem("set Ecklampe on") if(ReadingsNum("PVAnlage", "AC.Power", 0) > 500) }
Titel: Antw:Notify Regexp
Beitrag von: lbijl am 08 Dezember 2020, 18:54:32
Super, vielen Dank, dann habe ich auch eine Vorlage fürs nächste mal !
Titel: Antw:Notify Regexp
Beitrag von: roedert am 10 Dezember 2020, 11:18:53
Die if-Lösung ist schon die saubere Lösung, aber man würde es auch in einem regex hinbekommen.
Es ist richtig dass im regex kein Vergleich möglich ist, aber bei ganzzahligen gelieferten Werten könnte man Filtern "größer 500" filtern mit

3stellige Zahl beginnt mit 5-9 oder Zahl mit 4 oder mehr Stellen

([5-9][0-9]{2}|[0-9]{4,})

https://regex101.com .. dort kann man regexe schön online testen und bekommt rechts ich gleich die einzelnen Teile erklärt
Titel: Antw:Notify Regexp
Beitrag von: Damian am 10 Dezember 2020, 13:56:18
Zitat von: roedert am 10 Dezember 2020, 11:18:53
Die if-Lösung ist schon die saubere Lösung, aber man würde es auch in einem regex hinbekommen.
Es ist richtig dass im regex kein Vergleich möglich ist, aber bei ganzzahligen gelieferten Werten könnte man Filtern "größer 500" filtern mit

3stellige Zahl beginnt mit 5-9 oder Zahl mit 4 oder mehr Stellen

([5-9][0-9]{2}|[0-9]{4,})

https://regex101.com .. dort kann man regexe schön online testen und bekommt rechts ich gleich die einzelnen Teile erklärt

Naja, es ist eine nette Denksportaufgabe. Ich würde keinem empfehlen damit größer-, kleiner-Vergleiche anzustellen - man übersieht schnell etwas ;)

Das sieht man schon daran, dass der Vorschlag nicht richtig ist - es ist und bleibt eine Denksportaufgabe.
Titel: Antw:Notify Regexp
Beitrag von: roedert am 10 Dezember 2020, 14:00:34
Dass ein if die saubere Lösung für eine solche Aufgabe ist, habe ich ja auch selbst geschrieben.
Aber was ist an diesem Vorschlag nicht richtig? Dieser regex erkennt eine ganzzahlige Zahl größer 500 (solange die Zahl vernünftig formatiert ist, also nicht etwa eine führende 0 hat)
Titel: Antw:Notify Regexp
Beitrag von: Damian am 10 Dezember 2020, 14:59:59
Das ist die Denksportaufgabe :)
Titel: Antw:Notify Regexp
Beitrag von: amenomade am 10 Dezember 2020, 23:02:49
Zitat von: roedert am 10 Dezember 2020, 11:18:53
Die if-Lösung ist schon die saubere Lösung, aber man würde es auch in einem regex hinbekommen.
Es ist richtig dass im regex kein Vergleich möglich ist, aber bei ganzzahligen gelieferten Werten könnte man Filtern "größer 500" filtern mit

3stellige Zahl beginnt mit 5-9 oder Zahl mit 4 oder mehr Stellen

([5-9][0-9]{2}|[0-9]{4,})

https://regex101.com .. dort kann man regexe schön online testen und bekommt rechts ich gleich die einzelnen Teile erklärt

Er will "grösser als 500", nicht "grösser oder gleich 500"
Titel: Aw: Notify Regexp
Beitrag von: Nobbynews am 15 Juli 2026, 12:49:20
Hallo zusammen,

der Thread ist zwar uralt, aber meine Frage passt wie Knopf auf Auge dazu.
Folgendes:
Ein notify soll nur bei Helligkeitswerten zwischen 22 Lux und 29 Lux anspringen.
Der konkrete Werte ist dabei nicht relevant.

Über regexp101 habe ich folgende regexp ausprobiert und das notify definiert
define <device>:Helligkeit:.(^[2][2-9]$)Es werden nur Zahlen von 22-29 getriggert.
Leider triggert das notify damit überhaupt nicht.
Ändere ich das so ab:
define <device>:Helligkeit:.([2][2-9]$)funktioniert es.
Allerdings meint regexp101 dann auch auf z.B. 222 oder 246 zu triggern.
FHEM macht das nicht. Getriggert wird nur auf z.B 22 oder 24 etc.

Was macht FHEM da anders bzw. woran liegt es?

Norbert
Titel: Aw: Notify Regexp
Beitrag von: JoWiemann am 15 Juli 2026, 13:22:14
Hallo Norbert,

die Frage ist: welche Zeichenkette hast Du in regexp101 getestet.

^[2][2-9]$
starte am Anfang der Zeichenkette
das erste Zeichen muss 2 sein
das zweite Zeichen muss 2..9 sein und am Ende der Zeichenkette stehen

Grüße Jörg
Titel: Aw: Notify Regexp
Beitrag von: Nobbynews am 15 Juli 2026, 13:31:02
Zitat von: JoWiemann am 15 Juli 2026, 13:22:14die Frage ist: welche Zeichenkette hast Du in regexp101 getestet.
Die Zahlen zwischen 22 und 29 und darüber hinaus auch 3-stellige.
Siehe screenshot.
Titel: Aw: Notify Regexp
Beitrag von: JoWiemann am 15 Juli 2026, 13:50:02
Für Deinen Test passt das. Testen solltest Du aber die gesamte Zeichenkette, die vom notify getestet wird. Und das sind nicht nur die Zahlen.

Grüße Jörg
Titel: Aw: Notify Regexp
Beitrag von: Nobbynews am 15 Juli 2026, 14:02:09
Hallo Jörg,

das habe ich sowohl über das reading vom device als auch über den Befehl trigger getestet.
Also z.B.
trigger <device> Helligkeit: 25bzw.
setreading <device> Helligkeit 25
Norbert
Titel: Aw: Notify Regexp
Beitrag von: Jamo am 15 Juli 2026, 14:39:03
Zitat von: Nobbynews am 15 Juli 2026, 12:49:20Hallo zusammen,
Was macht FHEM da anders bzw. woran liegt es?

Norbert

Hallo Norbert,
folgendes sollte funktionieren:
Helligkeit:.[2][2-9]Es liegt am ^ und am $ , das passt irgendwie nicht fuer fhem, frag mal ChatGPT.
Titel: Aw: Notify Regexp
Beitrag von: rudolfkoenig am 15 Juli 2026, 15:11:12
ZitatWas macht FHEM da anders bzw. woran liegt es?
Vermutlich an den Testdaten.
Das Event ist "Helligkeit: 25", im Regexp steht Punkt fuer das Leerzeichen nach Helligkeit:
Fuer trigger ist alles nach Geratename ein Event.
Ob man trigger richtig verwendet, kann man mit dem Event monitor pruefen, indem man es mit den "echten" Events vergleicht.
Wie schon vermerkt wurde, ^ steht fuer Anfang der Zeichenkette, $ fuers Ende, man sollte sie nicht in der Mitte des Regexps einbauen.
Titel: Aw: Notify Regexp
Beitrag von: Nobbynews am 15 Juli 2026, 15:34:37
Zitat von: Jamo am 15 Juli 2026, 14:39:03folgendes sollte funktionieren:
Helligkeit:.[2][2-9]Es liegt am ^ und am $ , das passt irgendwie nicht fuer fhem, frag mal ChatGPT.
Nein, tut es nicht. Das triggert lt. regexp101 auch auf 329, 423 etc.
Über die Funktion von ^ und $ bin ich mir auch ohne ChatGPT im Klaren.

Edit: Unter FHEM funktioniert das korrekt.
Titel: Aw: Notify Regexp
Beitrag von: Nobbynews am 15 Juli 2026, 15:41:42
Zitat von: rudolfkoenig am 15 Juli 2026, 15:11:12Vermutlich an den Testdaten.
Das Event ist "Helligkeit: 25", im Regexp steht Punkt fuer das Leerzeichen nach Helligkeit:
Vom gleichen device habe ich schon seit Ewigkeiten zuverlässig dieses notify am Laufen:
<device>:Helligkeit:.[3-6]$Am Punkt kann es also nicht liegen.
Auch Helligkeit:(^.[2][2-9]$) triggert nicht.
Hier mal ein original Event:
2026-07-15 15:40:20 ZWave ZWave_BWM_Garage_Lux Helligkeit: 2000
Von daher sollte es doch meiner Meinung nach korrekt sein.

Eigentlich war meine Frage nur, warum es bei regexp101 funktioniert, im notify von FHEM aber nicht.

Norbert
Titel: Aw: Notify Regexp
Beitrag von: Nobbynews am 15 Juli 2026, 15:57:47
Zitat von: rudolfkoenig am 15 Juli 2026, 15:11:12man sollte sie nicht in der Mitte des Regexps einbauen.
Ok, das könnte dann für den Beginn der Zeichenkette zusammen mit dem führenden '.' eine Erklärung sein.
Titel: Aw: Notify Regexp
Beitrag von: Nobbynews am 15 Juli 2026, 16:22:10
Kann es sein, das die Ursache hierin zu suchen ist:
aus dem Wiki:
ZitatDas Suchmuster wird notify-intern um das Zeichen ^ (beginnt mit) und das Zeichen $ (endet mit) ergänzt[3]. Deshalb darf das Suchmuster nicht mit einem üblichen Regulären Ausdruck, wie er in Perl[4] verwendet wird, gleichgesetzt werden, da die Ergänzung zu einem grundsätzlich unterschiedlichen Verhalten führt, siehe nachstehendes Beispiel.
Titel: Aw: Notify Regexp
Beitrag von: Damian am 15 Juli 2026, 19:14:17
Zitat von: Nobbynews am 15 Juli 2026, 16:22:10Kann es sein, das die Ursache hierin zu suchen ist:
aus dem Wiki:
ZitatDas Suchmuster wird notify-intern um das Zeichen ^ (beginnt mit) und das Zeichen $ (endet mit) ergänzt[3]. Deshalb darf das Suchmuster nicht mit einem üblichen Regulären Ausdruck, wie er in Perl[4] verwendet wird, gleichgesetzt werden, da die Ergänzung zu einem grundsätzlich unterschiedlichen Verhalten führt, siehe nachstehendes Beispiel.

So ist es.

Deine regex musst du beim notify gedanklich mit ^ am Anfang und $ am Ende ergänzen - beim DOIF braucht man das nicht, weil es nicht die beiden Zeichen dranhängt. Zahlenvergleiche würde ich aber nicht mit regex, sondern numerisch mit < > vergleichen.
Titel: Aw: Notify Regexp
Beitrag von: Nobbynews am 17 Juli 2026, 04:34:53
Zitat von: Damian am 15 Juli 2026, 19:14:17Zahlenvergleiche würde ich aber nicht mit regex, sondern numerisch mit < > vergleichen.
Da ich den Zahlenwert an dieser Stelle nicht verarbeite, möchte ich damit eigentlich nur das ständige triggern des notify verhindern. Über disabledForIntervals habe ich den Zeitraum schon stark eingegrenzt.
Andere Idee dafür?
Titel: Aw: Notify Regexp
Beitrag von: Damian am 17 Juli 2026, 09:15:50
Das wäre deine Lösung:

defmod mynotify notify mydevice:Helligkeit.*[2][2-9] set bla1 on
mydevice und deinen auszuführenden Befehl musst du nur auf deine Bedürfnisse anpassen:

notify checkt gegen:

^mydevice:Helligkeit.*[2][2-9]$
Titel: Aw: Notify Regexp
Beitrag von: Nobbynews am 17 Juli 2026, 09:33:22
Zitat von: Damian am 17 Juli 2026, 09:15:50Das wäre deine Lösung:
defmod mynotify notify mydevice:Helligkeit.*[2][2-9] set bla1 on
So habe ich das schon ein paar Tage am Laufen.
Der Unterschied zu regexp101 ist mir jetzt klar.
Danke.

Norbert