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.

SensoreMisuraPrezzoNote
BME280Temperatura, umidità, pressione~5 €Il tuttofare. Preciso, stabile, il default
BMP280Temperatura, pressione~3 €Come sopra ma senza umidità: attento alle inserzioni che li confondono
SHT31 / SHT41Temperatura, umidità~6 €Umidità più precisa del BME280, ottimo per bagni e cantine
BME680Clima + qualità dell’aria (VOC)~12 €Il VOC è un indice relativo, non ppm: utile per tendenze, non per misure assolute
SCD40 / SCD41CO₂ vero (NDIR)~25 €L’unico modo serio di misurare la CO₂. Vale ogni euro per una camera da letto
BH1750Luce (lux)~2 €Misura calibrata in lux, molto meglio di un LDR
INA219 / INA226Tensione e corrente DC~4 €Per monitorare batterie e carichi in bassa tensione
AHT20Temperatura, 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: 60s

Il 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.5

L’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.

ComponenteUsoPrezzo
Reed switch magneticoPorta o finestra aperta/chiusa~1 €
PIR (HC-SR501, AM312)Movimento~2 €
PulsanteComando fisico~0,20 €
Sensore di allagamentoDue contatti che chiudono con l’acqua~1 €
Interruttore a galleggianteLivello serbatoio~4 €
binary_sensor:
  - platform: gpio
    pin:
      number: GPIO5
      mode: INPUT_PULLUP
      inverted: true
    name: "Finestra cucina"
    device_class: window
    filters:
      - delayed_on_off: 50ms

Tre 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: 10

Il 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.

SensoreMisuraPrezzoNote
LD2410 / LD2410SPresenza mmWave~5 €Vede le persone ferme. Il salto di qualità per le luci automatiche
LD2450Presenza mmWave con posizione~10 €Traccia fino a 3 bersagli e dice dove sono nella stanza
MH-Z19CO₂ NDIR~20 €Alternativa UART allo SCD40
PMS5003Polveri sottili PM2.5/PM10~20 €Qualità dell’aria vera, non indici relativi
Contatori con uscita serialeEnergia, acquavariaDipende 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.1

Serve 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, inverted e delayed_on_off sono 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.