Здравствуйте!
Контроллер Wiren Board 8.5, пакеты wb-mqtt-homeui и wb-homeui-backend
версии 2.208.1-wb101.
СИМПТОМ
Если устройство удаляет свой контрол на ходу (публикует пустой retained в
топик значения и в …/meta), то:
- на вкладке «Устройства» контрол пропадает сразу — правильно;
- на дашборде, куда этот контрол добавлен ячейкой виджета, строка остаётся
висеть пустой и уходит только после перезагрузки страницы (F5).
У нас это заметно постоянно: наше устройство публикует активные коды
неисправностей двигателя динамическими контролами — контрол на код создаётся,
когда код появился, и удаляется, когда код погас. После погасания кодов
оператор видит на дашборде пустые строки от уже удалённых контролов.
КАК ПОВТОРИТЬ
1. Создать контрол (на контроллере, в одну строку):
mosquitto_pub -h 127.0.0.1 -q 1 -r \
-t /devices/testdev/controls/c1/meta \\
-m '{"type":"text","readonly":true,"title":{"ru":"тест"}}'
mosquitto_pub -h 127.0.0.1 -q 1 -r \
-t /devices/testdev/controls/c1 -m 'значение'
2. В Web UI создать виджет с ячейкой testdev/c1 и положить его на дашборд.
Открыть дашборд — строка есть, значение обновляется.
3. Удалить контрол (пустой retained, сначала значение, потом мета):
mosquitto_pub -h 127.0.0.1 -q 1 -r -t /devices/testdev/controls/c1 -m ‘’
mosquitto_pub -h 127.0.0.1 -q 1 -r -t /devices/testdev/controls/c1/meta -m ‘’
4. Не перезагружая страницу, посмотреть оба места.
ОЖИДАЕТСЯ: строка исчезает с дашборда сразу, как и на вкладке «Устройства».
ФАКТИЧЕСКИ: на вкладке «Устройства» контрол исчез, на дашборде пустая строка
осталась до F5.
В брокере после удаления retained-сообщений не остаётся (проверяли
mosquitto_sub).
ГДЕ, ПО-НАШЕМУ, СОБАКА ЗАРЫТА
Точных исходников у нас нет, смотрели минифицированный main.*.js, так что это
гипотеза — но она сходится с поведением.
В сторе устройств контролы лежат в двух местах: в наборе у самого устройства и
в общей Map, и дашборд рисует ячейку по наличию в общей Map. Обработчик пустого
…/meta убирает контрол только из набора устройства — отсюда и разница между
вкладкой «Устройства» и дашбордом.
Из общей Map контрол удаляется в другой ветке, и только при условии
type === “incomplete” && value === null. Для контролов строкового типа
(у нас type: “text”) value в null не превращается: пустое значение приводится
к “” или “-”, а null получается, насколько мы видим, только у типа rgb. То есть
для текстового контрола это условие недостижимо, и запись в общей Map остаётся
навсегда.
ПОЧЕМУ ПИШЕМ
Пока обходимся правкой бандла у себя, но это слетает при каждом обновлении
пакета. Будем рады, если поправите у себя — тогда мы свою правку снимем.
Спасибо!