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

Добрый день, помогите пожалуйста с сценарием, установили 45 датчиком WB MS v.2, требуется оповещение на повышение температуры каждого датчика. Если температура превысила 30 градусов нужно активировать внутреннюю пищалку и внешнюю подключенную на выход А1.

Используя примеры на вашем сайте отредактировали код под внутреннюю пищалку, подскажите как правильно прописать сценарий для всех 45 датчиков и как правильно к ним обратиться. При подключении к контроллеру использовали короткий адрес в формате “2,14,22 и т.д.”, можно ли обратиться в таком формате whenChanged: “wb-ms-v2/14”?

Как правильно настроить пищалку что бы она не пищала всё время пока температура не снизится ниже 30 градусов? Хотим сделать так что бы при повышении температуры более 30 градусов пищалка начинает сигнализировать около минуты, потом молчит если через 5 минут температура по прежнему более 30 она вновь начинает сигнализировать.

И аналогичный сценарий для выхода А1.

defineRule("temperature_control", { 
  whenChanged: "wb-w1/28-0115a48fcfff", //при изменении состояния датчика 1-Wire с идентификатором 28-0115a48fcfff
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    if ( newValue > 30) { //если температура датчика больше 30 градусов
      dev["buzzer"]["enabled"] = true; //Включить
    } else {
      dev["buzzer"]["enabled"] = false; //ВЫключить
    }
  }
});

Добрый день.
Проверим, правильно ли я понял:
Есть несколько MS v2, подключенных к контроллеру.

Правила создаются для каждого и срабаывают: при превышении 30 и 45
При срабатывании любого правила “30”:

  • Запуск таймера “минута” и включение сигнализации
  • при завершении таймера “минута” - отключение сигнализации и запуск таймера “5 минут”.
  • при завершении таймера “5 минут” - снова запуск таймера “минута” и включение сигнализации

В скрипте - перечислить датчики в массиве, при запуске пройтись по массиву циклом и сформировать правила.

Выложите скрипт - покажите что не работает - поправим.

и еще: для вставки кода и листингов пользуйтесь пожалуйста

``` (Три символа на русской букве “ё”)
     Ваш код
    ```
для оформления - чтобы движок форума показывал “как есть”.

Добрый день, 45 ms v2 подключены к одному контроллеру, если хотя бы один из них превышает 30 градусов срабатывает сигнализация и работает минуту после чего отключается, через 5 минут если температура по прежнему более 30 градусов, запускается вновь на 1 минуту и так пока температура не снизится до 29 и менее градусов.

defineRule("temperature_control", {
  whenChanged: "wb-ms-v2/14",
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    if ( newValue > 30) { //если температура датчика больше 30 градусов
      dev["buzzer"]["enabled"] = true; //Включить
    } else {
      dev["buzzer"]["enabled"] = false; //ВЫключить
    }
  }
});

Непонятно как обратиться к датчикам, как настроить таймер.

Вот MS v2:
Screenshot from 2020-11-16 12-14-49
Идем в веб-интерфейсе в MQTT и ищем его там:


Ориентируемся на адрес устройства.
Соответственно “строчка” с температурой от этогомодуля будет иметь вид:
“wb-ms_41/Temperature”. Так ее в правилах и надо применять.
Для других модулей - то же самое, отличаться будт только адресом.

Вот пример:
https://wirenboard.com/wiki/Rule_Examples
Вкратце: Включаем что-то и устанавливаем таймер, который выполняет указанное по завершению:

dev["buzzer"]["enabled"] = true; //Включить пищалку
setTimeout(function () { Начинаем описывать таймер
        dev["buzzer"]["enabled"] = false; //ВЫключить пищалку
      }, 60000); //время в миллисекундах

Лучше все необходимые действия - в функции завернуть и передавать состояния в переменных.

У вас заготовка для скрипта с набросками уже есть? Или только тот, что в первом сообщении?

1 лайк

Только тот что в первом сообщении. Впервые работаем с Вашим оборудованием, мониторинг ведётся, но хотелось бы наладить оповещение.

Ок, напишу вам скриптик - шаблон.

Было бы отлично, спасибо за помощь.

Добрый день, ждём от Вас ответ.

Как раз пишу скрипт.

Вот:

//11.18_test1.js
var AlarmLevel = 35; //Порог предупреждения 
var AlarmTime = 60000; //Время включения тревоги в миллисекундах
var AlarmDisableTime = AlarmTime+120000; //Время подавления тревоги в миллисекундах 
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: false,
    },
  }
});

//Сделаем функцию генерации правил.
//вот, кстати ссылка: 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) {
  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("NameDeviceXX", "wb-ms_XX", "Temperature", AlarmLevel)
//Вместо AlarmLevel - можно указать другое значение если для какого-то устройства нужно особое.

Добрый день.
Получилось? Не оставляйте без обратной связи пожалуйста.

Добрый день! Вчера тестировали, уменьшили время включения тревоги до 10000 и время подавления до 30000. При первом повышении температуры выше порога предупреждения всё сработало чётко, пищалка отработала 10 секунд и отключилась, в статус панели внизу показывал какой датчик сработал. После дали датчику остыть и вновь нагрев пищалка уже молчала и молчит по прежнему, а в статус панели внизу всё верно как только датчик превышает заданный порог всё отображается. Проблема только с пищалкой. Подскажите что может быть не так?

Покажите что меняли пожалуйста.

Только параметры в первых 3 строках и адреса датчиков в конце соответственно.

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

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