Home Assistant. Сигнализация, снятие/постановка по отслеживанию телефона пользователей

Оглавление

Как это работает

Шлюз Aqara 2 используется в качестве сирены и медиаплеера, который воспроизводит голосовые уведомления. Голосовые уведомлений –  фразы записаны через Yandex диалог (включает выбор персонажа и настройку настроения) и вшиты в качестве рингтонов приложением Mi Home.

Механика:

  • Я использую роутер Keenetic, для него в HA можно использовать интеграцию NDMS2, которая каждые 30 секунд сканирует сеть и отображает подключенные устройства. К таким устройствам я отнес телефоны обитателей квартиры. Также с этой интеграцией можно мониторить подключение всех устройств в сети и вывести их статус.
  • Если мы все уходим, телефон отключается от локальной сети и через 30 минут сигнализация ставится под охрану, о чем сообщает Telegram всем пользователям.
  • Когда кто-то приходит домой первым, срабатывают датчик открытия двери или движения, происходят следующие события:
    1. Если NDMS2 успел найти телефон (пока я иду от лифта) – сигнализация снимается автоматически, воспроизводится сообщение о снятии.
    2. Если NDMS2 не успел найти телефоны и датчики сработали, дается 2 минуты, за которые телефон обнаружит сеть и сигнализация снимается. Если нет, необходимо снять сигнализацию вручную.
    3. Идет сработка, шлюз неистово шумит, отправляются уведомления в Телеграм.
Визуальная часть

Панель Alarmo ручной постановки/снятия сигнализации:

Главное меню управления Alarmo:

Настройка

В качестве основной логики управления системой безопасности используется кастомное дополнение Alarmo.
На диаграмме описаны рабочие состояния сигнализации и представлен упрощенный обзор ее функциональных возможностей.

I. Добавление и настройка Alarmo

Установка и добавление интеграции.

  1. Установка
    • С помощью HACS: На панели HACS перейдите в раздел “Интеграцияи нажмите большую оранжевую кнопку +. Найдите Alarmo и нажмите Установить этот репозиторий в HACS.
    • Вручную: Загрузите последнюю версию в виде zipфайла и извлеките ее в папку custom_components в вашей программе установки HA.
  2. Перезапустите HA, чтобы загрузить интеграцию в HA.
  3. Перейдите в раздел Настройка > Устройства и службы и нажмите большую оранжевую кнопку +. Найдите Alarmo и нажмите, чтобы добавить его.
  4. Интеграция с Alarmo готова к использованию. В меню слева вы можете найти панель настройки.


Настройка Alarmo.

У каждого свои потребности, подробно останавливаться не буду. Меню для настройки интуитивно понятное, документация Alarmo отвечает на все вопросы.
Ключевое, это необходимость настройки:

  • Датчики. Это те элементы которые отслеживают состояния и заставляют срабатывать систему;
  • Коды. Настраивает пользователей, способ аутентификации и управления, кодовые значения. По сути это элементы управления карточкой постановки/снятия объекта на охрану;
  • Действия. Первичная базовая автоматизация на смену статуса объекта охраны и сработку. (Дополнительную/сложную автоматизацию всегда можно добавить отдельно в конфиге yaml, чем мы и займемся)
II. Добавление и настройка Маршрутизатора Keenetic NDMS2

Чтобы добавить маршрутизатор Keenetic в свою установку, перейдите в Настройки -> Устройства и службы в пользовательском интерфейсе, нажмите кнопку с знаком + и в списке интеграций выберите маршрутизатор Keenetic NDMS2.

III. Настройка своей карточки снятия/постановки

Я предпочитаю минимализм, поэтому мы сделаем упрощенное отображение с возможность открыть поверх дополнительных элементов (popup).

Для карточки используются кастомные элементы:

github.com/Clooos/Bubble-Card

github.com/royto/logbook-card

 

Настройка элементов происходит через интерфейс, на всякий код:

				
					type: grid
cards:
  - type: custom:bubble-card
    card_type: button
    entity: alarm_control_panel.alarmo
    sub_button:
      - tap_action:
          action: navigate
          navigation_path: "#pop-up-alarmo"
        icon: mdi:dots-horizontal
    icon: ""
    name: Сигнализация
    show_state: true
    show_attribute: true
    force_icon: false
    state_color: true
    card_layout: large
    attribute: changed_by
    styles: |
      .bubble-button-background {
      opacity: 1 !important;
      background-color: ${state === 'armed_home' ? '#3CAA3C' :
      state === 'armed_away' ? '#3CAA3C' :
      state === 'arming' ? '#FF6800' :
      state === 'triggered' ? 'red' :
      'ЦВЕТ'} !important;
      }
       ha-card {
         --bubble-select-list-background-color: #252a38 !important;
         --bubble-list-item-accent-color: #212538 !important;
         --bubble-button-border-radius: 10px !important;
       }
    double_tap_action:
      action: none
    hold_action:
      action: none
    columns: 4
    rows: "1"
    button_type: switch
    button_action:
      tap_action:
        action: more-info
    show_last_changed: true
    show_last_updated: false
  - type: vertical-stack
    cards:
      - type: custom:bubble-card
        card_type: pop-up
        hash: "#pop-up-alarmo"
        name: ""
        icon: ""
        sub_button: []
        show_name: true
        styles: ""
        show_attribute: true
        show_last_changed: false
        force_icon: false
        attribute: current_temperature
        show_state: false
        button_type: name
      - states:
          - arm_home
          - arm_away
        type: alarm-panel
        entity: alarm_control_panel.alarmo
        name: Безопасность
      - type: custom:logbook-card
        entity: sensor.last_motion_sensor
        show:
          state: true
          duration: true
          start_date: true
          end_date: true
          icon: true
          separator: true
          entity_name: true
        title: Срабатывание датчиков движения
        custom_logs: false

				
			

Добавление автоматизации

Полный код настройки:

				
					automation:

#СНЯТИЕ/ПОСТАНОВКА

  - alias: Сигнализация. Сообщение при снятии
    trigger:
      - platform: state
        entity_id: alarm_control_panel.ha_alarm
        to: 'disarmed'
    action:
      - service: xiaomi_aqara.play_ringtone
        data:
          gw_mac: 04:cf:8c:b8:8c:95
          ringtone_id: 10004
          ringtone_vol: 80

  - alias: Сигнализация. Сообщение при постановке
    trigger:
      - platform: state
        entity_id: alarm_control_panel.ha_alarm
        to: 'armed_away'
    action:
      - service: xiaomi_aqara.play_ringtone
        data:
          gw_mac: 04:cf:8c:b8:8c:95
          ringtone_id: 10005
          ringtone_vol: 80

  - alias: Сигнализация. Постановка клавишей
    trigger:
      - platform: state
        entity_id: sensor.aqara_buttom_action
        to: double
    condition:
      - condition: state
        entity_id: alarm_control_panel.ha_alarm
        state: 'disarmed'
    action:
      - service: alarm_control_panel.alarm_arm_away
        entity_id: alarm_control_panel.ha_alarm
      - service: xiaomi_aqara.play_ringtone
        data:
          gw_mac: 04:cf:8c:b8:8c:95
          ringtone_id: 10005
          ringtone_vol: 80

#ОТКРЫТИЕ ДВЕРИ. ПРЕДУПРЕЖДЕНИЯ.

  - alias: Сигнализация. Предупреждение при открытии двери
    trigger:
      - platform: state
        entity_id: binary_sensor.mi_door_sensor_contact
        to: 'on'
    condition:
      - condition: state
        entity_id: 'alarm_control_panel.ha_alarm'
        state: 'armed_away'
      - condition: and
        conditions:
          - condition: state
            entity_id: 'device_tracker.redminote9pro_niro'
            state: 'not_home'
          - condition: state
            entity_id: 'device_tracker.iphoneelizaveta'
            state: 'not_home'
    action:
      - service: xiaomi_aqara.play_ringtone
        data:
          gw_mac: 04:cf:8c:b8:8c:95
          ringtone_id: 10006
          ringtone_vol: 80


#ОТКРЫТИЕ ДВЕРИ. ОПРЕДЕЛЕНИЕ ПОЛЬЗОВАТЕЛЕЙ, СНЯТИЕ.

  - alias: Сигнализация. Опр.польз., снятие
    trigger:
      platform: state
      entity_id:
        - device_tracker.redminote9pro_niro
        - device_tracker.iphoneelizaveta
      to: 'home'
    condition:
      - condition: state
        entity_id: 'alarm_control_panel.ha_alarm'
        state: 'pending'
    action:
      - service: xiaomi_aqara.play_ringtone
        data:
          gw_mac: 04:cf:8c:b8:8c:95
          ringtone_id: 10007
          ringtone_vol: 80
      - service: alarm_control_panel.alarm_disarm
        entity_id: alarm_control_panel.ha_alarm


  - alias: Сигнализация. Опр.польз. дверь, снятие
    trigger:
      - platform: state
        entity_id: binary_sensor.mi_door_sensor_contact
        to: 'on'
    condition:
      - condition: state
        entity_id: 'alarm_control_panel.ha_alarm'
        state: 'armed_away'
      - condition: or
        conditions:
          - condition: state
            entity_id: 'device_tracker.redminote9pro_niro'
            state: 'home'
          - condition: state
            entity_id: 'device_tracker.iphoneelizaveta'
            state: 'home'
    action:
      - service: xiaomi_aqara.play_ringtone
        data:
          gw_mac: 04:cf:8c:b8:8c:95
          ringtone_id: 10007
          ringtone_vol: 80
      - service: alarm_control_panel.alarm_disarm
        entity_id: alarm_control_panel.ha_alarm

  - alias: Сигнализация. Опр.польз. движение, снятие
    trigger:
      - platform: state
        entity_id: binary_sensor.aqara_motion_occupancy
        to: 'on'
    condition:
      - condition: state
        entity_id: 'alarm_control_panel.ha_alarm'
        state: 'armed_away'
      - condition: or
        conditions:
          - condition: state
            entity_id: 'device_tracker.redminote9pro_niro'
            state: 'home'
          - condition: state
            entity_id: 'device_tracker.iphoneelizaveta'
            state: 'home'
    action:
      - service: xiaomi_aqara.play_ringtone
        data:
          gw_mac: 04:cf:8c:b8:8c:95
          ringtone_id: 10007
          ringtone_vol: 80
      - service: alarm_control_panel.alarm_disarm
        entity_id: alarm_control_panel.ha_alarm

#ПЕРЕВОД НА СРАБАТЫВАНИЕ

  - alias: Сигнализация. Перевод на срабатывание при открытии двери
    trigger:
      - platform: state
        entity_id: binary_sensor.mi_door_sensor_contact
        to: 'on'
    condition:
      - condition: state
        entity_id: 'alarm_control_panel.ha_alarm'
        state: 'armed_away'
      - condition: and
        conditions:
          - condition: state
            entity_id: 'device_tracker.redminote9pro_niro'
            state: 'not_home'
          - condition: state
            entity_id: 'device_tracker.iphoneelizaveta'
            state: 'not_home'
    action:
      - service: alarm_control_panel.alarm_trigger
        entity_id: alarm_control_panel.ha_alarm

  - alias: Сигнализация. Перевод на срабатывание при движении
    trigger:
      - platform: state
        entity_id: binary_sensor.aqara_motion_occupancy
        to: 'on'
    condition:
      - condition: state
        entity_id: 'alarm_control_panel.ha_alarm'
        state: 'armed_away'
      - condition: and
        conditions:
          - condition: state
            entity_id: 'device_tracker.redminote9pro_niro'
            state: 'not_home'
          - condition: state
            entity_id: 'device_tracker.iphoneelizaveta'
            state: 'not_home'
    action:
      - service: alarm_control_panel.alarm_trigger
        entity_id: alarm_control_panel.ha_alarm

#СРАБАТЫВАНИЕ ПАРАМЕТРЫ

  - alias: Сигнализация. Срабатывание. Уведомления в телеграм
    trigger:
      platform: state
      entity_id: alarm_control_panel.ha_alarm
      to: 'triggered'
    condition:
      condition: time
      after: '09:00:00'
      before: '00:00:00'
    action:
      - service: xiaomi_aqara.play_ringtone
        data:
          gw_mac: 04:cf:8c:b8:8c:95
          ringtone_id: 10008
          ringtone_vol: 80
      - service: notify.telegram_nikita
        data_template:
          title: '*🚨ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
          message: "Срабатывание датчиков, несанкционированное проникновение."
      - service: notify.telegram_liza
        data_template:
          title: '*🚨ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
          message: "Срабатывание датчиков, несанкционированное проникновение."
      - delay: '00:05:00'
      - service: notify.telegram_nikita
        data_template:
          title: '*🚨ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
          message: "Срабатывание датчиков, несанкционированное проникновение."
      - service: notify.telegram_liza
        data_template:
          title: '*🚨ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
          message: "Срабатывание датчиков, несанкционированное проникновение."
      - delay: '00:05:00'
      - service: notify.telegram_nikita
        data_template:
          title: '*🚨ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
          message: "Срабатывание датчиков, несанкционированное проникновение."
      - service: notify.telegram_liza
        data_template:
          title: '*🚨ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
          message: "Срабатывание датчиков, несанкционированное проникновение."


#ЗАБЫЛИ ПОСТАВИТЬ?
  - alias: Сигнализация. Телеграм. Забыли поставить?
    trigger:
    - platform: state
      entity_id: 'device_tracker.redminote9pro_niro'
      to: 'not_home'
      for: "00:30:00"
    - platform: state
      entity_id: 'device_tracker.iphoneelizaveta'
      to: 'not_home'
      for: "00:30:00"
    condition:
      - condition: state
        entity_id: alarm_control_panel.ha_alarm
        state: 'disarmed'
      - condition: and
        conditions:
          - condition: state
            entity_id: 'device_tracker.redminote9pro_niro'
            state: 'not_home'
          - condition: state
            entity_id: 'device_tracker.iphoneelizaveta'
            state: 'not_home'
    action:
      - service: alarm_control_panel.alarm_arm_away
        entity_id: alarm_control_panel.ha_alarm
      - service: notify.telegram_nikita
        data_template:
          title: '*🚨ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
          message: "Похоже дом опустел, ставлю на сигнализацию."
          data:
            inline_keyboard:
              - 'Отменить поставноку на сигнализацию:/alarm3'
      - service: notify.telegram_liza
        data_template:
          title: '*🚨ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
          message: "Похоже дом опустел, ставлю на сигнализацию."
          data:
            inline_keyboard:
              - 'Отменить поставноку на сигнализацию:/alarm3'


#  - alias: Сигнализация. Забыли поставить? Для телефона Лизы
#    trigger:
#      platform: state
#      entity_id: 'device_tracker.iphoneelizaveta'
#      to: 'not_home'
#      for: "00:30:00"
#    condition:
#      - condition: state
#        entity_id: alarm_control_panel.ha_alarm
#        state: 'disarmed'
#      - condition: state
#        entity_id: 'device_tracker.redminote9pro_niro'
#        state: 'not_home'
#
#    action:
#      - service: notify.telegram_nikita
#        data:
#          title: '*ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
#          message: "Похоже вы забыли поставить на сигнализацию. Что предпринять?"
#          data:
#            inline_keyboard:
#              - 'Ничего. Все в порядке:/alarm1'
#              - 'Поставить на сигнализацию:/alarm2'
#      - service: notify.telegram_liza
#        data:
#          title: '*ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
#          message: "Похоже вы забыли поставить на сигнализацию. Что предпринять?"
#          data:
#            inline_keyboard:
#              - 'Ничего. Все в порядке:/alarm1'
#              - 'Поставить на сигнализацию:/alarm2'



#реакция на выбор в телеграм
  - alias: Сигнализация. Телеграм, все в порядке
    trigger:
      platform: event
      event_type: telegram_callback
      event_data:
        command: '/alarm1'
    action:
      - service: notify.telegram_nikita
        data_template:
          title: '*🚨ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
          message: "Получена команда: Все в порядке."
      - service: notify.telegram_liza
        data_template:
          title: '*🚨ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
          message: "Получена команда: Все в порядке."

  - alias: Сигнализация. Телеграм, установить сигнализацию.
    trigger:
      platform: event
      event_type: telegram_callback
      event_data:
        command: '/alarm2'
    action:
      - service: alarm_control_panel.alarm_arm_away
        entity_id: alarm_control_panel.ha_alarm
      - service: notify.telegram_nikita
        data_template:
          title: '*🚨ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
          message: "Получена команда. Установить сигнализацию."
      - service: notify.telegram_liza
        data_template:
          title: '*🚨ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
          message: "Получена команда. Установить сигнализацию."

  - alias: Сигнализация. Телеграм, отмена.
    trigger:
      platform: event
      event_type: telegram_callback
      event_data:
        command: '/alarm3'
    action:
      - service: alarm_control_panel.alarm_disarm
        entity_id: alarm_control_panel.ha_alarm
      - service: notify.telegram_nikita
        data_template:
          title: '*🚨ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
          message: "Получена команда. Отменить поставноку на сигнализацию."
      - service: notify.telegram_liza
        data_template:
          title: '*🚨ОПОВЕЩЕНИЕ СИГНАЛИЗАЦИИ:*'
          message: "Получена команда. Отменить поставноку на сигнализацию."
				
			

Это пример, вооружайтесь и используйте под свои нужды.