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