Дверной глазок

Дверной глазок


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

Наконец-то мечта была реализована в полном объёме, итоговый монитор дверного глазка выглядит так (да, я в курсе что горизонт завален, баланс белого провален)

Монитор дверного глазка



Ниже описан процесс достижения результата.



Для начала закупился оборудованием.

Дверь Эльбор Премиум с отделкой панелями изнутри и снаружи

Хотел купить именно Эльбор, т.к. у них есть сертификат взломостойкости и стоят они более-менее адекватно. Фактически брал одну из последних в Томске дверей, поэтому особого выбора не было. Тем не менее дверь отлично вписалась в интерьер квартиры и позволила впихать в себя OrangePi + Дисплей + Глазок

Миникомпьютер с Linux на борту

Для отображения решил использовать что-то с Linux. Взял Orange Pi 3 LTS 2G8G EMMC с HDMI+WIFI+BT 5.0. Сейчас понимаю, что надо было брать что-то посерьёзнее, плата еле справляется с отображением H264+ 780p / 10fps

Orange Pi 3 LTS

Дверной глазок-камера с Ethernet

Сейчас именно такой в продаже не смог найти. Мне важно было чтобы подключение было по проводам (не доверяю я всем этим вашим вайфаям). Описание с Aliexpress:

1080P HD дверной глазок с отверстием H.265 1,56 мм объектив широкоугольный 180 градусов сетевой мини-глазок видеонаблюдения POE дверная IP-камера P2P Onvif
Дверной глазок-камера с Aliexpress

Круглый дисплей

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

Круглый LCD дисплей с HDMI





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



После этого приступил к установке и настройке софта.



Базовая настройка вывода потока на дисплей

Мучился с разными ОС и плеерами, нужно было чтобы апельсинка могла без особых проблем проигрывать RTSP поток от камеры на дисплее. В итоге после долгих экспериментов остановился на ОС Armbian Linux и плеере MPV.

Поворот изображения

В процессе эксплуатации камера немного повернулась относительно своей оси, попытка исправить положение привела к ещё бОльшему повороту 😄

Сырой вывод с камеры

MPV умеет поворачивать изображение при помощи опции --video-rotate, поэтому получилось восстановить изображение не разбирая дверь. Также чуть увеличил изображение при помощи --video-zoom=1.2

Уменьшение лага отображения

Несмотря на пляски с MPV для уменьшения задержки, лаг достигал нескольких секунд.

Я предполагал что уменьшить лаг можно понизив разрешение и частоту кадров в настройках потока камеры. Однако не мог это сделать из-за того, что нативное web приложение камеры работает на бЪгомерзком ActiveX, а в связи с переездом на MBP M3 мой старый виндовый образ на Virtual Box перестал запускаться. У меня получилось запустить новый образ с Windows XP на Virtual Box, но на нем не завёлся ActiveX. Windows 7 же не захотел устанавливаться – процесс установки завис где-то по-середине.

К счастью, оказалось что приложение VMS позволяет управлять настройками камеры. Я снизил разрешение видео потока до 720р, fps до 10 и отключил аудио поток, лаг стал минимальным.

Вывод своих надписей на экран

MPV для вывода надписей на экран предлагает использовать механизм OSD (on screen display), однако вопрос был в том, как динамически менять надписи при просмотре потокового видео. Выяснилось, что MPV умеет обрабатывать команды переданные по IPC если запустить его в режиме сервера с прослушиванием сокета --input-ipc-server=/path/to/some.sock
Т.е. для вывода любого текста в любой момент времени достаточно послать в сокет команду смены OSD и всё будет в шоколаде.

Вывод текущего времени

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

При оживлении часов выяснилось, что после выполнения команды set osd-msg1, на экране на секунду появляется отладочное сообщение osd-msg1: 'some-message'. Т.к. для мигания двоеточия требуется выполнять данную команду раз в секунду, то такое сообщение будет выводиться на экране постоянно.

Артефакты после выполнения команды set

Что ж, есть и другой механизм для текста - командой show-text 'some text' можно вывести что-либо под OSD блоком. Используя show-text без проблем вывести любую строку на экран.


Одну...


Вывести несколько строк у меня не получилось, несмотря ни на какие ухищрения. А вот set osd-msg вполне себе умеет выводить несколько строк, если разделять их \n.

Хм... а что если попробовать вывести больше строк, чем отображается на экране, с надеждой что отладочное сообщение уйдёт вниз за пределы отображаемости?

Таки да! Этот метод оказался вполне рабочим. Т.е. если отсылать в mpv команду вроде set osd-msg1 'some text\n\n\n\n\n\n\n....\n\n', то это решает проблему.

Получение текущих данных и прогноза погоды

Недолгий гуглинг показал, что есть классный сервис OpenMeteo, предоставляющий без регистраций и sms простое и удобное API для получения текущей погоды и прогноза погоды вплоть до нескольких дней. Данные на Free тарифе обновляются раз в 15 минут, этого более чем достаточно.

Т.к. на экране монитора мало места, решил выводить прогноз только на 2 и 8 часов вперёд.

Через OpenMeteo API можно получить невероятное количество данных для любой геопозиции - начиная со стандартной температуры, влажности и заканчивая температурой/влжностью почвы на глубине пол-метра и неведомым Evapotranspiration. В землю мне пока рановато, ограничился получением температуры, скорости ветра, и кода погоды (0 – ясное небо, 1 – легкие облака и т.д. и т.п.)

Код погоды

Отображение полученных погодных данных

Осталось вывести всё что требуется на экран. А места на экране практически нет. Значит будем экономить - заменять текст иконками, точнее UTF символами. Так, для ветра можно использовать стрелку ↗, направление которой будет показывать направление ветра, для облачности использовать ☁, для дождя - зонтик ☂, для снега - снежинку ❅ и т.п. Для указания силы можно использовать символы возведения в степень.

Код преобразования полученных данных решил писать на Bash, т.к. затаскивать ruby/python правильными путями показалось слишком сложным.

Преобразование кода погоды в иконку


С написанием кода определения направления ветра помог Grock, за что ему огромная нечеловеческая благодарность.

Взаимосвязь компонентов и данных представлена на рисунке ниже.

Архитектура компонент





Что в итоге?

Немного размялся на сугубо бытовой задачке, было весело и интересно. Все домашние просто в восторге от этого глазка!

Весь код выложен на GitHub.

Из оставшихся проблем - сначала для вывода было достаточно сделать выравнивание текста по центру, однако 2ч и 8ч прогнозы из-за такой настройки прогнозы могут быть визуально невыровнены, что мы и видим на первом изображении. Чтобы сделать вывод прогноза приятным для глаз, нужно будет сделать выравнивание OSD по левому краю и вывод погоды столбцами, добивая ширины пробелами. Также вероятно придётся поменять шрифт на моноширинный.




Report Page