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

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 лайк

Так работает. Просто по прошлому ответу было вообще непонятно куда это вставлять.
Этот кусок кода выглядит очень странно.

Ок теперь я могу убрать все defineRule из cron.
А как очистить память контроллера от уже записанных в памяти экземпляров?
Перезапуск контроллера их все сотрёт?

А что в нем странного?
Вот тут крайне подоробно описано.

Сохранение файла вызывает перезапуск скрипта. Этого - достаточно.
И опять же - описано в документации. Ее надо как минимум прочесть.

  1. Странно то, что значение newtime должно выводиться из cron. При этом return находится вообще в другом месте.

  2. В документации вообще не подробно.

Вот что написано

defineRule(name,{
    Тип_правила: function() {
        ...
    },
    then: function() {
        ...
    }
});

И всё.
При этом нет пояснения какие параметры можно указывать в условии просто по их имени вот так

defineRule("KotelPressureRule", { 
  whenChanged: KotelPressure, 
  then: function (newValue, devName, cellName) {
  ...
  }
});

А для каких надо делать return не написано

defineRule("KotelPressureRule", { 
  whenChanged: function () {
    return KotelPressure;
  },
  then: function (newValue, devName, cellName) {
  ...
  }
});
  1. Опять же в документации написано, что при сохранении файла происходит автоматическая перезагрузка ТОЛЬКО изменённых файлов.
    При этом нет никакого упоминания о том, что освобождается память контроллера, которая забита большим количеством экземпляров объекта, созданных с помощью defineRule() в cron
Memory usage:  92% of 1.96G
  1. И чтобы документацию прочесть её надо как минимум сделать явно доступной для всех.
    Сейчас заходишь на страницу документации на сайте и где там искать описание движка wb-rules?
    Там только всё про устройства. Какие-то ссылки про wb-rules можно найти на страницах второго и третьего уровня wiki, но не эту и искать не интуитивно.

Что за объект KotelPressure? Какие у него свойства, является ли он алиасом?

Именно написано что заданные правила - освобождаются.

так вот и напишите в документации объекты с какими свойствами можно просто по имени указывать, а для каких надо function() {return } городить

Эм… Наша документация ни в коем случае не заменяет, не пытается заменить и не будет пытаться учебник по началам js.
Работа с объектами, видимость переменных - это база, знание которой подразумевается.
Цель документации - показать именно осбенности реализаци работы с топиками в нашей конвенции.

В очередной раз толку от техподдержки - полный ноль.
Я спрашивал

А как очистить память контроллера от уже записанных в памяти экземпляров?
Перезапуск контроллера их все сотрёт?

Вот ответ

Сохранение файла вызывает перезапуск скрипта. Этого - достаточно.
И опять же - [описано](https://github.com/wirenboard/wb-rules/tree/fc4ec8fa641a1744305e5130dfcefde8c7604ae9#%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F-%D0%BF%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0-%D1%81%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D0%B5%D0%B2) в документации. Ее надо как минимум прочесть.

Я беру и удаляю из своего скрипта все правила defineRule, сохраняю. Открываю консоль, а там как было 89% памяти забито так и есть.
Кому нужна такая техподдержка?

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.