Сценарий на повышение температуры

Запретил ручное переключения подавления. Только этом огло нарушить алгоритм.

//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 - можно указать другое значение если для какого-то устройства нужно особое.

1 лайк