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



  • @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" - Счетчик

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



  • А можно узнать такую вещь - когда мой голосовой терминал распознает фразу, то он кидает ее на сервер, плагин принимая команду терминала запускает сценарий:

    06.11 00:19:38.225 voiceterminal1: 192.168.11.51 => localhost:11051 HTTP GET /command.php?terminal=VT1&rms_max=2201&rms_min=987&username=aleksey&rms_avg=1293&qry=Включи+свет
    06.11 00:19:38.226 voiceterminal1: 192.168.11.51 <= localhost:11051 
    06.11 00:19:38.226 voiceterminal1: { type: 'startscene',
      id: 'VoiceTerminal_Temp',
      arg: '{"terminal":"VT1","rms_max":"2201","rms_min":"987","username":"aleksey","rms_avg":"1293","qry":"Включи свет"}' }
    06.11 00:19:38.228 IH: plugin command { unit: 'voiceterminal1',
      command: 'ask:Уточните название помещения!',
      type: 'command' }
    06.11 00:19:38.230 IH: startscene VoiceTerminal_Temp
    

    Тут видно, что сценарий запустился, отработал и плагину пошла команда 'ask:Уточните название помещения!'. Но почему после этого IH вдруг снова запускает сценарий (06.11 00:19:38.230 IH: startscene VoiceTerminal_Temp)?

    В итоге в отладчике сценария вижу вот это и моя задумка не работает...

    06.11 00:19:38.227 Started
    06.11 00:19:38.228 plugincCommand { unit: 'voiceterminal1',
      command: 'ask:Уточните название помещения!' }
    06.11 00:19:38.229 exit
    06.11 00:19:38.229 Stopped
    06.11 00:19:38.230 exit
    

    По идее последних Stopped и exit быть не должно. Такое ощущение, что IH принудительно запускает сценарий без входных данных и мои все переменные сценария обнуляются.



  • @Alex_Jet, Думаю, сценарий повторно не запускается, просто логирование происходит чуть позже запуска (на 3 мсек):

    06.11 00:19:38.226 voiceterminal1: { type: 'startscene',...   // Команда на запуск сценария
    06.11 00:19:38.227 Started // Запустили 
    06.11 00:19:38.228 IH: plugin command { unit: 'voiceterminal1',command: 'ask:Уточните...  // Работает сценарий
    06.11 00:19:38.230 IH: startscene VoiceTerminal_Temp // Фиксируем, что был запуск сценария
    

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

    Количество запусков можно посмотреть в Рабочих сценариях. После редактирования сценария этот счетчик сбрасывается

    Что касается Stopped и exit:
    Stopped в паре со Started один. Да, exit лишний, но там наверно есть прямой this.exit(), поэтому опять же особенность логирования


Log in to reply