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



  • На сайте в блоге опубликовали статью по отправке показаний счетчиков https://ih-systems.com/ru/send_meter/

    Надеюсь, будет полезна.



  • @sergeyygr:

    Спасибо! Все отлично работает! Только в показаниях счетчиков электроэнергии, после запятой, число длинной с… километр :lol: А в настройках стоит 2 знака.

    Надо использовать функции js:

    const meter = Device("METER1_01");
    
    script({
        start() {
          //Сводка по газу
          let account = xxxxxx;
          let name = meter.name;
          let value = meter.value.toFixed(0);
    
          this.info("email", "GAS_SERVICE", account+ "*" +value);
          this.info("telegram", "OWNER", "Текущее показание '"+name+ "' - " +value+ " куб.м");
    
        }
    });
    
    


  • Интересный вопрос - если нужно временно отключить выполнение скрипта по расписанию, то как это можно сделать? Если убрать все дни недели, то он запуститься в уже назначенное время? Предусмотрите, пожалуйста, возможность блокировки задания в расписании. Конечно кто-то скажет что можно удалить и т.д., но если это надо временно, то почему бы не иметь возможность просто блокировать выполнение?

    То же, например, с блокировкой мультисценариев и блокировкой канала плагина Ping.



  • Вопрос правильный. Надо сделать.



  • @intrahouse:

    Вопрос правильный. Надо сделать.

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



  • Я имел ввиду то, что надо дать возможность временной блокировки пунктов расписания



  • @intrahouse:

    Я имел ввиду то, что надо дать возможность временной блокировки пунктов расписания

    Понятно! Я с этим тоже согласен.

    Просто проверил - можно ли таким способом не запускать расписание? - ответ нет, нельзя.



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

    /**

    • @name Вкл. полотенцесушителя на время

    • @desc Включает сушилку на заданное время

    • @version 4

    */

    const lamp = Device("SOCKET1_4",[

    {"name":"timeOff", "note":"Время работы, сек", "type":"number", "val":1800}

    ]);

    startOnChange([lamp]);

    script({

    start() {

    if (lamp.isOn()) {

    this.startTimer("T1",lamp.getParam("timeOff"),"onTimerT1");

    this.addListener(lamp, "onLamp");

    }

    },

    onTimerT1() {

    lamp.off();

    this.exit();

    },

    onLamp() {

    if (lamp.isOff()) {

    this.stopTimer("T1");

    this.exit();

    }

    }

    });

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



  • @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, поэтому срабатывает



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


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