user10950986

user10950986

Пикабушник
Дата рождения: 9 августа
464 рейтинг 6 подписчиков 0 подписок 2 поста 1 в горячем
Награды:
Пикабу 17 лет!
13

Я просто хотел услышать «ворота открыты». Теперь у меня дома маленький дата-центр⁠⁠

После истории с домофоном Hikvision я почему-то решил, что самое сложное уже позади.

Это была очень самоуверенная мысль.

На этот раз задача звучала вообще безобидно: когда открываются ворота, Яндекс Станция должна сказать:

«Ворота открыты».

А если их забыли закрыть — напомнить.

Казалось бы: одно состояние, одна автоматизация, одна фраза.

В итоге у меня появились Proxmox, Home Assistant, Frigate, Asterisk, отдельный событийный видеоархив, VPN и камера, которая периодически обнаруживала автомобили там, где автомобилей нет.

С чего всё начиналось

В доме уже были:

— привод ворот;

— видеодомофон Hikvision;

— регистратор и восемь камер;

— Яндекс Станция Max;

— небольшой CHUWI HeroBox на Intel N100 с 8 ГБ оперативной памяти.

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

Хотелось наоборот: заставить уже купленное оборудование разговаривать друг с другом.

Центральной логикой стал Home Assistant.

На HeroBox установил Proxmox и разнёс сервисы. Home Assistant занимается автоматизациями, видео/AI-контур живёт в отдельной VM, Asterisk — отдельно, VPN — отдельно.

Сам Proxmox стараюсь держать чистым. Если сервер одновременно является гипервизором, файловой помойкой, веб-сервером, VPN, системой видеонаблюдения и местом, куда «временно поставил одну утилиту», слово «временно» обычно означает «навсегда».

Вот так выглядит мой «маленький дата-центр». Красота укладки кабелей в список достижений пока не входит.

Вот так выглядит мой «маленький дата-центр». Красота укладки кабелей в список достижений пока не входит.

Базовая идея простая: NVR пишет всё 24/7, Frigate анализирует выбранные камеры, MQTT передаёт события, а Home Assistant уже решает, что делать дальше.

Базовая идея простая: NVR пишет всё 24/7, Frigate анализирует выбранные камеры, MQTT передаёт события, а Home Assistant уже решает, что делать дальше.

Первая победа: ворота заговорили

Home Assistant видит состояние ворот.

Когда они открываются, колонка в доме сообщает об этом голосом.

Казалось бы — готово.

Конечно, с первого раза ничего не заработало.

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

Проверил реальные состояния сущности, переделал триггер.

И Яндекс Станция наконец произнесла:

«Ворота открыты».

Потрачено времени: неприлично много.

Количество слов в результате: два.

Удовлетворение инженера: максимальное.

Потом я зачем-то добавил камеры

У калитки есть камера. На въезде тоже.

Следующая мысль была вполне логичной: если перед калиткой появился человек или к дому подъехал автомобиль — почему бы системе самой это не понять?

Для анализа видео поставил Frigate.

Детекция работает через OpenVINO, а проверенные потоки аппаратно декодируются Intel QSV. Для маленького N100 это существенно: если заставить процессор программно пережёвывать несколько видеопотоков одновременно, он довольно быстро объяснит, что маленький мини-ПК не является серверной стойкой с двумя Xeon.

Хотя я постепенно пытаюсь убедить его в обратном.

Все восемь камер через аналитику я не гоняю.

Hikvision NVR продолжает делать то, что умеет хорошо: непрерывно записывает камеры на собственный диск.

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

И тут началось самое интересное.

Автомобиль Шрёдингера

Frigate присылает событие:

«Обнаружен автомобиль».

Открываю кадр.

Автомобиля нет.

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

Реальное ложное событие: уведомление car есть, автомобиля в кадре нет.

Реальное ложное событие: уведомление car есть, автомобиля в кадре нет.

Начинаю настраивать.

Ограничиваю зоны.

Меняю минимальный размер объекта.

Фильтрую неподвижные машины.

Исключаю парковочное место.

Корректирую детекцию.

Frigate:

«Автомобиль».

Я:

«Где?!»

Отдельная история — автомобиль, который действительно стоит во дворе.

Для человека он припаркован.

Для нейросети это прекрасная возможность через некоторое время снова торжественно сообщить:

«Я нашёл машину!»

Да. Ту самую. Она никуда не уезжала.

Постепенно выяснилось, что нормальная видеоаналитика — это не настройка одного параметра confidence.

Нужна комбинация:

— правильной зоны;

— размера объекта;

— фильтра неподвижных объектов;

— геометрии кадра;

— разумного FPS детекции;

— понимания, какое событие вообще имеет смысл считать новым.

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

То есть умный дом — это не когда техника никогда не ошибается.

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

Что в итоге уже умеет дом

Сейчас Home Assistant связывает между собой довольно разные системы.

Открылись ворота — появляется нужная реакция.

Человек у калитки — система определяет событие.

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

Важные события с камер приходят на телефон.

Параллельно работает отдельный событийный архив: person и car сохраняются примерно по 30 секунд, событие открытия ворот — примерно минутой. Непрерывная запись NVR при этом остаётся отдельным слоем.

Часть домашних сценариев доступна через Telegram-бота.

Удалённый доступ к внутренней сети сделан через VPN, а не через россыпь открытых наружу портов.

Реальные события автомобиля и человека у калитки.

Реальные события автомобиля и человека у калитки.

Telegram — не «второй умный дом», а удобный интерфейс к Home Assistant: состояние, комнаты, камеры, режимы и быстрые действия.

Telegram — не «второй умный дом», а удобный интерфейс к Home Assistant: состояние, комнаты, камеры, режимы и быстрые действия.

При этом я специально не пытаюсь заставить Home Assistant заменить вообще всё.

Регистратор пишет видео.

Frigate анализирует.

MQTT переносит события.

Home Assistant принимает решение.

Asterisk занимается телефонией.

VPN занимается доступом.

Каждый слой делает свою работу.

Если аналитика временно остановится, регистратор не перестанет записывать камеры.

Мне такая схема нравится значительно больше, чем одна огромная система, падение которой превращает весь «умный дом» в выставку бесполезных датчиков.

Самый полезный вывод оказался довольно скучным

Когда начинаешь делать умный дом, очень легко пойти от оборудования.

Увидел красивый датчик.

Купил.

Потом пытаешься придумать, зачем он нужен.

У меня намного лучше работает обратный подход.

Сначала проблема.

Потом автоматизация.

Забывают закрывать ворота — голосовое напоминание.

Нужно знать, кто подошёл к калитке — камера и детекция.

Нужно быстро найти событие — отдельный архив.

Нужен удалённый доступ — VPN.

Нужна единая логика — Home Assistant.

А уже потом выбирается железо.

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

Что дальше

Сейчас продолжаю доводить видеоаналитику, события автомобилей, архив и интерфейсы управления.

Отдельно собираю полноценный экран умного дома для телевизора — с реальной планировкой, состояниями помещений, камерами и событиями.

Но его покажу только тогда, когда он станет полностью рабочим интерфейсом, а не красивой картинкой «в разработке».

После этого про него будет отдельная история.

Ещё впереди сценарии по комнатам, гостевой режим, дальнейшая работа с автомобилями и номерами и отдельный нормальный разбор самого N100: сколько сервисов на нём живёт, что происходит под нагрузкой и где заканчивается разумный запас дешёвого мини-ПК.

Свои короткие заметки, рабочие решения, новые автоматизации и реальные ошибки собираю в Telegram-канале «Дом без магии» — @dom_bez_magii.

Без «идеального умного дома за выходные».

Зато с настоящими проблемами, настоящим железом и периодически — автомобилями в заборе.

Магии нет. Но иногда Frigate с этим не согласен.

Показать полностью 5
337

Как я подружил Hikvision с обычной DECT-трубкой через Asterisk — двусторонний звук и открытие калитки⁠⁠

Всем привет. Хочу поделиться своим опытом, как я подружил вызывную панель Hikvision со штатным видеодомофоном, Asterisk и обычной DECT-трубкой через Keenetic.

Изначально задача казалась простой: при нажатии кнопки на калитке должен продолжать звонить штатный видеодомофон, но одновременно хотелось, чтобы звонила и обычная домашняя трубка. Причём не просто звонила, а чтобы через неё можно было нормально разговаривать с посетителем в обе стороны и клавишей # открывать замок.

В итоге всё заработало именно так, как хотелось. Но по пути пришлось разбираться с Private SIP Hikvision, нестандартной регистрацией indoor extension, анализировать PCAP и отдельно ловить проблему с RTP-портами.

Что у меня за оборудование

Домофония:

вызывная панель Hikvision DS-KV6113-PE1(C) — 192.168.1.76;

штатный видеодомофон HiWatch VDP-H3212W — 192.168.1.192.

Телефония:

роутер Keenetic / Netcraze Ultra NC-1812;

DECT-модуль и обычные беспроводные трубки;

основная трубка первого дома — внутренний номер 101.

Сервер:

мини-ПК CHUWI HeroBox на Intel N100;

8 ГБ RAM;

Proxmox VE;

Asterisk запущен отдельно в LXC 100;

версия Asterisk 22.10.1;

IP Asterisk — 192.168.1.95.

Сам сервер у меня используется не только для телефонии. На нём отдельно живут Home Assistant и Frigate, поэтому я изначально не хотел ставить Asterisk прямо на Proxmox-хост.

Логика простая: каждый сервис в своём контейнере или VM. Если я что-то сломаю, экспериментируя с телефонией, Home Assistant, видеонаблюдение и сам Proxmox продолжают работать.

Почему я не стал переводить панель в обычный SIP

Самый очевидный вариант — включить на панели Standard SIP и зарегистрировать её напрямую в Asterisk.

Но мне хотелось не заменить штатную систему Hikvision, а дополнить её.

То есть сохранить:

штатный вызов на VDP-H3212W;

видео с панели;

видео ещё до ответа;

родное открытие замка;

всю внутреннюю логику Hikvision.

И параллельно добавить обычную DECT-трубку.

Поэтому Standard SIP на панели я оставил выключенным.

Именно это решение потом и привело к более интересному варианту — подключить Asterisk не как SIP-сервер для панели, а как дополнительную indoor extension Hikvision.

Почему пришлось лезть в PCAP

На этом этапе стало понятно, что обычным SIP здесь всё не ограничивается.

Панель продолжала прекрасно звонить на штатный VDP-H3212W, но Asterisk этот вызов не видел. Через Home Assistant можно было поймать событие нажатия кнопки и отдельно заставить Asterisk позвонить на 101, но это был просто дополнительный звонок — без нативного аудио с панели.

Такой вариант меня не устраивал.

Поэтому я снял сетевой захват штатного рабочего вызова прямо на Hikvision и начал смотреть, что реально происходит между устройствами.

И тут выяснилось, что у Hikvision внутри своя довольно интересная схема.

Реальные внутренние SIP-номера у меня оказались такие:

Вызывная панель: 10010100000

VDP-H3212W: 10010110001

А сама панель использует не только обычный SIP-порт 5060, но ещё и собственный private SIP proxy на 5065.

Штатный вызов выглядел примерно так:

DS-KV6113

192.168.1.76:5060

|

v

Hikvision Private SIP

192.168.1.76:5065

|

v

VDP-H3212W

192.168.1.192:5060

То есть внутри это действительно SIP, но со своей логикой, XML-сообщениями, Digest-аутентификацией и довольно нетипичным поведением.

Именно по PCAP стало понятно, что правильнее не пытаться насильно превращать саму панель в обычный SIP-телефон, а встроиться в родную архитектуру Hikvision.

Следующая находка оказалась ключевой: Asterisk можно зарегистрировать как indoor extension у штатного видеодомофона.

Как Asterisk стал indoor extension Hikvision

У VDP-H3212W есть возможность зарегистрировать дополнительное внутреннее устройство.

В моём случае Asterisk зарегистрирован как:

10000000005

То есть итоговая логика получилась такая:

DS-KV6113

|

v

VDP-H3212W

|

+--> indoor extension 10000000005

|

v

Asterisk

|

v

Keenetic / DECT 101

Для регистрации пришлось использовать отдельный Python-скрипт, потому что обычного SIP REGISTER оказалось недостаточно: Hikvision ждёт дополнительный XML-блок с данными устройства.

Пример XML:

<regXML>

<version>V2.0.0</version>

<regDevName>Asterisk</regDevName>

<regDevSerial>Q12345678</regDevSerial>

<regDevMacAddr>00:0c:29:12:12:12</regDevMacAddr>

</regXML>

После Digest-аутентификации регистрация проходит нормально:

REGISTER

401 Unauthorized

REGISTER + Authorization

200 OK

После этого VDP начинает отправлять вызов на Asterisk.

На Asterisk входящий вызов попадает в отдельный context и дальше уходит на DECT 101.

Пример dialplan:

[hikvision-indoor-in]

exten => 10000000005,1,NoOp(Hikvision indoor call)

same => n,Progress()

same => n,Set(CALLERID(num)=105)

same => n,Set(CALLERID(name)=Gate)

same => n,Dial(PJSIP/101,40)

same => n,Hangup()

На этом этапе трубка уже начала звонить.

Но дальше началась самая неприятная часть — звук.

Почему сначала был односторонний звук

Hikvision в моём случае упорно использовал для аудио порт:

UDP 9654

В SDP панели было:

m=audio 9654 RTP/AVP 0 8 101

То есть PCMU, PCMA и DTMF.

Проблема в том, что Asterisk по умолчанию выбирает для RTP случайный порт из своего диапазона.

Например:

10516

14112

17510

Но Hikvision при этом всё равно отправлял аудио на:

192.168.1.95:9654

Получалось так:

101 -> Asterisk -> панель

работает,

а:

панель -> Asterisk -> 101

не работает.

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

Первый фикс

На endpoint Hikvision я зафиксировал RTP-диапазон:

rtp_port_start=9654

rtp_port_end=9656

После этого Asterisk начал реально слушать порт 9654, и звук с панели появился.

Но тут проявилась вторая проблема.

У меня было включено:

rtp_symmetric=yes

Asterisk увидел входящий RTP и решил отправлять ответный звук на адрес источника медиапакетов.

В итоге голос с трубки уходил не на саму панель 192.168.1.76, а на VDP 192.168.1.192.

Хотя в SDP было явно указано:

c=IN IP4 192.168.1.76

m=audio 9654

Финальный фикс

Рабочая комбинация получилась такой:

rtp_port_start=9654

rtp_port_end=9656

rtp_symmetric=no

direct_media=no

После этого Asterisk:

принимает аудио панели на 9654;

не переучивает адрес назначения;

отправляет обратный RTP туда, куда указано в SDP, то есть на саму панель 192.168.1.76:9654.

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

Что получилось в итоге

Сейчас схема работает полностью так, как я изначально хотел.

При нажатии кнопки на калитке:

штатный VDP-H3212W продолжает звонить как раньше;

одновременно звонит обычная DECT-трубка 101;

вызов можно принять на трубке;

звук работает в обе стороны;

разговор держится стабильно;

клавишей # на DECT-трубке открывается замок калитки.

То есть обычная беспроводная трубка фактически стала полноценной аудиотрубкой домофона, при этом штатная Hikvision-система не была сломана и продолжает работать в своём родном режиме.

Почему Home Assistant я не использовал для самого разговора

Home Assistant у меня тоже установлен и Hikvision с ним интегрирован.

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

Но для самого разговора HA здесь не нужен.

Через HA я мог сделать только такую логику:

Нажали кнопку

|

v

Home Assistant

|

v

Asterisk

|

v

DECT 101

Трубка бы звонила, но родной аудиопоток Hikvision туда не попадал бы.

Поэтому сам разговор реализован на уровне SIP/RTP, а Home Assistant оставлен для будущей автоматизации.

Почему вообще выбрал Asterisk

У меня два дома на одном участке, находятся примерно в 15 метрах друг от друга.

Поэтому дальше хочется сделать уже нормальную домашнюю телефонию:

Дом 1

|

+--> DECT 101

Дом 2

|

+--> свой внутренний номер

Калитка

|

+--> нужные трубки

+--> видеодомофон

+--> уведомления

Плюс хочется связать всё это с Home Assistant, Frigate, камерой у калитки, Алисой и телевизором.

И вот здесь Asterisk оказался гораздо интереснее любой закрытой аппаратной мини-АТС: всю логику можно менять программно.

Что бы я посоветовал тем, кто захочет повторить

Самый полезный вывод из всей этой истории — не пытаться угадывать, как Hikvision работает внутри.

Сначала лучше снять PCAP штатного рабочего вызова и посмотреть:

INVITE

SDP

RTP

MESSAGE

Digest

реальные номера устройств

реальные IP и порты

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

Особенно важными оказались:

rtp_port_start=9654

rtp_port_end=9656

rtp_symmetric=no

direct_media=no

Без первого фикса Asterisk слушал не тот RTP-порт.

Без второго — отправлял голос не на панель, а на VDP.

Что дальше

Следующий этап — подключить второй дом и уже нормально развести внутреннюю нумерацию.

После этого хочу добавить:

звонок с калитки

|

+--> VDP

+--> DECT

+--> Home Assistant

+--> уведомление на телефон

+--> Алиса

+--> камера на ТВ

Пока главное уже сделано — родной Hikvision работает, DECT работает, двусторонний звук есть, замок открывается с трубки.

Если кому-то будет интересно, могу отдельным постом выложить уже полностью готовые конфиги Asterisk, регистрацию indoor extension и примеры SIP/RTP-логов.

Может, кому-то с таким же Hikvision это сэкономит пару вечеров с Wireshark :)

Показать полностью 3
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества