Проект позволяет с помощью ESP32 и существующей DALI сети сделать:
- Интеграцию с Home Assistant по MQTT
- Мониторить события в шине
- Управлять устройствами из интерфейса чата
Особенностью является – быстрая обратная связь о состоянии устройств на шине.
ESP32 мониторит DALI-трафик и публикует состояние (brightness, color_temperature, rgb) устройств в MQTT.
Для получения состояния используются следующие топики:
dali/<custom_id>/device/<address>/brightness-0..254;dali/<custom_id>/group/<address>/color_temperature-2700..6500;dali/<custom_id>/device/<address>/rgb-r,g,b, значения0..255;dali/<custom_id>/group/<address>/white-w,a,f, значения0..255.
Для установки состояния предназначены MQTT топики с постфиксом _set, которые инициируют посылку DALI команд устройствам и группам:
dali/<custom_id>/device/<address>/brightness_set- payload0..254;dali/<custom_id>/group/<address>/color_temperature_set- payload Kelvin2700..6500;dali/<custom_id>/device/<address>/rgb_set- payloadr,g,b, значения0..255;dali/<custom_id>/group/<address>/white_set- payloadw,a,f, значения0..255.
Это позволяет использовать следующие MQTT шаблоны HA для управления:
- unique_id: dali_device_0
name: "DALI: Устрйство 0"
schema: basic
command_topic: "dali/A/device/0/brightness_set"
# Если указать тип brightness, то всегда будет уходить 100, указываем firts
on_command_type: first
brightness_command_topic: "dali/A/device/0/brightness_set"
brightness_state_topic: "dali/A/device/0/brightness"
brightness_scale: 254
brightness_value_template: >
{{ value | int(0) }}
state_topic: "dali/A/device/0/brightness"
# Здесь указываются значения payload чтобы правильно определялось состояние on/off
state_value_template: >
{{ '50' if value | float(0) > 0 else '0' }}
payload_off: "0"
payload_on: "50"
color_temp_command_topic: "dali/A/device/0/color_temperature_set"
color_temp_state_topic: "dali/A/device/0/color_temperature"
color_temp_kelvin: true
min_kelvin: 2700
max_kelvin: 6500
optimistic: false
retain: falseДля того чтобы это работало – необходимо добавить отслеживаемые устройства во вкладке Devices. И указать параметры, которые будут отслеживаться.
Подробное описание синхронизации находится в SYNC.md
В интерфейсе чата можно:
- Видеть декодированные DALI-команды и ответы.
- Отправлять обычные DALI-команды вроде
lamp 1 -> offилиgroup 2 -> query groups; - Управлять DT8-параметрами, например цветовой температурой и RGB, если устройства это поддерживают.
Разработка велась на ESP32-S3 но должно работать и на ESP32-C6.
Для работы с шиной DALI используется плата:
- На момент разработки плату Dali можно купить на OZON: https://ozon.ru/t/iNTS5aK
- ESP32 желательно купить с посадочнми гнезами под плату Dali (S3 или C6): https://ali.click/jkle513
Установите Espressif 5.5.4 – https://docs.espressif.com/projects/esp-idf/en/v5.5.4/esp32/get-started/index.html#manual-installation
Перед сборкой укажите целевой чип:
idf.py set-target esp32-s3Откройте меню конфигурации:
idf.py menuconfigВ разделе Sniffer Configuration укажите параметры:
Wi-Fi SSID- имя беспроводной сети;Wi-Fi password- пароль беспроводной сети;DALI RX GPIO Pin- GPIO для чтения состояния DALI-шины;DALI TX GPIO Pin- GPIO для удержания DALI-трансивера в released-состоянии.MQTT broker address- адрес MQTT брокера;MQTT custom id- суффикс корневого topic, по умолчаниюA.DALI status heartbeat interval- периодический опросQUERY_STATUSдля сохранённых устройств, в секундах.
MQTT включается только если в menuconfig заполнен MQTT broker address. Без него будет работать только интерфейс с командами и мониторинг шины.
DALI status heartbeat interval по умолчанию равен 0, поэтому периодический опрос отключён. Если указать значение больше 0, прошивка будет с этим интервалом отправлять QUERY_STATUS по каждому устройству, добавленному на вкладке Devices. Ответы обрабатываются той же логикой синхронизации статуса, что и обычные DALI query.
Подсказка по пинам для совместимых плат:
- ESP32-S3-Pico: Uses GPIO14 for DALI RX and GPIO17 for DALI TX_i.
- ESP32-C6-Pico: Uses GPIO5 for DALI RX and GPIO14 for DALI TX_i.
Пример настройки для ESP32-S3-Pico:
DALI RX GPIO Pin = 14
DALI TX GPIO Pin = 17
Значения сохраняются в sdkconfig, поэтому параметры можно указать/изменить в файле конфига проекта.
Соберите проект:
idf.py buildПрошейте плату и откройте монитор порта:
idf.py -p PORT flash monitorЧтобы выйти из монитора, нажмите Ctrl-].
В чате можно отправлять команды в формате:
<TARGET> -> <ACTION>
Подробное описание команд находится в COMMANDS.md
Часть low-level логики приёма/передачи DALI в этом проекте опирается на идеи и структуру из:

