Smart Home Dashboard mit Home Assistant, MQTT, Certbot und Nginx Proxy

Heimautomation, Überwachung und Steuerung erfordert eine Benutzeroberfläche, die einfach zu nutzen ist. Es gibt hierfür zahlreiche kommerzielle Lösungen.

Mein Smart Home Dashboard

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.