Сценарии пользователей



  • @gis
    Если с расписанием не хочется работать, то можно сделать например, так:

    /** 
    * @name Управление будильником 
    * @desc  
    * @version 4 
    */
    const clock = Device("alarmClock",  [{"name":"wakeUpTime", "note":"Время будильника", "type":"time", "val":0}]); 
    
    script({
        boot() {
          return true;
        },
        
        start() {
          // Вывести планируемое время при старте - только для отладки. Реально оно будет динамически пересчитываться
          this.log('Планируемое время: '+ this.showWakeUpTime());
            
          // Сразу проверить время, затем проверять каждые 30 сек
          this.manageClock();
          this.startTimer("T1", 30, "onTimer");
        },
        
        onTimer() {
          this.manageClock();
          this.startTimer("T1", 30, "onTimer");
        },
        
        manageClock() {
          const itsTimeToWakeUp = this.checkWakeUpTime();
          if (itsTimeToWakeUp) {
            
            this.log('Будильник: '+ this.showWakeUpTime());
            clock.on(); 
          } else if (clock.isOn()) {
            // В следующем цикле сбросить
            clock.off();
          }
        },
        
        calcWakeUpTime() {
           // К времени от полуночи прибавить временной интервал устройства. Умножить на 1000, так как дате нужны милисекунды  
           return new Date().setHours(0,0,0,0) + clock.getParam('wakeUpTime')*1000;
        },
        
        checkWakeUpTime() {
          // Будильник должен сработать, если текущее время попадает в 30 сек интервал
          return (clock.getParam('wakeUpTime') && Math.abs(Date.now() - this.calcWakeUpTime() ) < 30000);
        },
        
        showWakeUpTime() {
           return new Date(this.calcWakeUpTime()).toLocaleString();
        }
    });
    

    Здесь alarmClock - дискретный актуатор, для которого задаем время сработки будильника как параметр. Используется компонент типа "time", он дает количество секунд. Прибавляем к полуночи и получаем время.

    Сценарий запускается на старте сервера (boot - true) и постоянно активен. Постоянно взводит таймер и проверяет, не пришло ли время звонить. Точность будет зависеть от интервала таймера, здесь - 30 сек, можно сделать и чаще.
    Так как никакого другого события запуска кроме старта сервера нет, при первом запуске или после редактирования сценарий автоматически не запустится, его надо запустить вручную. Штатно он всегда должен быть активен, в Рабочих сценариях должна быть зеленая галочка.

    Дальше можно доработать сценарий с учетом дня недели - задать для каждого дня время или просто checkbox-ы - должен сработать или нет в конкретный день. Также можно использовать механизм auto или дополнительные флаги для включения - отключения функции.
    Для самого устройства (его ведь придется вынести на интерфейс, чтобы устанавливать время) вероятно нужно настроить Действие при нажатии - off или даже none.



  • Спасибо большое! Попробую реализовать.



  • Добрый вечер! Есть связка RPi4 + Mega (пока по USB). Подскажите, как работать с Serial для выдачи команды в канал от IHS к устройству, подключенному к Ардуино, и приема из канала ответа устройства, подключенного к Ардуино? Только по Modbus, или есть еще какие решения? Заранее спасибо!



  • Участник @kostinanton написал в Сценарии пользователей:

    Добрый вечер! Есть связка RPi4 + Mega (пока по USB). Подскажите, как работать с Serial для выдачи команды в канал от IHS к устройству, подключенному к Ардуино, и приема из канала ответа устройства, подключенного к Ардуино? Только по Modbus, или есть еще какие решения? Заранее спасибо!

    Только по Modbus. Других вариантов сейчас нет



  • @intrahouse в есть наработки по МЭК-61850?



  • @intrapro а подскажите, как из свойства time получить значения минут и секунд? Устанавливаю на 00:00:00, в логе вижу значение:
    03.03 16:49:47.867 log: 4492800
    как преобразовать?



  • @homa, если Вы имеете в виду параметр сценария type:"time", там банальные секунды 🙂
    Вот например сценарий определяет параметры auto_afterOn, auto_afterOff

    const kev_speed_status = Device("SensorD","Состояние скоростей", [
      {"name":"auto_afterOn", "note":"После ручного включения", "type":"time", "val":0},
      {"name":"auto_afterOff", "note":"После ручного выключения", "type":"time", "val":0}
      ]);
    
    script({
        start() {
         .....
          this.log("auto_afterOn="+kev.getParam('auto_afterOn'))
         ......
        } 
    });
    

    Задаем 1 час
    timeParam.png

    Результат:
    03.03 17:55:42.230 log: auto_afterOn=3600

    Если поставить 00:00:00
    03.03 17:55:04.036 log: auto_afterOn=0

    Или что-то другое имелось в виду?



  • @intrapro я и ожидал секунды... но почему-то значение в 52 дня лежит, хотя выставлено 0



  • @homa да странно 😞 А если изменить?



  • @intrapro значение всегда секунды с уставки + ровно 52 дня)



  • @homa для любого параметра типа time??



  • @intrapro в рамках одного сценария для обоих параметров такая ситуация



  • @homa а меняете вы значения параметров интерактивно? Или из сценария?



  • @intrapro нашел проблему. изначально я в сценарии задал значение 4573457, потом крутил бегунки, потом поставил 0. На других устройствах все работает штатно, а вот те, на которых изначально было не то значение, не получается вернуть в строй.



  • @homa придется из сценария разово записать 0 или другое кол-во секунд в пределах суток.



  • @intrapro да, получилось. спасибо! И сразу другой вопрос: нельзя запускать мультисценарий из расписания? там можно выбрать только экземпляр с конкретным устройством...



  • Пользователь @homa написал в Сценарии пользователей:

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

    Запустить можно конкретный сценарий. Мультисценарий - это как бы шаблон. Имеется в виду запустить все экземпляры мультисценария сразу? Нет, пока только по одному 😞



  • @intrapro

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

    Во все наборы устройств мультисценария этот актуатор сделать одним и тем же.
    А его можно включать/выключать другим скриптом. Который запускать по расписанию.



  • @Erik Да, верно. Нормальный вариант



  • @Erik я добавил бинарный датчик и через плагин сенсорэмулятор задал период изменения. Суть таже - триггер) неудобно одинаковое устройство писать всем экземплярам мультисценария. Нужно групповое добавление устройств в мультисценарий)


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