Hauptmenü

DOIF und Regex

Begonnen von Sirel, 12 Oktober 2020, 21:45:23

Vorheriges Thema - Nächstes Thema

Sirel

Hallo zusammen,
ich habe ein vermeintlich einfache Frage:

Ich erhalte folgendes Event von einem Shelly:

020-10-12 10:32:00 MQTT_DEVICE hz_Bad_EG announce: {"id":"hz_eg_2","model":"SHSW-25","mac":"68C63AFB7AE4","ip":"192.168.1.71","new_fw":false,"fw_ver":"20200827-065456/v1.8.3@4a8bc427"}

Ich möchte nun zum einen auf  new_fw":true als Trigger für die Bedingung filtern lassen und zum anderen, die IP in einem Reading zurückgegeben bekommen.

So habe ich es versucht, aber ohne Erfolg:

([":\:false"]) (setreading $SELF IP {("$EVENT" =~ /(\d*\.\d*\.\d*\.\d*)/;$1}))
(hier noch mit "false" und ohne new_fw":, da die Anführungszeichen nicht escaped werden können - jedenfalls habe ich das mit \" nicht hinbekommen.

Kurzum, ich bekomme die Triggerabfrage nicht hin, wenn die RegEx Anführungszeichen beinhaltet, noch bekomme ich die IP zurückgegeben. Mein Ziel ist es, mich informieren zu lassen, wenn eine neue FW für den Shally vorhanden ist und dann direkt die IP dazu haben.

Kann mir jemand beschreiben, wie ich das hinbekomme?

Besten Dank,
Max

PS:
bei RegExr.com wir die IP über den Suchstring so gefunden.

amenomade

#1
Zitat020-10-12 10:32:00 MQTT_DEVICE hz_Bad_EG announce: {"id":"hz_eg_2","model":"SHSW-25","mac":"68C63AFB7AE4","ip":"192.168.1.71","new_fw":false,"fw_ver":"20200827-065456/v1.8.3@4a8bc427"}

Das Event ist:
- Device=hz_Bad_EG
- Reading=announce
- Value= {JSON blabla}

Also grundsätzlich kannst Du nur auf [hz_Bad_EG:"announce"] triggern, oder wenn alle Devices mit einem announce Reading triggern müssen,  [":announce"]

Wenn Du jetzt durch den Wert weiter filtern möchtest, musst Du einen Default-Wert im Trigger setzen, damit der Inhalt des Events bewertet wird und dann deine Regex benutzen
DOIF (["hz_Bad_EG:announce", 0] =~ "Regex")

Da dein Reading Einführungszeichen enthält, dann eher
DOIF ([hz_Bad_EG:"announce", 0] =~ /Regex"mit" Einführungs"zeichen/)
DOIF ([hz_Bad_EG:"announce", 0] =~ /new_fw":false/)




https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events

EDIT: und im Ausführungsteil sollte folgendes reichen:
(setreading $SELF IP {$EVENT =~ /(\d*\.\d*\.\d*\.\d*)/;$1})


Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Sirel

Hallo amenomade,

besten Dank für Deine Beschreibung und den Lösungsansatz.
Teste ich morgen wenn ich wieder am PC bin.

Schönen Abend und nochmals danke,

Max

Damian

oder Filter mit Ausgabeformatierung nutzen,  hier als ein Einzeiler:

define di_hz_Bad_EG DOIF {set_Reading("IP",["hz_Bad_EG:new_fw..true":"(\d*\.\d*\.\d*\.\d*)", 0])}


https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events

dort steht:

Zitat...Ebenfalls kann ein Ereignisfilter mit Ausgabeformatierung angegeben werden.

Syntax:

["regex for trigger":"<regex filter>":<output>,<default value>]

Regex-Filter- und Output-Parameter sind optional. Der Default-Wert ist verpflichtend.

Die Angaben zum Filter und Output funktionieren, wie die beim Reading-Filter, siehe:

https://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sirel

Kurze Rückmeldung zur Fragestellung:

der Vorschlag von amenomade funktioniert soweit, allerdings wird der komplette Event-Inhalt ins IP Reading geschrieben und nicht nur die IP.

Damians 1-Zeiler does the magic out of the box.

Da aber Perl IF im Spiel ist und ich besser mit dem DOIF Classic umgehen kann, anbei der Code wie es auch im classic Format funktioniert:

(["^hz_:announce",0] =~ /new_fw..false/) (setreading $SELF IP [$DEVICE:announce:"(\d*\.\d*\.\d*\.\d*)":$1])

Besten an euch beiden!

Gute N8 und viele Grüße,

Max