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_veloceemassa_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_camevmc_delta_parete_cmr(Min: 0, Max: 10, Step: 0.1)input_number.vmc_mold_score_cameraevmc_mold_score_cmr(Min: 0, Max: 200, Step: 1)input_number.vmc_trend_lungoevmc_ah_trend_1h(Min: -1, Max: 1, Step: 0.001)
Input Datetime (Data e Ora):
input_datetime.vmc_last_plateau_breakinput_datetime.vmc_last_mini_intakeinput_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_tempesensor.meteo_ext_humiditycon i dati della tua stazione meteo esterna. - Interno: Abbina
sensor.temp_sala,sensor.temp_camera,sensor.temp_camerettaai tuoi termometri (es.Aqara, Sonoff). - Entità VMC: Adatta
select.vmc_speedeselect.vmc_modein 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:
- Umidità assoluta esterna.
- Umidità assoluta della stanza peggiore (
ah_worst). - 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.