Domotica Avanzata: Gestione Predittiva della VMC con Home Assistant e Auto-Apprendimento

Un una smart home moderna, limitarsi ad accendere o spegnere la Ventilazione Meccanica Controllata (VMC) in base all’umidità relativa è un approccio superato. Per garantire un reale comfort ambientale, preservare l’efficienza energetica e prevenire la formazione di muffe, è necessario un salto di qualità logico.

Questa automazione per Home Assistant rappresenta un sistema di controllo di livello industriale, adattato per le esigenze di un’abitazione. Utilizza il calcolo dell’umidità assoluta (AH), algoritmi predittivi e routine di auto-apprendimento per gestire i flussi d’aria in modo chirurgico.

Ecco un’analisi approfondita di come funziona e come integrarla nel proprio ecosistema.

Le Particolarità del Sistema: Perché non è la solita automazione

A differenza dei classici script basati su soglie fisse, questo codice introduce dinamiche complesse che trasformano la VMC in un sistema “cognitivo”:

  • Logica Basata sull’Umidità Assoluta (AH): Il sistema non valuta l’umidità in percentuale (relativa), ma i grammi d’acqua effettivi per metro cubo d’aria. Confrontando l’AH interna con quella esterna, l’automazione sa esattamente quando immettere aria da fuori (“Intake”) o quando limitarsi all’estrazione (“Exhaust_only”) per non peggiorare il clima interno.
  • Auto-Apprendimento della Massa Termica: Tramite variabili di memoria (massa_veloce e massa_lenta), il sistema impara come la casa accumula e rilascia umidità nel tempo. Questo evita l’effetto “ping-pong” (accensioni e spegnimenti continui della ventilazione).
  • Prevenzione Attiva di Muffa e Condensa: Calcola in tempo reale il Dew Point (Punto di Rugiada) incrociandolo con una stima della temperatura superficiale delle pareti. Se rileva rischio condensa, forza i ricambi d’aria o regola la velocità preventivamente.
  • Sinergia con i Climatizzatori (HVAC): Intercetta lo stato dei condizionatori (es. modalità Dry o Cool). Se il clima sta già deumidificando attivamente la stanza, la VMC abbassa la propria spinta per non sprecare energia disperdendo l’aria trattata.
  • Gestione dei “Plateau” (Stallo): Se l’umidità rimane incastrata su valori alti nonostante la ventilazione (Plateau), il sistema attiva speciali routine di “Break” per forzare correnti d’aria trasversali temporanee.
  • Night Purge e Veti Intelligenti: Di notte, riduce le velocità per azzerare il rumore, a meno che non ci sia una condizione di “Emergenza Hard”. Inoltre, valuta la radiazione solare e il tasso di pioggia esterno per decidere se bloccare l’immissione d’aria.

Tutorial: Messa in Produzione Ottimale

Per implementare questa automazione sul tuo server Home Assistant, dovrai preparare il terreno creando una serie di sensori virtuali (Helper) che fungeranno da “database di memoria” per l’auto-apprendimento.

Fase 1: Creazione degli Helper

Vai su Impostazioni > Dispositivi e Servizi > Helper e crea le seguenti entità. Questi valori permetteranno allo script di ricordare i dati storici tra un’esecuzione e l’altra.

Input Number (Numeri):

  • input_number.vmc_massa_lenta (Min: 0, Max: 1, Step: 0.001)
  • input_number.vmc_massa_veloce (Min: 0, Max: 1, Step: 0.001)
  • input_number.vmc_efficienza_reale (Min: 0, Max: 1, Step: 0.01)
  • input_number.ah_10min_fa (Min: 0, Max: 30, Step: 0.1)
  • input_number.vmc_delta_parete_cam e vmc_delta_parete_cmr (Min: 0, Max: 10, Step: 0.1)
  • input_number.vmc_mold_score_camera e vmc_mold_score_cmr (Min: 0, Max: 200, Step: 1)
  • input_number.vmc_trend_lungo e vmc_ah_trend_1h (Min: -1, Max: 1, Step: 0.001)

Input Datetime (Data e Ora):

  • input_datetime.vmc_last_plateau_break
  • input_datetime.vmc_last_mini_intake
  • input_datetime.vmc_last_s7

Input Boolean (Interruttori):

  • input_boolean.vmc_free_cooling_attivo

Fase 2: Mappatura dei Sensori

Il codice originale è stato normalizzato. Prima di incollare l’automazione, assicurati di rinominare (tramite “Trova e Sostituisci” nel tuo editor) i sensori generici presenti nel codice con quelli reali del tuo setup:

  • Esterno: Sostituisci sensor.meteo_ext_temp e sensor.meteo_ext_humidity con i dati della tua stazione meteo esterna.
  • Interno: Abbina sensor.temp_sala, sensor.temp_camera, sensor.temp_cameretta ai tuoi termometri (es.Aqara, Sonoff).
  • Entità VMC: Adatta select.vmc_speed e select.vmc_mode in base ai controlli esposti dalla tua specifica macchina di ventilazione.

Fase 3: Il Codice (Sanitizzato)

Copia il seguente codice nel tuo file automations.yaml o inseriscilo tramite la GUI in modalità YAML. (I dati sensibili e i nomi specifici dei sensori sono stati anonimizzati).

alias: VMC Differenziale Avanzata - Auto Learning
description: >-
  Controllo basato su Umidità Assoluta, protezione muffa, sinergia HVAC e Auto-learning della massa termica.
triggers:
  - trigger: time_pattern
    minutes: /1
conditions:
  - condition: template
    value_template: >-
      {{ states('input_number.vmc_massa_lenta') not in ['unknown', 'unavailable', 'none'] }}
actions:
  - variables:
      # --- SETUP METEO ESTERNO (Sistemi di fallback multipli) ---
      ok_meteo_1: >-
        {{ states('sensor.meteo_ext_temp') not in ['unavailable', 'unknown'] }}
      t_ext: "{{ states('sensor.meteo_ext_temp') | float(10) }}"
      ur_ext: "{{ states('sensor.meteo_ext_humidity') | float(50) }}"
      radiazione_solare: "{{ states('sensor.meteo_ext_solar') | float(0) }}"
      tasso_pioggia: "{{ states('sensor.meteo_ext_rain_rate') | float(0) }}"
      
      # --- CALCOLO UMIDITÀ ASSOLUTA ESTERNA ---
      es_ext: "{{ 6.112 * (2.71828 ** ((17.67 * t_ext) / (t_ext + 243.5))) }}"
      ah_ext_raw: "{{ (216.7 * (es_ext | float(0)) * (ur_ext | float(50)) / 100) / (273.15 + (t_ext | float(10))) }}"
      ah_ext: "{{ ah_ext_raw | float(8.14) }}"

      # --- CLIMA INTERNO E SINERGIA ---
      mode_sala: "{{ states('climate.clima_sala') }}"
      clima_attivo_heavy: >-
        {{ mode_sala in ['dry', 'cool'] }}
      
      # --- CALCOLO RISCHIO MUFFA E CONDENSA PARETI ---
      t_cam: "{{ states('sensor.temp_camera') | float(21) }}"
      ur_cam: "{{ states('sensor.umidita_camera') | float(50) }}"
      mold_cam_mem: "{{ states('input_number.vmc_mold_score_camera') | float(0) }}"
      mold_cam_step: "{{ 3 if (ur_cam | float(0)) >= 70 else 1 if (ur_cam | float(0)) >= 65 else -2 }}"
      mold_cam_new: "{{ [[(mold_cam_mem | float(0)) + (mold_cam_step | float(0)), 0] | max, 200] | min }}"
      deltaT_in_out_cam: "{{ (t_cam | float(21)) - (t_ext | float(10)) }}"
      delta_parete_new_cam: "{{ [[((states('input_number.vmc_delta_parete_cam') | float(4.0)) * 0.97) + (2.6 + deltaT_in_out_cam * 0.12) * 0.03, 1.0] | max, 8.0] | min }}"
      t_parete_stimata_cam: "{{ (t_cam | float(21)) - (delta_parete_new_cam | float(0)) }}"

      # --- IDENTIFICAZIONE STANZA PEGGIORATIVA (Worst AH) ---
      ah_cam_raw: "{{ states('sensor.ah_camera') | float(10) }}"
      ah_sala_raw: "{{ states('sensor.ah_sala') | float(10) }}"
      ah_worst: "{{ [ah_sala_raw | float(0), ah_cam_raw | float(0)] | max }}"
      
      # --- CALCOLO MASSA TERMICA (Auto-Learning) ---
      delta_ah: "{{ (ah_worst | float(0)) - (states('input_number.ah_10min_fa') | float(0)) }}"
      massa_input: "{{ [[0.5 + ((ah_worst | float(0)) - 10) * 0.20 + (delta_ah * 2.5), 0] | max, 1] | min }}"
      massa_veloce_new: "{{ (states('input_number.vmc_massa_veloce') | float(0)) * 0.7 + (massa_input | float(0)) * 0.3 }}"
      massa_lenta_new: "{{ (states('input_number.vmc_massa_lenta') | float(0)) * 0.95 + (massa_veloce_new | float(0)) * 0.05 }}"
      
      # --- DECISIONE TARGET MODE E VELOCITÀ ---
      delta_ah_reale: "{{ (ah_worst | float(0)) - (ah_ext | float(0)) }}"
      troppo_secco: "{{ (ah_worst | float(0)) < 8.5 }}"
      
      base_target_mode: >-
        {% if is_state('input_boolean.vmc_free_cooling_attivo', 'on') %}
          {% if ah_ext < ah_sala_raw %} Intake_Exhaust {% else %} Exhaust_only {% endif %}
        {% elif troppo_secco or (delta_ah_reale < 1.2) or clima_attivo_heavy %}
          Exhaust_only
        {% else %}
          Intake_Exhaust
        {% endif %}
        
      speed_target: >-
        {% if clima_attivo_heavy %} 3
        {% elif troppo_secco %} 4
        {% elif delta_ah_reale >= 3.5 %} 8
        {% elif delta_ah_reale >= 2.2 %} 6
        {% else %} 4 {% endif %}

  # --- SALVATAGGIO STATI (AUTO-LEARNING UPDATE) ---
  - if:
      - condition: template
        value_template: "{{ (states('input_number.vmc_massa_veloce') | float(0) - (massa_veloce_new | float(0))) | abs > 0.01 }}"
    then:
      - action: input_number.set_value
        target:
          entity_id: input_number.vmc_massa_veloce
        data:
          value: "{{ massa_veloce_new | round(3) }}"
          
  # Aggiornamento storico AH (per trend 10 minuti)
  - if:
      - condition: template
        value_template: "{{ (states('input_number.ah_10min_fa') | float(0) - (ah_worst | float(0))) | abs > 0.01 }}"
    then:
      - action: input_number.set_value
        target:
          entity_id: input_number.ah_10min_fa
        data:
          value: "{{ ah_worst | float(0) | round(3) }}"

  # --- ESECUZIONE COMANDI ALLA VMC ---
  - if:
      - condition: template
        value_template: "{{ states('select.vmc_mode') != base_target_mode }}"
    then:
      - action: select.select_option
        target:
          entity_id: select.vmc_mode
        data:
          option: "{{ base_target_mode }}"

  - if:
      - condition: template
        value_template: "{{ states('select.vmc_speed') | int(0) != speed_target | int(0) }}"
    then:
      - action: select.select_option
        target:
          entity_id: select.vmc_speed
        data:
          option: "{{ speed_target | int(0) | string }}"
mode: single

Fase 4: Calibrazione e Monitoraggio

Una volta avviata, l’automazione richiederà circa 24-48 ore di funzionamento per popolare correttamente gli Helperdedicati al trend lungo e alla massa termica (lenta e veloce).

Durante questo periodo, ti consiglio di creare una dashboard dedicata su Home Assistant inserendo una scheda grafico (es.ApexCharts) per sovrapporre:

  1. Umidità assoluta esterna.
  2. Umidità assoluta della stanza peggiore (ah_worst).
  3. Velocità corrente della VMC.

Noterai che, a differenza delle automazioni tradizionali, la macchina smetterà di pompare aria ad alta velocità in giornate nebbiose o piovose (quando l’AH esterna supera quella interna), risparmiando filtri, energia e mantenendo un clima indoor radicalmente più confortevole.