Здравствуйте. Есть правило:
//Pump_PO_1.js
//'use strict';
var grow_box = "_PO_1"; // CHANGE_ME! имя устройства. Выводится в заголовок окна и служит для разделения устройств
log.info("pump_"+grow_box+"START######################"); //Это лог.
var pump_relay = "wb-mr6cu_36/K3"; //CHANGE_ME! устройство-реле питания диммера (перемешивание)
var dimmer_relay = "wb-mr6cu_36/K2"; //CHANGE_ME! устройство-реле питания диммера (полив)
var aeration_relay = "wb-mr6cu_36/K7"; //CHANGE_ME! устройство-реле питания диммера (аэрация)
var stop_reley = "wb-mr6c_203/Input 1"; //CHANGE_ME! устройство-реле кнопки СТОП
var stop_lamp = "wb-mr6c_203/K1"; //CHANGE_ME! устройство- лампочка
var blizzer_reley_1 = "buzzer/enabled"; //CHANGE_ME! устройство- близзер
var blizzer_reley_2 = "wb-msw-v3_15/Buzzer"; //CHANGE_ME! устройство- близзер
var ps = new PersistentStorage("storage_"+grow_box, {global: true});// Определим объект-хранилище.
//Элементы виртуального устройства
//управления
var deviceCells = {
//Начало перемешивания hh:mm
"Pump (start) time": {
type: "text",
readonly: false,
value: ps["pump_start_time"],
},
"Pump (stop) time": {
type: "text",
readonly: false,
value: ps["pump_stop_time"],
},
//Длительность перемешивания
"Pump duration": {
type: "text",
readonly: false,
value: ps["sun_start_duration"],
},
//Длительность полива
"Watering duration": {
type: "text",
readonly: false,
value: ps["watering_duration"],
},
//Длительность перерыва
"Time-out duration": {
type: "text",
readonly: false,
value: ps["time-out_duration"],
},
//Длительность СТОПа
"STOP duration": {
type: "text",
readonly: false,
value: ps["stop_duration"],
},
wateringON : {
type : "switch",
value : false,
},
pumpON : {
type : "switch",
value : false,
},
aeration : {
type : "switch",
value : false,
},
day : {
type : "switch",
value : false,
},
timeout : {
type : "switch",
value : false,
},
work : {
type : "switch",
value : false,
},
STOP : {
type : "switch",
value : false,
},
blizzer : {
type : "switch",
value : false,
},
};
//Создадим виртуальное устройство и добавим в него элементы
defineVirtualDevice("pump_"+grow_box, {
title:"Pump "+grow_box,
cells: deviceCells
});
defineRule("Sunraise start time change", { //название правила
whenChanged: "pump_"+grow_box+"/Pump (start) time", //при изменении поля времени начала рассвета запишем его в хранилище
then: function (newValue, devName, cellName) { //выполняй следующие действия
log.info("pump_"+grow_box+"/Pump start time", newValue); //Это лог. Он попадает в /var/log/messages
ps["pump_start_time"] = newValue;
}
});
defineRule("Pump stop time change", { //название правила
whenChanged: "pump_"+grow_box+"/Pump (stop) time", //при изменении поля времени начала рассвета запишем его в хранилище
then: function (newValue, devName, cellName) { //выполняй следующие действия
log.info("pump_"+grow_box+"/Pump stop time", newValue); //Это лог. Он попадает в /var/log/messages
ps["pump_stop_time"] = newValue;
}
});
defineRule("Watering duration change", { //название правила
whenChanged: "pump_"+grow_box+"/Watering duration", //при изменении поля времени начала рассвета запишем его в хранилище
then: function (newValue, devName, cellName) { //выполняй следующие действия
log.info("pump_"+grow_box+"/Watering duration", newValue); //Это лог. Он попадает в /var/log/messages
ps["watering_duration"] = newValue;
}
});
defineRule("Time-out duration change", { //название правила
whenChanged: "pump_"+grow_box+"/Time-out duration", //при изменении поля времени начала рассвета запишем его в хранилище
then: function (newValue, devName, cellName) { //выполняй следующие действия
log.info("pump_"+grow_box+"/Time-out duration", newValue); //Это лог. Он попадает в /var/log/messages
ps["time-out_duration"] = newValue;
}
});
defineRule("STOP duration change", { //название правила
whenChanged: "pump_"+grow_box+"/STOP duration", //при изменении поля времени начала рассвета запишем его в хранилище
then: function (newValue, devName, cellName) { //выполняй следующие действия
log.info("pump_"+grow_box+"/STOP duration", newValue); //Это лог. Он попадает в /var/log/messages
ps["stop_duration"] = newValue;
}
});
//*Дополнение для реле диммера
defineRule("day_start", { //название правила
whenChanged: "pump_"+grow_box+"/day",
then: function (newValue, devName, cellName) { //выполняй следующие действия
if ((dev["pump_"+grow_box]["day"] == true)){
dev["pump_"+grow_box+"/pumpON"] = true;
}
}
});
defineRule("dimmer_relay_on", { //название правила
whenChanged: "pump_"+grow_box+"/pumpON",
then: function (newValue, devName, cellName) { //выполняй следующие действия
if ((dev["pump_"+grow_box]["pumpON"] == true)){
dev["pump_"+grow_box+"/aeration"] = true;
}
}
});
defineRule("dimmer_relay_on_1", { //название правила
whenChanged: "pump_"+grow_box+"/pumpON",
then: function (newValue, devName, cellName) { //выполняй следующие действия
if ((dev["pump_"+grow_box]["pumpON"] == true) && (dev["pump_"+grow_box]["STOP"] == false)){
dev[pump_relay] = true; //включаем реле
dev[aeration_relay] = true;
}
}
});
defineRule("dimmer_relay_off", { //название правила
whenChanged:"pump_"+grow_box+"/pumpON",
then: function (newValue, devName, cellName) { //выполняй следующие действия
if ((dev["pump_"+grow_box]["pumpON"] == false)){
dev["pump_"+grow_box+"/wateringON"] = true;
}
}
});
defineRule("dimmer_relay_off_1", { //название правила
whenChanged:"pump_"+grow_box+"/pumpON",
then: function (newValue, devName, cellName) { //выполняй следующие действия
if ((dev["pump_"+grow_box]["pumpON"] == false) && (dev["pump_"+grow_box]["STOP"] == false)){
dev["pump_"+grow_box+"/wateringON"] = true;
dev[dimmer_relay] = true;
dev[pump_relay] = false;
}
}
});
defineRule("watering_relay_off", { //название правила
whenChanged:"pump_"+grow_box+"/wateringON", //При изменении флага "закат" - проверим и выключим реле
then: function (newValue, devName, cellName) { //выполняй следующие действия
if ((dev["pump_"+grow_box]["wateringON"] == false)){ //Если диммер на минимуме а реле включено
dev[dimmer_relay] = false;
dev[aeration_relay] = false;
dev["pump_"+grow_box+"/aeration"] = false;
dev["pump_"+grow_box]["timeout"] = true;
}
}
});
defineRule("watering_relay_off_1", { //название правила
whenChanged:"pump_"+grow_box+"/wateringON", //При изменении флага "закат" - проверим и выключим реле
then: function (newValue, devName, cellName) { //выполняй следующие действия
if ((dev["pump_"+grow_box]["wateringON"] == false) && (dev["pump_"+grow_box]["STOP"] == false)){ //Если диммер на минимуме а реле включено
dev[dimmer_relay] = false;
dev[aeration_relay] = false;
}
}
});
defineRule("time-out_off", { //название правила
whenChanged:"pump_"+grow_box+"/timeout", //При изменении флага "закат" - проверим и выключим реле
then: function (newValue, devName, cellName) { //выполняй следующие действия
if ((dev["pump_"+grow_box]["timeout"] == false) && (dev["pump_"+grow_box]["day"] == true)){ //Если диммер на минимуме а реле включено
dev["pump_"+grow_box+"/pumpON"] = true;
}
}
});
defineRule("stop_reley ON", { //название правила
whenChanged:stop_reley, //При изменении флага "закат" - проверим и выключим реле
then: function (newValue, devName, cellName) { //выполняй следующие действия
if ((dev[stop_reley] == true)){ //Если диммер на минимуме а реле включено
dev[stop_lamp] = true;
dev["pump_" + grow_box]["STOP"] = true;
}
}
});
defineRule("STOP ON", { //название правила
whenChanged:"pump_"+grow_box+"/STOP", //При изменении флага "закат" - проверим и выключим реле
then: function (newValue, devName, cellName) { //выполняй следующие действия
if ((dev["pump_"+grow_box]["STOP"] == true)){ //Если диммер на минимуме а реле включено
dev[stop_lamp] = true;
dev[pump_relay] = false;
dev[aeration_relay] = false;
dev[dimmer_relay] = false;
dev[blizzer_reley_1] = false;
dev[blizzer_reley_2] = false;
dev["pump_" + grow_box]["blizzer"] = true;
}
}
});
defineRule("STOP Off", { //название правила
whenChanged:"pump_"+grow_box+"/STOP", //При изменении флага "закат" - проверим и выключим реле
then: function (newValue, devName, cellName) { //выполняй следующие действия
if ((dev["pump_"+grow_box]["STOP"] == false)){ //Если диммер на минимуме а реле включено
dev[stop_lamp] = false;
dev[blizzer_reley_1] = false;
dev[blizzer_reley_2] = false;
}
}
});
defineRule("blizzer on", { //название правила
whenChanged:"pump_"+grow_box+"/blizzer", //При изменении флага "закат" - проверим и выключим реле
then: function (newValue, devName, cellName) { //выполняй следующие действия
if ((dev["pump_"+grow_box]["blizzer"] == false)){ //Если диммер на минимуме а реле включено
dev[blizzer_reley_1] = true;
dev[blizzer_reley_2] = true;
}
}
});
//*Конец дополнения
//'таймер для старта перемешивания';
var motion_timer_1_timeout_ms = (((ps["sun_start_duration"]) * 60)*1000);
var motion_timer_1_id = null;
defineRule("motion_detector_1", {
whenChanged: "pump_" + grow_box + "/pumpON",
then: function (newValue, devName, cellName) {
if ((dev["pump_" + grow_box]["pumpON"] == true)) {
if (motion_timer_1_id) {
clearTimeout(motion_timer_1_id);
}
motion_timer_1_id = setTimeout(function () {
dev["pump_" + grow_box]["pumpON"] = false;
motion_timer_1_id = null;
}, motion_timer_1_timeout_ms);
}
},
});
//'Конец таймера';
//'таймер для старта полива';
var motion_timer_2_timeout_ms = (((dev["pump_"+grow_box+"/Watering duration"]) * 60)*1000);
var motion_timer_2_id = null;
defineRule("motion_detector_2", {
whenChanged: "pump_" + grow_box + "/wateringON",
then: function (newValue, devName, cellName) {
if ((dev["pump_" + grow_box]["wateringON"] == true)) {
if (motion_timer_2_id) {
clearTimeout(motion_timer_2_id);
}
motion_timer_2_id = setTimeout(function () {
dev["pump_" + grow_box]["wateringON"] = false;
motion_timer_2_id = null;
}, motion_timer_2_timeout_ms);
}
},
});
//'Конец таймера';
//'таймер для старта тайм-аут';
var motion_timer_3_timeout_ms = (((dev["pump_"+grow_box+"/Time-out duration"]) * 60)*1000);
var motion_timer_3_id = null;
defineRule("motion_detector_3", {
whenChanged: "pump_" + grow_box + "/timeout",
then: function (newValue, devName, cellName) {
if ((dev["pump_" + grow_box]["timeout"] == true)) {
if (motion_timer_3_id) {
clearTimeout(motion_timer_3_id);
}
motion_timer_3_id = setTimeout(function () {
dev["pump_" + grow_box]["timeout"] = false;
motion_timer_3_id = null;
}, motion_timer_3_timeout_ms);
}
},
});
//'Конец таймера';
//'таймер для СТОПа';
var motion_timer_4_timeout_ms = (((ps["stop_duration"]) * 60)*1000);
var motion_timer_4_id = null;
defineRule("motion_detector_4", {
whenChanged: "pump_" + grow_box + "/STOP",
then: function (newValue, devName, cellName) {
if (dev["pump_" + grow_box]["STOP"] == true) {
if (motion_timer_4_id) {
clearTimeout(motion_timer_4_id);
}
motion_timer_4_id = setTimeout(function () {
dev["pump_" + grow_box]["STOP"] = false;
motion_timer_4_id = null;
}, motion_timer_4_timeout_ms);
}
},
});
//'Конец таймера';
//'таймер для близзера';
var motion_timer_5_timeout_ms = (((ps["stop_duration"]-1) * 60)*1000);
var motion_timer_5_id = null;
defineRule("motion_detector_5", {
whenChanged: "pump_" + grow_box + "/blizzer",
then: function (newValue, devName, cellName) {
if (dev["pump_" + grow_box]["blizzer"] == true) {
if (motion_timer_5_id) {
clearTimeout(motion_timer_5_id);
}
motion_timer_5_id = setTimeout(function () {
dev["pump_" + grow_box]["blizzer"] = false;
motion_timer_5_id = null;
}, motion_timer_5_timeout_ms);
}
},
});
//'Конец таймера';
//'Отслеживание времени старта и стопа';
defineRule("time_on_off", {
when: cron('*/30 * * * *'), // каждые 30 секунд..
then: function () { // ..вызываем функцию
var currentTime = new Date(); // получить и сохранить в переменную currentTime текущее системное время контроллера
var currentHours = currentTime.getUTCHours()+3; // сохранить в переменную currentHours значение часа из currentTime + 3 часа (корректировка часового пояса на +3 часа для MSK. PS Если это нужно)
var currentMinutes = currentTime.getUTCMinutes(); // сохранить в переменную currentMinutes значение минут из currentTime (если нужно будет оперировать не только "часами", но и "минутами")
if ( (currentHours >= dev["pump_"+grow_box+"/Pump (start) time"]) && (currentHours <= (dev["pump_"+grow_box+"/Pump (stop) time"]-1) && (dev["pump_"+grow_box]["work"] == true)) ) // если число "часов" больше или равно 6 и меньше или равно 18, т.е. текущее время от 6:00 до 18:59
{
log("Сейчас День = ", currentHours); // Вывести в лог текст "Сейчас День =" и число "часов"
dev["pump_"+grow_box+"/day"] = true; // включить (true)
} else{ // иначе (т.е. вне диапазона 6..18 часов, от 19:00 до 5:59 )
log ("Сейчас Ночь = ", currentHours) // Вывести в лог текст "Сейчас Ночь =" и число "часов"
dev["pump_"+grow_box+"/day"] = false; // выключить (false)
}
}
});
// после отладки правила и проверки его работоспособности строчки с log() можно отключить (удалить или поставить перед ними // ) чтобы не забивать лог файл контроллера ненужной информацией
//'Окончание отслеживания времени старта и стопа';
Возможно где-то кривое и собрано из нескольких других, но всё-таки…
Смысл в том, чтобы последовательно включать перемешивание раствора, полив и перерыв.
Продолжительность этого всего задаётся с помощью переменных
Проблема в том, что при изменении переменных не меняется продолжительность работы таймеров. Она меняется только в том случае, если перезапустить правило. При этом время начала и время окончания считывается корректно.
Контроллер WB-6.
Может я что-то упустил или неправильно написал?
Помогите пожалуйста. Спасибо!

