Hilfe bei Regex

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

togi99
Beiträge: 9
Registriert: 29. Jul 2018 13:29
Answers: 0

Hilfe bei Regex

Beitrag von togi99 »

Hallo zusammen,

ich bräuchte etwas Starthilfe von euch.
Ich habe seit einigen Wochen eine Photovoltaik Anlage. Seit diesem Zeitpunkt experimentiere herum wie ich per Openhab gewisse Werte des Wechselrichters und der Batterie auslesen kann. Wechselrichter war kein Problem.
Bei der Batterie muss ich irgendwie mit Regex arbeiten und bekomme es einfach nicht hin.

Ich nutze für die Batterie das http binding. Beim Aufruf per http wird mir ein String zurückgeliefet:
{"SerNum": ["0004A30B000A3A3A"], "FData": {"IPV": 6.81, "VBat": 89.3, "VPV": 497.9, "PGrid": -2317, "IBat": -7.67}, "SData": {"Status": {"LTC": "00000000", "BMS": "00000000", "Sys": "00001800", "Com": "00000000"}, "ACS": {"U_L2": 248.0, "f": 50.0}, "SoC": 26, "SysConfig": "19", "CCode": "0"}, "CData": {"SUSD": ["427", "420"], "BL": "3.2", "ACS": "621", "SerNum": ["0004A30B000A3A3A", "70C1CAE60000", "7092B9E60000"], "Version": "3.26", "PVM": "2.3"}, "Time": 7421710}

Was ich nun abfragen möchte ist die Zahl hinter "SoC":; also die 26.

Wie muss mein Aufruf in der items aussehen?
aktuell habe ich

Code: Alles auswählen

Number PV_battery  "Batteriestatus [%.0f%%]" <inverter> (PV) { http="<[solarwatt:5000:REGEX(SoC":(.*?),)]" }
Danke.
Tobias

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

Re: Hilfe bei Regex

Beitrag von udo1toni »

Du brauchst da kein REGEX, sondern JSONPATH, da das, was Du da zurück bekommst, JSON ist. So sieht das Ganze schön formatiert aus:

Code: Alles auswählen

{
  "SerNum": [
    "0004A30B000A3A3A"
  ],
  "FData": {
    "IPV": 6.81,
    "VBat": 89.3,
    "VPV": 497.9,
    "PGrid": -2317,
    "IBat": -7.67
  },
  "SData": {
    "Status": {
      "LTC": "00000000",
      "BMS": "00000000",
      "Sys": "00001800",
      "Com": "00000000"
    },
    "ACS": {
      "U_L2": 248,
      "f": 50
    },
    "SoC": 26,
    "SysConfig": "19",
    "CCode": "0"
  },
  "CData": {
    "SUSD": [
      "427",
      "420"
    ],
    "BL": "3.2",
    "ACS": "621",
    "SerNum": [
      "0004A30B000A3A3A",
      "70C1CAE60000",
      "7092B9E60000"
    ],
    "Version": "3.26",
    "PVM": "2.3"
  },
  "Time": 7421710
}
Wenn Du nun z.B. SoC haben willst, hangelst Du Dich am JSON-Pfad entlang, in diesem Fall also $.SData.SoC. Ein passendes Item wäre also

Code: Alles auswählen

Number BattSoC "SoC [%.1f]" {http="<[batthttp:30000:JSONPATH($.SData.SoC)]"}
wobei batthttp natürlich der komplette http-Aufruf wäre, die 30000 wäre ein Aufruf alle 30 Sekunden, und JSONPATH gibt den Wert zurück, der im JSON-Pfad auf dem Ast $.SData.SoC gespeichert ist. $ ist dabei die Wurzel.

Da Du vielleicht mehrere Werte auslesen möchtest, bietet es sich an, einen http cache anzulegen. Der Cache wird z.B. alle 60 Sekunden aktualisiert, die "echten" Items lesen alle paar Sekunden aus dem Cache. damit wird die Netzlastalso auf einen Zugriff pro Minute gesenkt, Du kannst aber alle Werte schön geordnet in einzelnen Items vorhalten.

Ein paar Hilfsmittel für JSON: https://jsoneditoronline.org/ (Editor, zeigt an, ob das JSON korrekt ist, formatiert das JSON) http://jsonpath.com/ (hilft beim Erstellen des Pfads) http://goessner.net/articles/JsonPath/index.html#e2 (Beispiele und Erklärung der Syntax)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

togi99
Beiträge: 9
Registriert: 29. Jul 2018 13:29
Answers: 0

Re: Hilfe bei Regex

Beitrag von togi99 »

Danke. Ich hatte das nicht als JSON identifiziert.
Werde es die Tage versuchen.

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

Re: Hilfe bei Regex

Beitrag von udo1toni »

Solange Klartext Daten geliefert werden, kann man eigentlich davon ausgehen, dass es sich entweder um html handelt (ein Fall für REGEX), xslt (kann man mit XPath bequem parsen) oder json (dafür dann halt JSONPATH). Es mag noch andere Formate geben, das sind dann aber Exoten.
Was gerne passiert, ist, dass der zurück gelieferte Datensatz ungültiges json oder xslt liefert. Meist hängen dann noch ein paar Zeicehn vorne oder hinten dran, das kann man dann relativ gut mit JS lösen (der *PATH steht dann im JS drin)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Marxkors
Beiträge: 5
Registriert: 13. Aug 2020 19:46
Answers: 0

Re: Hilfe bei Regex

Beitrag von Marxkors »

Hallo zusammen,
mittlerweile habe ich mehrere Beiträge bzgl. REGEX und BL-Net/UVR gelesen, allerdings bekomme ich meine Daten aus BL-Net nicht mehr korrekt angezeigt.
Unter openhab 2 funktionierte es noch und unter openhab 4 allerdings nicht mehr.
Meine GRAFIK1.html (BL-Net) zeigt mir:
Eingang 01: 3,2
Eingang 02: 59,9
Eingang 03: 15,0
Eingang 04: 57,7
Eingang 05: 24,4
Eingang 06: 34,1
Eingang 07: 60,5
Eingang 12: 4,8
Eingang 13: 71,5

Alles Temperaturen mit Komma, wobei Eingang 01/12 Außentemperaturen sind, die auch ins Minus und zu zweistelligen Werten gehen können.

code für Eingang 01 und 12
channels:
- id: Eingang_01
channelTypeUID: http:string
label: Solarkollektoren
description: null
configuration:
mode: READONLY
stateTransformation: REGEX:.*?Eingang 01:.*?([0-9][0-9],[0-9]).*
unit: C
- id: Eingang_12
channelTypeUID: http:string
label: Aussen Temperatur
description: null
configuration:
mode: READONLY
stateTransformation: REGEX:.*?Eingang 12:.*?([0-9][0-9],[0-9]).*
unit: C

Die Solarkollektoren (Eingang 01) zeigen mir den Wert von Eingang 02: "599" ohne Komma angezeigt.
Die Aussen Temperatur (Eingang 12) zeigt mir den wert von Eingang 13: "71,5" korrekt mit Komma.

Was mache ich falsch?

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

Re: Hilfe bei Regex

Beitrag von udo1toni »

Die beiden "fehlerhaften" Eingänge haben einen einstelligen Wert, also passt das Pattern erst auf den zweiten Wert (Du hast im Pattern gesetzt, dass zwischen dem Suchbegriff "Eingang 01:" bzw. "Eingang 12:" eine beliebig lange (aber möglichst kurze) Zeichenkette ".*?" vor dem eigentlich zu erwartenden Wert liegen darf, der wie gesagt zei Stellen vor dem Komma hat, gefolgt von einem Komma und einer weiteren Nachkommastelle. Negative Werte werden auf diese Weise auhc als positive Werte übergeben, denn das Minuszeichen wird als Teil der "Zwischenzeichenkette" gewertet.

Kannst Du bitte mal das "echte" html posten, nicht das, was Du im Browserfenster siehst, sondern den Quelltext? Das Pattern muss am Quelltext festgemacht werden, nicht an der Anzeige.
Bitte markiere unbedingt den Quelltext als Code (Vollständiger Editor & Vorschau -> Button mit </> drücken und zwischen den Code-Tags den Dateiinhalt von GRAFIK1.html einfügen).
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Marxkors
Beiträge: 5
Registriert: 13. Aug 2020 19:46
Answers: 0

Re: Hilfe bei Regex

Beitrag von Marxkors »

Hallo Udo,

anbei der Quelltext. Danke im Voraus schon mal für deine Unterstützung.

Code: Alles auswählen

Eingang 01: 3,7<br>
Eingang 02: 59,4<br>
Eingang 03: 15,5<br>
Eingang 04: 60,5<br>
Eingang 05: 37,2<br>
Eingang 06: 36,4<br>
Eingang 07: 61,9<br>
Eingang 08: AUS<br>
Eingang 09: 9999<br>
Eingang 10: 9999<br>
Eingang 11: 9999<br>
Eingang 12: 6,5<br>
Eingang 13: 73,1<br>
Eingang 14: 9999<br>
Eingang 15: 0<br>
Eingang 16: - -<br>

Ausgang 01: AUS<br>
Ausgang 02: AUS<br>
Ausgang 03: EIN<br>
Ausgang 04: AUS<br>
Ausgang 05: AUS<br>
Ausgang 06: EIN<br>
Ausgang 07: AUS<br>
Ausgang 08: AUS<br>
Ausgang 09: AUS<br>
Ausgang 10: AUS<br>
Ausgang 11: AUS<br>
Ausgang 12: AUS<br>
Ausgang 13: AUS<br>
Ausgang 13: - -<br>
Ausgang 15: - -<br>
Ausgang 16: - -<br>

Drehzahlstufe 1: 0<br>
Drehzahlstufe 2: - -<br>
Drehzahlstufe 6: - -<br>
Drehzahlstufe 7: 0<br>

Leistung 1: - -<br>
Leistung 2: - -<br> 

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

Re: Hilfe bei Regex

Beitrag von udo1toni »

Das ist aber kein gültiges html... Bist Du sicher, dass der Quelltext vollständig ist?
Ein REGEX, welches passen sollte (für jeden der Eingänge, außer Eingang 16 und Eingang 08 (weil die keinen Wert liefern)

Code: Alles auswählen

REGEX:.*Eingang 01: (-?\d*,?\d*?)<br>.*
Innerhalb der Gruppe kann zuerst ein Minuszeichen stehen, gefolgt von mindestens einer Ziffer, der vielleicht ein Komma folgt, gefolgt von beliebig vielen Ziffern. Nach der Gruppe folgt die Zeichenfolge <br>.
Sollte das Minuszeichen noch mit einem Leerzeichen abgesetzt sein, so könnte man das ebenfalls ergänzen:

Code: Alles auswählen

REGEX:.*Eingang 01: (-? ?\d*,?\d*?)<br>.*
Zu beachten ist noch, dass der Rückgabewert in dieser Form ein String ist, keine Zahl, denn openHAB nutzt statt dem Komma den Punkt als Dezimaltrenner. Man müsste also in einem zweiten Schritt das Komma durch einen Punkt ersetzen. Falls ein Leerzeichen nach dem Minus folgt, müsste openHAB damit aber zurecht kommen, notfalls kann man das in der gleichen Ersetzung ebenfalls berücksichtigen.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Marxkors
Beiträge: 5
Registriert: 13. Aug 2020 19:46
Answers: 0

Re: Hilfe bei Regex

Beitrag von Marxkors »

Hallo Udo,

Bzgl. deiner Rückmeldung:
"Das ist aber kein gültiges html... Bist Du sicher, dass der Quelltext vollständig ist?"

Ich habe den Quelltext mit "view-source:http://xxx.xxx.xxx.xxx/GRAFIK1.html" gezogen.
Gibt es da eine bessere/andere Möglichkeit?

Code: Alles auswählen

Eingang 01: 6,9<br>
Eingang 02: 59,6<br>
Eingang 03: 15,7<br>
Eingang 04: 58,8<br>
Eingang 05: 22,0<br>
Eingang 06: 38,2<br>
Eingang 07: 60,8<br>
Eingang 08: AUS<br>
Eingang 09: 9999<br>
Eingang 10: 9999<br>
Eingang 11: 9999<br>
Eingang 12: 8,2<br>
Eingang 13: 65,9<br>
Eingang 14: 9999<br>
Eingang 15: 0<br>
Eingang 16: - -<br>

Ausgang 01: AUS<br>
Ausgang 02: AUS<br>
Ausgang 03: EIN<br>
Ausgang 04: EIN<br>
Ausgang 05: AUS<br>
Ausgang 06: EIN<br>
Ausgang 07: AUS<br>
Ausgang 08: AUS<br>
Ausgang 09: AUS<br>
Ausgang 10: AUS<br>
Ausgang 11: AUS<br>
Ausgang 12: AUS<br>
Ausgang 13: AUS<br>
Ausgang 13: - -<br>
Ausgang 15: - -<br>
Ausgang 16: - -<br>

Drehzahlstufe 1: 0<br>
Drehzahlstufe 2: - -<br>
Drehzahlstufe 6: - -<br>
Drehzahlstufe 7: 0<br>

Leistung 1: - -<br>
Leistung 2: - -<br> 
.

Nun habe ich die REGEX angepasst.

Code: Alles auswählen

UID: http:url:BL-Net
label: BL-Net
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: true
  baseURL: http://xxx.xxx.xxx.xxx/GRAFIK1.html
  delay: 0
  stateMethod: GET
  refresh: 30
  commandMethod: GET
  timeout: 3000
  bufferSize: 2048
location: Keller
channels:
  - id: Eingang_01
    channelTypeUID: http:string
    label: Solarkollektoren
    description: null
    configuration:
      mode: READONLY
      stateTransformation: REGEX:.*Eingang 01:(-? ?\d*,?\d*?)<br>.*
      unit: null
  - id: Eingang_02
    channelTypeUID: http:string
    label: Warmwasser
    description: null
    configuration:
      mode: READONLY
      stateTransformation: REGEX:.*?Eingang 02:(-? ?\d*,?\d*?)<br>.*
      unit: null
  - id: Eingang_03
    channelTypeUID: http:string
    label: Puffer Unten
    description: null
    configuration:
      mode: READONLY
      stateTransformation: REGEX:.*?Eingang 03:(-? ?\d*,?\d*?)<br>.*
      unit: null
  - id: Eingang_04
    channelTypeUID: http:string
    label: Puffer Oben
    description: null
    configuration:
      mode: READONLY
      stateTransformation: REGEX:.*?Eingang 04:(-? ?\d*,?\d*?)<br>.*
      unit: null
  - id: Eingang_05
    channelTypeUID: http:string
    label: Heizung Rücklauf
    description: null
    configuration:
      mode: READONLY
      stateTransformation: REGEX:.*?Eingang 05:(-? ?\d*,?\d*?)<br>.*
      unit: null
  - id: Eingang_06
    channelTypeUID: http:string
    label: Puffer Mitte
    description: null
    configuration:
      mode: READONLY
      stateTransformation: REGEX:.*?Eingang 06:(-? ?\d*,?\d*?)<br>.*
      unit: null
  - id: Eingang_07
    channelTypeUID: http:string
    label: Warmwasser Speicher
    description: null
    configuration:
      mode: READONLY
      stateTransformation: REGEX:.*?Eingang 07:(-? ?\d*,?\d*?)<br>.*
      unit: null
  - id: Eingang_12
    channelTypeUID: http:string
    label: Aussen Temperatur
    description: null
    configuration:
      mode: READONLY
      stateTransformation: REGEX:.*?Eingang 12:(-? ?\d*,?\d*?)<br>.*
      unit: null
  - id: Eingang_13
    channelTypeUID: http:string
    label: Heizung Vorlauf
    description: null
    configuration:
      mode: READONLY
      stateTransformation: REGEX:.*?Eingang 13:(-? ?\d*,?\d*?)<br>.*
      unit: null
Nun passen alle Werte bis auf "Eingang 01". Es werden die Zahlen in diesem Fall "69" angezeigt, allerdings fehlt immer noch das Komma. Es müsste eigentlich "6,9" sein.
Irgendeine Idee was da noch fehlt oder ich falsch mache?

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

Re: Hilfe bei Regex

Beitrag von udo1toni »

Da fehlt jeweils ein Leerzeichen vor der öffnenden Klammer. Außerdem hast Du bei allen Channels (außer Eingang_01) ein Fragezeichen vor dem Eingang stehen, das ist falsch. Auch das Fragezeichen vor der schließenden Klammer ist fehl am Platze (das war mir noch reingerutscht...?
Was ich vergessen habe auszuprobieren... Vielleicht funktioniert auch

Code: Alles auswählen

stateTransformation: REGEX:.*Eingang 03:((- )?\d+,?\d*)<br>.*
Im Einzelnen bedeutet der REGEX:
. -> ein beliebiges Zeichen
(- ) -> Die Zeichengruppe "- "
\d -> eine Ziffer
+ -> Das vorherige Zeichen, ein- oder mehrmals
* -> das vorherige Zeichen, beliebig oft
? -> das vorherige Zeichen, null- oder einmal
Die äußeren Klammern: Dieser Teilstring wird zurückgegeben
Der String als ganzes muss auf den vollständigen String matchen (weshalb .* vorne und hinten stehen, damit alles "drumherum" egal ist)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten