Home Assistant z Zigbee na Dockerze

Napisano dnia 31.08.2023 r. o godzinie 14:09
Autor: Piotr Sperka

Wstęp

Home Assistant jest znaną, otwartą aplikacją służącą do realizacji zarządzania inteligentnym domem. Ostatnio postanowiłem pobawić się takimi rozwiązaniami i po krótkim czasie postanowiłem również dodać integrację z siecią Zigbee. O ile w przypadku instalacji bezpośrednio w systemie operacyjnym taka integracja jest opisana w naprawdę wielu miejscach, to w przypadku obrazu dockerowego jest to nieco bardziej skomplikowane. Dodatkowo opisy które napotkałem, albo były przestarzałe, albo nieco wybrakowane – stąd też powstał ten wpis.

Sprzęt

W celu integracji z Zigbee zakupiłem bramkę w formie dongla USB. Była to dokładnie bramka Sonoff Dongle Plus Zigbee 3.0 (ZBDongle-E). Na próbę zakupiłem również dwie sterowane wtyczki różnych producentów, czujnik wilgotności i temperatury, a także jednoprzyciskowy pilot. Całość kosztowała niecałe 250zł.

Home Assistant jest u mnie uruchomiony jako kontener dockerowy, udostępniony przez reverse proxy (Nginx Proxy Manager, również uruchomiony na Dockerze). Całość działa na serwerze zrobionym ze starego Della Wyse 5060 na którym działa Debian. Takiej też konfiguracji dotyczy ten opis i w Twoim przypadku mogą występować drobne różnice.

Docker Compose

Konfigurację kontenerów rozpocząłem od utworzenia nowego katalogu dla Home Assistanta – w moim przypadku /opt/docker/home-assistant. Następnie utworzyłem tam plik docker-compose.yml o następującej zawartości:

version: '3'
services:
  homeassistant:
    container_name: homeassistant
    image: "ghcr.io/home-assistant/home-assistant:stable"
    volumes:
      - /opt/docker/home-assistant/config:/config
      - /etc/localtime:/etc/localtime:ro
    restart: unless-stopped
    expose:
      - 8123
    privileged: true
    networks:
      - nginx-proxy-manager_default

  mosquitto:
    container_name: mqtt
    image: eclipse-mosquitto
    ports:
      - 1883:1883
      - 9001:9001
    volumes:
      - /opt/docker/home-assistant/mosquitto/config:/mosquitto/config
      - /opt/docker/home-assistant/mosquitto/data:/mosquitto/data
      - /opt/docker/home-assistant/mosquitto/log:/mosquitto/log
    networks:
      - nginx-proxy-manager_default

  zigbee2mqtt:
    container_name: zigbee2mqtt
    depends_on:
      - mosquitto
    image: koenkk/zigbee2mqtt
    volumes:
      - /opt/docker/home-assistant/zigbee2mqtt/data:/app/data
      - /run/udev:/run/udev:ro
    ports:
      - 8080:8080
    devices:
      - "/dev/serial/by-id/usb-ITEAD_SONOFF_Zigbee_3.0_USB_Dongle_Plus_V2_20230508184949-if00:/dev/zigbee"
    restart: always
    privileged: true
    networks:
      - nginx-proxy-manager_default

networks:
  nginx-proxy-manager_default:
    external: true

Tak naprawdę najważniejsze zmiany, które musisz wykonać, to zmiana ścieżki do dongla Zigbee. W moim przypadku było to /dev/serial/by-id/usb-ITEAD_SONOFF_Zigbee_3.0_USB_Dongle_Plus_V2_20230508184949-if00, jednak w Twoim prawie na pewno będzie to inna ścieżka. Można ją poznać wywołując komendę ls /dev/serial/by-id/.

Drugą konfiguracją do zmiany jest nazwa sieci, w jakiej znajduje się reverse proxy (w moim przypadku nginx-proxy-manager_default).

Dalsza konfiguracja

Kolejnym krokiem było stworzenie wstępnego pliku z konfiguracją dla Mosquitto. Należy stworzyć plik /opt/docker/home-assistant/mosquitto/config/mosquitto.conf o takiej zawartości:

persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
log_type all
allow_anonymous true
listener 1883

W tym momencie wstępnie uruchomiłem kontenery poleceniem docker compose up -d. Gdy kontenery wstały, zacząłem wprowadzać zmiany w reszcie konfiguracji. W pierwszej kolejności sprawdziłem ID kontenera z Mosquitto (np. komendą docker container ls). Następnie poleceniem docker exec -it <id_kontenera> /bin/sh wszedłem do powłoki kontenera. Stworzyłem użytkownika do autoryzacji w Mosquitto poleceniem mosquitto_passwd -c /mosquitto/config/password.txt mqtt. W moim przypadku nazwałem użytkownika mqtt, jednak jest to dowolne. Po wywołaniu polecenia podałem dwukrotnie hasło dla tworzonego użytkownika i zamknąłem powłokę poleceniem exit.

W dalszej kolejności wróciłem do edycji pliku konfiguracyjnego Mosquitto: /opt/docker/home-assistant/mosquitto/config/mosquitto.conf. Zmieniłem go następująco:

persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
log_type all
allow_anonymous false
password_file /mosquitto/config/password.txt
listener 1883

Następnie przyszedł czas na edycję konfiguracji zigbee2mqtt. Wyedytowałem plik /opt/docker/home-assistant/zigbee2mqtt/data/configuration.yaml, żeby wyglądał tak:

homeassistant: true
permit_join: true
frontend: true
mqtt:
  base_topic: zigbee2mqtt
  server: mqtt://mqtt:1883
  user: mqtt
  password: <haslo-do-mqtt>
serial:
  port: /dev/zigbee
  adapter: ezsp
advanced:
  homeassistant_legacy_entity_attributes: false
  legacy_api: false
  legacy_availability_payload: false
device_options:
  legacy: false

Oczywiście tutaj musisz wpisać odpowiednią nazwę użytkownika i hasło do Mosquitto. Ostatnia konfiguracja do edycji pozostała w samym Home Assistancie. Wyedytowałem plik /opt/docker/home-assistant/config/configuration.yml i na jego końcu dodałem:

http:
  use_x_forwarded_for: true
  trusted_proxies: 172.18.0.8

Oczywiście adres IP musisz podmienić na adres Twojego reverse proxy. Po tym zrestartowałem kontenery poleceniem docker compose restart i dodałem wpisy w reverse proxy dla Home Assistanta i zigbee2mqtt. Dla obu wpisów aktywowałem również opcję WebSocket.

Konfiguracja reverse proxy dla Home Assistant

Co dalej?

W dalszej kolejności powinieneś przeprowadzić podstawową konfigurację Home Assistanta poprzez interfejs webowy, a następnie przejść do interfejsu zigbee2mqtt i dodać (wykryć) swoje urządzenia. Później zostaje tylko konfiguracja integracji z MQTT w Home Assistant – jako adres podajesz mqtt (nazwę kontenera z Mosquitto), port 1883 oraz ustawioną nazwę użytkownika i hasło podczas konfiguracji Mosquitto. Jeśli wszystko poszło poprawnie, Home Assistant powinien automatycznie wykryć dodane w interfejsie zigbee2mqtt urządzenia.

Lista urządzeń w zigbee2mqtt
Lista urządzeń w Home Assistant

Podsumowanie

Udało nam się poprawnie skonfigurować integrację Home Assistant z Zigbee, wykorzystując do tego zigbee2mqtt oraz Mosquitto. Wszystko działa w Dockerze, a więc jest łatwe do zarządzania i aktualizacji. Teraz pozostaje tylko dodawać kolejne urządzenia i automatyzacje. Jeśli masz jakieś pytania lub uwagi – nie wahaj się skontaktować.

Tymczasem powodzenia, i do następnego razu. 😉