Чем займемся?

Это реализация умного будильника в Home Assistant — с визуализацией, гибкой логикой по дням недели, отложенным срабатыванием, управлением светом, шторами, ТВ и голосовыми оповещениями.

Что реализовано:

  • Карточка в интерфейсе — компактная панель с основными элементами управления и развёрнутым блоком параметров (через custom:fold-entity-row из HACS).
  • Гибкое расписание — отдельные автоматизации для будней и выходных, проверка текущего времени через шаблон.
  • Отложенное срабатывание — настраивается через input_number.alarm_1_offset, есть отдельный сенсор вычисленного времени.
  • Плавный рассвет — свет включается с нулевой яркости и нарастает в течение заданного времени (alarm_1_offset). Цвет подобран «под солнце» (тёплый оттенок).
  • Управление шторами — заранее рассчитанное время подъёма штор (alarm_1_cover) и отдельный триггер для этого.
  • Интеграция с техникой — ТВ включается, запускается браузер и открывается Home Assistant; музыка/оповещения проигрываются на Яндекс Станции.
  • Голосовой доклад — планируется сводка погоды, пробок, времени в пути (через TTS).

 

Как это работает по шагам:

  1. Настройка времени. Пользователь задаёт часы и минуты будильника через input_number.
  2. Вычисление производных времён. Шаблонные сенсоры рассчитывают время отложенного срабатывания и время открытия штор.
  3. Срабатывание по расписанию. Автоматизации каждую минуту проверяют, совпадает ли текущее время с целевым (для основного, отложенного или шторного сценария).
  4. Запуск сценария пробуждения. Скрипт wakeup_sequence:
    • сбрасывает свет в 0 яркости;
    • запускает плавное нарастание яркости;
    • ждёт нужное время;
    • включает ТВ и открывает HA в браузере;
    • запускает голосовое оповещение и музыку.
  5. Откладывание/отмена через Aqara Cube. Логика с кубом не прописана в YAML, но по описанию она управляет состоянием, которое влияет на отложенный будильник и полное отключение сценария.
  6. Открытие штор. Происходит по заранее рассчитанному времени, независимо от момента срабатывания основного будильника.
Карточка управления
Подробная карточка с управлением, детальные настройки можно свернуть.

Код карточки управления, вставляется с выбором в интерфейсе кастомной карты. 

				
					type: entities
entities:
  - entity: group.alarm_1
    icon: 'mdi:alarm-check'
    name: Будильник
  - entity: sensor.alarm_1_time
    icon: 'mdi:clock-outline'
    name: Время срабатывания
  - entity: input_number.alarm_1_hour
    icon: 'mdi:cog-clockwise'
    name: Часы
  - entity: input_number.alarm_1_minutes
    icon: 'mdi:cog-clockwise'
    name: Минуты
  - type: 'custom:fold-entity-row'
    head:
      type: section
      label: Параметры
    entities:
      - entity: sensor.time_date
        name: Текущее время и дата
      - entity: sensor.alarm_1_time_minus_offset
        icon: 'mdi:progress-clock'
        name: Время отложенного срабатывания
      - entity: sensor.alarm_1_time_minus_cover
        name: Время открытия шторы
      - entity: input_number.alarm_1_offset
        name: Отложить на
      - entity: input_number.alarm_1_cover
        name: Шторы
      - entity: input_boolean.alarm_1_weekday
        name: Рабочие дни
      - entity: input_boolean.alarm_1_weekend
        name: Выходные дни
      - entity: automation.wake_me_up_weekday_offset
        icon: 'mdi:calendar'
        name: Отложенное время в рабочие дни
      - entity: automation.wake_me_up_weekend_offset
        icon: 'mdi:calendar'
        name: Отложенное время в выходные дни
				
			
Общий код с сущностями будильника и автоматизацией срабатывания

1. Логика и элементы управления:

Всё строится на стандартных компонентах Home Assistant:

  • input_number — для часов, минут, времени отложенного срабатывания и штор,

  • input_boolean — для включения будильника по дням недели,

  • template sensor — динамический расчёт времени (основное, отложенное, время для штор),

  • group — группировка сущностей для удобного управления.

 

2. Автоматизации:

Автоматизации построены на триггере time_pattern (проверка каждую минуту). В зависимости от дня недели и состояния переключателей, сравнивается текущее время с рассчитанными сенсорами.

Есть отдельные автоматизации для:

  • основного времени (рабочие / выходные),

  • отложенного времени (рабочие / выходные),

  • открытия штор (рабочие / выходные).

Дополнительно настроены автоматизации на включение и выключение будильника с голосовым подтверждением через Яндекс Станцию, а также автоматическое включение будильника при старте Home Assistant.

 

3. Скрипт пробуждения

Скрипт wakeup_sequence выполняется последовательно:

  1. Сбрасывает параметры освещения (цвет и яркость в ноль).

  2. Плавно увеличивает яркость света до максимума с заданной задержкой (настраивается через alarm_1_offset).

  3. Включает телевизор и открывает в браузере главную страницу Home Assistant.

  4. Запускает голосовое оповещение или воспроизведение мелодии.

 

4. Включение телевизора

Отдельный скрипт tv_on_browser:

  • включает Samsung TV,

  • запускает на нём браузер,

  • открывает адрес локального HA-сервера.

Всё работает через медиа-интеграцию Home Assistant.

 

5. Голосовое сопровождение

Я использую два подхода:

  • Яндекс Станция — для коротких голосовых сообщений (включение/выключение будильника, запуск фоновой музыки) с постепенным увеличением громкости.

  • Google Cloud TTS — для детального утреннего доклада с погодой, временем в пути и предупреждениями о сильном ветре.

    Код:

				
					# ==============================================
# ДОБАВЛЯЕМ ЭЛЕМЕНТЫ ВВОД И УПРАВЛЕНИЯ
# ==============================================

input_number:
  alarm_1_hour:
    name: Hours
    icon: mdi:timer
    initial: 7
    min: 0
    max: 23
    step: 1
  alarm_1_minutes:
    name: Minutes
    icon: mdi:timer
    initial: 15
    min: 0
    max: 59
    step: 1
  alarm_1_offset:
    name: Transition
    icon: mdi:blur-linear
    initial: 5
    min: 0
    max: 60
    step: 5
  alarm_1_cover:
    name: Transition
    icon: mdi:blur-linear
    initial: 15
    min: 0
    max: 60
    step: 5

# ==============================================
# ПЕРЕКЛЮЧАТЕЛИ
# ==============================================

input_boolean:
  alarm_1_weekday:
    name: Weekdays
    initial: off
    icon: mdi:calendar
  alarm_1_weekend:
    name: Weekends
    initial: off
    icon: mdi:calendar
  alarm_1_offset_boolean:
    name: Offset
    initial: off
    icon: mdi:timer

# ==============================================
# СЕНСОРЫ ДЛЯ ПОДСЧЕТА ВРЕМЕНИ
# ==============================================

sensor:
  - platform: template
    sensors:
      alarm_1_time:
        value_template: >
          {{ "%0.02d:%0.02d" | format(
             states("input_number.alarm_1_hour") | int,
             states("input_number.alarm_1_minutes") | int
          ) }}

      alarm_1_time_minus_offset:
        friendly_name: 'Offset Time'
        value_template: >
          {% set total_minutes = (states('input_number.alarm_1_hour') | int * 60) +
                                 (states('input_number.alarm_1_minutes') | int) +
                                 (states('input_number.alarm_1_offset') | int) %}
          {% set hours = (total_minutes // 60) | int %}
          {% set minutes = (total_minutes % 60) | int %}
          {{ '%0.02d:%0.02d' | format(hours, minutes) }}

      alarm_1_time_minus_cover:
        friendly_name: 'Cover Time'
        value_template: >
          {% set total_minutes = (states('input_number.alarm_1_hour') | int * 60) +
                                 (states('input_number.alarm_1_minutes') | int) +
                                 (states('input_number.alarm_1_cover') | int) %}
          {% set hours = (total_minutes // 60) | int %}
          {% set minutes = (total_minutes % 60) | int %}
          {{ '%0.02d:%0.02d' | format(hours, minutes) }}

# ==============================================
# ГРУППИРОВКА
# ==============================================

group:
  alarm_1:
    name: Wake Me Up
    entities:
      - input_boolean.alarm_1_weekday
      - automation.wake_me_up_weekday_offset

# ==============================================
# АВТОМАТИЗАЦИИ
# ==============================================

automation:
  # Включение будильника при запуске HA
  - id: 'startup_on_alarm_clock'
    alias: Включение будильника при запуске HA
    trigger:
      platform: homeassistant
      event: start
    condition:
      condition: time
      after: '09:00:00'
      before: '00:00:00'
    action:
      - delay: 0:01
      - service: script.yandex_tts_4

  # Включение клавишами (звуковое сообщение)
  - id: 'on_alarm_clock'
    alias: "Включение будильника клавишей"
    trigger:
      platform: state
      entity_id:
        - input_boolean.alarm_1_weekday
        - input_boolean.alarm_1_weekend
      to: 'on'
    action:
      - service: script.yandex_tts_2

  # Выключение клавишами (звуковое сообщение)
  - id: 'off_alarm_clock'
    alias: "Выключение будильника клавишей"
    trigger:
      platform: state
      entity_id:
        - input_boolean.alarm_1_weekday
        - input_boolean.alarm_1_weekend
      to: 'off'
    action:
      - service: script.yandex_tts_3

  # ==============================================
  # Автоматизация для основного времени (рабочие дни)
  # ==============================================
  - id: 'alarm_1_weekday'
    alias: Wake me up (weekday)
    trigger:
      - platform: time_pattern
        minutes: "/1"
        seconds: 0
    condition:
      - condition: state
        entity_id: input_boolean.alarm_1_weekday
        state: 'on'
      - condition: time
        weekday:
          - mon
          - tue
          - wed
          - thu
          - fri
      - condition: template
        value_template: >
          {{ now().strftime("%H:%M") == states.sensor.alarm_1_time.state }}
    action:
      - data: {}
        service: script.wakeup_sequence

  # ==============================================
  # Автоматизация для основного времени (выходные)
  # ==============================================
  - id: 'alarm_1_weekend'
    alias: Wake me up (weekend)
    trigger:
      - platform: time_pattern
        minutes: "/1"
        seconds: 0
    condition:
      - condition: state
        entity_id: input_boolean.alarm_1_weekend
        state: 'on'
      - condition: time
        weekday:
          - sat
          - sun
      - condition: template
        value_template: >
          {{ now().strftime("%H:%M") == states.sensor.alarm_1_time.state }}
    action:
      - data: {}
        service: script.wakeup_sequence

  # ==============================================
  # Автоматизация для отложенного времени (рабочие дни)
  # ==============================================
  - id: 'alarm_1_weekday_offset'
    alias: Wake me up (weekday_offset)
    trigger:
      - platform: time_pattern
        minutes: "/1"
        seconds: 0
    condition:
      - condition: state
        entity_id: input_boolean.alarm_1_weekday
        state: 'on'
      - condition: time
        weekday:
          - mon
          - tue
          - wed
          - thu
          - fri
      - condition: template
        value_template: >
          {{ now().strftime("%H:%M") == states.sensor.alarm_1_time_minus_offset.state }}
    action:
      - data: {}
        service: script.wakeup_sequence

  # ==============================================
  # Автоматизация для отложенного времени (выходные)
  # ==============================================
  - id: 'alarm_1_weekend_offset'
    alias: Wake me up (weekend offset)
    trigger:
      - platform: time_pattern
        minutes: "/1"
        seconds: 0
    condition:
      - condition: state
        entity_id: input_boolean.alarm_1_weekend
        state: 'on'
      - condition: time
        weekday:
          - sat
          - sun
      - condition: template
        value_template: >
          {{ now().strftime("%H:%M") == states.sensor.alarm_1_time_minus_offset.state }}
    action:
      - data: {}
        service: script.wakeup_sequence

  # ==============================================
  # Автоматизация для штор (рабочие дни)
  # ==============================================
  - id: 'alarm_1_weekday_cover'
    alias: Wake me up (weekday_cover)
    trigger:
      - platform: time_pattern
        minutes: "/1"
        seconds: 0
    condition:
      - condition: state
        entity_id: input_boolean.alarm_1_weekday
        state: 'on'
      - condition: time
        weekday:
          - mon
          - tue
          - wed
          - thu
          - fri
      - condition: template
        value_template: >
          {{ now().strftime("%H:%M") == states.sensor.alarm_1_time_minus_cover.state }}
    action:
      - service: mqtt.publish
        data:
          topic: "cmnd/blind/Backlog"
          payload: "ShutterOpen1"

  # ==============================================
  # Автоматизация для штор (выходные)
  # ==============================================
  - id: 'alarm_1_weekend_cover'
    alias: Wake me up (weekend cover)
    trigger:
      - platform: time_pattern
        minutes: "/1"
        seconds: 0
    condition:
      - condition: state
        entity_id: input_boolean.alarm_1_weekend
        state: 'on'
      - condition: time
        weekday:
          - sat
          - sun
      - condition: template
        value_template: >
          {{ now().strftime("%H:%M") == states.sensor.alarm_1_time_minus_cover.state }}
    action:
      - service: mqtt.publish
        data:
          topic: "cmnd/blind/Backlog"
          payload: "ShutterOpen1"

# ==============================================
# СКРИПТЫ
# ==============================================

script:
  # Сброс освещения (яркость 0, цвет солнечный)
  wakeup_dim:
    alias: wakeup_dim
    sequence:
      - data:
          brightness: '0'
          rgb_color: [255, 169, 92]
        entity_id: light.walli
        service: light.turn_on
      - data:
          brightness_pct: '0'
          rgb_color: [255, 169, 92]
          transition: '0'
        entity_id: light.eve
        service: light.turn_on

  # Плавное включение освещения
  wakeup_bright:
    alias: wakeup_bright
    sequence:
      - data_template:
          brightness: '255'
          transition: "{{ (states('input_number.alarm_1_offset') | int) * 60 }}"
          rgb_color: [255, 169, 92]
        entity_id:
          - light.eve
          - light.walli
        service: light.turn_on

  # Главный скрипт будильника
  wakeup_sequence:
    alias: wakeup_sequence
    sequence:
      - data: {}
        service: script.wakeup_dim
      - delay: 00:00:02
      - service: script.wakeup_bright
      - delay: '00:{{ states.input_number.alarm_1_offset.state | int }}:00'
      - data: {}
        service: script.tv_on_browser_morning
      - service: script.yandex_tts_1
      # Альтернатива: запуск MP3 через Mopidy
      # - service: script.play_wakeup_music

  # Включение телевизора и открытие HA
  tv_on_browser:
    alias: ТВ. Включение и экран HA в браузере
    sequence:
      - service: media_player.turn_on
        data:
          entity_id: media_player.samsung_tv_remote
      - service: media_player.play_media
        data:
          entity_id: media_player.samsung_tv_remote
          media_content_type: app
          media_content_id: org.tizen.browser
      - service: media_player.play_media
        data:
          entity_id: media_player.samsung_tv_remote
          media_content_type: browser
          media_content_id: 'http://192.168.1.58:8123'

  # TTS Яндекс Станция
  yandex_tts_1:
    alias: YaStation_Запуск будильника
    sequence:
      - service: media_player.volume_set
        data:
          entity_id: media_player.yandex_station
          volume_level: 0.1
      - delay: '00:00:01'
      - service: yandex_station.send_command
        data:
          entity_id: media_player.yandex_station
          command: sendText
          text: Включи фоновую музыку.
      - delay: '00:01:00'
      - service: media_player.volume_set
        data:
          entity_id: media_player.yandex_station
          volume_level: 0.2
      - delay: '00:00:30'
      - service: media_player.volume_set
        data:
          entity_id: media_player.yandex_station
          volume_level: 0.3
      - delay: '00:00:30'
      - service: media_player.volume_set
        data:
          entity_id: media_player.yandex_station
          volume_level: 0.4

  yandex_tts_2:
    alias: YaStation_Включение будильника
    sequence:
      - service: media_player.volume_set
        data:
          entity_id: media_player.yandex_station
          volume_level: 0.4
      - delay: '00:00:01'
      - service: media_player.play_media
        data:
          entity_id: media_player.yandex_station
          media_content_id: "Включаю будильник на {{ states('sensor.alarm_1_time') }}"
          media_content_type: text

  yandex_tts_3:
    alias: YaStation_Выключение будильника
    sequence:
      - service: media_player.volume_set
        data:
          entity_id: media_player.yandex_station
          volume_level: 0.4
      - service: media_player.play_media
        data:
          entity_id: media_player.yandex_station
          media_content_id: Будильник выключен.
          media_content_type: text

  # Пример TTS через Google Cloud
  # google_tts_morning:
  #   alias: Утренний доклад
  #   sequence:
  #     - service: tts.google_cloud_say
  #       data_template:
  #         entity_id: media_player.mpd
  #         message: >
  #           Доброе утро. Сейчас {}. В настоящее время {}, на улице сейчас {} градусов.
  #           Сегодня вы можете ожидать {}. С высоким значением температуры в {} градусов
  #           и низким значением в {} градусов. До работы Лизы на автомобиле {} минут,
  #           до работы Никиты {} минут.
  #           {% if states.sensor.dark_sky_wind_speed.state|int > 10 %}
  #             Имейте ввиду, сегодня ветрено.
  #           {% endif %}
				
			

Добавить комментарий