Unsere Heizungsanlage vom Typ Viessmann kann mittels passendem Zubehör eine Onlineverbindung zum Server von Viessmann aufbauen und die aktuellen Betriebsdaten übertragen.
Nach Registrierung im Portal von Viessmann unter der URL https://developer.viessmann-climatesolutions.com/start.html können Sie sich im Developer-Portal https://developer.viessmann-climatesolutions.com/ einloggen und dort einen Zugriff zum Abruf der Daten über die Viessmann-API einrichten.
Verwendete open source-Projekte
Zum Glück existieren für unser Vorhaben bereits OpenSource-Projekte, die auch als kostenlose Community-Version erhältlich sind. (Selbstverständlich wäre es schön, wenn die User der Community-Version auch eine kleine Unterstützung durch Spenden an die Projekte leisten würden.)
Das Projekt ioBroker stellt die notwendigen Resourcen zum Einsammeln der Daten zur Verfügung und das Grafana-Projekt stellt mit der selfhostet-OSS-Variante die kostenlosen Tools zur Anzeige der Grafiken zur Verfügung. Wobei auch im ioBroker-System mittel des VIS2-Plugins grafische Ansichten ohne Verwendung eines anderen Systems erzeugt werden können. Ich habe das Grafana-System gewählt, weil mir die Ergebnisse zusagten und praktisch ohne Einarbeitung gleich losgelegt werden kann. Zur Speicherung der angefallenen Messwerte habe ich mich für das Datenbanksystem InfluxDB entschieden – es ist speziell für den Anwendungsfall Speicherung von Zeitreihen gedacht..
Es gibt für die drei Projekte von den Herausgebern selbst gepflegte Images für Docker-Container und somit können wir auf dem Rasperry Pi das bereits eingerichtete Traefik-System einfach mittels der angebotenen Container-Images erweitern.
Ergänzung der Dockerumgebung
Als erstes melden wir uns mittels SSH am Rasperry Pi an und begeben uns in das Verzeichnis /srv/web/.
Dann halten wir die laufenden Container durch die Eingabe
docker compose downan. Nun müssen wir in der Datei /srv/web/docker-compose.yml den Bereich service erweitern und folgende Dienste hinzufügen:
- einen Webserver zur Anzeige der Daten
- einen Datenbankserver für die InfluxDB
- IOBroker zur Abfrage der Daten bei Viessmann
- Grafana zur Erzeugung der grafischen Auswertungen
sudo nano /srv/web/docker-compose.yml
#und im Bereich Service folgendes hinzufügen
viessmann-lang-dieter-de:
build:
dockerfile: dockerfile_php8
context: php
hostname: ${SERVICES_VIESSMANN_LANG_DIETER_DE_HOSTNAME}
container_name: ${SERVICES_VIESSMANN_LANG_DIETER_DE_CONTAINER_NAME}
restart: unless-stopped
depends_on:
traefik:
condition: service_healthy
networks:
crowdsec:
# Feste IPv4-Adresse für den Container in diesem Netzwerk
ipv4_address: ${SERVICES_VIESSMANN_LANG_DIETER_DE_NETWORKS_CROWDSEC_IPV4}
labels:
traefik.enable: "true"
traefik.docker.network: $NETWORKS_CROWDSEC_NAME
traefik.http.routers.viessmann-lang-dieter-de.entrypoints: websecure
traefik.http.routers.viessmann-lang-dieter-de.rule: "HOST($SERVICES_VIESSMANN_LANG_DIETER_DE_DOMAIN)"
traefik.http.routers.viessmann-lang-dieter-de.tls.certresolver: http_resolver
traefik.http.routers.viessmann-lang-dieter-de.tls: "true"
volumes:
- ./html/viessmann:/var/www/html
- ./var/log/viessmann:/var/log #log-files
iobroker:
hostname: ${SERVICES_IOBROKER_HOSTNAME}
image: ${SERVICES_IOBROKER_IMAGE}:${SERVICES_IOBROKER_IMAGE_VERSION}
container_name: ${SERVICES_IOBROKER_CONTAINER_NAME}
restart: unless-stopped
depends_on:
influxdb:
condition: service_started
ports:
- "8081:8081"
- "8082:8082"
- "8088:8088"
networks:
crowdsec:
# Feste IPv4-Adresse für den Container in diesem Netzwerk
ipv4_address: ${SERVICES_IOBROKER_NETWORKS_CROWDSEC_IPV4}
labels:
traefik.enable: "true"
traefik.docker.network: $NETWORKS_CROWDSEC_NAME
traefik.http.routers.iobroker.entrypoints: websecure
traefik.http.routers.iobroker.rule: "HOST($SERVICES_IOBROKER_DOMAIN) || PathPrefix(`/vis`)"
traefik.http.routers.iobroker.tls.certresolver: http_resolver
traefik.http.routers.iobroker.tls: "true"
volumes:
- ./iobrokerdata:/opt/iobroker
- ./var/log/iobroker:/var/log #log-files
influxdb:
hostname: ${SERVICES_INFLUXDB_HOSTNAME}
image: ${SERVICES_INFLUXDB_IMAGE}:${SERVICES_INFLUXDB_IMAGE_VERSION}
container_name: ${SERVICES_INFLUXDB_CONTAINER_NAME}
restart: unless-stopped
ports:
- "8083:8083"
- "8086:8086"
- "8090:8090"
- "2003:2003"
networks:
crowdsec:
# Feste IPv4-Adresse für den Container in diesem Netzwerk
ipv4_address: ${SERVICES_INFLUXDB_NETWORKS_CROWDSEC_IPV4}
labels:
traefik.enable: "True"
traefik.docker.network: $NETWORKS_CROWDSEC_NAME
traefik.http.routers.influxdb.entrypoints: websecure
traefik.http.routers.influxdb.rule: "HOST($SERVICES_INFLUXDB_DOMAIN)"
traefik.http.routers.influxdb.tls.certresolver: http_resolver
traefik.http.routers.influxdb.tls: "true"
volumes:
- ./influxdb/var/lib/influxdb:/var/lib/influxdb
- ./influxdb/var/lib/influxdb2:/var/lib/influxdb2
- ./var/log/influxdb:/log #log-files
grafana:
hostname: ${SERVICES_GRAFANA_HOSTNAME}
image: ${SERVICES_GRAFANA_IMAGE}:${SERVICES_GRAFANA_IMAGE_VERSION}
container_name: ${SERVICES_GRAFANA_CONTAINER_NAME}
restart: unless-stopped
depends_on:
traefik:
condition: service_healthy
ports:
- "3000:3000"
networks:
crowdsec:
# Feste IPv4-Adresse für den Container in diesem Netzwerk
ipv4_address: ${SERVICES_GRAFANA_NETWORKS_CROWDSEC_IPV4}
labels:
traefik.enable: "true"
traefik.docker.network: $NETWORKS_CROWDSEC_NAME
traefik.http.routers.grafana.entrypoints: websecure
traefik.http.routers.grafana.rule: "HOST($SERVICES_GRAFANA_DOMAIN)"
traefik.http.routers.grafana.tls.certresolver: http_resolver
traefik.http.routers.grafana.tls: "true"
volumes:
- ./grafana/data:/var/lib/grafana
- ./grafana/etc/grafana:/etc/grafana
- ./var/log/grafana:/log #log-files
Die benötigten Umgebungsvariablen müssen in der Datei /srv/web/.env hinzugefügt werden,
Statt .lang-dieter.de müssen Sie natürlich Ihre eigene Domain eintragen.
sudo nano /srv/web/.env
# Service Viessmann API-Abrufe lang-dieter.de
SERVICES_VIESSMANN_LANG_DIETER_DE_CONTAINER_NAME=viessmann_lang_dieter_de
SERVICES_VIESSMANN_LANG_DIETER_DE_HOSTNAME=viessmann_lang_dieter_de
SERVICES_VIESSMANN_LANG_DIETER_DE_DOMAIN="`viessmann.lang-dieter.de`"
SERVICES_VIESSMANN_LANG_DIETER_DE_NETWORKS_CROWDSEC_IPV4=172.31.254.249
# Service iobroker
SERVICES_IOBROKER_CONTAINER_NAME=iobroker_lang-dieter_de
SERVICES_IOBROKER_IMAGE=buanet/iobroker
SERVICES_IOBROKER_IMAGE_VERSION=v9.1.1
SERVICES_IOBROKER_HOSTNAME=iobroker_lang-dieter_de
SERVICES_IOBROKER_DOMAIN="`iobroker.lang-dieter.de`"
SERVICES_IOBROKER_NETWORKS_CROWDSEC_IPV4=172.31.254.246
# Service influxdb
SERVICES_INFLUXDB_CONTAINER_NAME=influxdb
SERVICES_INFLUXDB_IMAGE=influxdb
SERVICES_INFLUXDB_IMAGE_VERSION=1.8.10
SERVICES_INFLUXDB_HOSTNAME=influxdb_lang-dieter_de
SERVICES_INFLUXDB_DOMAIN="`influxdb.lang-dieter.de`"
SERVICES_INFLUXDB_NETWORKS_CROWDSEC_IPV4=172.31.254.245
INFLUXDB_DATA_ENGINE=tsm1
INFLUXDB_REPORTING_DISABLED=false
INFLUXDB_GRAPHITE_0_ENABLED=true
INFLUXDB_GRAPHITE_0_DATABASE=iobroker
INFLUXDB_GRAPHITE_0_BIND_ADDRESS=:2003
INFLUXDB_GRAPHITE_PROTOCOL=tcp
INFLUXDB_GRAPHITE_BATCH_SIZE=1000
INFLUXDB_ADMIN_ENABLED=true
# Service grafana
SERVICES_GRAFANA_CONTAINER_NAME=grafana
SERVICES_GRAFANA_IMAGE=grafana/grafana-oss
SERVICES_GRAFANA_IMAGE_VERSION=10.3.3-ubuntu
SERVICES_GRAFANA_HOSTNAME=grafana_lang-dieter_de
SERVICES_GRAFANA_DOMAIN="`grafana.lang-dieter.de`"
SERVICES_GRAFANA_NETWORKS_CROWDSEC_IPV4=172.31.254.244
GF_SERVER_ROOT_URL=SERVICES_GRAFANA_DOMAIN
GF_INSTALL_PLUGINS=grafana-clock-panel
Nun werden noch die Unterverzeichnisse für die Daten der neuen Container angelegt:
sudo mkdir -p /srv/web/{iobrokerdata,html/viessmann,grafana/{etc/grafana,data},influxdb/var}
# Zugriff für User pi erlauben wir mittels:
sudo chmod pi:root /srv/web/ -R
touch 765 /srv/web/grafana -RErstellung der iobroker-Datenbank auf dem influxdb-Server
Als erstes müssen wir uns um die Erstellung der Datenbank kümmern. Hierzu muß nur der Influx-Datenbankcontainer gestartet werden und unter Verwendung der Influx-Kommandozeile die Datenbank angelegt werden:
# Starten des Influx-DB - Containers
docker exec -it influxdb /bin/bashNun können im Container die Befehle zur Erzeugung der Datenbank ausfeführt werden:
# Kommandozeile für influxdb aufrufen
influx
# Neue Datenbank anlegen
create database iobroker
# den Container wieder verlassen
exitDamit steht uns die leere Datenbank mit der Bezeichnung „iobroker“ zur Verfügung. Der physikalische Speicherort kann wie folgt überprüft werden:
sudo ls -la /srv/webproxy/influxdb/var/lib/influxdb/data/Einbindung auf einer Webseite als IFrame erlauben
Damit die Einbindung der Graifken auf einer Webseite funktioniert, müssen in der Ini-Datei von Grafana folgende Einträge enthalten sein. Ich habe die Angaben einfach am Ende der Datei hinzugefügt.
sudo nano /srv/web/grafana/etc/grafana/grafana.ini
#Am Ende hinzufügen:
[security]
allow_embedding = true
[auth.anonymus]
enabled = true
org_name = wie in Grafana eingetragen
org_role = ViewerIn der Verwaltungsoberfläche von Grafana können Sie hierzu später einen Benutzer erstellen, der durch Zuordnung zur Benutzergruppe Viewers nur lesenden Zugriff auf das angezeigte Panel erhält.
Pflege der Daten
Nun können bei mir unter der Adresse https://iobroker.[Ihre.Domain.de]/ die Daten zur Erfassung der Messwerte eingerichtet werden.
Ich habe hierzu das Plugin Viessmannapi und Alias-Manager eingebunden. Die Anbindung der ViessmannAPI ist in den Konfigurationseinstellungen innerhalb des Plugins einfach durchzuführen.
Unter der Adresse https://grafana.[Ihre_Domain.de]/ erreicht man die Verwaltungsoberfläche von Grafana. Sie müssen natürlich die Angabe [Ihre_Domain.de] durch Ihren Domainnamen ersetzen !
Im IoBroker können mittels dem Plugin Backitup sowohl die Einstellungen von IoBroker inklusive der angefallenen Daten als auch die Diagrammeinstellungen von Grafana gesichert werden.
Auch die Java-Scripte werden dabei gesichert. Ich habe zwei Javascripte erstellt, um Daten aus den letzten 8 Tagen der Solarerzeugung zu einer Wochensumme aufzuaddieren und die Anzeige der genutzen Heizungsmodi mit den dabei hinterlegten Temperaturen darstellen zu können.
Hier meine Backup-Dateien mit den Einstellungen:
Die Zugangsdaten für die Viessmann-API darin müssen Sie auf Ihre Verhältnisse nach Import aus dem Backup anpassen. Hierzu im Dashboard von iobroger auf Instanzen klicken. Dann rechts neben viessmann.api.o auf das Schraubenschlüsselsymbol drücken, um die Einstellungen anzupassen. Die Angaben zu Client-ID finden Sie im Viessmann-Portal. Kennwort und Passwort sind die Anmeldedaten zum Vierssmann-Portal.
Die im Backup enthaltene Adminkennung für den ioBroker-Zugang lautet:
Login: admin
Kennwort: Admin!123456