Seite 1 von 1

Json und REGEX

Verfasst: 27. Mär 2024 18:30
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

Re: Json und REGEX

Verfasst: 27. Mär 2024 20:07
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

Re: Json und REGEX

Verfasst: 27. Mär 2024 21:06
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

Re: Json und REGEX

Verfasst: 27. Mär 2024 22:14
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.

Re: Json und REGEX

Verfasst: 27. Mär 2024 22:42
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. ;)

Re: Json und REGEX

Verfasst: 28. Mär 2024 18:32
von toto1975
Perfekt lieben Dank euch zwei

Schöne Ostern wünsche ich euch noch

Viele Grüße
Torsten