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



  • @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, то ответьте на мои вопросы:

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



  • @intrahouse:

    @Alex_Jet:

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

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

    Ну это образно выражаясь. Cron - это прерогатива ОС, хотя я в своей СУиМ на php/js очень даже успешно использовал этого демона. Я больше к тому, что в движке iH должен быть свой аналог cron.
    @intrapro:

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

    А можно тогда комментарии по 1,2,3,4 вопросам, которые озвучивал в посте https://frm.intrahouse.ru/viewtopic.php?f=18&t=5446&start=110#p8771 другой темы?

    PS: я часто сталкиваюсь с тем, что разработчики получат майл/пост на форуме и примут решение действительно что-то реализовать. А спустя день/неделю/месяц выкатывают свое решение (прошивка/новая версия ПО и т.д.). В итоге в это время живешь в условиях "вакуума" - то ли не прочитали, то ли забили, то ли что-то делают? Поэтому стараюсь задавать конкретные вопросы, чтобы получить на них конкретные ответы/комментарии.



  • Господа, дайте примеров сценариев с переключателями, не могу сообразить, просто примеры. Будут ли в "блоках" переключатели?



  • @thunder_d:

    Господа, дайте примеров сценариев с переключателями, не могу сообразить, просто примеры. Будут ли в "блоках" переключатели?

    Конкретизируйте что Вам необходимо реализовать?



  • Нужен переключатель на 10 положений (режимов), чтобы переключал 10 сценариев. 😉



  • Участник @thunder_d написал в Сценарии пользователей:

    Нужен переключатель на 10 положений (режимов), чтобы переключал 10 сценариев. 😉

    Делаете аналоговый актуатор с 10 фиксированными состояниями, и выводите его в интерфейс в виде переключателя.
    А в ваши скрипты добавляете проверку состояния этого актуатора. Если значение нужное - скрипт выполняется.



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


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