# domotica-iot — stack Zigbee/MQTT/Home Assistant Stack Docker per il progetto domotica di Mauro — vedi `archivio/Mauro/progetto-domotica-iot.md` per il ragionamento architetturale completo (perché il broker, perché ZHA scartato, modello per sensori ad alta urgenza). **⚠️ I dati runtime vivono FUORI da questa cartella**: `docker-compose.yml` qui presente (dentro `Dropbox/adrian/`, sincronizzato) monta i volumi da `/mnt/ssd/config/domotica-iot/` (fuori da Dropbox), stessa convenzione già in uso per Guacamole/Jellyfin/Portainer (`/mnt/ssd/config//`). Solo `docker-compose.yml`, `.env`, `.gitignore`, questo file restano qui. **Perché**: il primo tentativo (28/08/2026) teneva mosquitto/data, zigbee2mqtt/data, homeassistant/config, influxdb/data dentro questa cartella Dropbox-sincronizzata — database che cambiano ogni pochi secondi, Dropbox ha provato a sincronizzarli in continuo, `dropbox exclude` si è dimostrato inaffidabile in quella sessione (creava ripetutamente cartelle "Conflitto di sincronizzazione selettiva" invece di escludere pulito, anche su cartelle vuote appena create). Risolto spostando tutto fuori dall'albero Dropbox invece di continuare a inseguire il comportamento di `dropbox exclude`. **Per ogni futuro servizio Docker con stato che cambia spesso**: partire direttamente con `/mnt/ssd/config//`, non mettere mai stato runtime dentro una cartella sincronizzata Dropbox, nemmeno temporaneamente. ## Servizi ``` dongle USB (Sonoff Zigbee 3.0 Plus V2, chip Ember) → zigbee2mqtt → Mosquitto → Home Assistant ``` - **mosquitto** (`eclipse-mosquitto:2`) — broker MQTT, autenticato (utente in `.env`, mai committato). Log su stdout (`docker logs domotica-mosquitto`), non su file — evita problemi di permessi tra l'utente host e l'utente `mosquitto` (uid 1883) dentro il container. - **zigbee2mqtt** (`koenkk/zigbee2mqtt:latest`) — traduce la radio Zigbee in messaggi MQTT. Frontend su `127.0.0.1:8080` (solo locale). Dongle montato via path stabile `/dev/serial/by-id/...`, mai `/dev/ttyUSB0` diretto (può cambiare a ogni riavvio). - **homeassistant** (`ghcr.io/home-assistant/home-assistant:stable`) — `network_mode: host` (necessario per la discovery mDNS/SSDP). Su `127.0.0.1:8123`, solo locale. Warning innocuo nei log su Bluetooth (permessi mancanti nel container) — non ci serve, non aggiunte capacità extra apposta. ## Sicurezza - Nessuna porta pubblicata oltre `127.0.0.1` — tutto raggiungibile solo dalla Nave stessa (via Guacamole per l'accesso browser). - `ufw` di sistema è `deny` di default in entrata — protegge comunque anche `homeassistant` (network host) senza bisogno di regole aggiuntive, finché non si decide di aprire l'accesso remoto via WireGuard. - Credenziali MQTT in `.env` (gitignored), mai in chiaro nei file versionati. ## Sensori accoppiati (28/08/2026) 3x SONOFF SNZB-02P (temperatura/umidità), nomenclatura decisa prima dell'accoppiamento: - `cameretta` - `sala` - `camera_letto` Ognuno espone `sensor._temperature`, `sensor._humidity`, `sensor._battery` via MQTT discovery automatica in HA. ## Ritenzione lunga — InfluxDB (28/08/2026) `[CONFERMATO]` — aggiunto `influxdb:2` allo stack, collegato a Home Assistant via la sua integrazione nativa (`configuration.yaml`), filtrata sui tre sensori (`entity_globs: sensor.cameretta_*`, `sensor.sala_*`, `sensor.camera_letto_*`). Credenziali in `.env` (token anche in `/mnt/ssd/config/domotica-iot/homeassistant/config/secrets.yaml`). Bucket `domotica`, retention "infinite" (rivedibile in futuro senza perdita, InfluxDB 2.x permette di cambiare la retention di un bucket a caldo). **⚠️ Gotcha reale, causa di ~20 minuti di debug**: rinominare un dispositivo in zigbee2mqtt (`bridge/request/device/rename`, `{"from":..,"to":..}`) **non rinomina l'entity_id dentro Home Assistant** a meno di passare esplicitamente `"homeassistant_rename": true` nel payload — altrimenti la risposta del bridge lo conferma con `"homeassistant_rename":false"` e HA tiene l'entity_id vecchio (basato sull'indirizzo IEEE, es. `sensor.0xc09b9efffef4fa80_temperature`), anche se il *topic* MQTT e il friendly_name nel frontend z2m sono già quelli nuovi. Un filtro `entity_globs` scritto sul nome "giusto" quindi non matcha nulla, senza errori visibili — sembra tutto configurato bene ma zero dati passano. **Fix applicato** (i tre sensori erano già stati rinominati senza il flag, quindi il rename-with-flag non era più applicabile): stop di HA, editato a mano `.storage/core.entity_registry` (JSON) sostituendo il campo `entity_id` (non `unique_id`, che resta l'identificativo tecnico stabile) dall'indirizzo IEEE al nome friendly, poi riavviato. **Per ogni prossimo dispositivo**: rinominare in zigbee2mqtt passando direttamente `"homeassistant_rename": true` nel payload di rename, per evitare di dover rifare questa correzione manuale. ## Backup `/mnt/ssd/config/domotica-iot/` è dentro `/mnt/ssd`, quindi già coperto automaticamente dal backup restic esistente (`backup_completo.sh`, nessuna esclusione lo tocca) — nessuna configurazione aggiuntiva necessaria, verificato con un run manuale il 28/08/2026. ## ⚠️ Gotcha reale — configuration.yaml resettato ai default dopo la migrazione (28/08/2026) Scoperto chiedendo "i sensori funzionano?": **non funzionavano più**. La migrazione fuori da Dropbox (vedi sopra, incidente di sincronizzazione) aveva lasciato indietro il vero `zigbee2mqtt/data/configuration.yaml` (porta seriale, chiave di rete reale, `homeassistant: enabled: true`, i 3 dispositivi mappati) nella vecchia cartella `sandbox/domotica-iot/` — mai ripulita. Alla nuova posizione (`/mnt/ssd/config/domotica-iot/`), il file era stato rigenerato ai valori di default (`serial: {}` vuoto, `homeassistant: enabled: false`, `onboarding: true`) — probabile che zigbee2mqtt lo abbia rigenerato trovando la cartella dati vuota di quel file specifico al primo avvio dopo la migrazione. Il database dei dispositivi (`database.db`) era invece stato copiato correttamente, quindi il bridge "sapeva" dei 3 sensori ma non poteva comunicare col dongle (porta seriale vuota) — nessun errore visibile, solo log "Onboarding page is available" invece del normale avvio. **Fix**: recuperato il `configuration.yaml` corretto dalla vecchia cartella `sandbox/` (mai cancellata, per fortuna), copiato alla posizione attuale (`sudo cp`, i file sono owned da root dentro il bind-mount Docker), riavviato il container. Rete Zigbee ripresa istantaneamente ("resumed", chiave di rete combaciante), tutti e 3 i sensori subito online con dati freschi. Verificato fino in fondo alla catena: dati confermati di nuovo in InfluxDB pochi minuti dopo. **Da fare per chiudere il thread per bene**: cancellare la cartella `sandbox/domotica-iot/` residua (conteneva ancora tutti i vecchi dati pre-migrazione, incluse copie `configuration_backup_v1..v4.yaml`) solo dopo aver verificato che tutto il resto del contenuto lì dentro non serva più — non fatto in questa sessione per prudenza, non toccare senza riverificare cosa contiene. ## Da fare - Modello sensori alta urgenza (intrusione) — script dedicato che legge da MQTT, non un'automazione HA, vedi progetto principale.