Банальное правило по Cron не срабатывает

Доброго дня

Банальное правило, включить реле по крону. Не срабатывает и все тут…
Подскажите где засада плиз

скрипт

defineRule(“morning_set_lighting_ON”, { //evening lighting ON
when: cron(“0 06 21 * * *”), //evening on
then: function(devName, cellName) {
log(“evening lamp ON 5 PM”)
dev[“wb-gpio”][“EXT2_R3A1”] = 1; //set small led-lamp barrel on
dev[“wb-gpio”][“EXT2_R3A2”] = 1; //set big led-lamp on
dev[“wb-gpio”][“EXT2_R3A3”] = 1; //set lum-lamp on
}
});

sibmax, смотрите, что попробуйте сделать:

  1. поставьте точку с запятой после вызова log() (это важно!)
  2. Проверьте, какое время у вас на контроллере.
defineRule("morning_set_lighting_ON", { //evening lighting ON
 when: cron("0 23 15 * * *"), //evening on
 then: function(devName, cellName) {
  log("evening lamp ON 3:23 PM");
  dev["wb-gpio"]["EXT2_R3A1"] = true; //set small led-lamp barrel on
  dev["wb-gpio"]["EXT2_R3A2"] = true; //set big led-lamp on
  dev["wb-gpio"]["EXT2_R3A3"] = true; //set lum-lamp on
 }
});

Спасибо. Помогло.
Время выставлено верно. Это первое, что проверил-сделал.

Сработка будет именно в момент достижения уставки времени?

Скажем, если в правиле стоит включить реле в 10.00,
а контроллер был выключен и включился физически в 10.01,
то и правило сработает через сутки. Верно понимаю?

Отлично!
Да, время 10:00:00 пропущено, правило ждет до следующего дня.

1 лайк

Посмотрите пожалуйста пример в документации https://wirenboard.com/wiki/index.php/Движок_правил_wb-rules#.D0.A1.D0.BB.D0.BE.D0.B6.D0.BD.D1.8B.D0.B5_.D0.BF.D1.80.D0.B0.D0.B2.D0.B8.D0.BB.D0.B0_.D1.81_.D1.80.D0.B0.D1.81.D0.BF.D0.B8.D1.81.D0.B0.D0.BD.D0.B8.D1.8F.D0.BC.D0.B8 . Он решает как раз проблему с контроллером, выключенным в 10:00.

Спасибо огромное

Листинг большой…
С учетом того, что мои компетенции в програминге
мной достаточно серьезно за почти 20 лет подутрачены
буду точно денек другой “курить” оный :slight_smile:

Я правильно понимаю, что в WB6 используется wb-rules 2.0 уже?
Следовательно, этот скрипт надо подправить будет
в части использования глобальных переменных?

Нет, еще не используется, движок старый, 2.0 в бете, так что вся документация актуальна.

Пробую разобраться со скриптом приведенным по ссылке.
Запихал в один скрипт и библиотеку и правила, которые её дергают.

В упор ничего не исполняется нормально.
Ни один log() из библиотеки в консоль не выводится.
Есть сообщения такие. Что они означают?
Особо последние 2… Что за А1?

2018-12-24 21:33:09defineRule: lighting_garden_bed_On

2018-12-24 21:33:09defineRule: lighting_garden_bed_Off

2018-12-24 21:33:09skipping rule due to incomplete cell lighting_garden_bed_On: IncompleteCellCaught: incomplete cell encountered: A1

2018-12-24 21:33:09skipping rule due to incomplete cell lighting_garden_bed_Off: IncompleteCellCaught: incomplete cell encountered: A1

листинг

global.proto.Schedules = {};

(function(Schedules) { // замыкание

function todayAt(now, hours, minutes) {
var date = new Date(now);
// i.e. “today, at HH:MM”. All dates are in UTC!
date.setHours(hours);
date.setMinutes(minutes);
return date;
}

function checkScheduleInterval(now, start_time, end_time) {
var start_date = todayAt(now, start_time[0], start_time[1]);
var end_date = todayAt(now, end_time[0], end_time[1]);
log(“checkScheduleInterval {} {} {}”.format(now, start_date, end_date));

if (end_date >= start_date) {
  if ((now >= start_date) && (now < end_date)) {
    return true;
  }
} else {
  // end date is less than start date, 
  // assuming they belong to a different days (e.g. today and tomorrow)

  // option 1: what if it's now the day of "end" date?
  // in this case the following is enough:
  if (now < end_date) {
    return true;
  }

  // well, that seems not to be the case. ok,
  // option 2: it's the day of "start" date:

  if (now >= start_date) {
    return true;
  }
}
return false;

}

function checkSchedule(schedule, now) {
if (now == undefined) {
now = new Date();
}

for (var i = 0; i < schedule.intervals.length; ++i) {
  var item = schedule.intervals[i];
  if (checkScheduleInterval(now, item[0], item[1])) {
    log("found matching schedule interval at {}".format(item));
    return true;
  }
}
return false;

}

function updateSingleScheduleDevStatus(schedule) {
log(“updateSingleScheduleDevStatus {}”.format(schedule.name));
dev["_schedules"][schedule.name] = checkSchedule(schedule);
};

function addScheduleDevCronTasks(schedule) {
for (var i = 0; i < schedule.intervals.length; ++i) {
var interval = schedule.intervals[i];
for (var j = 0; j < 2; ++j) { // either start or end of the interval
var hours = interval[j][0];
var minutes = interval[j][1];
log("cron at " + “0 " + minutes + " " + hours + " * * *”);
defineRule(“schedule_dev{}{}{}”.format(schedule.name, i, j), {
when: cron(“0 " + minutes + " " + hours + " * * *”),
then: function () {
log(“schedule_dev {}{}{}”.format(schedule.name, i, j));
updateSingleScheduleDevStatus(schedule);
}
});
}
}
}

function addScheduleAutoUpdCronTask(schedule) {
defineRule(“schedule_auto_upd{}”.format(schedule.name), {
when: cron("@every " + schedule.autoUpdate),
then: function() {
dev._schedules[schedule.name] = dev._schedules[schedule.name];
}
});
}

var _schedules = {};

Schedules.registerSchedule = function(schedule) {
_schedules[schedule.name] = schedule;
};

Schedules.initSchedules = function() {
var params = {
title: “Schedule Status”,
cells: {}
};

for (var schedule_name in _schedules) {
  if (_schedules.hasOwnProperty(schedule_name)) {
    var schedule = _schedules[schedule_name];
    params.cells[schedule_name] = {type: "switch", value: false, readonly: true};
  }
};

defineVirtualDevice("_schedules", params);

for (var schedule_name in _schedules) {
  if (_schedules.hasOwnProperty(schedule_name)) {
    var schedule = _schedules[schedule_name];

    // setup cron tasks which updates the schedule dev status at schedule
    //   interval beginings and ends
    addScheduleDevCronTasks(schedule);

    // if needed, setup periodic task to trigger rules which use this schedule
    if (schedule.autoUpdate) {
      addScheduleAutoUpdCronTask(schedule);
    }

    // set schedule dev status as soon as possible at startup
    (function(schedule) {
      setTimeout(function() {
        updateSingleScheduleDevStatus(schedule);
      }, 1);
    })(schedule);

  };
};

};

})(Schedules);

//
//
// скрипт обработки событий по теплице
//
//
(function() { // замыкание
defineAlias(“greenhouse_temp”, “wb-w1/controls/28-0000069be3c5”); //
defineAlias(“outdoor_day”, “wb-adc/controls/A1”); //датчик освещенности на улице

defineAlias(“ligth_barrel”, “wb-gpio/EXT2_R3A8”); // для работы заменить на R3A1
defineAlias(“light_garden_bed_1”, “wb-gpio/EXT2_R3A8”); // для работы заменить на R3A2
defineAlias(“light_garden_bed_6”, “wb-gpio/EXT2_R3A8”); // для работы заменить на R3A3

Schedules.registerSchedule({
“name” : “light_cucumber”, // освещение теплица
“autoUpdate” : “1m”,
“intervals” : [
[ [5, 30], [20, 58] ], // UTC+6, 05:30 - 23:59
]
});

// Освещение грядок
defineRule(“lighting_garden_bed_On”, {
when: function() {
return (dev._schedules.light_cucumber) && (outdoor_day > 1);
},
then: function (newValue, devName, cellName) {
log(“lighting_garden_bed_OnOff newValue={}, devName={}, cellName={}”, newValue, devName, cellName);
var on = dev._schedules.light_cucumber; //
dev[“ligth_barrel”] = on; // 136 вт лампа
dev[“light_garden_bed_1”] = on; // люминисцентные лампы
dev[“light_garden_bed_6”] = on; // 400 вт лампа
}
});

defineRule(“lighting_garden_bed_Off”, {
when: function() {
return (dev._schedules.light_cucumber) && (outdoor_day < 1);
},
then: function (newValue, devName, cellName) {
log(“lighting_garden_bed_OnOff newValue={}, devName={}, cellName={}”, newValue, devName, cellName);
dev[“ligth_barrel”] = 0; // 136 вт лампа
dev[“light_garden_bed_1”] = 0; // люминисцентные лампы
dev[“light_garden_bed_6”] = 0; // 400 вт лампа
}
});
})()

Потерял
Schedules.initSchedules();

Добавил. Пошли логи из библиотеки.
К сожалению сообщения ошибок - какие то малопонятные…
Ошибка с А1 осталась

Ох. Листинг совсем не читаемый – форматирование разъехалось, кавычки не те. Вы знаете, надо отлаживать по частям, начиная с малого. Так вот просто взять большой фрагмент кода чужого кода и поправить в нем что-то, а потом разбираться, почему не работает, отнимет тучу времени у вас с непредсказуемым результатом.

да понимаю ж. и с кодом, с сутью, разобрался.
не понимаю, где конкретно ошибка.
сообщения об оной - не пойми что.
Где-то есть расшифровки ошибок?

Что означает

018-12-24 23:11:33ECMAScript error: Error: setting unsupported proxy value: light_barrel
setDevValue /usr/share/wb-rules-system/scripts/lib.js:71 preventsyield
anon /etc/wb-rules/art_greenhouse_shedules.js:33 preventsyield
call native strict preventsyield
anon /usr/share/wb-rules-system/scripts/lib.js:173 preventsyield

на строку (вторую из примера)

var on = dev._schedules.light_cucumber; //
dev[“light_barrel”] = on; // 136 вт лампа

где

defineAlias(“light_barrel”, “wb-gpio/EXT2_R3A8”);

Девайс такой есть

wb-gpio EXT2_R3A8 switch /devices/wb-gpio/controls/EXT2_R3A8

Эта строка полная копия, по сути, примера приведенного в документации

var on = dev._schedules.signboard; //
dev[“wb-mr6c_80/K2”] = !on;

%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5

defineAlias - конструкция не рабочая?

Пример выше. Алиас определен.
Если его использовать - ругань не понятная.
Если напрямую прописать топик - все работает.

В чем засада?

Алиас без dev[] при присвоении надо использовать, типа:
light_barrel = 0;

(смотрите примеры в описании движка правил)

Уже с алиасом разобрался.
Спасибо

А с этими ошибками как?
Где-то список-расшифровка есть какая то?

Я попрошу у вас ваш скрипт, очень сложно сказать. Можете выслать на info@contactless.ru с темой для Kilpio.

Спасибо!

Да разобрался уже с ним…
Ругань касалась как раз конструкции алиаса
dev[alias] = 0 давало такую ошибку.
alias = 0 проблему решило.

Вопрос то малость в другом.
В том, как “расшифровывать”
сообщения об ошибках. Ибо они
… неясны в большинстве своем…

Недопиленность в документации
достаточно серьёзно мешает оперативно
что-то делать с использованием контроллера.
Хотя сама железка, как по мне, очень даже достойна

Я, конечно, соглашусь с вами, что в документации не все идеально! Но в данном случае это ошибки ECMAScript, еще точнее, движка Duktape. Задокументировать целый язык/движок не представляется возможным. Но его использование обеспечивает высокий уровень гибкости и, в общем, стандартный, документированный синтаксис. То же относится и к Debian Linux на борту.

Дык не наезду ради ж писалось все.
Нестыкухи документации в WiKi,
где-то ошибки досадные, где-то
версии не обновленные.
Все это сложно поддерживать
в актуальном состоянии. Однозначно.
Но выход на массовый рынок, увы, требует…
Ибо много уже игроков на нем.

А насчет Deb - для меня это был ключевой момент,
почему вообще остановился поглядеть на платформу.
Ибо решения аля MOXA, Siemens и, не к ночи сказано, ОВЕН
уже подустали своей закрытостью и проприетарностью.
Даже с учетом документированности…

Добрый день, по данной ссылке не нашел, решение проблемы с cron если контроллер в нужную минуту например был выключен. Возможно содержание за 3 года под этой ссылкой поменялось. Будьте добры ткните меня носом)))

Нет, не поменялось. Тут, если предполагать что контроллер произвольно выключается и включается может помочь просто постоянная, по таймеру, проверка на то, находимся ли в нужном временном диапазоне. Пример в теме: