solectrus / hosting

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

Ergänzung von bestehender Installation um Tibber- und Shelly-Collector #53

Closed deThommy closed 2 months ago

deThommy commented 3 months ago

Hi alle, Hi Georg,

Ich bekomme in 2 Wochen meine Wärmepumpe und würde die natürlich gerne direkt per Shelly 3 EM integrieren (einen besseren Zeitpunkt für das Update hättest du dir nicht überlegen können @ledermann 😍),

Hier läuft Solectrus auf einer Synology NAS und ich mache eigentlich das meiste über das GUI. Da hab ich mehr Sicherheit :) Wie muss ich jetzt vorgehen, um in meine laufende Installation die beiden Tibber- und Shelly-Collectoren einzubauen, das ist mir leider aktuell noch nicht klar.

Muss ich meine bestehende .env um die neuen Einträge ergänzen oder lege ich im Ordner /docker/solectrus noch die Ordner für die neuen Collectoren an und darin jeweils die entsprechende .env pro Collector?

Irgendwie tappe ich da noch im Dunkeln. Ich denke, dass hier der neue Configurator nichts bringt, da ich das ja in meine bestehende Instanz einbauen möchte… habe den gerade einmal durch geklickt, konnte aber keine Lösung für meine Frage ableiten. Finde den übrigens mega. Das hätte mir damals einiges erleichtert 🥲

Danke schon mal für eure Hilfe!

ledermann commented 3 months ago

Für die Integration der Wärmepumpe in eine bestehende SOLECTRUS-Installation habe ich im Wiki eine Anleitung abgelegt.

Dort wird auch erklärt, wie du den Shelly-Collector ergänzt (letztendlich muss nur .env und docker-compose.yml jeweils um ein paar Zeilen ergänzt werden). Keine neuen Ordner, keine neue .env.

Der Tibber-Collector hat übrigens nichts mit der Wärmepumpe zu tun, der wird derzeitig nur für den SENEC-Charger benutzt.

deThommy commented 3 months ago

Danke für die schnelle Rückmeldung, Georg.

Ich hoffe, dass das jetzt so passt. Habe alles entsprechend vorbereitet, sodass ich nur noch die IP vom Shelly eingeben muss, wenn das Ding installiert ist (habe provisorisch die IP eines Shelly Plugs genommen). Da laufen so wenige Watt drüber, dass ich das so direkt gar nicht sehen kann. Fehler im Log finde ich allerdings auch nicht.

Danke auch für den Hinweis bzgl. Tibber-Collector. Ich dachte, dass ich das auch für die Berechnung der Stromkosten verwenden kann — habe anscheinend nicht genau genug gelesen :) … dann trage ich weiterhin monatlich den Durchschnittspreis ein. Das ist mir dann genau genug :)

ledermann commented 3 months ago

Kurze Ergänzung noch:

1) Wenn der probeweise eingerichtete Shelly funktioniert, solltest du das in SOLECTRUS sehen, auch wenn es nur wenige Watt sind. Meine Wärmepumpe (gemessen über Shelly Pro 3EM) macht derzeitig auch fast nix, die etwa 18 Watt Grundlast kann man aber im Diagramm sehen: https://demo.solectrus.de/heatpump_power/now Auf jeden Fall muss aber das Dropdown über dem Diagramm den entsprechenden Menüpunkt anzeigen, sonst stimmt deine Sensor-Konfiguration nicht.

2) Tibber: Ja, das Verwenden der Tibber-Preise für die Stromkosten wäre super, ist aber recht aufwändig in der Realisierung. Es gibt ein Issue hierzu: https://github.com/solectrus/solectrus/issues/2150

deThommy commented 3 months ago

Danke für die Ergänzung. Hatte bisher nur die Dateien entsprechend des Wiki-Eintrags angepasst und den Container übers UI neu gestartet, dabei wurde aber natürlich nicht die docker-compose.yml neu eingelesen und somit der Shelly-colector nicht geladen.

Das ging dann über ssh aber alles problemlos, sodass ich tatsächlich auch jetzt erst den Menüpunkt “Wärmepumpe” sehe. Damit steht meinem Heizungsbauer ja nichts mehr im Wege :)

Über das genannte Issue bin ich auch schon mal gestolpert, hatte ich gar nicht mehr auf dem Schirm.

image
deThommy commented 2 months ago

Hallo Georg, ich bin gerade leider etwas hilf- und planlos. Hier ist nun soweit alles installiert (Wärmepumpe und entsprechender Shelly 3 EM PRO). Die Werte werden jedoch leider nicht in SOLECTRUS angezeigt.

Vorweg: den Eintrag "Wärmepumpe" sehe ich, wie im Bild im Post zu vor zu sehen ist nach wie vor. Wenn ich auf den Shelly gehe, sehe ich dort auch die Messwerte - das tuts also auch. Also nehme ich an, dass ich einen Fehler in der Config habe. Wobei ich das auch mit ChatGPT versucht habe zu analysieren. Der meint, es ist alles konsistent und es wird auch die korrekten Topic verwiesen - wer weiß ob das stimmt?

Ich habe mir auch versucht über den neuen Configurator mit meinen Daten eine neue Beispiel Config zu erstellen, an der ich mich entlang hangeln kann, aber da gibt es im Vergleich zur alten Config schon einige Änderungen, sodass ich das nur bedingt nachvollziehen kann.

Kann es etwas damit zu tun haben, dass ich die restlichen Daten per MQTT von EVCC beziehe?

Hier mal meine docker-compose.yml und .env (hoffentlich auf Anhieb korrekt formatiert P.S Ich gebe auf und hoffe, dass du es vorerst so lesen kannst...:( ).

P.p.s. aktuell sieht es so aus:

image

Danke für deine Hilfe!

compose.yml

version: '3.7'

services:
  app:
    image: ghcr.io/solectrus/solectrus:latest
    labels:
      - 'com.centurylinklabs.watchtower.scope=solectrus'
    depends_on:
      db:
        condition: service_healthy
      influxdb:
        condition: service_healthy
      redis:
        condition: service_healthy
    links:
      - db
      - influxdb
      - redis
    ports:
      - 3000:3000
    environment:
      - APP_HOST
      - FORCE_SSL
      - SECRET_KEY_BASE
      - INSTALLATION_DATE
      - ADMIN_PASSWORD
      - FRAME_ANCESTORS=192.168.178.10:8123
      - DB_HOST=db
      - DB_PASSWORD=${POSTGRES_PASSWORD}
      - DB_USER=postgres
      - REDIS_URL=redis://redis:6379/1
      - INFLUX_HOST
      - INFLUX_TOKEN=${INFLUX_TOKEN_READ}
      - INFLUX_ORG
      - INFLUX_BUCKET
      - INFLUX_MEASUREMENT_PV
      - INFLUX_MEASUREMENT_FORECAST
      - INFLUX_POLL_INTERVAL
      - WEB_CONCURRENCY
      - INFLUX_SENSOR_HEATPUMP_POWER
      - INFLUX_EXCLUDE_FROM_HOUSE_POWER
    healthcheck:
      test: ['CMD-SHELL', 'nc -z 127.0.0.1 3000 || exit 1']
    restart: always
    logging:
      options:
        max-size: '10m'
        max-file: '3'

  influxdb:
    image: influxdb:2.7-alpine
    labels:
      - 'com.centurylinklabs.watchtower.scope=solectrus'
    volumes:
      - ${INFLUX_VOLUME_PATH}:/var/lib/influxdb2
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=${INFLUX_USERNAME}
      - DOCKER_INFLUXDB_INIT_PASSWORD=${INFLUX_PASSWORD}
      - DOCKER_INFLUXDB_INIT_ORG=${INFLUX_ORG}
      - DOCKER_INFLUXDB_INIT_BUCKET=${INFLUX_BUCKET}
      - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=${INFLUX_ADMIN_TOKEN}
    command: influxd run --bolt-path /var/lib/influxdb2/influxd.bolt --engine-path /var/lib/influxdb2/engine --store disk
    # Optional: Allow InfluxDB to be accessed from the outside.
    ports:
       - 8086:8086
    restart: always
    healthcheck:
      test: ['CMD', 'influx', 'ping']
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 30s
    logging:
      options:
        max-size: '10m'
        max-file: '3'

  db:
    # Don't change major version if you have an existing database!
    # If you have started with an older major version (like 15), you need to migrate your database.
    # This is not worth the effort, so don't do it.
    image: postgres:16-alpine
    labels:
      - 'com.centurylinklabs.watchtower.scope=solectrus'
    environment:
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    volumes:
      - ${DB_VOLUME_PATH}:/var/lib/postgresql/data
    restart: always
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U postgres']
      interval: 10s
      timeout: 20s
      retries: 5
      start_period: 60s
    logging:
      options:
        max-size: '10m'
        max-file: '3'

  redis:
    image: redis:7-alpine
    labels:
      - 'com.centurylinklabs.watchtower.scope=solectrus'
    volumes:
      - ${REDIS_VOLUME_PATH}:/data
    restart: always
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
      interval: 10s
      timeout: 20s
      retries: 5
      start_period: 60s
    logging:
      options:
        max-size: '10m'
        max-file: '3'

  mqtt-collector:
    image: ghcr.io/solectrus/mqtt-collector:latest
    labels:
      - 'com.centurylinklabs.watchtower.scope=solectrus'
    depends_on:
      influxdb:
        condition: service_healthy
    links:
      - influxdb
    environment:
      - INFLUX_HOST
      - INFLUX_SCHEMA
      - INFLUX_PORT
      - INFLUX_TOKEN=${INFLUX_TOKEN_WRITE}
      - INFLUX_ORG
      - INFLUX_BUCKET
      - INFLUX_MEASUREMENT=${INFLUX_MEASUREMENT_PV}
      - MQTT_HOST
      - MQTT_PORT
      - MQTT_SSL
      - MQTT_USERNAME
      - MQTT_PASSWORD
      - MQTT_TOPIC_HOUSE_POW
      - MQTT_TOPIC_GRID_POW
      - MQTT_TOPIC_BAT_CHARGE_CURRENT
      - MQTT_TOPIC_BAT_FUEL_CHARGE
      - MQTT_TOPIC_BAT_POWER
      - MQTT_TOPIC_BAT_VOLTAGE
      - MQTT_TOPIC_CASE_TEMP
      - MQTT_TOPIC_CURRENT_STATE
      - MQTT_TOPIC_MPP1_POWER
      - MQTT_TOPIC_MPP2_POWER
      - MQTT_TOPIC_MPP3_POWER
      - MQTT_TOPIC_INVERTER_POWER
      - MQTT_TOPIC_WALLBOX_CHARGE_POWER
      - MQTT_FLIP_BAT_POWER
    restart: always
    logging:
      options:
        max-size: '10m'
        max-file: '3'

  forecast-collector:
    image: ghcr.io/solectrus/forecast-collector:latest
    labels:
      - 'com.centurylinklabs.watchtower.scope=solectrus'
    depends_on:
      influxdb:
        condition: service_healthy
    links:
      - influxdb
    environment:
      - INFLUX_HOST
      - INFLUX_TOKEN=${INFLUX_TOKEN_WRITE}
      - INFLUX_ORG
      - INFLUX_BUCKET
      - INFLUX_MEASUREMENT=${INFLUX_MEASUREMENT_FORECAST}
      - FORECAST_LATITUDE
      - FORECAST_LONGITUDE
      - FORECAST_DECLINATION
      - FORECAST_AZIMUTH
      - FORECAST_KWP
      - FORECAST_CONFIGURATIONS
      - FORECAST_0_LATITUDE
      - FORECAST_0_LONGITUDE
      - FORECAST_0_DECLINATION
      - FORECAST_0_AZIMUTH
      - FORECAST_0_KWP
      - FORECAST_0_DAMPING_MORNING
      - FORECAST_0_DAMPING_EVENING
      - FORECAST_1_LATITUDE
      - FORECAST_1_LONGITUDE
      - FORECAST_1_DECLINATION
      - FORECAST_1_AZIMUTH
      - FORECAST_1_KWP
      - FORECAST_1_DAMPING_MORNING
      - FORECAST_1_DAMPING_EVENING
      - FORECAST_2_LATITUDE
      - FORECAST_2_LONGITUDE
      - FORECAST_2_DECLINATION
      - FORECAST_2_AZIMUTH
      - FORECAST_2_KWP
      - FORECAST_2_DAMPING_MORNING
      - FORECAST_2_DAMPING_EVENING
      - FORECAST_3_LATITUDE
      - FORECAST_3_LONGITUDE
      - FORECAST_3_DECLINATION
      - FORECAST_3_AZIMUTH
      - FORECAST_3_KWP
      - FORECAST_3_DAMPING_MORNING
      - FORECAST_3_DAMPING_EVENING
      - FORECAST_INTERVAL
      - FORECAST_SOLAR_APIKEY
    restart: always
    logging:
      options:
        max-size: '10m'
        max-file: '3'

  shelly-collector:
    image: ghcr.io/solectrus/shelly-collector:latest
    depends_on:
      influxdb:
        condition: service_healthy
    links:
      - influxdb
    environment:
      - INFLUX_SCHEMA
      - INFLUX_HOST
      - INFLUX_TOKEN=${INFLUX_TOKEN_WRITE}
      - INFLUX_ORG
      - INFLUX_BUCKET
      - INFLUX_PORT
      - INFLUX_MEASUREMENT=${INFLUX_MEASUREMENT_PV}
      - SHELLY_HOST
      - SHELLY_INTERVAL
    restart: unless-stopped
    logging:
      options:
        max-size: "10m"
        max-file: "3"
    labels:
      - 'com.centurylinklabs.watchtower.scope=solectrus'

  watchtower:
    image: containrrr/watchtower
    labels:
      - 'com.centurylinklabs.watchtower.scope=solectrus'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: --scope solectrus --cleanup
    restart: always
    logging:
      options:
        max-size: '10m'
        max-file: '3'

.env

## Dashboard application (the main part)

# Domain name or IP address of your host
APP_HOST=192.168.178.10

# SSL redirect: Use "true" if you want to auto-redirect to https, but ensure that you have a valid SSL certificate
# and a reverse proxy in front of the app!
# In all other cases, the option must be "false"!
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=XXXXXXXXX6c0e3f1a5bc028d74e9a6b3c870d92f5e1f6c82549e5d30a71f8b7d39eac57d80a693fcb29e8d3a5f70334e81b6d2f4e91755fb8e84dc69b4

# Date of commissioning of your photovoltaic system
INSTALLATION_DATE=2024-02-03

# Password for the PostgreSQL database, used by the app to comunicate internally with the database
# Caution: Do not change this after the first run, otherwise the app will no longer be able to connect to the database!
POSTGRES_PASSWORD=XXXXXX

# Password to login as administrator, required to manage settings like historical prices
ADMIN_PASSWORD=XXXXuVQo&fuKf

# Optional: Allow iframe embedding
FRAME_ANCESTORS=https://my-other-home-automation-software.com

# Start web server Puma in single mode (recommended to reduce memory usage)
WEB_CONCURRENCY=0

## 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, don't change after the first run!
INFLUX_ORG=solectrus
INFLUX_USERNAME=admin
INFLUX_PASSWORD=XXXXXXXgJx&K
INFLUX_ADMIN_TOKEN=XXXXXXXErnpK

# Set these names before first run, they can't be changed later!
INFLUX_BUCKET=klushygel-pv
INFLUX_MEASUREMENT_PV=klushygel-pv-messung
INFLUX_MEASUREMENT_FORECAST=Forecast

# 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=XXXXXXErnpK
INFLUX_TOKEN_READ=XXXXXXErnpK

# Volume path for storing the Influx data
INFLUX_VOLUME_PATH=/volume1/docker/solectrus/influxdb

# Interval in seconds for polling the InfluxDB
INFLUX_POLL_INTERVAL=5

INFLUX_SENSOR_HEATPUMP_POWER=klushygel-pv-messung:heatpump_power
INFLUX_EXCLUDE_FROM_HOUSE_POWER=HEATPUMP_POWER

## Redis settings

REDIS_VOLUME_PATH=/volume1/docker/solectrus/redis

## PostgreSQL database settings

DB_VOLUME_PATH=/volume1/docker/solectrus/postgresql

## MQTT Collector

# MQTT Broker credentials
MQTT_HOST=192.168.178.10
MQTT_PORT=1883
MQTT_SSL=false
MQTT_USERNAME=thomas
MQTT_PASSWORD=lXXXXX

# MQTT topics
# https://docs.evcc.io/docs/reference/api#mqtt-api
MQTT_TOPIC_HOUSE_POW=evcc/site/homePower
MQTT_TOPIC_GRID_POW=evcc/site/gridPower
MQTT_TOPIC_BAT_FUEL_CHARGE=evcc/site/batterySoc
MQTT_TOPIC_BAT_POWER=evcc/site/batteryPower
MQTT_TOPIC_INVERTER_POWER=evcc/site/pvPower
MQTT_TOPIC_WALLBOX_CHARGE_POWER=evcc/loadpoints/1/chargePower

# MQTT options
MQTT_FLIP_BAT_POWER=true

## Solar forecasting with https://forecast.solar
# API docs: https://doc.forecast.solar/doku.php?id=api:estimate

# Latitude of the plant location
FORECAST_LATITUDE=XXXXX
# Longitude of the plant location
FORECAST_LONGITUDE=XXXXX
# Plane declination: 0 (horizontal) - 90 (vertical)
FORECAST_DECLINATION=20
# Plane azimuth: -180 ... 180 (-180 = north, -90 = east, 0 = south, 90 = west, 180 = north)
FORECAST_AZIMUTH=274
# Installed modules power in kilowatt peak (kWp)
FORECAST_KWP=10.08
# Optional damping factors (http://doc.forecast.solar/damping)
FORECAST_DAMPING_MORNING=0.5
FORECAST_DAMPING_EVENING=0
# Optional configuration for multiple planes
# Number of planes
FORECAST_CONFIGURATIONS=2
# Starting from 0, add params different from the values defined above
FORECAST_0_AZIMUTH=-85
FORECAST_0_KWP=5.04
FORECAST_1_AZIMUTH=95
FORECAST_1_KWP=5.04
# Available params are:
# - FORECAST_x_LATITUDE
# - FORECAST_x_LONGITUDE
# - FORECAST_x_DECLINATION
# - FORECAST_x_AZIMUTH
# - FORECAST_x_KWP
# - FORECAST_x_DAMPING_MORNING
# - FORECAST_x_DAMPING_EVENING
# Update interval in seconds, 900s = 15 minutes, the public (and free) API allows a minimum of 900 seconds
# BEWARE: Each plane counts as one request, so if you have multiple planes, you need to multiply the interval!
FORECAST_INTERVAL=900
# Optional API key for registered users of forecast.solar (https://doc.forecast.solar/account_models)
# FORECAST_SOLAR_APIKEY=abc123

## Shelly Collector
SHELLY_HOST=192.168.178.98
SHELLY_INTERVAL=5
ledermann commented 2 months ago

Ok, da ist einiges durcheinander geraten, vor allem ist alte Konfiguration und neue Sensor-Konfiguration gleichermaßen vorhanden. Ich habe dir daher eine ganz neue Konfiguration mit dem Konfigurator erstellt und deine Parameter übertragen. Passwörter etc. musst du selber anpassen.

Der entscheidende Punkt ist: Die beiden Kollektoren (MQTT und Shelly) müssen weiterhin an die Stelle in der InfluxDB schreiben (Bucket/Measurement/Fields), wo bereits deine historischen Messwerte stehen. Außerdem muss das Dashboard auch an dieser Stelle lesen. Wenn das nicht der Fall ist, fehlen Werte im Dashboard. Es ist alles eine Frage der richtigen Konfiguration.

deThommy-neu.zip

Vorgehensweise: 1) docker-compose down 2) Backup der alten Konfiguration anfertigen (docker-compose.yml und .env) 3) Neue Konfiguration (aus obigem Zip) übernehmen, vervollständigen und idealerweise auch verstehen ;-) 4) docker-compose pull 5) docker-compose up -d

Hier noch ein paar nützliche Links zur Dokumentation:

deThommy commented 2 months ago

Jetzt funktioniert tatsächlich alles, wie es soll. Die Werte kommen alle an. Ich bin der Meinung, dass ich eigentlich die Anleitung für die Ergänzung bestehender Installationen genutzt und vor allem befolgt habe. Aber offenbar nicht wirklich.