Коротко: Существует два метода интеграции с ESPHome. Стандартная платформа
ac_dimmerработает «из коробки», но имеет конфликты ISR/WiFi на ESP32. Внешний компонент DimmerLink использует аппаратный контроллер для надёжного диммирования без мерцания на любой плате.
Сравнение методов
| Возможность | Стандартный ac_dimmer | Компонент DimmerLink |
|---|---|---|
| ESP8266 | ✅ Стабильно | ✅ Стабильно |
| ESP32 (двухъядерный) | ⚠️ Возможно мерцание | ✅ Стабильно |
| ESP32-S2/C3/H2/C6 | ❌ Не поддерживается | ✅ Поддерживается |
| — (без ISR) | ❌ Не поддерживается | ✅ Поддерживается |
| Дополнительное оборудование | Нет | Модуль DimmerLink |
| Строк YAML (минимум) | ~10 | ~30 |
| Встроенные датчики | Нет | Частота, яркость |
| Выбор кривой диммирования | Нет | LINEAR / RMS / LOG |
Метод 1: Стандартная платформа ESPHome ac_dimmer
Это встроенная платформа ESPHome. Внешние компоненты не нужны.
Минимальная конфигурация (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 # пин DIM
zero_cross_pin:
number: GPIO5 # пин ZC
mode: INPUT
inverted: yes
method: leading_pulse # по умолчанию для TRIAC
light:
- platform: monochromatic
output: dimmer_out
name: "Dimmer"Полная конфигурация — с гаммой и минимальной мощностью
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 # минимальная скважность (1 %) — убирает мерцание на 0
light:
- platform: monochromatic
output: dimmer_out
name: "Dimmer"
gamma_correct: 0 # 0 = линейная; 2.8 = кривая восприятия человека
default_transition_length: 500msВарианты метода диммирования
method: leading_pulse # Короткий импульс на затвор — стандартный TRIAC (по умолчанию)
method: leading # Затвор удерживается до ZC — альтернативный TRIAC
method: trailing # Затвор сбрасывается в конце — только для MOSFETПредупреждение для ESP32
⚠️ Стандартная платформа
ac_dimmerимеет две отдельных проблемы на оборудовании ESP32:
- ESP32, ESP32-S3 — возможно мерцание; синхронизация ISR нарушается WiFi
- ESP32-S2, ESP32-C3, ESP32-H2, ESP32-C6 — не поддерживаются вовсе
Решение: Используйте Метод 2 (DimmerLink) для любой конфигурации на базе ESP32.
Метод 2: Внешний компонент DimmerLink
DimmerLink выносит детектирование перехода через ноль и синхронизацию
TRIAC на выделенный контроллер Cortex-M0+. ESPHome отправляет яркость
по I2C (регистр 0x10). На MCU не запускается ISR.
Docs: rbdimmer.com/docs/dimmerlink-esphome
Component source: github.com/robotdyn-dimmer/DimmerLink/tree/main/components
Схема подключения
DimmerLink → ESP32 (или любой MCU)
──────────────────────────────────
VCC → 3.3V
GND → GND
SDA → GPIO21
SCL → GPIO22Минимальная конфигурация (~30 строк)
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: 0x50Стандартная конфигурация — с датчиками и выбором кривой
# (блоки external_components + i2c как выше)
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"
# Варианты в выпадающем списке 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"Расширенная конфигурация — все сущности
# Полная интеграция DimmerLink с диагностикой
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"Конфигурация нескольких устройств
Несколько модулей DimmerLink на одной шине I2C (разные адреса):
light:
- platform: dimmerlink
name: "Kitchen"
address: 0x50
- platform: dimmerlink
name: "Bedroom"
address: 0x51Интеграция через lambda (продвинутый уровень)
Для пользовательской логики — например, установки яркости с физической кнопки или по показаниям датчика — используйте функции lambda ESPHome с прямым доступом к регистрам I2C.
Docs: rbdimmer.com/docs/dimmerlink-esphome/lambda-integration
Карта регистров I2C DimmerLink (ключевые регистры)
| Регистр | Адрес | Описание |
|---|---|---|
| STATUS | 0x00 |
Флаги состояния (только чтение) |
| DIM0_LEVEL | 0x10 |
Яркость канала 0, 0–100 |
| DIM0_CURVE | 0x11 |
Кривая: 0=LINEAR, 1=RMS, 2=LOG |
| AC_FREQ | 0x20 |
Измеренная частота AC (Гц) |
Пример lambda — прямая установка яркости
# Шаблонный выход через lambda для пользовательского управления яркостью
output:
- platform: template
id: dimmer_out
type: float
write_action:
- lambda: |-
uint8_t level = (uint8_t)(state * 100.0f);
// требуется блок i2c: в конфигурации ESPHome
Wire.beginTransmission(0x50);
Wire.write(0x10); // регистр DIM0_LEVEL
Wire.write(level);
Wire.endTransmission();
light:
- platform: monochromatic
output: dimmer_out
name: "Dimmer (lambda)"Пример lambda — кнопка переключает предустановки
binary_sensor:
- platform: gpio
pin: GPIO0
name: "Dim Button"
on_press:
- lambda: |-
// Переключение между 30 % и 80 %
static bool high = false;
uint8_t level = high ? 30 : 80;
high = !high;
Wire.beginTransmission(0x50);
Wire.write(0x10);
Wire.write(level);
Wire.endTransmission();Кривые диммирования
| Кривая | Значение регистра | ESPHome dimming_curve |
Лучше для |
|---|---|---|---|
| Линейная | 0 | LINEAR |
Нагреватели, резистивные |
| RMS | 1 | RMS |
Лампы накаливания, галогенные |
| Логарифмическая | 2 | LOGARITHMIC |
Диммируемые LED-лампы |
Кривые RMS и логарифмическая компенсируют нелинейную зависимость между углом фазы и воспринимаемой яркостью.
Типичные проблемы
| Симптом | Причина | Решение |
|---|---|---|
| Мерцание с ESP32 | Конфликт ISR/WiFi | Используйте метод DimmerLink |
| Диммер офлайн после OTA | ISR прерван во время прошивки | Используйте DimmerLink |
| Яркость застряла на 0 % | min_power слишком мало или проблема с ZC |
Проверьте пин ZC |
| Сущность light не появляется в HA | ESPHome не принят в HA | Повторно примите устройство |
| Компонент не найден | Неверный ref: в external_components |
Используйте ref: main |
Связанные статьи
- Полное руководство по 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
- Альтернатива MQTT →
home-automation/mqtt-esp32-ac-dimmer.md
Остались вопросы?
Ask on forum.rbdimmer.com or open a GitHub Issue.