micw / tibber-pulse-reader

A tool to read data directly from tibber pulse and publish it locally
43 stars 7 forks source link

Docker Error #1

Closed gerdluthe closed 1 year ago

gerdluthe commented 1 year ago

/\ / ' () _ \ \ \ \ ( ( )__ | ' | '| | ' \/ _` | \ \ \ \ \/ _)| |)| | | | | || (| | ) ) ) ) ' |__| .|| ||| |\, | / / / / =========|_|==============|__/=//// ^[[32m :: Spring Boot :: ^[[39m ^[[2m (v2.5.14)^[[0;39m

^[[2m2023-03-12 08:32:14.716^[[0;39m ^[[32m INFO^[[0;39m ^[[35m1^[[0;39m ^[[2m---^[[0;39m ^[[2m[ main]^[[0;39m ^[[36mde.wyraz.tibberpulse.TibberPulseReader ^[[0;39m ^[[2m:^[[0;39m St$ ^[[2m2023-03-12 08:32:14.730^[[0;39m ^[[32m INFO^[[0;39m ^[[35m1^[[0;39m ^[[2m---^[[0;39m ^[[2m[ main]^[[0;39m ^[[36mde.wyraz.tibberpulse.TibberPulseReader ^[[0;39m ^[[2m:^[[0;39m No$ ^[[2m2023-03-12 08:32:17.129^[[0;39m ^[[33m WARN^[[0;39m ^[[35m1^[[0;39m ^[[2m---^[[0;39m ^[[2m[ main]^[[0;39m ^[[36ms.c.a.AnnotationConfigApplicationContext^[[0;39m ^[[2m:^[[0;39m Ex$ ^[[2m2023-03-12 08:32:17.149^[[0;39m ^[[32m INFO^[[0;39m ^[[35m1^[[0;39m ^[[2m---^[[0;39m ^[[2m[ main]^[[0;39m ^[[36mConditionEvaluationReportLoggingListener^[[0;39m ^[[2m:^[[0;39m

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. ^[[2m2023-03-12 08:32:17.217^[[0;39m ^[[31mERROR^[[0;39m ^[[35m1^[[0;39m ^[[2m---^[[0;39m ^[[2m[ main]^[[0;39m ^[[36mo.s.boot.SpringApplication ^[[0;39m ^[[2m:^[[0;39m Ap$

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'meterDataHandler': Unsatisfied dependency expressed through field 'publishers'; nested exception$ at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659) ~[spring-bean$ at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639) ~[spring-beans-5.3.20.ja$ at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) ~[spring-beans-5.3.20.jar!/:5.3.20] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.3.20.jar!/:5.3$ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) ~[spring-beans-5.3.20.jar!/:5.3.20] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) ~[spring-beans-5.3.20.jar!/:5.3.20] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.20.jar!/:5.3.20] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.20.jar!/:5.3.20] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.20.jar!/:5.3.20] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.20.jar!/:5.3.20] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.20.jar!/:5.3.20] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) ~[spring-beans-5.3.20.jar!/:5.3.20] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.20.jar!/:5.3.20] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.20.jar!/:5.3.20] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:780) ~[spring-boot-2.5.14.jar!/:2.5.14]

micw commented 1 year ago

What exact command did you run? It's most likely that a config property is missing (these are passed with -ePROPERTY=VALUE). Check the example config for available options.

Edit: I added som better error reporting. The root cause should now be printed at bottom of the log

gerdluthe commented 1 year ago

I tried multiple ones like docker run -it --rm -e "TIBBER_PULSE_SOURCE=http TIBBER_PULSE_HOST=192.168.1.18" ghcr.io/micw/tibber-pulse-reader:master

But no success; can't I use the. application.yaml for docker? It's very complicated to understand how to run the docker without beeing an programmer

micw commented 1 year ago

I know. I will add more documentation during the evening

gerdluthe commented 1 year ago

What would be nice too is using IP Adresse instead of URL for mqtt server and Tibber host And the possibility using no username and using no password for mqtt Server, cause normally it's hosted locally and I can't see any reasons for using passwords or usernames here

thx

micw commented 1 year ago

New build (and new README) is available. should now be clear about the config options. You can start without enabling MQTT publishing to test the access to the tibber.

"Host" can be both, hostname or IP address. I added this to the documentation.

Username/Password are optional now for both, http and mqtt.

Edit: seems that the default config is missing in the github build because I set a gitignore wrong. Going to fix it.

micw commented 1 year ago

It is fixed now. COnfig and error messages should now align with the README ;-)

Please try again and sorry for the inconveniences

micw commented 1 year ago

Please run it with -e LOG_LEVEL=debug. I'd appreciate if you can send me some samples of your data + the meter model of yours so that I can extend my testcases and documentation.

gerdluthe commented 1 year ago

Getting a little bit closer 2023-03-12 19:10:56.176 WARN 1 --- [ main] d.w.t.source.TibberPulseHttpReader : Invalid response from tibber pulse gateway endpoint: HTTP/1.1 404 Not Found

Starting via Shell with: docker run -it --rm -e "publish_mqtt_host=mqtt.local" -e "publish_mqtt_topic=grid/{nameOrObisCode}" -e "publish_mqtt_payload='{value}'" -e "TIBBER_PULSE_USERNAME=admin" -e "TIBBER_PULSE_PASSWORD=B0JH-B944" -e "TIBBER_PULSE_SOURCE=http" -e "TIBBER_PULSE_HOST=192.168.1.18" -e" TIBBER_PULSE_HTTP_CRON=/15 " -e "LOG_LEVEL=debug" ghcr.io/micw/tibber-pulse-reader:master

micw commented 1 year ago

Please log into your tibber, go to nodes and then on "data". Use your browser's developer tools to check what URL is read:

image

micw commented 1 year ago

BTW, publish_mqtt_topic etc. must be uppercase to have effect

gerdluthe commented 1 year ago

The node wasn't online. so checked the url as you described and started the docker again result: Meter 1EFR3347014xxxx 1-0:96.50.11 = null EMPTY 1-0:96.1.0255 = null EMPTY 1-0:1.8.0255 / energyImportTotal = null WATT_HOUR 1-0:2.8.0255 / energyExportTotal = null WATT_HOUR 1-0:0.2.00 = null EMPTY 1-0:96.90.21 = null EMPTY 1-0:97.97.00 = null EMPTY 1-0:96.50.14 = null EMPTY 1-0:96.50.4*4 = null EMPTY

micw commented 1 year ago

Yeah, I just need to add that subset of SML. Can you post a complete SML message from the logs?

gerdluthe commented 1 year ago

Parsing SML: 1b1b1b1b010101017605080e16b66200620072630101760107ffffffffffff0502af5ce80b0a014546522102cd630c7262016502af5ce5016333fe007605080e16b762006200726307017707ffffffffffff0b0a014546522102cd630c070100620affff7262016502af5ce579770701006032010101010101044546520177070100600100ff010101010b0a014546522102cd630c0177070100010800ff641c40047262016502af5ce5621e52ff65016d58b80177070100020800ff017262016502af5ce5621e52ff650286c57c017707010000020000010101010630332e30300177070100605a0201010101010342bd01770701006161000001010101030000017707010060320104010101010850312e322e31320177070100603204040101010103042201010163c14a007605080e16b862006200726302017101639568000000001b1b1b1b1a0309d3

micw commented 1 year ago

Thank you. May I commit this to github as part of my test suite?

gerdluthe commented 1 year ago

Ja, klar. gerne

micw commented 1 year ago

Oh and can you confirm that "1EFR3347014668" is pronted as serial on your meter? Than I know that my meter id decoder works for other meters than mine ;-)

micw commented 1 year ago

Gerne auch auf deutsch ;-)

gerdluthe commented 1 year ago

Die ZählerID ist1EFR3347014668, passt also ;-) Cool, top Arbeit !!! das hilft mir ungemein weiter wenn das funktioniert, dann kann ich den IR Lesekopf zurückbauen und alles mit dem Tibber Node auslesen

micw commented 1 year ago

Läuft:

Meter 1EFR3347014668
 1-0:1.8.0*255 / energyImportTotal = 2394335.2 WATT_HOUR
 1-0:2.8.0*255 / energyExportTotal = 4238681.2 WATT_HOUR

Die anderen OBIS-Codes waren nur Statuscodes (Firmware-Version, Hardware, etc.).

Allerdings sendet der Zähler ein eingeschränktes Telegramm. Schau mal auf https://www.sol.de/deutschland-und-welt/digitalisierung-mit-der-taschenlampe-wie-man-das-live-tracking-des-strombrauchs-in-gang-setzt,362468.html bzw. google mal für Deinen Zähler. Du kannst den mit der Taschenlampe (oder ggf. auch einem Taster wenn einer dran ist) "einstellen", dann sendet er die vollen Telegramme (alle 5 Sekunden glaube ich und mit Leistung pro Phase).

Wenn das geht, hast Du bei Tibber die Live-Anzeige in der App. Sende mir davon bitte auch mal ein Telegramm.

gerdluthe commented 1 year ago

Alles klar, den Zähler habe ich noch nicht eingestellt. Der Tibber Vertrag läuft leider erst ab Oktober, aber den Zähler werde ich morgen umstellen und dann kann ich dir ein die Live Anzeige in der Tibber App zur Verfügung stellen.

micw commented 1 year ago

Ich brauche nur die SML-Daten davon ;-)

micw commented 1 year ago

Sicher? Schaut genau so aus, wie das erste.

gerdluthe commented 1 year ago

Stimmt: hier mit Error

Parsing SML: 1b1b1b1b010101017605080e4fb36200620072630101760107ffffffffffff0502af6fe70b0a014546522102cd630c7262016502af6fe40163ca28007605080e4fb462006200726307017707ffffffffffff0b0a014546522102cd630c070100620affff7262016502af6fe4f106770701006032010101010101044546520177070100600100ff010101010b0a014546522102cd630c0177070100010800ff641c58047262016502af6fe4621e52ff65016d59500177070100020800ff017262016502af6fe4621e52ff650286c63b0177070100100700ff0101621b520052f70177070100200700ff0101622352ff6309310177070100340700ff0101622352ff63093a0177070100480700ff0101622352ff63093701770701001f0700ff0101622152fe62680177070100330700ff0101622152fe62b80177070100470700ff0101622152fe62740177070100510701ff01016208520052790177070100510702ff0101620852005300ee0177070100510704ff010162085200530108017707010051070fff010162085200530120017707010051071aff0101620852005300e301770701000e0700ff0101622c52ff6301f4017707010000020000010101010630332e30300177070100605a0201010101010342bd01770701006161000001010101030000017707010060320104010101010850312e322e313201770701006032040401010101030422010101635256007605080e4fb56200620072630201710163fa1200001b1b1b1b1a01fd46 2023-03-12 20:48:06.178 WARN 1 --- [ main] de.wyraz.tibberpulse.sml.SMLDecoder : Number format not implemented: org.openmuc.jsml.structures.Integer8 2023-03-12 20:48:06.178 WARN 1 --- [ main] de.wyraz.tibberpulse.sml.SMLDecoder : Number format not implemented: org.openmuc.jsml.structures.Unsigned16 2023-03-12 20:48:06.179 WARN 1 --- [ main] de.wyraz.tibberpulse.sml.SMLDecoder : Number format not implemented: org.openmuc.jsml.structures.Unsigned16 2023-03-12 20:48:06.180 WARN 1 --- [ main] de.wyraz.tibberpulse.sml.SMLDecoder : Number format not implemented: org.openmuc.jsml.structures.Unsigned16 2023-03-12 20:48:06.180 WARN 1 --- [ main] de.wyraz.tibberpulse.sml.SMLDecoder : Number format not implemented: org.openmuc.jsml.structures.Unsigned8 2023-03-12 20:48:06.181 WARN 1 --- [ main] de.wyraz.tibberpulse.sml.SMLDecoder : Number format not implemented: org.openmuc.jsml.structures.Unsigned8 2023-03-12 20:48:06.181 WARN 1 --- [ main] de.wyraz.tibberpulse.sml.SMLDecoder : Number format not implemented: org.openmuc.jsml.structures.Unsigned8 2023-03-12 20:48:06.181 WARN 1 --- [ main] de.wyraz.tibberpulse.sml.SMLDecoder : Number format not implemented: org.openmuc.jsml.structures.Integer8 2023-03-12 20:48:06.182 WARN 1 --- [ main] de.wyraz.tibberpulse.sml.SMLDecoder : Number format not implemented: org.openmuc.jsml.structures.Integer16 2023-03-12 20:48:06.182 WARN 1 --- [ main] de.wyraz.tibberpulse.sml.SMLDecoder : Number format not implemented: org.openmuc.jsml.structures.Integer16 2023-03-12 20:48:06.183 WARN 1 --- [ main] de.wyraz.tibberpulse.sml.SMLDecoder : Number format not implemented: org.openmuc.jsml.structures.Integer16 2023-03-12 20:48:06.183 WARN 1 --- [ main] de.wyraz.tibberpulse.sml.SMLDecoder : Number format not implemented: org.openmuc.jsml.structures.Integer16 2023-03-12 20:48:06.184 WARN 1 --- [ main] de.wyraz.tibberpulse.sml.SMLDecoder : Number format not implemented: org.openmuc.jsml.structures.Unsigned16 2023-03-12 20:48:06.184 DEBUG 1 --- [ main] d.w.tibberpulse.sink.MeterDataHandler : Publishing meter data:

micw commented 1 year ago

Sehr "gesprächiger" Zähler. Stimmt der Wert bei "power total"?

Meter 1EFR3347014668
 1-0:1.8.0*255 / energyImportTotal = 2394350.4 WATT_HOUR
 1-0:2.8.0*255 / energyExportTotal = 4238700.3 WATT_HOUR
 1-0:16.7.0*255 / powerTotal = -9 WATT
 1-0:32.7.0*255 / voltageL1 = 235.3 VOLT
 1-0:52.7.0*255 / voltageL2 = 236.2 VOLT
 1-0:72.7.0*255 / voltageL3 = 235.9 VOLT
 1-0:31.7.0*255 / currentL1 = 1.04 AMPERE
 1-0:51.7.0*255 / currentL2 = 1.84 AMPERE
 1-0:71.7.0*255 / currentL3 = 1.16 AMPERE
 1-0:81.7.1*255 / phaseAngleUL2toUL1 = 121 DEGREE
 1-0:81.7.2*255 / phaseAngleUL3toUL1 = 238 DEGREE
 1-0:81.7.4*255 / phaseAngleIL1toUL1 = 264 DEGREE
 1-0:81.7.15*255 / phaseAngleIL2toUL2 = 288 DEGREE
 1-0:81.7.26*255 / phaseAngleIL3toUL3 = 227 DEGREE
 1-0:14.7.0*255 / networkFrequency = 50.0 HERTZ
gerdluthe commented 1 year ago

Ja, die Werte stimmen, die Akkus liefern gerade Energie ;-) Gesamtbezug heute <500Wh vom VNB

gerdluthe commented 1 year ago

Schaut gut aus, Werte spuckt er jetzt aus, Publish via MQTT funktioniert auch.

gerdluthe commented 1 year ago

Nice wäre jetzt noch die Ausgabe der importierten/exportieren Energie in kWh anstatt Wh :-)

gerdluthe commented 1 year ago

Noch etwas ist mir aufgefallen: Die Daten werden als String an den MQTT Server übergeben, z.B. ExportEnergyTotal das führt bei der Weiterverarbeitung zu Problemen, da hier integer vorausgesetzt wird.

micw commented 1 year ago

Mit "als String" meinst Du die Anführungszeichen?

PUBLISH_MQTT_VALUE='{value}' in PUBLISH_MQTT_VALUE={value} (oder lass den Parameter ganz weg, das ist ja default).

Im YAML werden die Anführungszeichen weggeparsed, in der Environment-Variable sind sie Bestandteil des Parameters, drum landen die im MQTT

Umrechung Einheit -> ich mach mir mal Gedanken, wie das in die Architektur der Anwendung passt -> #2

gerdluthe commented 1 year ago

String = purer Text; -> also eine Funktion StrtoInt würde ich benötigen Integer wäre dann der Zahlenwert mit dem ich eine Datenbank füttern kann z.B.

Das mit dem PUBLISH Parameter werde ich probieren

gerdluthe commented 1 year ago

Änderung PUBLISH_MQTT_VALUE='{value}' in PUBLISH_MQTT_VALUE={value} war korrekt, ohne das ' Zeichen wird ein Integer übergeben, mein Fehler.

micw commented 1 year ago

Schau mal https://github.com/micw/tibber-pulse-reader/blob/master/README.md#filtering-readings an zum Einheiten umwandeln.

gerdluthe commented 1 year ago

Oh perfekt. Das probiere ich gleich einmal aus. Hab das Programm jetzt als Docker Dienst laufen und bisher läuft alles einwandfrei. Bekomme vernünftige Werte und vor allem kann ich die Daten im ioBroker verwerten.

gerdluthe commented 1 year ago

Hmm. Jetzt bekomme ich wieder den Fehler d.w.t.source.TibberPulseHttpReader : Invalid response from tibber pulse gateway endpoint: HTTP/1.1 401 Unauthorized Das Node ist verbunden und Daten werden auch übertragen den Filter habe ich wie folgt gesetzt:

-e "PUBLISH_FILTERS=energyExportTotal=kWh"

micw commented 1 year ago

Strange. Evtl. den username oder passwort parameter überschrieben?

gerdluthe commented 1 year ago

Nein, habe ich gerade auf dem Webserver der Bridge überprüft, das passt noch alles....

micw commented 1 year ago

Ich meinte beim Docker Command

gerdluthe commented 1 year ago

docker run -it --rm -e "PUBLISH_FILTERS=energyExportTotal=kWh" -e "PUBLISH_MQTT_HOST=192.168.1.238" -e "PUBLISH_MQTT_TOPIC=grid/{nameOrObisCode}" -e "PUBLISH_MQTT_PAYLOAD={value}" -e "TIBBEPULSE_USERNAME=$

Wollte es gerade hier reinkopieren....hatte mir nen ShellScript erstellt und sehe gerade das da etwas fehlt und da steht auch TIBBEPULSE...ohne "R"..
Das ist Strange. Checke das eben

micw commented 1 year ago

Mach das so im script:

docker run -it --rm \
  -e "PUBLISH_FILTERS=energyExportTotal=kWh" \
  -e "PUBLISH_MQTT_HOST=192.168.1.238" \
...

Du willst im Produktiv auch nicht mit -it --rm starten, sondern mit -d --restart unless-stopped --name tibber-pulse-reader. Oder besser noch mit docker-compose.

gerdluthe commented 1 year ago

Ja, das war ein Testscript, als Service läuft das mit --it --rm und der restart unless.. Option eh nicht. Der Filter spuckt im Moment aber noch energyExportTotal = 4247198.6 WATT_HOUR. aus

Im Script aktiviert via: -e "PUBLISH_FILTERS=energyExportTotal=kWh"

Sollte also eigentlich kWh sein

micw commented 1 year ago

mit docker pull das neueste image gezogen?

gerdluthe commented 1 year ago

Ja, gerade noch einmal gemacht: Image is up to date

micw commented 1 year ago

Ich teste morgen nochmal

micw commented 1 year ago

Tippfehler im Filter, sollte jetzt gehen

gerdluthe commented 1 year ago

Das sieht schon viel besser aus! Klasse, danke. Ich teste weiter

gerdluthe commented 1 year ago

Das Äquivalent zur importieren Energie sollte doch dann so aussehen oder ? -e "PUBLISH_FILTERS=energyImportTotal=kWh"

Da bekomme ich immer noch Wh angezeigt und nicht kWh

micw commented 1 year ago

Ja, aber ein Parameter darf nur 1x angegeben werden. Du kannst aber mehrere Filter übergeben:

-e "PUBLISH_FILTERS=energyImportTotal=kWh energyExportTotal=kWh"

gerdluthe commented 1 year ago

Oh mann... manchmal sind es die einfachen Dinge im Leben. Natürlich, das war's....sorry.

xemax343 commented 1 year ago

Hallo,

ich hänge mich hal hier dran, bekomme einen SML Parsing error 2023-03-18 17:27:21.115 DEBUG 1 --- [ main] de.wyraz.tibberpulse.sml.SMLDecoder : Parsing SML: 1b1b1b1b0101010176040000016200620072650000010176010107000005e370330b0a01484c59020005dc4b010163d7210076040000026200620072650000070177010b0a01484c59020005dc4b01017c77070100603201010101010104484c590177070100600100ff010101010b0a01484c59020005dc4b0177070100010800ff65000000046505e37033621e52ff6504c2bfcc0177070100020800ff65000000046505e37033621e52ff65002d3d840177070100100700ff0101621b520052000177070100200700ff0101622352ff63090301770701001f0700ff0101622152fe62000177070100510704ff010162085200620001770701000e0700ff0101622c52ff6301f30177070100000200000101010109322e30312e3030310177070100605a02010101010105303246340177070100600500ff01010101650000000401010163682f00760400000362006200726500000201710163e8230000001b1b1b1b1a021af2 2023-03-18 17:27:21.168 WARN 1 --- [ main] d.w.t.source.TibberPulseHttpReader : Unable to parse SML from response

micw commented 1 year ago

Der SML-Parser meint, die Message ist fehlerhaft und steigt beim 1. Feld (energyImportTotal) aus, ohne dass ein Wert decodiert werden konnte. Entweder sendet der Zähler fehlerhafte Nachrichten oder der SML-Parser ist fehlerhaft. Letzteres kann ich nicht ausschließen, der Parser ist vom "OpenMuc" Projekt des Fraunhofer. Aus dem Projekt hatte ich schonmal einen OMS-Parser in der Hand, der war von katastrophal schlechter Qualität ^^

Leider kann ich da nicht weiterhelfen, da mir die Zeit fehlt, einen eigenen SML-Parser zu schreiben.

PS: ich schließe das Mega-Ticket hier mal, bitte macht eigene Tickets pro Bug auf.