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
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
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
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
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
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.
Hi Betateilchen,
super, sieht gut aus... bei mir kommt allerdings "7" raus, nämlich die "7" ganz am Ende bei Humidity.
LG
Vielleicht lieber JsonMod nehmen, dann kannst du direkt einen Selektor auf den benötigten Wert setzen.
Was ist die Quelle deiner Daten?
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
Zitat von: Christoph Morrison am 03 Dezember 2021, 12:36:57
Vielleicht lieber JsonMod nehmen
Die Verwendung von JSON wurde weiter oben schon ausgeschlossen.