solectrus / hosting

Step-by-stypes guides for installing and hosting Solectrus
9 stars 4 forks source link

Error getting data from SENEC #19

Closed Tosken1337 closed 1 year ago

Tosken1337 commented 1 year ago

Hallo,

ich habe dein Projekt mit der wirklich sehr guten Anleitung auf meinem Laptop aufgesetzt. Docker hat alle Services hochgefahren, lediglich das fetchen der Daten vom meinem Senec Home V3 Hybrid Duo scheint nicht zu funktionieren. Das Web-Interface des Senec ist unter 192.168.178.66 verfügbar. Das fetchen der Daten scheint aber nicht zu funktionieren. In der Console des Docker Service kommt: "Error getting Data from SENEC at 192.168.178.66: 404 Not Found" Wenn ich mich auf ein Terminal im laufenden Container connecte kann ich die IP pingen.

Muss die Schnittstelle zum Abholen der Daten auf dem Senec Home V3 erst aktiviert werden? Ich habe gelese, dass diese unter http:///lala.cgi verfügbar sein sollte. Ein Post liefert vom Laptop etwas zurück.

Vielen Dank Sebastian

ledermann commented 1 year ago

Ein SENEC.Home V3 liefert die Messwerte ohne jede vorherige Aktivierung über http://<senec-ip>/lala.cgi. Zumindest ist dies bei meinem Gerät so und ich habe noch nichts Gegenteiliges gehört. Genau diese Schnittstelle nutzt auch der SENEC-Collector von SOLECTRUS.

Entscheidend ist, dass das Netzwerkgerät, auf dem der SENEC-Collector läuft, Zugriff auf den SENEC-Speicher hat. Üblicherweise ist das nur der Fall, wenn man sich im gleichen Netzwerk befindet. Vielleicht ist das bei Dir nicht der Fall. Möglicherweise bist Du mit dem Laptop im WLAN, der SENEC hängt aber in einem Subnetz des LAN. Viele andere Gründe sind denkbar. Du müsstest also Deine Netzwerkkonfiguration prüfen. Ein guter Test ist, ob http://<senec-ip> im Browser des Laptops funktioniert.

Ansonsten noch ein allgemeiner Hinweis: der SENEC-Collector muss nonstop rund um die Uhr laufen, damit SOLECTRUS vollständige Daten erhält. Statt eines Laptops empfiehlt dafür eher ein Server, wobei das auch ein Raspi oder NAS sein kann.

Tosken1337 commented 1 year ago

Danke für deine schnelle Antwort. Ich plane das ganze auch auf einem Rasberry zu installieren. Dies sollte nur ein erster Test sein. Das Web-Interface des Senec ist vom laptop erreichbar. Auch vom service innerhalb des docker containers ist die IP pingbar. Ich hatte gerade auch meinen Post oben noch angepasst.

/senec-collector # ping 192.168.178.66 PING 192.168.178.66 (192.168.178.66): 56 data bytes 64 bytes from 192.168.178.66: seq=0 ttl=36 time=7.771 ms 64 bytes from 192.168.178.66: seq=1 ttl=36 time=6.321 ms 64 bytes from 192.168.178.66: seq=2 ttl=36 time=14.599 ms

Fehler: Getting state names from SENEC by parsing source code... 2023-03-16 14:42:04 Error getting data from SENEC at 192.168.178.66: 404 Not Found

ledermann commented 1 year ago

Hm, kannst Du bitte ein vollständiges Log des SENEC_Collector-Containers posten, vom Start bis zur ersten Fehlermeldung? Außerdem die .env-Datei und die genaue Typenbezeichnung des SENEC aus der Weboberfläche (Tab "Information").

Im Idealfall sieht das Log so aus:

SENEC collector for SOLECTRUS, Version develop, built at 2023-03-14T01:01:26.233Z
https://github.com/solectrus/senec-collector
Copyright (c) 2020,2023 Georg Ledermann, released under the MIT License

Using Ruby 3.2.1 on platform aarch64-linux-musl
Pulling from SENEC at 192.168.178.29 every 5 seconds
Pushing to InfluxDB at http://influxdb:8086, bucket SENEC

Getting state names from SENEC by parsing source code...
OK, got 99 state names

Got record #1 from SENEC at 192.168.178.29: ENTLADEN, Inverter 4800 W, House 0 W, 2023-03-16 13:47:46 +0000
Successfully pushed record to InfluxDB

Got record #2 from SENEC at 192.168.178.29: NETZ + ENTLADEN, Inverter 5034 W, House 0 W, 2023-03-16 13:47:51 +0000
Successfully pushed record to InfluxDB

Getestet mit SENEC.Home V3 hybrid duo

ledermann commented 1 year ago

Bitte noch etwas testen: Funktioniert im Browser der Abruf von http://senec-ip/js/DE-de.js ? Es müsste eine lange JavaScript-Datei erscheinen.

Tosken1337 commented 1 year ago

Von meinem Laptop aus ist ein post auf die lala.cgi mit Postman möglich. Hier werden werte zurück geliefert Log:

2023-03-16 13:59:50 SENEC collector for SOLECTRUS, Version 0.6.0, built at 2023-02-05T11:44:03.299Z
2023-03-16 13:59:50 https://github.com/solectrus/senec-collector
2023-03-16 13:59:50 Copyright (c) 2020,2023 Georg Ledermann, released under the MIT License
2023-03-16 13:59:50 
2023-03-16 13:59:50 Using Ruby 3.2.0 on platform x86_64-linux-musl
2023-03-16 13:59:50 Pulling from SENEC at 192.168.178.66 every 5 seconds
2023-03-16 13:59:50 Pushing to InfluxDB at http://influxdb:8086, bucket my-solectrus-bucket
2023-03-16 13:59:50 
2023-03-16 13:59:50 Getting state names from SENEC by parsing source code...
2023-03-16 13:59:50 Error getting data from SENEC at 192.168.178.66: 404 Not Found

Bezeichnung: SENEC.Home V3 hybrid duo

env Datei:

# Domain name or IP address of your host
APP_HOST=192.168.178.43
#
# SSL redirect: Use "true" (which is the default) if you want to auto-redirect to https
FORCE_SSL=false
#
# Secret token to secure cookies, 128 chars long hexadecimal encoded string (don't use this example, make some random changes!)
# Currently there are no cookies in Soletrus, but this may change in the future
SECRET_KEY_BASE=f60debe97dcb73280a2cc83668fd60e8d0e8e48269036a7bce980ee53cfb312e377989a750b8c945a5f69b041289ecb4e2d9e40641b81257c65ac2d43e3c837f
#
# Date of commissioning of your photovoltaic system
INSTALLATION_DATE=2023-03-14
#
# Price you pay for 1kWH (in EUR)
# Can be changed later in the UI when logged in as administrator
ELECTRICITY_PRICE=0.31
#
# Price you get for 1kWH (in EUR)
# Can be changed later in the UI when logged in as administrator
FEED_IN_TARIFF=0.0848
#
# Password for the PostgreSQL database, used by the app to comunicate internally with the database
POSTGRES_PASSWORD=xxx
#
# Password to login as administrator, required to manage settings like historical prices
ADMIN_PASSWORD=xxx

##################################################################
# Influx database settings
#
# Influx host (to access from SOLECTRUS dashboard and collectors)
INFLUX_HOST=influxdb
INFLUX_SCHEMA=http
INFLUX_PORT=8086
#
# Credentials for the Influx database
INFLUX_ORG=solectrus
INFLUX_USERNAME=admin
INFLUX_PASSWORD=ExAmPl3PA55W0rD
INFLUX_ADMIN_TOKEN=my-super-secret-admin-token
INFLUX_BUCKET=my-solectrus-bucket
#
# To keep things simple, we use ONE token (INFLUX_ADMIN_TOKEN) for both writing and reading.
# For better security, you can use two separate tokens, created via the InfluxDB frontend.
INFLUX_TOKEN_WRITE=my-super-secret-admin-token
INFLUX_TOKEN_READ=my-super-secret-admin-token
#
# Volume path for storing the Influx data
INFLUX_VOLUME_PATH=./influxdb

##################################################################
# REDIS settings
#
REDIS_VOLUME_PATH=./redis

##################################################################
# PostgreSQL database settings
#
DB_VOLUME_PATH=./postgresql

##################################################################
# SENEC Collector
#
# Change this to your own SENEC IP address!
SENEC_HOST=192.168.178.66
SENEC_INTERVAL=5
ledermann commented 1 year ago

hm, sieht alles korrekt aus. Jetzt kann es eigentlich nur noch am Abruf von http://senec-ip/js/DE-de.js liegen. Da werden die deutschen Status-Codes entnommen. Was liefert der Browser da? Müsste eine große JavaScript-Datei sein.

Tosken1337 commented 1 year ago

Ja vom Browser des Laptops kommt eine JS Datei zurück

/** Prevent JSHint warning about functions called from HTML sites. */
/* exported casc_enum, lng, tooltip system_state_name, tooltip, system_state_name,
system_type_name, batt_type_name, pwr_unit_type_name, pwr_unit_status_enum, enfluri_name,
OnOff_lang, NoneAvailable_lang, feature_state, condition_state, battery_state,
BatteryPhase, TimeZoneArray, CEI_Status, SysUpdateState, bms_status_enum,
CountryCodeArray, Country_enum, BMZ_WizardState,
wallbox_state_name, inverterNames, bmz_status_enum, Samsung_Wizard, CEI_gui, CEI_selftestResults, 
CEI_selftestSteps, BmzCellType, active_lang */

var lng = {
    "TODAY": "HEUTE",
    "YESTERDAY": "GESTERN",
    "WEEK": "WOCHE",
    "MONTH": "MONAT",
    "YEAR": "JAHR",
    "OVERALL": "GESAMT",
    "LAST24": "LETZTE 24H",
Tosken1337 commented 1 year ago

Ein curl vom collector liefert 404

/senec-collector # curl -i http://192.168.178.66
HTTP/1.0 404 Not Found

Ping funktioniert aber. Hast du eine Erklärung dafür?

ledermann commented 1 year ago

Sehr seltsam. Was passiert denn, wenn Du das gleiche curl statement direkt auf dem Host ausführst?

Kann es sein, dass sich unter der IP-Adresse im Docker-Container gar nicht der SENEC meldet, sondern irgendein anderes Gerät?

Tosken1337 commented 1 year ago

Curl vom Laptop funktioniert. Das ist wirklich komisch, wie kann die IP im Container auf einen anderen Host zeigen. Ein curl auf das Webinterface meiner Fritzbox liefert im Container komischerweise einen 500er.

ledermann commented 1 year ago

Was ich außerdem nicht verstehe: Wieso funktioniert überhaupt curl im Container? Der SENEC-Collector basiert auf einem Alpine-Linux, da ist überhaupt kein curl enthalten.

Bei mir:

$ docker exec -it solectrus-senec-collector-1 ash
/senec-collector # ping google.com
PING google.com (142.250.186.142): 56 data bytes
64 bytes from 142.250.186.142: seq=0 ttl=54 time=15.476 ms
^C
--- google.com ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 15.476/15.476/15.476 ms
/senec-collector # curl -i http://google.com
ash: curl: not found
Tosken1337 commented 1 year ago

Ich habe curl über apk nachinstalliert

ledermann commented 1 year ago

Ok, lassen wir mal meinen Collector beiseite. Folgendes Statement (auf dem Docker-Host gestartet) sollte grundsätzlich funktionieren, bei mir klappt es auch (ich verwende meine SENEC-IP-Adresse):

$ docker run alpine:latest ash -c "apk add curl && curl -IsX GET http://192.168.178.29/js/DE-de.js"                                                                                                                                                                                                                                                                    fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/main/aarch64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/community/aarch64/APKINDEX.tar.gz
(1/5) Installing ca-certificates (20220614-r4)
(2/5) Installing brotli-libs (1.0.9-r9)
(3/5) Installing nghttp2-libs (1.51.0-r0)
(4/5) Installing libcurl (7.88.1-r0)
(5/5) Installing curl (7.88.1-r0)
Executing busybox-1.35.0-r29.trigger
Executing ca-certificates-20220614-r4.trigger
OK: 10 MiB in 20 packages
HTTP/1.0 200 OK
Content-Type: application/javascript; charset=utf-8
Content-Length: 53626

Es wird ein plain Alpine-Container gestartet, darin curl installiert und dann ein GET-Request auf den SENEC-Speicher gemacht, der mit 200 OK enden sollte. Wenn das bei Dir nicht klappt, müsste die Docker- oder Netzwerk-Konfiguration geprüft werden.

Tosken1337 commented 1 year ago

Okay es sieht also wirklich so aus, dass mit dem docker netzwerk etwas nicht stimmt.

PS D:\development\docker\solectrus> docker run alpine:latest ash -c "apk add curl && curl -IsX GET http://192.168.178.66/js/DE-de.js"
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
63b65145d645: Already exists
Digest: sha256:ff6bdca1701f3a8a67e328815ff2346b0e4067d32ec36b7992c1fdc001dc8517
Status: Downloaded newer image for alpine:latest
fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/community/x86_64/APKINDEX.tar.gz
(1/5) Installing ca-certificates (20220614-r4)
(2/5) Installing brotli-libs (1.0.9-r9)
(3/5) Installing nghttp2-libs (1.51.0-r0)
(4/5) Installing libcurl (7.88.1-r0)
(5/5) Installing curl (7.88.1-r0)
Executing busybox-1.35.0-r29.trigger
Executing ca-certificates-20220614-r4.trigger
OK: 9 MiB in 20 packages
HTTP/1.0 404 Not Found

Hast du zufällig eine Idee was das sein kann?

ledermann commented 1 year ago

Per default verwendet Docker das Netzwerk bridge. Vielleicht hast Du irgendwas umkonfiguriert? Ich könnte mir vorstellen, dass die Verwendung des Netzwerkes host funktioniert, also beispielsweise so:

docker run --network host alpine:latest ash -c "apk add curl && curl -IsX GET http://192.168.178.66/js/DE-de.js"
Tosken1337 commented 1 year ago

Funktioniert leider auch nicht. Ich verwende Docker auf Windows 11 mit WSL.

Vielen Dank bis hier hin für deine Hilfe.

ledermann commented 1 year ago

Ok, da es sich hier scheinbar eher um Probleme Deiner lokalen Docker-Installation handelt, die nicht in SOLECTRUS begründet sind, schließe ich das Issue.

Falls Du noch etwas herausfinden solltest, wäre ich sehr daran interessiert.