Сценарии пользователей



  • @homa:

    Не хватает возможности для скриптов "запускать каждые …" например, когда нужно запускать скрипт каждые 5 секунд

    Можно сделать так. Установить плагин Sensor Emulator https://ih-systems.com/ru/product/plugin-sensors-emulator/

    В нем запускать какой нибудь виртуальный дискретный датчик с периодом 5 сек.

    А в сценарии этот датчик поставить как триггер запуска сценария.



  • @gis:

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

    В принципе согласен. Этот функционал не лишний. Надо думать по реализации



  • Коллеги, у меня каждый день по расписанию утром (-3 час от рассвета) и вечером (-0 час от заката) запускается скрипт тупо переключающий режим отопления - если ночь, то день, если день, то ночь. Но с 16.01.19 по вечерам он стал запускаться по два раза… В чем может быть дело?

    /** 
    * @name Переключение режимов отопления  
    * @desc При запуске включается День, если была Ночь или Ночь, если был День 
    * @version 4  
    */
    
    const mode = Device("SWITCH_HEATING");
    
    script({
        start() {
          if(mode.value == 1) {
            mode.setValue(2);
          }
          else {
            if(mode.value == 2)
            mode.setValue(1);
          }
          this.log("Режим отопления - " +mode.stateName);
        } 
    });
    
    

    Расписание_вечером_срабатывает_два_раза.png



  • @Alex_Jet:

    Коллеги, у меня каждый день по расписанию утром (-3 час от рассвета) и вечером (-0 час от заката) запускается скрипт тупо переключающий режим отопления - если ночь, то день, если день, то ночь. Но с 16.01.19 по вечерам он стал запускаться по два раза… В чем может быть дело?

    > /** 
    > * @name Переключение режимов отопления  
    > * @desc При запуске включается День, если была Ночь или Ночь, если был День 
    > * @version 4  
    > */
    > 
    > const mode = Device("SWITCH_HEATING");
    > 
    > script({
    >     start() {
    >       if(mode.value == 1) {
    >         mode.setValue(2);
    >       }
    >       else {
    >         if(mode.value == 2)
    >         mode.setValue(1);
    >       }
    >       this.log("Режим отопления - " +mode.stateName);
    >     } 
    > });
    > 
    

    Расписание_вечером_срабатывает_два_раза.png

    Было такое, но в позапрошлой по-моему версии исправили. У Вас актуальная версия?



  • @homa:

    Было такое, но в позапрошлой по-моему версии исправили. У Вас актуальная версия?

    Да, конечно, версия самая последняя - 4.4.11. Может что-то ещё делали? Расписание заново сделать?



  • @Alex_Jet:

    @homa:

    Было такое, но в позапрошлой по-моему версии исправили. У Вас актуальная версия?

    Да, конечно, версия самая последняя - 4.4.11. Может что-то ещё делали? Расписание заново сделать?

    Тогда ждём что скажут разработчики. У меня после обновления все стало работать



  • @intrahouse:

    @homa:

    Не хватает возможности для скриптов "запускать каждые …" например, когда нужно запускать скрипт каждые 5 секунд

    Можно сделать так. Установить плагин Sensor Emulator https://ih-systems.com/ru/product/plugin-sensors-emulator/

    В нем запускать какой нибудь виртуальный дискретный датчик с периодом 5 сек.

    А в сценарии этот датчик поставить как триггер запуска сценария.

    А можно период виртуального датчика получить и задать из кода сценария? И можно ли сделать на мнемосхема устройство у которого период будет устанавливаться уставкой?



  • @homa:

    А можно период виртуального датчика получить и задать из кода сценария? И можно ли сделать на мнемосхема устройство у которого период будет устанавливаться уставкой?

    На оба вопроса ответ нет.

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



  • @intrahouse:

    @homa:

    А можно период виртуального датчика получить и задать из кода сценария? И можно ли сделать на мнемосхема устройство у которого период будет устанавливаться уставкой?

    На оба вопроса ответ нет.

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

    Настроил замер "мгновенной нагрузки", которая вычисляется по среднему значению за минуту, решил что минута долго и нужно сделать за полминуты, получается нужно изменить код плагина и настройки виртуального сенсора. Вот когда начал менять и подумал, что было бы удобнее через интерфейс это поменять один раз и пользоваться переменной. Вообще использовать глобальные переменные было бы удобно/

    Еще хотелось бы выводить таймер на мнемосхему. Например есть сценарий, который ставит квартиру на охрану через 90секунд (время через которое выключится свет и устройства безопасности будут реагировать на изменения). Хочется видеть сколько еще осталось



  • Добрый день! Подскажите пожалуйста каким образом можно реализовать счётчик моточасов? И как в сценарии при передаче сообщения о срабатывании датчика движения кроме передачи имени датчика, зоны срабатывания передать и время его срабатывания?



  • @sergeyygr:

    Добрый день! Подскажите пожалуйста каким образом можно реализовать счётчик моточасов? И как в сценарии при передаче сообщения о срабатывании датчика движения кроме передачи имени датчика, зоны срабатывания передать и время его срабатывания?

    Первый вопрос реализовал сценарием (помогла идея по использованию плагина эмулятора). Вроде работает нормально (в эмуляторе устройство изменяет свое состояние 1 раз в 60 секунд).

    /**

    • @name Счетчик моточасов

    • @desc

    • @version 4

    */

    const meter = Device("Meter","Счетчик Моточасов");

    const pulse = Device("SensorD","Датчик импульсов");

    const sensor = Device("SensorD","Датчик напряжения генератора");

    startOnChange(pulse);

    script ({

    weight:1, // коэффициент

    start() {

    if (sensor.isOn()) {

    this.assign(meter, 'aval', meter.value+this.weight);

    this.assign( pulse, 'value', 0); // сброс импульса

    }

    }

    });

    А вот по второму вопросу все таки прошу помочь 🙂



  • @sergeyygr:

    @sergeyygr:

    Добрый день! Подскажите пожалуйста каким образом можно реализовать счётчик моточасов? И как в сценарии при передаче сообщения о срабатывании датчика движения кроме передачи имени датчика, зоны срабатывания передать и время его срабатывания?

    Первый вопрос реализовал сценарием (помогла идея по использованию плагина эмулятора). Вроде работает нормально (в эмуляторе устройство изменяет свое состояние 1 раз в 60 секунд).

    А вот по второму вопросу все таки прошу помочь 🙂

    Добрый день!

    Отлично, что придумали реализацию, пока мы не сделали циклический запуск по расписанию 🙂

    По второму вопросу - вы хотите передать время срабатывания датчика в сценарии, который вызван при сработке? То есть текущую дату и время?

    	let dt = new Date(); // это текущее время 
    	this.log('Время  '+dt.toLocaleString()) ;  // 'Время  2019-1-29 11:25:13', 
    
    
    


  • @intrapro:

    @sergeyygr:

    @sergeyygr:

    Добрый день! Подскажите пожалуйста каким образом можно реализовать счётчик моточасов? И как в сценарии при передаче сообщения о срабатывании датчика движения кроме передачи имени датчика, зоны срабатывания передать и время его срабатывания?

    Первый вопрос реализовал сценарием (помогла идея по использованию плагина эмулятора). Вроде работает нормально (в эмуляторе устройство изменяет свое состояние 1 раз в 60 секунд).

    А вот по второму вопросу все таки прошу помочь 🙂

    Добрый день!

    Отлично, что придумали реализацию, пока мы не сделали циклический запуск по расписанию 🙂

    По второму вопросу - вы хотите передать время срабатывания датчика в сценарии, который вызван при сработке? То есть текущую дату и время?

    > 	let dt = new Date(); // это текущее время 
    > 	this.log('Время  '+dt.toLocaleString()) ;  // 'Время  2019-1-29 11:25:13', 
    > 
    > 
    

    Спасибо! Но надо только время, без даты.



  • @sergeyygr:

    Спасибо! Но надо только время, без даты.

    Тогда можно так:

    let dt = new Date(); 
    this.log('Время  '+dt.getHours()+":"+dt.getMinutes()+":"+dt.getSeconds() );
    
    
    

    Или так:

    let dt = new Date(); 
    this.log('Время  '+dt.toLocaleString().substr(10))
    
    


  • @intrapro:

    @sergeyygr:

    Спасибо! Но надо только время, без даты.

    Тогда можно так:

    > let dt = new Date(); 
    > this.log('Время  '+dt.getHours()+":"+dt.getMinutes()+":"+dt.getSeconds() );
    > 
    > 
    

    Или так:

    > let dt = new Date(); 
    > this.log('Время  '+dt.toLocaleString().substr(10))
    > 
    

    Спасибо. То, что надо!



  • Задача - Если насос/котел/кран не менял свое состояние (не включался) больше некоторого времени, то включить его на 5 минут и затем выключить. Сам скрипт оказался не таким сложным. Но понадобилось время чтобы в json-конфигах сервера разыскать параметр устройства под названием "lastts" - это время последнего изменения состояния (ON/OFF/TOGGLE) устройства в мс. Параметры устройств нигде не опубликованы, о чем я сожалею. Однако если скрипт оставлять в таком виде, в котором я его привел, то нужно запускать его по расписанию в "cron". Может быть кто-нибудь подскажет - можно ли что-то сделать со StartOnChange или Listener - чтобы сценарий самостоятельно запускался каждую минуту/10 минут/час/день/неделю?

    /** 
    * @name Включение устройств на время 
    * @desc Если прошло больше времени с момента последнего включения чем задано в сценарии, то включаем устройство на некоторое время 
    * @version 4 
    */
    
    const dev = Device("PUMP1"); 
    
    script({
        start() {
          let TurnOnDur = 300;  //Длительность работы в секундах
          let timer = 4;        //Таймер отсчета в часах
          let nowtime = Date.now(); // Текущее время в мс
          let lasttime = dev.getParam('lastts'); //Время изменения состояния в мс
          let diftime = nowtime - lasttime; //Разница в мс
          let dif = diftime/(1000*60*60); //Разница в часах
          let hours = Math.floor(dif);
          let minutes = Math.round((dif-hours)*60);
    
          //this.log(nowtime+ " - " +lasttime+ " = " +diftime);
    
          if(dev.isOff() && dif > timer) {
            this.log(dev.name+ " last ON = " +((hours < 10) ? "0" : "")+hours+ ":" +((minutes < 10) ? "0" : "")+minutes+ " ago > " +timer+ " -> TurnOn by " +TurnOnDur/60+ "min");
            dev.on();
            this.startTimer("T1", TurnOnDur, "TurnOffDev");
          }
          else if(dev.isOn()) {
            this.log(dev.name+ " is ON ~ " +((hours < 10) ? "0" : "")+hours+ ":" +((minutes < 10) ? "0" : "")+minutes+ " -> exit");
          }
          else {
            this.log(dev.name+ " last ON = " +((hours < 10) ? "0" : "")+hours+ ":" +((minutes < 10) ? "0" : "")+minutes+ " ago < " +timer+ " -> exit");
          }
        },
    
        TurnOffDev() {
          dev.off();
          dev.setAuto('True');
        }
    });
    
    
    

    Если это будут читать разработчики iH, то ответьте на мои вопросы: тут и тут.



  • @Alex_Jet:

    Задача - Если насос/котел/кран не менял свое состояние (не включался) больше некоторого времени, то включить его на 5 минут и затем выключить. Сам скрипт оказался не таким сложным. Но понадобилось время чтобы в json-конфигах сервера разыскать параметр устройства под названием "lastts" - это время последнего изменения состояния (ON/OFF/TOGGLE) устройства в мс. Параметры устройств нигде не опубликованы, о чем я сожалею. Однако если скрипт оставлять в таком виде, в котором я его привел, то нужно запускать его по расписанию в "cron". Может быть кто-нибудь подскажет - можно ли что-то сделать со StartOnChange или Listener - чтобы сценарий самостоятельно запускался каждую минуту/10 минут/час/день/неделю?

    > /** 
    > * @name Включение устройств на время 
    > * @desc Если прошло больше времени с момента последнего включения чем задано в сценарии, то включаем устройство на некоторое время 
    > * @version 4 
    > */
    > 
    > const dev = Device("PUMP1"); 
    > 
    > script({
    >     start() {
    >       let TurnOnDur = 300;  //Длительность работы в секундах
    >       let timer = 4;        //Таймер отсчета в часах
    >       let nowtime = Date.now(); // Текущее время в мс
    >       let lasttime = dev.getParam('lastts'); //Время изменения состояния в мс
    >       let diftime = nowtime - lasttime; //Разница в мс
    >       let dif = diftime/(1000*60*60); //Разница в часах
    >       let hours = Math.floor(dif);
    >       let minutes = Math.round((dif-hours)*60);
    >       
    >       //this.log(nowtime+ " - " +lasttime+ " = " +diftime);
    >       
    >       if(dev.isOff() && dif > timer) {
    >         this.log(dev.name+ " last ON = " +((hours < 10) ? "0" : "")+hours+ ":" +((minutes < 10) ? "0" : "")+minutes+ " ago > " +timer+ " -> TurnOn by " +TurnOnDur/60+ "min");
    >         dev.on();
    >         this.startTimer("T1", TurnOnDur, "TurnOffDev");
    >       }
    >       else if(dev.isOn()) {
    >         this.log(dev.name+ " is ON ~ " +((hours < 10) ? "0" : "")+hours+ ":" +((minutes < 10) ? "0" : "")+minutes+ " -> exit");
    >       }
    >       else {
    >         this.log(dev.name+ " last ON = " +((hours < 10) ? "0" : "")+hours+ ":" +((minutes < 10) ? "0" : "")+minutes+ " ago < " +timer+ " -> exit");
    >       }
    >     },
    >     
    >     TurnOffDev() {
    >       dev.off();
    >       dev.setAuto('True');
    >     }
    > });
    > 
    > 
    

    Если это будут читать разработчики iH, то ответьте на мои вопросы: тут и тут.

    Это можно делать используя эмулятор сенсора. В настройках плагина задается период изменения, а сценарий выполняется по признаку startOnChange(sensor_name), либо это не чаще раза в день, то можно запускать сценарий в определенное время каждый день\день месяца\дни недели



  • @homa:

    Это можно делать используя эмулятор сенсора. В настройках плагина задается период изменения, а сценарий выполняется по признаку startOnChange(sensor_name), либо это не чаще раза в день, то можно запускать сценарий в определенное время каждый день\день месяца\дни недели

    Про этот "костыль" я слышал, но не хочется в системе такого уровня использовать подобные вещи. Должно работать либо на основе методов сценария, либо штатным образом, как это делается везде - методом запуска сценариев через cron.



  • @Alex_Jet:

    как это делается везде - методом запуска сценариев через cron.

    Через Cron? Лично для меня это и есть костыль



  • @Alex_Jet:

    Задача - Если насос/котел/кран не менял свое состояние (не включался) больше некоторого времени, то включить его на 5 минут и затем выключить. Сам скрипт оказался не таким сложным. Но понадобилось время чтобы в json-конфигах сервера разыскать параметр устройства под названием "lastts" - это время последнего изменения состояния (ON/OFF/TOGGLE) устройства в мс.

    Не совсем так. lastts - это временная метка не ИЗМЕНЕНИЯ состояния, а получения данных от железа (даже если изменений нет)

    Это время вы видите в меню устройства внизу

    Почему - см ответ в другой теме: https://frm.intrahouse.ru/viewtopic.php?f=18&t=5446&p=8867#p8867

    Для получения времени последнего изменения состояния (переключения) добавим новую функцию сценария в следующем релизе.

    @Alex_Jet:

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

    Да, вы правы. Добавим в документацию

    @Alex_Jet:

    Однако если скрипт оставлять в таком виде, в котором я его привел, то нужно запускать его по расписанию в "cron". Может быть кто-нибудь подскажет - можно ли что-то сделать со StartOnChange или Listener - чтобы сценарий самостоятельно запускался каждую минуту/10 минут/час/день/неделю?

    Нет, использовать cron мы не планируем.

    Добавим либо циклический запуск из расписания, либо правило для запуска прямо в сценарии. Эта задача включена в план.

    @Alex_Jet:

    Если это будут читать разработчики iH, то ответьте на мои вопросы:

    Постараемся не только ответить, но и реализовать. Но не все сразу 🙂


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