Энтузиаст Джеймс Воган поделился, что он приобрел несколько колонок со встроенными стриминговыми сервисами, но остался недоволен их системой регулировки громкости. Он решил настроить их так, чтобы получить более точный контроль в комфортном диапазоне воспроизведения.
Обычно Воган использует около 10% от диапазона громкости, на который способны колонки. Это затрудняет для него регулировку звука, так как крошечный ползунок можно использовать только на 10% или около 15 шагов, где переход от шага 3 к шагу 4 переводит динамики с уровня «немного тихо» на уровень «определённо беспокоит соседей».
Энтузиаст изучил недокументированные веб-интерфейсы динамиков, найдя их локальный IP-адрес через свой маршрутизатор.
Он обнаружил, что динамики предоставляют довольно простой HTTP API, включая GET/api/getData и POST/api/setData, которые позволяют читать и записывать текущий уровень громкости.
Затем Воган нашёл исходный код плагина Hombridge для динамиков KEF, которые, как и JBL, используют StreamSDK. Он обнаружил, что в веб-интерфейсе динамиков есть страница, позволяющая загружать системные журналы с копией части файловой системы, в которой хранятся текущие настройки. Это помогло отследить два конкретных пути конфигурации: player/attenuation и hostlink/maxVolume.
$ curl —url ‘http://192.168.1.239/api/getData?path=settings:/hostlink/maxVolume&roles=@all’ | jq { «timestamp»: 1711309370908, «title»: «Max volume setting (ARCAM-project specific)», «modifiable»: true, «type»: «value», «path»: «settings:/hostlink/maxVolume», «defaultValue»: { «type»: «i32_», «i32_»: 99 }, «value»: { «type»: «i32_», «i32_»: 46 } }
Энтузиаст создал небольшую веб-страницу, которая включает полноэкранный ползунок для настройки громкости.
Для его обслуживания он создал небольшой сервер с помощью Bun. Благодаря этому удалось ограничиться одним файлом TypeScript без каких-либо зависимостей, кроме самого Bun. Веб-сервер обслуживает страницу с ползунком и пересылает запросы на динамики.
// server.ts // Run this via `bun —hot server.ts` const MAX_VOLUME = 25; const SPEAKER_URL = «http://192.168.1.239»; const UPDATE_INTERVAL_SECONDS = 10; const getVolumeUrl = `${SPEAKER_URL}/api/getData?path=player:volume&roles=@all`; function html(strings: TemplateStringsArray, …values: any[]) { return strings.reduce((result, string, i) => { return result + string + (values[i] || «»); }, «»); } const pageHtml = html`
Теперь Воган намерен создать физическую ручку громкости с применением платы ESP32.
Источник: habr.com