Сценарии в intraHouse Cherry



  • @Alex_Jet:

    А как в скрипте сделать toggle для актуатора состояния сигнализации? То есть при любом изменении reader изменить состояние Button на противоположное? Что-то не могу догадаться…

    Вы же все уже сделали - канал привязали к актуатору Button c операцией toggle. Он сам меняет состояние по считывателю.

    Что вам осталось сделать - по триггеру Button переключать Guard



  • @intrapro:

    Вы же все уже сделали - канал привязали к актуатору Button c операцией toggle. Он сам меняет состояние по считывателю.

    Что вам осталось сделать - по триггеру Button переключать Guard

    Извините. Я просто все немного переименовал. Button - это у меня виртуальный актуатор, который вынесен на веб-интерфейс в том числе в виде кнопок. А Reader - тот который привязан к каналу считывателя.

    В одном скрипте у меня если изменяется состояние Button (кнопки на веб-морде), то я ставлю/снимаю сигнализацию.

    В другом скрипте у меня должно быть по любому изменению Reader состояние Button меняться на противоположное - я не знаю как это сделать…догадался сам пока писал:

    const script = {
        start() {
          //При успешном считывании Reader меняем состояние Button на противоположное
          this.assign(Button, "dval", !Button.dval);
        }
    };
    
    


  • Подскажите как сделать нечто подобное чтобы оно работало как задумано:

    /** 
    * @name Сообщение в Telegram о недоступности 
    * @desc Уведомление пользователя по Telegram о недоступности оборудования 
    */
    //const Device1 = DeviceT("SENSOR0"); 
    
    const script = {
        check() {
          let i;
          for(i = 0; i < 10; i++) {
            dev = Device("SENSOR" +i);
            if(!dev.dval) this.info("telegram", "OWNER", "Внимание! Недоступно устройство '" +dev.name+ "'");
            else this.info("telegram", "OWNER", "Связь с устройством '" +dev.name+ "' восстановлена");
    
            this.log(dev.name+ "=" +dev.dval);
          }
        },
    
        start() {
    
        } 
    };
    
    

    Если подробнее, то не объявлять в виде констант 100500 устройств (как DeviceT или проверять "вручную" изменение каждого в check), а с помощью цикла в check проверить состояние каждого. Если добавится еще 10 устройств, то заменить в скрипте только одно значение.



  • @Alex_Jet:

    Подскажите как сделать нечто подобное чтобы оно работало как задумано:

    > /** 
    > * @name Сообщение в Telegram о недоступности 
    > * @desc Уведомление пользователя по Telegram о недоступности оборудования 
    > */
    > //const Device1 = DeviceT("SENSOR0"); 
    > 
    > const script = {
    >     check() {
    >       let i;
    >       for(i = 0; i < 10; i++) {
    >         dev = Device("SENSOR" +i);
    >         if(!dev.dval) this.info("telegram", "OWNER", "Внимание! Недоступно устройство '" +dev.name+ "'");
    >         else this.info("telegram", "OWNER", "Связь с устройством '" +dev.name+ "' восстановлена");
    >         
    >         this.log(dev.name+ "=" +dev.dval);
    >       }
    >     },
    >   
    >     start() {
    >         
    >     } 
    > };
    > 
    

    Если подробнее, то не объявлять в виде констант 100500 устройств (как DeviceT или проверять "вручную" изменение каждого в check), а с помощью цикла в check проверить состояние каждого. Если добавится еще 10 устройств, то заменить в скрипте только одно значение.

    Зато будете получать 100500 телеграм-сообщений - при каждой сработке любого устройства такой скрипт выдавал бы сообщение о каждом устройстве, это наверное все же не совсем то, о чем мечтается 🙂

    Главная цель определения триггера - запуск сценария именно в тот момент, когда с устройством что-то происходит

    Можно же один раз сделать один-единственный мультисценарий

    /**
    * @name Сообщение в Telegram о недоступности 
    * @desc Уведомление пользователя по Telegram о недоступности оборудования 
    */
    const dev = DeviceT("SensorD"); 
    
    const script = {
        start() {
            if(!dev.dval) this.info("telegram", "OWNER", "Внимание! Недоступно устройство '" +dev.name+ "'");
            else this.info("telegram", "OWNER", "Связь с устройством '" +dev.name+ "' восстановлена");
    
            this.log(dev.name+ "=" +dev.dval);
        }
    };
    
    

    И привязывать устройства через Запуск для сценария



  • @intrapro:

    Можно же один раз сделать один-единственный мультисценарий

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

    А как убрать из журнала "отладочные" сообщения telegram??? Типа "telegram send: xxx". Ну или сделать как в Berry для GSM-шлюза было:

    "SMS +799999 Сообщение отправлено: текст сообщения"



  • @Alexulik:

    const script = {

    start() {

    const temp = 25;

    this.assign(dt, "defval", temp);

    Видимо так?

    Да, все верно, можно так.

    Этот сценарий можно привязать к кнопке либо запускать по расписанию.

    Если хочется более универсального решения, можно добавить виртуальное устройство Режим (как было в Berry):

    1. Добавить устройство с типом Переключатель, назовем его MODE

    2. Этому устройству в нижней табличке Состояния сделать: 0 - День 1 - Ночь 2 - Эконом и соотв. картинки

    3. Теперь это устройство можно вытащить на интерфейс. Шаблон представления - Переключатель состояния.

    Плюс по сравнению с кнопками - отображение текущего состояния.
    modeSwitch.png

    Его же можно вытащить в виде иконки как индикатор ( то что было в Berry)

    4. Сделать сценарий, для которого MODE является триггером и в нем уже менять уставки.

    Например, сделаем сценарий, который будет переключать уставки датчику. А сами уставки доступны через интерфейс пользователя.
    changeOnMode.png

     /** 
    * @name При изменении режима - изменить уставку 
    * @desc  
    * @version  
    */
    const mode = DeviceT("ActorE", "Переключатель режима");
     const dt = Device("SensorA", "Датчик температуры", [
      {"name":"dayTemp", "note": "Целевая днем, С", "type":"number", "val":23},
      {"name":"nightTemp", "note": "Целевая ночью, С", "type":"number", "val":21},
      {"name":"ecoTemp", "note": "Целевая в режиме эконом, С", "type":"number", "val":19}
    ]); 
    
     const script = {
     	start() {
     	  if (mode.dval == 0)  this.assign(dt, "defval", dt.dayTemp); 
     	  if (mode.dval == 1)  this.assign(dt, "defval", dt.nightTemp); 
     	  if (mode.dval == 2)  this.assign(dt, "defval", dt.ecoTemp); 
           }
     }
    
    
    

    Сделать для нужных датчиков привязку - Запуск для сценария

    А можно параметры уставки перенести в Переключатель - тогда для всех будет один температурный режим.

    И масса других вариантов …

    Естественно, MODE можно переключать сценарием по расписанию



  • @intrapro:

    Да, все верно, можно так.

    Наконец-то опубликовали частичное решение моего давнишнего вопроса 🙂 А если датчиков температуры 100500? Как у меня - 7 зон на первом этаже и 7 зон на втором этаже!

    Я пытался сделать 3 мультисценария (День/Ночь/Эконом) в которые добавлял нужные датчики температуры. А в самом сценарии прописывал const temp = 24/25/23, которую ассигновал соответствующим датчикам температуры. Однако поскольку могу управлять всеми 14-тью зонами, то хотелось бы в каждой зоне индивидуально настраивать температуру. Например, в котельной/гардеробной пусть будет всегда 23, а в прачечной - всегда 25. Кому-то из детей захочется сделать 24,5 в своей комнате или 25,5. В общем чтобы была возможность управления зонами.

    PS: ответьте, пожалуйста, по вопросам в предыдущем моем сообщении.



  • @Alex_Jet:

    Наконец-то опубликовали частичное решение моего давнишнего вопроса

    А почему частичное? Вроде задача решается - один мультсценарий, к которому привязываете датчики, которые должны по режимам переключаться - 14 штук :), а уставки - у каждого свои

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

    Дело в том, что сейчас идет переработка API сценариев.

    Действия устройства будет выполнять само устройство - lamp.on(), vent.toggle(), temp.setSetpoint()

    Через this будут только функции скрипта (таймеры и т д) и ядра (информирование, запись в журнал..)

    Одновременно будут работать и старые сценарии.

    Но в одном сценарии старый и новый синтаксис, естественно, смешивать нельзя. Как только запустим новый вариант - будем публиковать решения.

    @Alex_Jet:

    А как убрать из журнала "отладочные" сообщения telegram??? Типа "telegram send: xxx". Ну или сделать как в Berry для GSM-шлюза было:

    "SMS +799999 Сообщение отправлено: текст сообщения"

    В новом API сценариев сохранением в журнал можно будет управлять. Либо сделаем как в Berry - на галочках, не решили еще.



  • @Alexulik:

    Подскажите, как запустить сценарий из сценария?

    В настоящий момент это не реализовано.
    @intrapro:

    сейчас идет переработка API сценариев

    Там будет возможность запускать сценарии из сценариев.



  • @intrapro:

    А почему частичное? Вроде задача решается - один мультсценарий, к которому привязываете датчики, которые должны по режимам переключаться - 14 штук :), а уставки - у каждого свои

    Да, Вы правы - с таким мультисценарием логика работает как надо - по всем 14 зонам. Осталось подключить железо к iH и проверить как работает в реальности.



  • @sergeyygr:

    Всем Доброе утро!

    Подскажите пожалуйста как решить одну проблемку!

    Имеется система отопления, прекрасно управляемая IH. Котел, обогрев трубы ввода воды получают информацию от датчиков, подключенных по шине 1W через контроллер MegaD 2560. Ну и все остальное тоже управляется данными контроллерами. В общем я просто решил активировать режим "авто" и доверить автоматике управлять температурой в комнатах раздельно. Ранее все было нормально, а неделю назад при включении этого режима начали мигать иконки переключаясь с вкл на выкл и так далее в цикле. Реле также отрабатывает эти команды. Неделю пытался экспериментальным путем найти причину, остановился на том, что команду эту все таки дает именно сценарий. Хотя подогрев ввода и Котел работают отлично, в автоматическом режиме.

    Похоже, проблема с инверсными выходами в автоматическом режиме. Проверим.

    У вас в сценарии используются команды aon-aoff?

    Можно текст сценария?



  • @sergeyygr:

    Ммм… Только обогрев ввода тоже с инверсией и глюка такого не наблюдается. Правда сценарий там немного другой. Сейчас попробовал, актуатор отопления переподключил на "работающий" сценарий и результат тот же. Правда заметил то, что произвольное переключение актуатора прекращается при достижении показания датчика более 10 ти градусов (radiator100_1 переключаться прекратил. Подожду пока температура поднимется в другой комнате и проверю.

    А случайно для датчика температуры не выставлен диапазон от 10 градусов?

    С установкой флага ошибки меньше 10?

    Можно посмотреть в журнале датчика температуры



  • Если ошибки нет, тогда зацикливание с датчиком температуры скорее всего не связано.

    Попробуйте так:

    check() {
    return bat.auto && ( (bat.dval == 0)&&(Number(dt.aval) <= Number(dt.defval)-0.5) || (bat.dval == 1)&&(Number(dt.aval) >= Number(dt.defval) ) );
    },
    
    start() {
    	if (bat.dval == 0) {
    		this.do(bat, "aon");
    	} else {
    		this.do(bat, "aoff");
    	}
    }	
    
    
    

    @sergeyygr:

    И еще интервалы показаний датчиков не получается задать в плагине. Датчики передают показания как вздумается. По шине I2C может меняться 2 раза в секунду при установке интервала опроса 15 секунд. По шине 1W - один раз в 25-30 секунд при установке 5 секунд. И изменить не получается. Может плагин виноват? (или мои кривые руки))))

    Руки вероятно не виноваты 🙂

    По 1W через MegaD помнится есть минимальное время отклика как раз порядка 20-25 сек. Там же последовательный опрос цепочки датчиков

    По шине I2C - нужно посмотреть лог, скиньте, пригодится, когда будем плагин переделывать



  • @sergeyygr:

    Такой вариант сценария пробовал, не помогло(((

    А в отладчике что? В рабочих сценариях конкретно по этому сценарию?

    Еще можно временно добавить логирование :

    start() {
      if (bat.dval == 0) {
         this.log('Температура '+dt.aval+'  уставка '+dt.defval+'  Батарея '+bat.dval+' -> ВКЛЮЧАЕМ');
         this.do(bat, "aon");
      } else {
        this.log('Температура '+dt.aval+'  уставка '+dt.defval+'  Батарея '+bat.dval+' -> ВЫКЛЮЧАЕМ');
       this.do(bat, "aoff");
     }
    }
    
    


  • @sergeyygr:

    При температуре в помещении 10 градусов все нормально, режим авто работает, уставку датчика делаешь больше 10 ти - нормально, актуатор включается. Сейчас температура в помещении упала ниже 9,28 - началась "чихарда" с актуатором.

    лог сценария высылаю

    Чудеса 🙂 А так?

    start() {
      this.log('Температура '+dt.aval+' уставка '+dt.defval+'  Батарея '+bat.dval);
    
      if (bat.dval == 0 && (Number(dt.aval) < Number(dt.defval))) {
         this.log(dt.aval+' < '+dt.defval+ ' -> ВКЛЮЧАЕМ');
         this.do(bat, "aon");
      } 
    
      if (bat.dval == 1 && (Number(dt.aval) > Number(dt.defval))) {
         this.log(dt.aval+' > '+dt.defval+ ' -> ВЫКЛЮЧАЕМ');
       this.do(bat, "aoff");
     }
    }
    
    


  • @sergeyygr:

    Работает!!!

    Постараемся исправить. Спасибо вам за тестирование 🙂



  • Попробуйте сделать так. Найти папку /var/lib/intrahouse-c/projects/<имя проекта>/scenes/script/

    В этой папке хранятся файлы сценариев с расширением js

    Удалите последний редактированный сценарий. Или перенесите его себе, чтобы сохранить.

    После удаления, сервер надо перезагрузить.



  • Тема закрыта в связи с выходом новой версии API сценариев.


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