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
Code: Alles auswählen
sendHttpPostRequest("http://192.168.0.118:56789/apps/vr/remote", "", "<remote><key code=1017/></remote>")
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;
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
Für einen ersten Test reicht eine Sitemap, mit der Du die grundsätzliche Funktion testen kannst:
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"]
}
}
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.
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
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:
Code: Alles auswählen
Selection item=tvProgram mappings=[1="Das Erste",2="ZDF",3="3SAT",4="Disney Channel",5="tele5",6="SIXX",7="ProSieben"]
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).