Perché monitoro anche la macchina, non solo la casa

Il mio Home Assistant gira in Docker su un mini PC Windows che resta acceso giorno e notte. Se il PC ha un problema, l'intero impianto tace, e il primo a non poterlo dire è proprio Home Assistant. Per questo la prima scheda del mio dashboard SRV-HOME si chiama «Mini PC» e risponde a una sola domanda: come sta la macchina?

Questa guida racconta come è costruita: la preparazione di Windows perché non si spenga mai, i due programmi che leggono i sensori, le soglie degli avvisi, il controllo esterno che scatta quando il PC sparisce del tutto e l'accesso da fuori casa. Se ti manca la base, parti dalla guida all'installazione con Docker su Windows.

Passo 1: il PC non deve mai spegnersi

Un server di casa che va in sospensione porta con sé anche Home Assistant. Il mio script di setup toglie tutto quello che può addormentare la macchina: sospensione, ibernazione, spegnimento del disco e dello schermo, tasto di accensione e coperchio, risparmio energetico di USB e PCIe, e persino il risparmio energetico delle schede di rete. Sono le impostazioni di powercfg, lo strumento da riga di comando di Windows.

powercfg /setactive SCHEME_MIN          # Prestazioni elevate
foreach ($t in 'standby-timeout', 'hibernate-timeout', 'disk-timeout', 'monitor-timeout') {
    powercfg /change "$t-ac" 0
    powercfg /change "$t-dc" 0
}
powercfg /hibernate off                 # niente ibernazione, niente Avvio rapido

# Schede di rete: Windows non deve spegnerle per risparmiare energia
Get-NetAdapter -Physical | ForEach-Object {
    try { Disable-NetAdapterPowerManagement -Name $_.Name -NoRestart -ErrorAction Stop } catch { }
}

# Se va in blue screen, riavvia da solo
Set-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl' -Name AutoReboot -Value 1 -Type DWord

# Windows Update: niente riavvii automatici con un utente collegato
$au = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU'
New-Item $au -Force | Out-Null
Set-ItemProperty $au -Name NoAutoRebootWithLoggedOnUsers -Value 1 -Type DWord

# Rete "Privata": il firewall di Windows è più severo con le reti "Pubbliche"
Get-NetConnectionProfile | Set-NetConnectionProfile -NetworkCategory Private

Lo script è pensato per essere rilanciato senza fare danni: applica sempre gli stessi valori.

Passo 2: dopo un riavvio, Docker e i container ripartono da soli

Docker Desktop su Windows parte solo quando un utente ha fatto il login. Un PC che si riavvia da solo di notte, senza nessuno davanti, resterebbe con Home Assistant spento. Metto insieme tre pezzi, ognuno copre un caso diverso.

  • Restart policy unless-stopped su tutti i container: se il motore Docker parte, i container ripartono con lui. Vedi la documentazione sull'avvio automatico dei container.
  • Login automatico con Autologon di Sysinternals: la password viene chiesta in una finestra mascherata e salvata cifrata dallo strumento, non finisce in nessun file dello script.
  • Un controllo ogni cinque minuti (attività pianificata): se il motore Docker non risponde, avvia Docker Desktop e aspetta fino a cinque minuti che torni su, scrivendo tutto in un registro.
# docker-watchdog.ps1: lanciato al logon e ogni 5 minuti
$log = 'C:\srv-home\logs\docker-watchdog.log'
function Log($m) { "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')  $m" | Add-Content $log }
function DockerOk { try { $null = docker info 2>&1; return ($LASTEXITCODE -eq 0) } catch { return $false } }

if (-not (DockerOk)) {
    if (-not (Get-Process 'Docker Desktop' -ErrorAction SilentlyContinue)) {
        Log 'Docker Desktop non in esecuzione: lo avvio'
        Start-Process "$env:ProgramFiles\Docker\Docker\Docker Desktop.exe"
    }
    $ok = $false
    for ($i = 0; $i -lt 60; $i++) { Start-Sleep 5; if (DockerOk) { $ok = $true; break } }
    if ($ok) { Start-Sleep 20; Log "Docker pronto, container in esecuzione: $(@(docker ps -q).Count)" }
    else     { Log 'ERRORE: Docker non risponde dopo 5 minuti' }
}

Passo 3: i due programmi che leggono i sensori

Home Assistant non legge da solo temperature e carichi di Windows. Uso due programmi gratuiti, ognuno per quello che sa fare meglio.

  • Libre Hardware Monitor legge temperature, carico, consumi e la salute dell'SSD, oltre al traffico della scheda di rete. Espone i dati sulla porta 8085 e Home Assistant li legge con l'integrazione Libre Hardware Monitor. Lo installo con winget, insieme al driver PawnIO che serve per i sensori della scheda madre. Al primo avvio ha una configurazione da fare a mano dalle sue opzioni, compreso l'avvio del server web.
  • Glances dà uptime, RAM, swap, dischi e rete, sulla porta 61208, letti con l'integrazione Glances. Lo installo in un ambiente virtuale Python e lo lancio come attività pianificata all'avvio del PC, con l'account di sistema, con riavvio automatico se cade.
# Libre Hardware Monitor + driver per i sensori della scheda madre
winget install --id LibreHardwareMonitor.LibreHardwareMonitor -e --silent --accept-package-agreements --accept-source-agreements
winget install PawnIO --silent --accept-package-agreements --accept-source-agreements

# Glances in un ambiente virtuale, con interfaccia web
& "$env:ProgramFiles\Python312\python.exe" -m venv C:\srv-home\glances-venv
& C:\srv-home\glances-venv\Scripts\python.exe -m pip install --upgrade pip "glances[web]"
# attività pianificata all'avvio:  glances.exe -w -B 0.0.0.0 -t 5

Le due porte sono aperte sul firewall di Windows solo per la rete locale (o per il solo indirizzo di Home Assistant, se gira su un altro computer: se gira nello stesso PC, come nel mio caso, non va indicato). Nessuna delle due deve mai essere raggiungibile da Internet.

Le integrazioni si aggiungono poi da Impostazioni, Dispositivi e servizi, indicando l'indirizzo del mini PC e le due porte. I nomi delle entità nascono dal nome della macchina e dei componenti, quindi i tuoi saranno diversi dai miei: copia sempre quelli che vedi nel tuo elenco entità.

La scheda «Mini PC» del dashboard

La scheda è organizzata in tre colonne, ognuna una pila di riquadri.

  • Colonna 1: una striscia di stato (acceso da, CPU, temperatura, RAM, disco), l'elenco della rete Ethernet (download, upload, utilizzo, totali) e il grafico delle ultime 24 ore.
  • Colonna 2: i grafici di CPU e RAM e quelli delle temperature di processore e SSD nelle ultime 24 ore.
  • Colonna 3: il riquadro «Sistema» (consumo del processore, RAM usata e disponibile, swap) e quello dell'SSD con temperatura, vita residua, spazio libero, attività, lettura, scrittura, dati scritti in totale e ore di accensione.

Per avere tre colonne esplicite uso la vista a sezioni con max_columns: 3. Nel riquadro dell'SSD trovo anche la vita residua e i dati scritti in totale: su un disco che lavora sempre (cronologia, log, backup) sono i numeri che dicono quando pensare a sostituirlo.

Gli avvisi: le soglie che uso

Ogni avviso passa dallo stesso script, così il canale di consegna si sceglie in un posto solo (ne parlo nella guida sui messaggi e le notifiche). Ogni automazione ha anche un intervallo minimo tra due invii uguali, per non riempire il telefono.

  • Temperatura CPU sopra 85 °C per almeno 5 minuti (al massimo un avviso ogni 3 ore).
  • Temperatura SSD sopra 70 °C per almeno 5 minuti (al massimo uno ogni 6 ore).
  • Disco pieno oltre il 90% per 10 minuti (al massimo uno al giorno).
  • RAM oltre il 90% per 10 minuti (al massimo uno ogni 6 ore).
  • Monitoraggio muto: se i sensori di Libre Hardware Monitor o di Glances restano non disponibili per 10 minuti, un avviso lo segnala.
  • Riavvio del mini PC: un avviso parte quando Home Assistant si avvia.
- alias: Avviso temperatura CPU alta
  id: avv_temp_cpu
  triggers:
    - trigger: numeric_state
      entity_id: sensor.NOME_SENSORE_TEMPERATURA_CPU
      above: 85
      for: "00:05:00"
  conditions:
    - condition: template
      value_template: "{{ this.attributes.last_triggered is none or (now() - this.attributes.last_triggered).total_seconds() > 10800 }}"
  actions:
    - action: script.avviso
      data:
        titolo: "Temperatura CPU alta"
        messaggio: "CPU del mini PC: {{ states('sensor.NOME_SENSORE_TEMPERATURA_CPU') | float(0) | round(0) | int }} °C da oltre 5 minuti."

Il trucco è nella condizione: last_triggered permette di dire «non più di un avviso ogni tre ore» senza creare nessun contatore. Sostituisci il nome del sensore con quello della tua macchina.

Se il PC si spegne davvero: il controllo da fuori

Un avviso di Home Assistant non arriva se Home Assistant non c'è più. Serve qualcuno esterno che si accorga del silenzio. Uso Healthchecks.io (il piano gratuito basta): un servizio che si aspetta un «battito» a intervalli regolari e, se smette di arrivare, scrive lui.

I controlli sono due, così capisco cosa è caduto:

  • PC: un'attività pianificata di Windows batte ogni minuto. Vuol dire che il PC è acceso e ha Internet.
  • HA: Home Assistant batte ogni minuto con un'automazione. Vuol dire che Docker e Home Assistant funzionano.

Se cade solo «HA», il PC è acceso ma Docker o Home Assistant sono fermi. Se cadono entrambi, il PC è spento oppure manca Internet in casa. Gli indirizzi di battito sono da trattare come segreti: chi li conosce può mandare battiti falsi. Per questo il mio script li chiede in una finestra mascherata, sul PC li salva cifrati con DPAPI (leggibili solo dal mio utente) e in Home Assistant li mette in secrets.yaml.

rest_command:
  heartbeat_ha:
    url: !secret heartbeat_ha_url
    method: get
    timeout: 15

automation:
  - alias: Battito verso il controllo esterno
    id: heartbeat_ha
    triggers:
      - trigger: time_pattern
        minutes: "/1"
    actions:
      - action: rest_command.heartbeat_ha
        continue_on_error: true

Accesso da fuori casa con Tailscale

Per raggiungere Home Assistant e il PC quando sono fuori casa non apro nessuna porta sul router. Uso Tailscale, una rete privata tra i miei dispositivi. Un secondo script di configurazione controlla e sistema tre cose sul mini PC.

  1. Tailscale come servizio: installato, con avvio automatico e accesso già fatto. Deve girare anche in modalità «senza utente collegato» (unattended), altrimenti dopo un riavvio il PC sparisce dalla rete finché qualcuno non fa il login.
  2. Desktop remoto attivo con autenticazione a livello di rete, e con la regola del firewall ristretta alla rete locale e agli indirizzi Tailscale (100.64.0.0/10): dall'esterno non si raggiunge in nessun altro modo. Serve Windows 11 Pro, lo script salta il passo su Windows Home.
  3. Una regola per Home Assistant (porta 8123) e per il controller Wi-Fi (porta 8043), ammessa solo dagli indirizzi Tailscale.

Alla fine lo script stampa il nome e l'indirizzo Tailscale del mini PC, e cosa provare da un altro dispositivo collegato alla stessa rete Tailscale.

Ora che il mini PC è sotto controllo, il passo successivo è farsi mandare i dati della rete Wi-Fi: lo racconto nella guida su Omada e gli access point.