Telefunken Smart TV

Allgemeine Fragen rund um die "Smart Home" Hardware/Komponenten

Moderatoren: seppy, udo1toni

Antworten
Mindgamer
Beiträge: 2
Registriert: 24. Jul 2020 02:04
Answers: 0

Telefunken Smart TV

Beitrag von Mindgamer »

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

Benutzeravatar
udo1toni
Beiträge: 13989
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Telefunken Smart TV

Beitrag von udo1toni »

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.

Code: Alles auswählen

String tfKeyCode {autoupdate="false"}
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:

Code: Alles auswählen

Number tvProgram "Programm"
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).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Mindgamer
Beiträge: 2
Registriert: 24. Jul 2020 02:04
Answers: 0

Re: Telefunken Smart TV

Beitrag von Mindgamer »

Besten Dank schonmal.

Ich werde es probieren und ich melde mich dann ob es funktioniert hat.

lg Mindgamer

Antworten