Группы и фоновые задачи¶
Несколько устройств можно объединить в группу — виртуальный прибор с собственной карточкой, выключателем и набором функций. В приложении и в Алисе он выглядит как одно устройство: «Баня», «Тёплый пол», «Полив».
Что группа делает внутри, задаётся здесь же, в редакторе устройства. Есть две разные вещи: логика группы — как она отвечает на обращения к себе, и фоновые задачи — циклы, которые работают, пока прибор включён.
Логика группы¶
Пока логика не описана, группа ведёт себя просто: повторяет присланное. Что записали в её адрес, то и станет её состоянием.
Логику описывают, когда нужно другое: отфильтровать команду, пересчитать значение, передать её дальше реальным устройствам. В карточке группы нажмите «Описать логику».
Выключенная логика равносильна её отсутствию — группа снова повторяет присланное.
Две ветки¶
У логики две вкладки — по тому, что именно попросили сделать.
Запись — панель, Алиса или другая автоматизация просят группу что-то изменить. Состояние при этом само не записывается: что именно записать, решают шаги.
Чтение — у группы спросили текущее состояние. Пока в ветке нет ни одного шага «Ответить», состояние уходит в ответ сразу, а шаги просто выполняются перед этим — например будят участника группы.
Как только «Ответить» появился хоть в одном блоке, момент ответа задаёте вы, и тогда шаг обязателен в каждом блоке ветки: немедленный ответ отключён, и блок без него оставил бы спросившего вовсе без ответа. Такую логику не сохранить — сервер вернёт ошибку.
Пустая ветка означает «обрабатывай как обычно».
Переключатель «Разложить по регистрам» меняет способ записи. Выключен — одна логика на всё сообщение, работает первый подошедший блок. Включён — у каждого регистра свой обработчик, они выполняются подряд, а регистр без своего блока группа записывает как обычно. Шаг «Применить умолчание» внутри обработчика зовёт эту обычную запись — без него ваш блок всегда «вместо», а не «вдобавок».
Регистры¶
Регистр — это именованное значение прибора: state, brightness, температура, фаза сеанса.
Всё, чем оперирует логика, собрано в разделе «Регистры» её редактора. Регистр объявляют
заранее: шаг и условие выбирают его из списка, а незнакомое имя редактор не сохранит.
Параметры — настройки, которые задают снаружи: тип, подпись, границы, значение по умолчанию. Доступ у параметра один из двух: «Принимает команды» — уставка, которую правят на карточке в любой момент; «Спрашивать при запуске» — вопрос перед включением прибора, и на такой параметр ссылаются шаги (подробнее — Параметры и запуск).
Внутренние — состояние прибора для его задач и обработчиков: фаза сеанса, счётчик кругов. Объявляются с типом и значением; пишет их только сам прибор шагом «Регистр группы». Доступ: «Только внутри устройства» либо «Показывать в статусе» — тогда значение видно на карточке и в статусе, но снаружи не пишется.
Умения и датчики приходят из редактора устройства, здесь они только для справки. Умение принимает команды, датчик — показание, которое прибор считает сам: видно в статусе, снаружи не пишется. В Алису попадают только они.
Нужно другое сочетание? Умение, которое не должно принимать команд, — это датчик. Значение, которое не должно быть видно, — внутренний регистр. Настройка без вопроса при старте — параметр «Принимает команды».
Фоновые задачи¶
Задача — это цепочка шагов, которая повторяется, пока прибор включён: «включить вентилятор, подождать три минуты, выключить». Задач у прибора может быть несколько, добавляются кнопкой «Добавить задачу».
Задача идёт, пока включён выключатель группы. Выключили группу или саму задачу — круг обрывается.
Как читается тело задачи¶
Блоки задачи означают не «если», а «Пока верно». Каждый круг задача берёт первый блок, чьё условие верно, и выполняет его шаги. Перестали быть верными все условия — сеанс закончился.
Новый круг начинается каждую минуту или сразу за предыдущим, если тот шёл дольше. Более редкий цикл делается паузой внутри самой цепочки.
Блок без шагов законен и означает «держись, ничего не делай».
Настройки блока и шагов¶
«Проверять» у блока: перед кругом — как обычно; после первого круга — блок обязательно отработает один раз, а условие спросят потом. Так пишется «в конце обязательно продуть»: свой круг блок получит, даже если первый достался соседу.
«Если не вышло» у шага: что делать, когда шаг не удался — команда не ушла, регистр не записался. Закончить и погасить или идти дальше. Цена отказа у шагов разная: не включилась печь — сеанса нет; не зажёгся свет — париться это не мешает.
«При остановке» — команды, которые выполняются, когда задача закончилась: сама дошла до конца, перестали быть верными все условия, выключили группу или выключили задачу. Только команды: пауза или ожидание сделали бы остановку зависающей.
Оставите ветку пустой — нагрузка останется в том состоянии, в котором её застала остановка.
Что видно снаружи¶
В карточке задачи есть «История кругов»: у долгого сеанса в журнале остаются смены исхода — «выполнен», «ошибка», «отложен», «ничего не потребовалось», «сеанс закончен».
Идущую задачу нельзя удалить, пока она не остановлена: иначе нагрузка осталась бы включённой, а гасит её сама задача своей веткой остановки. Сначала выключите её, дождитесь остановки и удаляйте.
Регулятор и плавная мощность¶
Внутри фоновой задачи доступны ещё два инструмента для плавного управления.
Шаг «Регулятор»¶
«Регулятор» считает мощность по показанию датчика и уставке и кладёт её в переменную круга. В строке задачи он показан одной сводкой — «Термометр · Парилка · temperature → 90 · power»; поля открываются нажатием на неё.
В диалоге «Главное» — всё, без чего шаг не имеет смысла:
Датчик и Показание — что мерим. Показание выбирается из списка того, что прибор реально присылает; имя, набранное руками, регулятор может не найти и будет держать безопасное значение.
Уставка — к чему стремимся. Либо число, либо регистр группы: во втором случае это ручка на карточке прибора, и задача подхватит новое значение следующим тактом.
Направление — греем или охлаждаем.
Остальное сложено в «Тонкую настройку». Она свёрнута, и значения в ней уже рабочие: чтобы регулятор заработал, открывать её не нужно. Внутри — окно свежести показания, коэффициенты, пределы и поведение выхода:
коэффициенты выбирают закон сами: один пропорциональный — П, вместе с интегральным — ПИ, все три — ПИД. Начинать стоит с одного пропорционального;
«Не быстрее» ограничивает, насколько мощность меняется за минуту, — самый простой способ сделать управление плавным, не трогая коэффициенты;
«Безопасное значение» публикуется, когда датчик замолчал дольше разрешённого, — иначе нагреватель не гаснет;
«Зеркалить выход в регистр» делает мощность видимой на карточке прибора и доступной другим задачам группы.
Мощность становится длиной включения¶
Пауза в режиме «Переменная» берёт свою длину из переменной регулятора или из регистра группы и растягивает её на заданный отрезок секунд: «значение от…до» отображается в «секунд от…до». Под полями показано, что получится: «Половина мощности (50) даст 30 с».
Для медленного ШИМ таких пауз нужно две: первая — сколько греем, вторая — сколько ждём, со встречной шкалой. Пять минут греем, пятнадцать ждём — это они и есть. Нулевая мощность даёт паузу короче секунды, и такой отрезок пропускается целиком, вместе с командой, которая его открывает, — поэтому «мощности нет» и означает «не включать».
Настройки у обоих шагов подробные, и тонкая часть — работа наладчика. Полное описание полей — в спецификации языка автоматизаций.
Как это выглядит целиком¶
Баня собрана ровно так. Печь, нагреватель, парогенераторы, свет и вентиляция — отдельные устройства, объединённые в группу «Баня» с одним выключателем.
Логика группы принимает включение и спрашивает единственный параметр — сколько парить. Фоновая задача ведёт сеанс кругами: проверяет печь и отменяет сеанс, если та не ответила; греет и ждёт, пока термометр не покажет нужное; подаёт пар; включает свет; отсчитывает время парения. Ветка остановки гасит всё разом — и когда сеанс дошёл до конца, и когда баню выключили руками.
Снаружи это один прибор с надписями «Ожидание», «Подготовка», «Парение» — человеку не нужно знать, что внутри пять устройств.