Hauptmenü

"einfache" HTTPMOD Abfrage

Begonnen von Thoffi1978, 22 März 2025, 09:40:36

Vorheriges Thema - Nächstes Thema

Thoffi1978

Hallo,

immer wieder hänge ich beim Erstellen von HTTPMOD Abfragen.
Ich habe eine einfache Url:
http://192.168.2.248/script/1/energy_counterdie folgendes ausgbit:
{"energyConsumed":"0.389 KWh","energyReturned":"6.73440 KWh"}
Ich habe mit:
define Zaehlerstand HTTPMOD http://192.168.2.248/script/1/energy_counterdie Seite angelegt.
Wie schaffe ich es jetzt diese zwei Werte auszulesen und in Readings zu bekommen?

Ich suche jetzt seit gut einer Stunde, habe aber vermutlich nicht den richtigen Suchbefehl.
Könnt Ihr mir sagen welche Regex ich wie ansprechen muss?

Internals:
   .LASTSEND  1742632451.51779
   .LastUpdate 1742632451.51468
   .TRIGGERTIME 1742632751.51468
   .getList   
   .setList   interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
   .updateRequestHash 1
   BUSY       0
   CFGFN     
   DEF        http://192.168.2.248/script/1/energy_counter
   FUUID      67de6dce-f33f-7e98-5e8b-81832c63ebe0cbe4
   Interval   300
   MainURL    http://192.168.2.248/script/1/energy_counter
   ModuleVersion 4.2.0 - 11.8.2023
   NAME       Zaehlerstand
   NOTIFYDEV  global
   NR         601
   NTFY_ORDER 50-Zaehlerstand
   STATE      ???
   TYPE       HTTPMOD
   eventCount 1
   value     
   .readingParseList:
     01
     02
   CompiledRegexes:
   HttpUtils:
     NAME       
     addr       http://192.168.2.248:80
     auth       0
     buf       
     code       200
     compress   1
     conn       
     data       
     displayurl http://192.168.2.248/script/1/energy_counter
     header     
     host       192.168.2.248
     httpheader HTTP/1.0 200 OK
Content-Length: 61
Server: ShellyHTTP/1.0.0
Connection: close
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    80
     hu_portSfx
     ignoreredirects 1
     loglevel   4
     path       /script/1/energy_counter
     protocol   http
     redirects  0
     timeout    2
     url        http://192.168.2.248/script/1/energy_counter
     sslargs:
   QUEUE:
   READINGS:
   REQUEST:
     context    reading
     data       
     header     
     ignoreredirects 0
     num        unknown
     retryCount 0
     type       update
     url        http://192.168.2.248/script/1/energy_counter
Attributes:
   reading01Name energyReturned
   reading01Regex (?s)energyReturned.*?poll([\d])
   reading02Regex 'energyReturned' value='(.[\d\.]+)

Vielen Dank,
Hoffi


betateilchen

#1
Nimm JsonMod anstatt HTTPMOD.

define Zaehlerstand JsonMod http://192.168.2.248/script/1/energy_counter
attr Zaehlerstand readingList complete()

liefert

setstate Zaehlerstand 2025-03-22 13:30:12 energyConsumed 0.389 KWh
setstate Zaehlerstand 2025-03-22 13:30:12 energyReturned 6.73440 KWh

Und wenn Du nur ein einzelnes reading haben möchtest, nimmst Du halt single() statt complete(), dabei kannst Du auch den readingName angeben, falls Du einen speziellen haben möchtest.

attr Zaehlerstand readingList single(jsonPath('$.energyReturned'), 'specialName', -1)
Man kann natürlich auch mehrere single() Angaben in das Attribut packen, das macht Sinn, wenn man aus einer Vielzahl von möglichen readings, die complete() liefern würde, nur wenige tatsächlich benötigt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thoffi1978

Vielen Dank für deine Antwort.
Ich habe alles definiert, doch wie es aussieht, habe ich mit JSON noch nicht gearbeitet.

Bei der Abfrage bekomme ich folgenden Fehler:
2025.03.23 10:19:43 3: json [JsonMod::JSON::StreamWriter] is pure perl. Consider installing Cpanel::JSON::XS
2025.03.23 10:20:30 2: [Zaehlerstand] http request error: http://192.168.2.248/script/1/energy_counter: empty answer received

mit verbose 5 kommt folgendes:
2025.03.23 10:27:59 5: HttpUtils url=http://192.168.2.248/script/1/energy_counter NonBlocking via http
2025.03.23 10:27:59 4: IP: 192.168.2.248 -> 192.168.2.248
2025.03.23 10:27:59 5: HttpUtils request header:
GET /script/1/energy_counter HTTP/1.0
Host: 192.168.2.248
User-Agent: fhem
Accept-Encoding: gzip,deflate

Accept: application/json
Accept-Charset: utf-8, iso-8859-1

2025.03.23 10:27:59 2: [Zaehlerstand] http request error: http://192.168.2.248/script/1/energy_counter: empty answer received

Ich habe dann mit
cpan install JSONversucht JSON zu installieren. Ist da falsch gewesen? Was muss ich installieren, damit die Anfrage nicht "leerläuft"?

Vielen Dank,
Hoffi

betateilchen

Zwei Probleme...

1. es fehlt die Library Cpanel::JSON::XS

Ob es sinnvoll ist, diese per CPAN zu installieren, kann ich Dir nicht beantworten, da Du noch nicht geschrieben hast, auf welcher Plattform Dein FHEM läuft. Bei Debian Installationen würde ich das Paket libcpanel-json-xs-perl über apt installieren.

2. es kommt eine leere Antwort

hier wäre interessant, ob es einen Zusammenhang zu 1. gibt. Das kann ich aus der Ferne nicht beurteilen.
Bekommst Du denn im Browser das JSON als Ergebnis, wenn Du die URL im Browser aufrufst?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thoffi1978

FHEM läuft euf einem Raspberry unter Debian.
Mit
sudo apt install libcpanel-json-xs-perlkommte es zu einer Fehlermeldung:
pi@raspberrypi:~ $ sudo apt install libcpanel-json-xs-perl
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  libcpanel-json-xs-perl
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 88.4 kB of archives.
After this operation, 181 kB of additional disk space will be used.
WARNING: The following packages cannot be authenticated!
  libcpanel-json-xs-perl
Install these packages without verification? [y/N] y
Err http://mirrordirector.raspbian.org/raspbian/ jessie/main libcpanel-json-xs-perl armhf 3.0104-1+b1
  404  Not Found [IP: 93.93.128.193 80]
E: Failed to fetch http://mirrordirector.raspbian.org/raspbian/pool/main/libc/libcpanel-json-xs-perl/libcpanel-json-xs-perl_3.0104-1+b1_armhf.deb  404  Not Found [IP: 93.93.128.193 80]

E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?


Ich habe eine alte Jessie installation, bekomme die aber nicht aktuell. Alles neu aufzuspielen, dazu hatte ich noch nicht die Muße. Muss ich im nächsten Urlaub einmal in Angriff nehmen.

Hoffi

betateilchen

Zitat von: Thoffi1978 am 23 März 2025, 11:46:39Ich habe eine alte Jessie installation, bekomme die aber nicht aktuell.

Das würde auch keinen Sinn machen, da hilft nur eine Neuinstallation wirklich sinnvoll weiter.
Auch wenn es mir widerstrebt, für solche Nachlässigkeit Support zu leisten, versuche ich es trotzdem mal.

Bleibe bei Deinem HTTPMOD device, wenn das zumindest die Daten richtig abfragen kann, und verwende folgende regexp:

energyConsumed":"([\d.]+)
Analog dann auch für das reading energyReturned verwendbar.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thoffi1978

Asche auf mein Haupt.
Ich kann den Unmut verstehen. So richtig weiter komme ich mit HTTPMOD nicht.
Ich werde mich bei Gelegenheit mal einen Tag um den Raspi kümmern.

Es ist wie bei einem Haus. Man hat immer etwas zu tun.

Trotzdem vielen Dank für die Hilfe.
Danke

betateilchen

#7
Zitat von: Thoffi1978 am 23 März 2025, 18:26:04So richtig weiter komme ich mit HTTPMOD nicht.

Woran klemmt es denn? Bei mir funktioniert das einwandfrei, Ergebnis siehe Screenshot im Anhang.

defmod Zaehlerstand HTTPMOD http://192.168.123.241:8082/test.html
attr Zaehlerstand reading01Name energyConsumed
attr Zaehlerstand reading01Regex energyConsumed":"([\d.]+)
attr Zaehlerstand reading02Name energyReturned
attr Zaehlerstand reading02Regex energyReturned":"([\d.]+)
attr Zaehlerstand showBody 1


...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#8
Es geht sogar noch einfacher:

defmod Zaehlerstand HTTPMOD http://192.168.123.241:8082/test.html
attr Zaehlerstand extractAllJSON 1

Dann muss man nur damit leben, dass auch die Einheit "KWh" noch mit im Reading landet.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thoffi1978

Vielen Dank für die Hilfe, das hat funktioniert.

Die letzte Lösung leuchtet mir auch ein. Wenn ich ":"([\d.]+) sehe, dann komme ich nicht weiter. Irgendwie ist das wie eine "Blockade" bei mir. Ich weiß nicht was die "Zeichen" bedeuten und dann geht es irgendwie nicht weiter.
attr Zaehlerstand extractAllJSON 1Das kann ich "lesen" und alles ist gut.

Noch einmal vielen Dank,
Hoffi

betateilchen

Zitat von: Thoffi1978 am 26 März 2025, 09:27:01Wenn ich ":"([\d.]+) sehe, dann komme ich nicht weiter. Irgendwie ist das wie eine "Blockade" bei mir. Ich weiß nicht was die "Zeichen" bedeuten

Deine Betrachtungsweise ist komplett falsch.

Worum geht es? Du hast einen "Text"

"energyConsumed":"0.389 KWh"

und möchtest daraus den Zahlenwert haben.

Also musst Du in der regex danach suchen, was VOR dem Zahlenwert steht. Und das ist genau der "Text", den Du in der regexp siehst

energyConsumed":"

Nachfolgend möchtest Du den Wert haben, der nach diesem bereits gefunden Teil kommt und der nur aus Ziffern und dem Dezimalpunkt besteht.

([\d.]+)

  • Der Teil in den eckigen Klammern [\d.] ist die Liste der Zeichen, nach denen gesucht werden soll. \d bedeutet Ziffern und . bedeutet Dezimalpunkt.
  • Das Pluszeichen nach der eckigen Klammer bedeutet, dass die vorher angegebenen Zeichen (Ziffer oder Punkt) mehrfach vorkommen können.
  • Die runde Klammer um das Ganze umschließt das Ergebnis als "Gruppe", die zurückgeliefert werden soll.

Daraus ergibt sich das Ergebnis 0.389
So schwer ist das doch nicht zu verstehen?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: Thoffi1978 am 26 März 2025, 09:27:01attr Zaehlerstand extractAllJSON 1Das kann ich "lesen" und alles ist gut.

Das funktioniert hier aber nur "zufällig", weil Dein Input-String "zufällig" reines JSON ist.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thoffi1978

Alles klar. Nun verstehe ich das schon besser.
Danke

betateilchen

Um noch mehr zu verstehen, empfiehlt sich eine Google Suche nach "regex für dummies", da kommen jede Menge gute Einführungen und Erklärungen zum Thema regular expressions.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!