В предыдущей статье я рассказал как получать регулярные снимки с камер наблюдения и отправлять их в Telegram:
Но всё же такой способ просмотра архива снимков не всегда оказывается удобным - иногда нужно просмотреть большой период за один раз, но быстро. Листать ленту в Телеграме в этом случае становится уже утомительно. Хотелось иметь возможность просматривать суточный архив снимков просто запустив видео, как будто бы это архив с видеорегистратора, но ускоренный по времени - таймлапс.
Я отыскал способ создания таких видео - с помощью замечательного компонента Imagedirectory, написанного специально для Home Assistant разработчиком, видимо озадаченным той же проблемой, что и я:
Сразу оговорюсь - этот метод крайне прожорлив с точки зрения вычислительных ресурсов системы. И это у меня был тот самый момент, когда мне пришлось перевести 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:
без каких бы то ни было настроек. Это просто команда для подключения компонента к системе:
Сохраняем изменения в файле и проверяем в меню "Панель разработчика" -> "YAML" -> "Проверить конфигурацию". Если ошибка - удалите строку imagedirectory:, сохраните файл, снова проверьте, если нет ошибок - перезагрузите Home Assistant, затем снова внесите строку imagedirectory:, сохраните файл, проверьте, и если нет ошибок - ещё раз перезагрузите Home Assistant.
Всё, теперь компонент подключен, можно писать автоматизации. Но сначала подготовим материал для них - нам нужно организовать хранилище скриншотов с камер за сутки.
Организация хранилища снимков с камер наблюдения
Для того, чтобы сделать видео суточного таймлапса, нам нужно в один момент времени иметь в наличии все снимки с камер за сутки.
Для этого необходимо создать для каждой камеры по две папки - одна для записи текущих снимков, другая - буферное хранение снимков за прошедшие сутки, с которыми и будет работать компонент imagedirectory. Процесс создания видео будет запускаться ежедневно в ноль часов.
У меня хранилище снимков с камер располагается не на локальном диске Home Assistant, а на удалённом NAS, которое подключено к Home Assistant (меню "Настройки" -> "Система" -> "Хранилище"):
Такая удалённая папка в файловой системе Home Assistant располагается в папке /share:
В момент создания скриншота он сохраняется сразу на сетевое хранилище, минуя запись в локальную папку, под уникальным именем. Но для данной задачи не принципиально, где именно будут сохраняться снимки с камер, в локальной папке или удалённой. Это просто к сведению, что и так тоже можно делать.
В итоге структура хранилища скриншотов у меня вот такая:
Эту структуру нужно создать вручную один раз, меняться она не будет, и никаких лишних проверок на существование этих папок в автоматизациях я не делаю, чтобы не усложнять алгоритм.
Автоматизация создания снимков с камер
Автоматизация для создания снимков с камер очень похожа на автоматизацию из прошлой статьи. Там для каждой камеры нужно было создавать скриншоты с одинаковым именем файла и отправлять их в Телеграм. Теперь же нам нужно создавать скриншоты с уникальными именами файлов в течение всех суток и сохранять в структуре папок хранилища, которое мы организовали ранее:
В качестве уникального имени файла каждого снимка просто возьмём текущее время с секундами. Чтобы для каждой камеры не писать одинаковый шаблон для имени файла, я вынес его в раздел переменных (это можно сделать только в текстовом режиме редактирования автоматизации):
variables:
fname: "{{ now().strftime(\"%H%M%S\") }}.jpg"
А в каждом действии "Камера: Сделать моментальный снимок" в пути вместо имени файла просто вставляем шаблон вызова этой переменной:
{{fname}}
После сохранения этой автоматизации она сразу же должна начать создавать архив снимков с камер с уникальными именами файлов:
Иногда бывает, что некоторые снимки не сохраняются. Это может происходить по разным причинам, но ничего страшного в этом нет. Даже если какие-то файлы будут отсутствовать, это никак не повлияет на последующее создание видео из них, просто кадров будет поменьше. У меня, например, из 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
Здесь поиск осуществляется по всем вложенным папкам, поэтому файлы нулевой длины будут удалены из папок всех камер.
Первым действием автоматизации выбираем эту команду, набрав в поиске её имя "delete_zero_size_files" или имя службы "shell_command". Так как обратной связи об окончании выполнения операции нет, то добавляем пятисекундное ожидание после этого действия:
Далее нам нужно очистить буферные папки со скринами "old_cam" с прошлых суток. Это умеет делать компонент imagedirectory:
Здесь также нет обратной связи, поэтому добавляем паузу в 10 секунд. Эту пару операций (удаление файлов и пауза) нужно выполнить для каждой папки (old_cam1, old_cam2 и т.д.).
После очистки буферных папок перемещаем в них все снимки из текущих папок:
Здесь аналогично - пауза в 10 секунд после каждой операции, и повторить эту пару операций (перемещение файлов и пауза) для всех камер.
Всё, автоматизация подготовки завершена. Целиком она выглядит так (для шести камер в моём случае):
Из-за такого числа пауз вся эта автоматизация длится около двух минут. Не самое оптимальное решение, наверняка это можно сделать как-то быстрее.
Автоматизация создания видео
Эта автоматизация запускается у меня в 00:00:45. В тексте автоматизации добавлена переменная для шаблона имени файла видео, чтобы не писать этот шаблон внутри действия для каждой камеры. Имена видеофайлов будут иметь вид cam1_2025-02-08.mp4 - для вчерашней даты, так как сейчас уже ноль часов новой даты:
variables:
fname: "{{ (now() - timedelta(hours=24)).strftime('%Y-%m-%d') }}"
Для видео нужно вручную один раз создать отдельную структуру папок:
А в теле автоматизации выполнить по одному действию создания видео для каждой камеры:
Так как и здесь нет обратной связи об окончании действия, то также используется пауза, но более продвинутая - не по относительному времени, а по абсолютному. Я просто запускаю процесс создания видео для каждой камеры раз в полчаса (создание видео - это длительный процесс):
Последнее, шестое видео начинает создаваться у меня в 2:30 ночи. Никогда заранее не известно сколько именно времени потребуется на создание одного видеофайла, и это время всегда разное. Опытным путём установил, что в полчаса всегда влезает, хотя реальное время что-то около пятнадцати минут.
Просмотр созданных видео
Файлы mp4 можно смотреть чем угодно прямо с диска, но можно и встроить удобный просмотрщик в интерфейс Home Assistant. Я для этого использую сторонний компонент интерфейса Home Assistant - gallery-card:
Установка этого компонента доступна через HACS - магазин пользовательских дополнений. О том, как установить HACS, я рассказывал здесь:
Установив этот компонент, перезагружаем Home Assistant. Затем создаём новую панель в режиме "Одна карточка на весь экран":
Добавляем на панель карточку с ручной настройкой (она в самом конце списка):
И вставляем текст конфигурации, заменив путь к папке с видеофайлами на свой:
type: custom:gallery-card
entities:
- media-source://media_source/qnap/DailyCamVideos/cam1
menu_alignment: Responsive
maximum_files: 4
Получаем удобный плеер прямо в интерфейсе Home Assistant:
Однако при увеличении числа файлов в истории (колонка справа от окна проигрывателя) этот компонент начинает сильно тормозить. Поэтому я настроил maximum_files: 4. Если нужно посмотреть что-то более старое - то тогда уже через проводник Windows любым медиаплеером:
При интервале снимков с камер в 20 секунд и частоте кадров полученного видеофайла 30 кадров в секунду длительность суточного таймлапса получается 2 минуты 24 секунд. Но из-за пропуска некоторых кадров часто длительность видео оказывается на несколько секунд меньше. Ну и конечно же, не каждый движущийся объект обязательно попадёт в кадр. Кто-то может проехать, пробежать или просто быстро пройти в поле зрения камеры гораздо быстрее, чем за 20 секунд. Так что разумеется, это не полноценный видеоархив, а лишь оценочный.
Эти автоматизации у меня работают уже чуть больше года. За это время с пяти камер накопилось около 200 Гб видеофайлов. Разумеется, я не смотрю все эти видео, они создаются автоматически, и я ими пользуюсь только при необходимости что-то выяснить. Это удобно.