Статья

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

У меня уже давно имелось желание максимально автоматизировать процесс постановки и снятия охраны, а тут наткнулся на отличную статью Приручи 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, или голосом через Алису.

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

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


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

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

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

Покажите свой алгоритм?

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

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

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

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


Вернуться назад
Вернуться назад