Сигнализация в Home Assistant с функцией дозвона на телефон

Сигнализация в Home Assistant с функцией дозвона на телефон

Продолжаю сагу про охрану дома. В прошлый раз я рассказывал о настройке видеонаблюдения с motionEye, а сегодня уделю внимание сигнализации в Home Assistant.

В этой статье я в основном буду описывать свой опыт, поэтому сразу в общих чертах расскажу, как у меня все устроено:

  1. В прихожей установлена камера видеонаблюдения, а на входной двери размещен геркон.
  2. При открывании двери или при обнаружении камерой движения, на телефон отправляется уведомление.
  3. Если в течение двух минут на это уведомление никак не отреагировать, то умный дом начнет названивать на телефон раз в 5 минут.
  4. Есть специальный ночной режим, в котором дозвон происходит сразу — без двухминутного ожидания.
  5. Звонилка работает без интернета — за счет 3G модема, подключенного к домашнему серверу.
  6. Камера и сервер 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, для которого можно сразу добавить карточку в интерфейсе:

Панель сигнализации в Home Assistant

Alarm Control Panel может переключаться между различными состояниями, но пока понадобятся только эти:

  1. disarmed — охрана снята.
  2. armed_away /armed_night — под охраной в режиме «не дома» или в ночном режиме.
  3. pending — когда проникновение было обнаружено, но еще есть пара минут (delay_time), чтобы снять сигнализацию.
  4. 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.

Видеонаблюдение для умного дома с motionEye
В этой статье я расскажу как установить motionEye и интегрировать камеру видеонаблюдения в качестве «датчика движения» в Home Assistant.

Как превратить камеру в датчик движения, рассказано в предыдущей статье.

Сразу добавим автоматизацию и для ночного режима:

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. Если приложение уже установлено и настроено, то отправка уведомлений должна работать из коробки:

Отправка уведомлений через панель разработчика Home Assistant
Тест отправки уведомлений через панель разработчика.

Добавим оповещение, когда сигнализация перешла в pending или triggered:

automation:
  - id: function_notify_me_when_alarm_is_pending
    alias: "Notify me when alarm is in pending or triggered state"
    trigger:
      platform: state
      entity_id: alarm_control_panel.home_alarm
      to: ['pending', 'triggered', 'disarmed']
    action:
      service: notify.mobile_app_t676k
      data_template:
        title: "Сигнализация"
        message: >
          {% if trigger.to_state.state == 'pending' %}
            Обнаружено проникновение{% if is_state('binary_sensor.0x00158d0002b82f82_contact', 'on') %} (входная дверь открыта){% endif %}.
          {% elif trigger.to_state.state == 'triggered' %}
            Тревога!
          {% else %}
            clear_notification
          {% endif %}
        data:
          image: "https://<ссылка на motionEye>/picture/1/current/?_username=admin&_signature=<токен>"
          sticky: true
          importance: "high"
          channel: "Security alarm"
          notification_icon: "mdi:lock-alert"
          tag: "security-alarm"
          actions:
            - action: "HOME_MODE"
              title: "Снять с охраны" # про это чуть позже

Для Home Assistant на Android. На iOS дополнительные параметры будут отличаться.

Думаю, здесь стоит немного пояснить. Помимо отдельных оповещений для pending и triggered так же отправляется clear_notification, когда сигнализация переходит в disarmed. Отправка clear_notification просто удалит предыдущее уведомление после снятия сигнализации с охраны.

Кроме того, при срабатывании сигнализации на телефоне отобразится картинка с камеры видеонаблюдения:

Уведомление о срабатывании сигнализации

Ссылку на изображение можно взять в настройках motionEye:

URL снимка в motionEye

Дозвон на телефон

По сути, наша сигнализация уже работает, но уведомление на телефоне можно и не заметить. Другое дело если телефон будет непрерывно звонить. Поначалу для дозвона я долгое время пользовался сервисом Twilio, который легко интегрируется с Home Assistant, но позже я приспособил старенький 3G модем в качестве звонилки.

Не могу сказать, что Twilio чем-то плох, но он стоит денег, а еще гипотетически домашний интернет может отвалиться в неподходящий момент. Так как 3G модем у меня уже был, то я сдул с него пыль и настроил дозвон через него.

Настройка интеграции с модемом

Вообще, прежде чем сделать дозвон через Home Assistant, я использовал модем вместе с Gammu SMSD для получения СМСок на старую симку. Помимо работы с СМСками в Gammu есть поддержка звонков, но с моим модемом этот функционал не заработал 😕

🧠
При вызове gammu dialvoice <номер телефона> на модем отправляется команда ATDT<номер телефона>, но мой модем ожидает ATD вместо ATDT.

Я поизучал код Gammu и в целом там все логично: если в ответ на ATDT модем вернул ошибку, то Gammu пытается дозвониться еще раз, но уже используя ATD. Проблема в том, что мой модем не отвечает ошибкой на ATDT. И не звонит...

В итоге вместо Gammu я написал небольшую интеграцию — Home Assistant GSM Call. Установить ее можно, как обычно, через HACS. Для этого добавьте пользовательский репозиторий black-roland/homeassistant-gsm-call и скачайте интеграцию под названием gsm_call. Чуть подробнее процесс установки описан на странице проекта.

Пишем интеграцию для Home Assistant — дозвон через GSM-модем
Поддержать донатом и закинуть оповещение на стрим:https://www.donationalerts.com/r/mansmarthomeМОИ РЕСУРСЫСтатьи в блоге: https://mansmarthome.info/Анонсы и…

Кстати, интеграцию я писал в прямом эфире на YouTube. Подписывайтесь, ставьте лайки 😉

Для настройки интеграции достаточно добавить в configuration.yaml вот это:

notify:
  - name: call
    platform: gsm_call
    device: /dev/serial/by-id/usb-HUAWEI_Technology_HUAWEI_Mobile-if02-port0 # путь до модема
    at_command: ATD # измените на ATDT, если звонки не проходят

Может в будущем сделаю настройку через GUI, но пока никто не просил 🙂

Для применения новой конфигурации нужно перезапустить Home Assistant, а чтобы все протестировать, вызовите службу notify.call с указанием номера телефона в качестве target:

Вызов службы notify.call из панели разработчика Home Assistant

Через несколько секунд вызываемый телефон должен зазвонить. По умолчанию интеграция пытается дозваниваться примерно в течение 30 секунд.

ℹ️
Перед настройкой интеграции потребуется отключить (или удалить) ModemManager из-за того, что он занимает интерфейс модема, и интеграция не может к этому модему подключиться.

Но ModemManager установлен не всегда, поэтому возможно ничего удалять не придется.
ℹ️
Так же для некоторых модемов от Huawei может понадобиться обновить параметры usb_modeswitch. Подробности в комментариях.

Трезвоним каждые 5 минут

Осталось только научить умный дом звонить при срабатывании сигнализации. Для этого первым делом изменим конфиг, который мы добавили ранее:

notify:
  - name: call
    platform: gsm_call
    device: /dev/serial/by-id/usb-HUAWEI_Technology_HUAWEI_Mobile-if02-port0
    at_command: ATD

  - name: call_me
    platform: group
    services:
      - service: call
        data:
          target: "+4815162342"

И привяжем номер телефона.

А затем настроим дозвон при срабатывании сигнализации:

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 минут, пока вы не выключите сигнализацию.

Автоматическая постановка и снятие с охраны

В статье про отслеживание местоположения я приводил пару примеров использования такого отслеживания: для выключения электроприборов, когда все ушли из дома, и для автоматической постановки дома на охрану. Пришла пора объединить все вместе.

Простое отслеживание местоположения в Home Assistant
Используя информацию о подключенном WiFi.

Для начала определим 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

В итоге если дом не успеет сняться с охраны автоматически, то это можно сделать вручную, нажав на соответствующую кнопку в уведомлении:

Уведомление о срабатывании сигнализации

Я использую такую сигнализацию уже давно. Мы с ней прошли через огонь, воду и медные трубы, и она меня еще не подводила 🙂

Так как статья получилась достаточно длинная, то я не стал описывать дополнительные фишки. Поэтому про уведомления об изменении состояния сигнализации и дополнительные кнопки на панели управления я подготовлю отдельную небольшую статью.

Кстати, еще я сейчас тестирую немного другой метод отслеживания присутствия — по результатам отпишусь.

man smart-home
Блог про умный дом: идеи, девайсы, Home Assistant. Ссылки: https://taplink.cc/mansmarthome

Кратко про новый метод я писал в Телеграме.

Была ли статья полезна?

Хотите сказать спасибо? Кофе автору — ваша благодарность.

На кофе
Подписка на новые статьи

Уведомления, как только в блоге появится что-нибудь интересненькое.

Подписываясь, вы даете согласие на обработку персональных данных.