Было бы странно имея умный дом и ребенка не навесить скрипты на окружающие гаджеты, чтобы организовать родительский контроль.
Пока ребёнок не вырос и не уткнулся в телефон, самым главным гаджетом для него является Телевизор. И планшет. Но на планшете хорошо заводится отдельный аккаунт со встроенным гугловым контролем на длительность пользования и установленные (и установку новых) приложения. А на телевизоре городить разные аккаунты - такое себе.
Ребёнку в телевизоре интересны только ролики из ютуба и мультики, практически всё своё телевизонное время она проводит в YouTube Kids, в котором установлены ограничения по возрасту, или Кинопоиске с детским аккаунтом и соответствующим возрастным ограничением. Поэтому остаётся только контролировать время для просмотра.
Входные параметры:
1. После 21:00 никаких мультиков.
2. Мультики можно смотреть час (настраиваемо). Потом телевизор выключается.
3. Если телевизор выключился, то включить мультики можно не ранее чем через час-полтора (настраиваемо).
Довольно лояльно, я считаю.
Чтобы всё это реализовать, нам нужны вспомогательные элементы, которыми мы сможем варьировать наши входные параметры.
Вспомогательные элементы
Первое: Детское время: 21:00. Чтобы не хардкодить в скрипты и автоматизации, создаётся новый вспомогательный элемент "дата и время":
Даём ему название и присваиваем иконку:
После того, как элемент создан, можно зайти в него и установить нужное время:
Дальше: Время для мультиков: 60 минут, за это будет отвечать вспомогательный элемент "число":
Здесь кроме названия и иконки задаются минимальное и максимальное значения, в рамках которых можно будет потом регулировать время просмотра:
В настройках элемента сразу рисуется готовый слайдер, перемещая который, регулируется значение:
Так же такой слайдер можно вывести на панель:
Аналогично создаётся вспомогательный элемент: Пауза для мультиков, здесь максимальное значение можно поставить побольше, чтобы иметь запас на случай необходимости.
А ещё понадобися виртуальный переключатель: Статус мультиков, который мы будем щёлкать из автоматизаций и из которого мы будем понимать, играют у нас мультики вообще, или их никто и не включал сегодня:
Зачем нужен именно переключатель и почему бы не брать статус из элемента мультимедиа? При проигрывании мультиков или музыки статус мультимедиа постоянно меняется - играет-пауза-играет-пауза. Поэтому событие "мультики играют уже час подряд" не наступит почти никогда. Для этого мы и взводим отдельный переключатель, который будет игнорировать непродолжительные паузы между мультиками.
Пассаж выше про переключатель несколько устарел за то время, пока эта заметка лежала у меня в черновиках. Теперь я использую таймеры: один для отсчёта играющих мультиков:
Второй для отсчёта паузы, когда мультики отдыхают:
В настройках таймеров можно выставить любое время, дальше мы будем подставлять туда наше значение из вспомогательных числовых элементов.
Впрочем, переключатель у меня остался для контроля включенных сказок в ночное время, там таймер не очень подходит.
Скрипты
Чтобы не прописывать список действий, который может меняться, в автоматизациях, проще их организовать сразу скриптами, а уже скрипты вызывать из автоматизаций.
Нам нужны три скрипта. Первый - запуск отсчёта мультиков:
Здесь мы используем шаблон для подстановки длительности из нашего числового вспомогательного элемента:
service: timer.start
data:
duration: "{{states('input_number.vremia_dlia_multikov')|int * 60}}"
target:
entity_id: timer.multiki
Точно такой же скрипт у нас на отсчёт паузы мультиков:
service: timer.start
data:
duration: "{{states('input_number.vremia_dlia_igr')|int * 60}}"
target:
entity_id: timer.multiki_otdykhaiut
И, наконец, главный скрипт - непосредственно выключить телевизор:
Минимальное количество действий - одно: выключить телевизор (раньше тут была использована интеграция broadlink, когда был старый телевизор без Android TV):
Кроме этого, рекомендую сюда же прописать запуск приложения по умолчанию (лончера на ТВ), чтобы при повторном запуске телевизора открывалось главное окно, а не запущенные мультики. Это может пригодиться, в том числе, для отладки автоматизаций, потому что в лончере автоматизация (по моим, по крайней мере, соображениям) не срабатывает:
Так же сюда можно добавить озвучку, сообщение о том, что телевизор будет выключен. У меня есть озвучка голосом Алисы, но в общий скрипт выключения телевизора не включена, потому что для разных причин выключения разные голосовые сообщения, которые встроены непосредственно в автоматизации. Об этом далее.
Автоматизации
Ну и самое главное - двигатель нашего контроля.
Напомню, в самом начале мы определилист, что причин выключить телевизор в детской у нас две - превышение лимита на просмотр мультиков и наступление "детского времени".
Пишем автоматизацию, которая сработает по завершению таймера "мультики":
И перечисляем, что нам нужно сделать:
- сообщить ребёнку о том, что мультики кончились
- выключить телевизор
- запустить таймер отдыха мультиков
Аналогично можно поступить и с детским временем, но триггеров нужно два: на наступление детского времени, с условием что мультики в это время играют, и на включение мультиков, с условием что уже позже, чем детское время.
Но раз уж мы всё равно будем проверять состояние самих мультиков, то логичнее было бы это всё объединить в одной большой автоматизации, по мотивам одной из моих предыдущих заметок. Тем более что в Телеграме мне подсказали, что можно собрать в одном месте кучу триггеров, назначить им "имена" и потом в действиях проверять, какой именно из триггеров сработал. Чем не повод опробовать?
Итак, триггеры:
Тут можно увидеть два отдельных триггера на то, что телевизор входит в приложение Кинопоиска и выходит из него. Так сделано, потому что приложение Кинопоиска с некоторых пор перестало отдавать корректный статус play/pause, и приходится тупо проверять, что оно запущено. Если оно запущено, то считаем что мультики играют. Все остальные приложения статус отдают нормально и обрабатываются триггерами "ТВ на паузе" и "ТВ начинает воспроизведение". Ну и детское время тоже здесь.
Каждому триггеру присвоено своё "имя", оно же идентификатор:
- fromkinopoisk/tokinopoisk - выход/вход для Кинопоиска
- yatvtopause/yatvtoplay - ТВ на паузе/играет
- yatvstop/yatvstart - ТВ выключается/включается
- timetosleep - детское время вышло
Начинаем. Делаем мультивыбор в действиях.
Часть первая: если мультики включились, то:
- Если уже активен таймер отдыха, то сразу же выключаем ТВ обратно:
- Если время больше, чем детское время, то выключаем ТВ:
- Если таймер мультиков стоял на паузе, то запускаем дальнейший отсчёт:
- Если таймер мультиков не был активирован, то активируем его заново скриптом:
Последние два пункта - достаточно важны. Для честности контроля, если ребёнок выключил телевизор спустя, например, 20 минут просмотра мультиков, то таймер встаёт на паузу до следующего включения, таким образом можно делать перерывы в течение отведённого времени, например, на обед или на посещение уборной. При этом обязательно нужно контролировать текущее состояние таймера, а не запускать его заново каждый раз, иначе просмотр мультиков может стать бесконечным.
Вторая часть, если наступило детское время и при этом телевизор включен - тогда выключаем телевизор.
И третья часть, если не сработала ни первая, ни вторая часть, то есть мультики не начали играть и не наступило детское время. Методом исключения у нас остались триггеры остановки мультиков или выключения телевизора. Можно отдельно эти триггеры в условия не вносить и просто ставить таймер на паузу.
Контроль сказок
С мультиками разобрались, но есть ещё один момент, который нужно контролировать вместо ребёнка и вовремя выключать - сказки. Многие, у кого есть в доме одновременно и ребёнок, и умная колонка, используют последнюю для рассказывания сказок перед сном. Я стараюсь читать книжки дочери самостоятельно, но не всегда это имеет должный эффект, а иногда просто сил на это не остаётся. Сказки на Яндекс.Станции выручают. Но есть момент: когда ребёнок заснул - сказки выключить некому. Поэтому сделан отдельный контроль на длительность сказок после окончания детского времени.
Как было написано и зачёркнуто выше, я использовал отдельный переключатель для проигрывания музыки на колонке в детской комнате:
И переключаю этот переключатель:
- если колонка в детской начала воспроизводить что-либо - включаю:
- если колонка в детской ничего не воспроизводит в течение минуты - выключаю.
Ну и контролирую, если сказки играют слишком долго, то останавливаю проигрывание.
Итоговая автоматизация выглядит так:
Триггер на то, что колонка начала играть.
Триггер на остановку проигрывания
Триггер на переключатель. Опытным путём было установлено, что полтора часа - самое оно.
Причём контролируем всё это только после наступления детского времени:
То есть фактически колонка может играть весь день, но отсчёт сказок начнётся только в 21:00 (ну или сколько там установлено). Если вдруг по каким-то причинам полутора часов не хватит и ребёнок запустит сказки заново, то начнётся ещё один отсчёт и через ещё полтора часа сказки снова выключатся.
И проверяем наши триггеры:
Включаем переключатель, начинаем отсчёт:
Выключаем сказки, обнуляем отсчёт:
И выключаем колонку, если время вышло:
Вот, в общем-то, и всё.
Можно было бы сюда вписать ещё отдельный скрипт, который по запросу на колонке сообщает, отдохнули ли мультики или нет, но что-то и так лонгрид получился, поэтому оставим это на потом как-нибудь. Если это интересно - пишите в комментариях, я распишу как перебросить вопрос с колонки в HA и выполнить какой-то скрипт. Ну или об этом можно почитать в документации к интеграции YandexStation.