Viessmann Heizungsdaten im Browser anzeigen

Hardcopy meiner Auswertungsseite mit den Viessmann-Daten

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 down

an. 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 -R

Erstellung 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/bash

Nun 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
exit

Damit 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 = Viewer

In 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