Json und REGEX

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
toto1975
Beiträge: 47
Registriert: 8. Jan 2016 10:47
Answers: 1

Json und REGEX

Beitrag von toto1975 »

Hallo in die Runde,

ich stehe schon wieder mit Json und Regex auf Kriegsfuß :-(

Ich möchte gerne den Wert "battery_power": "11" aus folgenden Json-Daten einem Item zuweisen

Code: Alles auswählen

"solarbank_info": {
    "solarbank_list": [
      {
        "device_pn": "A17C0",
        "device_sn": "AZxxxxxxxx",
        "device_name": "Solarbank E1600",
        "device_img": "https://public-aiot-fra-prod.s3.dualstack.eu-central-1.amazonaws.com/anker-power/public/product/anker-power/e9478c2d-e665-4d84-95d7-dd4844f82055/20230719-144818.png",
        "battery_power": "11",
        "bind_site_status": "",
        "charging_power": "63",
        "power_unit": "W",
        "charging_status": "1",
        "status": "1",
        "wireless_type": "1",
        "main_version": "",
        "photovoltaic_power": "63",
        "output_power": "63",
        "create_time": 1695831754,
        "set_load_power": "",
        "output_cutoff_data": 10,
        "is_display": true
      }
    ],
mit

Code: Alles auswählen

REGEX:(.*battery_power.*)∩JSONPATH:$.['solarbank_info'].['solarbank_list'].battery_power
funktioniert es leider nicht. Sorry ich habe bis jetzt immer nur eine einfachere Struktur gehabt. Hier ist es wohl etwas komplexer.

Danke für einen Tipp

Viele Grüße
Torsten

Harka
Beiträge: 308
Registriert: 30. Apr 2021 13:13
Answers: 15

Re: Json und REGEX

Beitrag von Harka »

Moin,
wenn Dein Eingangswert hier nur unvollständig eingefügt wurde ( es fehlen außen ein paar Klammern) sollte

Code: Alles auswählen

JSONPATH:$.solarbank_info.solarbank_list[0].battery_power
ohne Regex zum Ziel führen

Benutzeravatar
udo1toni
Beiträge: 13985
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Json und REGEX

Beitrag von udo1toni »

Wobei das RegEx durchaus eine gute Idee sein kann, falls der Channel auch noch andere JSON Objekte liefert, in denen der gewünschte Wert nicht vorhanden ist.
Falls Du mehrere der Module verwendest, könnte es noch sein, dass auch noch weitere Arrays vorhanden sind. Dann solltest Du bevorzugt das Array nicht anhand des Index identifizieren, sondern Dir ein eindeutiges Merkmal herauspicken (hier z.B. device_sn, die Seriennummer des Geräts). Dann kannst Du gezielt dasjenige Array selektieren, in dem die Seriennummer vorkommt:

Code: Alles auswählen

JSONPATH:$.solarbank_info.solarbank_list[?(@.device_sn=='AZxxxxxxxx')].battery_power
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

toto1975
Beiträge: 47
Registriert: 8. Jan 2016 10:47
Answers: 1

Re: Json und REGEX

Beitrag von toto1975 »

Danke für die Antworten.

Hier mal die komplette JSON damit ihr euch einen kompletten Überblick machen könnt:

Code: Alles auswählen

{
  "home_info": {
    "home_name": "Home",
    "home_img": "",
    "charging_power": "0.00",
    "power_unit": "W"
  },
  "solar_list": [],
  "pps_info": {
    "pps_list": [],
    "total_charging_power": "0.00",
    "power_unit": "W",
    "total_battery_power": "0.00",
    "updated_time": "",
    "pps_status": 0
  },
  "statistics": [
    {
      "type": "1",
      "total": "200.04",
      "unit": "kwh"
    },
    {
      "type": "2",
      "total": "199.44",
      "unit": "kg"
    },
    {
      "type": "3",
      "total": "80.02",
      "unit": "€"
    }
  ],
  "topology_type": "1",
  "solarbank_info": {
    "solarbank_list": [
      {
        "device_pn": "A17C0",
        "device_sn": "AZVxxxxxx",
        "device_name": "Solarbank E1600",
        "device_img": "https://public-aiot-fra-prod.s3.dualstack.eu-central-1.amazonaws.com/anker-power/public/product/anker-power/e9478c2d-e665-4d84-95d7-dd4844f82055/20230719-144818.png",
        "battery_power": "11",
        "bind_site_status": "",
        "charging_power": "63",
        "power_unit": "W",
        "charging_status": "1",
        "status": "1",
        "wireless_type": "1",
        "main_version": "",
        "photovoltaic_power": "63",
        "output_power": "63",
        "create_time": 1695831754,
        "set_load_power": "",
        "output_cutoff_data": 10,
        "is_display": true
      }
    ],
    "total_charging_power": "0",
    "power_unit": "W",
    "charging_status": "0",
    "total_battery_power": "0.11",
    "updated_time": "2024-03-27 07:48:50",
    "total_photovoltaic_power": "63",
    "total_output_power": "63.00",
    "display_set_power": false,
    "is_display_data": true
  },
  "retain_load": "0W",
  "updated_time": "01-01-0001 00:00:00",
  "power_site_type": 2,
  "site_id": "d51084e5-7bed-4e12-9993-464b120e4066",
  "powerpanel_list": []
}
Bisher habe ich immer im Channel unter MQTT State Topic den Topic angegeben. Hier ist der entsprechende Topic

Code: Alles auswählen

solix/site/Torsten 1600/scenInfo
. Bei Incoming Value Transformations dann

Code: Alles auswählen

REGEX:(.*battery_power.*)∩JSONPATH:$.['solarbank_info'.'solarbank_list'].battery_power
Sorry für die Frage jetzt aber wo genau kommen eure Ausdrücke hin? Eventuell ins verlinkte Item und dort den Punkt JSONPATH angeben und ins Feld JSONPATH Ausdruck eure Ausdrücke?

Sorry bin verwirrt.

Benutzeravatar
udo1toni
Beiträge: 13985
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Json und REGEX

Beitrag von udo1toni »

Incoming Value Transformation ist die richtige Stelle.
Für weitere Werte des selben Topics legst Du einfach eine Kopie des Channels an (das geht ganz leicht über die Code-Ansicht) und passt die Details entsprechend an.
Alternativ kannst Du auch das JSONPATH Profile nutzen, ABER! 1. Kannst Du dann keine Verknüpfung mehrerer Transformations verwenden (REGEX und JSONPATH) und 2. kannst Du keine unit hinzufügen. Die unit ist ein Parameter unter den advanced Options und erlaubt Dir, jeden beliebigen Number Channel von mqtt und http in einen QuantityType Number Channel zu verwandeln. Bestes Beispiel, warum das super praktisch sein kann sind die Temperatursensoren, welche die Temperatur als Ganzzahl liefern, allerdings mit 1/10 Grad Genauigkeit. Der Wert muss also zunächst durch 10 geteilt werden, damit er passt. Wenn Du aber also Unit D°C angibst, teilt openHAB direkt für Dich. Insgesamt werden UoM bzw. QuantityType Werte in openHAB immer wichtiger und man sollte sich dringend damit beschäftigen, wenn das noch nicht geschehen ist. ;)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

toto1975
Beiträge: 47
Registriert: 8. Jan 2016 10:47
Answers: 1

Re: Json und REGEX

Beitrag von toto1975 »

Perfekt lieben Dank euch zwei

Schöne Ostern wünsche ich euch noch

Viele Grüße
Torsten

Antworten