Найти в Дзене
DigitalComfort

Таймлапс с камер наблюдения - автоматизация Home Assistant

В предыдущей статье я рассказал как получать регулярные снимки с камер наблюдения и отправлять их в Telegram: Но всё же такой способ просмотра архива снимков не всегда оказывается удобным - иногда нужно просмотреть большой период за один раз, но быстро. Листать ленту в Телеграме в этом случае становится уже утомительно. Хотелось иметь возможность просматривать суточный архив снимков просто запустив видео, как будто бы это архив с видеорегистратора, но ускоренный по времени - таймлапс. Я отыскал способ создания таких видео - с помощью замечательного компонента Imagedirectory, написанного специально для Home Assistant разработчиком, видимо озадаченным той же проблемой, что и я: Сразу оговорюсь - этот метод крайне прожорлив с точки зрения вычислительных ресурсов системы. И это у меня был тот самый момент, когда мне пришлось перевести Home Assistant с Raspberry Pi на мини ПК, так как малинка уже не тянула процесс обработки большого числа файлов при создании видео. На странице компонента в
Оглавление

В предыдущей статье я рассказал как получать регулярные снимки с камер наблюдения и отправлять их в Telegram:

Но всё же такой способ просмотра архива снимков не всегда оказывается удобным - иногда нужно просмотреть большой период за один раз, но быстро. Листать ленту в Телеграме в этом случае становится уже утомительно. Хотелось иметь возможность просматривать суточный архив снимков просто запустив видео, как будто бы это архив с видеорегистратора, но ускоренный по времени - таймлапс.

Я отыскал способ создания таких видео - с помощью замечательного компонента Imagedirectory, написанного специально для Home Assistant разработчиком, видимо озадаченным той же проблемой, что и я:

GitHub - jodur/imagesdirectory-camera: Camera entity for images, to create a slidehow or timelapse from images in a directory. The camra support browsing manually trough the slideshow also. The creation of anmiated Gif or mp4 is also supported by services

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

Установка компонента imagedirectory

На странице компонента в GitHub нажимаем зелёную кнопку "Code", выбираем пункт "Download ZIP", скачиваем архив и распаковываем его временно куда-нибудь. Нам потребуется не весь архив, а только папка imagedirectory в нём, расположенная в архиве по пути:
imagesdirectory-camera-main\custom_components\imagedirectory.
Папку imagedirectory нужно скопировать на сервер Home Assistant и положить в папку
\config\custom_components. Полный путь должен быть таким:
\config\custom_components\imagedirectory.

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

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

Далее с помощью File Editor в файл configuration.yaml добавляем строку:
imagedirectory:
без каких бы то ни было настроек. Это просто команда для подключения компонента к системе:

-2

Сохраняем изменения в файле и проверяем в меню "Панель разработчика" -> "YAML" -> "Проверить конфигурацию". Если ошибка - удалите строку imagedirectory:, сохраните файл, снова проверьте, если нет ошибок - перезагрузите Home Assistant, затем снова внесите строку imagedirectory:, сохраните файл, проверьте, и если нет ошибок - ещё раз перезагрузите Home Assistant.

Всё, теперь компонент подключен, можно писать автоматизации. Но сначала подготовим материал для них - нам нужно организовать хранилище скриншотов с камер за сутки.

Организация хранилища снимков с камер наблюдения

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

Для этого необходимо создать для каждой камеры по две папки - одна для записи текущих снимков, другая - буферное хранение снимков за прошедшие сутки, с которыми и будет работать компонент imagedirectory. Процесс создания видео будет запускаться ежедневно в ноль часов.

У меня хранилище снимков с камер располагается не на локальном диске Home Assistant, а на удалённом NAS, которое подключено к Home Assistant (меню "Настройки" -> "Система" -> "Хранилище"):

-3

Такая удалённая папка в файловой системе Home Assistant располагается в папке /share:

-4

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

В итоге структура хранилища скриншотов у меня вот такая:

-5

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

Автоматизация создания снимков с камер

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

-6

В качестве уникального имени файла каждого снимка просто возьмём текущее время с секундами. Чтобы для каждой камеры не писать одинаковый шаблон для имени файла, я вынес его в раздел переменных (это можно сделать только в текстовом режиме редактирования автоматизации):

variables:
fname: "{{ now().strftime(\"%H%M%S\") }}.jpg"

-7

А в каждом действии "Камера: Сделать моментальный снимок" в пути вместо имени файла просто вставляем шаблон вызова этой переменной:
{{fname}}

-8

После сохранения этой автоматизации она сразу же должна начать создавать архив снимков с камер с уникальными именами файлов:

-9

Иногда бывает, что некоторые снимки не сохраняются. Это может происходить по разным причинам, но ничего страшного в этом нет. Даже если какие-то файлы будут отсутствовать, это никак не повлияет на последующее создание видео из них, просто кадров будет поменьше. У меня, например, из 4320-ти кадров в сутки, которые должны были бы сохраниться исходя из 20-секундного их интервала, за вчера для разных камер было сохранено разное и немного меньшее их количество - 4299, 4296, 4292, 4290, 4289.

Автоматизация подготовки к созданию видео

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

Как оказалось, иногда скриншоты сохраняются неверно - записываются файлы нулевого размера. При создании видео или операции перемещения на таких файлах процесс завершается ошибкой. Поэтому прежде всего нужно удалить файлы нулевого размера прямо в текущей папке создания скриншотов. Эта автоматизация у меня запускается не ровно в ноль часов, а в 23:59:10, она успевает отработать до нуля часов, но да, последние два скрина за эту минуту могут быть не проверены и это потенциальное место ошибки, хотя и с малой вероятностью.

Для удаления файлов нулевого размера используется вот такая команда, которую нужно записать в файл configuration.yaml, сохранить и перезагрузить Home Assistant:

shell_command:
delete_zero_size_files: find /share/QNAP/DailyCamPhotos -size 0c -delete

-10

Здесь поиск осуществляется по всем вложенным папкам, поэтому файлы нулевой длины будут удалены из папок всех камер.

Первым действием автоматизации выбираем эту команду, набрав в поиске её имя "delete_zero_size_files" или имя службы "shell_command". Так как обратной связи об окончании выполнения операции нет, то добавляем пятисекундное ожидание после этого действия:

-11

Далее нам нужно очистить буферные папки со скринами "old_cam" с прошлых суток. Это умеет делать компонент imagedirectory:

-12

Здесь также нет обратной связи, поэтому добавляем паузу в 10 секунд. Эту пару операций (удаление файлов и пауза) нужно выполнить для каждой папки (old_cam1, old_cam2 и т.д.).

После очистки буферных папок перемещаем в них все снимки из текущих папок:

-13

Здесь аналогично - пауза в 10 секунд после каждой операции, и повторить эту пару операций (перемещение файлов и пауза) для всех камер.

Всё, автоматизация подготовки завершена. Целиком она выглядит так (для шести камер в моём случае):

-14

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

Автоматизация создания видео

Эта автоматизация запускается у меня в 00:00:45. В тексте автоматизации добавлена переменная для шаблона имени файла видео, чтобы не писать этот шаблон внутри действия для каждой камеры. Имена видеофайлов будут иметь вид cam1_2025-02-08.mp4 - для вчерашней даты, так как сейчас уже ноль часов новой даты:

variables:
fname: "{{ (now() - timedelta(hours=24)).strftime('%Y-%m-%d') }}"

-15

Для видео нужно вручную один раз создать отдельную структуру папок:

-16

А в теле автоматизации выполнить по одному действию создания видео для каждой камеры:

-17

Так как и здесь нет обратной связи об окончании действия, то также используется пауза, но более продвинутая - не по относительному времени, а по абсолютному. Я просто запускаю процесс создания видео для каждой камеры раз в полчаса (создание видео - это длительный процесс):

-18

Последнее, шестое видео начинает создаваться у меня в 2:30 ночи. Никогда заранее не известно сколько именно времени потребуется на создание одного видеофайла, и это время всегда разное. Опытным путём установил, что в полчаса всегда влезает, хотя реальное время что-то около пятнадцати минут.

Просмотр созданных видео

Файлы mp4 можно смотреть чем угодно прямо с диска, но можно и встроить удобный просмотрщик в интерфейс Home Assistant. Я для этого использую сторонний компонент интерфейса Home Assistant - gallery-card:

GitHub - TarheelGrad1998/gallery-card: A custom card for Home Assistant that will display images and/or videos from a folder in the style of a gallery.

Установка этого компонента доступна через HACS - магазин пользовательских дополнений. О том, как установить HACS, я рассказывал здесь:

Установив этот компонент, перезагружаем Home Assistant. Затем создаём новую панель в режиме "Одна карточка на весь экран":

-19

Добавляем на панель карточку с ручной настройкой (она в самом конце списка):

-20

И вставляем текст конфигурации, заменив путь к папке с видеофайлами на свой:

type: custom:gallery-card
entities:
- media-source://media_source/qnap/DailyCamVideos/cam1
menu_alignment: Responsive
maximum_files: 4

-21

Получаем удобный плеер прямо в интерфейсе Home Assistant:

-22

Однако при увеличении числа файлов в истории (колонка справа от окна проигрывателя) этот компонент начинает сильно тормозить. Поэтому я настроил maximum_files: 4. Если нужно посмотреть что-то более старое - то тогда уже через проводник Windows любым медиаплеером:

-23

При интервале снимков с камер в 20 секунд и частоте кадров полученного видеофайла 30 кадров в секунду длительность суточного таймлапса получается 2 минуты 24 секунд. Но из-за пропуска некоторых кадров часто длительность видео оказывается на несколько секунд меньше. Ну и конечно же, не каждый движущийся объект обязательно попадёт в кадр. Кто-то может проехать, пробежать или просто быстро пройти в поле зрения камеры гораздо быстрее, чем за 20 секунд. Так что разумеется, это не полноценный видеоархив, а лишь оценочный.

Эти автоматизации у меня работают уже чуть больше года. За это время с пяти камер накопилось около 200 Гб видеофайлов. Разумеется, я не смотрю все эти видео, они создаются автоматически, и я ими пользуюсь только при необходимости что-то выяснить. Это удобно.