Heimautomation, Überwachung und Steuerung erfordert eine Benutzeroberfläche, die einfach zu nutzen ist. Es gibt hierfür zahlreiche kommerzielle Lösungen.
Hat man jedoch hohe Anforderungen an Datensicherheit und Privatsphäre, so ist eine Smart Home Lösung in Eigenbetrieb das Mittel der Wahl. Ich habe ein paar Open-Source Lösungen ausprobiert und war am Ende mit „Home Assistant“ sehr zufrieden. In diesem Beitrag möchte ich erläutern, wie man eine minimale Instanz von Home Assistant mit MQTT, Certbot und Nginx Proxy mit Docker-Compose in Betrieb nehmen kann.
Installation Docker-Compose
Mithilfe von Docker-Compose lassen sich Docker container mit geringem Aufwand orchestrieren. Ich nutze Debian als Betriebssystem für mein Server. Die Anleitung unter diesem Link schildert die nötigen Installationsschritte.
Docker-Compose
Die docker-compose.yml Datei sieht folgendermaßen aus. Sie beinhaltet drei Services.
version: '3.5'
services:
homeassistant:
container_name: homeassistant
restart: unless-stopped
image: ghcr.io/home-assistant/home-assistant:stable
network_mode: host
privileged: true
environment:
- TZ=Europe/Berlin
volumes:
- ./homeassistant_config:/config
- /etc/localtime:/etc/localtime:ro
depends_on:
- mosquitto
mosquitto:
container_name: mosquitto
image: eclipse-mosquitto
network_mode: host
volumes:
- ./mosquitto_conf:/mosquitto/config
- ./mosquitto_data:/mosquitto/data
- ./mosquitto_log:/mosquitto/log
frontend:
restart: unless-stopped
image: staticfloat/nginx-certbot
ports:
- 80:80/tcp
- 443:443/tcp
environment:
CERTBOT_EMAIL: owner@company.com
volumes:
- ./nginx_conf:/etc/nginx/user.conf.d:ro
- letsencrypt:/etc/letsencrypt
volumes:
letsencrypt:
Service: Home Assistant
Das ist der eigentliche Home Assistant Service. Alleine dieser Service mit ihrer Konfiguration ist ausreichend, um eine laufende Instanz zu bekommen. Der Service ist unter dem Port 8123 zu erreichen.
Service: Mosquitto
Mosquitto wird insbesondere dann benötigt, wenn man eine MQTT Instanz nutzen möchte, um IOT Daten an Home Assistant zu übermitteln. Es kann selbstverständlich auch jede beliebige Instanz genutzt werden. In meinem Anwendungsfall wollte ich alles in einem docker-container haben.
Service: nginx-certbot
Standardmäßig wird Home Assistant ohne TLS auf dem unsicheren Port 8123 betrieben. Für eine verschlüsselte Übertragung ist ein Webserver mit aktivierter TLS Verschlüsselung erforderlich. Ich bin auf der Suche auf diesen Container gestoßen, der bei der Installation die aktuelle Version von Nginx und Certbot bezieht.
Konfiguration
Mit „docker-compose up“ lässt sich der Container starten. Nach bzw. beim ersten Starten müssen auf den neu erstellten Konfigurationsdateien ein paar Veränderungen durchgeführt werden.
Home Assistant
Home Assistant erstellt beim ersten Betrieb automatisch eine Konfigurationsdatei im docker-compose Ordner. In dieser Datei muss man nur den Teil für „http“-Integration ergänzen.
# Loads default set of integrations. Do not remove.
default_config:
# Load frontend themes from the themes folder
frontend:
themes: !include_dir_merge_named themes
# Text to speech
tts:
- platform: google_translate
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
http:
use_x_forwarded_for: true
trusted_proxies:
- 127.0.0.1
ip_ban_enabled: true
login_attempts_threshold: 5
Durch diesen Block wird der nginx-proxy auf Anwendungsseite erlaubt. Es könnte sein, dass man eine andere IP Adresse eintragen muss. Docker hat intern einen eigenen IP Adressenraum, den man hier verwenden kann. Die korrekte Adresse wird in den logs ausgegeben.
Mosquitto
Nach dem ersten Betrieb von Mosquitto wird auch hier eine Konfigurationsdatei erstellt. Diese Datei muss weiter modifiziert werden. Der folgende Befehl erzeugt eine gültige Passwortdatei. Dieser Befehl muss bei laufendem Betrieb ausgeführt werden.
docker-compose exec mosquitto mosquitto_passwd -c /mosquitto/config/mosquitto.passwd mosquitto
Nun kann die Mosquitto Konfiguration mit dieser Datei aktualisiert werden. Das Resultat sieht wie folgt aus.
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
listener 1883
## Authentication ##
allow_anonymous false
password_file /mosquitto/config/mosquitto.passwd
Dadurch wird die anonyme Verbindung mit Mosquitto unterbunden.
Nginx-Certbot
In nginx muss eine weitere Datei erzeugt werden. Im Ordner nginx_conf kann die folgende nginx.conf erzeugt werden.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
proxy_redirect off;
location / {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:8123/;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
Die fett markierten Stellen müssen gegebenenfalls modifiziert werden. Statt der lokalen IP Adresse kann auch einfach die öffentliche IP Adresse des Servers angegeben werden.
Ergebnis
Beim ersten Öffnen von Home Assistant wird man durch die Einrichtung des Benutzeraccounts geführt und hat im Anschluss eine Instanz, die man für Heimautomation, -überwachung und -steuerung nutzen kann.
Was man nun mit dieser Lösung macht, kennt keine Grenzen. Ich plane meinen ganzen Verbrauch und Produktion (Solarenergie) an Energie im Dashboard abzubilden. Außerdem möchte ich auch die Lichtsteuerung meines Wohnzimmers in das Dashboard einbauen. Aus Spaß möchte ich auch eine Indoor-Überwachungskamera installieren, dessen Videoausgabe ich im Smart Home Dashboard anschauen kann.