Запуск сценария по кнопке



  • @Alex_Jet спасибо. Я с языками совсем не знаком, максимум что я могу - это копипаста.
    Поэтому реализовываю всё преимущественно в блоках.

    Где убрать StartOnChange, учитывая это?)



  • @gewer, блокли штука неповоротливая. Я ее принципиально не использую, чтобы не потерять навык скриптописания. Поэтому даже не знаю чем вам помочь. Вероятно только дать совет - начать разбираться как писать сценарии с помощью js. Таким образом, сможете реализовать самые хитрые задачи!



  • @Alex_Jet ну не может же быть такого, что блочный код нельзя запускать по кнопке?
    Подожду, может разработчики ответят.



  • @gewer Да, вы правы, можно сделать блочный сценарий и запускать его с кнопки. Но тогда в нем не должно быть устройств - триггеров (красных блоков)
    Вот пример такого сценария: здесь используются свойства датчика температуры - значение и уставка (желтые блоки). Эти блоки добавляются с вкладки Операции.

    bs1.png

    Такой сценарий можно запустить с кнопки, но толку в нем нет - он будет переключать батарею только в тот момент, когда вы будете нажимать кнопку 🙂
    Вы же хотите, чтобы регулирование выполнялось при изменении температуры и уставки.
    Просто нужно иметь в виду, что сценарии IH не крутятся постоянно, а срабатывают по заданным событиям. Это позволяет запускать большое количество сценариев, которые очень быстро срабатывают, а большую часть времени не активны. Событиями для запуска могут быть изменения состояния устройств либо действия пользователя. Это два разных типа сценария - интерактивные и по событиям устройств.

    Красные блоки на блок-схеме - это устройства-триггеры, события которых и запускают сценарии. Ваш сценарий в первом сообщении будет вызван по событиям устройства KG, поэтому его и нельзя запустить с кнопки
    (кстати, Вы, вероятно используете старую версию системы, в которой тип блока еще переключался с красного на желтый на первой вкладке. Лучше ее обновить)

    Вернемся к вашей задаче, но разобьем ее на подзадачи:

    • при изменении температуры нужно регулировать батарею. Порог для регулирования - уставка датчика.
    • Порог нужно менять в зависимости от времени суток либо интерактивно
    • Иногда сценарий не должен работать совсем, то есть включили батарею - и не выключаем совсем (или не включаем)

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

    Для решения второй есть несколько вариантов, которые уже предлагали выше.
    Значения порогов можно заложить в сценарий или интерактивно менять через пользовательский интерфейс (здесь уже без скриптов не обойтись)
    Посмотрим простое решение без написания скриптов
    Вариант 1, как вы хотели, на кнопках
    Создаем сценарий-блок, в котором делаем ночную уставку для датчика (может быть несколько датчиков). Называем его Ночные уставки. Аналогично делаем сценарий Дневные уставки
    Эти сценарий можно запустить по расписанию.
    Можно также сделать сценарий Экономные уставки.
    Для каждого сценария сделать по кнопке, чтобы можно было переключать интерактивно.
    Минус - не видно, какой сейчас режим. Но это можно решить, добавив виртуальное устройство Режим отопления, переопределить состояния (0 - День, 1 - Ночь, 2 - Эконом) и вывести на экран.

    Вот пример такого сценария. Используется блок "Присваивание значения" на вкладке "Команды". Присваиваются уставки двум датчикам плюс индикатор режима.
    bs2.png

    В свойствах для температуры задать setpoint (уставка) пороговые значения.

    bs3.png



  • @gewer, предыдущий пост получился довольно длинным в попытке прояснить событийный механизм сценариев.
    Возможно, мы вашу задачу не совсем правильно поняли. Пробуйте и задавайте вопросы дальше 🙂



  • Участник @intrapro написал в Запуск сценария по кнопке:

    @gewer, предыдущий пост получился довольно длинным в попытке прояснить событийный механизм сценариев.
    Возможно, мы вашу задачу не совсем правильно поняли. Пробуйте и задавайте вопросы дальше 🙂

    Спасибо, ближе к выходным буду пытаться разобраться. До момента написания сценариев всё прошло довольно гладко, на самом интересном становится сложнее, но думаю что осилю)



  • На сайте есть статья управление теплыми полами
    Возможно, она поможет решить вашу задачу
    Там есть мультисценарий, который можно использовать.



  • Участник @intrahouse написал в Запуск сценария по кнопке:

    На сайте есть статья управление теплыми полами
    Возможно, она поможет решить вашу задачу
    Там есть мультисценарий, который можно использовать.

    Это то что нужно!

    В статье есть следующее:

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

    В данном случае уставку можно будет поменять для каждого датчика отдельно, верно? Или она будет меняться для всех сразу? В разных помещениях нужна разная температура тёплых полов (в ванной теплее, в неиспользуемых спальнях вообще отключить и т.д.).



  • Участник @gewer написал в Запуск сценария по кнопке:

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

    Да, это так.



  • Участник @intrahouse написал в Запуск сценария по кнопке:

    Да, это так.

    Супер. Тогда это идеально мне подходит.
    Несколько дней курения мануалов и ваша помощь сэкономили нехилую сумму на автоматике для водяных полов) Спасибо!



  • Можно все же поднять еще раз вопрос?
    Итак имеем один сценарий (мультисценарий) - работа батарей в зависимости от датчиков температуры и уставки на датчике.
    Возможен другой сценарий - работа батарей в зависимости от значения датчика температуры и определенной температуре "антизамерзания"
    Хочется что бы при включении отопления работал первый сценарий а при выключении - второй. Вопрос: как из одного сценария заблокировать/разблокировать выполнение другого?



  • Участник @alesle написал в Запуск сценария по кнопке:

    Можно все же поднять еще раз вопрос?
    Итак имеем один сценарий (мультисценарий) - работа батарей в зависимости от датчиков температуры и уставки на датчике.
    Возможен другой сценарий - работа батарей в зависимости от значения датчика температуры и определенной температуре "антизамерзания"
    Хочется что бы при включении отопления работал первый сценарий а при выключении - второй. Вопрос: как из одного сценария заблокировать/разблокировать выполнение другого?

    Сделайте актуатор на 2 состояния. 1 состояние для включенного отопления, второе - для выключенного.
    В обоих мультисценариях, которые у вас запускаются при изменении показаний датчика температуры, добавьте для запуска проверку условия соответствия этого актуатора нужному положению. Первый мультисценарий запускайте, если он в положении "отопление включено", второй - в положении "отопление выключено.

    Вот, для примера, аналогичная пара. только разное поведение по датчикам движения при включении или отключении режима охрана. Когда выключен - включает свет, когда включен - посылает пуш-сообщение.
    Первый

    /** 
    * @name Свет в комнате по движению  
    * @desc  
    * @version 4  
    */
    
    const Lamp = Device("ActorD", "Светильник");
    const Sw = Device("SensorD", "Выключатель");
    const Motion = Device("SensorD", "Датчик движения"); 
    const SAF = Device("ActorD","Охрана"); 
    const Last = Device("ActorA","Последнее движение");
    
    // Запустим сценарий при сработке датчика движения, если светильник не горит, режим охраны отключен, выключатель выключен. 
    startOnChange([Motion], Motion.isOn() && Lamp.isOff() && Sw.isOff() && SAF.isOff());
    
    script({
        start() {
             Lamp.on();
             Last.setValue(`Последнее движение ${new Date().toLocaleString()}.  ${Motion.zoneName}`);
             // взводим таймер, чтобы отключить 
             this.startTimer("T1", 180, "turnOff");       
            
            // Добавляем слушателей - следим за датчиком движения и светильником
            this.addListener(Motion, "onMotion");
            this.addListener(Lamp, "onLamp");
            this.addListener(Sw, "onSw");
        },
        
        onMotion() {
          // Если движение возобновилось - сбрасываем таймер
          if (Motion.isOn() )  {
            this.stopTimer("T1");
          }  
           // Если движение прекратилось - взводим таймер (после повторных движений)
          if (Motion.isOff() && this.timer.T1 == "off")  {
            this.startTimer("T1",  180, "turnOff");
          }  
        },
        
         onLamp() {
          // Светильник выключили другим способом - выходим
           if (Lamp.isOff()) this.exit();
         },
         
         onSw() {
          // Светильник выключили другим способом - выходим
            if (Sw.isOn() )  {
            this.stopTimer("T1");
          this.exit();
            }
         },
    
        // Функция, которая сработает, когда таймер досчитает - отключаем и выходим
        turnOff() {
          Lamp.off();
          this.exit(); // Здесь exit нужен, так как есть активные слушатели и сценарий сам не завершится
        }
    });
    

    Второй

    /** 
    * @name Движение в комнате 
    * @desc  
    * @version 4  
    */
    
    const motion = Device("SensorD", "Датчик движения"); 
    const SAF = Device("ActorD","Охрана"); 
    const Last = Device("ActorA","Последнее движение");
    
    startOnChange([motion], motion.isOn()); 
    
    script({
      start() { 
        if ((motion.isOn())) {
          Last.setValue(`Последнее движение ${new Date().toLocaleString()}.  ${motion.zoneName}`);
        }
        if ((SAF.isOn()) && (motion.isOn())) {
          this.info("pushnotification","OWNER",`Движение в комнате!!!!`);
        }
      }
    });
    


  • Спасибо, так я и сделал, в конце концов.



  • Помогите советом. Хочу на одном из экранов сделать кнопку, при нажатии чтобы меня перекидывало на настройку проекта ( http://192.168.0.7:8088/pm/ )



  • @DM19, на текущий момент такой возможности нет (надо добавить в "Системные команды"). Только если использовать не кнопку, а html-виджет и в нем прописать прямой адрес с типом открытия в новом окне.


Log in to reply