Zugriff auf ESP32 per URL funktioniert nicht

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
rebell21
Beiträge: 73
Registriert: 23. Aug 2024 09:34
Answers: 0

Zugriff auf ESP32 per URL funktioniert nicht

Beitrag von rebell21 »

ich versuche mit einem Thing aus dem HTTP-Binding auf einen ESP32 Webseite zuzugreifen. Ich habe mit dem ESP32 einen Gaszähler realisiert.

Beim Zugriff auf eine URL http://ip-des-ESP32/Status kommt eine JSON Datenstruktur zurück

beim Zugriff mit curl kommt dort {"wert","status"} zurück.

In JSON sieht das dann so aus

Code: Alles auswählen

0:	"05355.81"
1:	"1"
Ich möchte diesen Zähler mit OpenHAB auslesen. Mit dem Thing gem. HTTP-Binding erhalte ich immer nur NULL. Ich habe einen zusätzlichen channel definiert., Weiß aber nicht, wie ich die JSON Daten extrahieren soll. Ich verstehe nicht wie ein JSON Transformationsmuster aussehen könnte, um die Werte aus der Antwort herauszuholen.

hier der Code in OpenHAB 4.2.1

Code: Alles auswählen


UID: http:url:Gaszaehler
label: HTTP URL Thing
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://192.168.2.128
  delay: 0
  stateMethod: GET
  refresh: 30
  commandMethod: GET
  timeout: 3000
  bufferSize: 2048
channels:
  - id: last-failure
    channelTypeUID: http:request-date-time
    label: Last Failure
    configuration: {}
  - id: last-success
    channelTypeUID: http:request-date-time
    label: Last Success
    configuration: {}
  - id: Wert
    channelTypeUID: http:string
    label: String-Kanal
    description: ""
    configuration:
      stateExtension: Status


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

Re: Zugriff auf ESP32 per URL funktioniert nicht

Beitrag von udo1toni »

Auf die Schnelle:

Code: Alles auswählen

UID: http:url:Gaszaehler
label: HTTP URL Thing
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://192.168.2.128/
  delay: 0
  stateMethod: GET
  refresh: 30
  commandMethod: GET
  timeout: 3000
  bufferSize: 2048
channels:
  - id: last-failure
    channelTypeUID: http:request-date-time
    label: Last Failure
    configuration: {}
  - id: last-success
    channelTypeUID: http:request-date-time
    label: Last Success
    configuration: {}
  - id: Wert
    channelTypeUID: http:string
    label: String-Kanal
    configuration:
      stateExtension: Status
      stateTransformation: JSONPATH:$.0
      mode: READONLY
Der Jsonpath Transformation Service muss separat installiert werden. Das Feld stateTransformation gehört zur "Advanced Configuration". Gewöhnlich wird ein Gaszähler immer einen Zahlenwert liefern, entsprechend würde ich als channelTypeUID eher http:number setzen. Damit stünde dann auch gleich noch die Möglichkeit offen, die korrekte Einheit mitzuschicken, z.B. m³:

Code: Alles auswählen

UID: http:url:Gaszaehler
label: HTTP URL Thing
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://192.168.2.128/
  delay: 0
  stateMethod: GET
  refresh: 30
  commandMethod: GET
  timeout: 3000
  bufferSize: 2048
channels:
  - id: last-failure
    channelTypeUID: http:request-date-time
    label: Last Failure
    configuration: {}
  - id: last-success
    channelTypeUID: http:request-date-time
    label: Last Success
    configuration: {}
  - id: Wert
    channelTypeUID: http:number
    label: Zählerstand
    configuration:
      mode: READONLY
      unit: m³
      stateExtension: Status
      stateTransformation: JSONPATH:$.0
Um die Einheit auch im Item zur Verfügung zu haben, muss dieses dann als Number:Volume definiert sein. Obman dort den Wert aber in l(iter), cm³ oder auch km³ angibt, ist dann egal, openHAB wird den Wert immer wunschgemäß umrechnen (incl. imperialer Maßeinheiten, wenn man lieber Gallon oder cubic feet oder sowas verwenden will :) )
openHAB4.3.0 stable in einem Debian-Container (bookworm) (Proxmox 8.3.2, LXC), mit openHABian eingerichtet

rebell21
Beiträge: 73
Registriert: 23. Aug 2024 09:34
Answers: 0

Re: Zugriff auf ESP32 per URL funktioniert nicht

Beitrag von rebell21 »

ich habe jetzt Deinen Code komplett übernommen. Aber es geht leider immer noch nicht. Das Add-on JSON Path Transformation Service ist installiert.

Im Feld in der Overview page wird einfach immer nur Zählerstand NULL angezeigt.

Bild
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Zugriff auf ESP32 per URL funktioniert nicht

Beitrag von udo1toni »

Ich verstehe nicht, warum ihr immer Bilder schickt. Ich glaube Euch auch ohne "Beweisfoto", dass da NULL angezeigt wird...

Eventuell stimmt etwas mit der URL nicht. Wie lautet der exakte curl Aufruf?
openHAB4.3.0 stable in einem Debian-Container (bookworm) (Proxmox 8.3.2, LXC), mit openHABian eingerichtet

rebell21
Beiträge: 73
Registriert: 23. Aug 2024 09:34
Answers: 0

Re: Zugriff auf ESP32 per URL funktioniert nicht

Beitrag von rebell21 »

ok, keine Bilder mehr. Ich bin es so vom opensuse forum und homeassistant Forum so gewöhnt.

Bin noch Anfänger in openhab und hier im Forum. :)

Code: Alles auswählen




peter@linux-notebook:~> curl http://192.168.2.128/status
["05355.81","1"]


das ist exakt die Ausgabe

Wie kann ich in openhab sehen, dass JSON Transformation Service erfolgreich eingebunden ist. Ich sehe bloss, dass der Service unter "installed transformation services" bei ADD-ONs aufgeführt wird.

Ich habe das JSON path Transformation service log auf Debug gesetzt. Wo kann ich die logfiles denn einsehen ?

Nur zum Vergleich
In homeassistant konnte ich den ESP32 mit folgendem einfachen YAML- Code erfolgreich einbinden

Code: Alles auswählen


sensor:
 - platform: rest
   resource: http://192.168.2.128/status
   name:  "Gasverbrauch"
   value_template: "{{ value_json.0}}"
   unit_of_measurement:  "m³"


Ich bin gerade dabei, meine HomeAssistant Konfiguration auf openhab zu übertragen. Gibt dazu auch noch weitere Probleme (Zugriff auf Viessmann Heizung mit Viessmann API). Ich werde separate Threads erstellen.

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

Re: Zugriff auf ESP32 per URL funktioniert nicht

Beitrag von udo1toni »

Ah. Da kommt gar kein json... :) Stattdessen kommt ein Tupel aus zwei Werten.
Nun wäre zunächst die Frage, welcher der beiden Werte interessant ist. Ich nehme an, der erste Wert ist der Zählerstand. Den könntest Du mit REGEX herausfischen:

Code: Alles auswählen

tateTransformation: REGEX:.*\[\"(\d*\.\d*)\",.*
Ich habe den Term mit Regexr.com getestet, allerdings tickt openHAB REGEX teilweise etwas anders als das "normale" Regex, heißt, eventuell. muss der Term nochmal angepasst werden.
Die Bedeutung im Einzelnen:
. ist ein beliebiges Zeichen (ein Joker).
* bedeutet: das vorherige Zeichen, beliebig oft wiederholt. Hier also: eine beliebig lange Zeichenkette beliebiger Zeichen.
\ ist das Escape-Zeichen, um innerhalb eines Regex Patterns auch Spezielle Zeichen verwenden zu können (z.B. den Punkt als Punkt)
[] ist gewöhnlich eine Gruppe von Zeichen, aus der ein einzelnes Zeichen auftaucht. Z.B. S[io]nne würde sowohl auf "Sinne" als auch auf "Sonne" matchen. Hier ist das Zeichen aber Teil des Patterns, entsprechend muss es escaped werden.
" ist ebenfalls Teil des Patterns. Regex verlangt nicht, dass dieses Zeichen escaped wird, allerdings könnte openHAB hier falsch reagieren :) Eventuell kann der Backslash vor den Anführungszeichen aber auch entfallen. :)
() kennzeichnet eine Gruppe. in openHAB REGEX muss immer das gesamte Pattern matchen. Ergebnis der Transformation ist dann die erste Gruppe, also alles zwischen der ersten ( und der ersten ) :)
\d bedeutet Ziffer. Man könnte auch [0-9] schreiben.
\d* bedeutet also: beliebig viele aufeinander folgende Ziffern.
\. der Punkt als Punkt, nicht als Joker...

Es wird jeweils der erste Match verwendet, und es wird der kürzeste Match verwendet. Das heißt: das Pattern wird immer die Zahl zwischen dem ersten und dem zweiten Anführungszeichen ausspucken. Da das Pattern außerdem noch das Komma abfragt, ist es aber ohnehin nicht möglich, anders zu matchen.

Genau wie JSONPATH muss auch der REGEX Transformation Service aus dem Store installiert werden. Ob ein Addon installiert ist, kann man im Store sehen (dann steht nicht install, sondern remove neben dem Addon).
Es bietet sich an, bei Problemen zunächst den Channel als String Channel anzulegen, um ganz sicher eine Ausgabe zu erhalten :)
Weiterhin gibt es einen Unterschied zwischen Status und status. Man sollte immer die exakte Schreibweise verwenden, auch bei URLs, es gibt Webserver, die da empfindlich sind.

Code: Alles auswählen

UID: http:url:Gaszaehler
label: HTTP URL Thing
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://192.168.2.128/
  delay: 0
  stateMethod: GET
  refresh: 30
  commandMethod: GET
  timeout: 3000
  bufferSize: 2048
channels:
  - id: last-failure
    channelTypeUID: http:request-date-time
    label: Last Failure
    configuration: {}
  - id: last-success
    channelTypeUID: http:request-date-time
    label: Last Success
    configuration: {}
  - id: Wert
    channelTypeUID: http:number
    label: Zählerstand
    configuration:
      mode: READONLY
      unit: m³
      stateExtension: status
      stateTransformation: REGEX:.*\[\"(\d*\.\d*)\",.*
Wäre dann die aktuelle Version mit number Channel...
openHAB4.3.0 stable in einem Debian-Container (bookworm) (Proxmox 8.3.2, LXC), mit openHABian eingerichtet

rebell21
Beiträge: 73
Registriert: 23. Aug 2024 09:34
Answers: 0

Re: Zugriff auf ESP32 per URL funktioniert nicht

Beitrag von rebell21 »

langsam wird es besser. Aber nun wird der Zählerstand, der über http als 5355.81 kommt, immer als 5356 also gerundet dargestellt. Außerdem wird die Einheit m³ nicht angezeigt. So richtig verstehe ich die REGEX nicht. Wo ist das dokumentiert ?

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

Re: Zugriff auf ESP32 per URL funktioniert nicht

Beitrag von udo1toni »

Du musst das verlinkte Item noch als Number:Volume definieren.
Im Item musst Du ebenfalls unit setzen (Metadaten), dabei muss die gewählte Einheit eine Volumen-Einheit sein (nicht zwingend die gleiche wie im Channel!).
Dieser Parameter unit darf nur einmalig gesetzt werden, er hat Einfluss auf die Persistence, wenn Du später unit änderst, werden also bereits persistierte Werte die falsche Einheit haben.
Weiter musst Du im Item noch einstellen, wie der Wert dargestellt werden soll (state Description -> pattern, ebenfalls Metadaten) Diese Einstellung bezieht sich ausschließlich auf die Anzeige und nur auf bestimmte Stellen im System. Es gibt z.B. die Itemliste, dort wird immer der Status angezeigt, "wie er ist", also unabhängig von der state Description.
Die REGEX in openHAB beherrscht die Grundfunktionen von Regular Expressions, wie sie in modernen Programmiersprachen verwendet werden - mit den beschriebenen Einschränkungen... Das Pattern muss vollständig matchen und zurückgeliefert wird die erste Gruppe.
Du kannst Dich also an den üblichen Stellen im Internet aufschlauen :) oder Du fragst einfach hier nach ;)

Ob der Zahlenwert korrekt im Number Item landet, kannst Du auch im events.log sehen, dort wird für jedes Changed Ereignis der alte und der neue Status des jeweiligen Items ausgegeben. Sollten dort die Nachkommastellen fehlen, dann habe ich irgendwo noch einen Fehler im REGEX Pattern. :)
openHAB4.3.0 stable in einem Debian-Container (bookworm) (Proxmox 8.3.2, LXC), mit openHABian eingerichtet

rebell21
Beiträge: 73
Registriert: 23. Aug 2024 09:34
Answers: 0

Re: Zugriff auf ESP32 per URL funktioniert nicht

Beitrag von rebell21 »

Ja, danke, super jetzt geht es perfekt. Dann mal weiter bei der Migration von Home Assistant zu openhab. Nächste Baustelle ist der Zugriff per Handy von außen. Bisher arbeite ich nur im lokalen Homenetz

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

Re: Zugriff auf ESP32 per URL funktioniert nicht

Beitrag von udo1toni »

Das sollte mit myOpenHAB.org kein Problem sein.
Ich nutze dafür Wireguard um ein VPN in mein LAN aufzubauen, da ich das ohnehin benötige, um ALLES von unterwegs erreichen zu können, nicht nur openHAB...
openHAB4.3.0 stable in einem Debian-Container (bookworm) (Proxmox 8.3.2, LXC), mit openHABian eingerichtet

Antworten