Управление телевизором через 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
Выполнив одну из команд, консоль вернётся в свое изначальное состояние. Это удобно, если нет необходимости выполнять за раз больше одной команды, а результат её выполнения не очень важен.