Skip to content

Latest commit

 

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Y108: лёгкие Go-утилиты для Ease Life

Неофициальный клиент для работы с собственными камерами Ease Life Y108. Проект не связан с производителем камеры или сервисом Ease Life. Используйте его только с устройствами, которыми вы владеете, либо с явного разрешения владельца.

Проект содержит три команды:

  • y108extract читает HAR, извлекает минимальную конфигурацию камеры и сохраняет её в JSON с правами 0600;
  • y108play читает только JSON, подключается к WS-FLV Ease Life и отдаёт нормализованный FLV в файл или stdout. HAR и Chromium ему не нужны.
  • y108view выполняет те же действия и сам открывает окно ffplay, поэтому для просмотра достаточно одной команды.

Плеер исправляет нестандартную упаковку H.264 камеры (AVCC поверх Annex-B), из-за которой libopenh264 сообщал NAL(type:0).

Сборка

Нужен Go 1.22 или новее; для публичных сборок рекомендуется актуальная поддерживаемая версия Go:

go test ./...
go build -o y108extract ./cmd/y108extract
go build -o y108play ./cmd/y108play
go build -o y108view ./cmd/y108view

Получение HAR-файла

HAR нужен только для первоначального извлечения параметров камеры. Для наиболее полного и совместимого файла рекомендуется Chrome, Chromium или Edge; после получения camera.json браузер для просмотра потока больше не требуется.

Chrome, Chromium или Edge

  1. Откройте веб-интерфейс Ease Life и войдите в свою учётную запись, но пока не запускайте камеру.
  2. Откройте DevTools клавишей F12 или сочетанием Ctrl+Shift+I и выберите вкладку Network (Сеть).
  3. Включите Preserve log (Сохранять журнал) и очистите список запросов.
  4. В настройках DevTools откройте Preferences → Network и включите Allow to generate HAR with sensitive data. Это позволяет сохранить сведения авторизации, которые браузер исключает из обычного, очищенного HAR.
  5. Не закрывая DevTools, перезагрузите страницу, откройте просмотр камеры и подождите 20–30 секунд.
  6. Убедитесь, что среди запросов есть innerLive. Фильтр WS также должен показывать соединение /h5player/live; при выборе соединения на вкладке Messages должны появляться сообщения потока.
  7. Щёлкните правой кнопкой в списке запросов и выберите Save all as HAR with sensitive data (либо используйте кнопку экспорта HAR и выберите вариант with sensitive data). Сохраните файл как capture.har в каталоге проекта.

Названия и расположение элементов интерфейса описаны в официальной документации Chrome DevTools. Для извлечения конфигурации в первую очередь нужен ответ innerLive; наличие WebSocket-сообщений полезно для диагностики формата потока.

Firefox

Откройте F12Network, включите Persist Logs, очистите список, перезагрузите страницу и запустите камеру на 20–30 секунд. Проверьте наличие innerLive и соединения в фильтре WS, затем в меню настроек Network Monitor выберите Save All As HAR. Подробности есть в документации Firefox Network Monitor. Некоторые версии Firefox не включают содержимое WebSocket-сообщений в HAR, поэтому при проблемах с диагностикой повторите запись в Chromium-совместимом браузере. Для обычного извлечения достаточно, чтобы HAR содержал ответ innerLive.

Важно: HAR может содержать cookies, данные авторизации, временный token, идентификаторы камеры и фрагменты видео. Не публикуйте его, не прикладывайте к GitHub Issues и не отправляйте посторонним. После извлечения храните HAR только локально с ограниченными правами или удалите его. Файлы *.har и *.json уже исключены из Git этим репозиторием.

1. Извлечение конфигурации

./y108extract \
  -har capture.har \
  -output camera.json

Команда также выводит безопасную сводку сессий, но не показывает токен. Отключить сводку можно флагом -summary=false.

camera.json содержит временный token и постоянные идентификаторы камеры. Не публикуйте его и HAR. Утилита устанавливает права доступа 0600.

2. Просмотр

Установите FFmpeg с программой ffplay, затем выполните одну команду:

./y108view -config camera.json

Полноэкранный режим или просмотр без звука:

./y108view -config camera.json -fullscreen
./y108view -config camera.json -mute

y108view запускает ffplay самостоятельно с настройками низкой задержки и завершает получение потока при закрытии окна. Если ffplay расположен не в PATH, укажите -ffplay /путь/к/ffplay.

Клиент исправляет ложные timestamps повторных AVC sequence headers и использует внешние часы ffplay, поэтому опоздавшие кадры отбрасываются, а задержка не должна накапливаться при продолжительном просмотре.

Для записи или передачи FLV в другую программу используйте y108play:

./y108play -config camera.json -output camera.flv

Проверка:

ffprobe -v error \
  -show_entries stream=index,codec_name,codec_type,width,height,r_frame_rate \
  -of default=noprint_wrappers=1 camera.flv

По умолчанию y108play перед каждым подключением вызывает innerLive, обновляя token и relayServer, и автоматически переподключается после обрыва. Это можно изменить флагами -refresh=false и -reconnect=false.

У протестированной камеры в локальной сети 192.168.x.x RTSP/ONVIF обнаружен не был, поэтому просмотр зависит от интернета и доступности облака Ease Life.

Интеграция с MediaMTX и Home Assistant

Рекомендуемая схема:

y108play → FLV → FFmpeg (remux) → RTSP → MediaMTX → Home Assistant

FFmpeg здесь не перекодирует видео и звук, а только перепаковывает H.264 и G.711/PCMA из FLV в RTSP. MediaMTX поддерживает эти кодеки через RTSP и WebRTC.

Настройка MediaMTX

Минимальный mediamtx.yml:

rtsp: true
rtspAddress: :8554
rtspTransports: [tcp]

paths:
  y108:
    source: publisher

Запуск:

./mediamtx mediamtx.yml

Публикация камеры

В другом терминале запустите:

set -o pipefail

./y108play \
  -config camera.json \
  -reconnect=false |
ffmpeg \
  -hide_banner \
  -loglevel warning \
  -fflags +genpts+discardcorrupt \
  -f flv -i pipe:0 \
  -map 0:v:0 \
  -map 0:a:0? \
  -c:v copy \
  -c:a copy \
  -f rtsp \
  -rtsp_transport tcp \
  rtsp://127.0.0.1:8554/y108

Флаг -reconnect=false используется намеренно: если облачный поток полностью оборвётся, следует перезапустить всю связку y108play | ffmpeg, чтобы FFmpeg получил новый FLV-заголовок.

Проверка RTSP:

ffplay \
  -rtsp_transport tcp \
  -flags low_delay \
  rtsp://127.0.0.1:8554/y108
ffprobe \
  -v error \
  -rtsp_transport tcp \
  -show_entries stream=index,codec_name,codec_type,width,height,r_frame_rate,sample_rate,channels \
  -of default=noprint_wrappers=1 \
  rtsp://127.0.0.1:8554/y108

Проверить WebRTC непосредственно через MediaMTX можно в браузере:

http://IP_СЕРВЕРА_MEDIAMTX:8889/y108

Если WebRTC не воспроизводится, сначала проверьте RTSP. Возможная причина — ограничения браузера для конкретного профиля H.264; RTSP при этом может работать нормально.

Добавление в Home Assistant

Если интеграция stream ещё не включена, добавьте в configuration.yaml:

stream:

После перезапуска Home Assistant:

  1. Откройте Настройки → Устройства и службы.

  2. Нажмите Добавить интеграцию.

  3. Выберите Generic Camera.

  4. В поле Stream Source URL укажите:

    rtsp://IP_СЕРВЕРА_MEDIAMTX:8554/y108
    
  5. Поле Still Image URL можно оставить пустым.

  6. В дополнительных настройках выберите RTSP transport TCP.

  7. При проблемах с временными метками включите Use wallclock as timestamps.

Интеграция Generic Camera официально поддерживает RTSP как источник потока: документация Home Assistant.

Пример карточки Dashboard:

type: picture-entity
entity: camera.y108
camera_view: live
show_name: false
show_state: false

Если Home Assistant работает в Docker, 127.0.0.1 будет указывать на контейнер Home Assistant. Используйте IP компьютера с MediaMTX или имя контейнера в общей Docker-сети:

rtsp://mediamtx:8554/y108

Автоматический перезапуск

Для постоянной работы связку y108play | ffmpeg рекомендуется запускать через systemd, Docker Compose или механизм runOnDemand MediaMTX. Процесс должен целиком перезапускаться после завершения любой части конвейера.

Для службы systemd важны как минимум следующие параметры:

[Service]
Restart=always
RestartSec=3

Не открывайте порты MediaMTX 8554 и 8889 в интернет без аутентификации.

Безопасность и ограничения

  • HAR и созданный camera.json содержат токены и постоянные идентификаторы. Они исключены из Git через .gitignore, но всё равно требуют безопасного хранения.
  • Проект реализует механизм innerLive штатного веб-клиента и не предназначен для обхода авторизации или доступа к чужим устройствам.
  • Работа зависит от стороннего облачного API, которое может измениться или стать недоступным без предупреждения.
  • Не публикуйте диагностические файлы до проверки на токены, cookies и идентификаторы устройств.

Сообщения об уязвимостях следует отправлять согласно SECURITY.md.

Лицензия

Проект распространяется по лицензии MIT.

About

Unofficial lightweight Go client for Ease Life Y108 cameras, with MediaMTX and Home Assistant support

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages