Fernseher über HDMI (CEC) per Raspberry PI steuern

Wie der begeisterte Bastler bestimmt schon gemerkt hat, kann man mit dem Raspberry PI so einige coole Geräte steuern.
So ist es vielleicht auch nützlich den Fernseher ansteuern zu können. Dafür braucht man generell kein Raspberry PI, sondern nur HDMI und ein CEC-fähigen Fernseher, Endgerät. CEC ist ein definiertes Steuerprotokoll, worüber sich Entertainment Geräte steuern lassen und so z.B. eingeschaltet, ausgeschaltet werden können.
Je nach Hersteller heißt das aber nicht immer CEC, sondern z.B. Anynet+ bei Samsung oder Bravia Theatre Sync bei Sony. Hier findet ihr noch einen ganz einfach geschrieben Artikel der CEC erklärt.
Mit der Software „cec-client“ könnt ihr unter einem Linux-Gerät euren Fernseher via HDMI steuern.
Ich beschreibe hier kurz die Installation und ein paar nützliche Befehle.
Schritt 1: Notwendige Abhängigkeiten installieren

sudo apt-get install autoconf build-essential git liblockdev1-dev libtool libudev-dev pkg-config 

Schritt 2: Quellcode herunterladen
Die Quellen für libcec bzw. cec-client sind offen verfügbar unter: https://github.com/Pulse-Eight/libcec.

git clone git://github.com/Pulse-Eight/libcec.git

Schritt 3: Konfigurieren

cd libcec/
./bootstrap
./configure --with-rpi-include-path=/opt/vc/include --with-rpi-lib-path=/opt/vc/lib --enable-rpi

Schritt 4: Kompilieren

make
sudo make install
sudo ldconfig

Schritt 5: Testen
Nun probieren wir aus, ob der cec-client denn funktioniert, er müsste den Raspberry PI erkennen.

pi@RPI ~ $ cec-client -l
Found devices: 1
device: 1
com port: RPI
vendor id: 2708
product id: 1001
firmware version: 1
type: Raspberry Pi

So und nun zum interessanten Teil: Fernseher per HDMI steuern.
Prüft ob an eurem Fernseher die HDMI-CEC Funktion eingeschaltet ist. Dies ist Standardmäßig nicht immer der Fall. In der Regel findet sich dies immer irgendwo unter Einstellungen -> System -> HDMI.
Fernseher per CEC-Client einschalten: 
Folgenden Befehl einfach über die Kommandozeile absetzen.

echo "on 0" | sudo cec-client -s -d 1

Das -s brauchen wir, damit der cec-client im „Single Command“ Mode arbeitet, und unseren Befehl per echo-pipe entgegen nimmt.
Das -d 1 setzt das Loglevel und sorgt für eine überschaubare Rückmeldung. Ihr könnt das ruhig mal weglassen und die komplette Ausgabe analysieren.
Fernseher per CEC-Client ausschalten:

echo "standby 0" | sudo cec-client -s -d 1

Power-Status per CEC-Client auslesen:

echo "pow 0" | sudo cec-client -s -d 1

Fernseher per CEC-Client auf HDMI1,HDMI2,HDMI3, usw. umschalten:

echo "tx 4F 82 10 00" | cec-client -s

Wofür das 4F steht weiß ich ehrlich gesagt nicht, die 82 steht für den „Active Source“ Befehl, die 10 ist bei meinem Sony Fernseher HDMI1, die 00 ist das Ziel als Broadcast.
Um auf HDMI4 umzuschalten wäre der Befehl also:

echo "tx 4F 82 40 00" | cec-client -s

Da muss man ein bisschen herumprobieren, kann je nach Fernseher etwas unterschiedlich sein.
Hilfreich kann folgende Seite sein: www.cec-o-matic.com, dort kann man sich die HDMI Befehle passend zusammenklicken.

13 Gedanken zu „Fernseher über HDMI (CEC) per Raspberry PI steuern“

  1. Hallo,
    zunächst herzlichen Dank für dieses Tutorial, funktioniert hervorragend. Genau danach habe ich gesucht 😉
    Bei mir ergab sich das Problem, dass die libbcm_host.so nicht gefunden wurde. Deshalb konnte die frisch compilierte libcec.so nicht geladen werden. Abhilfe schaffte eine selbst erstellte /etc/ld.so.conf.d/libbcm.conf mit einem Dreizeiler:
    # libbcm_host.so on raspberry is found here
    /opt/vc/lib
    /opt/vc/include
    Danach noch einmal ‚ldconfig‘ aufrufen, und alles läuft.
    Eine Frage noch: Ist das Fehlen des ’sudo‘ beim umschalten beabsichtig?
    Beste Grüße, Steffen

    Antworten
  2. Hallo,
    ein Bisschen Spielerei später (cec-o-matic machts möglich), habe ich herausgefunden, dass die „4F“ Source und Destination codiert. 4 steht hier für „Playback 1“ als Source und F steht für „Broadcast“ als Destination.
    Außerdem steht laut cec-o-matic nicht die ’10‘ als Adresse, sondern die ’10 00′, die in die physikalische Adresse 1.0.0.0 gewandelt wird.
    Beste Grüße, Steffen

    Antworten
  3. Danke für das Tutorial.
    Das Umschalten der HDMI Kanäle kannste ich noch nicht.
    Allerdings hängt der cec-client mit:
    „command ‚active source‘ timeout“
    Habt ihr eine Idee warum?
    Bei mit wird übrigens nicht „Playback 1“ eingeblendet sondern „Recorder 1“ (Sony KDL-55W805B)
    Und noch etwas:
    Wie schaltet man auf den TV „Eingang“ um?
    Viele Grüße,
    NCO

    Antworten
  4. Vielen Dank fuer das Tutorial, leider sind die Installationsschritte outdatet:
    Ein Auszug aus der README.md:
    To compile libCEC on a new Raspbian installation, follow these instructions:
    „`
    apt-get update
    apt-get install cmake liblockdev1-dev 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
    Cheers,
    vimtut0r

    Antworten
  5. Hallo, danke für alles oben stehende.
    Ich habe soweit alles zum laufen gebracht, aber habe ein merkwürdiges Problem. Schalte ich den TV über CEC aus und wieder an, kann ich ihn nicht wieder in den Standby schalten.
    Manuelles an- und ausschalten bringt ebenfalls keine Besserung.
    Drücke ich allerdings auf der FB z.B. „nur“ die Return-Taste, kann ich den TV wieder über das CEC steuern. Allerdings wieder nur 1 „Zyklus“.
    Es erfordert also momentan eine Interaktion auf der FB. Ist so ein Problem bisher bekannt? Habe ich evtl etwas übersehen? Betreibe einen Toshiba am Pi. Danke schonmal für jegliche Hilfe.

    Antworten
    • Hallo, nach „make -j4“ bekomme ich Fehlermeldungen:
      In file included from /home/pi/libcec/src/libcec/CECClient.cpp:35:0:
      /home/pi/libcec/src/libcec/CECClient.h:49:11: error: ‘shared_ptr’ in namespace ‘std’ does not name a type
      u.s.w.
      Was kann das sein?

      Antworten
  6. Hallo zusammen,
    ich hoffe, mir kann einer helfen. Ich finde einfach nichts brauchbares. Ich habe einen Windows 10 PC und einen Samsung SmartTV. Dazu habe ich mir auch den HDMI-CEC Adapter von Pulse-Eight gekauft.
    Doch ich bekomme es einfach nicht hin, dass sich der TV einschaltet, wenn der PC aus den Ruhezustand geweckt wird.
    Wie schreibe ich so ein Skript für Windows? Und was brauche ich alles dafür?

    Antworten

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.