Сценарии - новая версия API



  • @Anatol:

    Есть сценарий, вкл. полотенцесушитель, взводим таймер на определенное время:

    Вроде всё работает, но обнаружил : при перезагрузке системы если таймер был взведен, устройство так и останется включенным. Как в этом случае поступить ?, может где-то прописать что должно быть вкл или выкл при перезагрузке ? или в сценарии как прописать что если после перезагрузки вкл, то снова взести таймер ?

    Чтобы сценарий срабатывал при загрузке, нужно добавить функцию boot.

    Эта функция на старте проверяет, нужно ли запустить сценарий

    Если вернется true, то будет запущена функция start

    Сценарий всегда будет срабатывать при перезагрузке

    ....
    script({
      boot() { 
         return true;
      },
      start() { 
      	.....
      },
    ...
    
    
    

    Cработает только если устройство включено:

    ....
    script({
      boot() { 
         return lamp.isOn();
      },
      start() { 
      	.....
      },
    ...
    
    
    


  • Есть блок-схема: лог, таймер, присваивание значения, но почему-то создается 4 таймера и значение присваивается только в одном случае. Не верно строится скрипт из блоксхемы. Причем блок "лог" пришлось добавить потому что нельзя завести 4 входящие линии в таймер. Можно это тоже поправить?

    /** 
    * @name TelegramControl  
    * @desc  
    * @version 4 
    */
    
    const SENSORA15 = Device("SENSORA15");
    const ACTOR5 = Device("ACTOR5");
    const SWITCH1 = Device("SWITCH1");
    
    startOnChange([SENSORA15]);
    
    script({
      start() { 
        if (SENSORA15.value == "/lightoff") {
          this.doAll({ type: '510' },"off");
          this.log(``);
          this.startTimer("T1",1,"onTimerT1");
        }
        if (SENSORA15.value == "/securityon") {
          ACTOR5.on();
          this.log(``);
          this.startTimer("T2",1,"onTimerT2");
        }
        if (SENSORA15.value == "/securityoff") {
          ACTOR5.off();
          this.log(``);
          this.startTimer("T3",1,"onTimerT3");
        }
        if (SENSORA15.value == "/openhalldoor") {
          SWITCH1.on();
          this.log(``);
          this.startTimer("T4",1,"onTimerT4");
        }
      },
      onTimerT1() { 
         SENSORA15.setParam("value",100);
      },
      onTimerT2() { 
      },
      onTimerT3() { 
      },
      onTimerT4() { 
      }
    })
    
    
    

    sc1.JPG



  • Есть тригер : датчик температуры, значения до десятой, н.р 5.3 град. Сейчас тригер срабатывает при каждом изменении на 0.1 град. Как сделать чтобы он срабатывал по целым числам, т.е при изменении на один градус ? Можно загрубить значение при выводе с датчика, но это нежелательно.



  • @Anatol:

    Есть тригер : датчик температуры, значения до десятой, н.р 5.3 град. Сейчас тригер срабатывает при каждом изменении на 0.1 град. Как сделать чтобы он срабатывал по целым числам, т.е при изменении на один градус ? Можно загрубить значение при выводе с датчика, но это нежелательно.

    Если делаете через JS, то напрашивается деление с остатком. Делите показание на единицу, если остаток равен нулю, то продолжаете выполнять сценарий



  • @Anatol:

    Есть тригер : датчик температуры, значения до десятой, н.р 5.3 град. Сейчас тригер срабатывает при каждом изменении на 0.1 град. Как сделать чтобы он срабатывал по целым числам, т.е при изменении на один градус ? Можно загрубить значение при выводе с датчика, но это нежелательно.

    Как вариант - делать сравнение текущего значения с запомненным в start.

    То есть скрипт будет срабатывать при изменении значения на датчике. Но в основной функции мы это значение округляем до целого, сравниваем с запомненным +-1 и выполняем свою функцию (doFunction), ну или делаем какие-то действия. Что-то типа этого:

    const dt = Device("STEMP4_01");
    
    startOnChange(temp);
    
    script({
      temp_storage: 0;
    
      start() {
        let temp = Math.round(dt.value);
    
        if(temp < temp_storage - 1 || temp > temp_storage + 1) {
          this.temp_storage = temp;
          this.doFunction();
        }
        else this.exit();
      }
    });
    
    
    


  • temp_storage: 0; здесь выдает ошибку Unexpected token



  • @Anatol:

    temp_storage: 0; здесь выдает ошибку Unexpected token

    Замените ; на ,



  • Коллеги! Подскажите как сделать мультисценарий: Датчик движения - Snapshot с камеры с ID?

    Ну и аппетит приходит во время еды. Касаемо видеоалертов есть информация? Будет какой-то всплывающий виджет с видео от камеры (правда тут надо решить задачу по определению активности клиента)? Было бы удобно для организации видеозвонка/видеоалерта проникновения на территорию/дом/гараж.



  • @Alex_Jet:

    Замените ; на ,

    Спасибо, получилось, в JS я не силен



  • Подскажите, в сценарии есть

    const dt = new Date();

    startOnChange([STEMP0_1], (dt.getHours() < STEMP0_1.getParam("hstop") || dt.getHours() > STEMP0_1.getParam("hstart"))

    script({….

    Если делать пробный запуск, то все работает, а так выдает ошибку dt is not defined ??



  • @Anatol:

    Подскажите, в сценарии есть

    const dt = new Date();

    startOnChange([STEMP0_1], (dt.getHours() < STEMP0_1.getParam("hstop") || dt.getHours() > STEMP0_1.getParam("hstart"))

    script({….

    Если делать пробный запуск, то все работает, а так выдает ошибку dt is not defined ??

    Нужно new Date() включить внутрь выражения. Так должно работать:

    startOnChange([STEMP0_1], ((new Date()).getHours() < STEMP0_1.getParam("hstop") || (new Date()).getHours() > STEMP0_1.getParam("hstart")));
    
    

    Причина в том, что область вне script - это декларативная область. Команды там размещать не надо, они выполняться не будут.

    При запуске сценария по триггеру, если есть входное условное выражение (второй аргумент в startOnChange), оно вычисляется. Если выражение истинно - начинается выполнение функции start.

    При пробном запуске startOnChange игнорируется, сразу запускается функция start, поэтому срабатывает



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



  • @gis:

    Поясните, пожалуйста, как послать команду плагину. Просьба привести пример.

    Команды плагину можно послать из сценария (блок-схемы) или с кнопки.

    Плагин должен принимать от сервера сообщения с типом 'command'. Не все плагины поддерживают такую возможность.

    Набор команд и их формат также определяется плагином. Часто это служебные команды.

    Например, плагин xiaomi выполняет только команды 'scan' и 'remove'

    Для MegaD можно посылать любые запросы, которые принимает контроллер: см раздел "Отправка команды плагину из сценария"

    https://ih-systems.com/ru/product/plugin-megad/

    Например, выдать импульс:

    this.pluginCommand({unit:'megad1', command:'/%pwd%/?cmd=7:1;p10;7:0'});
    
    

    При использовании блок-схемы (или команды с кнопки) сначала из списка выбирается плагин, затем в поле Команда нужно прописать строку command без кавычек:

    /%pwd%/?cmd=7:1;p10;7:0
    
    


  • Добрый день. Обновился до версии 4.6.1. Перестали работать сценарии включения освещения по датчикам движения. В таблице сценариев lamp считается триггером, smotion не видит. 😞



  • Проблему уже заметили. Через час будет обновление.



  • @intrahouse:

    Проблему уже заметили. Через час будет обновление.

    Понял. Пока откатился на 4.6.0 - работает 🙂



  • Исправили. Можно обновить - 4.6.2



  • @intrahouse:

    Исправили. Можно обновить - 4.6.2

    Работает!



  • Коллеги! Подскажите когда примерно ждать реализации двух моментов:

    1. Возможность временного отключения задачи по расписанию

    2. Передача дополнительных параметров в сценарий при настройке задачи по расписанию.



  • Вопрос к разработчикам: почему не появилось в интерфейсе на закладке "Параметры" для устройства VOLL_ALL дополнительное свойство "Пониженная громкость"? Устройство VOLL_ALL работает через плагин http без обратной связи.

    * @name Оповещение о входной двери 
    * @desc Оповещение об открытой входной двери 
    * @version 4  
    */
    
    const SGERK_M1_P0 = Device("SGERK_M1_P0");
    const VOLL = Device("VOLL_ALL", "Общая громкость", [
    {"name":"VOLDOWN", "note":"Пониженная громкость",  "type":"number", "val":5},
      ]); 
    
    startOnChange([SGERK_M1_P0]);
    script({
      start() { 
         require("http").get(`http://192.168.0.43/mp3play?cmd=6&data=${VOLL.getParam("VOLDOWN")}`);
         this.startTimer("T1",1,"onTimerT1");
      },
      onTimerT1() { 
        require("http").get(`http://192.168.0.43/mp3playqueue?data=100,0,300,0,301,1002,300,0,301` );
      }
    })
    
    

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


Авторизуйтесь, чтобы ответить