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
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
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
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 è 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 è 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
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