WB-DALI и усилитель

Добрый день,

У нас есть широковещательный усилитель собственной разработки, который может работать в двух режимах (как широковещательный, тогда он определяется как отдельное устройство и обычный усилитель шины дали).

Подключаем его к WB 8.5 и шлюзу DALI и усилитель не определяется в веб-интерфейсе. Подключили сторонний светильник - определяется. Если усилитель переключить из широковещательного режима в режим обычного усилителя, то светильник через него видится в веб-интерфейсе.

Затык в том, что при использовании шлюза DALI Node от ECUE (sympholight) широковещательный усилитель определяется и нормально функционирует.

Также усилитель определяется в программе Lunatone Cockpit, если включить “Эмуляция шлюза Lunatone DALI-2 IoT”. Подключили к широковещательному усилителю светильник, порегулировали яркость - светильник отлично ее меняет. Да, через Cockpit он определяется с ошибкой (типа не может считать все данные), но по итогу работает.

Можно, наверное, поменять яркость устройства и через скрипт JS, коли мы знаем адрес устройства, но там высшие материи и нейронки ничего дельного подсказать не могут. Если можно пойти в сторону такого workaround, то почему бы и нет.

Версия прошивки самого шлюза 1.0.0
wb-mqtt-serial 2.248.1-wb102 git 68ec4297b6324b4a5cc84940a146c0fee9d48cf8
RELEASE_NAME=wb-2606
SUITE=stable
TARGET=wb8/bullseye
DALI MQTT версии 1.12.9.

На скрине DALI Cockpit и наше устройство.

Добрый день.
Какое из поддерживаемых устройств - усилитель?
И как задан его тип?

DT6, определяется, как DALI-балласт. Посылается значение яркости, а с выхода это значение просто дублируется на всю шину.

Покажите пожалуйста обмен с утройством. Поиск из Cockpit. Пока нет предположений в чем дело.

default.txt (189,0 КБ)
Во вложении. Работает только режим “Read existing devices”. В понедельник еще выйдет наш схемотехник, и в принципе одно устройство можем отправить для тестов. Находимся в Москве.

Устройство работает как DALI-2 control device (24-битные кадры, IEC 62386-103)**, а не как control gear. Оно:

шлёт ff fe 1d START QUIESCENT MODE;

  • непрерывно широковещательно рассылает ff fe ccUnknown DALI24 Command
    это не “не определяется DALI”, а устройство в broadcast-режиме говорит part 103 (control device) проприетарной командой, которую WB-DALI при сканировании control gear не обнаруживает.
    0xcc не стандартная команда 103 — её и Cockpit помечает Unknown

Спрошу у разработчиков.

Добрый день.

Есть вопросы и замечания от нашего схемотехника:

  1. WirenBoard не отправляет команду Randomise перед процедурой SearchAddr. Согласно протоколу DALI (IEC 62386), последовательность адресации должна начинаться с команды Randomise, после чего следует SearchAddr. Без Randomise устройства не отвечают.

  2. В логе DALI Node не отображаются ряд ключевых команд протокола, в частности:

  • Verify Short Address

  • Randomise (перед SearchAddr)

Вопрос: Это упрощение протокола в реализации WirenBoard, или команды выполняются, но не логируются? Если второе — можно ли включить полное логирование?

  1. Для DALI-реализации WirenBoard неясно, какой минимальный набор параметров должен поддерживать балласт, чтобы корректно отображаться в интерфейсе. После ручного упрощения кода на стороне балласта базовая работа налаживается, но интерфейс WirenBoard по-прежнему не отображает устройство корректно (вечная загрузка).

Просьба к разработчикам:

  1. Добавить команду Randomise в процедуру адресации.

  2. Обеспечить полное логирование DALI-команд в интерфейсе.

  3. Уточнить минимальный набор параметров балласта для корректного отображения в UI.

  4. Рассмотреть возможность работы с устройствами, не полностью соответствующими протоколу (tolerant mode).

Неверно.
Начинается процедура с INITIALISE. Канонический порядок по IEC 62386-102:

a1 00        TERMINATE                      (опционально, сброс состояния)
a5 00  ×2    INITIALISE(0x00)               2 раза в пределах 100 мс
a7 00  ×2    RANDOMISE                      2 раза, затем пауза ≥100 мс
   b1 XX     SEARCHADDRH        ┐
   b2 XX     SEARCHADDRM        │ двоичный поиск по 24 битам
   b3 XX     SEARCHADDRL        │
   a9 00     COMPARE            ┘ ответ 0xFF, если randomAddress ≤ searchAddress
   b7 XX     PROGRAM SHORT ADDRESS
   b9 XX     VERIFY SHORT ADDRESS
   ab 00     WITHDRAW
a1 00        TERMINATE

INITIALISE переводит устройства в состояние initialise (на 15 минут). Без этого состояния устройства игнорирует не только COMPARE/SEARCHADDR/PROGRAM SHORT ADDRESS, но и сам RANDOMISE.
Он используется когда есть коллизии. Дефолтное значение randomAddress равно 0xFFFFFF, поэтому у только что сброшенных или новых устройств адреса совпадают. Тогда на COMPARE они отвечают все, и поиск не сходится ни на одном устройстве.

Тут спрошу.

Для примера:

wb-mqtt-dali --binary-search2 wb-dali_14 -d
DEBUG:wb-dali_14_bus1:device=wb-dali_14, dev_inst_map=None
DEBUG:wb-dali_14_bus1:Initializing...
DEBUG:wb-dali_14_bus1:Resetting message queue in gateway
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=6, address=1432, count=1, msg=0000
DEBUG:wb-dali_14_bus1:Subscribing to reply topics...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Subscribing to FF24 topic...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Initialized successfully
DEBUG:wb-dali_14_bus1:send: FF24.StartQuiescentMode, FF24.Terminate, FF24.Initialise(255)
DEBUG:wb-dali_14_bus1:Processing queue item: FF24.StartQuiescentMode
DEBUG:wb-dali_14_bus1:Processing queue item: FF24.Terminate
DEBUG:wb-dali_14_bus1:Processing queue item: FF24.Initialise(255)
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1400, count=6, msg=fe1d52ff000042c101ff52c1
DEBUG:wb-dali_14_bus1:FF24.StartQuiescentMode (0) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:FF24.Terminate (1) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:FF24.Initialise(255) (2) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xffffff
DEBUG:wb-dali_14_bus1:send: FF24.SearchAddrH(255), FF24.SearchAddrM(255), FF24.SearchAddrL(255), FF24.Compare
DEBUG:wb-dali_14_bus1:Processing queue item: FF24.SearchAddrH(255)
DEBUG:wb-dali_14_bus1:Processing queue item: FF24.SearchAddrM(255)
DEBUG:wb-dali_14_bus1:Processing queue item: FF24.SearchAddrL(255)
DEBUG:wb-dali_14_bus1:Processing queue item: FF24.Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1406, count=8, msg=05ff42c106ff42c107ff42c1030042c1
DEBUG:wb-dali_14_bus1:FF24.SearchAddrH(255) (3) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:FF24.SearchAddrM(255) (4) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:FF24.SearchAddrL(255) (5) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:FF24.Compare (6) status 2: Transmission without response
INFO:commissioning:No device left to address, exiting
DEBUG:wb-dali_14_bus1:send: FF24.Terminate, FF24.StopQuiescentMode
DEBUG:wb-dali_14_bus1:Processing queue item: FF24.Terminate
DEBUG:wb-dali_14_bus1:Processing queue item: FF24.StopQuiescentMode
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1414, count=4, msg=000042c1fe1e52ff
DEBUG:wb-dali_14_bus1:FF24.Terminate (7) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:FF24.StopQuiescentMode (8) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Deinitializing...
DEBUG:wb-dali_14_bus1:Deinitialized successfully
root@wirenboard-AD65BTLY:~# wb-mqtt-dali --binary-search wb-dali_14 -d
DEBUG:wb-dali_14_bus1:device=wb-dali_14, dev_inst_map=None
DEBUG:wb-dali_14_bus1:Initializing...
DEBUG:wb-dali_14_bus1:Resetting message queue in gateway
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=6, address=1432, count=1, msg=0000
DEBUG:wb-dali_14_bus1:Subscribing to reply topics...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Subscribing to FF24 topic...
DEBUG:wb-dali_14_bus1:Received retained message, ignoring...
DEBUG:wb-dali_14_bus1:Initialized successfully
DEBUG:wb-dali_14_bus1:send: FF24.StartQuiescentMode, Terminate, Initialise
DEBUG:wb-dali_14_bus1:Processing queue item: FF24.StartQuiescentMode
DEBUG:wb-dali_14_bus1:Processing queue item: Terminate
DEBUG:wb-dali_14_bus1:Processing queue item: Initialise
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1400, count=6, msg=fe1d52ffa1004000a5005000
DEBUG:wb-dali_14_bus1:FF24.StartQuiescentMode (0) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Terminate (1) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Initialise (2) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xffffff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrH(255), SetSearchAddrM(255), SetSearchAddrL(255), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrH(255)
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrM(255)
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrL(255)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1406, count=8, msg=b1ff4000b3ff4000b5ff4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrH(255) (3) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:SetSearchAddrM(255) (4) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:SetSearchAddrL(255) (5) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (6) status 1: Transmission with backward response, backward_frame=0xff
DEBUG:commissioning:Setting search address 0x7fffff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrH(127), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrH(127)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1414, count=4, msg=b17f4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrH(127) (7) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (8) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xbfffff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrH(191), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrH(191)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1418, count=4, msg=b1bf4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrH(191) (9) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (10) status 1: Transmission with backward response, backward_frame=0xff
DEBUG:commissioning:Setting search address 0x9fffff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrH(159), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrH(159)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1422, count=4, msg=b19f4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrH(159) (11) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (12) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xafffff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrH(175), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrH(175)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1426, count=4, msg=b1af4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrH(175) (13) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (14) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xb7ffff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrH(183), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrH(183)
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1430, count=2, msg=b1b74000
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1400, count=2, msg=a9004000
DEBUG:wb-dali_14_bus1:Compare (0) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:SetSearchAddrH(183) (15) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xbbffff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrH(187), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrH(187)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1402, count=4, msg=b1bb4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrH(187) (1) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (2) status 1: Transmission with backward response, backward_frame=0xff
DEBUG:commissioning:Setting search address 0xb9ffff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrH(185), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrH(185)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1406, count=4, msg=b1b94000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrH(185) (3) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (4) status 1: Transmission with backward response, backward_frame=0xff
DEBUG:commissioning:Setting search address 0xb8ffff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrH(184), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrH(184)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1410, count=4, msg=b1b84000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrH(184) (5) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (6) status 1: Transmission with backward response, backward_frame=0xff
DEBUG:commissioning:Setting search address 0xb87fff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrM(127), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrM(127)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1414, count=4, msg=b37f4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrM(127) (7) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (8) status 1: Transmission with backward response, backward_frame=0xff
DEBUG:commissioning:Setting search address 0xb83fff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrM(63), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrM(63)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1418, count=4, msg=b33f4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrM(63) (9) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (10) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xb85fff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrM(95), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrM(95)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1422, count=4, msg=b35f4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrM(95) (11) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (12) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xb86fff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrM(111), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrM(111)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1426, count=4, msg=b36f4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrM(111) (13) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (14) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xb877ff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrM(119), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrM(119)
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1430, count=2, msg=b3774000
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1400, count=2, msg=a9004000
DEBUG:wb-dali_14_bus1:Compare (0) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:SetSearchAddrM(119) (15) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xb87bff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrM(123), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrM(123)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1402, count=4, msg=b37b4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrM(123) (1) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (2) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xb87dff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrM(125), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrM(125)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1406, count=4, msg=b37d4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrM(125) (3) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (4) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xb87eff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrM(126), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrM(126)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1410, count=4, msg=b37e4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrM(126) (5) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (6) status 1: Transmission with backward response, backward_frame=0xff
DEBUG:commissioning:Setting search address 0xb87e7f
DEBUG:wb-dali_14_bus1:send: SetSearchAddrL(127), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrL(127)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1414, count=4, msg=b57f4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrL(127) (7) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (8) status 1: Transmission with backward response, backward_frame=0xff
DEBUG:commissioning:Setting search address 0xb87e3f
DEBUG:wb-dali_14_bus1:send: SetSearchAddrL(63), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrL(63)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1418, count=4, msg=b53f4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrL(63) (9) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (10) status 1: Transmission with backward response, backward_frame=0xff
DEBUG:commissioning:Setting search address 0xb87e1f
DEBUG:wb-dali_14_bus1:send: SetSearchAddrL(31), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrL(31)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1422, count=4, msg=b51f4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrL(31) (11) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (12) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xb87e2f
DEBUG:wb-dali_14_bus1:send: SetSearchAddrL(47), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrL(47)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1426, count=4, msg=b52f4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrL(47) (13) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (14) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xb87e37
DEBUG:wb-dali_14_bus1:send: SetSearchAddrL(55), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrL(55)
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1430, count=2, msg=b5374000
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1400, count=2, msg=a9004000
DEBUG:wb-dali_14_bus1:Compare (0) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:SetSearchAddrL(55) (15) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xb87e3b
DEBUG:wb-dali_14_bus1:send: SetSearchAddrL(59), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrL(59)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1402, count=4, msg=b53b4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrL(59) (1) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (2) status 1: Transmission with backward response, backward_frame=0xff
DEBUG:commissioning:Setting search address 0xb87e39
DEBUG:wb-dali_14_bus1:send: SetSearchAddrL(57), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrL(57)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1406, count=4, msg=b5394000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrL(57) (3) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (4) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xb87e3a
DEBUG:wb-dali_14_bus1:send: SetSearchAddrL(58), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrL(58)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1410, count=4, msg=b53a4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrL(58) (5) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (6) status 1: Transmission with backward response, backward_frame=0xff
DEBUG:commissioning:Setting search address 0xb87e39
DEBUG:wb-dali_14_bus1:send: SetSearchAddrL(57), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrL(57)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1414, count=4, msg=b5394000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrL(57) (7) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (8) status 2: Transmission without response
DEBUG:commissioning:Setting search address 0xb87e3a
DEBUG:wb-dali_14_bus1:send: SetSearchAddrL(58)
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrL(58)
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1418, count=2, msg=b53a4000
DEBUG:wb-dali_14_bus1:SetSearchAddrL(58) (9) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:send: QueryShortAddress
DEBUG:wb-dali_14_bus1:Processing queue item: QueryShortAddress
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1420, count=2, msg=bb004000
DEBUG:wb-dali_14_bus1:QueryShortAddress (10) status 1: Transmission with backward response, backward_frame=0x0f
DEBUG:wb-dali_14_bus1:send: Withdraw
DEBUG:wb-dali_14_bus1:Processing queue item: Withdraw
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1422, count=2, msg=ab004000
DEBUG:wb-dali_14_bus1:Withdraw (11) status 2: Transmission without response
INFO:commissioning:Device found at 0xb87e3a with short address 7
DEBUG:commissioning:Setting search address 0xffffff
DEBUG:wb-dali_14_bus1:send: SetSearchAddrH(255), SetSearchAddrM(255), SetSearchAddrL(255), Compare
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrH(255)
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrM(255)
DEBUG:wb-dali_14_bus1:Processing queue item: SetSearchAddrL(255)
DEBUG:wb-dali_14_bus1:Processing queue item: Compare
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1424, count=8, msg=b1ff4000b3ff4000b5ff4000a9004000
DEBUG:wb-dali_14_bus1:SetSearchAddrH(255) (12) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:SetSearchAddrM(255) (13) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:SetSearchAddrL(255) (14) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Compare (15) status 2: Transmission without response
INFO:commissioning:No device left to address, exiting
DEBUG:wb-dali_14_bus1:send: Terminate, FF24.StopQuiescentMode
DEBUG:wb-dali_14_bus1:Processing queue item: Terminate
DEBUG:wb-dali_14_bus1:Processing queue item: FF24.StopQuiescentMode
DEBUG:wb-dali_14_bus1:Sending Modbus RPC command: function=16, address=1400, count=4, msg=a1004000fe1e52ff
DEBUG:wb-dali_14_bus1:Terminate (0) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:FF24.StopQuiescentMode (1) status 2: Transmission without response
DEBUG:wb-dali_14_bus1:Deinitializing...
DEBUG:wb-dali_14_bus1:Deinitialized successfully

Если устройство балласт (ПРА) - то оно должно отзываться на перебор адресов. Покажите пожалуйста лог из кнсоли, при запуске из консоли

Тут, скорее вопрос к нашей стратегии, переадресую разработчикам.

1. Будем считать, что прошло менее 15 минут. Команда INITIALISE естественно тоже есть, и с неё начинается процедура. Правильно ли я понимаю, что ваш контроллер в отсутствие коллизий не передаёт команду “RANDOMISE”? Если это так, то встаёт вопрос о факте наступления коллизий. Их контроллер может зафиксировать только после подачи команды “COMPARE”, которая, в свою очередь, следует гораздо позже отсутствующей RANDOMISE. Нарушается причинно-следственная связь.

2. Есть ли в реализации функции вашего контроллера Dali какие-либо упрощения протокола, смена установленного порядка следования команд или проприетарные решения?

Да, верно.


Устройство проверяется на дубль адреса (независимо от того то он не “начальный”).

Довольно общий вопрос…
ПО открыто: GitHub - wirenboard/wb-mqtt-dali: MQTT DALI bridge for Wiren Board · GitHub
Ну и не готов ответить сходу.

Речь идёт не о дублях адресов, а о поддиапазонах, в которых возможно проявление коллизий.

Чуть ниже как раз “канонический порядок”

a1 00 TERMINATE (опционально, сброс состояния)
a5 00 ×2 INITIALISE(0x00) 2 раза в пределах 100 мс
a7 00 ×2 RANDOMISE 2 раза, затем пауза ≥100 мс
b1 XX SEARCHADDRH ┐
b2 XX SEARCHADDRM │ двоичный поиск по 24 битам
b3 XX SEARCHADDRL │
a9 00 COMPARE ┘ ответ 0xFF, если randomAddress ≤ searchAddress
b7 XX PROGRAM SHORT ADDRESS
b9 XX VERIFY SHORT ADDRESS
ab 00 WITHDRAW
a1 00 TERMINATE

Я, пожалуй, недостаточно компетентен чтобы обсуждать именно реализацию.
Могу передать вопрос разработчикам, конечно. Но - пока не понимаю его смысла.

Смысл в соответствии требованиям протокола, как мне кажется. Те балласты, которые генерируют свои трёхбайтные ID по команде “RANDOMISE” просто не смогут определиться контроллером. Балласты, которые вытаскивают свои предзашитые байты ID из EEPROM тоже будут ждать команды “RANDOMISE”. И лишь те из них, которые знают, что этой команды может и не быть - будут готовы к подобным приколам

При попытке раскрытия “карточки светильника”, как писали ранее, крутится вечная ошибка непринятого ответа на “QueryDimmingCurve”. После внесения в софт балласта реакции на этот запрос контроллера появляются новые ошибки непринятого ответа на “QueryGroupsZeroToSeven” и “QueryGroupsEightToFifteen”. Добавил, ок. Дальше начинается ошибка ответа на “QuerySceneLevel”. Чисто теоретически, конечно, процесс можно продолжать пока все факультативные и необязательные (по протоколу!!!) к передаче параметры не будут переданы контроллеру. Или же продолжать кроить софт, добавляя всякий раз по новому параметру, в надежде, что вот-вот контроллер “удовлетворится”. Можете ли Вы опубликовать минимальный достаточный перечень факультативных параметров, обязательных по “мнению” контроллера для раскрытия “карточки”? Если же он до неприличия велик, то почему бы не предусмотреть возможность раскрытия “карточки” с базовыми 5-6 параметрами, такими как Query: Status, Device Type, Actual Level, Min/Max Level, Version Numb?

Так, вот для примера, покажу как читается DT8 драйвер.
Полный лог:

11:24:05.260
0f 99
QueryDeviceType(A7)
00 ff
multiple
11:24:05.460
0f a7
QueryNextDeviceType(A7)
00 06
LED lamp
11:24:05.661
0f a7
QueryNextDeviceType(A7)
00 08
Colour control
11:24:05.861
0f a7
QueryNextDeviceType(A7)
00 fe
none / end
11:24:06.069
c1 06
EnableDeviceType(6)
11:24:06.076
0f ee
DT6.QueryDimmingCurve(A7)
00 00
0
11:24:06.269
c1 08
EnableDeviceType(8)
11:24:06.273
0f f8
DT8.QueryColourStatus(A7)
00 20
colour type colour temperature Tc active
11:24:06.516
0f a0
QueryActualLevel(A7)
00 00
0
11:24:06.526
a3 82
DTR0(130)
11:24:06.534
c1 08
EnableDeviceType(8)
11:24:06.575
0f fa
DT8.QueryColourValue(A7)
00 01
1
11:24:06.735
0f 98
QueryContentDTR0(A7)
00 72
114
11:24:06.744
a3 80
DTR0(128)
11:24:06.750
c1 08
EnableDeviceType(8)
11:24:06.757
0f fa
DT8.QueryColourValue(A7)
00 00
0
11:24:06.792
0f 98
QueryContentDTR0(A7)
00 99
153
11:24:06.930
a3 83
DTR0(131)
11:24:06.934
c1 08
EnableDeviceType(8)
11:24:06.937
0f fa
DT8.QueryColourValue(A7)
00 01
1
11:24:06.942
0f 98
QueryContentDTR0(A7)
00 72
114
11:24:07.133
a3 81
DTR0(129)
11:24:07.141
c1 08
EnableDeviceType(8)
11:24:07.146
0f fa
DT8.QueryColourValue(A7)
00 00
0
11:24:07.153
0f 98
QueryContentDTR0(A7)
00 99
153
11:24:07.518
0f c0
QueryGroupsZeroToSeven(A7)
00 20
32
11:24:07.522
0f c1
QueryGroupsEightToFifteen(A7)
00 00
0
11:24:07.714
0f a5
QueryFadeTimeFadeRate(A7)
00 27
Fade time: 2; Fade rate: 7
11:24:08.111
0f a1
QueryMaxLevel(A7)
00 fe
254
11:24:08.319
0f 90
QueryStatus(A7)
00 80
power failure
11:24:08.323
0f a0
QueryActualLevel(A7)
00 00
0
11:24:08.521
0f a0
QueryActualLevel(A7)
00 00
0
11:24:08.522
a3 f0
DTR0(240)
11:24:08.589
c1 08
EnableDeviceType(8)
11:24:08.594
0f fa
DT8.QueryColourValue(A7)
00 20
32
11:24:08.848
a3 02
DTR0(2)
11:24:08.854
c1 08
EnableDeviceType(8)
11:24:08.860
0f fa
DT8.QueryColourValue(A7)
00 01
1
11:24:09.098
0f 98
QueryContentDTR0(A7)
00 12
18
11:24:09.344
0f a2
QueryMinLevel(A7)
00 01
1
11:24:09.602
0f b0
QuerySceneLevel(A7, 0)
00 ff
MASK
11:24:09.608
a3 f0
DTR0(240)
11:24:09.614
c1 08
EnableDeviceType(8)
11:24:09.848
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK
11:24:10.137
0f b1
QuerySceneLevel(A7, 1)
00 cb
203
11:24:10.146
a3 f0
DTR0(240)
11:24:10.152
c1 08
EnableDeviceType(8)
11:24:10.160
0f fa
DT8.QueryColourValue(A7)
00 20
32
11:24:10.447
a3 e2
DTR0(226)
11:24:10.456
c1 08
EnableDeviceType(8)
11:24:10.457
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK
11:24:10.459
0f 98
QueryContentDTR0(A7)
00 ff
255
11:24:10.745
0f b2
QuerySceneLevel(A7, 2)
00 4c
76
11:24:10.749
a3 f0
DTR0(240)
11:24:10.753
c1 08
EnableDeviceType(8)
11:24:10.757
0f fa
DT8.QueryColourValue(A7)
00 20
32
11:24:11.060
a3 e2
DTR0(226)
11:24:11.065
c1 08
EnableDeviceType(8)
11:24:11.070
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK
11:24:11.077
0f 98
QueryContentDTR0(A7)
00 ff
255
11:24:11.348
0f b3
QuerySceneLevel(A7, 3)
00 ff
MASK
11:24:11.354
a3 f0
DTR0(240)
11:24:11.358
c1 08
EnableDeviceType(8)
11:24:11.362
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK
11:24:11.657
0f b4
QuerySceneLevel(A7, 4)
00 ff
MASK
11:24:11.665
a3 f0
DTR0(240)
11:24:11.671
c1 08
EnableDeviceType(8)
11:24:11.678
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK
11:24:11.970
0f b5
QuerySceneLevel(A7, 5)
00 ff
MASK
11:24:11.977
a3 f0
DTR0(240)
11:24:11.981
c1 08
EnableDeviceType(8)
11:24:11.989
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK
11:24:12.275
0f b6
QuerySceneLevel(A7, 6)
00 ff
MASK
11:24:12.280
a3 f0
DTR0(240)
11:24:12.285
c1 08
EnableDeviceType(8)
11:24:12.293
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK
11:24:12.569
0f b7
QuerySceneLevel(A7, 7)
00 ff
MASK
11:24:12.572
a3 f0
DTR0(240)
11:24:12.576
c1 08
EnableDeviceType(8)
11:24:12.584
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK
11:24:12.873
0f b8
QuerySceneLevel(A7, 8)
00 ff
MASK
11:24:12.876
a3 f0
DTR0(240)
11:24:12.878
c1 08
EnableDeviceType(8)
11:24:12.881
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK
11:24:13.168
0f b9
QuerySceneLevel(A7, 9)
00 ff
MASK
11:24:13.172
a3 f0
DTR0(240)
11:24:13.175
c1 08
EnableDeviceType(8)
11:24:13.180
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK
11:24:13.466
0f ba
QuerySceneLevel(A7, 10)
00 ff
MASK
11:24:13.472
a3 f0
DTR0(240)
11:24:13.478
c1 08
EnableDeviceType(8)
11:24:13.695
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK
11:24:13.986
0f bb
QuerySceneLevel(A7, 11)
00 ff
MASK
11:24:13.993
a3 f0
DTR0(240)
11:24:13.998
c1 08
EnableDeviceType(8)
11:24:14.006
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK
11:24:14.264
0f bc
QuerySceneLevel(A7, 12)
00 ff
MASK
11:24:14.268
a3 f0
DTR0(240)
11:24:14.269
c1 08
EnableDeviceType(8)
11:24:14.318
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK
11:24:14.547
0f a0
QueryActualLevel(A7)
00 00
0
11:24:14.824
0f a0
QueryActualLevel(A7)
00 00
0
11:24:14.829
a3 f0
DTR0(240)
11:24:14.834
c1 08
EnableDeviceType(8)
11:24:14.876
0f fa
DT8.QueryColourValue(A7)
00 20
32
11:24:15.144
a3 02
DTR0(2)
11:24:15.151
c1 08
EnableDeviceType(8)
11:24:15.156
0f fa
DT8.QueryColourValue(A7)
00 01
1
11:24:15.163
0f 98
QueryContentDTR0(A7)
00 12
18
11:24:15.484
0f bd
QuerySceneLevel(A7, 13)
00 ff
MASK
11:24:15.489
a3 f0
DTR0(240)
11:24:15.495
c1 08
EnableDeviceType(8)
11:24:15.496
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK
11:24:15.796
0f be
QuerySceneLevel(A7, 14)
00 ff
MASK
11:24:15.805
a3 f0
DTR0(240)
11:24:15.811
c1 08
EnableDeviceType(8)
11:24:15.818
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK
11:24:16.104
0f bf
QuerySceneLevel(A7, 15)
00 ff
MASK
11:24:16.109
a3 f0
DTR0(240)
11:24:16.114
c1 08
EnableDeviceType(8)
11:24:16.159
0f fa
DT8.QueryColourValue(A7)
00 ff
MASK

Определение типов поддержитваемых устройством

QueryDeviceType → 0xFF (multiple)
QueryNextDeviceType тут ответы  06, 08 и FE(end)

это DT6 + DT8 — LED-драйвер с управлением цветом. Дальше перед соответствущими командами корректно передается EnableDeviceType(6..8) непосредственно перед запросом (требование стандарта, между ними ничего не должно вклиниваться).

  1. Базовые параметры
Запрос прочитано описание
DT6 DimmingCurve 0 стандартная логарифмическая кривая
DT8 ColourStatus 0x20 режим tunable white
ActualLevel 0 выключена, но это как раз периодчиеский запрос
Min / Max level 1 / 254 уровни (градации)
FadeTime / FadeRate 2 / 7 затухание, время
Groups 0–7 / 8–15 0x20 / 0x00 входит только в группу 5
Status 0x80 взведён powerCycleSeen после подачи питания команд еще не было; resetState=0, значит устройство сконфигурировано)
  1. Границы и текущая цветовая температура через DTR0 = идентификатор: QueryColourValue → QueryContentDTR0 старший байт передается в ответе, младший читается из DTR0:
  • DTR0=128/129: 0x0099 = 153
  • DTR0=130/131: 0x0172 = 370
  • DTR0=2 0x0112 = 274
  1. Перебор всех сцен, 16 штук (11:24:09 до 11:24:16)

Для каждой сцены: запрос уровня, QuerySceneLevel`, затем через DTR0 тип сохранённого цвета.

И да, регулярныйQueryActualLevel - это циклический опрос.

Опрашиваются в соответствии с типом устройства, например для DT8 тут

Большое спасибо за потраченное время, но, мне гораздо важнее было получить конкретные ответы на конкретные вопросы вместо кусков логов и ссылок на исходники. Не в обиду, но я впервые сталкиваюсь с подобными танцами с бубном сопрягая далишные слэйвы с контроллером. Если мастер работает по канону Dali, как например, тот же Osram или MeanWell, то наверняка мне не придётся рыться в исходниках этих производителей.

В исходниках как раз и есть список параметров (ну и ветвления в зависимости от получаемого).

То есть - невозможно без того чтобы увидеть ответы устройства на QueryDeviceType определить что и в каком порядке у него будет запрошено.

Покажите пожалуйста лог сканирования, все ж. Тогда - будет понятнее что нужно.

Предлагаю просто курьером отправить наш светильник для тестов, чтобы не было бесконечных переписок)
Там будет стоять наш преобразователь DALI в ШИМ. В нем такая же прошивка.

отправьте конечно, хуже не будет. На адрес офиса с сайта.

Пока мне кажется, что это ваша реализация не соответствует требованиям протокола. В стандарте DALI же явно написано как на какую команду должно реагировать устройство. У нас есть целиком IEC 62386 свежий (это тысячи страниц документации, кстати), и я там ничего не вижу про

последовательность адресации должна начинаться с команды Randomise , после чего следует SearchAddr

как вы пишете. Т.е. пока кажется, что вы просто завязались на последовательность команд из примера из стандарта, но по стандарту эта последовательность имеет право быть любой другой. Пример для поиска из стандарта намерено упрощённый. Все шлюзы, которые мы видели, включая кстати Lunatone Cockpit, эту последовательность усложняют, чтобы поиск работал быстрее.

Если у вас нет стандартов, то мы готовы помочь. Сами стандарты я вам дать (кажется) не имею права, но мы можем созвониться по видео с вашими инженерами и совместно их почитать.