Запретил ручное переключения подавления. Только этом огло нарушить алгоритм.
//11.18_test1.js
var AlarmLevel = 20; //Порог предупреждения
var AlarmTime = 1000; //Время включения тревоги в миллисекундах
var AlarmDisableTime = AlarmTime+10000; //Время подавления тревоги в миллисекундах
var Alarm_timer_1_id = null; //служебное
var Alarm_timer_2_id = null; //служебное
//Для начала - создадим виртуальное устройство. Пригодится - ну и параметры через него будем передавать и отслеживать.
defineVirtualDevice("TemperatureControl", {
title: "temp_control", //
cells: {
SensorName : { //Просто текстовое поле
type : "text",
value : "No",
readonly: false,
},
StateAlarm : {
type : "switch",
value : false,
readonly: false,
},
StateAlarmSuppressed : {
type : "switch",
value : false,
readonly: true,
forceDefault: true
},
}
});
//Сделаем функцию генерации правил.
//вот, кстати ссылка: https://wirenboard.com/wiki/Rule_Examples#.D0.A1.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D0.B5_.D0.BE.D0.B4.D0.BD.D0.BE.D1.82.D0.B8.D0.BF.D0.BD.D1.8B.D1.85_.D0.BF.D1.80.D0.B0.D0.B2.D0.B8.D0.BB
function makeTemperatureDetector(name, detector_device, detector_control, control_value) {
//var motion_timer_id = null;
defineRule(name, {
whenChanged: detector_device+ "/" + detector_control,
then: function(newValue, devName, cellName) {
if (newValue>control_value) {
dev["TemperatureControl"]["SensorName"] = name; //укажем "причину"
dev["TemperatureControl"]["StateAlarm"] = true; //Включим свитч
log.info("Alarm! температура для", name, "превысила", control_value); //Для лога
}
}
});
}
//Сделаем правило сигнализации.
// при изменении "TemperatureControl/StateAlarm" включаем сигнализатор и запускаем таймер
defineRule("IfAlarm", {
whenChanged: "TemperatureControl/StateAlarm",
then: function (newValue, devName, cellName) {
if (newValue && !dev["TemperatureControl"]["StateAlarmSuppressed"]){ //Только при включении и только если "StateAlarmSuppressed" вЫключен
//log.info("IfAlarm called", newValue, devName, cellName, "Alarm_timer_1_id",Alarm_timer_1_id); //Просто для отладки
if (!Alarm_timer_1_id) { //Если таймер УЖЕ есть - то Ничего не делаем.
dev["buzzer"]["enabled"] = true; //Включить пищалку
//dev["TemperatureControl"]["StateAlarmSuppressed"] = true; //вКлючим свитч в виртуальном устройстве.
Alarm_timer_2_id = setTimeout(function () { //Начинаем описывать ВТОРОЙ таймер
dev["TemperatureControl"]["StateAlarmSuppressed"] = false; //вЫключим свитч в виртуальном устройстве.
Alarm_timer_1_id=null; //сбросим для включения возможности вызвать еще раз
dev["TemperatureControl"]["StateAlarm"] = false; //выключим свитч в виртуальном устройстве.
}, AlarmDisableTime); //время в миллисекундах
Alarm_timer_1_id = setTimeout(function () { //Начинаем описывать таймер
dev["buzzer"]["enabled"] = false; //ВЫключить пищалку
dev["TemperatureControl"]["StateAlarm"] = false; //выключим свитч в виртуальном устройстве.
dev["TemperatureControl"]["SensorName"] = " "; //Очистим поле с именем
dev["TemperatureControl"]["StateAlarmSuppressed"] = true; //вКлючим свитч в виртуальном устройстве.
}, AlarmTime); //время в миллисекундах
}
}
}
});
//А вот тут уже вызовем вызовем функцию чтобы создать правила...
makeTemperatureDetector("NameDevice1", "wb-ms_41", "Temperature", AlarmLevel)
makeTemperatureDetector("NameDevice2", "wb-ms_42", "Temperature", AlarmLevel)
makeTemperatureDetector("NameDevice3", "wb-ms_43", "Temperature", AlarmLevel)
makeTemperatureDetector("NameDevice{", "wb-ms_4X", "Temperature", AlarmLevel)
//Вместо AlarmLevel - можно указать другое значение если для какого-то устройства нужно особое.