Итак, предлагаю обсудить тему уменьшения количества пультов в доме.
В моём случае - есть очень удобный пульт от плазмы LG, после которого VU+ в руки брать не хочется. И ещё открывается интересная возможность: программно из ресивера управлять работой телевизора - переключать режимы 4:3/16:9, громкость и т.д.
Тема предполагает желание копаться в плагинах на питоне. Если такого желания нет - смысла читать статью дальше тоже нет.
Модуль HDMI-CEC встроен практически во все прошивки, и в теории позволяет управлять всеми устройствами, соединёнными по HDMI, одним пультом. Скорость там небольшая, ~30 байт/сек, но для управления хватит. На практике - единого обязательного стандарта нет, и каждый производитель норовит приделать свои особые команды. LG видимо решил идти этим путём, и в стандартной конфигурации у меня HDMI-CEC не работает.
Далее, к вшитому модулю цепляется плагин на питоне, который в разных прошивках реализован по разному:
- BlackHole - полностью закрыт. Внешне видно, что функции похожи, но разбираться методом тыка - неинтересно; - OpenPli - всё открыто, полная реализация стандарта; - VTI - всё открыто, но в ядерном модуле (как минимум в версии VTI 3.1) есть ошибка, препятствующая полной реализации.
Ну, OpenPli я попробовал, но никакого терпения не хватает настроить всё в ней под себя. Может потом когда-нибудь, когда времени будет больше.
Остановился на VTI. Плагин ставится в /usr/lib/enigma2/python/Plugins/SystemPlugins/HDMICEC/plugin.py
Для наших целей нужно будет добавить пару строк в конфиг Энигмы:
После этого в файл /tmp/hdmicec.log будет записываться весь журнал обмена.
Выглядит он примерно так:
Спойлер:
[VTI HDMI-CEC] received cec message 87 from 0 [VTI HDMI-CEC] received cec message 0 from 0 [VTI HDMI-CEC] received cec message 89 from 0 [VTI HDMI-CEC] ** WakeUpMessage ** send message: 4 to address 0 [VTI HDMI-CEC] ** ActiveSourceMessage ** send message: 82:10:0 to address f [VTI HDMI-CEC] ** Active VU Message ** send message: 85 to address f [VTI HDMI-CEC] received cec message 87 from 0 [VTI HDMI-CEC] send cec message 82:10:0 to f [VTI HDMI-CEC] send cec message 8e:0 to f [VTI HDMI-CEC] received cec message 0 from 0 [VTI HDMI-CEC] received cec message 89 from 0 [VTI HDMI-CEC] received cec message 89 from 0 [VTI HDMI-CEC] received cec message 82 from 0
Дальше жмём кнопки на пульте ТВ и смотрим коды в журнале. Если хочется обратного эффекта, то есть другой инструмент: В скрипте начиная со строки 103 есть закомментированный блок:
Спойлер:
# only used for testing # self.list.append( self.hdmiinputaddress ) # self.list.append( self.hdmiinputvalue1 ) # self.list.append( self.hdmiinputvalue2 ) # self.list.append( self.hdmiinputvalue3 ) # self.list.append( self.hdmiinputvalue4 ) # self.list.append( self.hdmilogenabledfile ) # self.list.append( self.hdmilogenabledserial ) # end testing
Если снять значок комментария (#), то после перезагрузки Энигмы из интерфейса плагина можно будет выдавать любые команды в телевизор, и смотреть на результат. Список команд с описанием - в присоединённом эксельном файле.
Далее: обработку принятых от телевизора команд добавляем в функцию messageReceived (по примеру уже написанных). Например, я добавил отклик на запросы телевизора "Request Vendor ID" (запрос производителя ресивера), и "Request a status of device" (запрос состояния ресивера):
elif message == 0x1a: # request a status of device address = addresstv cecmessage = 0x1b # send a status of device cecmessagetwo = 0x11 # play cmd = struct.pack('BB',cecmessage,cecmessagetwo) logcmdtwo = "[VTI HDMI-CEC] send cec message %x:%x to %x" % (cecmessage,cecmessagetwo,address)
Отступы строго соблюдаем - в питоне это критично! Как видно, вполне можно притвориться и дримбоксом. По идее, эти строчки должны улучшить распознавание и работу разных моделей ТВ с ресивером.
Чтобы сделать пробуждение ресивера от телевизора, надо править в этой-же функции messageReceived строку: elif message == 0x85: # request active source подставляем вместо 0x85 нужный код (я временно подставил 0x87), и ресивер будет просыпаться по команде с телевизора.
Теперь об обещанном ляпе в VTI: команды HDMI-CEC содержат собственно код команды, и параметры. Так вот, параметры в VTI просто решили не принимать! То есть в случае команды с параметрами - получить её просто не удастся. Зачем они это сделали - непонятно.
Добавлено 15 сентября | 2011г. | 19:21:20 Ну вот - в моём случае это всё. Синхронного включения/выключения я добился, а дальше продвинуться не удаётся: телевизор всё передаёт исключительно параметрами в команде 89, которые нигде не документированы. Надеюсь, в видеооборудовании других марок не такие кардинальные отличия от стандартов.