Monitoriamo la qualità dell’aria in Home Assistant grazie al Sensore ENS160 + AHT21, programmandolo in ESPHome e connettendolo ad una ESP32
L’ENS160 è un sensore avanzato per la rilevazione della qualità dell’aria indoor sviluppato da ScioSense. Utilizza una tecnologia di tipo MOX multicanale progettata per offrire misure stabili e una maggiore selettività verso diversi composti organici volatili. È pensato per applicazioni come monitoraggio ambientale, dispositivi domotici, purificatori d’aria intelligenti, sistemi HVAC e qualunque soluzione IoT in cui sia necessario valutare rapidamente la salubrità dell’ambiente. La sua capacità di elaborare internamente i dati e restituire parametri già compensati lo rende particolarmente adatto a microcontrollori con risorse limitate come quelli impiegati nei classici progetti ESPHome basati su ESP32. Alla prima accensione del sensore ENS160, si verifica un ritardo di 1 ora prima che le letture siano disponibili. Per i successivi avvii o riavvii, è necessario un periodo di riscaldamento di 3 minuti prima che le letture siano disponibili. Si noti inoltre che l’ENS160 può impiegare fino a 1 secondo prima che le misurazioni successive siano pronte.
- Acquistalo su Amazon: https://amzn.to/4ph9RRy
- Acquistalo su Aliexpress: https://s.click.aliexpress.com/e/_c3qCMZ3n
Specifiche tecniche
L’ENS160 è un sensore digitale di qualità dell’aria basato su tecnologia MOX multicanale sviluppata da ScioSense. Al suo interno integra quattro micro-hotplate indipendenti, rivestiti con film sensibili differenti, che permettono di rilevare varie famiglie di composti organici volatili e stimare parametri derivati come TVOC, eCO₂ e l’indice AQI. L’elaborazione non è demandata al microcontrollore esterno, poiché il sensore contiene un processore integrato che gestisce in autonomia compensazioni, curve di risposta, diagnostica interna e conversioni, offrendo così valori già filtrati e stabilizzati senza richiedere risorse significative al sistema host.

Il dispositivo comunica tramite interfaccia digitale I²C, con indirizzo predefinito 0x53, oppure tramite SPI quando utilizzato nella versione “chip-level”, dove tutti i pin sono esposti. Nei moduli commerciali l’I²C è quasi sempre l’unica interfaccia attiva, e i pin principali includono alimentazione, SDA e SCL. Accanto a questi possono essere presenti alcuni pin ausiliari che consentono funzioni aggiuntive: il pin ADR permette di modificare l’indirizzo I²C del sensore per evitare conflitti quando più dispositivi condividono il bus; il pin INT è una linea di interrupt utilizzata per segnalare all’host eventi interni del sensore, come la disponibilità di nuovi dati o stati diagnostici rilevanti; il pin CS, infine, è il chip-select ed entra in gioco solo quando si utilizza l’interfaccia SPI, permettendo all’ESP32 (o a qualsiasi microcontrollore esterno) di selezionare l’ENS160 durante la comunicazione seriale sincrona.

L’architettura interna del sensore è basata su una doppia alimentazione: una sezione digitale che opera a tensioni comprese fra 1,8V e 3,6V e una sezione dedicata ai micro-hotplate che può essere alimentata fino a 5V. Nei moduli breakout questa complessità è normalmente gestita tramite regolatori e circuiti di livello già integrati, per cui fornire un’unica alimentazione a 3,3V è sufficiente per alimentare correttamente sia la logica sia gli elementi riscaldanti.

Per quanto riguarda i consumi, il sensore presenta valori molto diversi a seconda della modalità operativa. Il chip ENS160 in modalità low-power o standby consuma tipicamente dell’ordine di poche centinaia di microampere, raggiungendo valori intorno ai 150 µA quando il micro-hotplate è disattivato. Nelle modalità operative complete, invece, dove il riscaldatore MOX è attivo e vengono eseguite misure continue, il consumo reale è determinato principalmente dalla richiesta energetica degli hotplate. Nei moduli commerciali in configurazione standard si osservano assorbimenti dell’ordine di 25–30 mA, valori perfettamente compatibili con sistemi IoT alimentati in continua. Questa distinzione è fondamentale: il chip nudo può consumare pochissimo in applicazioni ottimizzate, mentre un modulo pronto all’uso presenta tipicamente consumi più elevati e molto più costanti. L’ENS160 esprime al meglio le sue capacità quando riceve dall’esterno dati di temperatura e umidità, forniti ad esempio da un sensore come AHT21 o SHT31, poiché il processore interno utilizza tali informazioni per migliorare la stabilità e la precisione delle misure VOC.

Grazie alla combinazione di analisi multicanale, logica integrata, protocolli digitali e consumi modulabili, l’ENS160 trova impiego in dispositivi di monitoraggio ambientale domestico, purificatori intelligenti, unità HVAC, stazioni IoT, dispositivi portatili e sistemi di automazione dedicati al controllo della qualità dell’aria in ambienti chiusi.
Collegamenti
Il collegamento dell’ENS160 a una ESP32 è semplice grazie all’interfaccia I²C. È sufficiente collegare il pin SDA del sensore al GPIO21 impostato come SDA sull’ESP32 e il pin SCL al relativo GPIO22. L’alimentazione dipende dal modulo: nelle versioni più diffuse lo stadio di regolazione è già integrato e il sensore può essere alimentato direttamente a 3,3V o 5V.

Codice
Andiamo a creare un nuovo device su ESPHome e chiamiamolo ENS160. Saltiamo per il momento la connessione e selezioniamo la scheda che dobbiamo programmare (ESP32).

Una volta creato, clicchiamo su EDIT per modificare il codice.

Questo è il codice per configurare una ESP32 per leggere i dati da un sensore ENS160 e inviarli a Home Assistant tramite ESPHome. Il dispositivo sarà accessibile in rete tramite Wi-Fi e potrà essere aggiornato via OTA (Over-The-Air) senza bisogno di connessione fisica. Potete scaricarlo a questo LINK.
All’inizio, il codice definisce il nome del dispositivo, sia quello tecnico (“ens160”) che quello più leggibile per Home Assistant (“ENS160”).
esphome:
name: ens160
friendly_name: ENS160
Poi si specifica che il microcontrollore utilizzato è un ESP32 e che il firmware verrà compilato usando il framework Arduino, che è più semplice e supportato rispetto ad altre alternative come ESP-IDF.
esp32:
board: esp32dev
framework:
type: arduino
Il codice attiva il logger, che serve a registrare gli eventi e inviare messaggi di debug. Inoltre, viene attivata l’API di ESPHome, che permette a Home Assistant di comunicare con il dispositivo in modo sicuro grazie a una chiave di crittografia.
logger:
api:
encryption:
key: "dUu0mK8qCAjtQ1h0v3Ocngj9dmf4MblQo5cbjVK+BKs="
Per evitare di dover collegare il dispositivo fisicamente ogni volta che si vuole aggiornare il firmware, viene attivata la modalità OTA (Over-The-Air), con una password di sicurezza.
ota:
- platform: esphome
password: "cc3a1ad98c443b287d4cb838a7cc002e"
Per collegarsi alla rete, il codice usa le credenziali Wi-Fi salvate nei secrets di ESPHome (file separato non visibile nel codice). Se la connessione fallisce, il dispositivo crea un hotspot Wi-Fi di emergenza (“Ens160 Fallback Hotspot”) con una password predefinita, in modo che sia possibile riconfigurarlo. Inoltre, è presente la funzione captive portal, che permette di riconfigurare il Wi-Fi direttamente da un browser in caso di problemi di connessione.
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "Ens160 Fallback Hotspot"
password: "YJ4OQkv7AvXI"
captive_portal:
Trattandosi di un sensore che lavora su interfaccia I2C, questa sezione configura la comunicazione I2C tra l’ESP32 ed il sensore ENS160, impostando il pin GPIO21 dell’ESP32 come linea SDA ed il pin GPIO22 come linea SCL. La funziona scan abilita la scansione automatica dei dispositivi connessi al bus I2C, verificando quali dispositivi I2C sono collegati e il loro indirizzo.
i2c:
sda: 21
scl: 22
scan: true
Interroghiamo il sensore affinché abiliti il driver AHT21, creando due sensori, uno per temperatura ed uno per umidità, indicando il corretto indirizzo (0x38). Sarà fondamentale creare due id, uno per la temperatura e uno per l’umidità, affinché fungano da base per l’elaborazione dei rilevamenti dell’ENS160. In alternativa, usando un differente sensore di temperatura e umidità, possiamo adoperare quest’ultimo invece dell’AHT21 integrato nel modulo.
sensor:
- platform: aht10
address: 0x38
temperature:
id: aht21_temperature
name: "Temperatura AHT21"
humidity:
id: aht21_humidity
name: "Umidità AHT21"
update_interval: 5s
Il sensore viene integrato impostando la comunicazione con I2C, definendo poi le misurazione per AQI, CO2 e TVOC. AQI sta per Air Quality Index ed è un valore standardizzato da 1 a 5, usando il formato europeo a 5 livelli, TVOC è la concentrazione totale di composti organici volatili misurata dal sensore, in ppb, mentre ECO2 non è una misura diretta della CO₂, ma una stima ricavata dal comportamento dei TVOC. Grazie, poi, agli id creati poco prima, il sensore ENS160 elabora le misurazioni basandosi sui dati ricevuti del sensore AHT21. Infine, chiediamo al sensore di ripetere la lettura ogni 5 secondi.
- platform: ens160_i2c
address: 0x53
aqi:
id: ens160_air_quality_index
name: "ENS160 AQI"
tvoc:
name: "ENS160 TVOC"
eco2:
name: "ENS160 eCO2"
compensation:
temperature: aht21_temperature
humidity: aht21_humidity
update_interval: 5s
Creiamo, in ultimo, un sensore testuale, che fornirà un feedback testuale sulla qualità dell’aria, basandosi sulla numerazione ottenuta dal AQI. Più alto è il numero, più la qualità dell’aria sarà scarsa.
text_sensor:
- platform: template
name: "Qualità Aria Valutazione"
lambda: |-
switch ( (int) (id(ens160_air_quality_index).state) ) {
case 1: return {"Eccellente"};
case 2: return {"Buona"};
case 3: return {"Moderata"};
case 4: return {"Scarsa"};
case 5: return {"Malsana"};
default: return {"Non rilevabile"};
}
Salvate e verificate con Validate se il codice è stato scritto correttamente.

Collegate la ESP32 al computer tramite cavo USB, e cliccate su Install.

Conclusa l’installazione, integriamo il device su Home Assistant. Dovrebbe essere arrivata una notifica sulla plancia. In ogni caso, per integrarlo andate su Impostazioni -> Dispositivi e servizi e apparirà il dispositivo ENS160 da integrare.

Autorizziamo la configurazione e attendiamo da 1 a 2 ore. Dopo tale attesa, il sensore sarà ormai calibrato e vedremo apparire i valori rilevati di AQI, TVOC e CO2.
