OpenHAB 4 Docker Installation
Hier wird beschrieben wie man das aktuelle openHAB 4 mit nützlichen Tools wie Grafana und Mosquitto MQTT mittels Docker Compose Projekt deployt und grundeinrichtet.
Für die Persistenz der Daten wird eine InfluxDB 2 genutzt. Grafana speichert seine Konfiguration in einer eigenen PostgresDB und wird noch durch den Renderer erweitert um bei Alerts auch die Grafiken via Mail zu erhalten.
Für dieses Setup solltet ihr mindestens einen Raspberry Pi 3 B+ (bezahlter Link) oder besser ein Raspberry Pi 4 (bezahlter Link) mit Raspberry Pi OS 64bit, Docker und Docker-Compose installiert haben. Wichtig ist, das die 64bit Version des Raspberry Pi OS installiert ist, da sonst die InfluxDB in Version 2, nicht lauffähig ist (bei einer 32bit Installation hier nachschauen). Das Setup ist aber auch auf jedem anderen System nutzbar, auf dem Docker und Docker-Compose läuft. Bei mir kommt Setup auf einem Raspberry Pi 4 (bezahlter Link) zum Laufen.
Docker Compose Projekt
Als erstes legen wir unseren Docker Compose Projekt Ordner inklusive aller Unterordner an, erstellen eine leere Mosquitto MQTT Passwort Datei und legen einen eignen System User für openHAB an. Dann wechseln wir in den Compose Project Ordner:
mkdir -p /opt/openhab4/data/openhab/conf
mkdir -p /opt/openhab4/data/openhab/addons
mkdir -p /opt/openhab4/data/mosquitto/conf/certs
mkdir -p /opt/openhab4/data/influxdb/conf
mkdir -p /opt/openhab4/certs
touch /opt/openhab4/data/mosquitto/conf/mosquitto.passwd
groupadd -g 9001 openhab
useradd -u 9001 -g openhab -r -s /sbin/nologin openhab
cd /opt/openhab4
Nun legen wir in unserem Compose Projektordner unsere ComposeProjekt-Konfigurationsdatei an:
/opt/openhab4/.env
# Config File for openHAB Application
# Docker Compose Project Name
# max length 11 characters
PROJECT_NAME=openhab4
# Port Configuration openHab
OPENHAB_VERSION=4.2.2
OPENHAB_HTTP_PORT=8080
OPENHAB_HTTPS_PORT=8443
# InfluxDB Configuration
INFLUXDB_VERSION=2.7-alpine
INFLUXDB_HTTP_PORT=8086
INFLUXDB_INIT_MODE=setup
INFLUXDB_INIT_USERNAME=admin
INFLUXDB_INIT_PASSWORD=havdsdcsdfodpdsa343
INFLUXDB_INIT_ORG=myorg
INFLUXDB_INIT_BUCKET=openhab_db
INFLUXDB_INIT_ADMIN_TOKEN=dcsdfodpdsa3adsdcasd8979820394r2nkjnk
INFLUXD_LOG_LEVEL=warn
# Port Configuration Grafana
GRAFANA_VERSION=11.2.2
GRAFANA_HTTP_PORT=3000
## Set the Server URL, so links in Alert Mails are not related to localhost.
GRAFANA_SERVER_ROOT_URL=http://YOURSERVERNAME:3000
## Grafana Mailing
GRAFANA_SMTP_ENABLED=false
GRAFANA_SMTP_HOST=YOURMAILSERVER:465
GRAFANA_SMTP_USER=YOURSMTPUSER
GRAFANA_SMTP_PASSWORD=SMTPPASSWORD
GRAFANA_SMTP_FROM_ADDRESS=MAIL@FROMADRESS.TLD
# Postgres Configuration
POSTGRES_VERSION=17-alpine
POSTGRES_PASSWORD=havdsdcsdfxCodpit9
POSTGRES_USER=grafana
POSTGRES_DB=grafanadb
# Port Configuration Mosquitto
MOSQUITTO_VERSION=2
MOSQUITTO_MQTT_PORT=1883
MOSQUITTO_MQTTS_PORT=8883
# Timezone
TZ=Europe/Berlin
Bitte ändert bei der InfluxDB das Passwort, die Organisation und den Admin Token ab!
Falls ihr Alarm eMails von Grafana versenden möchtet, bitte Grafana Mailing entsprechend eures Mailservers anpassen und GF_SMTP_ENABLED=true
setzen!
Bitte ändert bei der Postgres DB das Passwort!
Nun noch die docker-compose.yml
selbst.
/opt/openhab4/docker-compose.yml
services:
openhab:
image: openhab/openhab:${OPENHAB_VERSION}
depends_on:
- influxdb
- mosquitto
restart: always
# if you do not need persistent log files
#tmpfs:
# - /openhab/userdata/logs
volumes:
- "/etc/localtime:/etc/localtime:ro"
- "/etc/timezone:/etc/timezone:ro"
- "./data/openhab/conf:/openhab/conf"
- "./data/openhab/addons:/openhab/addons"
- data_openhab_userdata:/openhab/userdata
environment:
- TZ=${TZ}
- OPENHAB_HTTP_PORT=${OPENHAB_HTTP_PORT}
- OPENHAB_HTTPS_PORT=${OPENHAB_HTTPS_PORT}
- "CRYPTO_POLICY=unlimited"
- "EXTRA_JAVA_OPTS=-Duser.timezone=${TZ}"
# If you need more memory
#- "EXTRA_JAVA_OPTS=-Xms1024m -Xmx2048m -Duser.timezone=${TZ}"
- USER_ID=9001
- GROUP_ID=9001
labels:
- "com.centurylinklabs.watchtower.enable=true"
network_mode: host
mosquitto:
image: eclipse-mosquitto:${MOSQUITTO_VERSION}
restart: always
volumes:
- "./data/mosquitto/conf:/mosquitto/config"
- data_mosquitto_data:/mosquitto/data
- data_mosquitto_log:/mosquitto/log
ports:
- ${MOSQUITTO_MQTT_PORT}:1883
- ${MOSQUITTO_MQTTS_PORT}:8883
environment:
- TZ=${TZ}
labels:
- "com.centurylinklabs.watchtower.enable=true"
networks:
app-nw:
aliases:
- mqtt
influxdb:
image: influxdb:${INFLUXDB_VERSION}
restart: always
volumes:
- "./data/influxdb/conf:/etc/influxdb2"
- data_influxdb:/var/lib/influxdb2
ports:
- ${INFLUXDB_HTTP_PORT}:8086
environment:
- DOCKER_INFLUXDB_INIT_MODE=${INFLUXDB_INIT_MODE}
- DOCKER_INFLUXDB_INIT_USERNAME=${INFLUXDB_INIT_USERNAME}
- DOCKER_INFLUXDB_INIT_PASSWORD=${INFLUXDB_INIT_PASSWORD}
- DOCKER_INFLUXDB_INIT_ORG=${INFLUXDB_INIT_ORG}
- DOCKER_INFLUXDB_INIT_BUCKET=${INFLUXDB_INIT_BUCKET}
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=${INFLUXDB_INIT_ADMIN_TOKEN}
- INFLUXD_LOG_LEVEL=${INFLUXD_LOG_LEVEL}
- TZ=${TZ}
labels:
- "com.centurylinklabs.watchtower.enable=true"
networks:
app-nw:
backend-nw:
aliases:
- db
postgres:
image: postgres:${POSTGRES_VERSION}
restart: always
volumes:
- data_postgres:/var/lib/postgresql/data/
environment:
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_DB=${POSTGRES_DB}
- TZ=${TZ}
labels:
- "com.centurylinklabs.watchtower.enable=true"
networks:
backend-nw:
aliases:
- postgresdb
renderer:
# official image
image: grafana/grafana-image-renderer:latest
# inofficial ones working on Raspberry Pi's
#image: adejong/grafana-image-renderer-pi:1.0.8-beta2
#image: serhiymakarenko/grafanalabs-image-renderer:latest
#image: asksven/grafana-image-renderer:1
#image: hferreira/grafana-image-renderer:latest
restart: always
environment:
- ENABLE_METRICS=true
- TZ=${TZ}
labels:
- "com.centurylinklabs.watchtower.enable=true"
networks:
- backend-nw
grafana:
image: grafana/grafana:${GRAFANA_VERSION}
depends_on:
- influxdb
- renderer
- postgres
restart: always
user: "0"
volumes:
- data_grafana:/var/lib/grafana
ports:
- ${GRAFANA_HTTP_PORT}:3000
environment:
- GF_INSTALL_PLUGINS=grafana-clock-panel,briangann-gauge-panel,natel-plotly-panel,grafana-simple-json-datasource
- GF_SERVER_ROOT_URL=${GRAFANA_SERVER_ROOT_URL}
- GF_SMTP_ENABLED=${GRAFANA_SMTP_ENABLED}
- GF_SMTP_HOST=${GRAFANA_SMTP_HOST}
- GF_SMTP_USER=${GRAFANA_SMTP_USER}
- GF_SMTP_PASSWORD=${GRAFANA_SMTP_PASSWORD}
- GF_SMTP_FROM_ADDRESS=${GRAFANA_SMTP_FROM_ADDRESS}
- GF_DATABASE_TYPE=postgres
- GF_DATABASE_HOST=postgresdb
- GF_DATABASE_NAME=${POSTGRES_DB}
- GF_DATABASE_USER=${POSTGRES_USER}
- GF_DATABASE_PASSWORD=${POSTGRES_PASSWORD}
- GF_DATABASE_SSL_MODE=disable
- GF_UNIFIED_ALERTING_SCREENSHOTS_CAPTURE=true
- GF_RENDERING_SERVER_URL=http://renderer:8081/render
- GF_RENDERING_CALLBACK_URL=http://grafana:3000/
- GF_LOG_FILTERS=rendering:debug
# for anonymous access to embedding graphs
#- GF_AUTH_ANONYMOUS_ENABLED=true
#- GF_SECURITY_ALLOW_EMBEDDING=true
- TZ=${TZ}
labels:
- "com.centurylinklabs.watchtower.enable=true"
networks:
- app-nw
- backend-nw
volumes:
data_openhab_userdata:
data_influxdb:
data_postgres:
data_grafana:
data_mosquitto_data:
data_mosquitto_log:
networks:
app-nw:
internal: false
driver: bridge
driver_opts:
com.docker.network.bridge.name: app-${PROJECT_NAME}
backend-nw:
internal: true
driver: bridge
driver_opts:
com.docker.network.bridge.name: be-${PROJECT_NAME}
Was passiert hier:
- openhab wird mit dem host network gestartet, damit es auch UPnP Anfragen annehmen kann (
network_mode: host
)
- Es wird ein Netzwerk
app-nw
eingerichtet mit dem sich alle Container verbinden, die einen Port freigeben. - zusätzlich wird noch ein Backend Netzwerk
backend-nw
erstellt, in dem sich die Backend Dienste unterhalten werden. - Für persistente Daten werden Volumes erstellt und benutzt
- Konfigurationsdateien werden in den Compose Projektordner unter
data/XXX
ausgelagert - openhab, influxdb, mosquitto, grafana und renderer werden als Container gestartet
- Das Label
- "com.centurylinklabs.watchtower.enable=true"
dient dazu das eine automatisierte Aktualisierung der Container von Watchtower stattfindet kann.
Mosquitto Konfiguration
Zuerst generieren wir die SelfSigned SSL Zertifikate, damit wir den Zugriff via MQTT auf den Mosquitto Broker verschlüsselt nutzen können
cd /opt/openhab4/certs
wget https://raw.githubusercontent.com/alaub81/scripts/master/generate-certs.sh
chmod +x generate-certs.sh
Bitte mindestens die Variablen COMPOSE_PROJECT_DIR
und IP
anpassen, bei IP
am besten den FQDN des Servers eintragen!
/opt/openhab4/certs/generate-certs.sh
COMPOSE_PROJECT_DIR="/opt/openhab4"
IP="hostname.domainname.tld"
Dann das Script zum generieren der Zertifikate einfach starten:
./generate-certs.sh
nun erstellen wir das Konfigurationsfile:
/opt/openhab4/data/mosquitto/conf/mosquitto.conf
listener 1883 listener 8883 persistence true persistence_location /mosquitto/data/ log_dest file /mosquitto/log/mosquitto.log allow_anonymous false password_file /mosquitto/config/mosquitto.passwd cafile /mosquitto/config/certs/ca.crt certfile /mosquitto/config/certs/server.crt keyfile /mosquitto/config/certs/server.key require_certificate false
Mehr Infos hier:
Hochfahren des openHAB 4 Compose Projektes
Ist alles soweit eingerichtet kann das Projekt das erste Mal gestartet werden:
cd /opt/openhab4
docker compose up -d
Nun sollten die folgenden URLs verfügbar sein:
- openHAB: http://YOURSERVERNAME:8080 und https://YOURSERVERNAME:8433
- Grafana: http://YOURSERVERNAME:3000
- InfluxDB 2: http://YOURSERVERNAME:8086
Mit docker ps
könnt ihr zusätzlich prüfen ob alle Container laufen.
Anlegen des MQTT Benutzers
nun richten wir noch einen Benutzer für den MQTT Broker ein um uns damit via openHAB zu verbinden.
cd /opt/openhab4
docker compose exec mosquitto mosquitto_passwd -c /mosquitto/config/mosquitto.passwd mosquitto
Einfach ein gewünschtes Passwort für den User vergeben. Benutzername ist mosquitto
.
Anlage InfluxDB 2 API Tokens
Nun müssen wir für openHAB und Grafana in der InfluxDB 2 API Tokens einrichten, um mit diesen später darauf zugreifen zu können. Dafür loggen wir uns am Webinterface von der InfluxDB ein:
- http://<YOURSERVERNAME>:8086
- mit dem in den .env eintragenden credentials einloggen
Nun unter Load Data --> API Tokens --> GENERATE API TOKEN --> Custom API Token
gehen.
hier legen wir nun erst für openHAB einen Read/Write Token und dann im Anschluss für Grafana einen Read Token an.
Achtung!!! Kopiert euch die generierten Token unbedingt weg, man kann Sie nicht mehr auslesen im Nachhinein und muss sich neue generieren, solltet ihr den Token verlieren.
Konfiguration von openHAB
Beim ersten Aufruf der openHAB URL begrüsst uns ein Setup Assistent. Das erste was wir hier machen, ist einen Administrativen Benutzer einrichten:
dann unsere Lokalen Einstellungen:
nun installieren wir zusätzlich unsere Add-ons:
- InfluxDB Persistence
- MQTT Binding
- die vorausgewählten Add-ons können bleiben
- weitere Add-ons, die ihr benötigt, können aber auch später ohne Weiteres in den Einstellungen nachinstalliert werden
das war es auch schon mit dem Setup Assistent:
und nun begrüßt uns auch schon das Dashboard von openHAB 4
openHAB Persistenz mit InfluxDB
In openHAB 4 ist eines der neuen Features, dass man die Persistent komplett via UI konfigurieren kann. Dafür gehen wir in die Einstellungen --> Other Add-ons
und suchen hier die vorher installierte InfluxDB Persistence
und öffnen dieses Add-on.
Hier klicken wir dann auf das Zahnrad für die Einstellungen. Hier konfigurieren wir als erstes die Verbindung zur InfluxDB:
- Datenbank-URL http://127.0.0.1:8086
- InfluxDB 2 auswählen
- Authentication Token eintragen (haben wir vorher angelegt und wegkopiert für openHAB (Read/Write Token))
- Database / Organisation (wurde im
.env
File konfiguriert (myorg)) - Retention Policy / Bucket (wurde im
.env
File konfiguriert (openhab_db))
Nun speichern wir das Ganze rechts oben mit Save
.
Als nächstes klicken wir ganz oben auf den blauen Link "Persistence Configuration". Hier stellen wir nun die Regeln für die Persistierung ein.
Hier könnt ihr frei entscheiden, welche Items oder Gruppen persistiert werden sollen. Man kann zum Beispiel eine Gruppe anlegen die "persistent
" heißt, dieser dann alle gewünschten Items zuweisen und diese als Gruppe auswählen. Oder man hat sowieso eine Hauptgruppe (z.B. "Home
") und nutzt diese. Zusätzlich sollte man hier kann dann auch die Strategie wählen. Ich nutze immer everyUpdate
und restoreOnStartup
.
Dann das Ganze Speichern und fertig.
Oder ihr legt nach altem Shema folgende Datei an um alle Items zu persistieren:
/opt/openhab4/data/openhab/conf/persistence/influxdb.persist
Strategies { } Items { *: strategy = everyUpdate, restoreOnStartup }
Als letzen Schritt sagen wir openHAB noch die InfluxDB als Standard Persistence zu nutzen.
Und wieder mit Save speichern. Nun sollten die konfigurierten Items ihre Daten in der InfluxDB ablegen.
openHAB MQTT Broker anbinden
Wieder gehen wir in die Einstellungen, dann zu den Things. Unten rechts klicken wir auf das Plus Sysmbol um ein neues Thing einzurichten. Dann wählen wir das MQTT Binding aus. Dort angekommen klicken wir auf den MQTT Broker:
Als erstes haken wir "Show Advanced" an. Ihr müsst nun die folgenden Dinge konfigurieren:
- Label (MQTT Broker)
- Broker Hostname (YOURFQDN)
- Broker Port (8883)
- Sichere Verbindung (enabled)
- Hostname bestätigt (enabled)
- MQTT Version (5)
- Service Qualität (mindestens einmal (1))
- Client ID (openHAB)
- Benutzername (mosquitto)
- Passwort (euer angelegtes Passwort)
- Zertifikat fixieren (disabled)
- Öffentlicher Schlüssel anpinnen (disabled)
Ganz unten dann auf "Create Thing"
nun haben wir den Mosquitto MQTT als Bridge angelegt und können diverse Generic MQTT Things anlegen um so die Daten in openHAB zu bringen. Ich lege hier immer ein Thing für jedes Gerät an, das Daten an den MQTT schickt. Mehr dazu findet ihr hier:
Grafana Konfigurieren
Grafana erreicht ihr dann unter der URL http://YOURSERVERNAME:3000/ Der Standard User ist hier admin
mit dem Passwort admin
. Beim Ersten Login müsst ihr aber direkt das admin Passwort ändern. In Grafana selbst legen wir dann die InfluxDB als Datasource an, dann können wir schöne Grafiken mittels Grafana aus unseren gesammelten Persistenten Daten von opeHAB zusammenklicken.
Wir gehen in Grafana unter Home / Administration / Data sources
:
Dort gehen wir auf Add Datasource
und wählen die InfluxDB aus. Diese wird dann wie folgt konfiguriert:
Den API Token für grafana habt ihr euch vorher aus dem Webinterface der InfluxDB wegkopiert (READ Token). Den Rest (Default Bucket und Organization) lest ihr aus dem .env
File.
Nun, nachdem alles eingerichtet ist kann man Dashboards mit Panels erstellen, die die openHAB Daten der Items verwenden. Beim neuen FLUX Query Format ist es hilfreich sich die Queries einfach im InfluxDB Webinterface zusammen zu bauen und dann anschließend diese als Script zu kopieren.
Beispiel:
from(bucket: "openhab_db")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "laubraspi2dht22_Humidity")
|> filter(fn: (r) => r["_field"] == "value")
|> filter(fn: (r) => r["item"] == "laubraspi2dht22_Humidity")
|> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
|> yield(name: "mean")
Wenn einem dies zu umständlich ist, kann man auch bei InfluxDB 2 auf die alte InfluxDB v1 Query Language umstellen. wie das geht könnt ihr hier nachlesen:
Updaten
Bei gleichbleibender Versionen
Zum Updaten der Container einfach wie gewohnt:
cd /opt/openhab4/
docker compose pull
docker compose up -d
oder automatisch via Watchtower:
Upgrade bei neuen Image Versionen
Möchtet ihr ein Update der Docker Image Versionen durchführen, müsst ihr zuerst, die Version, die ihr deployen wollt, in der .env
anpassen. Danach könnt ihr zunächst das neue Image herunterladen und dann die Container in der neuen Version deployen.
cd /opt/openhab4/
nano .env
docker compose pull
docker compose up -d
Backup
Ein Backup kann entweder händisch oder aber Script gesteuert gemacht werden. Schaut einfach die folgenden Artikel durch:
- Docker Backup und Restore - eine kleine Anleitung
- Docker Compose Project Backup Script
- Docker Volume Backup Script
GitHub Repository
Das Ganze findet ihr auch in GitHub als komplettes Repository: