Попросил Codex починить телевизор. Он подключился к нему по сети и сделал это
Main chat
A chat for vibe coders: news, guides, live cases, marketplace, and finding executors.
Ребёнок хотел мультики. Телевизор показывал чёрный экран — звук шёл, субтитры шли, картинки не было. Конкретная серия в Иви, конкретный телевизор, воспроизводится стабильно. Классическая задача для техподдержки, которую те всё равно не решат.
Вместо звонка в сервисный центр я открыл Codex и написал: «Разберись, что с телевизором».
Дальше произошло то, что я не ожидал.
Задача: чёрный экран в Иви
Телевизор — Hyundai H-LED55BU7003 на YandexOS. Симптом: при воспроизведении одной из серий Иви — звук есть, изображение чёрное. Другие серии работают. Другие приложения работают. Перезагрузка не помогает.
Первая мысль — зайти через ADB и посмотреть логи. Стандартный путь для Android-устройств. Оказалось — ADB на этом телевизоре закрыт: сервисное меню есть, но пункта ADB Mode нет. Bluetooth не даёт доступ к системе. USB — только зарядка и флешки. Прямого доступа к логам нет никакого.
Codex выслушал это всё и сказал: «Погоди, у тебя открыт порт 1961».
Что Codex нашёл: секретный порт телевизора
Агент самостоятельно просканировал локальную сеть и обнаружил, что телевизор слушает wss://192.168.0.113:1961. Это не ADB. Это Yandex Glagol — внутренний WebSocket-протокол, через который Яндекс-экосистема общается со своими устройствами.
Через него работают:
- Яндекс Станция, когда управляет телевизором
- Home Assistant интеграция через HACS
- Node-RED автоматизации
Нигде в официальной документации этот протокол толком не описан. Codex нашёл его в исходниках AlexxIT/YandexStation на GitHub.
TLS-сертификат: O=Yandex, CN=localhost
HTTP 426: Upgrade Required
WebSocket 101: Switching Protocols ✓
Первое сообщение: ping server_ping
Порт открыт. Соединение установлено. Нужен только токен.
Как получить доступ: OAuth без взлома
Codex объяснил схему авторизации и написал, что нужно сделать:
- Получить OAuth-токен Яндекса от аккаунта, к которому привязан телевизор — через официальный OAuth Яндекса.
- Через API Яндекс.Квазара получить список устройств и найти телевизор.
- Запросить Glagol device-token для конкретного устройства.
- Подключиться к WebSocket и начать отправлять команды.
Токен я никуда не вставлял в чат — Codex сам создал папку .secrets/, попросил положить файл туда, и читал из файловой системы локально.
# Codex написал этот скрипт самостоятельно
import asyncio, aiohttp, json, pathlib, ssl, websockets
TOKEN = pathlib.Path(".secrets/yandex_token").read_text().strip()
async def get_device_token(oauth_token, device_id):
headers = {"Authorization": f"OAuth {oauth_token}"}
async with aiohttp.ClientSession() as session:
async with session.get(
"https://quasar.yandex.net/glagol/device_list",
headers=headers
) as r:
devices = await r.json()
async with session.get(
f"https://quasar.yandex.net/glagol/token?device_id={device_id}",
headers=headers
) as r:
return (await r.json())["token"]
Через несколько секунд после запуска:
✓ OAuth-токен принят
✓ Яндекс API ответил: найдено устройство cea2fdaaca88b3e30579
✓ Модель: yandex_tv_mt9632_cv
✓ Glagol device-token получен
✓ Подключён к wss://192.168.0.113:1961
✓ softwareVersion: 3.306.12
✓ appState: ru.ivi.client — Иви установлена
Codex подключился к телевизору.
Диагностика в реальном времени
Следующий шаг — снять состояние телевизора именно в момент проблемы. Я запустил ту самую серию в Иви и написал агенту: «запустил».
Codex начал каждые 30 секунд снимать getState с телевизора и записывать в diagnostics/ivi-black-screen-state.json:
{
"status": "SUCCESS",
"state": {
"aliceState": "IDLE",
"playing": false,
"volume": 18
},
"playerState": {},
"watchedVideoState": null,
"appState": "base64encoded..."
}
Ключевая находка: playing: false — телевизор сообщает Яндекс-слою, что воспроизведения нет, хотя звук идёт. Это значит, что видеодекодер завис, но аудиодекодер продолжает работать. Иви не отдаёт playback-state наружу — то есть само приложение считает, что что-то воспроизводится, а системный слой этого не видит.
Это не проблема настроек. Это несовместимость кодека конкретного видеоряда с декодером в YandexOS 3.306.12.
Что в итоге починило мультики
Зная точную причину, Codex предложил три рабочих варианта:
1. Очистить данные Иви (не кэш, а именно данные). Это сбрасывает авторизацию DRM-клиента и заставляет Иви заново согласовать сессию с сервером. В ряде случаев это меняет поведение декодера при следующем воспроизведении.
2. Принудительно перезапустить Иви через Glagol. Codex написал команду sendAction для выхода из приложения и повторного запуска — телевизор её принял.
3. Переключить качество видео. Через playerState агент определил, что серия запускалась в 4K HDR. Снижение до 1080p меняет используемый декодер.
После принудительного перезапуска Иви через Glagol и снижения качества с 4K HDR до 1080p — мультики включились. Проблема воспроизводилась только в 4K на этой конкретной серии из-за поведения HDR-декодера в YandexOS.
Почему это важно для вайбкодеров
Этот кейс — не про телевизор. Он про то, как ведёт себя современный ИИ-агент, когда ему дают реальную задачу без очевидного решения.
Что сделал Codex самостоятельно:
- Просканировал сеть и нашёл открытый порт
- Нашёл нужный протокол в open-source репозиториях на GitHub
- Написал рабочий WebSocket-клиент с нуля
- Организовал безопасное хранение секретов
- Снял диагностические данные в реальном времени
- Предложил и применил рабочее решение
Это не автодополнение кода. Это агент, который взял задачу, придумал подход, написал инструменты и дошёл до ответа.
Граница, которую важно понимать: Glagol — это протокол управления, не отладки. Без ADB нельзя получить logcat, системные логи или залезть в файловую систему. Если бы декодер просто крашился без каких-либо сигналов наружу, этот подход не сработал бы. Нам повезло, что playing: false при звуке — уже достаточно диагностической информации.
Технический итог
| Что использовали | Зачем |
|---|---|
wss://[tv_ip]:1961 |
Yandex Glagol WebSocket — единственный открытый интерфейс |
| Яндекс OAuth | Авторизация без взлома, через официальный API |
quasar.yandex.net/glagol/token |
Device token для телевизора |
getState команда |
Снять playerState / appState в реальном времени |
sendAction команда |
Принудительный перезапуск Иви |
| Python + websockets + aiohttp | Скрипт, который Codex написал с нуля |
Весь скрипт glagol_probe.py — ~200 строк Python, написанных агентом с нуля за один сеанс.
Попробовать самому
Если у вас Яндекс-телевизор с YandexOS и похожая проблема — вот минимальная схема:
# Проверить, открыт ли порт Glagol
python -c "
import socket
s = socket.socket()
s.settimeout(2)
result = s.connect_ex(('192.168.0.ВАШ_TV', 1961))
print('порт открыт' if result == 0 else 'порт закрыт')
s.close()
"
Если порт открыт — дальше всё описано выше. Токен получаете через официальный OAuth, скрипт пишет Codex по аналогии с этим кейсом.
Если порт закрыт — ваш телевизор не на YandexOS, или Яндекс-интеграция отключена в настройках.
Мультики работают. Ребёнок доволен. Сервисный центр не понадобился.