Utilizzando Docker-Compose installeremo e configureremo in maniera semplice e veloce le automazione per la nostra casa. In questo post descriverò il mio setup e le configurazioni necessarie per eseguire il container.

Docker

Docker

Questa che descriverò è l’ultima configurazione che ho installato nel mio server personale e ho deciso di adottare docker-compose che permette più libertà nel setup.

Ho passato diverso tempo a creare questo setup che comprende:

  • Home Assistant;
  • Node-RED;
  • AppDaemon;
  • MariaDB;
  • VS Code;
  • Mosquitto;
  • Deconz.

Utilizzo di .env

Le configurazioni le carico su Github per avere un backup in futuro e non è buona norma salvarle con dati sensibili come, ad esempio, password o tokens. Per questo motivo creo un file .env che resta salvato solo nel server in uso. Per fortuna docker-compose è in grado di leggere questo file semplificando la vita e salvaguardando dati sensibili.

I volumi

La maggior parte dei contenitori docker usa i volumi per salvare i dati e utilizzarli nel tempo. Senza di loro, configurazioni e dati al ravvio del docker verrebbero ripristinati. Assicuratevi di modificare in ogni contenitore docker la directory in cui volete salvare i dati.

Per esempio, salvo tutte le miei configurazioni in un’unica directory ~/hass-config, semplificando anche il backup.

Home Assistant

Home Assistant Configurazione Docker Compose

Questo è il docker principale del setup. Utilizza MariaDB per salvare tutti gli eventi quindi questo container deve essere eseguito prima di Home Assistant. La stessa cosa deve avvenire per il container che gestisce l’mqtt client cioè Mosquitto.

Configurazione

# Home Assistant
homeassistant:
  container_name: home-assistant
  image: homeassistant/home-assistant
  volumes:
    # Directory dove verranno salvate le configurazioni di home assistant
    - <directory locale>:/config
    - /etc/localtime:/etc/localtime:ro
  restart: unless-stopped
  network_mode: host
  depends_on:
    # MariaDB opzionale (solo se si vuole utilizzare un database diverso per HA).
    - mariadb
    # Mosquitto opzionale (solo se serve un client mqtt)
    - mosquitto

MariaDB

Maria DB Configurazione Docker Compose

Preferisco usare un classico database al posto del file di default sqlite.

Env Variables:

  • MYSQL_ROOT_PASSWORD: Root password per il servizio.
  • HA_MYSQL_PASSWORD: Password che home assistant userà per connettersi al db.
  • LOCAL_USER: (Opzionale) Mappa l’user con cui il docker verrà eseguito. Questo permette di modificare i files senza aver la necessità di essere utente root.

Configurazione

# MariaDb
mariadb:
  image: mariadb/server:10.3
  container_name: mariadb
  restart: unless-stopped
  environment:
    MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
    MYSQL_DATABASE: ha_db
    MYSQL_USER: homeassistant
    MYSQL_PASSWORD: "${HA_MYSQL_PASSWORD}"
  user: "${LOCAL_USER}:${LOCAL_USER}"
  volumes:
    # Directory dove il database verrà salvato
    - <directory locale>:/var/lib/mysql
  ports:
    - "3306:3306"

Mosquitto

Mosquitto Configurazione Docker Compose

Mosquitto è un message broker che implementa MQTT

MQTT[1] (MQ Telemetry Transport or Message Queue Telemetry Transport) è un protocollo ISO standard (ISO/IEC PRF 20922)[2] di messaggistica leggero di tipo publish-subscribe posizionato in cima a TCP/IP. È stato progettato per le situazioni in cui è richiesto un basso impatto e dove la banda è limitata. Il pattern publish-subscribe richiede un message broker. Il broker è responsabile della distribuzione dei messaggi ai client destinatari.

Env Variables:

  • LOCAL_USER: (Opzionale) Mappa l’user con cui il docker verrà eseguito. Questo permette di modificare i files senza aver la necessità di essere utente root.

Configurazione

# Mosquitto
mosquitto:
  image: eclipse-mosquitto
  container_name: mosquitto
  restart: unless-stopped
  ports:
    - "1883:1883"
    - "9001:9001"
  volumes:
    # Directory dove tutte le configurazione di Mosquitto verranno salvate sul disco.
    - "./mosquitto/config:/mosquitto/config"
    # Directory dove tutti i dati di Mosquitto verranno salvati sul disco.
    - "./mosquitto/data:/mosquitto/data"
    # Directory dove tutti i log di Mosquitto verranno salvati sul disco.
    - "./mosquitto/log:/mosquitto/log"
  environment:
    - TZ=Europe/Rome
  user: "${LOCAL_USER}:${LOCAL_USER}"

Node-RED

Node-RED Configurazione Docker Compose

Node-Red è utile per l’automazione di determinati eventi in una casa smart. Dopo aver installato il container, si può installare il plugin per effettuare il collegamento tra Home Assistant e Node-RED.

Env Variables:

  • LOCAL_USER: (Opzionale) Mappa l’user con cui il docker verrà eseguito. Questo permette di modificare i files senza aver la necessità di essere utente root.

Nota:

  • Quando il container di Node-RED è in funzione, si potrà installare l’espansione di Home Assistant e connettere Node-RED a HA. Questo passaggio andrà effettuato solamente una volta, dopo di che le configurazione rimarranno salvate;
  • L’estensione di Home Assistant per Node-RED è node-red-contrib-home-assistant-websocket, e si può installare andando in “Manage Palette” del menù.

Configurazione

# Node-RED
nodered:
  container_name: nodered
  image: nodered/node-red
  ports:
    - "1880:1880"
  volumes:
    # Directory dove tutte le configurazione di Node-RED verranno salvate sul disco.
    - <directory locale>:/data
  depends_on:
    - homeassistant
  environment:
    TZ: "Europe/Rome"
  user: "${LOCAL_USER}:${LOCAL_USER}"
  restart: unless-stopped

AppDaemon

AppDaemon è un programma molto utile per creare piccoli script basati su python che si possono interfacciare con Home Assistant. AppDaemon per interagire con HA necessita di un “Long-Lived Access Tokens” che si può creare nel pagina del profilo di HA.

Env Variables:

  • SERVER_IP: URL di Home Assistant.
  • HA_APPDAEMON_KEY: Long lived access token generato in Home Assistant.
  • LOCAL_USER: (Opzionale) Mappa l’user con cui il docker verrà eseguito. Questo permette di modificare i files senza aver la necessità di essere utente root.

Configurazione

# AppDaemon
appdaemon:
  container_name: appdaemon
  restart: unless-stopped
  image: acockburn/appdaemon:latest
  environment:
    HA_URL: "http://${SERVER_IP}:8123"
    TOKEN: "${HA_APPDAEMON_KEY}"
    DASH_URL: "http://${SERVER_IP}:5050"
  ports:
    - "5050:5050"
  volumes:
    # Directory dove tutte le configurazione di AppDaemon verranno salvate sul disco.
    - <directory locale>:/conf
  depends_on:
    - homeassistant
  user: "${LOCAL_USER}:${LOCAL_USER}"

VS Code Server

Node-RED Configurazione Docker Compose

Tecnicamente non serve in nessun modo per configurare e installare Home Assistant, ma Visual Studio Code Server è uno dei modi migliori per aggiungere un IDE in remoto.

Quando il container è in funzione si ha la possibilità di avere un editor di testo nel browser e poter modificare i files semplicemente navigando nella cartella in cui risiede il file di configurazione da editare.

Env Variables:

  • VSCODE_PASSWORD: Password che si vuole usare per VS Code.

Configurazione

# Visual Studio code
vscode:
  container_name: vscode
  image: codercom/code-server
  volumes:
    # Directory <directory locale> che si vuole aprire in VS Code
    - <directory locale>:/home/coder/project
    # <vs code config> è la cartella dove i files di configurazione verranno salvati
    - <vs code config dir>:/home/coder/.local/share/code-server
  ports:
    - "8443:8080"
  command: code-server --auth password --disable-telemetry /home/coder/project
  environment:
    PASSWORD: "${VSCODE_PASSWORD}"
  restart: unless-stopped

Configurazione Completa

Per semplicità inserisco il file .env e docker-compose.yaml.

.env

SERVER_IP=0.0.0.0
HA_APPDAEMON_KEY=Long lived access token
VSCODE_PASSWORD=password
LOCAL_USER=1000
MYSQL_ROOT_PASSWORD=password
HA_MYSQL_PASSWORD=password

docker-compose.yaml

version: "3"
services:
# Home Assistant
homeassistant:
  container_name: home-assistant
  image: homeassistant/home-assistant
  volumes:
    # Directory dove verranno salvate le configurazioni di home assistant
    - <directory locale>:/config
    - /etc/localtime:/etc/localtime:ro
  restart: unless-stopped
  network_mode: host
  depends_on:
    # MariaDB opzionale (solo se si vuole utilizzare un database diverso per HA).
    - mariadb
    # Mosquitto opzionale (solo se serve un client mqtt)
    - mosquitto
# MariaDb
mariadb:
  image: mariadb/server:10.3
  container_name: mariadb
  restart: unless-stopped
  environment:
    MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
    MYSQL_DATABASE: ha_db
    MYSQL_USER: homeassistant
    MYSQL_PASSWORD: "${HA_MYSQL_PASSWORD}"
  user: "${LOCAL_USER}:${LOCAL_USER}"
  volumes:
    # Directory dove il database verrà salvato
    - <directory locale>:/var/lib/mysql
  ports:
    - "3306:3306"
# Mosquitto
mosquitto:
  image: eclipse-mosquitto
  container_name: mosquitto
  restart: unless-stopped
  ports:
    - "1883:1883"
    - "9001:9001"
  volumes:
    # Directory dove tutte le configurazione di Mosquitto verranno salvate sul disco.
    - "./mosquitto/config:/mosquitto/config"
    # Directory dove tutti i dati di Mosquitto verranno salvati sul disco.
    - "./mosquitto/data:/mosquitto/data"
    # Directory dove tutti i log di Mosquitto verranno salvati sul disco.
    - "./mosquitto/log:/mosquitto/log"
  environment:
    - TZ=Europe/Rome
  user: "${LOCAL_USER}:${LOCAL_USER}"
# Node-RED
nodered:
  container_name: nodered
  image: nodered/node-red
  ports:
    - "1880:1880"
  volumes:
    # Directory dove tutte le configurazione di Node-RED verranno salvate sul disco.
    - <directory locale>:/data
  depends_on:
    - homeassistant
  environment:
    TZ: "Europe/Rome"
  user: "${LOCAL_USER}:${LOCAL_USER}"
  restart: unless-stopped
# AppDaemon
appdaemon:
  container_name: appdaemon
  restart: unless-stopped
  image: acockburn/appdaemon:latest
  environment:
    HA_URL: "http://${SERVER_IP}:8123"
    TOKEN: "${HA_APPDAEMON_KEY}"
    DASH_URL: "http://${SERVER_IP}:5050"
  ports:
    - "5050:5050"
  volumes:
    # Directory dove tutte le configurazione di AppDaemon verranno salvate sul disco.
    - <directory locale>:/conf
  depends_on:
    - homeassistant
  user: "${LOCAL_USER}:${LOCAL_USER}"
# Visual Studio code
vscode:
  container_name: vscode
  image: codercom/code-server
  volumes:
    # Directory <directory locale> che si vuole aprire in VS Code
    - <directory locale>:/home/coder/project
    # <vs code config> è la cartella dove i files di configurazione verranno salvati
    - <vs code config dir>:/home/coder/.local/share/code-server
  ports:
    - "8443:8080"
  command: code-server --auth password --disable-telemetry /home/coder/project
  environment:
    PASSWORD: "${VSCODE_PASSWORD}"
  restart: unless-stopped