Сценарии - новая версия API
-
Подскажите как сделать сценарий: включение/выключение нескольких лампочек, устройство 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(), поэтому опять же особенность логирования
-
@intrapro а как одному устройству добавить несколько свойств? на разделить "запятая" ругается
-
И следом вопрос корректно ли объявлять одно и тоже свойство для одного и того же устройства в разных сценариях, или есть какие-то другие варианты обращения к ранее объявленным свойствам
-
@homa, вот так все работает:
const dev1 = Device("_UNIT_voiceterminal1", [ {"name":"uptime", "note":"Времы работы", "type":"string", "val":""}, {"name":"status", "note":"Состояние", "type":"string", "val":""}, {"name":"updater", "note":"Обновления", "type":"string", "val":""}, {"name":"set_volume", "note":"Громкость терминала", "type":"number", "val":50}, {"name":"set_music_volume", "note":"Громкость плеера", "type":"number", "val":50}, {"name":"last_update", "note":"Update", "type":"string", "val":""} ]);
-
@homa, в принципе корректно. У устройства будут свойства с одинаковым названием, но отнесенные к разным сценариям:
-
@Alex_Jet идея в том, чтобы изменять из разных сценариев одно свойство... выходит не выходит)
-
@intrapro, this.exit() действительно есть в функции сценария, но перед этим переменной сценария flag_com присваивается 1, что указывает на то что не надо выполнять основное ветвление if, а надо выполнить else. Типа вот такого:
if(!this.flag_com) { //Парсим входные данные и в соответствии с ними выполняем команды.. } else { //Повторно заходим в функцию чтобы выполнить действие с уточненным названием помещения this.Lamp_Control(); }
Если функция отработала успешно, то присваиваем flag_com=0, чтобы сценарий работал по основному ветвлению if. В общем, попробую добавить логирование в сценарий...просто не хотелось журнал забивать не нужной информацией:(
-
@homa, тогда нужно использовать глобальные переменные. Функционал есть, API описан, но я его еще не пробовал. Приведите для примера задачу) может и мне понадобится
-
@Alex_Jet У меня управление одним устройством с разных сценариев) я думал о глобальных переменных, чтобы там хранить значение свойства, но при выполнении сценария его придется каждый раз перепроверять. Думал может есть простой способ обращения)
-
@homa, ну а какая разница? Это же не искать какое-то определенное значение в раздутой БД! Все довольно просто и быстро).
А вообще интересная задача - управление одним устройством разными сценариями...я не могу придумать никакого практического применения(((. Просвятите что вы хотите сделать!
У меня единственный навороченный сценарий/немного поверх другого - это отключение авто-режима актюатора если вдруг кто-то открыл окно для проветривания, например. Правда после открытия окна проверяется - включен ли актюатор (то есть холодно и помещение уже греется), если да то просто выходим, если нет, то отключаем у него авто режим))) При этом если в комнате стало холоднее уставки "эконом", то возвращаем актюатору авто-режим (чтобы отопление принудительно включилось).
-
@Alex_Jet у меня скорее просто неоптимальная реализация для управления мотором)
у меня есть три актуатора = 3 положения кнопки вытяжки, три сенсора = три положения физического переключателя. один сценарий синхронизирует состояния физики и логики, второй делает правильное переключение, чтобы не включить две "кнопки" сразу, а третий регулирует скорость в зависимости от разницы температур и электропотребления