Инструменты пользователя

Инструменты сайта


Управление телевизором через HDMI

HDMI-CEC позволяет управлять устройствами, подключённых кабелем HDMI.

Шина CEC (Consumer Electronics Control) — опциональный компонент протокола и интерфейса HDMI. Не всякое устройство поддерживает эту технологию. CEC преподносится различными производителями для конечного пользователя под разными торговыми названиями:

  • Anynet+[2] (Samsung)
  • Aquos Link (Sharp)
  • BRAVIA Sync (Sony)
  • HDMI-CEC (Hitachi)
  • Kuro Link (Pioneer)
  • CE-Link и Regza Link (Toshiba)
  • RIHD (Remote Interactive over HDMI) (Onkyo)
  • SimpLink (LG)
  • HDAVI Control, EZ-Sync, и VIERA Link (Panasonic)
  • EasyLink (Philips)
  • NetCommand for HDMI (Mitsubishi)

Установка библиотеки на Raspberry Pi

Поддержка технологии CEC из коробки отсутствует в ОС Raspbian, но её можно подключить, установив библиотеку libCEC. Откройте терминал и последовательно выполните команды:

sudo apt-get update
sudo apt-get install cmake libudev-dev libxrandr-dev python-dev swig
cd
git clone https://github.com/Pulse-Eight/platform.git
mkdir platform/build
cd platform/build
cmake ..
make
sudo make install
cd
git clone https://github.com/Pulse-Eight/libcec.git
mkdir libcec/build
cd libcec/build
cmake -DRPI_INCLUDE_DIR=/opt/vc/include -DRPI_LIB_DIR=/opt/vc/lib ..
make -j4
sudo make install
sudo ldconfig

Убедитесь, что библиотека установилась и команда cec-client доступна в терминале:

cec-client -h

Должен появиться список флагов (опций) для команды cec-client.

Управление из консоли

Подключите телевизор HDMI-кабелем к Raspberry Pi и выполните команду:

echo h | cec-client -s -d 1

В ответ появится список доступных команд:

Available commands:
[tx] {bytes}              transfer bytes over the CEC line.
[txn] {bytes}             transfer bytes but don't wait for transmission ACK.
[on] {address}            power on the device with the given logical address.
[standby] {address}       put the device with the given address in standby mode.
[la] {logical address}    change the logical address of the CEC adapter.
[p] {device} {port}       change the HDMI port number of the CEC adapter.
[pa] {physical address}   change the physical address of the CEC adapter.
[as]                      make the CEC adapter the active source.
[is]                      mark the CEC adapter as inactive source.
[osd] {addr} {string}     set OSD message on the specified device.
[ver] {addr}              get the CEC version of the specified device.
[ven] {addr}              get the vendor ID of the specified device.
[lang] {addr}             get the menu language of the specified device.
[pow] {addr}              get the power status of the specified device.
[name] {addr}             get the OSD name of the specified device.
[poll] {addr}             poll the specified device.
[lad]                     lists active devices on the bus
[ad] {addr}               checks whether the specified device is active.
[at] {type}               checks whether the specified device type is active.
[sp] {addr}               makes the specified physical address active.
[spl] {addr}              makes the specified logical address active.
[volup]                   send a volume up command to the amp if present
[voldown]                 send a volume down command to the amp if present
[mute]                    send a mute/unmute command to the amp if present
[self]                    show the list of addresses controlled by libCEC
[scan]                    scan the CEC bus and display device info
[mon] {1|0}               enable or disable CEC bus monitoring.
[log] {1 - 31}            change the log level. see cectypes.h for values.
[ping]                    send a ping command to the CEC adapter.
[bl]                      to let the adapter enter the bootloader, to upgrade the flash rom.
[r]                       reconnect to the CEC adapter.
[h] or [help]             show this help.
[q] or [quit]             to quit the CEC test client and switch off all connected CEC devices.

Команд довольно много, но самыми интересными кажутся включение/выключение телевизора (on / standby), изменение громкости (volup / voldown / mute) и переключение активного источника сигнала (as / is).

Запускаем cec-client:

cec-client

Выполняем команду отключения телевизора. {address} устройства указываем 0:

standby 0

То же самое пробуем для включения:

on 0

Число 0 указывает на телевизор. Другие типы устройств имеют другое число. В файле cectypes.h библиотеки libCEC можно посмотреть эти числа:

typedef enum cec_logical_address
{
  CECDEVICE_UNKNOWN          = -1, //not a valid logical address
  CECDEVICE_TV               = 0,
  CECDEVICE_RECORDINGDEVICE1 = 1,
  CECDEVICE_RECORDINGDEVICE2 = 2,
  CECDEVICE_TUNER1           = 3,
  CECDEVICE_PLAYBACKDEVICE1  = 4,
  CECDEVICE_AUDIOSYSTEM      = 5,
  CECDEVICE_TUNER2           = 6,
  CECDEVICE_TUNER3           = 7,
  CECDEVICE_PLAYBACKDEVICE2  = 8,
  CECDEVICE_RECORDINGDEVICE3 = 9,
  CECDEVICE_TUNER4           = 10,
  CECDEVICE_PLAYBACKDEVICE3  = 11,
  CECDEVICE_RESERVED1        = 12,
  CECDEVICE_RESERVED2        = 13,
  CECDEVICE_FREEUSE          = 14,
  CECDEVICE_UNREGISTERED     = 15,
  CECDEVICE_BROADCAST        = 15
} cec_logical_address;

Протокол CEC по умолчанию выводит много информации в консоль. Это не очень удобно, поэтому ограничим количество информации командой log с числовым параметром. Число отвечает за уровень вывода (log level). Допустимые числа для уровня вывода можно посмотреть всё в том же cectypes.h:

typedef enum cec_log_level
{
  CEC_LOG_ERROR   = 1,
  CEC_LOG_WARNING = 2,
  CEC_LOG_NOTICE  = 4,
  CEC_LOG_TRAFFIC = 8,
  CEC_LOG_DEBUG   = 16,
  CEC_LOG_ALL     = 31
} cec_log_level;

Оставим только вывод ошибок и предупреждений, это соответствует числу 3:

log 3

Теперь можно пробовать другие команды.

Чтобы выйти из интерфейса cec-client, нажмите Ctrl+C.

Разовые команды

Работать с cec-client можно и не подключаясь к интерфейсу команды. Для этого предназначен флаг -s.

echo "standby 0" | cec-client -s
echo "on 0" | cec-client -s
echo "as" | cec-client -s
echo "is" | cec-client -s

Выполнив одну из команд, консоль вернётся в свое изначальное состояние. Это удобно, если нет необходимости выполнять за раз больше одной команды, а результат её выполнения не очень важен.