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