ESP32 Bluetooth TV remote

Главный итог такой:

некоторые производители ТВ вместо стандартных Медиа-Ключей БТ клавиатуры используют свои последовательности. Я для своего ТВ их поймал (см выше) и подставил в библиотеку blekeybord.

Это нормальная работа. Хотелось бы услышать советы и экспертное мнение о том, какие ТВ не работают с обычными БТ клавами? Как сниффить проприетарные профили. Это то, что ты РЕАЛЬНО проделал. А не прикручивание БлеКиборд к ВебСерверу.

Я понял. Просто я видел кучу попыток людей сделать более менее приемлимое управление по bluetooth и везде все упиралось в количество Media Keys. Как правило их меняли в коде из примеров. Поэтому и опубликовал именно код bluetooth с профилем, чтобы другие могли сделать под свой проект.

P.S. интеграцию с УДЯ (api) я хотел отдельно привести, чтобы не мешать с общим кодом.

И кстати. Для управления несколькими телевизорами по bluetooth на основе esp32 требуются правки в исходных текстах стандартных библиотек. А это уже аномальная штука для проекта, и данный fork потребуется “тащить” самому, если даже опубликовать.

Ответа автора проекта о том, на сколько хватит одного комплекта батареек для управления так и не прозвучало. Тогда зачем мне такой ремот, если его надо включать в розетку. Во времена CCCP для ламповых теликов тоже продавали пульт ДУ, который имел 5 метров кабеля, и управлял Вкл/выкл, громкостью, и вроде яркоситью. Каналы всё равно переключались ручками(или пассатижами) ))

А эту функцию можно и обслужить обыкновенным туевским реле. И обратная связь точно будет )

Методика простая. Берете bluetooth пульт (LG Magick не будет работать). Цепляете к компьютеру (pairing) - на пульте потребуется нажать клавиши, которые описаны для привязки. Пульт должен стать видимым в списке bluetooth устройств. Для декодирования кнопок потребуется собрать evtest. После подключения пульта к компьютеру советую посмотреть лог системы, чтобы понять какое устройство надо исследовать. dmesg наше все! Потом идем и копируем в отдельную директорию файл /sys/class/bluetooth/…/descriptors . Используя утилиту hidrdd декодируем файл descriptors . Это и будет профиль для устройства. Его надо будет “причесать”, поскольку там есть лишнее.
Далее запускаем evtest и клацаем, записываем коды. Осторожней с клавишей POWER - можете выключить компьютер. Далее изучаем коды. Однобайтные работают, как с обычной клавиатурой. Двухбайтные “ходят” через Consumer device. Это отдельный канал. Немного про каналы. Каждый пульт имеет разное количество каналов, но всегда есть клавиатура. На многих пультах присутствует Consumer device, Mouse, Jostick и канал для голоса (для пультов с микрофоном). У меня в коде есть привязка каналов моего пульта, которая реализована для Keyboard и Consumer device. В descriptors их можно найти по идентификатору INPUT. Есть еще OUTPUT и они применяются для индикации на пульте или клавиатуре.

Я бы не стал делать этого. Проще прицепить к своей esp. Как раз новая прошивка моя будет для замены ПО в пульте. Будет ИК+Lan.

Включите пульт в usb разьем телевизора, который остается с питанием в standby режиме.

P.S. А если хотите, то esp32, дисплей с сенсором и аккумулятором позволит Вам сделать пульт с переключением раскладки кнопок под каждый телевизор. Но я предпочитаю голосом переключать.

Ты не мне рассказывай. :wink:
Ты бы изложил для не линуксоидов. И важно понять, насколько много бывает таких ТВ, которым это все нужно. Есть же базы вероятно в сети. Так как есть Андроид пульты блютус универсальные, значит у программистов этих пультов есть база совместитмых телевизоров.

Это не про носить в кармане, а про подключение к “умному дому”. Яндекс или ХА или еще какому. Тут нет нужды в автономном питании.

Возможно есть база (гипотетически). Сейчас все телевизоры и ТВ боксы с bluetooth пультами. Они удобны, поскольку направлять не надо на телевизор. Сама идея таких самопальных пультов - не надо “трогать” телевизор, но получить обратную связь, что он включен и не допустить выключение при повторной посылке POWER key, которым страдают ИК пульты для умного дома. Для простой интеграции вполне хватит, а пинок для выхода из “сна” можно по ИК давать. Как вариант можно и wol сделать, но не все ТВ это могут. Мой последний вариант работает по lan с телевизорами, но я скорее всего добавлю ИК и розетку (ситуации бывают разные). Пульт будет в сетевом фильтре, который с розетками управляемыми будет.

Для не линуксоидов - сложно сделать описание. Я уже лет 20 не нажимал кнопки в windows. Если есть что то подобное, то можно сделать описание. Но опять же. Много аналитики для получения результата.

P.S. Хотелось бы сделать команду - Алиса, попроси телевизор включить футбол! И включается канал, где идет матч. Это реально сделать!

ЧатЖПТ дал хороший совет: не быть хид сервером, в попробовать быть клиентом и подключиться к ТВ. Основные смарт ТВ - самсунг и ЛГ должны такое поддерживать. Можно попробовать телефоном просканировать и понять дает ли ТВ открытые сервисы и характеристики.

Это даст большой простор. То же самое управление несколькими ТВ. Сервер ХИД у ЕСП32 может быть только один. Зато клиентом быть мы можем у любого количества ТВ.

У меня вариант с esp8266 управляет 5-ю телевизорами по lan. И там просто модуль прошит. Он сам определяет телевизоры в сети, делает (пока) профиль управления, WEB страницу со списком, делает WEB страничку для каждого, закидывает это на сервер (чтобы добавить в УДЯ), запускает mqtt клиента и выполняет команды. В УДЯ они видны. На некоторых моделях подключает каналы iptv без установки приложений на ТВ.

Если внимательно изучить код, то есть возможность все телевизоры подключить на 1 сервер HID. Надо поправить цикл, где отсылается команда. Там проход по всем устройствам, которые подключены, а надо исключить по MAC не нужные.

for(auto &myPair : BLEDevice::getPeerDevices(true)) {
		conn_status_t conn_status = (conn_status_t)myPair.second;
		if(((BLEClient*)conn_status.peer_device)->getGattcIf() == gattc_if || ((BLEClient*)conn_status.peer_device)->getGattcIf() == ESP_GATT_IF_NONE || gattc_if == ESP_GATT_IF_NONE){
			((BLEClient*)conn_status.peer_device)->gattClientEventHandler(event, gattc_if, param);
		}
	}

Мы про БТ говорили.

Идеология работы ТВ по BT сделана на основе привязки пульта к телевизору. Телевизор допускает команды от pairing устройств, а не всем. Иначе можно соседа телевизор выключить. Клиентом никак. Я не видел решений. Даже по lan идеология построена на подтверждении соединения. По BT LG запрашивает pairing звукового устройства.

Ты вообще не понял про что я написал! :wink:
Но это нормально, так как логика работы БТ - чисто марсианская. Понять её может нормально только рептилоид!

Так вот - обычная БТ клава это ХИД сервер. Ты его соединяешь с ТВ (или компом) путем сканирования со стороны компа. КОмп увидел и подключился.
Есть обратная система - сканировать с телефона (к примеру) и увидеть в нем комп (или ТВ), так как в них есть СВОЙ СЕРВЕР, отвечающий на запросы.
В этом случае инициатор соединения с другой стороны. И роли в соединении - другие. При этом типе “спаривания” ПИН, если он есть, запрашивает тот, кого искали.

Понял разницу?:

  1. Ты с ТВ ищешь клаву. Потом спариваешь
  2. Ты с клавы ищешь ТВ, и спариваешь снова. В случает клавиатур и наушников это не принято, так не делают. Но когда ты соединяешь два телефона - то всегда один из них ищет, а другого - находят. В случает связи пульта и ТВ такое тоже возможно (не все ТВ поддерживают)

Уффф… замучался. Хоть стало яснее немного? Не запутал я тебя?

Хорошо что у меня телевизор с ик пультом.
… алиса, млять, включи телевизор!!!

Так я провел эксперимент. Он виден, но код не вылазиет на ТВ. Вылазиет от звукового сервера. Если оно есть, то надо искать доку.

Вендоры должны (ИМХО) поддерживать стандартную БТ клавиатуру. НО в мире современного пост-капитализма каждый мечтает иметь карманный станок для печатания денег.

Без иносказаний это так: Каждый мечтает искусственно создать у потребителя потребность, которую только он умеет удовлетворять или хотя-бы он раньше других умеет это делать.

Вот в этом и причина того, что вендоры стремятся использовать проприетарные протоколы везде. Чтобы продавать херню собственного производства. Например “особенные” пульты, зарядники, шнурки и прочее.