Захотелось мне сделать ночник с помощью лампочки Yeelight Color Bulb, но не простой, а с указанием времени сколько ему гореть..
Конечно можно это сделать через MiHome или использовать предустановки в приложении Yeelight. Но это не очень удобно - нельзя просто задать в минутах сколько я хочу чтобы сегодня он горел. А так как я сейчас активно ковыряюсь в Home Assistant, то решил что правильнее это сразу делать там.
Будем делать вот такую красоту:
1. Сначала заведем переменные (сущности) - выключатель и значение таймера горения ночника.
Делается это в файле
configuration.yaml, добавляем в конец файла сущности:
####################################################
# Ночник в спальне #
####################################################
input_number:
light_timer_minutes:
name: "Timer (мин)" # имя
min: 0 # значение ОТ
max: 90 # значение ДО
step: 5 # шаг
input_boolean:
light_timer_enabled:
name: "Ночник Switch" # имя
initial: off # начальное значение
icon: mdi:timelapse # иконка
2. Перезапускаем инстанс, что бы добавленные сущности стали доступны.
3. Создаем автоматизацию.
Я сначала создаю автоматизацию через Automation Editor GUI, а потом после добавления условия старта (триггера), сохраняю и правлю уже в текстовом редактор.
Мне почему то так оказалось удобнее всего работать.
Причем к графическому редактору автоматизаций я обращаюсь довольно часто, когда не знаю как правильно код записать - создаю в тестовой автоматизации нужную конструкцию, а потом ее код копирую уже в боевую автоматизацию.
Код получился вот такой:
- alias: Turn on the night light in the bedroom
description: Включить ночник в спальне на выбранное количество минут
trigger:
- platform: state
entity_id: input_boolean.light_timer_enabled
to: 'on'
condition: []
action:
# Включим лампу
- type: turn_on
device_id: c******************************09
entity_id: light.yeelight_color_0x1d
domain: light
brightness_pct: 1
# Уведомление в Telegram
- service: notify.me
data:
message: "Ночник в спальне включен в {{ states('sensor.time') }} на {{ states('input_number.light_timer_minutes') | int }} минут."
# Таймер на столько минут сколько выставим слайдером в Lovelace карточке
- delay:
minutes: '{{ states(''input_number.light_timer_minutes'') | int }}'
# Выключим лампу
- type: turn_off
device_id: c******************************09
entity_id: light.yeelight_color_0x0x1d
domain: light
# Вернем переключатель в в Lovelace карточке в выключеное состояние
- service: input_boolean.turn_off
data:
entity_id: input_boolean.light_timer_enabled
mode: single
5. Теперь создадим карточку в интерфейсе Lovelace, тип -
entities, в нее выключаем всего две сущности, добавленные в п.1.
В текстовом редакторе она выглядит вот так:
type: entities
entities:
- entity: input_boolean.light_timer_enabled
- entity: input_number.light_timer_minutes
title: Ночник в спальне
show_header_toggle: false
В результате все работает. Просто слайдером выставляем нужное количество минут, и включаем ночник переключателем.
Added later:Указанный выше вариант оказался не очень то и удобный - никогда не понятно сколько осталось гореть, и нельзя перезапустить. Поэтому сделал новый пакет с ночником и таймером. Ночник выглядит теперь вот так:
Код:
# пакет ночник в спальне
nightlight:
####################################################
# Ночник в спальне новый на таймере а не delay #
####################################################
input_number:
nightlight_timer_minutes:
name: "Timer (мин)" # имя
min: 0 # значение ОТ
max: 60 # значение ДО
step: 5 # шаг
icon: mdi:timer-cog-outline # иконка
nightlight_timer_hours:
name: "Timer (час)" # имя
min: 0 # значение ОТ
max: 12 # значение ДО
step: 1 # шаг
icon: mdi:timer-cog # иконка
nightlight_level:
name: "яркость ночник (%)" # имя
min: 1 # значение ОТ
max: 100 # значение ДО
step: 1 # шаг
icon: mdi:brightness-percent # иконка
input_boolean:
nightlight_timer_enabled:
name: "Ночник вкл" # имя
initial: off # начальное значение
icon: mdi:timelapse # иконка
timer:
nightlight_timer:
duration: "00:01:30"
template:
- sensor:
- name: "Hoчник включен до"
#unit_of_measurement: ""
state: >
{{ (now().timestamp() + states('input_number.nightlight_timer_hours') | int *60*60 + states('input_number.nightlight_timer_minutes') | int *60) | timestamp_custom('%Y-%m-%d %H:%M:%S') }}
####################################################
# АВТОМАТИЗАЦИИ #
####################################################
automation:
- id: nightlight_control
alias: nightlight_control
description: Управление ночником
trigger:
- platform: state
entity_id: input_boolean.nightlight_timer_enabled
to: 'on'
id: nightlight_on
- platform: state
entity_id: input_boolean.nightlight_timer_enabled
id: nightlight_off
to: 'off'
- platform: event
event_type: timer.finished
event_data:
entity_id: timer.nightlight_timer
id: nightlight_timer_finished
condition: []
action:
- choose:
- conditions:
- condition: trigger
id: nightlight_on
sequence:
- service: timer.start
data:
duration: "{{ states('input_number.nightlight_timer_hours') | int *60*60 + states('input_number.nightlight_timer_minutes') | int *60 }}"
target:
entity_id: timer.nightlight_timer
- service: light.turn_on
target:
entity_id: light.yeelight_color_0x0***************d
data:
brightness_pct: '{{ states(''input_number.nightlight_level'') | int }}'
rgb_color:
- 255
- 126
- 0
- service: notify.me
data:
message: >-
Ночник в спальне включен в {{ states('sensor.time') }} на {{
states('input_number.nightlight_timer_hours') | int }} часов {{
states('input_number.nightlight_timer_minutes') | int }} минут. Яркость {{
states('input_number.nightlight_level') }}%.
- conditions:
- condition: trigger
id: nightlight_off
sequence:
- service: timer.cancel
target:
entity_id: timer.nightlight_timer
- type: turn_off
device_id: c********************************9
entity_id: light.yeelight_color_0x0***************d
domain: light
brightness_pct: 0
- conditions:
- condition: trigger
id: nightlight_timer_finished
sequence:
- type: turn_off
device_id: c********************************9
entity_id: light.yeelight_color_0x0***************d
domain: light
brightness_pct: 0
- service: input_boolean.turn_off
data:
entity_id: input_boolean.nightlight_timer_enabled
mode: single
Пакет
Night light доступен на
GitHub-е