Сценарии в intraHouse Cherry
-
Как я понимаю, создание скриптов методом конструктора больше недоступно. Теперь все скрипты пишутся вручную.
На данном этапе это так.
Чуть позже мы подготовим список шаблонов разных скриптов. Готовых к употреблению.
И про метод конструктора мы не забыли
-
Возник еще вопрос по скриптам. С взаимодействием устройств все понятно, но как быть в случае, когда нужно вызвать скрипт кнопкой на мнемосхеме? Я написал скрипт в котором нет сущностей сенсоров, есть только актуаторы (выключение света во всей квартире), но на экране привязки к кнопке скрипта ни один скрипт не отображается. Также вопрос в догонку к этой теме - мне пришлось каждый светильник добавлять как устройство в скрипт. Есть ли возможность работать с группами устройств или вызывать устройство напрямую, а не как переменную?
Заранее спасибо!
-
Все должно работать именно так ка Вы описали.
И групповые команды и привязка сценариев к кнопкам.
Просто еще не успели. Это сделаем в ближайшее время.
-
Добрый день. Пробую сделать (простую штуку) что батарея включалась от датчика темп. Не получается выбрать "сенсор" - выпадающий список пустой, актуатор - батарея есть. Что я не так делаю?
-
Добрый день. Покажите ваш скрипт.
В таблице устройств должно быть устройство типа, заявленного в Device (SensorA или SensorD)
-
Скрипта нет. Я пробую как в бери выбрать датчик и актуатор. Актуатор выбирается а в поле датчика пусто. хотя датчики в системе есть.
-
/**
-
@name Отопл
-
@desc Лиза
*/
const STEMP1 = Device("SensorA","Датчик темп Лиза");
const RADIATOR1 = Device("ActorD","Батарея Лиза");
const script = {
check() {
return (STEMP1.aval < 25 && !RADIATOR1.dval) || (STEMP1.aval > 30 && RADIATOR1.dval);
},
start() {
if (STEMP1.aval < 25 && !RADIATOR1.dval) { this.do(actor, 'on'); }
{
else if (STEMP1.aval > 30 && RADIATOR1.dval) { this.do(RADIATOR1, 'off'); }
}
-
-
Совсем запутался в скобках. Где можно скачать учебник для чайников по скриптам? Я очень далек от этого. в Берри было проще.
-
Совсем запутался в скобках. Где можно скачать учебник для чайников по скриптам? Я очень далек от этого. в Берри было проще.
Сценарии пишутся на Javascript, в сети полно руководств, думаю не обязательно читать целый учебник, достаточно освоить введение
В данном случае одна скобка { лишняя и нет последней закрывающей }. И в команде do вместо actor д б RADIATOR1.
Все остальное верно
const STEMP1 = Device("SensorA","Датчик темп Лиза"); const RADIATOR1 = Device("ActorD","Батарея Лиза"); const script = { check() { return (STEMP1.aval < 25 && !RADIATOR1.dval) || (STEMP1.aval > 30 && RADIATOR1.dval); }, start() { if (STEMP1.aval < 25 && !RADIATOR1.dval) { this.do(actor, 'on'); } // Здесь д б RADIATOR1 // { <= Вот эта скобка лишняя. else if (STEMP1.aval > 30 && RADIATOR1.dval) { this.do(RADIATOR1, 'off'); } } } // Здесь нужна последняя закрывающая скобка для script
Javascript в отличие от Питона не требователен к отступам, переносам строк и т.д.
Но существует правило, что после каждой открывающей скобкой делается отступ (табуляция, два пробела, что угодно - но всегда одинаково)
Где ставить открывающую скобку - ведутся споры и даже религиозные войны:) Это относится ко многим языкам, не только Javascript.
Есть два основных варианта:
1. Открывающая и закрывающая ставится на одной линии в отдельной строке
if (STEMP1.aval < 25 && !RADIATOR1.dval) { this.do(actor, 'on'); }
2. Открывающая ставится в конце строки без переноса, зато закрывающая - в отдельной строке
if (STEMP1.aval < 25 && !RADIATOR1.dval) { this.do(actor, 'on'); }
Из-за некоторых особенностей Javascript-a обычно используется второй способ.
Но в сценариях можно использовать любой, если он кажется легче. Главное - всегда делать это одинаково, тогда не запутаешься
И две хорошие новости:
1. Если после if одна команда - {} можно не ставить совсем. Но лучше тогда все писать в одну строку
if (STEMP1.aval < 25 && !RADIATOR1.dval) this.do(actor, 'on');
2. Если условия одновременно не выполняются, else можно не писать.
То есть скрипт можно написать так:
const STEMP1 = Device("SensorA","Датчик темп Лиза"); const RADIATOR1 = Device("ActorD","Батарея Лиза"); const script = { check() { return (STEMP1.aval < 25 && !RADIATOR1.dval) || (STEMP1.aval > 30 && RADIATOR1.dval); }, start() { if (STEMP1.aval < 25 && !RADIATOR1.dval) this.do(RADIATOR1, 'on'); if (STEMP1.aval > 30 && RADIATOR1.dval) this.do(RADIATOR1, 'off'); } }
И после редактирования сценария нужно его сохранить и возможно обновить страницу до ввода параметров.
в Берри было проще.
Конечно, будет и интерактивный способ настройки простых сценариев. Хочется сделать гибко, но не громоздко.
Примеры шаблонных сценариев тоже за нами. Выложим в ближайшие дни.
-
Выложили шаблоны сценариев https://intrahouse.ru/scenes-examples_ru/
Их можно устанавливать двумя способами.
1. Загрузить zip файл со сценарием https://intrahouse.ru/work-scenes_ru/
2. Copy/Paste. Просто скопировать текст скрипта, добавить новый сценарий и вставить туда скопированный текст.
Также как в Berry, остается только привязать устройства к сценарию. При этом, при желании, можно корректировать сценарий.
Вариантов разных сценариев может быть много. Мы можем написать и опубликовать любые сценарии. Но желательно чтобы эти сценарии были востребованы и другими пользователями. Спрашивайте, обсуждайте функционал сценария, а мы реализуем.
Это не исключает самостоятельного написания сценариев. Если кто-то поделится своим скриптом, очень хорошо.
-
Спасибо большое!
Думаю, многим это будет интересно
Чтобы еще больше облегчить жизнь тем, кто захочет загрузить Ваш сценарий, сохраняйте его в zip как файл с расширением .js, а не .txt. А еще проще - сохраняйте прямо в Project Manager в списке сценариев командой "Выгрузить в файл".
Тогда командой "Загрузить из файла" сценарий сразу загрузится в проект.
-
А где задается заданная температура отопления?
-
Спасибо большое!
Думаю, многим это будет интересно
Чтобы еще больше облегчить жизнь тем, кто захочет загрузить Ваш сценарий, сохраняйте его в zip как файл с расширением .js, а не .txt. А еще проще - сохраняйте прямо в Project Manager в списке сценариев командой "Выгрузить в файл".
Intrahouse_scenes.png
Тогда командой "Загрузить из файла" сценарий сразу загрузится в проект.
Перевыгрузил. Предыдущий пост тогда лучше удалить, чтобы никого не смущать.
Управление светом
-
Управление вытяжкой\замком
-
А где задается заданная температура отопления?
В пользовательском интерфейсе при длинном нажатии на датчик температуры вызывается окно свойств датчика.
Там слайдером можно менять уставку температуры.
-
А можно для необразованных разжевать - как шаблонный сценарий привязать к устройствам? В Berry было все тривиально…тут затрудняюсь.
-
А можно для необразованных разжевать - как шаблонный сценарий привязать к устройствам? В Berry было все тривиально…тут затрудняюсь.
Вся настройка сценариев - в разделе Сценарии. Если сам сценарий уже есть (скачан или написан), то заполняются строчки в табличке "Запуск для устройств". Конечно, сделать это можно только для мультисценариев (шаблонных в терминологии Berry)
Просто выбираются устройства из списка устройств подходящего классаВозможно, затруднение связано с использованием списочного компонента. После того, как устройство выбрано, чтобы его поменять, нужно стирать строку, и будет появляться отфильтрованный список.
Как результат все рабочие сценарии, включая только что добавленный, можно увидеть в списке Рабочие сценарии.
Там есть информация об активных сценариях, времени последнего запуска и т д
Если сценарий имеет триггеры, то он запускается по событиям этих триггеров (Сценарии по событию в Berry)Если триггеров нет - это интерактивные сценарии, их можно вызывать с кнопки, по расписанию и тд
Наличие триггеров у сценария определяется неявно по функции check()
check() { return ((lamp.auto == 1) && ((lamp.dval == 0) && (motion.dval == 1) || (lamp.dval > 0))); },
Все устройства, включенные в check, являются триггерами - в данном случае lamp и motion
Если check возвращает true, то сценарий запускается (выполняется функция start) - примерно также как в Berry
Интерактивный сценарий не должен иметь check, если его запустили - он должен сработать, нужные проверки выполняются уже внутри запущенного сценария.
-
Добрый день!
Можно ли сделать так, что бы в процессе привязки датчика и устройства была строка для написания текста для отправки по e-mail с целью конкретного указания места, где сработал датчик. А то иметь на каждую группу устройств по индивидуальному сценарию не очень удобно.
Да, предложение хорошее - вместе с набором устройств добавлять дополнительные параметры при настройке в PM. Подумаем над реализацией.
Но в данном случае решение есть - можно в текст включить данные устройства в любой комбинации
sensor.name - название датчика
sensor.nameOf("place") - название уровня
sensor.nameOf("room") - название зоны
sensor.nameOf("subs") - название подсистемы
sensor.getPlaceDesc() - уровень и зона вместе, разделяются символом /: "1 этаж/Котельная"
Если уровня или зоны нет - выдается то что есть, без разделителя
Например:
this.info("email", "OWNER", "Тревога! "+ sensor.nameOf("place")+" "+sensor.nameOf("room")+". Сработал "+sensor.name)
Сформирует сообщение: "Тревога! 1 этаж Холл. Сработал Датчик движения"
Или
this.info("email", "OWNER", actor2.nameOf("place") + ": Включена сирена! Движение "+ sensor.getPlaceDesc())
Сформирует сообщение: "Гараж: Включена сирена! Движение 1 этаж/Коридор"
-
Добрый день!
Можно ли сделать так, что бы в процессе привязки датчика и устройства была строка для написания текста для отправки по e-mail с целью конкретного указания места, где сработал датчик. А то иметь на каждую группу устройств по индивидуальному сценарию не очень удобно.
Да, предложение хорошее - вместе с набором устройств добавлять дополнительные параметры при настройке в PM. Подумаем над реализацией.
Но в данном случае решение есть - можно в текст включить данные устройства в любой комбинации
sensor.name - название датчика
sensor.nameOf("place") - название уровня
sensor.nameOf("room") - название зоны
sensor.nameOf("subs") - название подсистемы
sensor.getPlaceDesc() - уровень и зона вместе, разделяются символом /: "1 этаж/Котельная"
Если уровня или зоны нет - выдается то что есть, без разделителя
Например:
> this.info("email", "OWNER", "Тревога! "+ sensor.nameOf("place")+" "+sensor.nameOf("room")+". Сработал "+sensor.name) > >
Сформирует сообщение: "Тревога! 1 этаж Холл. Сработал Датчик движения"
Или
> this.info("email", "OWNER", actor2.nameOf("place") + ": Включена сирена! Движение "+ sensor.getPlaceDesc()) > >
Сформирует сообщение: "Гараж: Включена сирена! Движение 1 этаж/Коридор"
А нет никакой инструкции вцелом по работе с плагином email? Задумка отправлять в заданный день месяца показания счётчиков на емэйл в УК и себе, но не представляю как это реализовать.
-
Недоступен для скачивания сценарий "Управление батареями отопления по датчикам температуры"…
Расскажите про добавление в сценарии пользовательских настроек. Например, делаю так:
const heater = Device("ActorD", "Нагреватель", [ {"name":"hist", "note":"Гистерезис включения/отключения актюатора, °C", "type":"number", "val":0.2} ]);
Но какое значение может быть в type чтобы hist можно было менять с точностью 0,05 градуса, например.