Hauptmenü

(Gelöst) Regex-Problem

Begonnen von is2late, 03 Dezember 2021, 11:24:56

Vorheriges Thema - Nächstes Thema

is2late

Hi,

habe mir die Finger am Regex-Tester wund geschrieben und komme nicht ans Ziel. Hier das Problem:'

{"area": 1, "zone": 51, "type": 54, "type_f": "{D_TYPE_54}", "name": "Innen",
"tag": "",
"cond": "", "cond_ok": "1", "battery": "", "battery_ok": "1",
"tamper": "", "tamper_ok": "1", "bypass": 0, "rssi": "{WEB_MSG_STRONG} 6",
"resp_mode": [0,0,0,0,0,0], "ammeter": "0", "ver": "",
"bypass_tamper": 0,
"sid": "ZS:a47a01", "su": 1, "alarm_status": "", "status_ex": "0", "hue": "-1", "sat": "-1", "ctemp": "-1", "hue_cmode": "-1", "hue_cie_x": "-1", "hue_cie_y": "-1", "hue_color_cap": "0", "nuki": "-1", "shutter_turn": 0,"status": "{WEB_MSG_TS_DEGREE} 21.36 {WEB_MSG_RH_HUMIDITY} 37"},


Gesucht wird für "Innen" der Wert "1" in "battery_ok".

Meine Versuche rund um
(?s)(Innen).*?(battery_ok)([: ]*\d)

scheitern scheinbar direkt vor dem Wert.

Sieht jemand, weshalb?

Velen Dank,
Ingo
Pi4, Tahoma Jalousien, Hue, Echo, Sonos, Lupusec XT3, FritzBox

DS_Starter

Ich würde es so machen.
in $data steht dein String zur Untersuchung. In $ok steht dann der Wert von battery_ok.

Zitat
$data =~ /battery_ok":\s"(?<bok>(\d))"/sx;
$ok    = $+{bok};

Grüße,
Heiko

Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

is2late

Hallo Heiko,

vielen Dank! Bekomme ich den Code irgendwie in ein attr oder ist das ein ganz anderes Verfahren?
Zum Schluss muss es (damit kann ich jedenfalls arbeiten) ähnlich aussehen wie
attr Temperaturen reading10Regex (?s)(Innen).*?("battery_ok")([: ]*\d)

LG Ingo
Pi4, Tahoma Jalousien, Hue, Echo, Sonos, Lupusec XT3, FritzBox

DS_Starter

Hmm, kommt auf das Attr an ob es eine komplexere Codestruktur akzeptiert oder nur ein einzelnes Regex.
reading10Regex scheint Httpmod zu sein. Ich glaube da kann es nur ein "einfaches" Regex sein.
Aber dein Datenstring schein ein JSON zu sein. Da würde sich m.M. nach die Zerlegung mit dem Attr get01JSON anbieten ?
Bin mit httpmod aber nicht so arg sattelfest. Würde an deiner Stelle aber mal in diese Richtung schauen.

LG
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

is2late

Ja, Du hast Recht, es ist HTTMOD.
Idealerweise würde ich gern dabei bleiben, denn damit komme ich halbwegs zurecht. JSON ist unbekanntes Terrain  :-\

Aus demselben HTTPMOD entnehme ich Temperatur und Luftfeuchte zB mit
attr Temperaturen reading07Regex (?s)(Innen)+.*?(WEB_MSG_RH_HUMIDITY})([^ }]*\d)
und es klappt. Macht mich daher wahnsinnig, dass ich es für die Batterie nicht hinbekomme.


Danke Dir,
LG Ingo
Pi4, Tahoma Jalousien, Hue, Echo, Sonos, Lupusec XT3, FritzBox

betateilchen

Zitat von: is2late am 03 Dezember 2021, 11:24:56
Gesucht wird für "Innen" der Wert "1" in "battery_ok".

Meine Versuche rund um
(?s)(Innen).*?(battery_ok)([: ]*\d)

scheitern scheinbar direkt vor dem Wert.

Schonmal mit

battery_ok.*(\d+)

probiert? Bei mir kommt da die 1 raus.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

is2late

Hi Betateilchen,

super, sieht gut aus... bei mir kommt allerdings "7" raus, nämlich die "7" ganz am Ende bei Humidity.

LG
Pi4, Tahoma Jalousien, Hue, Echo, Sonos, Lupusec XT3, FritzBox

Christoph Morrison

Vielleicht lieber JsonMod nehmen, dann kannst du direkt einen Selektor auf den benötigten Wert setzen.
Was ist die Quelle deiner Daten?

is2late

#8
Hi,

ich glaub, ich habs per Zufall gefunden...

.* ist geery und sucht bis zum Ende, daher .*?

Hier komplett, falls es jemand mal sucht:
(?s)(Innen).*?(battery_ok).*?(\d+)

Herzlichen Dank für Eure Hilfe!

LG Ingo
Pi4, Tahoma Jalousien, Hue, Echo, Sonos, Lupusec XT3, FritzBox

betateilchen

Zitat von: Christoph Morrison am 03 Dezember 2021, 12:36:57
Vielleicht lieber JsonMod nehmen

Die Verwendung von JSON wurde weiter oben schon ausgeschlossen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!