Самопроизвольное отключение света

как его читать?

Подскажите, какая версия прошивки реле?

1.20.1

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К правил/сутки. Работающих с одними же топиками.

  1. Рекурсия – это когда функция вызывает саму себя. Такого у меня нет.
    Функции просто вызываются в правиле по таймеру.
    У меня таймер вызывает 2 экземпляра одной функции с разными аргументами, чтобы не дублировать код, но нет вызова функции самой себя. Это же разные вещи.

  2. Как вы по-другому предлагаете управлять ТЭНами по времени?
    Просто таймерами я это сделать не могу. Мне нужно, чтобы это работало ночью, иначе смысла ноль.

Какждый вызов - создает экземпляр объекта. Какждый экземпляр существует и продожает существовать пока ресуросов памяти и процессора зватает.Так делать нельзя.

а как надо?

Надо - один экземпляр правил. И (если) создавать их динамически - то тщательно контролировать количество.
Я использую, при необходимости выхов функций из правил или использование параметров, передаваемых объектами.

можно пример?
что значит один экземпляр правил?

Их можно динамически удалять с таймаутом 1мин?

Если бы в wb-rules был прямой доступ к текущему времени без функции Date, то я бы не делал этот cron и всё бы работало только с одним экземпляром функции.
Вся проблема только в этом.

Вот, довольно простенький. Но работает и годен для промышленного применения.

То, что каждый экземпляр объекта созданный с помощью defineRule() - остается.

Нет. Точнее - можно, но весьма нетривиально. И не нужно, это на порядок сложнее и потребует очень хорошего вникания.

А чем стандартный 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 в первоначальном коде на то, что я написал.

1 лайк