Seite 1 von 2

Sony BRAVIA Fernseher - Steuerung via API

Verfasst: 17.04.2019, 13:14
von marcels
Die Sony BRAVIA Fernseher sind mit einer API versehen, welche über JSON API-Befehler bedient werden kann.
In meiner Anwesenheitssimulation setze ich darauf, dass der TV immer mal wieder für eine gewisse Zeit läuft, auch wenn ich nicht zuhause bin.

Zur Steuerung der API gibt es von Sony eine Liste der JSON-Befehle welche vom TV unterstützt werden.
Um die Steuerung durchführen zu können müssen ein paar Einstellungen am TV vorgenommen bzw. geprüft werden:
  • Authentication: [HOME] Settings > Network > Home network setup > IP control > Authentication:
    hier den Wert Normal & Pre-Shared Key auswählen
  • PSK: [Home] Settings > Network > Home network setup > IP control > Pre-Shared Key:
    hier einen PIN setzen und merken, dieser wird später im Skript benutzt.
Jetzt ist der TV vorbereitet und kann via API bedient werden.

Vorbereitungen der CCU3:
  • CUxD muss installiert sein
  • CUxD-EXEC Gerät ist an der CCU3 angelernt
Falls das bei dir noch nicht der Fall ist, ist die Installation und Einrichtung des CUxD-EXEC-Gerätes hier ganz gut beschrieben: https://www.christian-luetgens.de/homem ... lation.htm

Auf der CCU3 wird ein Programm benötigt, welches bei der Ausführung ein Skript aufruft.

Skript:

Code: Alles auswählen

!--SONY TV Ausschalten
! Skript von marcels
!_IP Adresse
string ip_address = "192.168.178.20";
 
!_API-PIN
string api_pin="1234";
  
!_Einstellungen
string api_path="system";
string api_method="setPowerStatus";
string api_id="55";
string api_params="{\"status\": false}";
string api_version="1.0";


!------ NICHT Verändern-------
string reqdata="{\"method\": \"" # api_method # "\", \"id\": " # api_id # ", \"params\": [" # api_params # "], \"version\": \"" # api_version # "\"}";
string request="/usr/local/addons/cuxd/curl -X POST  -H \"X-Auth-PSK: " # api_pin # " \" -d '" # reqdata # "' http://"# ip_address # "/sony/" # api_path;
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(request);
quit;
Die hier gesetzten Einstellungen resultieren in folgendem JSON-Paket:

Code: Alles auswählen

http://192.168.178.20/sony/system
{
    "method": "setPowerStatus",
    "id": 55,
    "params": [{"status": false}],
    "version": "1.0"
}
Eine Übersicht der verfügbaren API-Befehle gibt es hier:
https://pro-bravia.sony.net/develop/int ... index.html
Unter Syntax ist immmer der API-Pfad (Variable api_path) angegeben.
Aus: http://<Base URL>/system wird in unserem Fall string api_path="system";

Unter Request sind die für den Befehl verfügbaren parameter (Variable api_params) angegeben und direkt darunter ein JSON Example mit der benötigten ID und Version.

Weitere Beispiele:

Code: Alles auswählen

!--SONY TV auf SAT umschalten
! Skript von marcels
!_IP Adresse
string ip_address = "192.168.178.20";
 
!_API-PIN
string api_pin="1234";
  
!_Einstellungen
string api_path="avContent";
string api_method="setPlayContent";
string api_id="101";
string api_params="{\"uri\": \"tv:dvbs?trip=1.1017.61301&srvName=ProSieben HD\"}";
string api_version="1.0";

 
!------ NICHT Verändern-------
string reqdata="{\"method\": \"" # api_method # "\", \"id\": " # api_id # ", \"params\": [" # api_params # "], \"version\": \"" # api_version # "\"}";
string request="/usr/local/addons/cuxd/curl -X POST  -H \"X-Auth-PSK: " # api_pin # " \" -d '" # reqdata # "' http://"# ip_address # "/sony/" # api_path;
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(request);
quit;
Der Teil {\"uri\": \"tv:dvbs\"} wäre allgemeingültig zum Umschalten des TV auf SAT-Empfang. Die Programmkennung ?trip=1.1017.61301&srvName=ProSieben HD ist individuell auf dem Gerät, je nach Sender und Sortierung.

Um eine Liste der verfügbaren Programme zu erhalten empfehle ich eine API-Abfrage mit der Software "Postman" (https://www.getpostman.com/)
Die Abfrage sieht wie folgt aus:
pm1.png
pm1.png (17.7 KiB) 8555 mal betrachtet
pm2.png
pm2.png (22.47 KiB) 8555 mal betrachtet
und liefert ein Ergebnis im folgenden Format, welches Ihr dann im Script verarbeiten könnt:

Code: Alles auswählen

{
    "result": [
        [
            {
                "uri": "tv:dvbs?trip=1.1019.10301&srvName=Das Erste HD",
                "title": "Das Erste HD",
                "index": 0,
                "dispNum": "0001",
                "tripletStr": "1.1019.10301",
                "programMediaType": "tv"
            },
            {
                "uri": "tv:dvbs?trip=1.1011.11110&srvName=ZDF HD",
                "title": "ZDF HD",
                "index": 1,
                "dispNum": "0002",
                "tripletStr": "1.1011.11110",
                "programMediaType": "tv"
            },
            {
                "uri": "tv:dvbs?trip=1.1017.61300&srvName=SAT.1 HD",
                "title": "SAT.1 HD",
                "index": 2,
                "dispNum": "0003",
                "tripletStr": "1.1017.61300",
                "programMediaType": "tv"
            },
            {
                "uri": "tv:dvbs?trip=1.1057.61200&srvName=RTL HD",
                "title": "RTL HD",
                "index": 3,
                "dispNum": "0004",
                "tripletStr": "1.1057.61200",
                "programMediaType": "tv"
            },
            {
Denkbar wäre zum Beispiel eine CCU-Systemvariable, welche die Sender beinhaltet und bei Aktualisierung folgendes Skript auslöst um das Programm umzuschalten:

Code: Alles auswählen

!--SONY TV Programm umschalten
! Skript von marcels
!_IP Adresse
string ip_address = "192.168.178.20";
 
!_API-PIN
string api_pin="1234";
  
!_Einstellungen

string programm;
var TV_Programm = dom.GetObject("TV_Programm");
string tv_programm = TV_Programm.Variable();

if (tv_programm == "0")
	{ 
		programm = "tv:dvbs?trip=1.1019.10301&srvName=Das Erste HD";
	}
if (tv_programm == "1")
	{ 
		programm = "tv:dvbs?trip=1.1011.11110&srvName=ZDF HD";
	}
if (tv_programm == "2")
	{ 
		programm = "tv:dvbs?trip=1.1017.61300&srvName=SAT.1 HD";
	}

string api_path="avContent";
string api_method="setPlayContent";
string api_id="101";
string api_params="{\"uri\": \"" # programm # " \"}";
string api_version="1.0";

 
!------ NICHT Verändern-------
string reqdata="{\"method\": \"" # api_method # "\", \"id\": " # api_id # ", \"params\": [" # api_params # "], \"version\": \"" # api_version # "\"}";
string request="/usr/local/addons/cuxd/curl -X POST  -H \"X-Auth-PSK: " # api_pin # " \" -d '" # reqdata # "' http://"# ip_address # "/sony/" # api_path;
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State(request);
quit;
Systemvariable:
TV_Programm.png
TV_Programm.png (13.38 KiB) 8555 mal betrachtet
Die Möglichkeiten mit der API sind vielfältig. Auch Abfragen, ob der TV an oder aus ist und Rückgabe in einer CCU-Systemvariable wären denkbar, damit habe ich mich aber bisher nicht beschäftigt ;)

Viel Spaß damit und ggf. helfen die Skripte ja auch anderen Leuten bei der Bedienung eines beliebigen Gerätes im Haushalt, welches eine API besitzt.

OT: Wer sich als Auto einen BMW entsprechender Klasse leisten kann, der kann über API das Auto hupen lassen, den Tankinhalt bzw. die Koordinaten abfragen :D

Re: Sony BRAVIA Fernseher - Steuerung via API

Verfasst: 05.04.2020, 17:12
von omicronCZ
Hi Marcels,
thank you for your post, it's great :D

And how could you solve the loading status of the TV (would be on and off)?
Thank you very much.
Petr

Re: Sony BRAVIA Fernseher - Steuerung via API

Verfasst: 10.06.2020, 10:44
von FlorianB
Hi marcels,

deine Beschreibung ist präzise und funktionierte sofort!

Danke dafür! :P

Re: Sony BRAVIA Fernseher - Steuerung via API

Verfasst: 20.10.2020, 13:32
von IchBinIronMan
Danke für dein Script. Du hattest es bereits in deinem Beitrag angesprochen mit der Status Abfrage, bekomme das iwie nicht hin...hast du mir einen Tipp ? :)

Re: Sony BRAVIA Fernseher - Steuerung via API

Verfasst: 27.10.2020, 23:01
von IchBinIronMan
Ich habe mir erlaubt mit einen Kumpel zusammen das Script so umzuschreiben das es eine Statusabfrage des TV macht und diese in eine Systemvariable schreibt.
Klappt super.

Code: Alles auswählen

!--SONY TV Statusabfrage
! Skript von marcels
!_IP Adresse
string ip_address = "HIER IP VOM TV EINTRAGEN]";
 
!_API-PIN
string api_pin="HIER PIN EINTRAGEN";
  
!_Einstellungen
string api_path="system";
string api_method="getPowerStatus";
string api_id="50";
string api_params="{}";
string api_version="1.0";


!------ NICHT Verändern-------
string reqdata="{\"method\": \"" # api_method # "\", \"id\": " # api_id # ", \"params\": [" # api_params # "], \"version\": \"" # api_version # "\"}";
string request="/usr/local/addons/cuxd/curl -X POST -H \"X-Auth-PSK: " # api_pin # " \" -d '" # reqdata # "' http://"# ip_address # "/sony/" # api_path;
string result = dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(request);dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var response = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();

!-----Parse response JSON ----
integer responseLen = response.Length();
string wordStart = "status\":";
integer wordStartPos = response.Find(wordStart) + wordStart.Length()+1;
string responseRest = response.Substr(wordStartPos,responseLen-wordStartPos);
string wordEnd = "}]";
integer wordEndPos = responseRest.Find(wordEnd)-1;
string answer = response.Substr(wordStartPos, wordEndPos);

if (answer == "standby") {
        dom.GetObject("TVZustand").State("false");
	} else { if (answer == "active") {
        dom.GetObject("TVZustand").State("true");
        }
}
quit;
Dabei habe ich eine Systemvariable Typ: Logikwert genommen und diese TVZustand genannt.

Re: Sony BRAVIA Fernseher - Steuerung via API

Verfasst: 29.10.2020, 12:17
von omicronCZ
@IchBinIronMan - thanks a lot man, it works great! :D

Re: Sony BRAVIA Fernseher - Steuerung via API

Verfasst: 18.01.2022, 20:20
von e-j-s
Hallo,

finde den Beitrag hochinteressant. Für Start-User vielleicht schon ein wenig sehr im Profi Bereich.
Der Beitrag hat mich auf eine Idee gebracht.

Ich habe eine Haustürstation vom Typ 2N IPVerso (siehe: https://www.keil-telecom.de/produkte/ip ... -ip-verso/ ) und kann damit http-Befehle ins IP-Netzwerk senden.
Es müsste also möglich sein, dass per http-Befehl dann die Haustürkamera auf dem Sony 85XH9096 angezeigt wird, wenn jemand die Haustürklingel drückt. Mit dem Befehl sollte dann das TV auf den Streamingkanal der Haustürkamera umschalten.
Der Stream läuft im Netzwerk unter
rtsp://192.168.178.37:554 mit dem VLC-Player
rtsp://192.168.178.49:554/mjpeg_stream oder
rtsp://192.168.178.49:554/mpeg4_stream oder
rtsp://192.168.178.49:554/h264_stream oder
als Einzelbilder
http: / / 192 . 168 . 178 . 49/api/camera/snapshot?width=640&height=480&fps=15 mit 15 Bilder pro Sekunde.

Mit welchen http-Befehl würdet Ihr dann das Sony Bravia 85XH9096 ansteuern?

Herzlichen Dank für Eure Antwort(en).

Re: Sony BRAVIA Fernseher - Steuerung via API

Verfasst: 18.01.2022, 22:13
von omicronCZ
A likely solution is with some RTSP stream player in Android TV (tinyCam PRO ?), where you could somehow preset the playback parameters in its call.

Then use Marcel's script (see above) to call the "setActiveApp" API function, which can launch the appropriate application via the API.

Re: Sony BRAVIA Fernseher - Steuerung via API

Verfasst: 20.01.2022, 19:52
von e-j-s
Thanks. I check tinycam. It's a good Idea.

Re: Sony BRAVIA Fernseher - Steuerung via API

Verfasst: 20.01.2022, 22:41
von omicronCZ
Let me know if it works, I'm interested too :D