как его читать?
Подскажите, какая версия прошивки реле?
1.20.1
создал и что с ним делать?
У меня теперь вообще ничего не работает и в логе куча ошибок.
journalctl -u wb-mqtt-serial --since -1h >> /tmp/mqtt-serial-log.txt
mqtt-serial-log.txt (1,2 МБ)
Это после того, как я это правило создал. Я его уже закомментировал, но в рабочее состояние пока ничего не возвращается.
Крайне подозрительно. Такого получается добиться только рекурсией. Проверьте все правила на предмет наличия вызовов.
Перезапустите движок правил - какое количество ресурсов потребляет после перезапуска? Как меняется потребление?
Ну и, повторюсь - проверьте на рекурсии.
https://wirenboard.com/wiki/Modbus-client
Можно посмотреть в логе - были ли записи в /on топик устройства.
Сегодня вошёл в ssh и уже память обнулилась
System load: 0.34 0.68 0.84 Up time: 28 days 6:00
Memory usage: 9% of 1.96G Usage of /: 34% of 2.0G /mnt/data: 4 % of 55G
wb-mqtt-serial удалось запустить
Рекурсии в скриптах у меня нет. Вот все мои скрипты.
Самый большой скрипт heating.js.
Остальные вообще очень простые.
wb-rules.zip (9,0 КБ)
Вчера в 23 часа вечера memory usage было 9%. Сейчас в 8 утра уже 22%.
heating.js - вижу рекурсию.
defineRule("cron minute timer", { // задание, которое выполняется каждую минуту
when: cron("00 * * * * *"),
Ежеминутно вызывает TermostatController()
в которой создается два экземпляра
function TermostatController(name, onoff, scheduleMode, temperature, setpoint, hysteresis, pressure, MinPressure, MaxPressure, MainRelayState, WBRelayState, ABBRelayState, PumpRelayState, HeatingStart, HeatingStop) {
defineRule( {
whenChanged: [onoff, scheduleMode, setpoint, hysteresis, temperature, pressure],
then: function (newValue, devName, cellName) {
Ну, дальше не смотрел.
Соответственно только в одном скрипте 3К правил/сутки. Работающих с одними же топиками.
-
Рекурсия – это когда функция вызывает саму себя. Такого у меня нет.
Функции просто вызываются в правиле по таймеру.
У меня таймер вызывает 2 экземпляра одной функции с разными аргументами, чтобы не дублировать код, но нет вызова функции самой себя. Это же разные вещи. -
Как вы по-другому предлагаете управлять ТЭНами по времени?
Просто таймерами я это сделать не могу. Мне нужно, чтобы это работало ночью, иначе смысла ноль.
- Функции просто вызываются в правиле по таймеру.
У меня таймер вызывает 2 экземпляра одной функции с разными аргументами, чтобы не дублировать код, но нет вызова функции самой себя. Это же разные вещи.
Какждый вызов - создает экземпляр объекта. Какждый экземпляр существует и продожает существовать пока ресуросов памяти и процессора зватает.Так делать нельзя.
а как надо?
Надо - один экземпляр правил. И (если) создавать их динамически - то тщательно контролировать количество.
Я использую, при необходимости выхов функций из правил или использование параметров, передаваемых объектами.
можно пример?
что значит один экземпляр правил?
И (если) создавать их динамически - то тщательно контролировать количество.
Их можно динамически удалять с таймаутом 1мин?
Если бы в wb-rules был прямой доступ к текущему времени без функции Date, то я бы не делал этот cron и всё бы работало только с одним экземпляром функции.
Вся проблема только в этом.
Как вы по-другому предлагаете управлять ТЭНами по времени?
можно пример?
Вот, довольно простенький. Но работает и годен для промышленного применения.
Так, сейчас проверю, таймер. Нашел, час занял поиск, самая злая ошибка, типов. //light_test_w.js //'use strict'; var grow_box = "test_w"; // CHANGE_ME! имя устройства. Выводится в заголовок окна и служит для разделения устройств log.info("light_"+grow_box+"START######################"); //Это лог. var dimmer_light = "wb-mao4_61/Channel 4"; // CHANGE_ME! устройство-диммер То есть строка, которая определяет куда писать изменения мощности. var dimmer_zeroValue = 0; //"0" диммера var dimmer_maxV…
что значит один экземпляр правил?
То, что каждый экземпляр объекта созданный с помощью defineRule() - остается.
Их можно динамически удалять с таймаутом 1мин?
Нет. Точнее - можно, но весьма нетривиально. И не нужно, это на порядок сложнее и потребует очень хорошего вникания.
Если бы в wb-rules был прямой доступ к текущему времени без функции Date
А чем стандартный Date неудобен?
Так я это пример как раз использовал при написании своего.
И этот пример вообще не простенький.
Там вообще почти нифига непонятно.
Есть какой-то непонятный объект PersistentStorage, в который постоянно загружаются какие-то строки.
Стандартный Date() неудобен тем, что он выдаёт дату и время только один раз - в момент первого запуска скрипта после его изменения. И всё.
Поэтому основная мысль, которую я выдернул из того “простенького” скрипта - это то что new Date() надо поместить внутрь cron, потому что иначе невозможно получить текущее значение времени. Без cron время не будет обновляться самостоятельно.
Теперь получается, что внутри cron нельзя вставлять конструкции defineRule(). Так?
Ну то есть надо все правила defineRule убрать из cron и внутри cron только перезаписывать значение переменной, в которой хранится время и потом эту переменную использовать в правилах.
Я попробовал внутри cron сделать только обновление переменной текущего времени и нифига не получается.
Какая-то непонятная ошибка
var d;
var newtime;
defineRule("cron minute timer", { // задание, которое выполняется каждую минуту
when: cron("00 * * * * *"),
then: function () {
d = new Date();
newtime = d.getMinutes();
}
});
defineRule("TimeRule", {
whenChanged: newtime,
then: function (newValue, devName, cellName) {
log.info( 'Время = ' + newValue );
}
});
Error: invalid whenChanged spec transformWhenChangedItem /usr/share/wb-rules-system/scripts/lib.js:209 anon /usr/share/wb-rules-system/scripts/lib.js:231 preventsyield forEach native strict preventsyield anon /usr/share/wb-rules-system/scripts/lib.js:243 F /etc/wb-rules/heating.js:21 preventsyield
Должно быть так:
whenChanged: function () {
return newtime;
},
Это как? При изменении чего возвращается newtime?
Если просто добавить return newtime; в конец cron minute timer, то ошибка выводится всё равно такая же.
var newtime;
defineRule("cron minute timer", { // задание, которое выполняется каждую минуту
when: cron("00 * * * * *"),
then: function () {
d = new Date();
newtime = d.getMinutes();
return newtime;
}
});
defineRule("TimeRule", {
whenChanged: newtime,
then: function (newValue, devName, cellName) {
log.info( 'Время = ' + newValue );
}
});
Вы сделали совсем не то, что я написал. Замените строку 15 в первоначальном коде на то, что я написал.