Сценарии в intraHouse Cherry



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



  • @homa:

    Как я понимаю, создание скриптов методом конструктора больше недоступно. Теперь все скрипты пишутся вручную.

    На данном этапе это так.

    Чуть позже мы подготовим список шаблонов разных скриптов. Готовых к употреблению.

    И про метод конструктора мы не забыли 😉



  • Возник еще вопрос по скриптам. С взаимодействием устройств все понятно, но как быть в случае, когда нужно вызвать скрипт кнопкой на мнемосхеме? Я написал скрипт в котором нет сущностей сенсоров, есть только актуаторы (выключение света во всей квартире), но на экране привязки к кнопке скрипта ни один скрипт не отображается. Также вопрос в догонку к этой теме - мне пришлось каждый светильник добавлять как устройство в скрипт. Есть ли возможность работать с группами устройств или вызывать устройство напрямую, а не как переменную?

    Заранее спасибо!



  • Все должно работать именно так ка Вы описали.

    И групповые команды и привязка сценариев к кнопкам.

    Просто еще не успели. Это сделаем в ближайшее время.



  • Добрый день. Пробую сделать (простую штуку) что батарея включалась от датчика темп. Не получается выбрать "сенсор" - выпадающий список пустой, актуатор - батарея есть. Что я не так делаю?



  • Добрый день. Покажите ваш скрипт.

    В таблице устройств должно быть устройство типа, заявленного в Device (SensorA или SensorD)



  • Скрипта нет. Я пробую как в бери выбрать датчик и актуатор. Актуатор выбирается а в поле датчика пусто. хотя датчики в системе есть.
    Снимок.PNG



  • /**

    • @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'); }

    }



  • Совсем запутался в скобках. Где можно скачать учебник для чайников по скриптам? Я очень далек от этого. в Берри было проще. 😞



  • @zahar69:

    Совсем запутался в скобках. Где можно скачать учебник для чайников по скриптам? Я очень далек от этого. в Берри было проще. 😞

    Сценарии пишутся на 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'); 
    	}
    } 	
    
    
    

    И после редактирования сценария нужно его сохранить и возможно обновить страницу до ввода параметров.

    @zahar69:

    в Берри было проще. 😞

    Конечно, будет и интерактивный способ настройки простых сценариев. Хочется сделать гибко, но не громоздко.

    Примеры шаблонных сценариев тоже за нами. Выложим в ближайшие дни.



  • Выложили шаблоны сценариев https://intrahouse.ru/scenes-examples_ru/

    Их можно устанавливать двумя способами.

    1. Загрузить zip файл со сценарием https://intrahouse.ru/work-scenes_ru/

    2. Copy/Paste. Просто скопировать текст скрипта, добавить новый сценарий и вставить туда скопированный текст.

    Также как в Berry, остается только привязать устройства к сценарию. При этом, при желании, можно корректировать сценарий.

    Вариантов разных сценариев может быть много. Мы можем написать и опубликовать любые сценарии. Но желательно чтобы эти сценарии были востребованы и другими пользователями. Спрашивайте, обсуждайте функционал сценария, а мы реализуем.

    Это не исключает самостоятельного написания сценариев. Если кто-то поделится своим скриптом, очень хорошо.



  • Спасибо большое!

    Думаю, многим это будет интересно

    Чтобы еще больше облегчить жизнь тем, кто захочет загрузить Ваш сценарий, сохраняйте его в zip как файл с расширением .js, а не .txt. А еще проще - сохраняйте прямо в Project Manager в списке сценариев командой "Выгрузить в файл".

    Intrahouse_scenes.png

    Тогда командой "Загрузить из файла" сценарий сразу загрузится в проект.



  • А где задается заданная температура отопления?



  • @intrapro:

    Спасибо большое!

    Думаю, многим это будет интересно

    Чтобы еще больше облегчить жизнь тем, кто захочет загрузить Ваш сценарий, сохраняйте его в zip как файл с расширением .js, а не .txt. А еще проще - сохраняйте прямо в Project Manager в списке сценариев командой "Выгрузить в файл".

    Intrahouse_scenes.png

    Тогда командой "Загрузить из файла" сценарий сразу загрузится в проект.

    Перевыгрузил. Предыдущий пост тогда лучше удалить, чтобы никого не смущать.

    Управление светом
    отключить_весь_свет.zip
    управление_светом_с_дополнительного_выключателя.zip
    включение-выключение_дополнительного_освещения_с_основным.zip



  • Управление вытяжкой\замком
    открытие_электрозамка_на_время.zip
    управление_вытяжкой_по_влажности.zip
    автоматическое_отключение_вытяжки.zip



  • @zahar69:

    А где задается заданная температура отопления?

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

    Там слайдером можно менять уставку температуры.
    frm1011.jpg



  • А можно для необразованных разжевать - как шаблонный сценарий привязать к устройствам? В Berry было все тривиально…тут затрудняюсь.



  • @Alex_Jet:

    А можно для необразованных разжевать - как шаблонный сценарий привязать к устройствам? В Berry было все тривиально…тут затрудняюсь.

    Вся настройка сценариев - в разделе Сценарии. Если сам сценарий уже есть (скачан или написан), то заполняются строчки в табличке "Запуск для устройств". Конечно, сделать это можно только для мультисценариев (шаблонных в терминологии Berry)

    scenecall1.png
    Просто выбираются устройства из списка устройств подходящего класса

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

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

    Там есть информация об активных сценариях, времени последнего запуска и т д
    workscenes.png
    Если сценарий имеет триггеры, то он запускается по событиям этих триггеров (Сценарии по событию в Berry)

    Если триггеров нет - это интерактивные сценарии, их можно вызывать с кнопки, по расписанию и тд

    Наличие триггеров у сценария определяется неявно по функции check()

        check() {
            return ((lamp.auto == 1) && ((lamp.dval == 0) && (motion.dval == 1) || (lamp.dval > 0)));  
        },
    
    
    

    Все устройства, включенные в check, являются триггерами - в данном случае lamp и motion

    Если check возвращает true, то сценарий запускается (выполняется функция start) - примерно также как в Berry

    Интерактивный сценарий не должен иметь check, если его запустили - он должен сработать, нужные проверки выполняются уже внутри запущенного сценария.



  • Добрый день!

    @sergeyygr:

    Можно ли сделать так, что бы в процессе привязки датчика и устройства была строка для написания текста для отправки по 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 этаж/Коридор"



  • @intrapro:

    Добрый день!

    @sergeyygr:

    Можно ли сделать так, что бы в процессе привязки датчика и устройства была строка для написания текста для отправки по 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? Задумка отправлять в заданный день месяца показания счётчиков на емэйл в УК и себе, но не представляю как это реализовать.


Авторизуйтесь, чтобы ответить