Количество VIrtualDevices на WB6


#1

Добрый день! Подскажите, пожалуйста, какие могут быть ограничения по количеству виртуал девайсов?
Например, в каждом девайсе используется уникальный timers.ticker и несколько кнопок управления - старт, стоп и т.д. Как это скажется на производительности (загрузка ЦП)?
Я попробовал создавать такие устройства скриптом - все ломается около 30
Еще сделал кнопку, которая создает новое устройство - тогда у меня получилось сделать почти 80, прежде чем они все перестали работать.
Может есть какие-то бест практис в таких вопросах?
Спасибо


#2

Добрый день, kingwsf!
А что конкретно ломается у вас? Как это происходит?
Вообще не сталкивались с ограничениями по количеству виртуальных устройств. Вот таймеры работают нестабильно, такая проблема есть в движке правил.


#3

я запускаю скрипт, который генерит устройства и правила. Он какое-то время работает, потом останавливается и все. Правила не работают, устройства не работают. ребут помогает
в отладке выглядит вот так
2019-07-16 23:19:15defineRule: curtain24_open_btn
2019-07-16 23:19:15defineRule: curtain24_close_btn
2019-07-16 23:19:15defineRule: curtain24_set
2019-07-16 23:19:15defineRule: curtain24_doTick
2019-07-16 23:19:15defineRule: curtain24_both_on
24 - это счетчик. бежит бежит и стопится


#4

А можно посмотреть на ваш скрипт, попробую воспроизвести. В логе var/log/messages_оибок никаких не видно при запуске скрипта?
Перезагружать можно, наверное, не контроллер, а только движок правил:
service wb-rules restart


#5

В var/log/messages я нифига не понял)) но кажется ошибок не было…
image


#6

скрипт отправил в личку
ЗЫ за service wb-rules restart спасибо, чет забыл что так можно было


#7

kingwsf, здравствуйте! Поэкспериментировал с вашими скриптами, могу сказать, что виртуальные устройства довольно быстро создаются. Какая версия Web-интерфейса у вас: из коробки или бета 2.0? Какая версия движка правил?

Проблема, похоже, в правилах и таймерах, которые создаются параллельно с устройствами. Конкретных советов по вашему коду дать не могу, к сожалению: там много мест для отладки.

Часто при отладке полезным оказывается запуск движка правил не как сервиса, а как приложения в командной строке, с ключом -debug (или без него), например:

service wb-rules stop
/usr/bin/wb-rules -debug -queue-len 2048 -editdir /etc/wb-rules /usr/share/wb-rules-system/rules/ /etc/wb-rules /usr/share/wb-rules/ 2>&1 | tee /tmp/wb-rules-debug.txt "

Хотел обратить ваше внимание вот еще на какой момент: правила не персистентны, их надо создавать каждый раз при перезапуске движка правил для всех виртуальных устройств заново. Если виртуальные устройства и их контролы сохраняются в MQTT, то правила и функции — нет.


#8

Я скачал и установил wb-rules_2.0.beta3_armhf.deb
запустил с отладкой, создал 20 устройств, начал по очереди их запускать. Гдето на 5 начинает жутко тормозить, на 8-12 перестает работать все. Вот краткое содержание серии колбек возвращается 2

Сначала все ок - создаются девайсы, все чики пики

кнопки работают, колбеки сторятся, doTick тикает, ничего не предвещает беды

И вдруг тики перестали тикать

и релюшки включаться

Колбеки все потерял, в каких-то чужих контекстах…

Вот еще чтото работает.

потом хоп…

Дальше идут только значения wb-adc и фиксация нажатий кнопок. таймеры все, wb-rules все… траур, скорбь, отчаяние


#9

kingwsf, добрый день!
Похоже, что это проявление проблемы с функциями, работающими с интервалами и таймерами, в движке правил. К сожалению, прямого решения этой проблемы нет.
Пока рекомендуем заменять cron-правила публикацией mqtt-сообщений из системного крона, задержки реализовать через вызов команды sleep.
Пример:

defineVirtualDevice("relaySwitcher", {
 title: "Realay Switcher",
 cells: {
  enabled: {
   type: "switch",
   value: false
  },
 }
});

function delayedCall(secondsDelay, callBackFunction) {
  var sleepCommand = 'sleep ' + secondsDelay;
  //sleepCommand = sleepCommand + ';echo $PPID';
  log("start");
 var out = spawn("/bin/bash", ["-c", sleepCommand], {exitCallback: callBackFunction});
   log(out);
}

function relayToggle() {
 dev["wb-mr3_12"]["K1"] = !dev["wb-mr3_12"]["K1"];
};

defineRule("toggleRelay", {
 whenChanged: "relaySwitcher/enabled",
 then: function(newValue, devName, cellName) {
  delayedCall(1.5, relayToggle);
 }
});