Sony BRAVIA Fernseher - Steuerung via API

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

Moderator: Co-Administratoren

Antworten
marcels
Beiträge: 2
Registriert: 17.04.2019, 10:06

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

Antworten

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