Неофициальный клиент для работы с собственными камерами 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/y108viewHAR нужен только для первоначального извлечения параметров камеры. Для наиболее
полного и совместимого файла рекомендуется Chrome, Chromium или Edge; после
получения camera.json браузер для просмотра потока больше не требуется.
- Откройте веб-интерфейс Ease Life и войдите в свою учётную запись, но пока не запускайте камеру.
- Откройте DevTools клавишей
F12или сочетаниемCtrl+Shift+Iи выберите вкладку Network (Сеть). - Включите Preserve log (Сохранять журнал) и очистите список запросов.
- В настройках DevTools откройте Preferences → Network и включите Allow to generate HAR with sensitive data. Это позволяет сохранить сведения авторизации, которые браузер исключает из обычного, очищенного HAR.
- Не закрывая DevTools, перезагрузите страницу, откройте просмотр камеры и подождите 20–30 секунд.
- Убедитесь, что среди запросов есть
innerLive. Фильтр WS также должен показывать соединение/h5player/live; при выборе соединения на вкладке Messages должны появляться сообщения потока. - Щёлкните правой кнопкой в списке запросов и выберите
Save all as HAR with sensitive data (либо используйте кнопку экспорта HAR
и выберите вариант with sensitive data). Сохраните файл как
capture.harв каталоге проекта.
Названия и расположение элементов интерфейса описаны в официальной
документации Chrome DevTools.
Для извлечения конфигурации в первую очередь нужен ответ innerLive; наличие
WebSocket-сообщений полезно для диагностики формата потока.
Откройте F12 → Network, включите 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 этим репозиторием.
./y108extract \
-har capture.har \
-output camera.jsonКоманда также выводит безопасную сводку сессий, но не показывает токен. Отключить
сводку можно флагом -summary=false.
camera.json содержит временный token и постоянные идентификаторы камеры. Не
публикуйте его и HAR. Утилита устанавливает права доступа 0600.
Установите FFmpeg с программой ffplay, затем выполните одну команду:
./y108view -config camera.jsonПолноэкранный режим или просмотр без звука:
./y108view -config camera.json -fullscreen
./y108view -config camera.json -mutey108view запускает 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.
Рекомендуемая схема:
y108play → FLV → FFmpeg (remux) → RTSP → MediaMTX → Home Assistant
FFmpeg здесь не перекодирует видео и звук, а только перепаковывает H.264 и G.711/PCMA из FLV в RTSP. MediaMTX поддерживает эти кодеки через RTSP и WebRTC.
Минимальный 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/y108ffprobe \
-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 при этом может работать нормально.
Если интеграция stream ещё не включена, добавьте в configuration.yaml:
stream:После перезапуска Home Assistant:
-
Откройте Настройки → Устройства и службы.
-
Нажмите Добавить интеграцию.
-
Выберите Generic Camera.
-
В поле Stream Source URL укажите:
rtsp://IP_СЕРВЕРА_MEDIAMTX:8554/y108 -
Поле Still Image URL можно оставить пустым.
-
В дополнительных настройках выберите RTSP transport
TCP. -
При проблемах с временными метками включите
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.