Questo è il capitolo-catalogo, quello a cui tornerai quando avrai in mente un’idea e vorrai sapere se esiste il pezzo che la realizza. La risposta breve è quasi sempre sì: ESPHome supporta diverse centinaia di componenti, e per ogni grandezza fisica misurabile esiste un modulo da pochi euro che qualcuno ha già collegato e documentato.
Ho organizzato il catalogo per bus, non per grandezza, perché è il bus a determinare quanti pin ti costa un sensore e se ne puoi mettere più d’uno. In questo capitolo vediamo cosa si collega all’I²C, al 1-Wire, ai pin digitali, all’ADC e all’UART, con il prezzo indicativo, lo snippet di configurazione e il tranello tipico di ognuno.
I²C: la maggior parte dei sensori ambientali
Due fili, decine di dispositivi in parallelo. È il bus che userai di più: un sensore di clima, uno di luce e uno di CO₂ nella stessa stanza costano due pin in totale. Il bus si dichiara una volta sola (con scan: true, come detto in 3 Pin bus e alimentazione) e poi si aggiungono i sensori.
| Sensore | Misura | Prezzo | Note |
|---|---|---|---|
| BME280 | Temperatura, umidità, pressione | ~5 € | Il tuttofare. Preciso, stabile, il default |
| BMP280 | Temperatura, pressione | ~3 € | Come sopra ma senza umidità: attento alle inserzioni che li confondono |
| SHT31 / SHT41 | Temperatura, umidità | ~6 € | Umidità più precisa del BME280, ottimo per bagni e cantine |
| BME680 | Clima + qualità dell’aria (VOC) | ~12 € | Il VOC è un indice relativo, non ppm: utile per tendenze, non per misure assolute |
| SCD40 / SCD41 | CO₂ vero (NDIR) | ~25 € | L’unico modo serio di misurare la CO₂. Vale ogni euro per una camera da letto |
| BH1750 | Luce (lux) | ~2 € | Misura calibrata in lux, molto meglio di un LDR |
| INA219 / INA226 | Tensione e corrente DC | ~4 € | Per monitorare batterie e carichi in bassa tensione |
| AHT20 | Temperatura, umidità | ~2 € | L’economico che funziona. Spesso venduto assieme al BMP280 |
La configurazione segue sempre lo stesso schema:
i2c:
sda: GPIO8
scl: GPIO9
scan: true
sensor:
- platform: bme280_i2c
address: 0x76
temperature:
name: "Temperatura"
humidity:
name: "Umidità"
pressure:
name: "Pressione"
update_interval: 60s
- platform: bh1750
name: "Luminosità"
address: 0x23
update_interval: 60sIl tranello dell’I²C è il conflitto di indirizzi: due dispositivi con lo stesso indirizzo sullo stesso bus e nessuno dei due risponde. Quasi tutti i moduli hanno un ponticello o una piazzola da saldare per spostarsi (tipicamente 0x76 ↔ 0x77). Il scan: true nei log è il modo più veloce per capire chi c’è davvero.
Il secondo tranello è la lunghezza dei fili: l’I²C nasce per collegamenti su circuito stampato, non per attraversare una stanza. Oltre il mezzo metro diventa inaffidabile. Se il sensore deve stare lontano, o metti il chip vicino al sensore, o passi a un bus più robusto.
Il caso del BME280 vicino al chip
Vale la pena una nota, perché è l’errore più comune e nessuno lo dice: se monti il BME280 attaccato all’ESP32 dentro una scatoletta chiusa, la temperatura che leggi è sbagliata di 2-4 °C in eccesso. Il chip scalda, e il sensore misura il calore del chip più che quello della stanza.
Tre rimedi, in ordine di efficacia: allontanare il sensore dal chip con dieci centimetri di cavo, forare la scatola per far circolare l’aria, oppure, la scorciatoia, applicare un offset in configurazione:
temperature:
name: "Temperatura"
filters:
- offset: -2.5L’offset è un cerotto: compensa a regime ma non nei transitori, e se il chip lavora di più (Wi-Fi debole, più trasmissioni) l’errore cambia. Meglio risolvere fisicamente e usare l’offset solo per la calibrazione fine.
1-Wire: le sonde di temperatura
Il DS18B20 merita un paragrafo suo perché è il sensore giusto per tutti i casi in cui il BME280 non va: fuori, sott’acqua, dentro un tubo, a contatto con una superficie. Esiste in versione impermeabile con sonda in acciaio e cavo da un metro, costa ~3 €, e ne puoi mettere più d’uno sullo stesso filo perché ogni sonda ha un indirizzo di fabbrica unico.
one_wire:
- platform: gpio
pin: GPIO4
sensor:
- platform: dallas_temp
address: 0x1c0000031edd2a28
name: "Temperatura mandata"
- platform: dallas_temp
address: 0xa80000031ee2e128
name: "Temperatura ritorno"Gli indirizzi non te li inventi: al primo avvio ESPHome li elenca nei log, tu li copi nella configurazione e ricompili. Con una sonda sola puoi anche ometterli.
Il tranello del 1-Wire è la resistenza di pull-up da 4,7 kΩ fra il filo dati e i 3,3 V. Le sonde nude non ce l’hanno, i moduli su schedina spesso sì. Senza, il sensore non viene rilevato o dà letture assurde. È il primo posto dove guardare se ESPHome non trova la sonda.
Un caso d’uso classico: due DS18B20 su mandata e ritorno del riscaldamento ti danno il delta T della caldaia, che è l’informazione con cui capisci se l’impianto sta lavorando bene. Costo totale, sei euro.
Pin digitali: aperto/chiuso, movimento, pulsanti
Tutto quello che ha due stati va su un pin digitale e diventa un binary_sensor.
| Componente | Uso | Prezzo |
|---|---|---|
| Reed switch magnetico | Porta o finestra aperta/chiusa | ~1 € |
| PIR (HC-SR501, AM312) | Movimento | ~2 € |
| Pulsante | Comando fisico | ~0,20 € |
| Sensore di allagamento | Due contatti che chiudono con l’acqua | ~1 € |
| Interruttore a galleggiante | Livello serbatoio | ~4 € |
binary_sensor:
- platform: gpio
pin:
number: GPIO5
mode: INPUT_PULLUP
inverted: true
name: "Finestra cucina"
device_class: window
filters:
- delayed_on_off: 50msTre righe che vale la pena capire, perché tornano ovunque:
mode: INPUT_PULLUP attiva la resistenza interna che tiene il pin alto quando non è collegato a niente. Senza, un ingresso “libero” fluttua e il sensore riporta stati casuali. Con un reed switch o un pulsante che chiudono verso massa, il pull-up è quasi sempre quello che vuoi.
inverted: true ribalta la logica: siccome il contatto chiude verso massa, il pin va basso quando la finestra è chiusa, che è il contrario di quello che vuoi vedere in Home Assistant.
delayed_on_off: 50ms è l’antirimbalzo. I contatti meccanici, quando si chiudono, rimbalzano per qualche millisecondo generando decine di transizioni. Senza filtro ti ritrovi Home Assistant che riceve venti eventi per una porta aperta una volta sola.
Il device_class (window, door, motion, moisture, problem) non è estetica: dice a Home Assistant che icone usare, come chiamare gli stati (“Aperta/Chiusa” invece di “On/Off”) e come trattare l’entità nelle dashboard e nelle automazioni.
ADC: leggere una tensione
L’ingresso analogico serve quando la grandezza non è né digitale né su un bus: la tensione di una batteria, un potenziometro, un sensore economico che restituisce un valore in volt.
sensor:
- platform: adc
pin: GPIO2
name: "Tensione batteria"
attenuation: 12db
update_interval: 60s
filters:
- multiply: 2.0
- sliding_window_moving_average:
window_size: 10Il multiply: 2.0 compensa il partitore resistivo: siccome l’ADC legge al massimo ~3,3 V e una LiPo carica arriva a 4,2 V, si mette un divisore con due resistenze uguali e si raddoppia il risultato via software.
Il tranello dell’ADC sull’ESP32 è che è mediocre: rumoroso, non perfettamente lineare, e sull’ESP32 classico il convertitore ADC2 non funziona affatto quando il Wi-Fi è acceso. Per letture stabili serve sempre un filtro di media, e per misure che devono essere precise conviene un sensore dedicato su I²C (un INA219 per le tensioni, un BH1750 per la luce) invece dell’ADC.
Il classico sensore di umidità del suolo capacitivo (~2 €) va qui. Funziona, ma dà un numero grezzo che va calibrato a mano: leggi il valore all’asciutto e quello in un bicchiere d’acqua, e mappi l’intervallo con un filtro calibrate_linear.
UART: i sensori che parlano
Alcuni sensori non espongono un valore, espongono un protocollo: mandano pacchetti su una seriale e vanno interrogati. Costano due pin dedicati e uno solo per coppia di pin.
| Sensore | Misura | Prezzo | Note |
|---|---|---|---|
| LD2410 / LD2410S | Presenza mmWave | ~5 € | Vede le persone ferme. Il salto di qualità per le luci automatiche |
| LD2450 | Presenza mmWave con posizione | ~10 € | Traccia fino a 3 bersagli e dice dove sono nella stanza |
| MH-Z19 | CO₂ NDIR | ~20 € | Alternativa UART allo SCD40 |
| PMS5003 | Polveri sottili PM2.5/PM10 | ~20 € | Qualità dell’aria vera, non indici relativi |
| Contatori con uscita seriale | Energia, acqua | varia | Dipende molto dal modello |
I sensori mmWave meritano l’enfasi perché risolvono il problema numero uno delle automazioni luci: il PIR vede il movimento, non la presenza, quindi la luce si spegne mentre stai leggendo sul divano. Un LD2410 vede il torace che si alza e si abbassa e sa che sei lì. Ho scritto un progetto completo su questo, con l’accorgimento di usarlo in Zigbee invece che in Wi-Fi, in 3 SENSORE DI PRESENZA mmWave con HLK-LD2410S e XIAO ESP32-C6 (con Zigbee).
uart:
tx_pin: GPIO21
rx_pin: GPIO20
baud_rate: 256000
parity: NONE
stop_bits: 1
ld2410:
binary_sensor:
- platform: ld2410
has_target:
name: "Presenza"
has_moving_target:
name: "Movimento"
has_still_target:
name: "Presenza statica"Il tranello dell’UART è l’incrocio: TX del sensore va sul RX del chip e viceversa. Collegarli dritti non fa danni ma non funziona, e non c’è nessun messaggio d’errore che te lo dica: semplicemente non arriva niente. È letteralmente la prima cosa da controllare.
Il secondo tranello è il baud rate: ogni sensore ha il suo (l’LD2410 usa 256000, che è un valore insolito) e sbagliarlo produce byte casuali nei log.
Contare impulsi: acqua, gas, energia
Molti contatori domestici hanno un’uscita a impulsi, o un disco/LED che lampeggia una volta per unità consumata. Un ESP32 può contarli.
sensor:
- platform: pulse_counter
pin:
number: GPIO6
mode: INPUT_PULLUP
name: "Portata acqua"
unit_of_measurement: "L/min"
filters:
- multiply: 0.1Serve un sensore che veda l’impulso: un reed switch per i contatori con magnete, un fototransistor o un sensore ottico riflettente per quelli con il LED lampeggiante. La costante di conversione (quanti litri per impulso) sta nel manuale del contatore.
Per l’energia elettrica esistono anche moduli dedicati che misurano davvero: PZEM-004T (~12 €, misura tensione, corrente, potenza e energia, parla su UART) o le pinze amperometriche CT clamp con un modulo di condizionamento. Sul tema misurazione, ho documentato un approccio diverso e commerciale in Smart MAIC D105.
LE PINZE AMPEROMETRICHE VANNO SU CAVI ISOLATI:
Una CT clamp si mette attorno a un singolo conduttore isolato, senza mai aprire nulla e senza toccare parti in tensione. Se per installarla devi smontare il quadro o maneggiare conduttori nudi, quello è lavoro da elettricista. Non c’è nessun progetto DIY che valga un arco elettrico.
Come si sceglie, in pratica
Tre regole che valgono più del catalogo:
Preferisci l’I²C quando puoi. Costa due pin per tutti i sensori insieme, i moduli sono ben supportati, e i valori arrivano già calibrati e in unità fisiche vere. L’ADC è l’ultima spiaggia.
Compra il sensore che misura la cosa, non quello che la stima. Un SCD41 misura la CO₂ con un sensore NDIR; un BME680 stima un indice di qualità dell’aria dai VOC e lo chiama “eCO₂”, che non è la stessa cosa e non serve per decidere se aprire la finestra. Vale in generale: i sensori “equivalenti” costano meno perché misurano un’altra grandezza.
Chiediti a che frequenza ti serve il dato. La temperatura di una stanza cambia in minuti: update_interval: 60s è già abbondante. La presenza deve essere istantanea. Il consumo elettrico dipende da cosa ci vuoi fare. Ogni lettura è traffico radio, spazio nel database e batteria consumata.
Ricapitolando
- I²C è il bus principale: due pin per decine di sensori ambientali. Usa sempre
scan: true. - Il BME280 è il tuttofare del clima; SCD41 per la CO₂ vera; BH1750 per la luce.
- Un sensore di temperatura attaccato al chip legge 2-4 °C in più: allontanalo, non limitarti all’offset.
- DS18B20 su 1-Wire per esterni, acqua e superfici; ricorda il pull-up da 4,7 kΩ.
- Sui pin digitali:
INPUT_PULLUP,invertededelayed_on_offsono le tre righe che rendono un contatto affidabile. - Metti sempre il
device_class: cambia icone, nomi degli stati e comportamento in Home Assistant. - L’ADC dell’ESP32 è mediocre: filtra sempre, e su ESP32 classico evita i pin dell’ADC2 col Wi-Fi acceso.
- I sensori mmWave su UART vedono le persone ferme: è il singolo upgrade che cambia di più le automazioni luci.
- Sull’UART, TX e RX vanno incrociati e il baud rate va azzeccato: senza, nessun errore, semplicemente silenzio.
- Preferisci il sensore che misura la grandezza a quello che la stima da un’altra.