Blog Linux Avante

Raspberry Pi: ligue / desligue uma TV conectada via HDMI-CEC

2 de julho de 2019

Logotipo do Raspberry Pi

Com a ajuda do cec-client (parte de libcec), seu Raspberry Pi pode controlar um dispositivo que suporte CEC, como uma TV, conectado via HDMI. Você pode ligar ou desligar a TV, mudar a fonte ativa e muito mais.

Isso deve funcionar com qualquer versão ou modelo do Raspberry Pi, incluindo o Raspberry Pi original, bem como o Raspberry Pi 4 mais recente.

Um possível caso de uso para isso seria conectar a um Raspberry Pi via SSH e enviar um comando para ligar ou desligar uma TV conectada a ele via HDMI-CEC. Ou você pode usar os comandos para ligar a TV e tornar o adaptador CEC a fonte ativa em um script, de modo que quando você abrir algum aplicativo no seu Raspberry Pi, a TV que está conectada a ele via HDMI-CEC ligue e ligue o seu Fonte HDMI Raspberry Pi. Tenho certeza de que você pode pensar em vários outros casos de uso.

CEC, ou O Consumer Electronics Control, é um recurso do HDMI que permite controlar dispositivos conectados através de HDMI usando um controle remoto. Por exemplo, CEC é usado para obter os botões reproduzir/pausar em um controle remoto para controlar a reprodução em um dispositivo conectado via HDMI. Ou quando você reproduz um vídeo em um Chromecast com a TV desligada e a TV liga automaticamente e muda para a fonte do Chromecast.

A maioria das TVs e receptores AV modernos deve oferecer suporte a HDMI-CEC. No entanto, é importante notar que pode ser necessário habilitar o CEC nas configurações da TV em alguns modelos. CEC pode ter um nome diferente, dependendo da marca do dispositivo. Por exemplo, é chamado de Anynet + para TVs Samsung, EasyLink ou Fun-Link para Philips, SimpLink para LG e assim por diante.

Para poder ligar (e desligar) uma TV conectada via HDMI a um Raspberry Pi, o primeiro passo é instalar o cec-client. No Raspbian ou em alguma outra distribuição Linux baseada em Debian ou Ubuntu para Raspberry Pi, instale o pacote cec-utils (cec-client faz parte deste pacote):

Comandos para usar no terminal

sudo apt install cec-utils

Em outras distribuições do Linux, você terá que pesquisar por cec-client ou cec-utils nos repositórios ou compilar libcec da fonte.

Agora que cec-utils está instalado, vamos examinar o barramento CEC para dispositivos disponíveis:

Comandos para usar no terminal

echo 'scan' | cec-client -s -d 1

Neste comando, echo 'scan' envia o comando scan para cec-client, -s é usado para que cec-client execute um único comando e exista, e -d 1 define o nível de log para 1 (somente erros), para não poluir seu terminal com informações inúteis.

Lembre-se do número e endereço do dispositivo da TV (ou outro dispositivo conectado via HDMI-CEC ao seu Raspberry Pi), pois usaremos isso mais tarde.

Este é um exemplo executando este comando no meu Raspberry Pi conectado a uma TV Samsung via HDMI (com suporte CEC):

$ echo \'scan\' | cec-client -s -d 1
opening a connection to the CEC adapter...
requesting CEC bus information ...
CEC bus information
===================
device #0: TV
address:       0.0.0.0
active source: no
vendor:        Samsung
osd string:    TV
CEC version:   1.4
power status:  on
language:      eng

device #1: Recorder 1
address:       1.0.0.0
active source: no
vendor:        Pulse Eight
osd string:    CECTester
CEC version:   1.4
power status:  on
language:      eng

currently active source: unknown (-1)

Neste exemplo, o número do dispositivo 0 com o endereço 0.0.0.0 é minha TV Samsung, e o número do dispositivo 1 com o endereço 1.0.0.0 é meu dispositivo Raspberry Pi.

Agora que sabemos o número e o endereço do dispositivo, você pode usar o comando a seguir para ligar uma TV conectada via HDMI-CEC ao Raspberry Pi:

Comandos para usar no terminal

echo 'on ' | cec-client -s -d 1

Ou:

Comandos para usar no terminal

echo 'on ' | cec-client -s -d 1

Tanto o número do dispositivo (0 é a TV Samsung no exemplo acima) e o endereço do dispositivo (0.0.0.0 é o endereço do dispositivo da TV Samsung do meu exemplo) devem funcionar.

-d 1 é limitar o nível de log apenas para erros, e você pode usar o comando sem ele, mas verá um log longo, provavelmente inútil.

Exemplo:

Comandos para usar no terminal

echo 'on 0' | cec-client -s -d 1

Ou:

Comandos para usar no terminal

echo 'on 0.0.0.0' | cec-client -s -d 1

Você também deseja executar o comando as, que torna o adaptador CEC a fonte ativa (para que a TV mude para a fonte Raspberry Pi HDMI depois que a TV for ligada):

Comandos para usar no terminal

echo 'as' | cec-client -s -d 1

Deseja desligar a TV (entrar no modo de espera)? Usar:

Comandos para usar no terminal

echo 'standby ' | cec-client -s -d 1

Dependendo de como você usa isso, também pode ser necessário verificar o status atual da TV (ela está ligada ou em espera?). Isso pode ser feito usando:

Comandos para usar no terminal

echo 'pow ' | cec-client -s -d 1

Para visualizar todos os comandos que o cec-client pode enviar a um dispositivo conectado HDMI-CEC, use 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.
Confira a versão original desse post em inglês
Propaganda
Blog Comments powered by Disqus.
Propaganda