Неофициальный API клиент для системы «Умный Дом.ру» (Эр-Телеком / Дом.ру) с веб-интерфейсом, видеостримингом и детекцией звонков через SIP.
Rust бэкенд + HTML/JS фронтенд. Один бинарник, без runtime-зависимостей.
RU: Данный проект создан исключительно в образовательных целях и для личного использования. Проект не аффилирован с ПАО «Эр-Телеком Холдинг», ООО «Дом.ру» и их дочерними компаниями. Все товарные знаки принадлежат их правообладателям. Использование данного ПО — на ваш собственный риск. Автор не несёт ответственности за любые последствия использования.
EN: This project was created for educational and personal use only. It is not affiliated with Er-Telecom Holding or Dom.ru. All trademarks belong to their respective owners. Use at your own risk. The author assumes no liability for any consequences of use.
- Авторизация по номеру телефона (SMS код)
- Просмотр камер домофонов (снапшоты)
- Live HLS видеострим с камеры
- Архив видео с таймлайном событий (движение, звонки)
- Открытие двери (SIP / Forpost)
- Детекция входящих звонков через SIP протокол
- Уведомления в реальном времени (SSE + Browser Notifications)
- Webhook для интеграции с Home Assistant и другими системами
- Docker-ready (multi-stage build, ~15MB образ)
cargo run --release
# Сервер на http://localhost:3000docker compose up -d
# Или с webhook:
WEBHOOK_URL=http://homeassistant:8123/api/webhook/domofon docker compose up -dПри первом запуске откройте http://localhost:3000 и авторизуйтесь по номеру телефона.
| Переменная | Описание | По умолчанию |
|---|---|---|
WEBHOOK_URL |
URL вебхука для уведомлений о звонках | (пусто — отключен) |
RUST_LOG |
Уровень логирования (trace/debug/info/warn/error) | info |
TZ |
Часовой пояс | UTC |
| Файл | Описание |
|---|---|
tokens.json |
OAuth2 токены (accessToken, refreshToken, operatorId) |
config.json |
Настройки (интервал опроса, URL вебхука) |
sip-device.json |
SIP учётные данные (login, password, realm) |
Все файлы создаются автоматически. При запуске в Docker монтируйте ./data как volume.
{
"callPollingIntervalMs": 10000,
"callWebhookUrl": "http://192.168.1.100:8123/api/webhook/domofon"
}Webhook URL приоритет: config.json → WEBHOOK_URL env → отключен.
Base URL: http://localhost:3000
| Метод | Endpoint | Body | Описание |
|---|---|---|---|
| POST | /api/login |
{phone} |
Запрос SMS кода |
| POST | /api/select-contract |
{phone, contract} |
Выбор договора (если несколько) |
| POST | /api/confirm |
{phone, code, contract?} |
Подтверждение SMS кода |
| GET | /api/session |
— | Статус авторизации |
| POST | /api/refresh |
— | Обновление токена |
| POST | /api/logout |
— | Выход |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/places |
Список квартир |
| GET | /api/places/{placeId}/accesscontrols |
Домофоны квартиры |
| GET | /api/places/{placeId}/cameras |
Персональные камеры |
| Метод | Endpoint | Body | Описание |
|---|---|---|---|
| POST | /api/open-door |
{placeId, device} |
Открыть дверь |
| POST | /api/open-entrance |
{placeId, accessControlId, entranceId} |
Открыть подъезд |
| Метод | Endpoint | Параметры | Описание |
|---|---|---|---|
| GET | /api/snapshot/{placeId}/{deviceId} |
type=SIP|BUP, w, h |
Снапшот камеры (JPEG) |
| GET | /api/stream/{cameraId} |
— | HLS стрим (возвращает {url}) |
| GET | /api/archive/{cameraId} |
ts (unix sec), tz (offset sec) |
Архив видео с момента ts |
| GET | /api/events/{cameraId} |
dateFrom, dateTo |
События камеры (движение, звонки) |
| POST | /api/sip-device |
{placeId, accessControlId} |
Создать SIP устройство |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/events |
SSE поток (event type: call) |
| POST | /api/call |
Внешний push события звонка |
Формат SSE события:
{
"eventType": "incoming_call",
"date": "2026-03-22T17:59:58.003Z",
"from": "sip:000@XXXXX.nn.domofon.domru.ru",
"sipMessage": "INVITE sip:... SIP/2.0"
}| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/config |
Текущие настройки |
| POST | /api/config |
Обновить настройки |
Приложение регистрируется на SIP-сервере домофона (KAZOO) как SIP-устройство. При звонке в домофон сервер отправляет SIP INVITE → приложение детектирует звонок и:
- Отправляет SSE event всем подключённым браузерам
- Показывает Browser Notification
- Вызывает webhook (если настроен)
| Параметр | Значение |
|---|---|
| Протокол | SIP/2.0 over UDP |
| Локальный порт | 15060/udp |
| Аутентификация | Digest MD5 |
| Re-registration | Каждые 25 секунд (NAT keepalive) |
| Ответ на INVITE | 180 Ringing → 486 Busy Here |
SIP credentials создаются автоматически и сохраняются в data/sip-device.json.
Встроенный веб-интерфейс на http://localhost:3000:
- Live камера — HLS видеострим, клик по снапшоту для запуска
- Таймлайн — полоска с засечками событий (зелёные = движение, красные = звонки)
- Архив — клик по таймлайну или событию → воспроизведение архива с этого момента
- Навигация — кнопки ◀ ▶ для перехода между событиями, LIVE для возврата
- Открытие двери — кнопка с иконкой замка
- Уведомления — баннер при входящем звонке + Browser Notification
- Настройки — webhook URL через UI
- Fullscreen — кнопка для полноэкранного просмотра
Multi-stage build: rust:1-alpine → alpine:3 runtime (~15MB).
services:
domofon:
build: .
container_name: domofon
restart: unless-stopped
ports:
- "3000:3000"
- "15060:15060/udp"
volumes:
- ./data:/app/data
environment:
- TZ=Europe/Moscow
- WEBHOOK_URL=${WEBHOOK_URL:-}├── Cargo.toml
├── Dockerfile
├── docker-compose.yml
├── public/
│ └── index.html # Веб-интерфейс
├── data/ # Персистентные данные (git-ignored)
│ ├── tokens.json
│ ├── config.json
│ └── sip-device.json
└── src/
├── main.rs # Entry point, инициализация, фоновые задачи
├── client.rs # HTTP клиент к myhome.proptech.ru
├── sip.rs # SIP клиент (UDP, Digest auth, INVITE detect)
├── types.rs # Все структуры данных
├── state.rs # Shared state, персистенция, конфиг
├── error.rs # Обработка ошибок
└── api/
├── mod.rs # Сборка роутера
├── auth.rs # Авторизация
├── places.rs # Квартиры и устройства
├── door.rs # Управление дверью
├── media.rs # Видео, снапшоты, архив
├── config.rs # Настройки
└── sse.rs # SSE и вебхуки
Настройте webhook URL в конфиге или через env:
WEBHOOK_URL=http://homeassistant.local:8123/api/webhook/domofonВ Home Assistant создайте автоматизацию на webhook trigger domofon для обработки входящих звонков.
GitHub Actions автоматически билдит Docker образ:
- PR → билд для проверки
- Push в main → билд + push в
ghcr.io - Тег
v*→ семантические теги (1.0.0,1.0,sha-xxx)
# Pull образ из реестра
docker pull ghcr.io/z81/domofon:mainMIT License. See Disclaimer.