Сценарии пользователей
-
@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_afterOffconst 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 час
Результат:
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 написал в Сценарии пользователей:
И сразу другой вопрос: нельзя запускать мультисценарий из расписания? там можно выбрать только экземпляр с конкретным устройством...
Запустить можно конкретный сценарий. Мультисценарий - это как бы шаблон. Имеется в виду запустить все экземпляры мультисценария сразу? Нет, пока только по одному
-
Можно. Опять таки через доп актуатор.
В мультисценарий внести еще один элемент - актуатор.
И сделать его триггером. Чтобы сценарий запускался, когда этот актуатор, например, включается.Во все наборы устройств мультисценария этот актуатор сделать одним и тем же.
А его можно включать/выключать другим скриптом. Который запускать по расписанию.
-
@Erik Да, верно. Нормальный вариант
-
@Erik я добавил бинарный датчик и через плагин сенсорэмулятор задал период изменения. Суть таже - триггер) неудобно одинаковое устройство писать всем экземплярам мультисценария. Нужно групповое добавление устройств в мультисценарий)