Продолжаю сагу про охрану дома. В прошлый раз я рассказывал о настройке видеонаблюдения с motionEye, а сегодня уделю внимание сигнализации в Home Assistant.
В этой статье я в основном буду описывать свой опыт, поэтому сразу в общих чертах расскажу, как у меня все устроено:
- В прихожей установлена камера видеонаблюдения, а на входной двери размещен геркон.
- При открывании двери или при обнаружении камерой движения, на телефон отправляется уведомление.
- Если в течение двух минут на это уведомление никак не отреагировать, то умный дом начнет названивать на телефон раз в 5 минут.
- Есть специальный ночной режим, в котором дозвон происходит сразу — без двухминутного ожидания.
- Звонилка работает без интернета — за счет 3G модема, подключенного к домашнему серверу.
- Камера и сервер Home Assistant запитаны через «бесперебойник» на случай отключения электричества.
Настройка сигнализации в Home Assistant
Home Assistant предоставляет компонент Manual Alarm Control Panel, который мы и будем использовать для настройки сигнализации. В configuration.yaml пропишем:
alarm_control_panel:
- platform: manual
name: Home Alarm
code_arm_required: false
arming_time: 0
delay_time: 120
trigger_time: 360
disarmed:
trigger_time: 0
armed_night:
delay_time: 0
После перезапуска Home Assistant появится новый объект alarm_control_panel.home_alarm
, для которого можно сразу добавить карточку в интерфейсе:
Alarm Control Panel может переключаться между различными состояниями, но пока понадобятся только эти:
disarmed
— охрана снята.armed_away
/armed_night
— под охраной в режиме «не дома» или в ночном режиме.pending
— когда проникновение было обнаружено, но еще есть пара минут (delay_time
), чтобы снять сигнализацию.triggered
— тревога. Переключение на это состояние происходит автоматически, если вовремя не снять сигнализацию с охраны.
На данном этапе у нас есть только болванка сигнализации. Поэтому для начала настроим Home Assistant так, чтобы сигнализация переходила в pending
при открытии входной двери, а затем сделаем дозвон в режиме тревоги (triggered
).
Обнаружение проникновения
Добавим в configuration.yaml
первую автоматизацию. Эта автоматизация будет вызываться, когда дом под охраной в режиме «не дома» и было обнаружено проникновение:
automation:
- id: function_security_alarm_while_armed_away
alias: Trigger security alarm while armed away
trigger:
- platform: state
entity_id: binary_sensor.hall_camera_motion # камера видеонаблюдения
from: 'off'
to: 'on'
- platform: state
entity_id: binary_sensor.0x00158d0002b82f82_contact # геркон на двери
from: 'off'
to: 'on'
condition:
condition: state
entity_id: alarm_control_panel.home_alarm
state: armed_away # под охраной (не дома)
action:
service: alarm_control_panel.alarm_trigger # «дергаем» сигнализацию
entity_id: alarm_control_panel.home_alarm
То есть сигнализация переключится в pending
, если камера обнаружила движение, либо если геркон зафиксировал открытие входной двери. Если не снять дом охраны в течение 2 минут (delay_time: 120
), то сигнализация перейдет в triggered
.
Сразу добавим автоматизацию и для ночного режима:
automation:
- id: function_security_alarm_while_armed_night
alias: Trigger security alarm while armed night
trigger:
- platform: state
entity_id: binary_sensor.0x00158d0002b82f82_contact # геркон на двери
from: 'off'
to: 'on'
condition:
condition: state
entity_id: alarm_control_panel.home_alarm
state: armed_night # ночной режим
action:
service: alarm_control_panel.alarm_trigger
entity_id: alarm_control_panel.home_alarm
Здесь все то же самое, только без фиксации движения камерой, чтобы ночные похождения к холодильнику не активировали сигнализацию 🙂 Так же в ночном режиме сигнализация сразу переходит в triggered
при открывании входной двери, так как ранее мы установили delay_time: 0
для режима armed_night
.
Полдела сделано, осталось настроить уведомления и дозвон.
Уведомление при обнаружении проникновения
Уведомления на телефон я отправляю с помощью официального приложения Home Assistant. Если приложение уже установлено и настроено, то отправка уведомлений должна работать из коробки:
Добавим оповещение, когда сигнализация перешла в pending
или triggered
:
Думаю, здесь стоит немного пояснить. Помимо отдельных оповещений для pending
и triggered
так же отправляется clear_notification
, когда сигнализация переходит в disarmed
. Отправка clear_notification
просто удалит предыдущее уведомление после снятия сигнализации с охраны.
Кроме того, при срабатывании сигнализации на телефоне отобразится картинка с камеры видеонаблюдения:
Ссылку на изображение можно взять в настройках motionEye:
Дозвон на телефон
По сути, наша сигнализация уже работает, но уведомление на телефоне можно и не заметить. Другое дело если телефон будет непрерывно звонить. Поначалу для дозвона я долгое время пользовался сервисом Twilio, который легко интегрируется с Home Assistant, но позже я приспособил старенький 3G модем в качестве звонилки.
Не могу сказать, что Twilio чем-то плох, но он стоит денег, а еще гипотетически домашний интернет может отвалиться в неподходящий момент. Так как 3G модем у меня уже был, то я сдул с него пыль и настроил дозвон через него.
Настройка интеграции с модемом
Вообще, прежде чем сделать дозвон через Home Assistant, я использовал модем вместе с Gammu SMSD для получения СМСок на старую симку. Помимо работы с СМСками в Gammu есть поддержка звонков, но с моим модемом этот функционал не заработал 😕
Я поизучал код Gammu и в целом там все логично: если в ответ на ATDT модем вернул ошибку, то Gammu пытается дозвониться еще раз, но уже используя ATD. Проблема в том, что мой модем не отвечает ошибкой на ATDT. И не звонит...
В итоге вместо Gammu я написал небольшую интеграцию — Home Assistant GSM Call. Установить ее можно, как обычно, через HACS. Для этого добавьте пользовательский репозиторий black-roland/homeassistant-gsm-call
и скачайте интеграцию под названием gsm_call
. Чуть подробнее процесс установки описан на странице проекта.
Для настройки интеграции достаточно добавить в configuration.yaml
вот это:
Для применения новой конфигурации нужно перезапустить Home Assistant, а чтобы все протестировать, вызовите службу notify.call
с указанием номера телефона в качестве target
:
Через несколько секунд вызываемый телефон должен зазвонить. По умолчанию интеграция пытается дозваниваться примерно в течение 30 секунд.
Но ModemManager установлен не всегда, поэтому возможно ничего удалять не придется.
Трезвоним каждые 5 минут
Осталось только научить умный дом звонить при срабатывании сигнализации. Для этого первым делом изменим конфиг, который мы добавили ранее:
А затем настроим дозвон при срабатывании сигнализации:
alert:
security_alarm:
name: Call me repetitively while alarm is in triggered state
title: The alarm has been triggered
entity_id: alarm_control_panel.home_alarm
state: 'triggered'
repeat:
- 3
- 5
skip_first: false
can_acknowledge: false
notifiers: ['call_me']
Home Assistant позвонит на телефон сразу после того, как сигнализация перейдет в режим тревоги (triggered
), спустя 3 минуты совершит повторный звонок, а дальше будет звонить каждые 5 минут, пока вы не выключите сигнализацию.
Автоматическая постановка и снятие с охраны
В статье про отслеживание местоположения я приводил пару примеров использования такого отслеживания: для выключения электроприборов, когда все ушли из дома, и для автоматической постановки дома на охрану. Пришла пора объединить все вместе.
Для начала определим 2 скрипта в configuration.yaml
:
script:
away_mode:
alias: Turn off everything when leaving home
sequence:
- service: homeassistant.turn_off
entity_id: group.turn_off_when_leaving
- service: alarm_control_panel.alarm_arm_away
entity_id: alarm_control_panel.home_alarm
home_mode:
alias: Turn on everything when come home
sequence:
- service: homeassistant.turn_on
entity_id: group.turn_on_when_coming
- service: alarm_control_panel.alarm_disarm
entity_id: alarm_control_panel.home_alarm
group:
# Группа электроприборов, которые будут выключаться, когда никого нет дома
turn_off_when_leaving:
name: Turn off when leaving home
entities:
- light.main_room_ceiling_lights
- light.bedside_lamp
- humidifier.humidifier
# Электроприборы, которые будут включаться
turn_on_when_coming:
name: Turn on when coming home
entities:
- light.main_room_ceiling_lights
- light.bedside_lamp
- humidifier.humidifier
Эти скрипты можно использовать в нескольких местах, без необходимости дублировать одни и те же действия в разных автоматизациях.
К примеру, настроим запуск скриптов, когда person.roland
ушел из дома или вернулся:
automation:
- id: routine_away_mode
alias: "Turn off everything when leaving home"
trigger:
platform: state
entity_id: person.roland
from: "home"
action:
service: script.turn_on
entity_id: script.away_mode
- id: routine_home_mode
alias: "Turn on everything when coming home"
trigger:
platform: state
entity_id: person.roland
to: "home"
action:
service: script.turn_on
entity_id: script.home_mode
А затем используем тот же скрипт, чтобы оживить кнопку «Снять с охраны», про которую я писал выше:
automation:
- id: function_at_home_mode_from_app
alias: "At home mode from app"
trigger:
platform: event
event_type: mobile_app_notification_action
event_data:
action: "HOME_MODE"
action:
service: script.turn_on
entity_id: script.home_mode
В итоге если дом не успеет сняться с охраны автоматически, то это можно сделать вручную, нажав на соответствующую кнопку в уведомлении:
Я использую такую сигнализацию уже давно. Мы с ней прошли через огонь, воду и медные трубы, и она меня еще не подводила 🙂
Так как статья получилась достаточно длинная, то я не стал описывать дополнительные фишки. Поэтому про уведомления об изменении состояния сигнализации и дополнительные кнопки на панели управления я подготовлю отдельную небольшую статью.
Кстати, еще я сейчас тестирую немного другой метод отслеживания присутствия — по результатам отпишусь.