Найти тему

Родительский контроль: мультики и не только

Оглавление

Было бы странно имея умный дом и ребенка не навесить скрипты на окружающие гаджеты, чтобы организовать родительский контроль.

Пока ребёнок не вырос и не уткнулся в телефон, самым главным гаджетом для него является Телевизор. И планшет. Но на планшете хорошо заводится отдельный аккаунт со встроенным гугловым контролем на длительность пользования и установленные (и установку новых) приложения. А на телевизоре городить разные аккаунты - такое себе.

Ребёнку в телевизоре интересны только ролики из ютуба и мультики, практически всё своё телевизонное время она проводит в YouTube Kids, в котором установлены ограничения по возрасту, или Кинопоиске с детским аккаунтом и соответствующим возрастным ограничением. Поэтому остаётся только контролировать время для просмотра.

Телевизор устал и хочет отдохнуть
Телевизор устал и хочет отдохнуть

Входные параметры:

1. После 21:00 никаких мультиков.

2. Мультики можно смотреть час (настраиваемо). Потом телевизор выключается.

3. Если телевизор выключился, то включить мультики можно не ранее чем через час-полтора (настраиваемо).

Довольно лояльно, я считаю.

Чтобы всё это реализовать, нам нужны вспомогательные элементы, которыми мы сможем варьировать наши входные параметры.

Вспомогательные элементы

Первое: Детское время: 21:00. Чтобы не хардкодить в скрипты и автоматизации, создаётся новый вспомогательный элемент "дата и время":

-2

Даём ему название и присваиваем иконку:

-3

После того, как элемент создан, можно зайти в него и установить нужное время:

-4

Дальше: Время для мультиков: 60 минут, за это будет отвечать вспомогательный элемент "число":

-5

Здесь кроме названия и иконки задаются минимальное и максимальное значения, в рамках которых можно будет потом регулировать время просмотра:

-6

В настройках элемента сразу рисуется готовый слайдер, перемещая который, регулируется значение:

-7

Так же такой слайдер можно вывести на панель:

-8

Аналогично создаётся вспомогательный элемент: Пауза для мультиков, здесь максимальное значение можно поставить побольше, чтобы иметь запас на случай необходимости.

А ещё понадобися виртуальный переключатель: Статус мультиков, который мы будем щёлкать из автоматизаций и из которого мы будем понимать, играют у нас мультики вообще, или их никто и не включал сегодня:

-9

Зачем нужен именно переключатель и почему бы не брать статус из элемента мультимедиа? При проигрывании мультиков или музыки статус мультимедиа постоянно меняется - играет-пауза-играет-пауза. Поэтому событие "мультики играют уже час подряд" не наступит почти никогда. Для этого мы и взводим отдельный переключатель, который будет игнорировать непродолжительные паузы между мультиками.

Пассаж выше про переключатель несколько устарел за то время, пока эта заметка лежала у меня в черновиках. Теперь я использую таймеры: один для отсчёта играющих мультиков:

-10

Второй для отсчёта паузы, когда мультики отдыхают:

-11

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

Впрочем, переключатель у меня остался для контроля включенных сказок в ночное время, там таймер не очень подходит.

Скрипты

Чтобы не прописывать список действий, который может меняться, в автоматизациях, проще их организовать сразу скриптами, а уже скрипты вызывать из автоматизаций.

Нам нужны три скрипта. Первый - запуск отсчёта мультиков:

-12

Здесь мы используем шаблон для подстановки длительности из нашего числового вспомогательного элемента:

service: timer.start
data:
duration: "{{states('input_number.vremia_dlia_multikov')|int * 60}}"
target:
entity_id: timer.multiki

Точно такой же скрипт у нас на отсчёт паузы мультиков:

-13
service: timer.start
data:
duration: "{{states('input_number.vremia_dlia_igr')|int * 60}}"
target:
entity_id: timer.multiki_otdykhaiut

И, наконец, главный скрипт - непосредственно выключить телевизор:

-14

Минимальное количество действий - одно: выключить телевизор (раньше тут была использована интеграция broadlink, когда был старый телевизор без Android TV):

-15

Кроме этого, рекомендую сюда же прописать запуск приложения по умолчанию (лончера на ТВ), чтобы при повторном запуске телевизора открывалось главное окно, а не запущенные мультики. Это может пригодиться, в том числе, для отладки автоматизаций, потому что в лончере автоматизация (по моим, по крайней мере, соображениям) не срабатывает:

-16

Так же сюда можно добавить озвучку, сообщение о том, что телевизор будет выключен. У меня есть озвучка голосом Алисы, но в общий скрипт выключения телевизора не включена, потому что для разных причин выключения разные голосовые сообщения, которые встроены непосредственно в автоматизации. Об этом далее.

Автоматизации

Ну и самое главное - двигатель нашего контроля.

Напомню, в самом начале мы определилист, что причин выключить телевизор в детской у нас две - превышение лимита на просмотр мультиков и наступление "детского времени".

Пишем автоматизацию, которая сработает по завершению таймера "мультики":

-17

И перечисляем, что нам нужно сделать:

  • сообщить ребёнку о том, что мультики кончились
-18
  • выключить телевизор
-19
  • запустить таймер отдыха мультиков
-20

Аналогично можно поступить и с детским временем, но триггеров нужно два: на наступление детского времени, с условием что мультики в это время играют, и на включение мультиков, с условием что уже позже, чем детское время.

Но раз уж мы всё равно будем проверять состояние самих мультиков, то логичнее было бы это всё объединить в одной большой автоматизации, по мотивам одной из моих предыдущих заметок. Тем более что в Телеграме мне подсказали, что можно собрать в одном месте кучу триггеров, назначить им "имена" и потом в действиях проверять, какой именно из триггеров сработал. Чем не повод опробовать?

Итак, триггеры:

-21

Тут можно увидеть два отдельных триггера на то, что телевизор входит в приложение Кинопоиска и выходит из него. Так сделано, потому что приложение Кинопоиска с некоторых пор перестало отдавать корректный статус play/pause, и приходится тупо проверять, что оно запущено. Если оно запущено, то считаем что мультики играют. Все остальные приложения статус отдают нормально и обрабатываются триггерами "ТВ на паузе" и "ТВ начинает воспроизведение". Ну и детское время тоже здесь.

Каждому триггеру присвоено своё "имя", оно же идентификатор:

  1. fromkinopoisk/tokinopoisk - выход/вход для Кинопоиска
  2. yatvtopause/yatvtoplay - ТВ на паузе/играет
  3. yatvstop/yatvstart - ТВ выключается/включается
  4. timetosleep - детское время вышло

Начинаем. Делаем мультивыбор в действиях.

Часть первая: если мультики включились, то:

-22
  • Если уже активен таймер отдыха, то сразу же выключаем ТВ обратно:
-23
  • Если время больше, чем детское время, то выключаем ТВ:
-24
  • Если таймер мультиков стоял на паузе, то запускаем дальнейший отсчёт:
-25
  • Если таймер мультиков не был активирован, то активируем его заново скриптом:
-26

Последние два пункта - достаточно важны. Для честности контроля, если ребёнок выключил телевизор спустя, например, 20 минут просмотра мультиков, то таймер встаёт на паузу до следующего включения, таким образом можно делать перерывы в течение отведённого времени, например, на обед или на посещение уборной. При этом обязательно нужно контролировать текущее состояние таймера, а не запускать его заново каждый раз, иначе просмотр мультиков может стать бесконечным.

Вторая часть, если наступило детское время и при этом телевизор включен - тогда выключаем телевизор.

-27

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

-28

Контроль сказок

С мультиками разобрались, но есть ещё один момент, который нужно контролировать вместо ребёнка и вовремя выключать - сказки. Многие, у кого есть в доме одновременно и ребёнок, и умная колонка, используют последнюю для рассказывания сказок перед сном. Я стараюсь читать книжки дочери самостоятельно, но не всегда это имеет должный эффект, а иногда просто сил на это не остаётся. Сказки на Яндекс.Станции выручают. Но есть момент: когда ребёнок заснул - сказки выключить некому. Поэтому сделан отдельный контроль на длительность сказок после окончания детского времени.

Как было написано и зачёркнуто выше, я использовал отдельный переключатель для проигрывания музыки на колонке в детской комнате:

-29

И переключаю этот переключатель:

  • если колонка в детской начала воспроизводить что-либо - включаю:
  • если колонка в детской ничего не воспроизводит в течение минуты - выключаю.

Ну и контролирую, если сказки играют слишком долго, то останавливаю проигрывание.

Итоговая автоматизация выглядит так:

Триггер на то, что колонка начала играть.

ИД триггера yalitetoplay
ИД триггера yalitetoplay

Триггер на остановку проигрывания

ИД триггера yalitetopause
ИД триггера yalitetopause

Триггер на переключатель. Опытным путём было установлено, что полтора часа - самое оно.

ИД триггера skazkilkongplay
ИД триггера skazkilkongplay

Причём контролируем всё это только после наступления детского времени:

-33

То есть фактически колонка может играть весь день, но отсчёт сказок начнётся только в 21:00 (ну или сколько там установлено). Если вдруг по каким-то причинам полутора часов не хватит и ребёнок запустит сказки заново, то начнётся ещё один отсчёт и через ещё полтора часа сказки снова выключатся.

И проверяем наши триггеры:

-34

Включаем переключатель, начинаем отсчёт:

-35

Выключаем сказки, обнуляем отсчёт:

-36

И выключаем колонку, если время вышло:

-37

Вот, в общем-то, и всё.

Можно было бы сюда вписать ещё отдельный скрипт, который по запросу на колонке сообщает, отдохнули ли мультики или нет, но что-то и так лонгрид получился, поэтому оставим это на потом как-нибудь. Если это интересно - пишите в комментариях, я распишу как перебросить вопрос с колонки в HA и выполнить какой-то скрипт. Ну или об этом можно почитать в документации к интеграции YandexStation.