Wiren Board - оптимизация опросов

13 февраля 2020, 07:51

Купил wirenboard, собрал тестовый стенд, и все хорошо работало на нем, с тремя устройствами... Проблемы начали появляться по мере эксплуатации и добавления новых устройств. Основная претензия была в том, что имея по 10+ устройств на линии, я получал немалые задержки 3-4 секунды !!! на срабатывание датчика движения, по которому должен был включаться свет. Это приводило к тому, что я мог пройти весь коридор, выйти с него, и только тогда в коридоре включалась ночная подсветка. Polling - серьезный недостаток протокола Modbus RTU. Я провел достаточно много экспериментов по улучшению скорости срабатывания датчиков, добился опроса в 300мс на 18 устройствах, и теперь могу поделиться своими наработками.

1. Физическое подключение

Сначала теория.

RS-485:Физическое подключение - как подключать витую пару по цветам. Также есть момент, касаемо терминатора на конце линии - терминатор можно не ставить, при длине линии менее 100 метров. Я у себя нигде не ставил, т.к. нет такой длины. Витая пара должна быть экранированной, для исключения наводок. 

RS-485:Основы функционирования интерфейса RS-485 - тут написано о том, почему надо подключать все последовательно, шиной, а не ветвями - звездой.  "Ветвление сети RS-485 не допускается – это делает практически невозможным ее согласование." Но у себя я допустил ветвление, в некоторых местах, и это никак не повлияло на сигнал.  Ветвление линии допустимо, но нежелательно. 

У контроллера в распоряжении 2 порта rs-485, для лучшего распределения устройств. Имеет смысл докупить еще 2 расширяющих модуля WBE2-I-RS485-ISO, таким образом будет 4 порта. Чем меньше устройств  на линии rs-485, тем выше скорость опроса.

У себя я сделал так:

  • порт 1: это самые быстрые модули: реле, диммеры - все, что должно работать максимально быстро (у меня тут 14 устройств);
  • порт 2: все датчики, счетчик электроэнергии, модули штор (у меня тут 18 устройств);
  • порт 3: пока тут только особый девайс, работающий на скорости 38600, скорость сменить нельзя;
  • порт 4: датчик на скорости 9600, резервная линия для опытов.

Проводить кабель надо последовательно, но здесь есть нюанс - не получится взять какое-то одно устройство с линии, перекинуть на другой порт и добиться максимальной скорости. Имеет смысл подумать, на каких датчиках нужен очень быстрый ответ и "посадить" их на отдельный порт. На 3 и 4 портах у меня висят одиночные девайсы, работающие на своих скоростях, которые нельзя изменить. При желании, я могу освободить эти порты, перенести девайсы на usb порты, но пока это мой резерв.

2. Настройка порта и устройств в UI

Baud rate на максимум, 115200 (может быть проблемой на длинных линиях свыше 100 метров, в таком случае - 57600).

Response timeout - этот параметр 500мс по умолчанию. Но я подобрал 50мс, меньше не советую ставить, т.к. у меня раз в несколько часов самопроизвольно перезагружался контроллер. Работает это так: контроллер опрашивает устройство и ждет ответа Х мс, иногда устройство не отвечает, по какой-то причине. Если на линии есть ошибки, то каждый раз ждать 500мс слишком долго. 

Для всех устройств надо установить скорость 115200, как это сделать: Настройка параметров обмена данными по RS-485 для modbus-устройств Wiren Board. 

Почему 115200?

1 / 9600 * 11 [бит в байте] * (8 [байт в запросе] + 4 [байт задержка перед ответом]) * 10 [запросов] = 137.5мс
1 / 115200 * 11 [бит в байте] * (8 [байт в запросе] + 4 [байт задержка перед ответом]) * 10 [запросов] = 11.5мс
Это скорость ответа на бумаге, один ответ от устройства. На 1 устройство приходится несколько опросов, например, на датчик msw3 - 10 опросов. То есть на линии с 10 msw3 будет 100 опросов и если посчитать 137.5*10-11.5*10=1260мс - теоретический выигрыш в скорости.

В настройках устройства обязательно надо переопределить параметр Delay before accessing device - поставить 10мс для каждого устройства. Это, пожалуй, самое действенное средство увеличения скорости. По умолчанию 300мс задержка перед чтением данных с девайса. Если у вас 10 устройств на линии, только задержка будет 300*10 = 3 секунды! Ставим 10мс (меньше нельзя) и общая задержка будет в 30 раз меньше.

3. Оптимизация шаблонов устройств

Немного теории, для общего понимания. Оставляем один датчик msw3 на линии, смотрим логи порта:

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

Синие рамки - это инициализация. Создаются диапазоны для каждого опроса. Для msw3 создалось 5 диапазонов, в зеленой рамке идут 5 опросов подряд. Далее еще одна синяя рамка, судя по всему - это какая-то надстройка, первый диапазон разбился на 3 отдельных, получилось 7 опросов всего. Вот этот момент должны оптимизировать на стороне производителя. 

Красные рамки - это уже рабочие цикличные опросы, 7 опросов подряд. Тут не все хорошо, я считаю, должно быть 4 опроса, вместо 7: 0-11 input, 97-98,  280-284 и 0-11 coils. Так как у всех регистров устройства задано одинаковое время опроса, то все они выполняются подряд, всегда в одинаковом порядке и на максимально возможной скорости порта. 

На самом деле, в базовом шаблоне еще больше опросов, это я уже убрал некоторые, об это дальше.

Самое важное: чем меньше опросов, тем быстрее.

Перейдем к оптимизации шаблонов. Информация, где хранятся шаблоны и описание параметров: Драйвер wb-mqtt-serial:Примеры написания шаблоновВсе стандартные шаблоны можно взять с github.

Принципы оптимизации такие:

  1. убрать регистры, которые не нужны и не используются;
  2. важным регистрам поставить poll_interval меньше, остальным - больше;
  3. не разбивать bulk опросы, должен быть одинаковый poll_interval в пределах одного опроса.

До оптимизации: 9 опросов, которые циклично выполнялись для каждого датчика, на максимальной скорости.
После оптимизации: 3 опроса: 1 опрос раз в секунду, 1 опрос на максимальной скорости, 1 опрос раз в 30 секунд.

Таким образом, удалось "разгрузить" линию, опросов стало значительно меньше, следовательно, возросла общая скорость.

У себя я отметил достаточную скорость срабатывания датчиков движения. Срабатывают практически моментально, не раздражают, как раньше.


Пример моих шаблонов:

config-wb-msw_v3-simple.json - шаблон для msw3.
config-wb-map12h-simple.json - шаблон для трез фазного счетчика  электроэнергии.

Установка шаблонов:

  1. Шаблоны записывать в папку  /usr/share/wb-mqtt-serial/templates
  2. Удалить устройство (через UI) из /etc/wb-mqtt-serial.conf
  3. Удалить все топики устройства через команду mqtt-delete-retained "/devices/wb-mrm2_114/#"
  4. Добавить устройство, выбрать новый шаблон

4. Софт, нагрузка CPU, правила

Это очевидно, но важно, как и все остальное, так как любой следующий пункт может повлиять на скорость работы.

  • Не следует ставить лишний софт, устанавливать только самое необходимое.
  • Правила WB могут сильно тормозить, если написаны плохо и/или их много, поэтому стоит задуматься о переносе всех сценариев на отдельный сервер (например, raspberry pi4). Вместо правил использовать Node-Red.
  • Следить за загрузкой CPU и памятью, например, контроллер WB может тормозить, если много разных девайсов подпишется на него по mqtt.
  • Иногда логи занимают все свободное место и начинаются тормоза, необходимо проверять доступное место на диске.

5. Работа modbus на Sprut.Hub

Бонусом о том, как работает modbus на Sprut.Hub (beta).  

Все, что надо сделать - это отключить порт в настройках Wirenboard. Теперь порт будет открывать SH и опрашивать устройства сам.

Настраивать вообще ничего не надо!

1) Устройства добавляются автоматически.
2) Подобраны минимальные задержки для опросов.
3) Опросы оптимизированы по приоритетам.


Все новости мира умных домов - t.me/SprutAI_News или Instagram
Остались вопросы? Мы в Telegram - @Soprut

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
  1. Евгений Лузин (EvLuz)
    Евгений Лузин (EvLuz) 4 дня назад

    Андрей, спасибо за развернутые исследования, думаю многие смогут избежать те же грабли и сэкономить кучу времени. 

  2. Александр Попов (9516970@gmail.com)

    Спасибо! Будем пробовать!

  3. (gonczarov)
    (gonczarov) 4 дня назад

    В новой квартире планирую все сделать на wirenboard и данная статья очень полезна! Спасибо Андрей!

К списку статей

Скидки для сообщества

Wiren Board

+7 495 150-66-19
Промокод:
SPRUTDELIVERY
Размер скидки:
0%
Вы получите бесплатную доставку.

Разумный дом

+7 487 223-51-50
Промокод:
71
Размер скидки:
20%
Указывать в письме или комментарии к заказу

УЮТНЫЙ ДОМ

+7 495 797-21-74
Промокод:
SPRUT
Размер скидки:
5%

Z-Wave Ukraine

+380 68 641 9670
Промокод:
Sprut-UA
Размер скидки:
15%

Похожие статьи

27 октября 2018, 12:20
Нативный Термостат для котла на ESP8266 с поддержкой Apple HomeKit
15 ноября 2018, 13:11
Xiaomi Mi Remote 360 добавляем Apple HomeKit
28 августа 2018, 09:48
От голого Raspbian до веб-интерфейса homebridge за четыре команды в терминале.
01 ноября 2018, 09:27
Настройка Deconz USB стика ConBee от Dresden Elektronik в Hass.io и некоторые особенности эксплуатации
30 июня 2018, 12:17
Добавляем устройства управляемые по ИК через Broadlink RM3 Mini на примере кондиционера.
03 апреля 2019, 04:29
Разбираем простейшую задачу по электрическому подключению светодиодной ленты к источнику питания и управлению через Умный дом.
04 апреля 2019, 08:22
Личная жизнь мешает увлечению "умным домом"? Есть решение!
25 сентября 2018, 07:06
Делаем умный замок с интеграцией в HomeKit
09 января 2019, 17:34
Небольшая статья о том, зачем нужна малина, почему автоматизации в HomeKit это не очень хорошо и чем USB стик лучше отдельного шлюза.
07 января 2019, 23:10
Внимание, в тексте присутствует ирония к разным системам отличным от Home-assistant. А так же лирика, которую разумеется читать не обязательно. В тексте так же пойдет речь о софте который я рекомендую использовать с любыми WEB дашбордами, без привязки к хом-асистанту, в связи с широко открываемыми дополнительными возможностями.