Проект позволяет с помощью 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, если устройства это поддерживают.
Интерфейс чата: Interface
Разработка велась на 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 в этом проекте опирается на идеи и структуру из: