Сценарии - новая версия API
-
Кроме команд на выходы меги
в расширениях на одинарный, двойной и длинный клик
сделайте запуск сценариев.Сценарии простые. Для каждой кнопки создайте аналоговый актуатор с 4 значениями. 0, 1, 2, 3.
А сценариями присваивайте этому актуатору значения на 1 сек.
сценарий одинарного клика - 1, двойного - 2, длинного - 3.
Сразу запускайте таймер на 1 сек, и после истечения возвращайте значение 0.Получите надежный признак действий с кнопкой, который можно отслеживать слушателем в любом скрипте, и привязывать любые действия к нужному изменению.
Мне манипуляции с режимом "авто" кажутся не надежными.
У меня у большинства устройств галочка на "есть автоматический режим" не установлена, но вся автоматика работает. С этой галочкой есть только вентиляторы. Если я включаю/выключаю их руками, автоматический режим отключается (на иконке видно таймер вместо буквы А), что не мешает тут же включать этот вентилятор из скрипта.
-
Добрый день. Вопрос, в папке проекта projects\scenes, если я правильно понял, находятся сценарии. Чем отличаются папки req и папка script ? И там и там сценарии на js, названия сценариев одинаковые
-
@fanagor Добрый день.
Исходные сценарии находятся в папке scenes/script. Это код, который виден в редакторе.
В папке scenes/req сценарии формируются системой в виде, готовом для запуска - обернуты в module.exports, подставлены входные параметры. Если нужно перенести сценарии, достаточно папки script для обычных/мультисценариев. Папка diagram содержит блок-схемы. Папка req и все содержимое будет создано автоматически.
-
@intrapro, спасибо. Еще вопрос, как можно, вернее какой командой поменять активный проект ?
-
@fanagor Имя папки с активным проектом сервер считывает при старте из файла /opt/intrahouse-c/config.json.
Поэтому есть два варианта
-
Интерактивно через PM. Нажать кнопку Настройка (инструменты), выбрать пункт Проекты. Будут показаны проекты из папки projects.
Щелкнуть по строчке с проектом, нажать кнопку вызова меню команд (полосатая кнопочка).
В меню выбрать Сделать проект активным.
Эта операция прописывает выбранный проект в config.json как активный и перезагружает сервер.
-
Можно вручную изменить файл /opt/intrahouse-c/config.json, прописать в атрибут "project" имя проекта ( просто имя папки в projects, без пути):
{"port":8088,"project":"your_new_project","name_service":"intrahouse-c","lang":"ru"}
После редактирования файла config.json нужно перезагрузить IH
Если папки нет, она будет создана и сервер запустится с пустым проектом
-
-
@intrapro, супер, про вариант 2 как раз то, что спрашивал. Спасибо !
-
Добрый день. Пара вопросов.
- Команда this.execOS('export IAM_TOKEN=
yc iam create-token
') из сценария возвращает ошибку:
18.05 15:39:07.725 Trigger LAMP_23
18.05 15:39:07.725 Started
18.05 15:39:07.725 execOS: yc iam create-token
18.05 15:39:07.730 Stopped
18.05 15:39:07.744 execOS error: Error: Command failed: yc iam create-token
/bin/sh: 1: yc: not found
18.05 15:39:07.744 stdout:
18.05 15:39:07.744 stderr: /bin/sh: 1: yc: not foundПри этом из терминала все хорошо выполняется.
- Как передать значения из переменой в глобальную переменную используемую в проекте ?
- Команда this.execOS('export IAM_TOKEN=
-
Пользователь @fanagor написал в Сценарии - новая версия API:
Добрый день. Пара вопросов.
- Команда this.execOS('export IAM_TOKEN=
yc iam create-token
') из сценария возвращает ошибку ...
При этом из терминала все хорошо выполняется.
Добрый день. Здесь команда оболочки, напрямую не запустится.
Попробуйте поместить строку в файл c расширением .sh и вызвать этот файл на выполнение:
this.execOS ('/home/pi/myscript.sh')
Для файла скрипта после сохранения нужно установить права на выполнение:chmod 777 /home/pi/myscript.sh
- Как передать значения из переменой в глобальную переменную используемую в проекте ?
Если переменную сценария в глобальную переменную проекта, то присвоить через global.set. Если переменной нет - она будет создана
global.set('myglobalvar', xx);
В другом сценарии можно считать:
let myxx = global.get('myglobalvar');
Или Вы хотите результат выполнения команды execOS присвоить?
- Команда this.execOS('export IAM_TOKEN=
-
@intrapro да, результат команды execOS
-
Пользователь @intrapro написал в Сценарии - новая версия API:
Добрый день. Здесь команда оболочки, напрямую не запустится.
Попробуйте поместить строку в файл c расширением .sh и вызвать этот файл на выполнение:
this.execOS ('/home/pi/myscript.shтот же самый результат.
18.05 21:35:09.144 Trigger LAMP_23
18.05 21:35:09.144 Started
18.05 21:35:09.145 execOS: /myscript8.sh
18.05 21:35:09.272 Stopped
18.05 21:35:09.305 execOS error: Error: Command failed: /myscript8.sh
/myscript8.sh: 1: /myscript8.sh: yc: not foundне хочет.
-
Пользователь @fanagor написал в Сценарии - новая версия API:
/myscript8.sh: 1: /myscript8.sh: yc: not found
не хочет.
Похоже, yc действительно не находит, возможно, пути нет PATH
Попробуйте в терминале выполнить команду, чтобы увидеть, откуда запускается ycwhich 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 Speed0 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 Speed0 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)при этом если в команду прописать не переменную а сам токен, все проходит. Из терминала и так и так все гуд.
Есть две версии:
- Токен содержит лишние символы в начале и в конце (перевод строки, пробелы), это все убрать перед сохранением
saveToken(stdout) { let myToken = stdout.replace(/^\s+/, '').replace(/\s+$/,''); global.set('myToken', myToken); this.log('myToken='+ global.get('myToken')+'!'); // Посмотреть, что здесь выводится }
- Менее вероятно - неверно берется из 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#
Можно ли под другим пользователем "по умолчанию" ?Да, конечно, Вы можете создать своего пользователя и делать установку под ним. Но нужно дать ему достаточно прав для доступа:
- К папкам внутри /opt и /var/lib
- К периферии и портам, с которыми работает система
- Этот пользователь должен иметь права на sudo.
Запуск из-под sudo используется при установке пакетов через npm, так как IH ставит пакеты при установке плагинов и их обновлении прозрачно для пользователя. Используемая версия npm требует такой доступ. Возможно, в 5 версии использование sudo получится избежать.
-
Это сообщение удалено!
-
Добрый день. Как с помощью блок схем задать гистерезис включения отключения насоса ГВС? Прошу прощения если это уже обсуждалось.
-
Добрый день, коллеги. У меня сценарий получает данные от плагина через param и obj. При приходе запроса track=hello&artist=yellow&album=hits устройствам (актуатор аналоговый) присваиваются значения hello, yellow и hits соответственно. А при приходе запроса track=hello&artist=&album= устройствам присваивается hello, 0 (ноль) и 0 (ноль) соответственно. Как в сценарии определить отсутствие параметра и присвоить устройству вместо ноля символ пробела или пустую строку?