Hallo zusammen,
habe nun endlich eine Möglichkeit gefunden, meinen Gaszähler smart zu machen: https://footprintzero.de/
Habe das Modul am Samstag bekommen und am Gaszähler angeschlossen. In meinem Netz ist es aufrufbar.
Footlose index.jpg
Footlose json.jpg
Versuche nun seit Samstag, dass Ding im Fhem anzulegen, sowohl mit HttpMod als auch mit JsonMod bekomme ich keine Readings angelegt.
Hier die angelegten Geräte:
defmod Gaszaehler HTTPMOD http://192.168.0.124 300
attr Gaszaehler reading01Name Zaehlerstand
attr Gaszaehler reading01Regex Zä;hlerstand</div><br /><br/>([0-9]+) m<sup>3</sup></td></tr></table>
attr Gaszaehler reading02Name VerbrauchHeute
attr Gaszaehler reading02Regex heute.[0-9]+,[0-9]+ kWh.>([0-9]+,[0-9]+).gestern
defmod GaszaehlerJson JsonMod http://192.168.0.124/json
attr GaszaehlerJson interval */15 * * * *
attr GaszaehlerJson readingList complete()
Hier der Logeintrag zu JsonMod:
2023.11.27 08:08:35 4: WEB_192.168.0.20_53824 GET /fhem?cmd=%7BReadingsVal(%22GaszaehlerJson%22%2C%22reread%22%2C%22%22)%7D&XHR=1&fwcsrf=csrf_28971078847475; BUFLEN:0
2023.11.27 08:08:35 5: Cmd: >{ReadingsVal("GaszaehlerJson","reread","")}<
2023.11.27 08:08:35 4: WEB: /fhem?cmd=%7BReadingsVal(%22GaszaehlerJson%22%2C%22reread%22%2C%22%22)%7D&XHR=1&fwcsrf=csrf_28971078847475 / RL:21 / text/plain; charset=UTF-8 / Content-Encoding: gzip
Hier der Logeintrag zu HttpMod:
2023.11.27 08:01:59 5: Cmd: >set Gaszaehler reread<
2023.11.27 08:01:59 5: Gaszaehler: set called with reread
2023.11.27 08:01:59 4: Gaszaehler: GetUpdate called (reread)
2023.11.27 08:01:59 5: Gaszaehler: AddToQueue adds type update to URL http://192.168.0.124, no data, no headers, retry 0, initial queue len: 0
2023.11.27 08:01:59 5: Gaszaehler: HandleSendQueue called from AddToSendQueue, qlen = 1
2023.11.27 08:01:59 4: Gaszaehler: HandleSendQueue sends update with timeout 2 to http://192.168.0.124, No Data, No Header
2023.11.27 08:01:59 5: Gaszaehler: ReadCallback called from HttpUtils_NonblockingGet
2023.11.27 08:01:59 5: Gaszaehler: Read callback Error LogLvl set to 3, regex
2023.11.27 08:01:59 3: Gaszaehler: Read callback: Error: http://192.168.0.124: malformed or unsupported URL
2023.11.27 08:01:59 4: Gaszaehler: Read callback: request type was update retry 0, no headers, no body
2023.11.27 08:01:59 5: Gaszaehler: Read callback: body empty
2023.11.27 08:01:59 4: Gaszaehler: BodyDecode is not decoding the response body (charset not found, bodyDecode defaults to none)
2023.11.27 08:01:59 5: Gaszaehler: GetCookies is looking for Cookies
2023.11.27 08:01:59 5: Gaszaehler: ExtractSid called, context reading, num unknown
2023.11.27 08:01:59 4: Gaszaehler: no header to look for redirects
2023.11.27 08:01:59 5: Gaszaehler: Read callback sets LAST_REQUEST to update
2023.11.27 08:01:59 5: Gaszaehler: CheckAuth decided no authentication required
2023.11.27 08:01:59 5: GET /fhem?detail=Gaszaehler&fw_id= HTTP/1.1
Host: 192.168.0.110:8083
Nach meiner Recherche im Forum oder auch im Wiki müsste da doch was geliefert werden, oder?
Wo ist mein Denkfehler?
Gruß
Marco
Die Screenshots kann ich nicht öffnen, aber eher geht es um grundsätzliche Fragen:
1. welche API liefert der server? Irgendwie finde ich nichts auf footprintzero, es soll csv Dateien geben, aber die API auch auf MQTT erweitert werden?
2. was ist denn die Ausgabe von
http://192.168.0.124/json
?
3. Diesen Blogpost (https://www.juergenstechnikwelt.de/smarthome-2/smarter-gaszaehler-in-finaler-version-in-fhem-eingebunden/) hast du gelesen?
Hallo,
zu 1: folgendes habe ich gefunden: https://footprintzero.de/quickstart/#json
zu 2: die Ausgabe von http://192.168.0.124/json ist:
Content-Type: application/json
{"gesamt": 868370, "aktuell": 0, "heute": 0, "since_last_call": 51, "gestern": 51, "glmw": 0}
zu 3: Danach habe ich es ja angelegt. Nachdem das keine Ergebnisse lieferte, habe ich JsonMod probiert.
Gruß
Marco
2023.11.27 08:01:59 3: Gaszaehler: Read callback: Error: http://192.168.0.124: malformed or unsupported URL
2023.11.27 08:01:59 4: Gaszaehler: Read callback: request type was update retry 0, no headers, no body
2023.11.27 08:01:59 5: Gaszaehler: Read callback: body empty
Da stimmt was mit der URL nicht, die Du aufrufst.
Probier doch mal als einfachsten Ansatz folgendes:
define gas JsonMod http://192.168.0.124/json
attr gas readingList complete()
und danach ein "set gas reread".
Hallo betateilchen,
es werden auch damit keine Readings erstellt.
API_LAST_MSG
http://192.168.0.124/json: empty answer received
Gruß
Marco
Wenn dies die Rückmeldung ist...
Content-Type: application/json
{"gesamt": 868370, "aktuell": 0, "heute": 0, "since_last_call": 51, "gestern": 51, "glmw": 0}
...dann verschluckt sich JsonMod am
Content-Type: application/json
Ohne die erste Zeile liefert JsonMod ein sauberes Ergebnis mit complete(); zurück:
READINGS:
2023-11-27 08:47:21 .computedReadings gestern,gesamt,heute,since_last_call,aktuell,glmw
2023-11-27 08:47:21 aktuell 0
2023-11-27 08:47:21 gesamt 868370
2023-11-27 08:47:21 gestern 51
2023-11-27 08:47:21 glmw 0
2023-11-27 08:47:21 heute 0
2023-11-27 08:47:21 since_last_call 51
Entweder mit HTTPMOD auf das json zugreifen oder schauen, was der Webserver an HTML Code liefert.
Müsste ich dann nicht aber hiermit einen Wert bekommen:
defmod Gaszaehler2 HTTPMOD http://192.168.0.124/json 300
attr Gaszaehler2 get01JSON gesamt
Bevor du und andere im Dunkeln stochern, schau doch erstmal was HTTPMOD empfängt und setze showBody auf 1. Darüberhinaus musst du wesentlich mehr Infos liefern - verbose des Deivce auf 5 und Auszug aus dem log.
Eventuell kannst du es aber auch einfacher haben wenn du schon MQTT in FHEM nutzt => https://footprintzero.de/quickstart/#mqtt
MQTT habe ich leider nicht...
hier der Logauszug:
2023.11.27 09:17:45 4: Gaszaehler2: GetUpdate called (update)
2023.11.27 09:17:45 4: Gaszaehler2: UpdateTimer called from GetUpdate with cmd next sets timer to call update function in 300.0 sec at 09:22:45.248, interval 300
2023.11.27 09:17:45 4: Gaszaehler2: HandleSendQueue sends update with timeout 2 to http://192.168.0.124/json, No Data, No Header
2023.11.27 09:17:45 4: Gaszaehler2: Read callback: request type was update retry 0,
header: HTTP/1.0 200 OK, body length 127
2023.11.27 09:17:45 4: Gaszaehler2: BodyDecode is not decoding the response body (charset not found, bodyDecode defaults to none)
2023.11.27 09:17:45 4: Gaszaehler2: error while parsing JSON data: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "Content-Type: applic...") at lib/FHEM/HTTPMOD/Utils.pm line 694.
2023.11.27 09:17:45 3: Gaszaehler2: Content-Type was
2023.11.27 09:17:45 4: Gaszaehler2: checking for redirects, code=200, ignore=0
2023.11.27 09:17:45 4: Gaszaehler2: no redirects to handle
2023.11.27 09:17:45 4: Gaszaehler2: Read response to update didn't match any Reading
Leider sagt mir das nichts.
Hast du das Attribut showBody auf 1 gesetzt?
Was zeigt das Reading body?
ja, habe ich.
Zeigt den Inhalt der Seite 192.168.0.124/json
Content-Type: application/json
{"gesamt": 868392, "aktuell": 7, "heute": 22, "since_last_call": 1, "gestern": 51, "glmw": 0}
Bitte verwende code-Tags für die Formatierung von Daten. Danke.
Da behaupte ich mal, dass da einfach eine inhaltlich falsche Antwort kommt.
Der Content-Type gehört in den Header der response, nicht in den Body.
Deshalb funktionieren sowohl HTTPMOD als auch JsonMod nicht.
Also muss ich den Hersteller informieren, dass die json-Seite nicht korrekt ist?
Ich ging davon aus, dass du mit HTTPMOD nach dem Blogpost (https://www.juergenstechnikwelt.de/smarthome-2/smarter-gaszaehler-in-finaler-version-in-fhem-eingebunden/) direkt auf den Webserver gehst:
defmod Gaszaehler HTTPMOD http://192.168.0.124 300
attr Gaszaehler reading01Name Zaehlerstand
attr Gaszaehler reading01Regex Zä;hlerstand</div><br /><br/>([0-9]+) m<sup>3</sup></td></tr></table>
attr Gaszaehler reading02Name VerbrauchHeute
attr Gaszaehler reading02Regex heute.[0-9]+,[0-9]+ kWh.>([0-9]+,[0-9]+).gestern
Nutze erstmal diesen Vorschlag mit showBody.
Darüberhinaus würde ich MQTT versuchen, wenn es der Sensor anbietet.
da bleibt das Feld httpbody leer...
Was ist denn für MQTT zu tun? Ich dachte, dass die httpmod-Abfrage für mich als Laien einfacher ist. Verstehe halt nicht, warum es nicht, wie im Blog beschrieben, funktioniert?
Zitat von: marboj am 27 November 2023, 10:07:33da bleibt das Feld httpbody leer...
das ist schlecht
Zitat von: marboj am 27 November 2023, 10:07:33Ich dachte, dass die httpmod-Abfrage für mich als Laien einfacher ist. Verstehe halt nicht, warum es nicht, wie im Blog beschrieben, funktioniert?
Das wissen wir hier auch nicht, da wir deine Situation mit den gelieferten Informationen nicht nachstellen können. Eventuell gibt es noch den ein oder anderen Forist mit einem ähnlichem Setup, welcher Hilfestellung leisten könnte.
Anscheinend ist das gelieferte json für die FHEM Module nicht richtig formatiert. Und der 'normale' Webserver liefert auch nichts an FHEM. Entweder stimmt was mit dem Sensor nicht, deine Device Definition passt nicht zum Sensor oder FHEM ist mit dem derzeitigen Modulstand von JsonMod und HTTPMOD nicht geeignet.
Zitat von: marboj am 27 November 2023, 10:07:33Was ist denn für MQTT zu tun?
Ich würde damit anfangen, FHEM als MQTT2_SERVER aufzusetzen (Starte im Wiki (https://wiki.fhem.de/wiki/MQTT2_DEVICE)) und dann deinen Sensor an FHEM senden zu lassen (nach https://footprintzero.de/quickstart/#mqtt (https://footprintzero.de/quickstart/#mqtt) müsste dies funktionieren).
auf der Unterseite /json werden aber doch Werte dargestellt.
define Gaszaehler2 HTTPMOD http://192.168.0.124/json 300
attr Gaszaehler2 reading01Name gesamt
attr Gaszaehler2 showBody 1
# BUSY 0
# DEF http://192.168.0.124/json 300
# FUUID 65644acb-f33f-698a-3f88-73bbad1fc82d7d86
# Interval 300
# MainURL http://192.168.0.124/json
# ModuleVersion 4.1.16 - 4.4.2023
# NAME Gaszaehler2
# NOTIFYDEV global
# NR 561
# NTFY_ORDER 50-Gaszaehler2
# STATE ???
# TYPE HTTPMOD
# eventCount 1
# httpbody Content-Type: application/json
#{"gesamt": 868402, "aktuell": 1, "heute": 32, "since_last_call": 1, "gestern": 51, "glmw": 0}
#
# value
# HttpUtils:
# NAME
# addr http://192.168.0.124:80
# auth 0
# code 200
# compress 1
# conn
# data
# displayurl http://192.168.0.124/json
# header
# host 192.168.0.124
# httpheader HTTP/1.0 200 OK
# httpversion 1.0
# hu_blocking 0
# hu_filecount 1
# hu_port 80
# hu_portSfx
# ignoreredirects 1
# loglevel 4
# path /json
# protocol http
# redirects 0
# timeout 2
# url http://192.168.0.124/json
# sslargs:
# QUEUE:
# READINGS:
# REQUEST:
# context reading
# data
# header
# ignoreredirects 0
# num unknown
# retryCount 0
# type update
# url http://192.168.0.124/json
#
Kann ich die in FHEM nicht abfragen?
Ich würde einfach eine Funktion in die 99_myUtils schreiben, in der die URL abgefragt und aus dem Ergebnis die erste Zeile gelöscht wird. Den Rest übergibt man dann an json2reading() und schreibt die Werte einfach in einen dummy. Der Aufruf der Funktion kommt in ein at, das alle 5 Minuten läuft. Fertig.
Man muss nicht jeden Pups mit HTTPMOD machen.
define gasdummy dummy
define at_gasdummy at +*00:05:00 {gasjson()}
sub gasjson {
my $json = GetFileFromUrl("http://192.168.0.124/json")
$json =~ s/Content.*\n//;
json2reading("gasdummy",$json);
}
Respekt vor all Eurem Wissen, dass bekomme ich aber nicht hin. Versuche halt, die vorhandenen Module zu nutzen und frage, wenn etwas nicht funktioniert.
Schade, dass es, für mich, nicht einfach funktioniert. Ich schreibe auch mal den Verfasser des Blogs an.
Zitat von: betateilchen am 27 November 2023, 11:06:03Ich würde einfach eine Funktion in die 99_myUtils schreiben, in der die URL abgefragt und aus dem Ergebnis die erste Zeile gelöscht wird. Den Rest übergibt man dann an json2reading() und schreibt die Werte einfach in einen dummy. Der Aufruf der Funktion kommt in ein at, das alle 5 Minuten läuft. Fertig.
Ich wage zu bezweifeln, dass OP dazu in der Lage ist. Zeig Code und er wirds schaffen.
Zitat von: betateilchen am 27 November 2023, 11:06:03Man muss nicht jeden Pups mit HTTPMOD machen.
Spricht ein User, der mAn schon lange die laienhafte (erst-)Anwendersicht verloren hat.
B2T
Zitat von: marboj am 27 November 2023, 10:59:52Kann ich die in FHEM nicht abfragen?
Setze extractAllJSON auf 1, lösche alle anderen Attribute und lade neu. Wenn HTTPMOD dann nichts liefert, dann wird es so nicht funktionieren.
Dann bleibt dir nur noch MQTT, der Vorschlag von betateilchen oder eine andere Lösung.
Zitat von: marboj am 27 November 2023, 11:11:19Respekt vor all Eurem Wissen, dass bekomme ich aber nicht hin.
Was für ein Gejammer...
Zitat von: yersinia am 27 November 2023, 11:12:59Zeig Code und er wirds schaffen.
Der 3-zeilige Code und die Definition der beiden benötigten devices steht in meinem vorherigen Beitrag.
Zitat von: marboj am 27 November 2023, 11:11:19Schade, dass es, für mich, nicht einfach funktioniert.
Insgesamt ist das weniger zu tun als ein HTTPMOD device anzulegen und sich mit regexp rumschlagen zu müssen.
Zitat von: yersinia am 27 November 2023, 10:55:41Ich würde damit anfangen, FHEM als MQTT2_SERVER aufzusetzen (Starte im Wiki (https://wiki.fhem.de/wiki/MQTT2_DEVICE)) und dann deinen Sensor an FHEM senden zu lassen (nach https://footprintzero.de/quickstart/#mqtt (https://footprintzero.de/quickstart/#mqtt) müsste dies funktionieren).
Und Du glaubst allen Ernstes, dass das einfacher ist, als drei Zeilen Code in die 99_myUtils.pm zu kopieren?
Da frage ich mich gerade, wer hier den Blick für die Realität verloren hat. Ich nicht.
Zitat von: betateilchen am 27 November 2023, 11:27:33Und Du glaubst allen Ernstes, dass das einfacher ist, als drei Zeilen Code in die 99_myUtils.pm zu kopieren?
Glauben ist für alte Gebäude mit spitzem Dach. Und ja, ich denke drei Zeilen Code in der myUtils inklusive dummy und at ist für einen Anfänger, allein schon von der Entwicklung des Konzepts her, zu schwierig. Die Kopierfertigen Vorlagen diverser Module in unterschiedlicher Dokumentationsqualität sind gefühlt oft ein einfacherer Zugang. Auch wenn es nicht immer die Beste Lösung ist.
Zitat von: betateilchen am 27 November 2023, 11:27:33Da frage ich mich gerade, wer hier den Blick für die Realität verloren hat. Ich nicht.
Wann hast du mit FHEM angefangen und wie lange bist du als mMn erfahrener Entwickler dabei? <--rhetorische Frage; siehe Text davor sowie subjektive Meinung.
Habe nun die 3 Zeilen in 99_myUtils.pm eingefügt und die beiden Devices angelegt.
Das at macht auch alle 5 Minuten etwas, allerdings bleibt der Dummy leer.
Was kann das nun sein? json2reading ist im Standard installiert?
In meinem Code fehlte ein ; am Ende von GetFilFromUrl().
Du solltest aber auch ab und zu mal ins Logfile schauen, da müsste eine Fehlermeldung stehen.
Füge mal bitte die Debug Zeile wie unten bei Dir ein.
Mit {gajson} in der FHEM-Befehlszeile kannst Du die Ausführung manuell testen.
Dann ins Log schauen, ob da eine Debug Meldung steht.
sub gasjson {
my $json = GetFileFromUrl("http://192.168.0.124/json");
$json =~ s/Content.*\n//;
Debug $json;
json2reading("gasdummy",$json);
}
Habe das angepasst. Beim Reload des Moduls erscheint folgender Fehler:
syntax error at ./FHEM/99_myUtils.pm line 695, near ")
$json "
Global symbol "$json" requires explicit package name (did you forget to declare "my $json"?) at ./FHEM/99_myUtils.pm line 695.
Global symbol "$json" requires explicit package name (did you forget to declare "my $json"?) at ./FHEM/99_myUtils.pm line 696.
Darf man fragen wozu ein zusätzlicher dummy vorgeschlagen wird?
Warum nicht die Readings in das at schreiben lassen und der gasjson-Funktion $SELF übergeben ?
Dann hätte man auch keine statischen Angaben in der Sub.
Poste mal bitte den Teil, den Du jetzt in der 99_myUtils.pm stehen hast.
Zitat von: TomLee am 27 November 2023, 11:59:41Darf man fragen wozu ein zusätzlicher dummy vorgeschlagen wird?
Darfst Du, ich werde das aber nicht beantworten.
Kannst Du mal bitte aufhören, überall Verwirrung zu stiften? Danke.
sub gasjson {
my $json = GetFileFromUrl("http://192.168.0.124/json");
$json =~ s/Content.*\n//;
Debug $json;
json2reading("gasdummy",$json);
}
Wie editierst Du eigentlich die Datei?
Wenn man das über "Edit files" macht, wird sie nach dem Speichern automatisch neu geladen.
syntax error at ./FHEM/99_myUtils.pm line 695, near ")
$json "
Das ist aber genau die Stelle, an der der Strichpunkt (nach der Klammer) fehlte.
Wenn der jetzt da steht, sollte es keine Fehlermeldung mehr geben.
Bearbeite ich über den Editor im MC.
Fehler ist beim reload weg, beim manuellen Aufruf erscheint nun:
Undefined subroutine &main::GetFileFromUrl called at ./FHEM/99_myUtils.pm line 696.
ok, dann füge mal im Kopf Deiner 99_myUtils.pm die Zeile mit HttpUtils ein
use strict;
use warnings;
use HttpUtils;
Zitat von: marboj am 27 November 2023, 12:11:28Bearbeite ich über den Editor im MC.
Bearbeiten über FHEM ist immer besser, da wird beim Speichern direkt eine Syntaxprüfung vorgenommen.
Zitat von: yersinia am 27 November 2023, 11:12:59Ich wage zu bezweifeln, dass OP dazu in der Lage ist.
Ich nicht...
Zitat von: marboj am 27 November 2023, 11:54:24syntax error at ./FHEM/99_myUtils.pm line 695, near ")
$json "
wer 695 Zeilen in der 99_myUtils.pm hat, ist darin nicht zum ersten Mal unterwegs.
Leider ist der Fehler immer noch da.
BTW: Die 695 Zeilen sind nur per copy/paste eingefügt und sind im Wesentlichen für meine Buderus-Steuerung sowie Klima-Anlage...
Hab den Fehler gefunden: URL musste komplett groß geschrieben werden.
Jetzt sind die Readings da, vielen Dank...
Zitat von: marboj am 27 November 2023, 12:28:56Hab den Fehler gefunden: URL musste komplett groß geschrieben werden.
Ok, mein Fehler, sorry.
Den Funktionsaufruf konnte ich hier natürlich nicht testen, da ich keinen Server habe, der den Inhalt zurückliefern würde. Sonst wäre mir das auch hier aufgefallen :)