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



  • Есть сценарий на включение света, когда я захожу домой срабатывает SMOTION2 (датчик света) с проверкой датчика датчика освещенности SENSORA1, когда есть движения там где есть датчик движения то скрипт работает при условии что не было 30 секунд без движения. Вопрос как можно его дополнить: Задача: SMOTION2 (точка входа в помещение) активирует сценарий и что бы SMOTION21 (конечная точка в помещении) останавливала сценарий. но если я задерживаюсь на любых зонах там где есть датчик движения (SMOTION2,SMOTION4,SMOTION21) то там продолжает гореть свет а в других зонах он гаснет цвет, но если я дохожу до конечной точки (SMOTION21) то цвет через назначенное время гаснет всюду даже если таймер в какой то зоне еще активный.

    const LAMP23 = Device("LAMP23");

    const LAMPHL11 = Device("LAMPHL11");

    const LAMPKL12 = Device("LAMPKL12");

    const SMOTION2 = Device("SMOTION2");

    const SMOTION4 = Device("SMOTION4");

    const SMOTION21 = Device("SMOTION21");

    const SENSORA1 = Device("SENSORA1",'');

    startOnChange([SMOTION2],SENSORA1.value<10);

    script({

    start() {

    this.log("auto_light start");

    this.addListener(SMOTION2, "onMotion");

    this.addListener(SMOTION4, "onMotion");

    this.addListener(SMOTION21, "onMotion");

    },

    onMotion(){

    this.log("auto_light onMotion");

    LAMP23.turnOnSaveAuto();

    LAMPHL11.turnOnSaveAuto();

    LAMPKL12.turnOnSaveAuto();

    this.stopTimer("T1");

    this.startTimer("T1", 30, "offLight");

    },

    offLight(){

    LAMP23.turnOffSaveAuto();

    LAMPHL11.turnOffSaveAuto();

    LAMPKL12.turnOffSaveAuto();

    this.log("auto_light end");

    this.exit();

    }

    })



  • @Alex_Jet:

    Коллеги! Помагите))) Недавно писал, что не отображаются статусы голосовых терминалов и, соответственно, не могу ими управлять (https://frm.intrahouse.ru/viewtopic.php?f=18&t=5494&start=30#p10828). Тогда все починил и все было ок. Но такое ощущение что при последнем обновлении где-то что-то было изменено и из плагина не запускается данный сценарий (сегодня утром включал свет и другой сценарий работал). Даже хуже - при ручном запуске сценария VoiceTerminal_Status в отладчике вообще ничего нет - ни start, ни stop! Свойства, объявленные в сценарии на вкладке "Параметры" у плагина не появляются… что такое может быть? При этом плагин получает от терминала сообщения и пытается запустить сценарий:

    > 23.09 16:55:56.429 voiceterminal2: 192.168.11.52 => localhost:11052 HTTP GET /api/method/name.method?music_volume=100&volume=100&username=voiceterminal&terminal=VT2&uptime=2142315
    > 23.09 16:55:56.430 voiceterminal2: 192.168.11.52 <= localhost:11052 
    > 23.09 16:55:56.430 voiceterminal2: { type: 'startscene',
    >   id: 'VoiceTerminal_Status',
    >   arg: '{"music_volume":"100","volume":"100","username":"voiceterminal","terminal":"VT2","uptime":"2142315"}' }
    > 23.09 16:55:56.431 IH: startscene VoiceTerminal_Status
    > 
    

    Коллеги, посмотрите все же что происходит с Scene Engine? Мне кажется после последних обновлений у меня перестает работать часть сценариев (по крайней мере 2 шт., связанных с Voice Terminal - точно прекращают свою работу!). Например, вышеприведенный. Захожу в сценарий, изменяю его (ввожу, например, пробел), сохраняю и он работает до поры до времени…



  • @Alex_Jet:

    @Alex_Jet:

    Коллеги! Помагите))) Недавно писал, что не отображаются статусы голосовых терминалов и, соответственно, не могу ими управлять (https://frm.intrahouse.ru/viewtopic.php?f=18&t=5494&start=30#p10828). Тогда все починил и все было ок. Но такое ощущение что при последнем обновлении где-то что-то было изменено и из плагина не запускается данный сценарий (сегодня утром включал свет и другой сценарий работал). Даже хуже - при ручном запуске сценария VoiceTerminal_Status в отладчике вообще ничего нет - ни start, ни stop! Свойства, объявленные в сценарии на вкладке "Параметры" у плагина не появляются… что такое может быть? При этом плагин получает от терминала сообщения и пытается запустить сценарий:

    > > 23.09 16:55:56.429 voiceterminal2: 192.168.11.52 => localhost:11052 HTTP GET /api/method/name.method?music_volume=100&volume=100&username=voiceterminal&terminal=VT2&uptime=2142315
    > > 23.09 16:55:56.430 voiceterminal2: 192.168.11.52 <= localhost:11052 
    > > 23.09 16:55:56.430 voiceterminal2: { type: 'startscene',
    > >   id: 'VoiceTerminal_Status',
    > >   arg: '{"music_volume":"100","volume":"100","username":"voiceterminal","terminal":"VT2","uptime":"2142315"}' }
    > > 23.09 16:55:56.431 IH: startscene VoiceTerminal_Status
    > > 
    

    Коллеги, посмотрите все же что происходит с Scene Engine? Мне кажется после последних обновлений у меня перестает работать часть сценариев (по крайней мере 2 шт., связанных с Voice Terminal - точно прекращают свою работу!). Например, вышеприведенный. Захожу в сценарий, изменяю его (ввожу, например, пробел), сохраняю и он работает до поры до времени…

    Добрый день! Навскидку изменений, связанных со сценариями, было немного (обработка результата команд execOS и pluginCommand).

    Нужно определить что конкретно перестало работать
    <list>* не срабатывает запуск сценария из плагина;</list>
    <list>* сценарий запускается, но не находит устройства;</list>
    <list>* не присваиваются свойства;</list>
    <list>* свойства присвоились, но не показываются в окне устройства</list>

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

    
     start(param) {
        let device = '';
        this.log("VoiceTerminal_Status started with "+param);
    
        //Скрипт запускается плагином с параметрами
        if(param !== undefined) {
          const obj = JSON.parse(param);
    
          //Выбор устройства
          if(obj.terminal == "VT1") {
            device = dev1;
            this.log("device= "+device.dn);
          }
          else if(obj.terminal == "VT2") {
            device = dev2;
            this.log("device= "+device.dn);
          } else {
             this.log("device not found:  "+ obj.terminal);
         }
         // И можно в конце вывести свойство любое после присваивания
    
    
    

    @Alex_Jet:

    при ручном запуске сценария VoiceTerminal_Status в отладчике вообще ничего нет - ни start, ни stop!

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



  • @intrapro:

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

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

    Я хотел так сделать, но поскольку события от терминала сыпятся очень часто, то у меня рабочий журнал будет весь забит… вот бы вы реализовали запись лога в журнал, созданный администратором! А то журнал создать можно, а запись вести в него - нет:(

    Но другой момент в том, что после тупого пересохранения сценария все начинает работать! У меня буквально на днях с новым сценарием был случай, когда в качестве param приходил не верный аргумент (не выполнил требования формата json - не закрыл кавычки) и когда он приходил, то сценарий делал start и зависал. Помогало только его новое сохранение. Возможно тут происходит то же, но надо отловить этот не верный param! Сходу не смог отловить SyntaxError от JSON.parse...не подскажите как сделать?

    По описанному багу отладчика - ни разу не встречал. Хотя сценариев написал довольно много (штук 30 уже точно есть)!

    Update: сделал функцию разбора JSON. В случае ошибок в синтаксисе проблема должна выводится в лог:

      ParseJSON(param) {
          try {
            return JSON.parse(param);
          }
          catch (e) {
            let text = e instanceof SyntaxError;
            this.log("SyntaxError - " +text+ "; param - " +param);
          }
      },
    
    


  • В общем по новым наблюдениям: как только перезагружаю iH (из вебки), то после обновления страниц (открываю отладчик плагина и открываю отладчик сценария) в плагине сообщения от железки идут и есть сообщение о запуске сценария, но в отладчике сценария - пусто!

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

    Повторил несколько раз - картина одинаковая. Остальные сценарии вроде бы работают.

    У вас есть возможность сделать эксперимент с моим сценарием? По идее достаточно сохранить сценарий, установить плагин voiceterminal (слушающий порт 11052) и в браузере вбить http://адрес_сервера_iH:11052/api/method/name.method?music_volume=110&volume=120&username=voiceterminal&uptime=500&terminal=VT2



  • @Alex_Jet:

    В общем по новым наблюдениям: как только перезагружаю iH (из вебки), то после обновления страниц (открываю отладчик плагина и открываю отладчик сценария) в плагине сообщения от железки идут и есть сообщение о запуске сценария, но в отладчике сценария - пусто!

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

    Повторил несколько раз - картина одинаковая. Остальные сценарии вроде бы работают.

    У вас есть возможность сделать эксперимент с моим сценарием? По идее достаточно сохранить сценарий, установить плагин voiceterminal (слушающий порт 11052) и в браузере вбить http://адрес_сервера_iH:11052/api/method/name.method?music_volume=110&volume=120&username=voiceterminal&uptime=500&terminal=VT2

    Поэкспериментируем на следующей неделе 🙂

    А в строке сценария в таблице не выводится ошибка (столбец Ошибка)?



  • @intrapro:

    @Alex_Jet:

    В общем по новым наблюдениям: как только перезагружаю iH (из вебки), то после обновления страниц (открываю отладчик плагина и открываю отладчик сценария) в плагине сообщения от железки идут и есть сообщение о запуске сценария, но в отладчике сценария - пусто!

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

    Повторил несколько раз - картина одинаковая. Остальные сценарии вроде бы работают.

    У вас есть возможность сделать эксперимент с моим сценарием? По идее достаточно сохранить сценарий, установить плагин voiceterminal (слушающий порт 11052) и в браузере вбить http://адрес_сервера_iH:11052/api/method/name.method?music_volume=110&volume=120&username=voiceterminal&uptime=500&terminal=VT2

    Поэкспериментируем на следующей неделе 🙂

    А в строке сценария в таблице не выводится ошибка (столбец Ошибка)?

    Не обращал внимание. Сейчас глянул - сценарий по установке статуса работает исправно и у него нет ошибок. А у сценария управляющего терминалом есть ошибка и сценарий не работает. Заработал только после его очередного пересохранения. С чем может быть связана данная ошибка?
    Сценарии_Ошибка_Voiceterminal.png



  • @Alex_Jet:

    Не обращал внимание. Сейчас глянул - сценарий по установке статуса работает исправно и у него нет ошибок. А у сценария управляющего терминалом есть ошибка и сценарий не работает. Заработал только после его очередного пересохранения. С чем может быть связана данная ошибка?

    Получается, что при первоначальной загрузке сценария (на старте IH) еще не успевает создаться устройство - индикатор плагина.

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



  • Подскажите какой командой можно проверить все устройства в подсистеме на предмет ison of isoff.



  • Подскажите, а нет ли возможности вызывать сценарий из сценария? Что-то типа #include или может execute. Было бы местами удобно



  • @homa, пока такой возможности нет 😞



  • Коллеги! И все же как найти проблему - почему после перезагрузки системы у меня сценарии, которые вызываются плагином VoiceTerminal, не стартуют пока я их не "пересохраню"? При этом, простой сценарий-переключатель света (запускается плагином MegaD) работает всегда. Ошибок по сценариям нет. Достаточно в режиме редактирования в любом месте ввести, например, пробел чтобы появилась кнопка сохранить и после нажатия кнопки сценарий начинает стартовать!



  • Подскажите как сделать сценарий: включение/выключение нескольких лампочек, устройство MegeD, включение по выключателю одним кликом и выключение одним нажатием по выключателю.



  • @amgstone, сценарий не нужен если будет использоваться одна и та же MegaD (на ней входы с выключателями и выходы с лампами). Нужно прописать нужные "Расширения" в плагине. Писал об этом, например тут



  • Добрый день! Есть такой кусок кода:

          if (SENSOR1.isOn){ //Квартира на охране. отключаем автоматический режим
              ssa=speed.value - 1; //Вводим переменную для плавного понижения скорости
              tempv.setParam("setpoint",4);
              if (ssa<= 0) {
                ssa=0;
              }
             this.assign(speed, 'aval', ssa); //Выключаем вытяжку
             speed.setParam("setpoint",ssa); //Отображаем отключение
            return false;  //Завершение сценария
    

    Проблема в том, что он выполняется несмотря на состояние SENSOR1. И при On и при Off сценарий будет выполнен



  • Не могли бы вы сделать инструкцию по дополнительным параметрам устройств?
    Пытаюсь сделать числовой доп.параметр:

    const meterDay = Device("METER6", "Стоимость кВт", [
      {"name":"rkvt", "note":"Стоимость за кВт", "type":"Number", "val":4.47}
      ]); //Счетчик дневных показаний
    

    Параметр добавляется, но его нельзя редактировать. Кроме того, не получается обратиться к нему как к свойству из сценария. Например, meterD.rkvt недоступен.
    Подскажите как правильно объявить параметр, чтобы через боковое меню был доступен ввод значения, либо кнопки "включить/выключить", как использовать значение параметра в сценарии?



  • @homa
    Добрый день, добавьте скобки после isOn, isOff:

    if ( SENSOR1.isOn ) {   // должно вызывать ошибку, так как это не свойство, а функция 
    if ( SENSOR1.isOn() ) {   // Это правильный вариант
    

    Но действительно, без скобок ошибки нет, срабатывает в любом случае 😞



  • Каждый раз при создании мультисценария наступаю на одни и те же грабли.
    Нужно объявить тип устройства в первых строчках.
    И нигде в документации нет информации какое устройство к какому типу относится, и как этот тип правильно пишется.
    Ну сделайте пожалйста.

    А то при создании датчик открытия двери обзывается SGERKON, и в простом сценарии он тоже SGERKON, а в мультисценарии он оказывается должен быть SensorD.
    Ну вот как я это должен был узнать, кроме прямого перебора вариантов? Как?



  • @homa, вы сделали все верно, тип только должен быть с маленькой буквы, тогда редактирование будет работать:

    {"name":"rkvt", "note":"Стоимость за кВт", "type":"number", "val":4.47}
    

    По типам - пока реализовано только три типа для ввода:

    • "type": "number" (число, в том числе вещественное),
    • "type":"cb" (checkbox)
    • "type":"time" (для ввода временных интервалов).

    Любой другой тип, включая string, выводится как readOnly (без возможности редактирования)

    Из сценария доп. свойства доступны не напрямую, а через функции getParam, setParam:

    let x = meterD.getParam("rkvt");
    ......
    ..... 
    meterD.setParam("rkvt", x*0.9 );
    


  • @Erik
    Документация - это действительно наше слабое место. Но мы работаем над этим 🙂

    В данном случае все просто - объявляется не тип, а класс, и их всего 5:
    "SensorD" - Датчик дискретный
    "SensorA" - Датчик аналоговый
    "ActorD" - Актуатор дискретный
    "ActorA" - Актуатор аналоговый
    "Meter" - Счетчик

    Класс выводится в таблице устройств в столбце "Класс", а этот список можно найти в разделе Сценарии рубрика Классы устройств


Log in to reply