14 сентября | 2024г. | 07:52:38


АвторТема: Тонкая настройка HDMI-CEC - управление всеми устройствами одним пультом  (Прочитано 361851 раз)

0 Пользователей и 4 Гостей смотрят эту тему.

Оффлайн NomadАвтор темы

  • Друзья Джедаев
  • *****
  • Сообщений: 116
  • Поблагодарили: 212
  • Уважение: 0
Итак, предлагаю обсудить тему уменьшения количества пультов в доме.

В моём случае - есть очень удобный пульт от плазмы 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

Для наших целей нужно будет добавить пару строк в конфиг Энигмы:

1) заходим в терминал;
2) останавливаем Энигму: init 4
3) в файл /etc/enigma2/settings дописываем строки:
        config.hdmicec.logenabledserial=true
        config.hdmicec.logenabledfile=true

4) запускаем Энигму: init 3

После этого в файл /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 == 0x8c: # request vendor id
            address = addresstv
            cecmessage = 0x87  # send vendor id
            cecmessagetwo = 0x00
            cecmessagethree = 0x1d
            cecmessagefour = 0xec  # 001dec - Marusys, 000934 - DreamMultimedia, 001c62 - LG
            cmd = struct.pack('BBBB',cecmessage,cecmessagetwo,cecmessagethree,cecmessagefour)
            logcmd = "[VTI HDMI-CEC] send cec message %x:%x:%x:%x to %x" % (cecmessage,cecmessagetwo,cecmessagethree,cecmessagefour,address)

         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, которые нигде не документированы. Надеюсь, в видеооборудовании других марок не такие кардинальные отличия от стандартов. :)



Теги:
 

Похожие темы

  Тема / Автор Ответов Последний ответ
10 Ответов
30488 Просмотров
Последний ответ 27 сентября | 2019г. | 19:12:18
от savvidis
21 Ответов
27752 Просмотров
Последний ответ 08 июля | 2014г. | 23:47:42
от spy77777
6 Ответов
9575 Просмотров
Последний ответ 30 августа | 2019г. | 19:11:58
от UHD4K
1 Ответов
4663 Просмотров
Последний ответ 03 февраля | 2015г. | 08:11:52
от Alex.Caribsky
10 Ответов
10291 Просмотров
Последний ответ 04 мая | 2017г. | 16:21:10
от etdelio



X

Добро пожаловать!

Мы заметили, что у Вас установлено расширение AdBlock или ему подобное. Пожалуйста добавьте наш Клуб в белый список, внесите этим посильную лепту в его развитие. Спасибо!