Hi Leute, ich bin ein neuling in Sachen Homeautomation und openHAB.
Ich habe einen Telefunken Smart TV und möchte diesen gerne einbinden. Habt ihr Erfahrung mit so einem Fernseher.
Auf folgender Homepage: https://thomaskekeisen.de/de/blog/telef ... mart-home/
ist es zwar beschrieben, aber ich bekomme es einfach nicht hin.
Wenn ich folgenen Befehl unter Linux ausführe funktioniert es:
curl --data "<?xml version="1.0" ?><remote><key code="1012"/></remote>" "http://[URL]:56789/apps/SmartCenter"
Könt ihr mit weiterhelfen.
Besten Dank im voraus
MIndgamer
Telefunken Smart TV
- udo1toni
- Beiträge: 13989
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Telefunken Smart TV
Na ja, Herr Kekeisen hat ja hier nur an einer einzigen Stelle ein Codeschnipsel gezeigt. Ich sehe nicht, warum das sonderlich elegant sein soll, aber sei's drum...
von openHAB aus nutzt Du ein postHttpRequest, um den Fernbediencode über Netzwerk ans Gerät zu schicken. (smart geht anders).
Beispielsweise sendet der Befehl
den KeyCode 1017 an den Telefunken Fernseher, der unter der IP 192.168.0.118 auf Port 56789 ansprechbar ist.
Herr Kekeisen hat also für jeden KeyCode ein eigenes Script angelegt, welches er dann aus den Rules heraus anstubst. Für jeden Schalter in der UI gibt es eine Rule, welche dann die entsprechenden Codes über Scripte sendet. Letztlich ist das von hinten durch die Brust ins Auge. Oder wie man in Niedersachsen sagt: Peine - Paris - Gifhorn.
Da es offensichtlich niemanden gibt, der ein passendes Binding dazu entwickelt hat, wirst Du nicht um eine größere Menge Rules Code kommen. Aber ganz so schlimm wie Herr Kekeisen das da vorgemacht hat, muss es nicht sein
Du brauchst zunächst ein StringItem, welches ich hier tfKeyCode genannt habe.
Dann diese Rule;
Für einen ersten Test reicht eine Sitemap, mit der Du die grundsätzliche Funktion testen kannst:
Die Sitemap muss den NAmen telefunken.sitemap tragen. Rufst Du sie auf, solltest Du 6 x 2 Widgets mit jeweils 4 - 2 Schaltflächen sehen.
Wenn Du eine der Schaltflächen betätigst, sollte der Fernseher entsprechend reagieren.
Die Rule ist nur wenige Zeilen lang, der überwiegende Teil des Codes kümmert sich um die Zuweisung eines Klartext Befehls zum entsprechenden Key Code (das ist die Map).
Der Witz dieser Anordnung ist, dass Du nun belieibege Codesequenzen senden kannst, indem Du in einer anderen Rule gezielt Sequenzen absetzt, z.B.
Die Rule sieht etwas umständlich aus Der Kern ist, einen Timer zu nutzen, der jeweils im Abstand von 750 Millisekunden nacheinander drei Tastendrücke sendet. Genutzt wird hier ein Number Item tvProgram für den Programmplatz:
In der Sitemap kannst Du ein Setpoint Widget für up/down oder ein Selection Widget mit Mapping nutzen:
Dabei kann das Selection Mapping belieibg viele Einträge erhalten. Falls zwischendrin leere Programmplätze sind, musst Du die nicht mit angeben. Die Liste kann beliebig sortiert sein.
Die Rule sendet genau drei Tastendrücke, also z.B. 0 5 OK wenn man auf tele5 wechselt (laut Liste )Ich habe auch keinen Telefunken TV, falls das also zu einem Problem werden sollte, kann man den Code natürlich auch umgestalten, dass führende Nullen nicht gesendet werden. Auch lässt sich die Rule leicht so anpassen, dass die dreistellige oder gar vierstellige Programmnummern sendet.
Letztlich sendet diese eine Rule ein Makro, welches sich aus dem Programmplatz ergibt. Ähnliches lässt sich auch für andere Funktionen bauen, aber man muss natürlich das Bedienkonzept des Geräts kennen.
Noch ein Wort zu der Rule: Ich nutze hier sehr bewusst einen Timer. Dieser Timer erledigt gleich zwei Probleme auf einen Schlag. Zum einen können die Tastendrücke ja nicht beliebig schnell gesendet werden, zum anderen verhindert der Timer, dass man mehrere Codes durcheinander sendet.
Wenn Du also weitere Makros auf diese Weise definieren willst, ist es wichtig, exakt diesen Timer dafür zu verwenden und wie oben gezeigt zunächst zu prüfen, ob der Timer !== null ist (was dann bedeutet, dass gerade eine Codesequenz gesendet wird).
von openHAB aus nutzt Du ein postHttpRequest, um den Fernbediencode über Netzwerk ans Gerät zu schicken. (smart geht anders).
Beispielsweise sendet der Befehl
Code: Alles auswählen
sendHttpPostRequest("http://192.168.0.118:56789/apps/vr/remote", "", "<remote><key code=1017/></remote>")
Herr Kekeisen hat also für jeden KeyCode ein eigenes Script angelegt, welches er dann aus den Rules heraus anstubst. Für jeden Schalter in der UI gibt es eine Rule, welche dann die entsprechenden Codes über Scripte sendet. Letztlich ist das von hinten durch die Brust ins Auge. Oder wie man in Niedersachsen sagt: Peine - Paris - Gifhorn.
Da es offensichtlich niemanden gibt, der ein passendes Binding dazu entwickelt hat, wirst Du nicht um eine größere Menge Rules Code kommen. Aber ganz so schlimm wie Herr Kekeisen das da vorgemacht hat, muss es nicht sein
Du brauchst zunächst ein StringItem, welches ich hier tfKeyCode genannt habe.
Code: Alles auswählen
String tfKeyCode {autoupdate="false"}
Code: Alles auswählen
val strUrl = "http://ip:56789/apps/SmartCenter" // ip durch ide IP oder den Hostnamen des Geräts ersetzen!
val strFrame1 = "<?xml version=\"1.0\" ?><remote><key code="
val strFrame2 = "/></remote>"
val Map <String,Number> mapCodes = ("0" -> 1000,
"1" -> 1001,
"2" -> 1002,
"3" -> 1003,
"4" -> 1004,
"5" -> 1005,
"6" -> 1006,
"7" -> 1007,
"8" -> 1008,
"9" -> 1009,
"back" -> 1010,
"aspect" -> 1011,
"power" -> 1012,
"mute" -> 1013,
"lang" -> 1015,
"volup" -> 1016,
"voldown" -> 1017,
"info" -> 1018,
"down" -> 1019,
"up" -> 1020,
"left" -> 1021,
"right" -> 1022,
"stop" -> 1024,
"play" -> 1025,
"rw" -> 1027,
"ff" -> 1028,
"subtitle" -> 1031,
"close" -> 1037,
"fav" -> 1040,
"timer" -> 1042,
"quick" -> 1043,
"app" -> 1046,
"epg" -> 1047,
"menu" -> 1048,
"pause" -> 1049,
"yellow" -> 1050,
"record" -> 1051,
"blue" -> 1052,
"ok" -> 1053,
"green" -> 1054,
"red" -> 1055,
"source" -> 1056,
"browser" -> 1057,
"text" -> 1058)
rule "send telefunken key code"
when
Item tfKeyCode received command
then
logDebug("keycode","received command {}",receivedCommand)
val nCode = mapCode.get(receivedCommand)
logDebug("keycode","is key code {}",nCode)
if(nCode != null) {
val strRequest = strFrame1+nCode.toString+strFrame2
logInfo("keycode","postRequest {}",strRequest)
sendHttpPostRequest(strUrl,"",strRequest)
}
end
Code: Alles auswählen
sitemap telefunken label="Telefunken" {
Frame label "Tasten" {
Switch item=tfKeyCode label="Eingabe" mappings=["1"="1","2"="2","3"="3","4"="4"]
Switch item=tfKeyCode label="Eingabe" mappings=["5"="5","6"="6","7"="7","8"="8"]
Switch item=tfKeyCode label="Eingabe" mappings=["back"="back","9"="9","0"="0","aspect"="aspect"]
Switch item=tfKeyCode label="Eingabe" mappings=["power"="power","lang"="lang","info"="info"]
Switch item=tfKeyCode label="Eingabe" mappings=["volup"="lauter","voldown"="leiser","mute"="mute"]
Switch item=tfKeyCode label="Eingabe" mappings=["left"="left","up"="up","down"="down","right"="right"]
Switch item=tfKeyCode label="Eingabe" mappings=["rw"="<<","play"=">","stop"="stop","ff"=">>"]
Switch item=tfKeyCode label="Eingabe" mappings=["pause"="||","record"="O","ok"="OK","source"="source"]
Switch item=tfKeyCode label="Eingabe" mappings=["subtitle"="sub","close"="close","fav"="fav","timer"="timer"]
Switch item=tfKeyCode label="Eingabe" mappings=["quick"="quick","app"="app","epg"="epg","menu"="menu"]
Switch item=tfKeyCode label="Eingabe" mappings=["red"="red","green"="green","yellow"="yellow","blue"="blue"]
Switch item=tfKeyCode label="Eingabe" mappings=["browser"="browser","text"="text"]
}
}
Wenn Du eine der Schaltflächen betätigst, sollte der Fernseher entsprechend reagieren.
Die Rule ist nur wenige Zeilen lang, der überwiegende Teil des Codes kümmert sich um die Zuweisung eines Klartext Befehls zum entsprechenden Key Code (das ist die Map).
Der Witz dieser Anordnung ist, dass Du nun belieibege Codesequenzen senden kannst, indem Du in einer anderen Rule gezielt Sequenzen absetzt, z.B.
Code: Alles auswählen
var Timer tSendCodes = null
var int iSendCodes = 0
Rule "send prgram change"
when
Item tvProgram changed
then
if(tSendCodes !== null)
return;
if(tvProgram.state instanceof Number) {
iSendCodes = 0
tSendCodes = createTimer(now,[|
iSendCodes ++
tSendCodes.reschedule(now.plusMillis(750))
val myCode = if(tvProgram.state<10) "0" else "" + tvProgram.state.toString
switch(iSendCodes) {
case 1: {
tfKeyCode.sendCommand(myCode.substring(0,1))
}
case 2: {
tfKeyCode.sendCommand(myCode.substring(1,1))
}
case 3: {
tfKeyCode.sendCommand("ok")
}
default: {
tSendCodes.cancel()
tSendCodes = null
}
}
])
}
end
Code: Alles auswählen
Number tvProgram "Programm"
Code: Alles auswählen
Selection item=tvProgram mappings=[1="Das Erste",2="ZDF",3="3SAT",4="Disney Channel",5="tele5",6="SIXX",7="ProSieben"]
Die Rule sendet genau drei Tastendrücke, also z.B. 0 5 OK wenn man auf tele5 wechselt (laut Liste )Ich habe auch keinen Telefunken TV, falls das also zu einem Problem werden sollte, kann man den Code natürlich auch umgestalten, dass führende Nullen nicht gesendet werden. Auch lässt sich die Rule leicht so anpassen, dass die dreistellige oder gar vierstellige Programmnummern sendet.
Letztlich sendet diese eine Rule ein Makro, welches sich aus dem Programmplatz ergibt. Ähnliches lässt sich auch für andere Funktionen bauen, aber man muss natürlich das Bedienkonzept des Geräts kennen.
Noch ein Wort zu der Rule: Ich nutze hier sehr bewusst einen Timer. Dieser Timer erledigt gleich zwei Probleme auf einen Schlag. Zum einen können die Tastendrücke ja nicht beliebig schnell gesendet werden, zum anderen verhindert der Timer, dass man mehrere Codes durcheinander sendet.
Wenn Du also weitere Makros auf diese Weise definieren willst, ist es wichtig, exakt diesen Timer dafür zu verwenden und wie oben gezeigt zunächst zu prüfen, ob der Timer !== null ist (was dann bedeutet, dass gerade eine Codesequenz gesendet wird).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 2
- Registriert: 24. Jul 2020 02:04
Re: Telefunken Smart TV
Besten Dank schonmal.
Ich werde es probieren und ich melde mich dann ob es funktioniert hat.
lg Mindgamer
Ich werde es probieren und ich melde mich dann ob es funktioniert hat.
lg Mindgamer