Home Assistant. Сигнализация. v2

06 июня 2021, 16:04

У меня уже давно имелось желание максимально автоматизировать процесс постановки и снятия охраны, а тут наткнулся на отличную статью Приручи Home Assistant. Сигнализация, вдохновился идеей и решил сделать немного по-своему. 

Почему по-своему? Потому что для меня умный дом, в первую очередь, это дом, в котором мне не требуется делать то, что можно автоматизировать.

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

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

Начнем

Мне очень понравилась идея отслеживания людей в доме по наличию телефона в WiFi сети, поэтому было решено проверить, как работает этот функционал, если использовать не интеграцию, привязанную к конкретной модели роутера, а обычную команду ping. Для этого в HA имеется интеграция Ping (ICMP).

IP-адреса телефонов заранее прописал на роутере, чтобы не выдавались динамически.

device_tracker:
  - platform: ping
    hosts:
      bratan_ping: !secret mobile_bratan_ip
      mirra_ping: !secret mobile_mirra_ip

Экспериментальным путем выяснил, что появление телефона в сети детектируется примерно за 5-30 секунд после подключения телефона к WiFi сети, а отсутствие телефона - за 3-5 минут после отключения от WiFi сети. Меня данные интервалы более, чем устраивают.

Теперь создадим сенсор, который будет показывать, имеется ли кто-то дома по наличию телефонов в сети.

binary_sensor:
  - platform: template
    sensors:
      somebody_home_ping:
        friendly_name: Somebody At Home by Ping
        value_template: >
          {{ 
            is_state('device_tracker.bratan_ping', 'home') 
            or is_state('device_tracker.mirra_ping', 'home') 
          }}
        icon_template: mdi:home-account

Но кроме телефонов, наличие кого-либо в доме я буду также определять и по другим признакам, например, по наличию движения или включению света.

Для этого я заведу переключатель, который будет сбрасываться каждый раз, когда закрывается входная дверь (возможно, кто-то ушел или пришел), и взводится при срабатывания признаков (значит, кто-то все-таки в доме есть).

Список признаков, в данном случае, необходимо определить самостоятельно. Для себя я выделил следующие признаки:

  • Наличие движения по датчикам движения.
  • Включение лампочек света.
  • Включение выключателей.

input_boolean:
  somebody_home:
    name: Somebody At Home
    icon: mdi:home-account

automation:
  # Включаем признак присутствия, если было изменение одного из состояний датчиков
  - alias: Somebody At Home On
    id: somebody_at_home_on
    mode: single
    max_exceeded: silent
    trigger:
      - platform: state
        entity_id: 
          - switch.switch_bath_out_switch_left
          - switch.switch_bath_out_switch_right
          - binary_sensor.door_bath_contact
          - binary_sensor.door_pantry_contact
          - binary_sensor.move_bath_occupancy
          - binary_sensor.move_corridor_occupancy
          - binary_sensor.move_room_occupancy
          - binary_sensor.move_kitchen_occupancy
          - light.switch_room
          - light.switch_kitchen
          - light.lightbulb_pantry_light
          - light.lightbulb_bath_light
          - light.light_corridor
        to: 'on'
    condition: 
      - condition: state
        entity_id: binary_sensor.door_home_contact
        state: 'off'
      - condition: state
        entity_id: input_boolean.somebody_home
        state: 'off'
    action:
      - service: input_boolean.turn_on
        data:
          entity_id: input_boolean.somebody_home
  
  # Выключаем признак присуствия после закрытия входной двери
  - alias: Somebody At Home Off
    id: somebody_at_home_off
    trigger:
      - platform: state
        entity_id: binary_sensor.door_home_contact
        from: 'on'
        to: 'off'
    condition: 
      - condition: state
        entity_id: input_boolean.somebody_home
        state: 'on'
    action:
      - service: input_boolean.turn_off
        data:
          entity_id: input_boolean.somebody_home

Отлично, у нас теперь есть два независимых признака определения того, что кто-то есть в доме:
  • по телефонам - это точно хозяева и они скорее всего дома ("скорее всего" потому что имеется задержка на отключение);
  • по признакам (датчикам) - кто-то дома.

Сразу хочу отметить, что еще имеется вариант установки на каждый телефон приложения Home Assistant и анализ сенсоров с телефонов, например, там же есть SSID подключенной сети, или например GPS, что можно использовать дополнительно для определения прихода/ухода хозяев. Но в данном случае, опять же экспериментальным путем, выявил, что передача данных от сенсоров с телефона может занимать от 5 до 15 минут, что для меня лично много. Да и супруге ставить лишнее приложение на телефон не особо хотелось.

Ну что же, теперь можно приступать к реализации самой охраны.

Машина состояний модуля охраны

Я также решил использовать функционал в виде штатной интеграции alarm_control_panel, но немного по-иному интерпретировав имеющиеся состояния.

Используемые состояния:

  • DISARM - режим охраны отключен.
  • ARM_HOME - промежуточное состояние, переход на охрану. В данном состоянии нам нужно дополнительно удостовериться, что надо включать охрану. Анализируется наличие движения в доме.
  • ARM_AWAY - охрана включена.

alarm_control_panel:
  - platform: manual
    name: Alarm Home
    #code: "1234" 
    arming_time: 0 # Время в сек переходов между состояниями
    delay_time: 60 # Время в секундах после триггера на снятие с охраны
    trigger_time: 20 # Время нахождения в состоянии тревоги, после которого возврат в исходное
    disarm_after_trigger: true # Возврат на состояние "Снято с охраны" после срабатывания тревоги
    disarmed:
      trigger_time: 0 # Переход в состояние Тревоги запрещен
    armed_home:
      delay_time: 0 # Снятие без задержки

И самое интересное - автоматизации на переходы по состояниям. 

В них я постарался учесть различные ситуации, которых не хватало в предыдущей статье: телефоны на зарядке, кратковременный приход/уход, уменьшение задержки перед включением.

# ----------- СОСТОЯНИЕ DISARM - СНЯТО С ОХРАНЫ ------------

# Включаем постановку под охрану при закрытии двери
- alias: Alarm Set Armed Home
  id: alarm_disarm_to_arm_home
  trigger:
    - platform: state
      entity_id: binary_sensor.door_home_contact
      from: 'on'
      to: 'off'
  condition:
    - condition: state
      entity_id: alarm_control_panel.alarm_home
      state: disarmed
  action:
    - choose:
        # Ставим на охрану, если телефоны не в сети
        - conditions:
            - condition: state
              entity_id: binary_sensor.somebody_home_ping
              state: 'off'
          sequence:
            # Ждем появления движения ( на случай если телефоны были выключены,
            # но кто дома есть - например встречает гостей)
            - wait_template: "{{ is_state('input_boolean.somebody_home', 'on') }}"
              timeout: "00:02:00"
            - choose:
              # Если в доме движения нет, то включается охрана
              - conditions: "{{ not wait.completed }}"
                sequence:
                  - service: alarm_control_panel.alarm_arm_away
                    target:
                      entity_id: alarm_control_panel.alarm_home
                      
                  - service_template: notify.mobile_app_phone
                    data_template:
                      title: "Охрана"
                      message: "Постановка на охрану - Вне дома"
              default: []

        # Переводим в режим постановки на охрану, если телефоны в домашней сети
        - conditions:
            - condition: state
              entity_id: binary_sensor.somebody_home_ping
              state: 'on'
          sequence:
            - service: alarm_control_panel.alarm_arm_home
              target:
                entity_id: alarm_control_panel.alarm_home
                
            - service_template: notify.mobile_app_phone
              data_template:
                title: "Охрана"
                message: "Постановка на охрану - В доме"


# ----------- СОСТОЯНИЕ ARM_HOME - ПОСТАНОВКА НА ОХРАНУ ------------

# Снимаем постановку на охрану, если сработали сенсоры
- alias: Alarm Armed Home to Disarm
  id: alarm_arm_home_to_disarm
  trigger:
    - platform: state
      entity_id: input_boolean.somebody_home
      from: 'off'
      to: 'on'
  condition:
    - condition: state
      entity_id: alarm_control_panel.alarm_home
      state: armed_home
  action:
    - service: alarm_control_panel.alarm_disarm
      target:
        entity_id: alarm_control_panel.alarm_home

    - service_template: notify.mobile_app_phone
      data_template:
        title: "Охрана"
        message: "Постановка на охрану отменена"


# Ставим на охрану, когда уходим из дома (телефоны отключились от WiFi)
- alias: Alarm Set Armed Away
  id: alarm_arm_home_to_arm_away
  trigger:
    - platform: state
      entity_id: binary_sensor.somebody_home_ping
      from: 'on'
      to: 'off'
  condition:
    - condition: state
      entity_id: alarm_control_panel.alarm_home
      state: armed_home
  action:
    - service: alarm_control_panel.alarm_arm_away
      target:
        entity_id: alarm_control_panel.alarm_home

    - service_template: notify.mobile_app_phone
      data_template:
        title: "Охрана"
        message: "Постановка на охрану - Вне дома"


# ----------- СОСТОЯНИЕ ARM_AWAY - ПОД ОХРАНОЙ ------------

# Снимаем с охраны, если мы пришли домой (телефоны обнаружены в сети WiFi)
- alias: Alarm Set Disarm
  id: alarm_arm_away_to_disarm
  trigger:
    - platform: state
      entity_id: binary_sensor.door_home_contact
      from: 'off'
      to: 'on'
  condition:
    - condition: state
      entity_id: alarm_control_panel.alarm_home
      state: arm_away
    - condition: state
      entity_id: binary_sensor.somebody_home_ping
      state: 'on'
  action:
    - service: alarm_control_panel.alarm_disarm
      target:
        entity_id: alarm_control_panel.alarm_home

    - service_template: notify.mobile_app_phone
      data_template:
        title: "Охрана"
        message: "Снято с охраны (дверь)"


# Если сработка датчиков, когда под охраной
- alias: Alarm Pending On
  id: alarm_pending_on
  trigger:
    - platform: state
      entity_id: input_boolean.somebody_home
      from: 'off'
      to: 'on'
  condition:
    - condition: state
      entity_id: alarm_control_panel.alarm_home
      state: armed_away
  action:
  
    - choose:
      # Если нас нет дома, то включаем переход в режим тревоги
      - conditions:
          - condition: state
            entity_id: binary_sensor.somebody_home_ping
            state: 'off'
        sequence:
          - service: alarm_control_panel.alarm_trigger
            target:
              entity_id: alarm_control_panel.alarm_home
      
          - service_template: notify.mobile_app_phone
            data_template:
              title: "Охрана"
              message: "Внимание! Сработка сигнализации! У вас 60 сек на отключение"
      
          - service: media_player.volume_set
            entity_id: 
              - media_player.yandex_station_max
              - media_player.yandex_station_mini
            data:
              volume_level: 0.8
      
          - service: media_player.play_media
            entity_id: 
              - media_player.yandex_station_max
              - media_player.yandex_station_mini
            data:
              media_content_id: 'Внимание! Сработка сигнализации! У вас 60 сек на отключение'
              media_content_type: text
              
      # Если кто-то из нас дома, то выключаем охрану
      - conditions:
          - condition: state
            entity_id: binary_sensor.somebody_home_ping
            state: 'on'
        sequence:
          - service: alarm_control_panel.alarm_disarm
            target:
              entity_id: alarm_control_panel.alarm_home
      
          - service_template: notify.mobile_app_phone
            data_template:
              title: "Охрана"
              message: "Снято с охраны"


# ----------- СОСТОЯНИЕ PENDING - СРАБОТАЛА СИГНАЛИЗАЦИЯ ------------

# Если прийти когда дом под охраной и уйти до сирены (телефон не успел появиться в сети или отключен), то надо снова ставить на охрану
- alias: Alarm Pending To Arm Away
  id: alarm_pending_to_arm_away
  trigger:
    - platform: state
      entity_id: binary_sensor.door_home_contact
      from: 'on'
      to: 'off'
  condition:
    - condition: state
      entity_id: alarm_control_panel.alarm_home
      state: pending
  action:
    - service: alarm_control_panel.alarm_arm_away
      target:
        entity_id: alarm_control_panel.alarm_home
        
        
# Если телефон появился в сети, когда произошла сработка
- alias: Alarm Pending To Disarm
  id: alarm_pending_to_disarm
  trigger:
    - platform: state
      entity_id: binary_sensor.somebody_home_ping
      from: 'off'
      to: 'on'
  condition:
    - condition: state
      entity_id: alarm_control_panel.alarm_home
      state: pending
  action:
    - service: alarm_control_panel.alarm_disarm
      target:
        entity_id: alarm_control_panel.alarm_home
  
    - service_template: notify.mobile_app_phone
      data_template:
        title: "Охрана"
        message: "Снято с охраны после сработки датчиков"


# Отключение сработки в ручном режиме
# Например по нажатию какой-нибудь кнопки, но можно придумать и поинтереснее
- alias: Alarm Pending Off
  id: alarm_pending_off
  trigger:
    - platform: state
      entity_id: switch.switch_to_disarm
      from: 'off'
      to: 'on'
  condition:
    - condition: state
      entity_id: alarm_control_panel.alarm_home
      state: pending
  action:
    - service: alarm_control_panel.alarm_disarm
      target:
        entity_id: alarm_control_panel.alarm_home

    - service_template: notify.mobile_app_phone
      data_template:
        title: "Охрана"
        message: "Внимание! Сработка сигнализации отключена!"
        
    - service: media_player.volume_set
      entity_id: 
        - media_player.yandex_station_max
        - media_player.yandex_station_mini
      data:
        volume_level: 0.8

    - service: media_player.play_media
      entity_id: 
        - media_player.yandex_station_max
        - media_player.yandex_station_mini
      data:
        media_content_id: 'Внимание! Сработка сигнализации отключена!'
        media_content_type: text


# ----------- ВКЛЮЧЕНИЕ/ВЫКЛЮЧЕНИЕ СИРЕНЫ ------------

# Сработка не отключена - Включаем сирену
- alias: Alarm Triggered On
  id: alarm_triggered_on
  trigger:
    - platform: state
      entity_id: alarm_control_panel.alarm_home
      to: 'triggered'
  condition: []
  action:
    - service: media_player.play_media
      entity_id: 
        - media_player.yandex_station_max
        - media_player.yandex_station_mini
      data:
        media_content_id: <speaker audio="alice-sounds-things-siren-1.opus">
        media_content_type: dialog

    - service_template: notify.mobile_app_phone
      data_template:
        title: "Охрана"
        message: "Внимание! Сработка сирены!"


# Сработка закончена - Выключаем сирену 
- alias: Alarm Triggered Off
  id: alarm_triggered_off
  trigger:
    - platform: state
      entity_id: alarm_control_panel.alarm_home
      from: 'triggered'
  condition: []
  action:
    - service: media_player.media_stop
      entity_id: 
        - media_player.yandex_station_max
        - media_player.yandex_station_mini

    - service_template: notify.mobile_app_phone
      data_template:
        title: "Охрана"
        message: "Внимание! Сирена отключена!"

Итог

Я постарался реализовать алгоритмы постановки/снятия режима охраны, которые в большинстве случаев будут работать без вмешательства человека. Желающие всегда смогут добавить альтернативные варианты постановки/снятия охраны, например, через Telegram, или голосом через Алису.

Надеюсь, кому-то данная статья окажется полезной, а я всегда буду рад услышать позитивную критику.

Всем спасибо и пусть ваш умный дом остается в безопасности!


Все новости мира умных домов - t.me/SprutAI_News или Instagram
Остались вопросы? Мы в Telegram - @SprutAI

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
  1. Антон Григорьев (Infinity)

    Эх, нам бы на Sprut сигнализацию, я под неё уже два датчика движения Hue купил и датчик дыма Ксяоми-Хоневелл.

  2. Антон Киселёв (Whilser)
    Антон Киселёв (Whilser) 11 дней назад

    Зачем так сложно? Зачем эмулировать устаревшие паттерны взаимодействия с охранными системами? Само приложение Home assistant является хорошим трекером по GPS (по крайне мере на iPhone, не ведре я думаю тоже норм). Зачем ее как-то дополнительно отключать если само наличие маячка является признаком присутствия хозяев, зачем всем сообщать что она сработала или отключена? Зачем сирена? Она ведь никуда не ведет. Чтоб потенциальный злоумышенник выдернул ее? Пинг? Что за нестабильная система, может проще использовать bluetooth маячки? 

    Если автор новичок, то ок, пускай "музицирует", но столько лишнего кода и телодвижений для банальных автоматизаций.. 

  3. (niagwahe)
    (niagwahe) 4 дня назад

    Пинг действительно странновато работал, особенно на raspberry pi. Помимо уже упомянутого выше GPS в приложении есть отличный Life360, а ещё трекинг смартчасов/браслетов можно добавить.

    • Владимир Лесных (Bratan)

      Расскажите пожалуйста в чем у вас проявлялась странноватость работы ping на raspberry? У меня тоже стоит на raspberry pi 4b и работает по описанному алгоритму в статье. Иных особенностей не замечал.

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

      • (niagwahe)
        (niagwahe) 4 дня назад

        Всё периодически висло намертво. Прекратилось, когда отключил отслеживание через пинг (у меня там ещё компьютеры пинговались). Но это на 3B+ (посчастливилось взять за недели до релиза 4), плюс до перехода на SSD, а HA известен своей любовью к SD-картам.

К списку статей

Тематические чаты

Похожие статьи

17 декабря 2019, 17:49
Универсальный привод для автоматического удаленного открытия окон с простой интеграцией в умные дома.
15 ноября 2018, 09:42
Способы автоматизации механических ворот
25 сентября 2020, 11:49
Сенсорный монитор для управления умным домом. Настройка и использование.
20 октября 2018, 22:57
Теоретические основы протокола MQTT и описание того, как он работает и для чего используется
30 августа 2019, 07:28
Несколько нетривиальных способов использования датчика открытия окон/дверей от Xiaomi/Aqara.
24 августа 2018, 12:18
Пошаговая установка HomeAssistant
15 ноября 2018, 13:11
Xiaomi Mi Remote 360 добавляем Apple HomeKit
28 августа 2018, 09:48
От голого Raspbian до веб-интерфейса homebridge за четыре команды в терминале.
27 августа 2018, 10:14
Интегрируем ХА в HomeKit
03 октября 2018, 22:03
Как собрать и настроить Hyperion Ambilight - адаптивную подсветку ТВ.