Не корректно посылает регистр

Добрый день. Столкнулся со следующей проблемой. Устройство работает по ModBus TCP. Сделали шаблон под устройство следующего типа

{
“id”: “power_control_onoff_1”,
“name”: “Power Control_onoff_1”,
“reg_type”: “holding”,
“address”: “40002:0:1”,
“write_address”: “40078:0:1”,
“group”: “io_control”,
“type”: “switch”,
“off_value”: “0”,
“on_value”: “1”
},

Когда посылаешь значение on “1“, то всё работает корректно. А вот при off “0“, wirenboard посылает значение 2. Это видно из трассировки запроса.

Если использовать вместо switch тип pushbutton, то всё работает корректно

При этом данная проблема возникает только с write_address. Если использовать просто address, то переключатель работает корректно. Но специфика оборудования требуется записывать в один регистр, а читать из другого.

Добрый день.
Включите пожалуйста debug для wb-mqtt-serial и покажите кусок лога, с записью.
Попробую по результатам воспроизвести у себя.

wb-mqtt-serial_20260430T165122 (1).log (765,6 КБ)
Переключатель называется
modbus-hvac-controller_50/power_control_onoff_1

В процессе экспериментов заработало вообще странным образом, когда указывается два раза write_address.
{
“id”: “power_control_onoff_1”,
“name”: “Power Control_onoff_1”,
“reg_type”: “holding”,
“write_address”: “40002:0:1”,
“write_address”: “40078:0:1”,
“group”: “io_control”,
“type”: “switch”,
“off_value”: “0”,
“on_value”: “1”
},

Но это как бы вообще не вариант использовать такой workaround.

Ну, что я вижу:

2026-04-30T13:50:51.559Z [wb-mqtt-serial] DEBUG: [serial port driver] channel 'Power Control_onoff_1' (MQTT control 'power_control_onoff_1') of device 'modbus-hvac-controller_50' <-- 0
2026-04-30T13:50:51.559Z [wb-mqtt-serial] DEBUG: [serial port driver] OnValue: 0; value: 0
2026-04-30T13:50:51.559Z [wb-mqtt-serial] DEBUG: [register] <modbus-tcp:50:holding: 40002:0:1> (U16) new value: 0x0000

Из него читается значение

2026-04-30T13:50:51.559Z [wb-mqtt-serial] DEBUG: [port] 192.168.10.30:502: ReadFrame: 06 9c 8e 00 02

0x02
Поскольку в этом значении нулевой бит уже опущен - то и ничго не пишется.

Не очень понял про 0x02 и нулевой бит.

В логах я тоже вижу new value: 0x0000
По факту запрос идёт на 02
Ниже скрин трейса данного запроса

А должен быть 00.

Еще заметил такой момент в логе.
2026-04-30T13:50:51.559Z [wb-mqtt-serial] DEBUG: [register] <modbus-tcp:50:holding: 40002:0:1> (U16) new value: 0x0000

Почему тут указан регистр 40002:0:1, когда меняем 40078:0:1

Я понимаю, что этот лог может относится к тому, что он поменял. Но почему тогда это происходит в туже милисекнду, что и изменение?

Тут, пожалуй, нужно воспроизводить.Соберу подходящий стенд, с кастомным устройством после праздников.
На всякий случай - точно ли у вас ПО актуальной версии? Если нет - обновите до актуального.

Версия актуальная 2602

Какая версия у пакета wb-mqtt-serial? Он уже обновлялся в 2602.

Version: 2.224.0-wb103

Актуальная в стабильном 2.224.0-wb105

Надо обновить отдельно wb-mqtt-serial?

Нет, все пакеты целиком.

Обновил всё. Перегрузил.
Теперь он вообще значение 4 посылает

Добавляю логи.
Время логов
06-05-2026 09:05:42.869

Но по логам всё отлично.

wb-mqtt-serial_20260506T090543.log (132,4 КБ)

Да. Поэтому - пробую воспроизвести, естественно в минимальной конфигурации.
Делаю Modbus TCP slave


Создаю шаблон с одним-единственным контролом:

Подготвка закончена, формулирую задачу:для проверки:
При переключении контрола в off значение младшего бита в регистре 40078 (контрол virtDev/value2) ставится в 0.
Ну и запись видим из debug лога сервиса.

Немного не так. У нас есть регистр, который требуется менять - 40078
И есть регистр, из которого требуется читать новое значение, после изменения регистра - 40002.
Для это использую конструкцию в шаблоне
“address”: “40002:0:1”,
“write_address”: “40078:0:1”,

Именно при таком варианте и происходит данная ошибка.

Да, верно.
Для этого я использовал такой шаблон:

{
  "device_type": "virtdev",
  "device": {
    "name": "virtdev",
    "id": "virtdev",
    "channels": [
      {
        "id": "power_control_onoff_1",
        "name": "Power Control_onoff_1",
        "reg_type": "holding",
        "write_address": "40002:0:1",
        "read_address": "40002:0:1",
        "group": "io_control",
        "type": "switch",
        "off_value": "0",
        "on_value": "1"
      }
    ]
  }
}

Начальное состояние - в обоих регистрах 0
Переключаю контрол устройства в true.
Ожидаю запись в регистр 40078.
Вижу в логе wb-mqtt-serial

May 06 14:23:20 wirenboard-AC4U5OVN wb-mqtt-serial[1888657]: DEBUG: [modbus] <10.0.0.85:502> modbus:44 write 1 holding(s) @ 40002
May 06 14:23:20 wirenboard-AC4U5OVN wb-mqtt-serial[1888657]: DEBUG: [port] 10.0.0.85:502: Sleep 0 us
May 06 14:23:20 wirenboard-AC4U5OVN wb-mqtt-serial[1888657]: DEBUG: [port] 10.0.0.85:502: Write: 00 01 00 00 00 06 2c 06 9c 42 00 01
May 06 14:23:20 wirenboard-AC4U5OVN wb-mqtt-serial[1888657]: DEBUG: [port] 10.0.0.85:502: ReadFrame: 00 01 00 00 00 06 2c
May 06 14:23:20 wirenboard-AC4U5OVN wb-mqtt-serial[1888657]: DEBUG: [port] 10.0.0.85:502: ReadFrame: 06 9c 42 00 01

Да, действительно, для записи используется регистр 40002
Это неожиданное поведение, оформлю багой.