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 - @SprutAI

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

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

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

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

  3. (gonczarov)
    (gonczarov) 9 месяцев назад

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

  4. (vchibikov)
    (vchibikov) 9 месяцев назад
    Спасибо за подробную инструкцию! Тем не менее возник вопрос (специально зарегистрировался, чтобы задать), у вас выделено, что витая пара должна быть экранированной, хотя в документации Wiren Board, на которую вы ссылаетесь, явно этого не написано, более того, там сказано: "можно использовать обычную витую пару CAT5 для Ethernet". Чем обусловлено ваше утверждение: вашим опытом, экспериментами или перестраховкой? Ведь один из смыслов витой пары как раз в какой-то помехозащищенности (если я ничего не путаю). Вопрос без подвоха - прямо сейчас выбираю кабель для прокладки трасс, и экранированный раза в три дороже. Заранее спасибо!
    • Андрей Попов (andreypopov)
      Андрей Попов (andreypopov) 9 месяцев назад

      Это опыт множества людей, я прислушивался к советам бывалых интеграторов. Ну и здравый смысл, если передаются данные, то нужна защита от наводок. Для кнопок можно обычную cat5 использовать, но я тоже взял экранированную, мало ли я захочу КНХ кнопки подключить... Переплата за FTP небольшая, и потом уже не перетянуть на другой кабель, внутри штукатурки. 

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

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

Устройства в материале

Wiren Board 6

Производитель: WirenBoard

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

Wiren Board

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

Разумный дом

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

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
02 июля 2020, 07:24
Я хочу поделиться своей разработкой: "умным открывателем пластикового окна". В статье вы найдете все необходимое, чтобы повторить проект и изготовить собственный привод для открывания окна с использованием штатной фурнитуры окна.
25 сентября 2020, 11:49
Сенсорный монитор для управления умным домом. Настройка и использование.
28 августа 2018, 09:48
От голого Raspbian до веб-интерфейса homebridge за четыре команды в терминале.
18 февраля 2020, 17:06
В данной статье описывается сборка слаботочного эл. щита на базе Wiren Board 6, а так же силового щита для небольшой квартиры.
01 ноября 2018, 09:27
Настройка Deconz USB стика ConBee от Dresden Elektronik в Hass.io и некоторые особенности эксплуатации
30 июня 2018, 12:17
Добавляем устройства управляемые по ИК через Broadlink RM3 Mini на примере кондиционера.
01 октября 2019, 07:07
"У всякого в умном дому неведомо никому" (с) Народная мудрость
08 апреля 2020, 11:32
Голосовые уведомления через Xiaomi Gateway, Home Assistant и HomeKit. Пример реализации, кейсы применения.