FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: is2late am 03 Dezember 2021, 11:24:56

Titel: (Gelöst) Regex-Problem
Beitrag von: is2late am 03 Dezember 2021, 11:24:56
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
Titel: Antw:Regex-Problem
Beitrag von: DS_Starter am 03 Dezember 2021, 11:38:47
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

Titel: Antw:Regex-Problem
Beitrag von: is2late am 03 Dezember 2021, 11:45:11
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
Titel: Antw:Regex-Problem
Beitrag von: DS_Starter am 03 Dezember 2021, 11:53:35
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
Titel: Antw:Regex-Problem
Beitrag von: is2late am 03 Dezember 2021, 12:00:30
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
Titel: Antw:Regex-Problem
Beitrag von: betateilchen am 03 Dezember 2021, 12:15:29
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.
Titel: Antw:Regex-Problem
Beitrag von: is2late am 03 Dezember 2021, 12:29:55
Hi Betateilchen,

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

LG
Titel: Antw:Regex-Problem
Beitrag von: Christoph Morrison am 03 Dezember 2021, 12:36:57
Vielleicht lieber JsonMod nehmen, dann kannst du direkt einen Selektor auf den benötigten Wert setzen.
Was ist die Quelle deiner Daten?
Titel: Antw:Regex-Problem
Beitrag von: is2late am 03 Dezember 2021, 12:39:50
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
Titel: Antw:Regex-Problem
Beitrag von: betateilchen am 03 Dezember 2021, 12:58:25
Zitat von: Christoph Morrison am 03 Dezember 2021, 12:36:57
Vielleicht lieber JsonMod nehmen

Die Verwendung von JSON wurde weiter oben schon ausgeschlossen.