В связи с выходом крупного обновления 5.9.х, приглашаем вас принять участие в вебинаре 09.06.2022 в 15:00. Участвовать

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



  • Пользователь @fanagor написал в Сценарии - новая версия API:

    /myscript8.sh: 1: /myscript8.sh: yc: not found

    не хочет.

    Похоже, yc действительно не находит, возможно, пути нет PATH
    Попробуйте в терминале выполнить команду, чтобы увидеть, откуда запускается yc

    which  yc
    

    И посмотрите текущее значение PATH, он должен включать путь до yc

    echo $PATH
    


  • Пользователь @fanagor написал в Сценарии - новая версия API:

    @intrapro да, результат команды execOS

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

    script({
        start() {
           this.execOS(`yc iam create-token`, 'saveToken');
        },
    
        saveToken(stdout) {
          this.log('stdout='+stdout);  
          global.set('myToken', stdout);
        }
    });
    


  • Пользователь @intrapro написал в Сценарии - новая версия API:

    this.execOS(yc iam create-token, 'saveToken');

    не понял в чем было дело, путь в $PATH был, но получилось сделать только прописав полный путь this.execOS('/root/yandex-cloud/bin/yc iam create-token','saveToken');

    здесь, ок, спасибо.

    Другая проблема при выполнении команды OS
    this.execOS(curl -X POST -H "Authorization: Bearer ${global.get('myToken')}" --data-urlencode "text=Здравствуй мир" -d "lang=ru-RU&folderId=b1g39r55fbahkvak21ha" "https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize" > aaa92.ogg)

    или curl -X POST -H "Authorization: Bearer ${stdout}" --data-urlencode "text=Здравствуй мир" -d "lang=ru-RU&folderId=b1g39r55fbahkvak21ha" "https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize" > aaa9.ogg
    если из того же сценария где и считывается переменная в сценарий

    лог пишет:

    20.05 21:24:17.379 Trigger LAMP_24
    20.05 21:24:17.380 Started
    20.05 21:24:17.386 execOS: curl -X POST -H "Authorization: Bearer Cgg..........
    " --data-urlencode "text=Здравствуй мир" -d "lang=ru-RU&folderId=b1g39r55fbahkvak21ha" "https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize" > aaa92.ogg
    20.05 21:24:17.396 Stopped
    20.05 21:24:17.481 execOS error: Error: Command failed: curl -X POST -H "Authorization: Bearer Cgg... --data-urlencode "text=Здравствуй мир" -d "lang=ru-RU&folderId=b1g39r55fbahkvak21ha" "https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize" > aaa92.ogg
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed

    0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
    100 127 0 0 100 127 0 1788 --:--:-- --:--:-- --:--:-- 1788
    curl: (92) HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)

    20.05 21:24:17.481 stdout:
    20.05 21:24:17.481 stderr: % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed

    0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
    100 127 0 0 100 127 0 1788 --:--:-- --:--:-- --:--:-- 1788
    curl: (92) HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)

    при этом если в команду прописать не переменную а сам токен, все проходит. Из терминала и так и так все гуд.



  • Пользователь @fanagor написал в Сценарии - новая версия API:

    Другая проблема при выполнении команды OS
    this.execOS(curl -X POST -H "Authorization: Bearer ${global.get('myToken')}" --data-urlencode "text=Здравствуй мир" -d "lang=ru-RU&folderId=b1g39r55fbahkvak21ha" "https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize" > aaa92.ogg)
    лог пишет: .....
    curl: (92) HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)

    при этом если в команду прописать не переменную а сам токен, все проходит. Из терминала и так и так все гуд.

    Есть две версии:

    1. Токен содержит лишние символы в начале и в конце (перевод строки, пробелы), это все убрать перед сохранением
    saveToken(stdout) {
         let myToken = stdout.replace(/^\s+/, '').replace(/\s+$/,'');
         global.set('myToken', myToken);
         this.log('myToken='+ global.get('myToken')+'!'); // Посмотреть, что здесь выводится  
    }
    
    1. Менее вероятно - неверно берется из global или подстановка внутри строки неверно отрабатывает
    let token = global.get('myToken');
    this.log('token='+ token+'!');  // Посмотреть, что здесь 
    this.execOS(`curl -X POST -H "Authorization: Bearer ${token}" --data-urlencode...   `);
    


  • Пользователь @intrapro написал в Сценарии - новая версия API:

    saveToken(stdout) {
    let myToken = stdout.replace(/^\s+/, '').replace(/\s+$/,'');
    global.set('myToken', myToken);
    this.log('myToken='+ global.get('myToken')+'!'); // Посмотреть, что здесь выводится
    }

    Отлично, помогло, действительно заползали лишние символы.
    Спасибо !!



  • Не в эту ветку, но спрошу, по умолчанию IH действует от имени пользователя ROOT ?
    root@ih-server-big:/opt/intrahouse-c#
    Можно ли под другим пользователем "по умолчанию" ?



  • Пользователь @fanagor написал в Сценарии - новая версия API:

    Не в эту ветку, но спрошу, по умолчанию IH действует от имени пользователя ROOT ?
    root@ih-server-big:/opt/intrahouse-c#
    Можно ли под другим пользователем "по умолчанию" ?

    Да, конечно, Вы можете создать своего пользователя и делать установку под ним. Но нужно дать ему достаточно прав для доступа:

    1. К папкам внутри /opt и /var/lib
    2. К периферии и портам, с которыми работает система
    3. Этот пользователь должен иметь права на sudo.
      Запуск из-под sudo используется при установке пакетов через npm, так как IH ставит пакеты при установке плагинов и их обновлении прозрачно для пользователя. Используемая версия npm требует такой доступ. Возможно, в 5 версии использование sudo получится избежать.


  • This post is deleted!


  • Добрый день. Как с помощью блок схем задать гистерезис включения отключения насоса ГВС? Прошу прощения если это уже обсуждалось.



  • Добрый день, коллеги. У меня сценарий получает данные от плагина через param и obj. При приходе запроса track=hello&artist=yellow&album=hits устройствам (актуатор аналоговый) присваиваются значения hello, yellow и hits соответственно. А при приходе запроса track=hello&artist=&album= устройствам присваивается hello, 0 (ноль) и 0 (ноль) соответственно. Как в сценарии определить отсутствие параметра и присвоить устройству вместо ноля символ пробела или пустую строку?



  • @int144, никак! Я пробовал по разному, но пробел, отсутствие символа и т.д. актуатору аналоговому присвоить нельзя. В своем "событийном" виджете при отсутствии событий просто отображаю "Нет событий".



  • @Alex_Jet, спасибо, понял. Жаль, конечно. А как выяснить, что пустой параметр - if(obj.artist === undefined)?



  • @int144, да, именно так.



  • @Alex_Jet, я так сделал, а в отладчике
    01.06 19:57:45.696 assign PIHALL_TRACK5_5.value= Радио 7
    01.06 19:57:45.696 assign PIHALL_ALBUM4_5.value=
    01.06 19:57:45.696 assign PIHALL_ARTIST3_5.value=
    undefined почему-то не срабатывает



  • @Alex_Jet, сработало только на if(obj.artist === "")



  • Добрый день! Поскажите, в чем может быть проблема:
    Команда включает порт 5 (pin=5) на 5 сек (click=5) на ESP 8266/

    http://192.168.0.41/gpio?st=1&pin=5&click=5
    

    Если посылать эту команду через Chrome, то все отрабытывает пормально (порт включается и выключается через 5 сек), но если вызывать из сценария

    require ("http").get(`http://192.168.0.41/gpio?st=1&pin=5&click=5 `);
    

    то порт остается включенным. Такое впечатление, что click=5 не отсылается. Как посмотреть в отлатчике, что там отсылается? У меня не видно отправляемую команду.



  • @gis Добрый день.
    Попробуйте убрать последний пробел

    require ("http").get(`http://192.168.0.41/gpio?st=1&pin=5&click=5 `); // После 5 есть пробел
    require ("http").get(`http://192.168.0.41/gpio?st=1&pin=5&click=5`); 
    


  • @intrapro спасибо, но я уже пробовал и сним и без него - разницы нет. Поставил пробел, думал последний символ не передается.



  • Подскажите пожалуйста как установить значение даты замены фильтра в рекуператоре. Нужно чтобы не забивать когда был поменян фильтр и когда следующий раз менять чтобы IH сам сообщал что нужно заменить фильтр. Актуально для фильтров рекуператора, фильтра воды.....



  • Коллеги, вероятно где-то туплю. Переписал работающий сценарий, вынеся гистерезис в дополнительные параметры устройства чтобы можно было из вебки изменять все уставки. Однако система жалуется (co2_guest Device params: Unexpected token / in JSON at position 4), что в сценарии есть ошибка. Не могу понять в чем дело!

    const valve1F   = Device("VALVE_AIR3");     //Клапан первого этажа
    const hum_guest = Device("SHUMIDITY1_01", [ //Датчик влажности гостевой
      {"name":"hst", "note":"Гистерезис, %", "type":"number", "val":5}
      ]);
    const co2_guest = Device("SENSORA1_01", [   //Датчик CO2 гостевой
      {"name":"hst", "note":"Гистерезис, ppm", "type":"number", "val":100}
      ]);
    
    script({
        check() {
          return(   (hum_guest.value > hum_guest.setpoint + hum_guest.getParam("hst") || co2_guest.value > co2_guest.setpoint + co2_guest.getParam("hst"))&&(valve1F.isOff()) ||
                    (hum_guest.value < hum_guest.setpoint - hum_guest.getParam("hst") && co2_guest.value < co2_guest.setpoint - co2_guest.getParam("hst"))&&(valve1F.isOn()) );
        },
        
        start() {
          if(valve1F.isOff()) valve1F.on();
          else valve1F.off();
        }
    });
    

Log in to reply