Топик mqtt Unavailable после отключения/включения модуля

Здравствуйте.

Контроллер wirenboard 8.5, к нему подключены 2 модуля wb-mr6c.
Управление реализую в home assistant (не на контроллере, на стороннем сервере).
В wirenboard установил wb-engine, добавил выход K1 “Add control to HomeAssistant”.
home assistant увидел control, написал сцену.
Все работает.

Как это увидел Home Assistant:
WB-MR6C 181 Command K1 (switch.wb_mr6c_181_k1)
MQTT discovery data:
Topic: homeassistant/switch/wb-mr6c_181/k1/config
Payload
Subscribed topics:
/devices/wb-mr6c_181/controls/K1
10 most recently received messages
/devices/wb-mr6c_181/controls/K1/meta
1 most recently received message
/devices/wb-mr6c_181/controls/K1/meta/error
10 most recently received messages
Transmitted messages:
/devices/wb-mr6c_181/controls/K1/on
10 most recently transmitted messages

Отключил питание модуля wb-mr6c, нажал “переключить” в home assistant.
Кнопка K1 в home assistant получила статусе Unavailable.
Включил питание модуля
Кнопка K1 в home assistant осталась в статусе Unavailable.

Посмотрел “Каналы MQTT”
В K1: w - write to device error
The w write error flag is removed only after a successful write, regardless of whether the read was successful.
Непонятно, что надо сделать.
Home assistant не позволяет записать в канал, т.к. он unavailable.
А wirenboard пишет, что write error исчезнет, как только успешно запишешь…
Но как записать, если unavailable…

Зашел в widget, нажал на K1.
Реле переключилось, K1 стал доступен, топик mqtt заработал.

Просветите пожалуйста, в чем причина и как решается такая проблема ?

Добрый день!

Для диагностики проблемы пришлите, пожалуйста, архив с диагностической информацией контроллера. Создание архива описано в документации.

Это поможет более точно понять в чем проблема.

приложен диагностический архив, доступен только сотрудникам поддержки
(254,2 КБ)
Здравствуйте.

Момент включения модуля реле, после которого, по идее mqtt топик должен стать рабочим.

Jul 13 15:56:00 wirenboard-AT22VB27 wb-mqtt-serial[7825]: INFO: [modbus] Continuous read enabled [slave_id is 181]

Картинки из HA.

Из WB

Добрый день!

Потребуется некоторое время на анализ информации.

Есть предположение о причине: пока модуль был без питания, запись в K1 не прошла, и драйвер выставил постоянный (retained) флаг ошибки.

По конвенции флаг w снимается только успешной записью в этот канал.
Обсужу с коллегами, как лучше сделать.

Рекомендую написать в топик автору разработчику.

Здравствуйте.
К разработчику wb engine это никак не относится.
wb engine создал топик homeassistant/switch/wb-mr6c_181/k1/config .

В нем

{

  "device": {

"identifiers": "wb-mr6c_181",

"manufacturer": "WirenBoard",

"model": "wb-mr6c [wb-modbus]",

"name": "WB-MR6C 181"

},

"availability_mode": "latest",

"enabled_by_default": true,

"availability": [

{

"topic": "/devices/wb-mr6c_181/controls/K1",

"value_template": "{{ False if value == '' else True }}",

"payload_not_available": false,

"payload_available": true

},

{

"topic": "/devices/wb-mr6c_181/controls/K1/meta",

"value_template": "{{ False if value == '' else True }}",

"payload_not_available": false,

"payload_available": true

},

{

"topic": "/devices/wb-mr6c_181/controls/K1/meta/error",

"value_template": "{{ True if value == '' else False }}",

"payload_not_available": false,

"payload_available": true

}

],

"name": "Command K1",

"unique_id": "wb-mr6c_181_k1",

"default_entity_id": "switch.wb-mr6c_181_k1",

"state_topic": "/devices/wb-mr6c_181/controls/K1",

"payload_on": 1,

"payload_off": 0,

"command_topic": "/devices/wb-mr6c_181/controls/K1/on"

}

homeassistant обращается /devices/wb-mr6c_181/controls/K1/on .
А этот топик создал wb-mqtt-serial , wb-engine тут не у дел…
Могу для пробы записать из MQTT explorer, если у вас не воспроизводится проблема.

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

Суть проблемы.
Схема: Home assistant → wirenboard8 → mr6c .
Из home assistant управляю каналом K1, все прекрасно работает, нажимаю на control в home assistant, реле переключается.

root@wirenboard-AT22VB27:~# mosquitto_sub -t '/devices/wb-mr6c_181/controls/K1/#' -v 
/devices/wb-mr6c_181/controls/K1/meta {"order":15,"readonly":false,"title":{"en":"Command K1","ru":"\u041a\u043e\u043c\u0430\u043d\u0434\u0430 K1"},"type":"switch"} 
/devices/wb-mr6c_181/controls/K1/meta/order 1 5
/devices/wb-mr6c_181/controls/K1/meta/readonly  0
/devices/wb-mr6c_181/controls/K1/meta/type swi tch
/devices/wb-mr6c_181/controls/K1 0
/devices/wb-mr6c_181/controls/K1/on 1
/devices/wb-mr6c_181/controls/K1 1
/devices/wb-mr6c_181/controls/K1/on 0
/devices/wb-mr6c_181/controls/K1 0
/devices/wb-mr6c_181/controls/K1/on 1
/devices/wb-mr6c_181/controls/K1 1

Ошибок нет, все ок.

В момент переключения K1 выключаю питание mr6c .
В топике error появляется rw .
/devices/wb-mr6c_181/controls/K1/on 1
/devices/wb-mr6c_181/controls/K1/meta/error rw
Ожидаемо.
Включаю mr6c.

Проблема в том, что в home assistant контрол остается “unavailable”, и не принимает команды. Т.е. кнопка не активна.


До тех пор, пока кто либо не запишет в топик /devices/wb-mr6c_181/controls/K1/on .
Т.е. чтобы control в homeassistant стал активен, кто-то (извне) должен записать любое значение в /devices/wb-mr6c_181/controls/K1/on …

Возможно это из-за того, как wb engine описал этот канал, но не понимаю, где .
homeassistant/switch/wb-mr6c_181/k1/config :
{
"device": {
"identifiers": "wb-mr6c_181",
"manufacturer": "WirenBoard",
"model": "wb-mr6c [wb-modbus]",
"name": "WB-MR6C 181"
},
"availability_mode": "latest",
"enabled_by_default": true,
"availability": [
{
"topic": "/devices/wb-mr6c_181/controls/K1",
"value_template": "{{ False if value == '' else True }}",
"payload_not_available": false,
"payload_available": true
},
{
"topic": "/devices/wb-mr6c_181/controls/K1/meta",
"value_template": "{{ False if value == '' else True }}",
"payload_not_available": false,
"payload_available": true
},
{
"topic": "/devices/wb-mr6c_181/controls/K1/meta/error",
"value_template": "{{ True if value == '' else False }}",
"payload_not_available": false,
"payload_available": true
}
],
"name": "Command K1",
"unique_id": "wb-mr6c_181_k1",
"default_entity_id": "switch.wb-mr6c_181_k1",
"state_topic": "/devices/wb-mr6c_181/controls/K1",
"payload_on": 1,
"payload_off": 0,
"command_topic": "/devices/wb-mr6c_181/controls/K1/on"
}

Записываю в topic любое значение

root@wirenboard-AT22VB27:~# mosquitto_pub -t '/devices/wb-mr6c_181/controls/K1/on' -m "0" 
/devices/wb-mr6c_181/controls/K1/on 0 
/devices/wb-mr6c_181/controls/K1  0
/devices/wb-mr6c_181/controls/K1/meta/error (nul l)

Сбрасывается error, и control становится снова рабочим в home assistant.

Подскажите, где именно в
homeassistant/switch/wb-mr6c_181/k1/config
указано, что если в /devices/wb-mr6c_181/controls/K1/meta/error не null, то топик
“/devices/wb-mr6c_181/controls/K1 on”
есть unavailable и в него нельзя писать ?
Или home assistant сам знает meta\error, и при наличии в нем ошибки трактует топик unavailable (а точнее read only, т.к. после записи в топик он становится активен) ?

Как решить эту проблему ?
Т.е. чтобы при появлении связи с mr6c, homeassistant смог писать в топик ?
Навскидку могу в wb-rules отловить event что mr6c появился, и записать во все выходные топики ‘0’.
Но возможно есть более цивилизованное решение ?

Да, вполне.
А что после включения питания модуля?
Топик meta/error, имею в виду.

Как выше и писали - эта интеграция не нами разработана.
Я обрабатываю топик доступности по друголму при конфигурировании.

После включения питания в meta/error то же, “rw”.
Т.е. пока не запишу что либо в “/devices/wb-mr6c_181/controls/K1 on” (используя mosquitto_pub), в meta/error будет “rw”.

Подскажите, как ?

Собственно использовать стороннюю интеграцию особого желания нет.
Но для вашей интеграции

Описано только как ее добавить в home assistant, запущенный на wirenboard в docker.
Мне же надо добавить в home assistant на своем сервере.

Пытаюсь воспроизвести.
Для этого подписываюсь, снимаю питание с модуля реле, включаю канал записью в топик /on значения “1”
Ну и подаю питание

Jul 17 13:02:04 /devices/wb-mr6cv3_93/controls/K1/meta {"order":18,"readonly":false,"title":{"en":"Command K1","ru":"\u041a\u043e\u043c\u0430\u043d\u0434\u0430 K1"},"type":"switch"}
Jul 17 13:02:04 /devices/wb-mr6cv3_93/controls/K1/meta/order 18
Jul 17 13:02:04 /devices/wb-mr6cv3_93/controls/K1/meta/readonly 0
Jul 17 13:02:04 /devices/wb-mr6cv3_93/controls/K1/meta/type switch
Jul 17 13:02:04 /devices/wb-mr6cv3_93/controls/K1 0
Jul 17 13:02:39 /devices/wb-mr6cv3_93/controls/K1/meta/error r
Jul 17 13:02:47 /devices/wb-mr6cv3_93/controls/K1/on 1
Jul 17 13:02:47 /devices/wb-mr6cv3_93/controls/K1/meta/error rw
Jul 17 13:03:04 /devices/wb-mr6cv3_93/controls/K1/meta/error w
Jul 17 13:03:43 /devices/wb-mr6cv3_93/controls/K1/on 0
Jul 17 13:03:43 /devices/wb-mr6cv3_93/controls/K1 0
Jul 17 13:03:43 /devices/wb-mr6cv3_93/controls/K1/meta/error (null)
Jul 17 13:03:45 /devices/wb-mr6cv3_93/controls/K1/on 1
Jul 17 13:03:45 /devices/wb-mr6cv3_93/controls/K1 1

Да, если пытаться управлять отключенным устройством то в топике meta/error ожидаемо будет “w”.
Но в случае включения до истечения max_write_fail_time_s/ Если позже - то так и будет “w”. Это ожидаемо.

Да, можете добавить и на свой сервер, конечно.
Но в случае если он сконфигурирован как-то отлично от описанного в документации - вам нужно адаптировать интеграцию самостоятельно.

Например
Я никогда не использую стороннее ПО для которого не до конца понимаю логику работы.

Согласен, “w” или “rw” .

Полезная опция, спасибо.
Как ее можно включить через web интерфейс ?
Если добавлю непосредственно в /etc/wb-mqtt-serial.conf, то изменение параметров mqtt-serial в web интерфейсе, полагаю этот файл перезапишет.
Из этой директории /etc/wb-mqtt-serial.conf.d wb-mqtt-serial будет читать конфигурацию ?
Если этот параметр по умолчанию 600, то он не работает.
Я модуль отключал на 1 минуту, т.е. если опция работает, wb-mqtt-serial должен был записать значение в модуль и снять ошибку, но он это не сделал…

Логика wb engine в принципе понятна.
Как и функции publish() в wb-rules.
В /homeassistant/ для каждого канала (топика) создать json описание в топике config, описав в какой топик писать, из какого читать, что есть “available”, …
Т.е. он (wb-engine) не является шлюзом mqtt, а лишь описывает home assistant, с какими топиками и как работать.

Вопрос, по сути, как обойти имеющиеся ограничения home assistant при работе с вашим контроллером при отключении питания модуля (например mr6c).
Можно увеличить max_write_fail_time_s . Вопросы выше, как поменять параметр.
Можно игнорировать ошибку “w”.

  • topic: ‘/devices/wb-mr6c_181/controls/K1/meta/error’
    value_template: ‘{{ True if value != ‘‘r’’ else False }}’
    Можно в wb-rules при появлении модуля wb-mr6c считывать топик on, записывать его обратно (тем самым сбрасывая ошибку).

Т.е. как (по фэншую) сделать так, чтобы настраивать сценарий мышкой, а не дописывать модули на python в home assistant, обрабатывая meta/error .
Игнорировать ошибку вроде как плохо.
Но иметь неработающий интерфейс в home assitant тоже, вроде как не очень приятно.

Добрый день!

Да, всё верно — размещаете, как указано в репозитории, и должно работать.

Эта интеграция ещё активно развивается, возможны глобальные изменения — о них расскажем в новостях.

Добрый день,
Удалось ли решить вопрос?