DIY Умный Домашний Семейный Календарь (Аналог Skylight)

📖 Введение
Мою жену недавно буквально завалили в социальных сетях рекламой умных домашних календарей (Skylight, Cozyla, Hearth), и она была готова потратить на один из них более $300. Прежде чем дать ей согласие на покупку, я попросил время, чтобы изучить этот вопрос. Я понял, что большинство предлагаемых решений имеют схожий функционал, но существенно отличаются по цене. Самое главное, я не увидел ни одной выдающейся функции, которую не смог бы реализовать в Home Assistant.
Цель: Одобренный женой (Wife Acceptance Factor), удобный для размещения на столешнице сенсорный календарь, глубоко интегрированный в наш умный дом и не требующий ежемесячных платежей.
💡 Почему DIY?
Выбор DIY-подхода с Home Assistant дал несколько преимуществ по сравнению с покупкой Skylight/Hearth дисплея:
- Без абонентской платы: Нет подписки на "премиальные" функции.
- Бесшовная интеграция: Работает с нашими лампами, делами (Grocy) и датчиками присутствия.
- Старое оборудование: Переиспользован Mini PC и стандартный монитор.
- Конфиденциальность: Нет привязки к вендору и риска прекращения поддержки.
🛠 Выбор оборудования
В данный момент система построена для отображения дашборда на любом HD (1920x1080) дисплее.
В моем случае требовалось, чтобы устройство "выглядело как" skylight, было сенсорным, стояло на столешнице, и его можно было перемещать. Поэтому я выбрал описанное ниже оборудование. Тем не менее, ваш случай может отличаться, и потребуется подстроить конфигурацию — например, если вы хотите выводить интерфейс на планшет или что-то другое.
Оборудование я выбрал исходя из вышеописанных требований, а также с расчетом расширить возможности за счет веб-камеры, динамика и микрофона. Сейчас бы я, возможно, собрал систему иначе, поскольку не успел реализовать дополнительные идеи с оборудованием.
- Монитор: HP Engage 15-дюймовый сенсорный экран. Я выбрал его вместо обычных портативных мониторов, потому что в нем уже есть динамик, веб-камера и микрофон, что позволяет в будущем реализовать голосовое управление или видеозвонки.
- Компьютер: Старый Mini PC (NUC/Tiny PC) с Windows/Linux в режиме киоска или Raspberry Pi 4.~~
✨ Функции
- Семейный и индивидуальный режимы: Можно включать и выключать календари отдельных членов семьи.
- Двусторонняя синхронизация: Редактирование событий как с экрана, так и с телефонов (Google Календарь).
- Всплывающее окно "Добавить событие": Специальный UI для добавления событий в определённые календари прямо с экрана.
- Погода и дата: Красивый и наглядный верхний колонтитул.
- Адаптивность: Автоматически меняет количество дней в зависимости от ширины экрана (мобильный/десктоп).
⚙️ Инструкция по установке
Примечание: Эта настройка использует YAML Package, который автоматически создаёт все необходимые помощники, скрипты и переменные. Создавать их вручную не потребуется.
1. Предварительные требования (HACS)
У вас должен быть установлен HACS. Пожалуйста, установите следующие интеграции Frontend:
week-planner-cardbubble-cardconfig-template-cardcard-modbetter-moment-cardweather-cardbrowser_mod(Требуется для работы всплывающих окон)layout-card(Требуется для просмотра разделов)button-card(Требуется для всплывающего окна добавления события)
2. Backend (Мозг системы)
- Откройте ваш файл
configuration.yamlв Home Assistant. - Убедитесь, что у вас добавлена эта строка под
homeassistant:, чтобы включить пакеты:
homeassistant:
packages: !include_dir_named packages
``
- Создайте папку с именем
packages в вашем каталоге конфигурации HA (если у вас её нет).
Скачайте файл packages/family_calendar.yaml из этого репозитория.
Поместите файл в папку packages/.
Перезапустите Home Assistant. 3. Календарь
Вы можете использовать Google Календарь или Локальный Календарь.
#### Вариант A: Локальный календарь (самый простой)
Обратите внимание, что это не тестировалось, так как я использую только Google Календарь
- Перейдите в Настройки > Устройства и сервисы.
- Добавьте интеграцию Локальный календарь.
- Создайте календари с точными именами:
Alice, Bob, Charlie, Daisy, Family.
Если вы используете эти имена, код работает сразу!*#### Вариант B: Google Календарь
- Откройте
packages/family_calendar.yaml.
Пролистайте до скрипта add_google_calendar_event.
Обновите calendar_map, чтобы он указывал на ваши реальные Google-сущности:
`yaml
calendar_map:
"Alice": "calendar.alice_gmail_com"
"Bob": "calendar.bob_work_account"
`#### Настройка праздников
С недавних обновлений Home Assistant праздники добавляются через интерфейс:
- Перейдите в Настройки > Устройства и службы > Добавить интеграцию > Holiday.
- Выберите вашу страну.
- Проверьте ID сущности (например,
calendar.holidays). Если он отличается от стандартного, обновите его в YAML вашей панели.4. Панель управления (Внешний вид)
- Создайте новый вид панели (Установите тип вида на Разделы).
- Скопируйте код из dashboard.yaml.
- Настройте:
- Поиск и замена: Замените
person.alice на сущности членов вашей семьи.
Погода: Замените weather.home на вашего поставщика погоды.
Фон: Обновите URL изображения внизу yaml. Шаг 5: Тема (по желанию)
Чтобы получить специфический шрифт (Ovo):
- Убедитесь, что в вашем
configuration.yaml добавлена эта строка под frontend:
`yaml
frontend:
themes: !include_dir_merge_named themes
`
- Создайте папку с именем
themes в вашем каталоге конфигурации.
Скачайте themes/skylight.yaml и поместите его в эту папку.
Перезапустите Home Assistant.
Перейдите в свой профиль (значок пользователя внизу слева) и измените Тему на Skylight.
ПРИМЕЧАНИЕ: Тема не является всеобъемлющей, имейте это в виду
📐 Как это работает (внутри)
Логика фильтра
week-planner-card не поддерживает скрытие отдельных календарей "на лету". Для решения этой задачи я использовал Input Texts в роли фильтров Regex. Когда вы нажимаете на кнопку человека, его фильтр переключается между
. (Показать всё) и ^$ (Не показывать ничего).
config-template-card динамически внедряет эти переменные в карточку календаря.Скрипт создания события
Всплывающее окно "Добавить событие" использует единый скрипт, который обрабатывает логику для нескольких людей и типов событий (Весь день против По времени).
yaml
Simplified Logic Example
target_calendar: "{{ calendar_map.get(states('input_select.calendar_select')) }}"choose:
- conditions: "All Day Event is ON"
- conditions: "All Day Event is OFF"
ЗАМЕЧАНИЯ
Мой первоначальный пост был лишь кратким обзором того, как это сделать, чтобы люди могли адаптировать код под свои конкретные задачи.
В частности, я поступил так потому, что каждый дисплей и задача уникальны. Я не могу разрабатывать под все возможные размеры дисплеев, панелей и т.д. Поэтому решение подходит для упомянутого мной дисплея или любого другого (1920x1080), но его можно отредактировать для других вариантов.
Что касается дисплея, я изначально предложил этот вариант, потому что он продавался на Woot и на тот момент был очень экономичным способом получить сенсорный экран. Сейчас это может быть не так, поэтому используйте тот дисплей, который вам подходит. Планшет, сенсорный экран, телефон — что угодно. Главное, что вам нужно будет отредактировать — это панель управления.
--- Tranlated By Open Ai Tx | Last indexed: 2026-01-14 ---