Блог

Доработка оповещений в Telegtam со snapshot камер слежения

Предыстория. Приобрел я комплект видеонаблюдения Reolink. Несколько камер и NVR. Добавление в Home assistant не составило особого труда, используя стандартную интеграцию, даже при условии, что камеры имели внутренний IP рекордера. Для каждой камеры код имел следующий вид:

camera: - platform: generic name: camera_fram still_image_url: "http://192.168.1.XXX/cgi-bin/api.cgi?cmd=Snap&channel=X&rs=95270001DWZS2M8Y&user=user&password=password" stream_source: "rtsp://user:password@192.168.1.XXX:554//h264Preview_X_sub"

Однако пользуюсь я кастомным компонентом Reolink IP camera. Кроме самих камер, он позволяет добавить датчики движения на основе обнаружения движения моими камерами. В описании компонента все это есть.

Встал вопрос, как это можно использовать. Сразу захотелось, чтобы ХА присылал оповещение об активности в зоне видеонаблюдения в Telegram. Ну и соответственно прикреплял картинку с камеры. Я хотел именно картинку. Видео я могу посмотреть подключившись к NVR. Но тут возникло две проблемы.
Первая: вопрос с "мусором", на который срабатывает камера. Опадающая листва, свет фар, пролетающая птичка и многое другое приводят к активации сенсора.
Вторая: Сервис camera.snapshot: оказался совершенно непригодным для этих целей, поскольку у него была задержка как и у видеопотока от 5 до 10 секунд.

Я подумал, что все очень просто и с первой проблемой справится условие, что сенсор активен в течение определенного времени, а со второй - прямая ссылка still_image_url: для каждой камеры (поскольку задержка в этом случае менее секунды).
Ну и для каждой камеры при выполнении условия, что ДД активен более ХХ секунд будет такой action:

- service: notify.telegram_stephan data: message: "Обнаружено движение вблизи дома." data: photo: - url: http://192.168.1.243/cgi-bin/api.cgi?cmd=Snap&channel=2 &rs=95270001DWZS2M8Y&user=user&password=password caption: "Кажется, к нам гости."

Но оказалось, что это абсолютно бесполезная автоматизация, поскольку в 99% срабатываний я получал картинку без признаков движения. Все логично, ведь снимок с камеры делался после ХХ секунд активности сенсора. А с учетом задержки, еще больше. К тому времени все уже "уходило".

Задача: Как только камера обнаруживает движение она делает снимок, а если движение продолжается более ХХ секунд, то в Telegram приходит именно этот снимок, сделанный ХХ секунд назад.

Решение: Поскольку хотелось сократить код до минимума (камер много, а будет еще больше), то пришлось проделать небольшие предварительные манипуляции с бинарниками (теми, которые ДД с камер).
В каждый бинарник а добавил attribute_templates: , в котором указана ссылка на статичную картинку с камеры (не мудрствовал и сделал аналогично первому примеру)

- platform: template sensors: motion_cam_1: friendly_name: Camera 1 motion device_class: motion value_template: "{{ is_state('camera.camera_1', 'motion') }}" attribute_templates: still_image_url: "http://192.168.1.ХХХ/cgi-bin/api.cgi?cmd=Snap&channel=1&rs=95270001DWZS2M8Y&user=user&password=password" delay_off: seconds: 1

Для каждой камеры делается свой URL. У меня NVR, поэтому меняется только channel=. Если камеры подключены напрямую, то будет меняться IP. Смотрите сами.

Теперь, для сохранения картинок я использовал сервис downloader.download_file
Если такого нет, то нужно в configuration.yaml добавить:

downloader: download_dir: www/downloads

Теперь можно перегружаться и делать автоматизации. Их всего две. Первая делает быстрый snapshot, вторая отсылает его при выполнении условия (условия на ваше усмотрение)

- alias: 'Camera alarm snapshot' trigger: - platform: state entity_id: - binary_sensor.motion_cam_1 - binary_sensor.motion_cam_2 - binary_sensor.motion_cam_3 - binary_sensor.motion_cam_4 from: 'off' to: 'on' action: - service: downloader.download_file data_template: url: "{{ trigger.to_state.attributes.still_image_url }}" filename: '{}.jpg' overwrite: true

- alias: 'Camera_alarm' trigger: - platform: state entity_id: - binary_sensor.motion_cam_1 - binary_sensor.motion_cam_2 - binary_sensor.motion_cam_3 - binary_sensor.motion_cam_4 to: 'on' for: "00:00:07" condition: - condition: state entity_id: group.family state: 'not_home' action: - service: notify.telegram_stephan data: message: "Обнаружено движение вблизи дома." data: photo: - file: /config/www/downloads/{}.jpg caption: "Кажется, к нам гости."

После этого, количество ложных срабатываний снизилось до 1%.
Насколько я знаю, у камер других производителей тоже есть возможность подключения ДД в Home assistant. Надеюсь, это кому то поможет.


Жаль модель "E1 Pro" не поддерживается :(

Да, компонент не поддерживает Е1 и Е1pro (подключённые напрямую), поскольку на них нельзя зайти через браузер. У меня все камеры подключены к NVR. А через него компонент видит и Е1 pro и даже Е1. 

Попробуйте Doods, ложные срабатывания уменьшите к 0.1% + можете задать на что именно реагировать ( авто, люди, животные, предметы ). А дальше можно пойти по пути определения лиц, но это совсем другая история, и выдавать сразу кто приехал


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