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



  • @Alex_Jet:

    Коллеги, уже обращался с этой проблемой… с 13.02 у меня по утрам сценарий стал срабатывать 2 раза, из-за этого нарушается логика работы отопления в доме. Срабатывать стал именно по утрам (восход солнца - 2 часа), вечером (закат + 0 часов) срабатывает однократно. Скрипт сценария простой:

    Три дня подряд срабатывает утром по 2 раза:

    PS: не разбирались в чем проблема такой работы - п.3 этого поста?

    Пока не смогли воспроизвести 😞

    У Вас тоже не всегда происходит? Попробуйте сервер перезагрузить. Будем разбираться



  • @intrapro:

    @Erik:

    аналогичная проблема.

    ПРостой блок на информирование по почте. ПРи включении или выключении актуатора сообщает о событии по почте с указанием времени срабатывания.

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

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

    ПРи этом время в информировании указывается по гринвичу.

    Хотя в базу и графики событие попадает с московским временем.

    Так понимаю, два вопроса

    1. Время выводится по Гринвичу (UTC)

    2. Сценарий срабатывает дважды

    По времени - timeZone выставляется глобально для ОС.

    В документации на dateObj.toLocaleString https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString "Значением по умолчанию является часовой пояс по умолчанию среды выполнения"

    Вероятно, timeZone на сервере не установлена.

    попробуйте new Date().toString(), timeZone будет выведена явно:

    'Fri Feb 15 2019 10:14:06 GMT+0300 (MSK)'

    В базу пишутся таймштампы в UTC, при запросе браузер берет время с клиентской машины и преобразует в UTC, поэтому все работает. Можно посмотреть время в любом журнале или отладчике - эти времена формируются сервером.

    По сценарию - на дискретном актуаторе активизировано свойство АВТО?

    Установлено.

    Первым делом проверял.

    Вот проверка

    а вот почта после проверки



  • @intrapro:

    попробуйте new Date().toString(), timeZone будет выведена явно:

    'Fri Feb 15 2019 10:14:06 GMT+0300 (MSK)'

    По сценарию - на дискретном актуаторе активизировано свойство АВТО?

    Присылает время в UTC

    Зона на сервере установлена.

    Автоматический режим выключен. У обоих акуаторов.



  • @intrapro:

    @Alex_Jet:

    Коллеги, уже обращался с этой проблемой… с 13.02 у меня по утрам сценарий стал срабатывать 2 раза, из-за этого нарушается логика работы отопления в доме. Срабатывать стал именно по утрам (восход солнца - 2 часа), вечером (закат + 0 часов) срабатывает однократно. Скрипт сценария простой:

    Три дня подряд срабатывает утром по 2 раза:

    PS: не разбирались в чем проблема такой работы - п.3 этого поста?

    Пока не смогли воспроизвести 😞

    У Вас тоже не всегда происходит? Попробуйте сервер перезагрузить. Будем разбираться

    Да, Вы правы - не всегда. Позавчера под утро замерзли, поэтому сегодня решил журнал полистать. Думал, что в 4.4.17 - 4.4.18 что-нибудь исправили…



  • @Erik:

    @intrapro:

    попробуйте new Date().toString(), timeZone будет выведена явно:

    'Fri Feb 15 2019 10:14:06 GMT+0300 (MSK)'

    По сценарию - на дискретном актуаторе активизировано свойство АВТО?

    Присылает время в UTC

    Зона на сервере установлена.

    Автоматический режим выключен. У обоих акуаторов.

    Для контроля перезагрузил сервер - стала приходить почта с московским временем.



  • @Alex_Jet:

    @intrapro:

    Пока не смогли воспроизвести 😞

    У Вас тоже не всегда происходит? Попробуйте сервер перезагрузить. Будем разбираться

    Да, Вы правы - не всегда. Позавчера под утро замерзли, поэтому сегодня решил журнал полистать. Думал, что в 4.4.17 - 4.4.18 что-нибудь исправили…

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



  • Коллеги, подскажите - когда в Расписании можно будет сценариям передавать дополнительный параметр? Для кнопок такой функционал доступен (у меня используются кнопки переключения режимов работы отопления из оперативного меню), а для расписания нет…приходится писать "костыльные" скрипты:

    const mode = Device("SWITCH_HEATING");
    
    script({
        start(param) {
          //Передача входного параметра переключателю отопления
          if(param !== undefined) {
            mode.setValue(param);
          }
          else {
            switch(mode.value) {
              case 0: this.log("Режим отопления - " +mode.stateName);
                      break;
              case 1: mode.setValue(2);
                      break;
              case 2: mode.setValue(1);
                      break;
            }
          }
        }
    });
    
    


  • Какую функцию использовать в сценариях, чтобы уменьшить количество знаков после запятой? В настройках устройства стоит 2 цифры после запятой, но выводится на другое устройство (не мнемосхему) 10 цифр после запятой. Как их обрезать до 2-x?



  • @gis:

    Какую функцию использовать в сценариях, чтобы уменьшить количество знаков после запятой? В настройках устройства стоит 2 цифры после запятой, но выводится на другое устройство (не мнемосхему) 10 цифр после запятой. Как их обрезать до 2-x?

    Если значение с одного устройства присваивается другому устройству - нужно обоим поставить ограничения 2 знака после запятой.



  • @gis:

    Какую функцию использовать в сценариях, чтобы уменьшить количество знаков после запятой? В настройках устройства стоит 2 цифры после запятой, но выводится на другое устройство (не мнемосхему) 10 цифр после запятой. Как их обрезать до 2-x?

    Я использую Math.ceil(METER1.value) для округления до целых и METER1_v.toFixed(2) для округления до нужного количества знаков после запятой. Тоже не понимаю откуда берется 10 цифр после запятой на счетчике, который каждый импульс добавляет 0,01. Приходится заниматься округлением практически в каждом скрипте.



  • @Erik:

    @gis:

    Какую функцию использовать в сценариях, чтобы уменьшить количество знаков после запятой? В настройках устройства стоит 2 цифры после запятой, но выводится на другое устройство (не мнемосхему) 10 цифр после запятой. Как их обрезать до 2-x?

    Если значение с одного устройства присваивается другому устройству - нужно обоим поставить ограничения 2 знака после запятой.

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

    homa спасибо, попробую использовать эти функции, использовал стандартные для js , но они не работают.



  • @gis:

    homa спасибо, попробую использовать эти функции, использовал стандартные для js , но они не работают.

    Вроде стандартный js очень даже работоспособен в сценариях iH. Вот пример формирования строк на OLED (ssd1306):

        DataToOLED(text, value, unit, plugin, channel) {
          let iconv = require("/opt/intrahouse-c/backend/node_modules/iconv-lite");
          let buf = iconv.encode(text, "cp866");
          this.text = buf.toString("latin1");
    
          //Центрирование параметра на OLED
          let length = this.text.length;
          let col = (128 - length*6)/2;
          this.col = col.toFixed(0);
    
          //Форматирование цифровых значений
          let str = ""; //Вспомогательная переменная
          if(value < 100) value = value.toFixed(1);
          str = value.toString();
          if(str.length < 4 && value > 0) this.str = 's+' +str;
          else if(str.length < 4) this.str = 'ss' +str;
          else if(str.length < 5) this.str = 's' +str;
          else this.str = str;
    
          //Выбор единицы измерения
          if(unit == "grad") this.unit = ":";
          else if(unit == "percent") this.unit = "%";
          else if(unit == "ppm") this.unit = "s";
    
          //Вывод команд на дисплей
          this.ClearOLED(); //Очищаем первую строчку
          this.startTimer("T2", 0.2, "SendTextToOLED");
          this.startTimer("T3", 0.4, "SendValueToOLED");
          if(!this.oled_state) {  //Если дисплей выключен
            //то включаем его после обновления параметра
            this.startTimer("T4", 0.5, "TurnOnOLED");
          }
        },
    
    


  • @Alex_Jet:

    Вроде стандартный js очень даже работоспособен в сценариях iH. Вот пример формирования строк на OLED (ssd1306):

    Большое спасибо за информацию!



  • Можно продемонстрировать мнемосхему светильник, датчик движения, работа в вечернее и ночное время, чтобы не срабатывал в дневное время



  • А подскажите как из сценария выключить весь свет на этаже (привязка устройств к уровню/зоне), либо вообще весь свет в доме?



  • @Alex_Jet:

    А подскажите как из сценария выключить весь свет на этаже (привязка устройств к уровню/зоне), либо вообще весь свет в доме?

    Выключить все устройства подсистемы освещения

    this.doAll({subs:'1'}, ‘off’)
    
    
    

    На 1 этаже (place 1)

    this.doAll({place:'1', subs:'1'}, ‘off’)
    
    
    

    В доме, но не на территории (place 4)

    this.doAll({place:'1,2,3,5', subs:'1'}, ‘off’)
    
    
    


  • @Alex_Jet:

    А подскажите как из сценария выключить весь свет на этаже (привязка устройств к уровню/зоне), либо вообще весь свет в доме?

    Команды для групп устройств
    scen119.jpg



  • Отлично! Всем спасибо!

    @intrapro:

    Выключить все устройства подсистемы освещения

    > this.doAll({subs:'1'}, ‘off’)
    > 
    > 
    

    На 1 этаже (place 1)

    > this.doAll({place:'1', subs:'1'}, ‘off’)
    > 
    > 
    

    В доме, но не на территории (place 4)

    > this.doAll({place:'1,2,3,5', subs:'1'}, ‘off’)
    > 
    > 
    

    А вот еще что интересно. Я конечно могу залезть в json на сервере и посмотреть какие номера имеют у меня те или иные уровни/зоны/подсистемы, но может быть можно вернуть номер уровня/зоны/подсистемы по его названию? То есть написать функции типа NumberPlace("Территория") или NumberSubs("Освещение")? Эти номера (ID системы) ведь не соответствуют №п/п, которые созданы для упорядочивания в таблицах?



  • @Alex_Jet:

    А вот еще что интересно. Я конечно могу залезть в json на сервере и посмотреть какие номера имеют у меня те или иные уровни/зоны/подсистемы, но может быть можно вернуть номер уровня/зоны/подсистемы по его названию? То есть написать функции типа NumberPlace("Территория") или NumberSubs("Освещение")? Эти номера (ID системы) ведь не соответствуют №п/п, которые созданы для упорядочивания в таблицах?

    Легче вернуть столбцы ID в таблицы. Которые скрыли, чтобы не пугать пользователей 🙂

    Сейчас можно создать команду в блок-схеме и посмотреть id в скрипте



  • @intrapro:

    Легче вернуть столбцы ID в таблицы. Которые скрыли, чтобы не пугать пользователей 🙂

    Сейчас можно создать команду в блок-схеме и посмотреть id в скрипте

    Да уж. Порой вектор развития приводит не туда куда хотелось бы :lol:

    В качестве метода сценария, вероятно можно такие вещи сделать? В конце-концов с точки зрения нормального программиста это будет читаемый код, а не хард-код, состоящий из цифр - условных обозначений…


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