In breve: Esistono due metodi di integrazione ESPHome. La piattaforma standard
ac_dimmerfunziona subito ma presenta conflitti ISR/WiFi su ESP32. Il componente esterno DimmerLink usa un controller hardware per una dimmerizzazione affidabile e senza sfarfallio su qualsiasi scheda.
Confronto dei metodi
| Caratteristica | ac_dimmer standard | Componente DimmerLink |
|---|---|---|
| ESP8266 | ✅ Stabile | ✅ Stabile |
| ESP32 (dual-core) | ⚠️ Possibile sfarfallio | ✅ Stabile |
| ESP32-S2/C3/H2/C6 | ❌ Non supportato | ✅ Supportato |
| Raspberry Pi | ❌ Non supportato | ✅ Supportato |
| Hardware aggiuntivo | Nessuno | Modulo DimmerLink |
| Righe YAML (minimo) | ~10 | ~30 |
| Sensori integrati | No | Frequenza, luminosità |
| Selezione curva di dimmerizzazione | No | LINEAR / RMS / LOG |
Metodo 1: Piattaforma standard ESPHome ac_dimmer
Questa è la piattaforma integrata di ESPHome. Non servono componenti esterni.
Configurazione minima (ESP8266)
esphome:
name: dimmer-esp8266
platform: ESP8266
board: nodemcuv2
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
api:
encryption:
key: !secret api_key
ota:
password: !secret ota_password
output:
- platform: ac_dimmer
id: dimmer_out
gate_pin: GPIO4 # pin DIM
zero_cross_pin:
number: GPIO5 # pin ZC
mode: INPUT
inverted: yes
method: leading_pulse # predefinito per TRIAC
light:
- platform: monochromatic
output: dimmer_out
name: "Dimmer"Configurazione completa — con gamma e potenza minima
output:
- platform: ac_dimmer
id: dimmer_out
gate_pin: GPIO4
zero_cross_pin:
number: GPIO5
mode: INPUT
inverted: yes
method: leading_pulse
min_power: 0.01 # duty cycle minimo (1 %) — evita sfarfallio a 0
light:
- platform: monochromatic
output: dimmer_out
name: "Dimmer"
gamma_correct: 0 # 0 = lineare; 2.8 = curva di percezione umana
default_transition_length: 500msOpzioni del metodo di dimmerizzazione
method: leading_pulse # Impulso breve sul gate — TRIAC standard (predefinito)
method: leading # Gate mantenuto fino al ZC — TRIAC alternativo
method: trailing # Gate rilasciato alla fine — solo MOSFETAvviso per ESP32
⚠️ La piattaforma standard
ac_dimmerha due problemi distinti su hardware ESP32:
- ESP32, ESP32-S3 — possibile sfarfallio; temporizzazione ISR disturbata dal WiFi
- ESP32-S2, ESP32-C3, ESP32-H2, ESP32-C6 — non supportati affatto
Soluzione: Usa il Metodo 2 (DimmerLink) per qualsiasi configurazione basata su ESP32.
Metodo 2: Componente esterno DimmerLink
DimmerLink scarica il rilevamento passaggio per lo zero e la
temporizzazione TRIAC su un controller dedicato Cortex-M0+. ESPHome
invia la luminosità via I2C (registro 0x10). Nessun ISR viene
eseguito sul MCU.
Docs: rbdimmer.com/docs/dimmerlink-esphome
Component source: github.com/robotdyn-dimmer/DimmerLink/tree/main/components
Cablaggio
DimmerLink → ESP32 (o qualsiasi MCU)
──────────────────────────────────
VCC → 3.3V
GND → GND
SDA → GPIO21
SCL → GPIO22Configurazione minima (~30 righe)
esphome:
name: dimmerlink
platform: ESP32
board: esp32dev
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
api:
encryption:
key: !secret api_key
ota:
password: !secret ota_password
external_components:
- source:
type: git
url: https://github.com/robotdyn-dimmer/DimmerLink
ref: main
components: [dimmerlink]
i2c:
sda: GPIO21
scl: GPIO22
frequency: 100kHz
light:
- platform: dimmerlink
name: "Dimmer"
address: 0x50Configurazione standard — con sensori e selettore di curva
# (blocchi external_components + i2c come sopra)
light:
- platform: dimmerlink
name: "Dimmer"
address: 0x50
sensor:
- platform: dimmerlink
address: 0x50
frequency:
name: "AC Frequency"
unit_of_measurement: "Hz"
brightness:
name: "Dimmer Level"
unit_of_measurement: "%"
select:
- platform: dimmerlink
address: 0x50
dimming_curve:
name: "Dimming Curve"
# Opzioni nel menu a tendina di HA: LINEAR, RMS, LOGARITHMIC
binary_sensor:
- platform: dimmerlink
address: 0x50
status:
name: "Dimmer Online"
button:
- platform: dimmerlink
address: 0x50
reset:
name: "Dimmer Reset"
recalibrate:
name: "Dimmer Recalibrate"Configurazione estesa — tutte le entità
# Integrazione DimmerLink completa con diagnostica
sensor:
- platform: dimmerlink
address: 0x50
frequency:
name: "AC Frequency"
brightness:
name: "Dimmer Level"
text_sensor:
- platform: dimmerlink
address: 0x50
firmware_version:
name: "DimmerLink Firmware"
number:
- platform: dimmerlink
address: 0x50
min_brightness:
name: "Min Brightness"
min_value: 0
max_value: 20
select:
- platform: dimmerlink
address: 0x50
dimming_curve:
name: "Dimming Curve"
binary_sensor:
- platform: dimmerlink
address: 0x50
status:
name: "Dimmer OK"
calibration_mode:
name: "Calibration Active"
button:
- platform: dimmerlink
address: 0x50
reset:
name: "Reset"
recalibrate:
name: "Recalibrate"Configurazione multi-dispositivo
Più moduli DimmerLink su un singolo bus I2C (indirizzi diversi):
light:
- platform: dimmerlink
name: "Kitchen"
address: 0x50
- platform: dimmerlink
name: "Bedroom"
address: 0x51Integrazione lambda (avanzato)
Per logica personalizzata — ad esempio, impostare la luminosità da un pulsante fisico o dalla lettura di un sensore — usa le funzioni lambda di ESPHome con accesso diretto ai registri I2C.
Docs: rbdimmer.com/docs/dimmerlink-esphome/lambda-integration
Mappa registri I2C DimmerLink (registri principali)
| Registro | Indirizzo | Descrizione |
|---|---|---|
| STATUS | 0x00 |
Flag di stato (sola lettura) |
| DIM0_LEVEL | 0x10 |
Luminosità canale 0, 0–100 |
| DIM0_CURVE | 0x11 |
Curva: 0=LINEAR, 1=RMS, 2=LOG |
| AC_FREQ | 0x20 |
Frequenza AC misurata (Hz) |
Esempio lambda — impostare la luminosità direttamente
# Uscita template tramite lambda per controllo personalizzato della luminosità
output:
- platform: template
id: dimmer_out
type: float
write_action:
- lambda: |-
uint8_t level = (uint8_t)(state * 100.0f);
// richiede il blocco i2c: nella configurazione ESPHome
Wire.beginTransmission(0x50);
Wire.write(0x10); // registro DIM0_LEVEL
Wire.write(level);
Wire.endTransmission();
light:
- platform: monochromatic
output: dimmer_out
name: "Dimmer (lambda)"Esempio lambda — pulsante attiva preset
binary_sensor:
- platform: gpio
pin: GPIO0
name: "Dim Button"
on_press:
- lambda: |-
// Alterna tra 30 % e 80 %
static bool high = false;
uint8_t level = high ? 30 : 80;
high = !high;
Wire.beginTransmission(0x50);
Wire.write(0x10);
Wire.write(level);
Wire.endTransmission();Curve di dimmerizzazione
| Curva | Valore registro | ESPHome dimming_curve |
Ideale per |
|---|---|---|---|
| Lineare | 0 | LINEAR |
Riscaldatori, carichi resistivi |
| RMS | 1 | RMS |
Lampade a incandescenza, alogene |
| Logaritmica | 2 | LOGARITHMIC |
Lampadine LED dimmerabili |
Le curve RMS e logaritmica compensano la relazione non lineare tra angolo di fase e luminosità percepita.
Problemi comuni
| Sintomo | Causa | Soluzione |
|---|---|---|
| Sfarfallio con ESP32 | Conflitto ISR/WiFi | Usare il metodo DimmerLink |
| Dimmer offline dopo OTA | ISR interrotto durante il flash | Usare DimmerLink |
| Luminosità bloccata a 0 % | min_power troppo basso o cablaggio ZC |
Controllare pin ZC |
| Entità light assente in HA | ESPHome non adottato in HA | Ri-adottare il dispositivo |
| Componente non trovato | ref: errato in external_components |
Usare ref: main |
Articoli correlati
- Guida completa Home Assistant →
home-automation/home-assistant-ac-dimmer.md - ESP32 WiFi ISR problem → IRAM_ATTR Causes and Fix
- Single-core ESP32 → ESP32-S2/C3/H2 Doesn't Work
- Alternativa MQTT →
home-automation/mqtt-esp32-ac-dimmer.md
Hai ancora domande?
Ask on forum.rbdimmer.com or open a GitHub Issue.