Sony BRAVIA Fernseher - Steuerung via API

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

marcels
Beiträge: 7
Registriert: 17.04.2019, 10:06
Hat sich bedankt: 1 Mal
Danksagung erhalten: 5 Mal

Sony BRAVIA Fernseher - Steuerung via API

Beitrag von marcels » 17.04.2019, 13:14

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) 8475 mal betrachtet
pm2.png
pm2.png (22.47 KiB) 8475 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) 8475 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

omicronCZ
Beiträge: 206
Registriert: 31.07.2011, 17:37
System: CCU
Wohnort: Czech Rep.
Hat sich bedankt: 80 Mal
Danksagung erhalten: 12 Mal

Re: Sony BRAVIA Fernseher - Steuerung via API

Beitrag von omicronCZ » 05.04.2020, 17:12

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
Zuletzt geändert von omicronCZ am 21.04.2020, 12:42, insgesamt 2-mal geändert.

FlorianB
Beiträge: 3
Registriert: 09.06.2020, 17:43
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 1 Mal

Re: Sony BRAVIA Fernseher - Steuerung via API

Beitrag von FlorianB » 10.06.2020, 10:44

Hi marcels,

deine Beschreibung ist präzise und funktionierte sofort!

Danke dafür! :P

IchBinIronMan
Beiträge: 13
Registriert: 27.08.2020, 13:47
System: CCU
Danksagung erhalten: 2 Mal

Re: Sony BRAVIA Fernseher - Steuerung via API

Beitrag von IchBinIronMan » 20.10.2020, 13:32

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 ? :)

IchBinIronMan
Beiträge: 13
Registriert: 27.08.2020, 13:47
System: CCU
Danksagung erhalten: 2 Mal

Re: Sony BRAVIA Fernseher - Steuerung via API

Beitrag von IchBinIronMan » 27.10.2020, 23:01

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.

omicronCZ
Beiträge: 206
Registriert: 31.07.2011, 17:37
System: CCU
Wohnort: Czech Rep.
Hat sich bedankt: 80 Mal
Danksagung erhalten: 12 Mal

Re: Sony BRAVIA Fernseher - Steuerung via API

Beitrag von omicronCZ » 29.10.2020, 12:17

@IchBinIronMan - thanks a lot man, it works great! :D

e-j-s
Beiträge: 7
Registriert: 18.01.2022, 19:55
System: CCU und Access Point

Re: Sony BRAVIA Fernseher - Steuerung via API

Beitrag von e-j-s » 18.01.2022, 20:20

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).

omicronCZ
Beiträge: 206
Registriert: 31.07.2011, 17:37
System: CCU
Wohnort: Czech Rep.
Hat sich bedankt: 80 Mal
Danksagung erhalten: 12 Mal

Re: Sony BRAVIA Fernseher - Steuerung via API

Beitrag von omicronCZ » 18.01.2022, 22:13

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.

e-j-s
Beiträge: 7
Registriert: 18.01.2022, 19:55
System: CCU und Access Point

Re: Sony BRAVIA Fernseher - Steuerung via API

Beitrag von e-j-s » 20.01.2022, 19:52

Thanks. I check tinycam. It's a good Idea.

omicronCZ
Beiträge: 206
Registriert: 31.07.2011, 17:37
System: CCU
Wohnort: Czech Rep.
Hat sich bedankt: 80 Mal
Danksagung erhalten: 12 Mal

Re: Sony BRAVIA Fernseher - Steuerung via API

Beitrag von omicronCZ » 20.01.2022, 22:41

Let me know if it works, I'm interested too :D

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“