Добрый день! Подскажите, пожалуйста, какие могут быть ограничения по количеству виртуал девайсов?
Например, в каждом девайсе используется уникальный timers.ticker и несколько кнопок управления - старт, стоп и т.д. Как это скажется на производительности (загрузка ЦП)?
Я попробовал создавать такие устройства скриптом - все ломается около 30
Еще сделал кнопку, которая создает новое устройство - тогда у меня получилось сделать почти 80, прежде чем они все перестали работать.
Может есть какие-то бест практис в таких вопросах?
Спасибо
Добрый день, kingwsf!
А что конкретно ломается у вас? Как это происходит?
Вообще не сталкивались с ограничениями по количеству виртуальных устройств. Вот таймеры работают нестабильно, такая проблема есть в движке правил.
я запускаю скрипт, который генерит устройства и правила. Он какое-то время работает, потом останавливается и все. Правила не работают, устройства не работают. ребут помогает
в отладке выглядит вот так
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 - это счетчик. бежит бежит и стопится
А можно посмотреть на ваш скрипт, попробую воспроизвести. В логе var/log/messages_оибок никаких не видно при запуске скрипта?
Перезагружать можно, наверное, не контроллер, а только движок правил:
service wb-rules restart
В var/log/messages я нифига не понял)) но кажется ошибок не было…
скрипт отправил в личку
ЗЫ за service wb-rules restart спасибо, чет забыл что так можно было
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, то правила и функции — нет.
Я скачал и установил wb-rules_2.0.beta3_armhf.deb
запустил с отладкой, создал 20 устройств, начал по очереди их запускать. Гдето на 5 начинает жутко тормозить, на 8-12 перестает работать все. Вот краткое содержание серии колбек возвращается 2
Сначала все ок - создаются девайсы, все чики пики
кнопки работают, колбеки сторятся, doTick тикает, ничего не предвещает беды
И вдруг тики перестали тикать
и релюшки включаться
Колбеки все потерял, в каких-то чужих контекстах…
Вот еще чтото работает.
потом хоп…
Дальше идут только значения wb-adc и фиксация нажатий кнопок. таймеры все, wb-rules все… траур, скорбь, отчаяние
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);
}
});