Resumen: Existen dos métodos de integración con ESPHome. La plataforma estándar
ac_dimmerfunciona directamente pero tiene conflictos ISR/WiFi en ESP32. El componente externo DimmerLink utiliza un controlador de hardware para una atenuación fiable y sin parpadeo en cualquier placa.
Comparación de métodos
| Característica | ac_dimmer estándar | Componente DimmerLink |
|---|---|---|
| ESP8266 | ✅ Estable | ✅ Estable |
| ESP32 (doble núcleo) | ⚠️ Puede parpadear | ✅ Estable |
| ESP32-S2/C3/H2/C6 | ❌ No soportado | ✅ Soportado |
| — (sin ISR) | ❌ No soportado | ✅ Soportado |
| Hardware adicional | Ninguno | Módulo DimmerLink |
| Líneas YAML (mínimo) | ~10 | ~30 |
| Sensores integrados | No | Frecuencia, brillo |
| Selección de curva de atenuación | No | LINEAR / RMS / LOG |
Método 1: Plataforma estándar ESPHome ac_dimmer
Es la plataforma integrada de ESPHome. No se necesitan componentes externos.
Configuración mínima (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 # por defecto para TRIAC
light:
- platform: monochromatic
output: dimmer_out
name: "Dimmer"Configuración completa — con gamma y potencia mínima
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 # ciclo de trabajo mínimo (1 %) — evita parpadeo en 0
light:
- platform: monochromatic
output: dimmer_out
name: "Dimmer"
gamma_correct: 0 # 0 = lineal; 2.8 = curva de percepción humana
default_transition_length: 500msOpciones de método de atenuación
method: leading_pulse # Pulso breve en gate — TRIAC estándar (por defecto)
method: leading # Gate mantenido hasta ZC — TRIAC alternativo
method: trailing # Gate liberado al final — solo MOSFETAdvertencia para ESP32
⚠️ La plataforma estándar
ac_dimmertiene dos problemas distintos en hardware ESP32:
- ESP32, ESP32-S3 — puede parpadear; temporización ISR afectada por WiFi
- ESP32-S2, ESP32-C3, ESP32-H2, ESP32-C6 — no soportados en absoluto
Solución: Usa el Método 2 (DimmerLink) para cualquier configuración basada en ESP32.
Método 2: Componente externo DimmerLink
DimmerLink descarga la detección de cruce por cero y la temporización
TRIAC a un controlador dedicado Cortex-M0+. ESPHome envía el brillo
por I2C (registro 0x10). No se ejecuta ISR en el MCU.
Docs: rbdimmer.com/docs/dimmerlink-esphome
Component source: github.com/robotdyn-dimmer/DimmerLink/tree/main/components
Cableado
DimmerLink → ESP32 (o cualquier MCU)
──────────────────────────────────
VCC → 3.3V
GND → GND
SDA → GPIO21
SCL → GPIO22Configuración mínima (~30 líneas)
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: 0x50Configuración estándar — con sensores y selector de curva
# (bloques external_components + i2c como arriba)
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"
# Opciones en el desplegable de 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"Configuración extendida — todas las entidades
# Integración DimmerLink completa con diagnósticos
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"Configuración multi-dispositivo
Varios módulos DimmerLink en un mismo bus I2C (diferentes direcciones):
light:
- platform: dimmerlink
name: "Kitchen"
address: 0x50
- platform: dimmerlink
name: "Bedroom"
address: 0x51Integración lambda (avanzado)
Para lógica personalizada — por ejemplo, establecer el brillo desde un botón físico o la lectura de un sensor — usa funciones lambda de ESPHome con acceso directo a registros I2C.
Docs: rbdimmer.com/docs/dimmerlink-esphome/lambda-integration
Mapa de registros I2C de DimmerLink (registros principales)
| Registro | Dirección | Descripción |
|---|---|---|
| STATUS | 0x00 |
Flags de estado (solo lectura) |
| DIM0_LEVEL | 0x10 |
Brillo canal 0, 0–100 |
| DIM0_CURVE | 0x11 |
Curva: 0=LINEAR, 1=RMS, 2=LOG |
| AC_FREQ | 0x20 |
Frecuencia AC medida (Hz) |
Ejemplo lambda — establecer brillo directamente
# Salida template mediante lambda para control de brillo personalizado
output:
- platform: template
id: dimmer_out
type: float
write_action:
- lambda: |-
uint8_t level = (uint8_t)(state * 100.0f);
// requiere bloque i2c: en tu configuración ESPHome
Wire.beginTransmission(0x50);
Wire.write(0x10); // registro DIM0_LEVEL
Wire.write(level);
Wire.endTransmission();
light:
- platform: monochromatic
output: dimmer_out
name: "Dimmer (lambda)"Ejemplo lambda — botón activa preset
binary_sensor:
- platform: gpio
pin: GPIO0
name: "Dim Button"
on_press:
- lambda: |-
// Alternar entre 30 % y 80 %
static bool high = false;
uint8_t level = high ? 30 : 80;
high = !high;
Wire.beginTransmission(0x50);
Wire.write(0x10);
Wire.write(level);
Wire.endTransmission();Curvas de atenuación
| Curva | Valor de registro | ESPHome dimming_curve |
Ideal para |
|---|---|---|---|
| Lineal | 0 | LINEAR |
Calefactores, cargas resistivas |
| RMS | 1 | RMS |
Incandescentes, halógenas |
| Logarítmica | 2 | LOGARITHMIC |
Bombillas LED dimmables |
Las curvas RMS y logarítmica compensan la relación no lineal entre el ángulo de fase y el brillo percibido.
Problemas comunes
| Síntoma | Causa | Solución |
|---|---|---|
| Parpadeo con ESP32 | Conflicto ISR/WiFi | Usar método DimmerLink |
| Dimmer offline tras OTA | ISR interrumpido durante flash | Usar DimmerLink |
| Brillo atascado en 0 % | min_power muy bajo o cableado ZC |
Verificar pin ZC |
| Entidad light no aparece en HA | ESPHome no adoptado en HA | Re-adoptar dispositivo |
| Componente no encontrado | ref: incorrecto en external_components |
Usar ref: main |
Artículos relacionados
- Guía completa de 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
¿Todavía tienes preguntas?
Ask on forum.rbdimmer.com or open a GitHub Issue.