Это пример моей сигнализации в Home Assistant с использованием встроенных инструментов.
Панель управления сигнализацией в Home AssistantНа самом деле существует очень хорошая
интеграция Alarmo для системы сигнализации в Home Assistant. Она предоставляет пользовательский интерфейс для настройки собственной системы сигнализации полностью из браузера. Но мне хотелось использовать только встроенные инструменты.
Т.к. я люблю Packages Home Assistant, то все что касается сигнализации я собрал в одном пакете.
Сам пакет я разместил на
GitHub, далее я распишу что в него входит и как это работает.
Сначала создаем сущности timer в Home Assistans:
####################################################
# СУЩНОСТИ #
####################################################
binary_sensor:
timer:
alarm_sirena_timer: # таймер включения сирены если сигнализация не отключена
duration: "00:01:00"
alarm_sirena_timer_off: # таймер отключения сирены если сигнализация ВСЕ ЕЩЕ не отключена
duration: "00:10:00"
Первый таймер используется как задержка перед включением сирены с момента сработки датчиков открытия.
Второй используется для отключения сирены если от момента сработки сигнализации никто ее так и не выключил. Это сделано специально.
Логика у меня была такая - окрыли дверь, запустились таймеры, если пока работает первый таймер сигнализацию не сняли с режима охраны - включаем сирену. Если в режим завершения второго таймера, сигнализацию все еще не выключили, то дальше смысла нет "орать".
Далее создадим панель управления сигнализацией:
####################################################
# ПАНЕЛЬ #
####################################################
alarm_control_panel: #
- platform: manual #
name: Home Alarm # имя панели
code: "77877" # код для включения или отключения
code_arm_required: false # требуется ли код для постановки на охрану
arming_time: 60 # Время в секундах состояния «подготовки» перед изменением состояния.
delay_time: 50 #
trigger_time: 20 # Время в секундах «сработавшего» состояния, в котором срабатывает тревога.
disarmed:
trigger_time: 0 #
armed_home:
arming_time: 0 #
delay_time: 0 #
Основные параметры, которые необходимо задать я описал в комментариях.
Теперь создадим вспомогательные элементы:
####################################################
# ВСПОМОГАТЕЛЬНЫЕ ЭЛЕМЕНТЫ #
####################################################
input_boolean:
cam2record_enabled:
name: "Cam2 запись вкл" # имя
#initial: off # начальное значение
icon: mdi:cctv-off # иконка
cam3record_enabled:
name: "Cam3 запись вкл" # имя
#initial: off # начальное значение
icon: mdi:cctv-off # иконка
Пояснение - у меня есть две камеры в доме, и я создаю два переключателя. Смысл в том, что когда переключатели в статусе On, то при сработке сигнализации либо датчиков движения в Телеграм прилетают десяти секундные видео с этих камер. Когда я ставлю сигнализацию в режим охраны, то эти переключатели переходят в состояние On, и потом они используются в автоматизациях в условиях "а надо ли слать видео".
Скрипты, они используются в автоматизациях чтобы сократить код автоматизаций.
Скрипт включения режима охраны "home away":
script:
# скрипт включения режима охраны "home away"
alarm_on_home_away:
alias: alarm_on_home_away
sequence:
- service: notify.me_group
data:
title: Security alarm system HA
message: |
{{"\U0001F6A7"}} Включение охраны в {{ now().strftime('%Y-%m-%d %H:%M:%S %Z') }}
# взведение сигнализации
- service: alarm_control_panel.alarm_arm_away
data: {}
target:
entity_id: alarm_control_panel.home_alarm
# проиграть мелодию на шлюзе
- service: xiaomi_aqara.play_ringtone
data:
gw_mac: gw_mac
ringtone_id: '10002'
ringtone_vol: 30
# выключить экран датчика качества воздуха в спальне
- service: button.press
target:
entity_id: button.d1mini_n2_blank_screen
data: {}
mode: single
В комментариях я все описал, если кратко - отправляем уведомление в Телеграм, проигрываем мелодию на шлюзе Xiaomi с динамиком (lumi-gateway-v3), взводим панель сигнализации в статус arm_away, и на датчике качества воздуха переключаем экран на пустой (там OLED экран, и хочу сберечь его немного - когда дома никого нет, нет смысла на нем что-то отображать.
Скрипт выключения режима охраны:
# скрипт выключения режима охраны
alarm_off:
alias: alarm_off
sequence:
- service: notify.me_group
data:
title: Security alarm system HA
message: |
{{"\U0001F6A7"}} Выключение охраны в {{ now().strftime('%Y-%m-%d %H:%M:%S %Z') }}
# выключение режима охраны
- service: alarm_control_panel.alarm_disarm
data:
entity_id: alarm_control_panel.home_alarm
code: 77877
# проиграть мелодию на шлюзе
- service: xiaomi_aqara.play_ringtone
data:
gw_mac: gw_mac
ringtone_id: '10003'
ringtone_vol: 30
# выключение инпут булеонов "отсылать ролики с камер"
- service: input_boolean.turn_off
data: {}
target:
entity_id:
# - input_boolean.cam2record_enabled
- input_boolean.cam3record_enabled
# включение подсветки прихожей
- service: timer.start
data:
duration: "00:03:00"
target:
entity_id: timer.halllight_night_timer
# включить экран датчика качества воздуха в спальне
- service: button.press
target:
entity_id: button.d1mini_n2_next_screen
data: {}
mode: single
Делает то же что и предыдущий скрипт, но наоборот. Плюс включает обратно отображение данных на датчике качества воздуха и на 3 минуты включает подсветку в прихожей (запускает таймер, который рулит подсветкой).
Теперь рассмотрим автоматизации, которые по сути и рулят всех сигнализацией в Home Assistant.
Первая автоматизация "снимает с охраны" сигнализацию.
####################################################
# АВТОМАТИЗАЦИИ #
####################################################
automation:
## всякие уведомления. ТЕСТ режим
# автоматизация при отключении сигнализации
- id: alarm_disarmed
alias: alarm_disarmed
description: Send notification when alarm is Disarmed
trigger:
- platform: state
entity_id: alarm_control_panel.home_alarm
to: "disarmed"
action:
- service: notify.me_group
data:
message: "ALARM! The alarm is Disarmed at {{ now().strftime('%Y-%m-%d %H:%M:%S %Z') }}"
- service: timer.cancel
target:
entity_id:
- timer.alarm_sirena_timer
- timer.alarm_sirena_timer_off
- service: light.turn_off
data: {}
target:
entity_id:
- light.yeelight1
- light.yeelight2
# сменим страничку на wallpanel и включим экран
- service: fullykiosk.load_url
data:
entity_id: media_player.samsung_galaxy_tab_3_media_player
url: http://../lovelace-wallpanel/rooms
- service: timer.start
data:
duration: "00:03:00"
target:
entity_id: timer.wallpanel_dd_timer
- type: turn_on
device_id: 2ed903d
entity_id: light.samsung_galaxy_tab_3_screen
domain: light
- service: switch.turn_on
data: {}
target:
entity_id:
- switch.0x14_switch # тв
- switch.0x15_switch # WallOutlet Artur Comp
- switch.0x17_switch # SPlug Term
- switch.sonoff_1 # TH16-1
- switch.sonoff_2 # TH16-2
- service: timer.start
data:
duration: "00:03:00"
target:
entity_id: timer.halllight_timer
Это автоматизация отправляет уведомление в Telegram, включает обратно все розетки (которые мы выключаем когда никого нет дома), меняет на настенном планшете у входа страничку опять на обычную (стандартную) страничку, запускает таймер подсветки коридора.
Что делать если сигнализация сработала (отработали датчики открытия или движения), здесь я только отправлю уведомление о сработке, остальные обработки в другой автоматизации.
# автоматизация что делать когда сработали датчики сигнализации
- id: alarm_pending
alias: alarm_pending
description: Send notification when alarm is in pending status
trigger:
- platform: state
entity_id: alarm_control_panel.home_alarm
to: "pending"
action:
- service: notify.me_group
data:
message: "ALARM! The alarm is in pending status at {{ now().strftime('%Y-%m-%d %H:%M:%S %Z') }}"
Что делаем если сигнализация взвелась в режиме armed_away:
# автоматизация что делать когда сигнализация взвелась
- id: alarm_away_mode
alias: alarm_away_mode
description: Send notification when alarm is Armed in Away mode
trigger:
- platform: state
entity_id: alarm_control_panel.home_alarm
to: "armed_away"
action:
- service: notify.me_group
data:
message: "ALARM! The alarm is armed in Away mode {{ now().strftime('%Y-%m-%d %H:%M:%S %Z') }}"
# сменим страничку на wallpanel и не включим экран
- if:
- condition: and
conditions:
- condition: state
entity_id: timer.alarm_sirena_timer
state: idle
- condition: state
entity_id: timer.alarm_sirena_timer_off
state: idle
then:
- service: fullykiosk.load_url
data:
entity_id: media_player.samsung_galaxy_tab_3_media_player
url: http://../lovelace-wallpanel/alarm
- service: switch.turn_off
data: {}
target:
entity_id:
- switch.0x14_switch # тв
- switch.0x15_switch # WallOutlet Artur Comp
- switch.0x17_switch # SPlug Term
- switch.sonoff_1 # TH16-1
- switch.sonoff_2 # TH16-2
Делаем - переключаем экран на планшете возле выхода на страничку сигнализации и выключаем все розетки.
Что делаем если сигнализация взвелась в режиме armed_home:
# автоматизация когда сигнализация взвелась в режиме "мы дома"
- id: alarm_home_mode
alias: alarm_home_mode
description: Send notification when alarm is Armed in Home mode
trigger:
- platform: state
entity_id: alarm_control_panel.home_alarm
to: "armed_home"
action:
- service: notify.me_group
data:
# Using multi-line notation allows for easier quoting
message: >
ALARM! The alarm is armed in Home mode {{ now().strftime('%Y-%m-%d %H:%M:%S %Z') }}
# сменим страничку на wallpanel и не включим экран
- if:
- condition: and
conditions:
- condition: state
entity_id: timer.alarm_sirena_timer
state: idle
- condition: state
entity_id: timer.alarm_sirena_timer_off
state: idle
then:
- service: fullykiosk.load_url
data:
entity_id: media_player.samsung_galaxy_tab_3_media_player
url: http://../lovelace-wallpanel/alarm
- service: switch.turn_off
data: {}
target:
entity_id:
- switch.0x14_switch
- switch.0x15_switch
Делаем то же что и в предыдущей автоматизации, но не выключаем все розетки.
Автоматизация постановки на охрану и снятия с охраны кнопкой aqara:
# автоматизация снятия/постановки на охрану кнопкой aqara в прихожей
- id: alarm_aqara_button_prihozaya
alias: alarm_aqara_button_prihozaya
description: Постановка/снятие с охраны кнопкой в прихожей
trigger:
- platform: event
event_type: xiaomi_aqara.click
event_data:
entity_id: binary_sensor.switch_17
click_type: single
id: aqara_prihozaya_single
- platform: event
event_data:
entity_id: binary_sensor.switch_17
click_type: double
event_type: xiaomi_aqara.click
id: aqara_prihozaya_double
condition: []
action:
- choose:
# to arm away
- conditions:
- condition: trigger
id: aqara_prihozaya_single
sequence:
- service: script.alarm_on_home_away
data: {}
- service: xiaomi_aqara.play_ringtone
data:
gw_mac: gw_mac
ringtone_id: '10002'
ringtone_vol: 30
- service: input_boolean.turn_on
data: {}
target:
entity_id:
# - input_boolean.cam2record_enabled
- input_boolean.cam3record_enabled
# to disarm
- conditions:
- condition: trigger
id: aqara_prihozaya_double
sequence:
- service: script.alarm_off
data: {}
- service: light.turn_off
data: {}
target:
entity_id: light.xiaomi_gateway_light
default: []
mode: single
Одиночное нажатие вызывает скрипт постановки на охрану, двойное нажатие - скрипт снятия с охраны.
Это наверное самая сложная автоматизация в этом пакете - взведение сигнализации в режим ожидания отключения сигнализации:
# автоматизация сработки триггера - взвести сигнализацию в режим pending
- id: alarm_trigger_motion_contact
alias: alarm_trigger_motion_contact
description: Сработали триггеры - взвести сигнализацию в pending
trigger:
# движение
- platform: state
entity_id:
- binary_sensor.motion_sensor_1c # прихожая
- binary_sensor.motion_sensor_13 # кухня
to: 'on'
for:
hours: 0
minutes: 0
seconds: 2
id: alarm_motion_sensors
# двери/окна
- platform: state
entity_id:
- binary_sensor.door_window_sensor_1b # дверь
- binary_sensor.door_window_sensor_1a # Замок нижний
to: 'on'
for:
hours: 0
minutes: 0
seconds: 2
id: alarm_contact_sensors
condition:
condition: or
conditions:
- condition: state
entity_id: alarm_control_panel.home_alarm
state: armed_home
- condition: state
entity_id: alarm_control_panel.home_alarm
state: armed_away
action:
- choose:
# motion trigger
- conditions:
- condition: trigger
id: alarm_motion_sensors
sequence:
- service: notify.me_group
data:
title: Security alarm system HA
message: |
{{"\U0001F6A7"}} {{ now().strftime('%Y-%m-%d %H:%M:%S %Z') }} Движение!
{{"\U0001F3C3"}} Датчики движения
Прихожая - {{ states('binary_sensor.motion_sensor_1c') }}. {{ states.binary_sensor.motion_sensor_1c.last_changed.timestamp() | timestamp_custom('%A %d %h %H:%M') }}
Кухня - {{ states('binary_sensor.motion_sensor_13') }}. {{ states.binary_sensor.motion_sensor_13.last_changed.timestamp() | timestamp_custom('%A %d %h %H:%M') }}
Состояние Alarm system - {{ states('alarm_control_panel.home_alarm') }}
- service: alarm_control_panel.alarm_trigger
data:
entity_id: alarm_control_panel.home_alarm
# - service: script.alarm_light_on
# data: {}
- if:
- condition: and
conditions:
- condition: state
entity_id: timer.alarm_sirena_timer
state: idle
- condition: state
entity_id: timer.alarm_sirena_timer_off
state: idle
then:
# - delay:
# hours: 0
# minutes: 0
# seconds: 10
# milliseconds: 0
- service: light.turn_on
data:
brightness: 205
flash: long
rgb_color:
- 255
- 0
- 0
target:
entity_id: light.xiaomi_gateway_light
- service: timer.start
target:
entity_id:
- timer.alarm_sirena_timer
- timer.alarm_sirena_timer_off
- service: timer.start
data:
duration: "00:03:00"
target:
entity_id: timer.wallpanel_dd_timer
- service: script.alarm_light_on
data: {}
- type: turn_on
device_id: b3d
entity_id: light.samsung_galaxy_tab_3_screen
domain: light
# contact trigger
- conditions:
- condition: trigger
id: alarm_contact_sensors
sequence:
- service: notify.me_group
data:
title: Security alarm system HA
message: |
{{"\U0001F6A7"}} {{ now().strftime('%Y-%m-%d %H:%M:%S %Z') }} Двери или окна!
{{"\U0001F6AA"}} Датчики дверей/окон
Дверь - {% if is_state("binary_sensor.door_window_sensor_1b", "off") -%}
закрыта.
{%- else -%}
открыта.
{%- endif %} {{ states.binary_sensor.door_window_sensor_1b.last_updated.timestamp() | timestamp_custom('%A %d %h %H:%M') }}
Состояние Alarm system - {{ states('alarm_control_panel.home_alarm') }}
- service: alarm_control_panel.alarm_trigger
data:
entity_id: alarm_control_panel.home_alarm
- if:
- condition: and
conditions:
- condition: state
entity_id: timer.alarm_sirena_timer
state: idle
- condition: state
entity_id: timer.alarm_sirena_timer_off
state: idle
then:
- delay:
hours: 0
minutes: 0
seconds: 10
milliseconds: 0
- service: light.turn_on
data:
brightness: 205
flash: long
rgb_color:
- 255
- 0
- 0
target:
entity_id: light.xiaomi_gateway_light
- service: timer.start
target:
entity_id:
- timer.alarm_sirena_timer
- timer.alarm_sirena_timer_off
- service: timer.start
data:
duration: "00:03:00"
target:
entity_id: timer.wallpanel_dd_timer
- service: script.alarm_light_on
data: {}
- type: turn_on
device_id: bd
entity_id: light.samsung_galaxy_tab_3_screen
domain: light
default: []
mode: single
По сути переводим панель alarm в статус pending и отправляем уведомление в телегу что именно сработало, запускаем таймеры сирены и таймер отключения сирены через 10 минут.
Автоматизация которая через 10 минут отключает сирену:
# автоматизация сигнализация не отключена за время pending - ТРЕВОГА
- id: alarm_sirena_after_trigger
alias: alarm_sirena_after_trigger
description: автоматизация сигнализация не отключена за время pending - ТРЕВОГА
trigger:
# отработка таймера включения сирены
- platform: event
event_type: timer.finished
event_data:
entity_id: timer.alarm_sirena_timer
id: alarm_sirena_timer_finished
# отработка таймера выключения сирены
- platform: event
event_type: timer.finished
event_data:
entity_id: timer.alarm_sirena_timer_off
id: alarm_sirena_timer_off_finished
condition: []
action:
- choose:
# включаем сирену
- conditions:
- condition: trigger
id: alarm_sirena_timer_finished
sequence:
- service: notify.me_group
data:
title: Security alarm system HA
message: |
{{"\U0001F6A7"}} {{ now().strftime('%Y-%m-%d %H:%M:%S %Z') }}
Прошла минута сигнализация не выключена..
Включаю сирену!
Состояние Alarm system - {{ states('alarm_control_panel.home_alarm') }}
- service: xiaomi_aqara.play_ringtone
data:
gw_mac: gw_mac
ringtone_id: '0'
ringtone_vol: 100
# выключаем сирену если за 10 минут сигнализация не отключена и сирена все еще воет
- conditions:
- condition: trigger
id: alarm_sirena_timer_off_finished
sequence:
- service: notify.me_group
data:
title: Security alarm system HA
message: |
{{"\U0001F6A7"}} {{ now().strftime('%Y-%m-%d %H:%M:%S %Z') }}
Прошлао 10 минут сигнализация ВСЕ ЕЩЕ не выключена..
Отключаю сирену сирену! Бедные соседи!
Состояние Alarm system - {{ states('alarm_control_panel.home_alarm') }}
- service: light.turn_off
data: {}
target:
entity_id:
- light.yeelight_1
- light.yeelight_2
- light.xiaomi_gateway_light
- service: timer.cancel
target:
entity_id:
- timer.alarm_sirena_timer
- timer.alarm_sirena_timer_off
default: []
mode: single
Эта автоматизация сделана специально - иногда когда никого нет дома, срабатывает датчик движения на кота, сигнализация сначала переводится в режим Pending - минуту ждет отключения сигнализации, если это не произошло, то включается сирена и мигание шлюзом и цветными лампочками, но т.к. никто домой не пришел, вся это свисто-пляска будет продолжаться до момента прихода кого-нибудь домой, того кто отключит сигнализацию. Поэтому я сделал так, что если это "ложное срабатывание", то сигнализация переводится в предыдущий режим охраны через десять минут.
Чтобы понять логику работы сигнализации в НА я использовал
статью Creating a Home Alarm System with Home Assistan. Scott Helme. Правда пришлось переработать все практически полностью, но эта статья дает хорошее понимание как работает штатная control alarm в Home Assistant.