Achtung: Diese Seite enthält Partner- und Werbe-Links. Daher ist diese Seite im Gesamten als Werbeanzeige zu verstehen!
Zu einem sauber konfigurierten Smart Home gehört natürlich auch ein smarter Fernseher. Damit letztlich mein Kinomodus nicht nur die Musik ausschaltet und das Licht entsprechend dimmt, sondern auch den Fernseher automatisch anschaltet. In diesem Artikel erkläre ich, wie Fernseher von Telefunken- in meinem Fall einem Telefunken XU65A441- mit OpenHAB verbunden werden können.
Schon als ich 2014 die iPhone-App ulreco entwickelt habe, hatte ich die Geräte aller namhaften Fernsehhersteller implementiert. Und zwar indem ich mir jeden Tag einen Fernseher im MediaMarkt oder von einem Freund geliehen und die vom Hersteller mitgelieferte App zur Fernsteuerung untersucht habe. Leider hat mir für jede Marke ein einziger Tag gereicht, um die Kommunikation zu verstehen und die Steuerung entsprechend auch aus meiner App zu ermöglichen. Nur für Geräte von Toshiba habe ich letztlich drei Tage benötigt, da ich hier eine bei den anderen Herstellern nicht vorhandene, zusätzliche Verschlüsselung knacken musste.
Da ich leider kein fertiges Telefunken- Binding für OpenHAB finden konnte und auch OpenHAB keinen Treffer oder sonstige Informationen darüber lieferten, wie sich Telefunken-Fernseher per W-LAN aus der Ferne steuern lassen, habe ich natürlich auch auf gleichem Wege meinen aktuellen Fernseher untersucht. Die Lösung hatte ich schon nach wenigen Minuten. Mit dem Web-Proxy charles konnte ich die ungesicherte HTTP-Kommunikation ohne weiteren Aufwand einsehen und feststellen, dass das Gerät auf einfache XML-Kommandos hört, die als HTTP-POST
an einen auf dem Fernseher laufenden, nicht weiter abgesicherten, Webserver geschickt werden.
Um beispielsweise die Lautstärke zu erhöhen, muss lediglich <?xml version="1.0" ?><remote><key code="1016"/></remote>
an die URL /apps/vr/remote
geschickt werden. Die IP-Adresse ( 192.168.0.4
) muss natürlich angepasst werden. Der Port für die Steuerung ist in meinem Fall 56789
, scheint aber zu variieren, denn die App Telefunkee tastet beim ersten Start einige Ports ab. Am Ende dieses Artikels habe ich die gesamte mir bisher bekannte Liste an möglichen Befehlscodes angehängt.
Mit dem folgenden curl-Befehl erhöht mein Telefunken-Fernseher beispielsweise die Lautstärke um eine Einheit:
curl -H 'Host: 192.168.0.4:56789' \
-H 'Accept: */*' \
-H 'User-Agent: SmartRemote/030100 CFNetwork/811.4.18 Darwin/16.5.0' \
-H 'Accept-Language: en-us' \
--data '<?xml version="1.0" ?><remote><key code="1016"/></remote>' \
--compressed \
'http://192.168.0.4:56789/apps/vr/remote'
Der Fernseher ist an dieser Stelle relativ tolerant, sodass auch der folgende, auf das mindeste reduzierte Webserver-Aufruf noch funktioniert:
curl -H 'Host: 192.168.0.4:56789' \
--data '<remote><key code=1016/></remote>' \
'http://192.168.0.4:56789/apps/vr/remote'
Als Softwareentwickler der aus der objektorientierten Welt kommt und stets bemüht ist, doppelten Code zu vermeiden, hatte ich mit der Konfiguration anfangs meine Probleme. Nach etwas Recherche habe ich dann aber die Scripts entdeckt und war in der Lage, die gesamte Logik in einfacher Form entsprechend auszulagern.
Im ersten Schritt habe ich alle Funktionen des Fernsehers als Item angelegt um später auf Zustandsänderungen der Schalter reagieren zu können.
items/telefunken.items
Player item_telefunken_player "Telefunken Steuerung"
Switch item_telefunken_channel_down "Telefunken Vorheriger Sender" ["Switchable"]
Switch item_telefunken_channel_up "Telefunken Nächster Sender" ["Switchable"]
Switch item_telefunken_channel_ard_hd "Telefunken Sender: ARD HD" ["Switchable"]
Switch item_telefunken_channel_zdf_hd "Telefunken Sender: ZDF HD" ["Switchable"]
Switch item_telefunken_channel_3sat_hd "Telefunken Sender: 3Sat HD" ["Switchable"]
Switch item_telefunken_channel_arte_hd "Telefunken Sender: Arte HD" ["Switchable"]
Switch item_telefunken_channel_servustv_hd "Telefunken Sender: ServusTV HD" ["Switchable"]
Switch item_telefunken_channel_br_fernsehen_sued_hd "Telefunken Sender: BR Fernsehen Süd HD" ["Switchable"]
Switch item_telefunken_channel_wdr_koeln_hd "Telefunken Sender: WDR Köln HD" ["Switchable"]
Switch item_telefunken_channel_hr_fernsehen_hd "Telefunken Sender: hr-fernsehen HD" ["Switchable"]
Switch item_telefunken_channel_swr_bw_hd "Telefunken Sender: SWR BW HD" ["Switchable"]
Switch item_telefunken_channel_regio_tv_hd "Telefunken Sender: Regio TV HD" ["Switchable"]
Switch item_telefunken_channel_zdf_neo_hd "Telefunken Sender: ZDF_neo HD" ["Switchable"]
Switch item_telefunken_channel_one_hd "Telefunken Sender: one HD" ["Switchable"]
Switch item_telefunken_channel_kika_hd "Telefunken Sender: KIKA HD" ["Switchable"]
Switch item_telefunken_channel_rtl "Telefunken Sender: RTL" ["Switchable"]
Switch item_telefunken_channel_sat1 "Telefunken Sender: Sat.1" ["Switchable"]
Switch item_telefunken_channel_prosieben "Telefunken Sender: ProSieben" ["Switchable"]
Switch item_telefunken_channel_rtl2 "Telefunken Sender: RTL 2" ["Switchable"]
Switch item_telefunken_channel_kabeleins "Telefunken Sender: kabel wins" ["Switchable"]
Switch item_telefunken_channel_vox "Telefunken Sender: VOX" ["Switchable"]
Switch item_telefunken_channel_3sat "Telefunken Sender: 3sat" ["Switchable"]
Switch item_telefunken_channel_kabeleins_doku "Telefunken Sender: kabel eins Doku" ["Switchable"]
Switch item_telefunken_channel_n24_doku "Telefunken Sender: N24 Doku" ["Switchable"]
Switch item_telefunken_channel_dmax "Telefunken Sender: DMAX" ["Switchable"]
Switch item_telefunken_channel_d_musik_fernsehen "Telefunken Sender: Deutsches Musik Fernsehen" ["Switchable"]
Switch item_telefunken_channel_viva_comedy_central "Telefunken Sender: VIVA/Comedy Central" ["Switchable"]
Switch item_telefunken_channel_super_rtl "Telefunken Sender: Super RTL" ["Switchable"]
Switch item_telefunken_channel_nickelodeon "Telefunken Sender: Nickelodeon" ["Switchable"]
Switch item_telefunken_channel_sixx "Telefunken Sender: SIXX" ["Switchable"]
Switch item_telefunken_channel_rtl_nitro "Telefunken Sender: RTL NITRO" ["Switchable"]
Switch item_telefunken_channel_prosieben_maxx "Telefunken Sender: ProSieben MAXX" ["Switchable"]
Switch item_telefunken_channel_sat1_gold "Telefunken Sender: Sat.1 Gold" ["Switchable"]
Switch item_telefunken_channel_sport1 "Telefunken Sender: SPORT1" ["Switchable"]
Switch item_telefunken_channel_zee_one "Telefunken Sender: ZEE.ONE" ["Switchable"]
Switch item_telefunken_channel_n24 "Telefunken Sender: N24" ["Switchable"]
Switch item_telefunken_channel_ntv "Telefunken Sender: n-tv" ["Switchable"]
Switch item_telefunken_dashboard "Telefunken Dashboard öffnen" ["Switchable"]
Switch item_telefunken_function_key_blue "Telefunken Funktionstaste blau" ["Switchable"]
Switch item_telefunken_function_key_green "Telefunken Funktionstaste grün" ["Switchable"]
Switch item_telefunken_function_key_red "Telefunken Funktionstaste rot" ["Switchable"]
Switch item_telefunken_function_key_yellow "Telefunken Funktionstaste gelb" ["Switchable"]
Switch item_telefunken_lang "Telefunken Lang" ["Switchable"]
Switch item_telefunken_media_backwards "Telefunken Media backwards" ["Switchable"]
Switch item_telefunken_media_browser "Telefunken Media browser" ["Switchable"]
Switch item_telefunken_media_forwards "Telefunken Media forwards" ["Switchable"]
Switch item_telefunken_media_info "Telefunken Media Info" ["Switchable"]
Switch item_telefunken_media_input "Telefunken Media Quelle" ["Switchable"]
Switch item_telefunken_media_pause "Telefunken Media pause" ["Switchable"]
Switch item_telefunken_media_play_pause "Telefunken Media play/pause" ["Switchable"]
Switch item_telefunken_media_record "Telefunken Media aufnehmen" ["Switchable"]
Switch item_telefunken_media_stop "Telefunken Media stop" ["Switchable"]
Switch item_telefunken_menu_back "Telefunken Menü zurück" ["Switchable"]
Switch item_telefunken_menu_down "Telefunken Menü runter" ["Switchable"]
Switch item_telefunken_menu_exit "Telefunken Menü exit" ["Switchable"]
Switch item_telefunken_menu_ok "Telefunken Menü ok" ["Switchable"]
Switch item_telefunken_menu_left "Telefunken Menü links" ["Switchable"]
Switch item_telefunken_menu_right "Telefunken Menü rechts" ["Switchable"]
Switch item_telefunken_menu_toggle_epg "Telefunken EPG an-/ausschalten" ["Switchable"]
Switch item_telefunken_menu_toggle_favorites "Telefunken Favoriten an-/ausschalten" ["Switchable"]
Switch item_telefunken_menu_toggle_main "Telefunken Hauptmenü an-/ausschalten" ["Switchable"]
Switch item_telefunken_menu_toggle_quick "Telefunken Quick-Menü an-/ausschalten" ["Switchable"]
Switch item_telefunken_menu_up "Telefunken Menü hoch" ["Switchable"]
Switch item_telefunken_numpad_0 "Telefunken Numpad: 0" ["Switchable"]
Switch item_telefunken_numpad_1 "Telefunken Numpad: 1" ["Switchable"]
Switch item_telefunken_numpad_2 "Telefunken Numpad: 2" ["Switchable"]
Switch item_telefunken_numpad_3 "Telefunken Numpad: 3" ["Switchable"]
Switch item_telefunken_numpad_4 "Telefunken Numpad: 4" ["Switchable"]
Switch item_telefunken_numpad_5 "Telefunken Numpad: 5" ["Switchable"]
Switch item_telefunken_numpad_6 "Telefunken Numpad: 6" ["Switchable"]
Switch item_telefunken_numpad_7 "Telefunken Numpad: 7" ["Switchable"]
Switch item_telefunken_numpad_8 "Telefunken Numpad: 8" ["Switchable"]
Switch item_telefunken_numpad_9 "Telefunken Numpad: 9" ["Switchable"]
Switch item_telefunken_power "Telefunken An-/Ausschalten" ["Switchable"]
Switch item_telefunken_text "Telefunken Text" ["Switchable"]
Switch item_telefunken_timer "Telefunken Timer" ["Switchable"]
Switch item_telefunken_toggle_display_ratio "Telefunken Seitenverhältnis wechseln" ["Switchable"]
Switch item_telefunken_toggle_subtitles "Telefunken Untertitel an-/ausschalten" ["Switchable"]
Switch item_telefunken_volume_down "Telefunken leiser" ["Switchable"]
Switch item_telefunken_volume_toggle_mute "Telefunken Lautlos an-/ausschalten" ["Switchable"]
Switch item_telefunken_volume_up "Telefunken lauter" ["Switchable"]
Ich lege mir pro zu steuerndes Smart-Home-Gerät immer eine Sitemap an, die grundsätzlich alle mir zur Verfügung stehenden Schalter, Texte und sonstige Inhalte enthält. So kann ich mir später leicht Steuerungs-Ansichten bauen, die für meinen jeweiligen Anwendungsfall sinnvoll sind.
sitemaps/telefunken.sitemap
sitemap telefunken label="Telefunken" {
Frame label="Allgemein" {
Default item=item_telefunken_player label="Player"
Switch item=item_telefunken_power label="An/aus" icon="switch"
Switch item=item_telefunken_dashboard label="Dashboard" icon="switch"
}
Frame label="Lautstärke" {
Switch item=item_telefunken_volume_down label="Leiser" icon="switch"
Switch item=item_telefunken_volume_toggle_mute label="Lautlos an/aus" icon="switch"
Switch item=item_telefunken_volume_up label="Lauter" icon="switch"
}
Frame label="Sender" {
Switch item=item_telefunken_channel_up label="Nächster Sender" icon="switch"
Switch item=item_telefunken_channel_down label="Vorheriger Sender" icon="switch"
Switch item=item_telefunken_channel_ard_hd label="ARD HD" icon="switch"
Switch item=item_telefunken_channel_zdf_hd label="ZDF HD" icon="switch"
Switch item=item_telefunken_channel_3sat_hd label="3Sat HD" icon="switch"
Switch item=item_telefunken_channel_arte_hd label="Arte HD" icon="switch"
Switch item=item_telefunken_channel_servustv_hd label="ServusTV HD" icon="switch"
Switch item=item_telefunken_channel_br_fernsehen_sued_hd label="BR Fernsehen Süd HD" icon="switch"
Switch item=item_telefunken_channel_wdr_koeln_hd label="WDR Köln HD" icon="switch"
Switch item=item_telefunken_channel_hr_fernsehen_hd label="hr-fernsehen HD" icon="switch"
Switch item=item_telefunken_channel_swr_bw_hd label="SWR BW HD" icon="switch"
Switch item=item_telefunken_channel_regio_tv_hd label="Regio TV HD" icon="switch"
Switch item=item_telefunken_channel_zdf_neo_hd label="ZDF_neo HD" icon="switch"
Switch item=item_telefunken_channel_one_hd label="one HD" icon="switch"
Switch item=item_telefunken_channel_kika_hd label="KIKA HD" icon="switch"
Switch item=item_telefunken_channel_rtl label="RTL" icon="switch"
Switch item=item_telefunken_channel_sat1 label="Sat.1" icon="switch"
Switch item=item_telefunken_channel_prosieben label="ProSieben" icon="switch"
Switch item=item_telefunken_channel_rtl2 label="RTL 2" icon="switch"
Switch item=item_telefunken_channel_kabeleins label="kabel wins" icon="switch"
Switch item=item_telefunken_channel_vox label="VOX" icon="switch"
Switch item=item_telefunken_channel_3sat label="3sat" icon="switch"
Switch item=item_telefunken_channel_kabeleins_doku label="kabel eins Doku" icon="switch"
Switch item=item_telefunken_channel_n24_doku label="N24 Doku" icon="switch"
Switch item=item_telefunken_channel_dmax label="DMAX" icon="switch"
Switch item=item_telefunken_channel_d_musik_fernsehen label="Deutsches Musik Fernsehen" icon="switch"
Switch item=item_telefunken_channel_viva_comedy_central label="VIVA/Comedy Central" icon="switch"
Switch item=item_telefunken_channel_super_rtl label="Super RTL" icon="switch"
Switch item=item_telefunken_channel_nickelodeon label="Nickelodeon" icon="switch"
Switch item=item_telefunken_channel_sixx label="SIXX" icon="switch"
Switch item=item_telefunken_channel_rtl_nitro label="RTL NITRO" icon="switch"
Switch item=item_telefunken_channel_prosieben_maxx label="ProSieben MAXX" icon="switch"
Switch item=item_telefunken_channel_sat1_gold label="Sat.1 Gold" icon="switch"
Switch item=item_telefunken_channel_sport1 label="SPORT1" icon="switch"
Switch item=item_telefunken_channel_zee_one label="ZEE.ONE" icon="switch"
Switch item=item_telefunken_channel_n24 label="N24" icon="switch"
Switch item=item_telefunken_channel_ntv label="n-tv" icon="switch"
}
Frame label="Numpad" {
Switch item=item_telefunken_numpad_0 label="0" icon="switch"
Switch item=item_telefunken_numpad_1 label="1" icon="switch"
Switch item=item_telefunken_numpad_2 label="2" icon="switch"
Switch item=item_telefunken_numpad_3 label="3" icon="switch"
Switch item=item_telefunken_numpad_4 label="4" icon="switch"
Switch item=item_telefunken_numpad_5 label="5" icon="switch"
Switch item=item_telefunken_numpad_6 label="6" icon="switch"
Switch item=item_telefunken_numpad_7 label="7" icon="switch"
Switch item=item_telefunken_numpad_8 label="8" icon="switch"
Switch item=item_telefunken_numpad_9 label="9" icon="switch"
}
Frame label="Menü" {
Switch item=item_telefunken_menu_back label="Zurück" icon="switch"
Switch item=item_telefunken_menu_down label="Runter" icon="switch"
Switch item=item_telefunken_menu_exit label="Exit" icon="switch"
Switch item=item_telefunken_menu_left label="Links" icon="switch"
Switch item=item_telefunken_menu_ok label="OK" icon="switch"
Switch item=item_telefunken_menu_right label="Rechts" icon="switch"
Switch item=item_telefunken_menu_toggle_epg label="EPG an/aus" icon="switch"
Switch item=item_telefunken_menu_toggle_favorites label="Favoriten-Menü an/aus" icon="switch"
Switch item=item_telefunken_menu_toggle_main label="Hauptmenü an/aus" icon="switch"
Switch item=item_telefunken_menu_toggle_quick label="Quick-Menü an/aus" icon="switch"
Switch item=item_telefunken_menu_up label="Hoch" icon="switch"
}
Frame label="Medien" {
Switch item=item_telefunken_toggle_display_ratio label="Zurück" icon="switch"
Switch item=item_telefunken_media_backwards label="Zurückspulen" icon="switch"
Switch item=item_telefunken_media_browser label="Browser" icon="switch"
Switch item=item_telefunken_media_forwards label="Forspulen" icon="switch"
Switch item=item_telefunken_media_info label="Info" icon="switch"
Switch item=item_telefunken_media_input label="Input" icon="switch"
Switch item=item_telefunken_media_play_pause label="Play/Pause" icon="switch"
Switch item=item_telefunken_media_pause label="Pause" icon="switch"
Switch item=item_telefunken_media_record label="Aufnehmen" icon="switch"
Switch item=item_telefunken_media_stop label="Stop" icon="switch"
}
Frame label="Sonstiges" {
Switch item=item_telefunken_function_key_blue label="Blau" icon="switch"
Switch item=item_telefunken_function_key_green label="Grün" icon="switch"
Switch item=item_telefunken_function_key_red label="Rot" icon="switch"
Switch item=item_telefunken_function_key_yellow label="Gelb" icon="switch"
Switch item=item_telefunken_lang label="LANG" icon="switch"
Switch item=item_telefunken_text label="TEXT" icon="switch"
Switch item=item_telefunken_timer label="Timer" icon="switch"
Switch item=item_telefunken_toggle_subtitles label="Untertitel an/aus" icon="switch"
}
}
Damit die Schalter letztlich auch funktionieren, muss für jeden Schalter eine entsprechende Regel existieren, die reagiert, wenn der Schalter gedrückt wurde. Da OpenHAB leider keine Taster unterstützt, habe ich einen normalen Schalter genommen, den ich sofort nach dem Anschalten wieder ausschalte. In der nachfolgenden Regeldefinition reagiere ich, wenn der Schalter item_telefunken_volume_down
auf ON
gestellt wird. Ich gebe mir dann mit logWarn
eine kleine Notiz in der Logdatei aus, rufe mein Script auf und schalte den schalter mit postUpdate
anschließend sofort wieder aus, ohne ein Ereignis dafür zu senden.
rules/telefunken.rules
rule "Telefunken leiser"
when
Item item_telefunken_volume_down changed to ON
then
logWarn("telefunken", "item_telefunken_volume_down");
callScript("telefunken_volume_down");
postUpdate(item_telefunken_volume_down, OFF);
end
Das eigentliche Script selbst ruft letztlich nur noch die API meines Fernsehers auf und regelt in diesem Fall die Lautstärke herunter:
scripts/telefunken_volume_down.script
logWarn("hue", "telefunken_volume_down");
sendHttpPostRequest("http://192.168.0.118:56789/apps/vr/remote", "", "<remote><key code=1017/></remote>");
Initial viel Aufwand für die Erstellung von Boilerlate-Code, der sich aber letztlich dadurch auszeichnet, dass die eigentliche Logik zur Steuerung des Fernsehers nur ein Mal niedergeschrieben ist. Muss ich also jemals die Kommunikation mit dem Server anpassen, geschieht das an einer Stelle, nicht an mehreren. Das zahlt sich schon beim Definieren der Regel für das Ändern des Senders aus. Hier rufe ich meine Scripte zum Senden einer Zahl sowie dem "OK"-Button auf:
scripts/telefunken_channel_zdf_neo_hd.script
logWarn("telefunken", "telefunken_channel_zdf_neo_hd");
callScript("telefunken_numpad_2.script");
Thread::sleep(50);
callScript("telefunken_numpad_8.script");
Thread::sleep(50);
callScript("telefunken_menu_ok.script");
Diese Liste enthält alle Befehlscodes, die an einen Telefunken-Fernsehgerät gesendet werden können. Leider ist diese Liste nicht komplett, da ich keine Dokumentation finde und auch bisher bei Telefunken sowie im Hintergrund stehenden Herstellerfirmen keine passende Auskunft bekommen habe. Meine gesamte Telefunken-OpenHAB-Konfiguration kann außerdem hier als ZIP-Datei heruntergeladen werden.
Code | Befehl |
---|---|
1000 | Taste: 0 |
1001 | Taste: 1 |
1002 | Taste: 2 |
1003 | Taste: 3 |
1004 | Taste: 4 |
1005 | Taste: 5 |
1006 | Taste: 6 |
1007 | Taste: 7 |
1008 | Taste: 8 |
1009 | Taste: 9 |
1010 | Zurück |
1011 | Seitenverhältnis wechseln |
1012 | An- oderAusschalten |
1013 | Lautlos an-/ausschalten |
1015 | Button "LANG" |
1016 | Lauter |
1017 | Leiser |
1018 | Info |
1019 | Runter |
1020 | Hoch |
1021 | Links |
1022 | Rechts |
1024 | Stop |
1025 | Play/Pause |
1027 | Zurückspulen |
1028 | Vorspulen |
1031 | Untertitel an- oder ausschalten |
1037 | Schließen |
1040 | Favoriten-Menü öffnen |
1042 | Timer |
1043 | Quick-Menü öffnen |
1046 | App-Dashboard |
1047 | EPG an- oder ausschalten |
1048 | Hauptmenü öffnen oder schließen |
1049 | Pause |
1050 | Gelb |
1051 | Aufnehmen |
1052 | Blue |
1053 | OK |
1054 | Grün |
1055 | Rot |
1056 | Bildquelle wählen |
1057 | Meidabrowser öffnen |
1255 | Button "TEXT" |