OpenHAB 3 Docker Installation
Hier wird beschrieben wie man OpenHAB in der Version 3 (sucht ihr eine Anleitung für OpenHAB 4, dann hier) mit nützlichen Tools wie Grafana und Mosquitto MQTT mittels Docker Compose Projekt deployt und grundeinrichtet. Für die Persistenz habe ich eine InfluxDB 2 gewählt. Grafana speichert seine Konfiguration in einer Postgres DB und wird noch durch den Renderer erweitert um bei Alerts auch die Grafiken via Mail zu erhalten. Dafür solltet ihr mindestens einen Raspberry Pi 3 B+ oder besser ein Raspberry Pi 4 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 zum Laufen.
Docker Compose Projekt
Als erstes legen wir unsere Docker Compose Projekt Ordner an, erstellen eine leere Mosquitto MQTT Passwort Datei und legen einen User für openHAB an. Dann wechseln wir in den Compose Project Ordner:
mkdir -p /opt/openhab3/data/openhab/conf
mkdir -p /opt/openhab3/data/openhab/addons
mkdir -p /opt/openhab3/data/mosquitto/conf/certs
mkdir -p /opt/openhab3/data/influxdb/conf
mkdir -p /opt/openhab3/certs
touch /opt/openhab3/data/mosquitto/conf/mosquitto.passwd
groupadd -g 9001 openhab
useradd -u 9001 -g openhab -r -s /sbin/nologin openhab
cd /opt/openhab3
Nun legen wir unsere Projekt Konfigurationsdatei an:
/opt/openhab3/.env
# Config File for openHAB Application
# Docker Compose Project Name
# max length 11 characters
PROJECT_NAME=openhab3
# Port Configuration openHab
OPENHAB_VERSION=3.4.4
OPENHAB_HTTP_PORT=8080
OPENHAB_HTTPS_PORT=8443
# InfluxDB Configuration
INFLUXDB_VERSION=2.7
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=10.0.1
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=14
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 Mails von Grafana haben möchtet, bitte Grafana Mailing anpassen und GF_SMTP_ENABLED=true
setzen!
Bitte ändert bei der Postgres DB das Passwort!
nun noch unser docker-compose.yml
.
/opt/openhab3/docker-compose.yml
version: '3.8'
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:
- influxdb
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
#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'
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_AUTH_ANONYMOUS_ENABLED=true
- GF_SECURITY_ALLOW_EMBEDDING=true
- 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
- 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
- TZ=${TZ}
labels:
- "com.centurylinklabs.watchtower.enable=true"
# network_mode: host
networks:
- app-nw
- backend-nw
volumes:
data_openhab_userdata:
data_influxdb:
data_grafana:
data_mosquitto_data:
data_mosquitto_log:
data_postgres:
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, mit dem sich die Backend Dienste unterhalten. - Für persistente Daten werden Volumes erstellt
- Konfigurationsdateien werden in den Compose Projektordner ausgelagert
- openhab, influxdb2, mosquitto, grafana und renderer werden als Container gestartet
- Das Label
- "com.centurylinklabs.watchtower.enable=true"
dient dazu das eine automatische Aktualisierung der Container von Watchtower stattfindet
Mosquitto Konfiguration
Zuerst generieren wir hier die SSL Zertifikate, damit wir den Mosquitto verschlüsselt nutzen können
cd /opt/openhab3/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/openhab3/certs/generate-certs.sh
COMPOSE_PROJECT_DIR="/opt/openhab3"
IP="laub-server.laub.loc"
Dann das Script zum generieren der Zertifikate einfach starten:
./generate-certs.sh
nun erstellen wir das Konfigurationsfile:
/opt/openhab3/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 3 Compose Projektes
Ist alles soweit eingerichtet kann das Projekt das erste Mal gestartet werden:
cd /opt/openhab3
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/openhab3
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 and Write Token und dann 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 unsere Add-ons:
- InfluxDB Persistence
- MQTT Binding
- 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 3
openHAB Persistenz mit InfluxDB
Dafür legen wir als erstes die Persistence Strategie und Regel Konfiguration an. Dies geht momentan nur über eine Konfigurationsdatei, die wir unter /opt/openhab3/data/openhab/conf/persistence/
ablegen:
/opt/openhab3/data/openhab/conf/persistence/influxdb.persist
Strategies {
}
Items {
*: strategy = everyUpdate, restoreOnStartup
}
Diese sehr einfach Konfiguration sorgt einfach nur dafür das alle Items bei jedem Update ihren Zustand persistieren und das der letzte Zustand aus der Datenbank bei einem openHAB Neustart direkt als Item Wert verwendet wird. Mehr findet ihr hier.
Um nun die InfluxDB Datenbank als Persistenz mit openHAB zu verbinden, gehen wir in die Einstellungen und konfigurieren unsere/n hochgefahrene und eingerichtete openhab_db
InfluxDB Bucket / Datenbank.
nun wählen wir die InfluxDB 2 aus und konfigurieren den Zugang:
Hier den API Key aus dem InfluxDB Webinterface kopieren. Die Organisation und das Bucket stehen im .env
file.
Nun wählen wir noch die InfluxDB als Standard Persistence aus.
Und wieder mit Save speichern.
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 (Local MQTT Broker)
- Broker Hostname (YOURFQDN)
- Broker Port (8883)
- Secure Connection (enabled)
- Client ID (openHAB3)
- Quality of Service (At least once (1))
- Username (mosquitto)
- Password (euer angelegtes Passwort)
- Certificate Pinning (disabled)
- Public Key Pinning (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 Einstellungen / Data Sources:
Dort gehen wir auf Add Datasources und wählen die InfluxDB aus. Diese wird dann wie folgt konfiguriert:
Den API Token (grafana) bekommt ihr wieder aus dem Webinterface der InfluxDB (READ Token). den Rest 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/openhab3/
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/openhab3/
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: