Communication IPX / TV SONY via API REST + script PHP sur NAS

Bonjour,

En 2 mots, pour satisfaire une demande de Mme, j’aimerai « simplement » allumer la TV (et donc le HC via HDMI ARC) dans un scénario existant.

Ma TV Sony a une API REST.
J’arrive bien à exécuter les commandes via le plugin RESTClient de Firefox :
url = 192.168.X.X/sony/system
métohde = POST
Body = {« id »:55,« method »:« setPowerStatus »,« version »:« 1.0 »,« params »:[{« status »:true}]}

Je n’arrive pas à reproduire cela avec un push.
Pire ! Le lancement de la commande me fait redémarrer l’IPX !!! (lié au retour de l’API de la TV ???)

D’un autre côté j’ai essayé de faire tourner un petit script php sur mon NAS qui fasse la même chose via curl mais mes connaissances sont trop limitées.
J’ai déjà un bout de script qui me semble pas loin de marcher mais je pense avoir un problème sur la conversion format json de l’array du php. S’il y a un php expert dans le coin, je veux bien un coup de main !

Merci !
Jon

Bonjour,

Je me permet de remonter le sujet pour solliciter un petit coup de main.
Je tourne en rond et malgré toutes mes recherches, je bloque.
Le fait que l’IPX redémarre quand j’active le push vers cette API ne m’aide pas non plus à investiguer.

Merci par avance.

Jon

Bonjour,

Bon, ben je me réponds à moi même… :pensive:
Je n’ai pas réussi à envoyer cette commande via l’IPX. J’avais un plantage systématique et redémarrage de l 'IPX ! Je ne sais toujours pas pourquoi d’ailleurs ???
Dans tous les cas, l’API Sony demande un header avec une clé d’authentification et l’info qu’on envoie une requête json. Je ne pense pas qu’on puisse l’indiquer dans l’interface de l’IPX ?!

J’ai donc poursuivi la piste du script php hébergé sur le NAS et trouvé une solution qui fonctionne.
Même si je n’ai pas eu de réponses de la communauté, je partage quand même le script ici et renomme le fil de discussion pour qu’il puisse servir à d’autres :

//Fonction prise sur https://weichie.com/blog/curl-api-calls-with-php/ //
function callAPI($method, $url, $data){
   $curl = curl_init();
   switch ($method){
      case "POST":
         curl_setopt($curl, CURLOPT_POST, 1);
         if ($data)
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
         break;
      case "PUT":
         curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
         if ($data)
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);			 					
         break;
      default:
         if ($data)
            $url = sprintf("%s?%s", $url, http_build_query($data));
   }
   // OPTIONS:
   // X-Auth-PSK: ZZZZ = code défini sur la TV + https://pro-bravia.sony.net/develop/integrate/ip-control/index.html //
   // l'API de la TV impose de recevoir dans le header de la requête la PréSharedKey PSK et le type d'objet json
   curl_setopt($curl, CURLOPT_URL, $url);
   curl_setopt($curl, CURLOPT_HTTPHEADER, array(
      'X-Auth-PSK: ZZZZ',
      'Content-Type: application/json',
   ));
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
   // EXECUTE:
   $result = curl_exec($curl);
   if(!$result){die("Connection Failure");}
   curl_close($curl);
   //return $result;
   echo $result;
}

///////////////////
// Allumer la TV //
///////////////////
//https://pro-bravia.sony.net/develop/integrate/rest-api/spec/service/system/v1_0/setPowerStatus/index.html//
$data_array =  array(
      'method'			=> "setPowerStatus",
	  'id'				=> 55,
      'params'   	    => array(
							array(
								'status'         => true
								)
								),
	  'version'			=> "1.0"
);
//json_encode permet de transformer le data_array en un objet json
//{"id":55,"method":"setPowerStatus","version":"1.0","params":[{"status":true}]}
$make_call = callAPI('POST', 'http://XXX.XXX.XXX.XXX/sony/system', json_encode($data_array));
$response = json_decode($make_call, true);
$errors   = $response['response']['errors'];
$data     = $response['response']['data'][0];

C’est le script pour la commande « ON » mais toutes les autres fonctions décrites ici sont paramétrables de la même façon.

Astuce : j’ai pas mal galéré avec le format de la commande, l’API de Sony demande que « params » soit un tableau imbriqué. Comme la commande json_encode demande aussi un tableau, on a une imbrication de 3 tableaux…

Le push dans l’IPX est paramétré comme ceci :
IP : XXX.XXX.XXX.XXX
Message : /TV_SONY/TV_On.php?message=«  »
Méthode : GET
Attention : il est impératif de mettre la commande ?message=«  » même si le script ne demande pas de paramètre.

Note : Pour ceux qui comme moi font une redirection http vers https sur leur serveur web du NAS, cela ne fonctionne pas car l’ipx n’accepte pas le certificat autosigné du NAS. Il m’a fallu ajouter une exception pour l’adresse IP de l’IPX dans le .htacess. :
RewriteCond %{REMOTE_ADDR} !=YYY.YYY.YYY.YYY
Ca parait simple une fois dit mais j’ai longtemps galéré à trouver !

Le sujet peut être clos.
En espérant que toutes mes galères puissent un jour servir à d’autres ! :stuck_out_tongue_winking_eye:

Jon

3 « J'aime »

Bonjour,
Si vous n’avez pas eu de réponse de la communauté c’est qu’elle n’en avait pas :wink:
Merci pour le partage.
cdt

1 « J'aime »