Климат

Управление вентиляцией, отоплением и кондиционированием по датчикам температуры и влажности.

Управление батареями отопления по датчикам температуры

Сценарий работает при включеном режиме АВТО 

Выполнить:
— Управлять батареями отопления на основании показаний датчиков температуры

Дополнительные условия:
1. При снижении температуры ниже уставки на 0,5 градуса батарею включить.
2. При достижении значения уставки батарею выключить.
3. Дать возможность управлять значением уставки температуры в пользовательском интерфейсе.
4. Дать возможность отключить/включить автоматическое управление в пользовательском интерфейсе.

/** 
* @name Батареи по температуре АВТО 
* @desc Включение-выключение батареи по датчику температуры
*       Уставка на датчике температуры 
*       Сценарий работает, если для устройства включен флаг АВТО
*       Сценарий должен использовать команды переключения, которые сохраняют АВТО (turnOnSaveAuto)
* @version 4
*/

const bat = Device("ActorD", "Батарея"); 
const dt = Device("SensorA", "Датчик температуры"); 

startOnChange([bat,dt], bat.auto && ( bat.isOff() && (dt.value <= dt.setpoint-0.5) || bat.isOn() && (dt.value > dt.setpoint)));

script ({
  start() {
    if (bat.isOff()) {
      bat.turnOnSaveAuto();
    } else {
      bat.turnOffSaveAuto();
    }
  }
});

Управление вытяжным вентилятором

Вентилятор включается при сработке дискретного датчика (1 — сработка) и отключается через заданное время

Событие:
— Сработка любого дискретного датчика (движение, открытие двери …)

Выполнить:
— Включить вентилятор
— Выключить вентилятор через заданное время

Дополнительные условия:
1. Задавать время отключения в пользовательском интерфейсе в параметрах вентилятора.
2. Дать возможность отключить/включить автоматическое управление в пользовательском интерфейсе.

/** 
* @name Вентиляция по дискретному датчику 
* @desc Вентилятор включается при сработке дискретного датчика (1 - сработка) и отключается через заданное время
* Сценарий работает, если для устройства включен флаг АВТО
* @version 4
*/

const actor = Device("ActorD", "Вентилятор", [
  {"name":"timeOff", "note":"Отключить после сброса датчика через, сек", "type":"number", "val":5}
  ]); 
const sensor = Device("SensorD", "Датчик");  

startOnChange([sensor,actor], actor.auto && (actor.isOff() && sensor.isOn() || actor.isOn() && sensor.isOff()));  

script ({
    start() {
      this.addTimer("T1");  
         
      if (actor.isOff()) {
          actor.turnOnSaveAuto();
      } else {
        // взводим таймер, чтобы отключить 
        this.startTimer("T1", actor.getParam("timeOff"), "turnOff");       
      }
        // В любом случае следим за датчиком и вентилятором
        this.addListener(sensor, "onSensor");
        this.addListener(actor , "onActor");
    },
    
    onSensor() {
      if (sensor.isOff() && this.timer.T1 == "off")  {
        this.startTimer("T1", actor.getParam("timeOff"), "turnOff");
      }  
    
      if (sensor.isOn())  {
        this.stopTimer("T1");
      }  
    },
 
    onActor() {
      // выключили другим способом или сбросили авто - просто выходим
       if (actor.isOff() || !actor.auto) this.exit();
    },
  
    turnOff() {
      actor.turnOffSaveAuto();
      this.exit();
    }
});

Управление теплыми полами

Выполнить:
— Управление теплыми полами на основании показаний датчиков температуры

Дополнительные условия:
1. При снижении температуры ниже уставки теплый пол включить.
2. При достижении значения выше уставки теплый пол выключить.
3. Должны быть разные уставки температуры для четырех периодов: Утро, День, Вечер, Ночь
4. Иметь возможность изменять уставки температуры в пользовательском интерфейсе
5. Иметь возможность задать недельное расписание

Решение

Добавляем теплые полы (WarmFloor) и датчики температуры (STEMP):

Для теплых полов не забудьте поставить флаг «Есть автоматический режим»

Размещаем эти устройства на мнемосхеме:

Создаем новое виртуальное устройство типа «Переключатель». Присваиваем идентификатор ID — Regim и называем его «Переключатель режимов»:

Открываем нижнее окно состояний устройства:

По умолчанию новый переключатель имеет три состояния. В нашей задаче требуется четыре: Утро, День, Вечер, Ночь. 

Редактируем три состояния и кнопкой «Копировать» добавляем четвертое состояние:

Размещаем переключатель режимов на мнемосхеме:

В свойствах устройства на вкладке «Параметры» выбираем шаблон представления «Переключатель»:

Немного подправим внешний вид. Я подправил цвет и размер текста:

Настройки визуализации закончены. Переходим к сценариям.

Для того чтобы не писать отдельные сценарии для каждой пары устройств (теплый пол, датчик температуры) воспользуемся механизмом мультисценариев.
Мультисценарий — это такой тип сценария, в котором не прописываются конкретные устройства. Это как шаблон для дальнейшей привязки к устройствам.

Создаем новый мультисценарий:

Скрипт сценария приведен ниже:

/** 
* @name  Теплый пол с пятью уставками 
* @desc  
* @version 4 
*/
const temp = Device("SensorA","Датчик температуры"); 
const regim = Device("ActorE","Режим теплых полов"); 
const floor = Device("ActorD","Теплый пол",[
   {"name":"t0", "note":"Уставка температуры без расписания", "type":"number", "val":20},
   {"name":"schedu", "note":"Изменять уставку по расписанию", "type":"cb", "val":true},
   {"name":"t1", "note":"Уставка температуры: Утро", "type":"number", "val":24},
   {"name":"t2", "note":"Уставка температуры: День", "type":"number", "val":20},
   {"name":"t3", "note":"Уставка температуры: Вечер", "type":"number", "val":22},
   {"name":"t4", "note":"Уставка температуры: Ночь", "type":"number", "val":18}
  ]); 

startOnChange([regim, temp, floor], floor.auto); 

script({
    start() {
        let setpoint = floor.getParam('t0');
        if (floor.getParam('schedu')) {
          setpoint = floor.getParam('t'+String(regim.value+1));
        }
        if (temp.value < setpoint) {
          if (floor.isOff()) floor.turnOnSaveAuto();
        } else  if (temp.value > setpoint) {
          if (floor.isOn()) floor.turnOffSaveAuto();
        }
    } 
});

Некоторые комментарии:
Вероятно вы обратили внимание что в скрипте присутствуют строки:
{«name»:’t0′, «note»:»Уставка температуры без расписания», «type»:’number’, «val»:20},
{«name»:’schedu’, «note»:»Изменять уставку по расписанию», «type»:’cb’, «val»:true},
Эти параметры (t0 и schedu) позволяют дополнить функционал следующим свойством: Разрешать менять уставку по расписанию или нет. И если не менять уставку по расписанию, применить уставку температуры без расписания.

Теперь осталось привязать устройства к нашему мультисценарию:

Выбираем «Запуск для устройств» и добавляем четыре записи с устройствами для наших четырех теплых полов.

Если перейти на пользовательский интерфейс и долго удерживать на иконке теплого пола, в окне свойств вы увидите параметры, которые мы определили в сценарии. Таким образом мы получили возможность настраивать уставки температуры для разных режимов. 

В принципе все готово. В пользовательском интерфейсе переключателем режима (Утро, День, Вечер, Ночь) выбираем нужный режим. Присваиваются соответствующие уставки и по ним управляются теплые полы.

Осталось создать недельное расписание.

Для переключения режимов по расписанию нам потребуется создать еще четыре простых сценария:

/** 
* @name Heating Regim - Morning 
* @desc  
* @version 4  
*/

const regim = Device("Regim"); 

script({
    start() {
       this.assign( regim, "value", 0);
    } 
});

Скрипт всех четырех сценариев одинаковый за исключением названия и параметра присваиваемого значения нашему виртуальному переключателю Regim в строке:
this.assign( regim, «value», 0);
Для утра — 0, день -1, вечер -2, ночь — 3

Переходим в раздел Расписание:

Составляем расписание запуска наших сценариев переключения режимов.

В примере выше показано расписание:
1. Перейти в режим «Утро» в 6 -00 по будням и в 9-00 в выходные.
2. Перейти в режим «День» в 11-00 по любым дням
3. Перейти в режим «Вечер» в 18-00 по любым дням
4. Перейти в режим «Ночь» в 22 -00 по будням и в 23-30 в выходные.

Кстати, эти режимы можно использовать и в других задачах, а не только в управлении теплыми полами.