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"