Script pour piloter décodeur tv plus SFR

Bonjour,

je souhaite depuis longtemp piloter mon décodeur SFR tv plus via jeedom. j’ai trouvé la solution avec un broadlink.
Mais on vient de me répondre après plusieurs année :smiley: sur le forum SFR avec un script php.
Est-ce que quelqu’un serait comment l’utiliser dans jeedom ? Je n’y connais pas grand chose ne php :’(
Voici le lien
https://forum.sfr.fr/t5/t%C3%A9l%C3%A9vision-box-adsl/api-decodeur-tv-plus/m-p/2186527#M47139

je comprend pas pourquoi SFR ne donne pas accès via un API …

Bonjour,

Je viens d’acquérir le décodeur et donc mis en place sur jeedom la télécommande du décodeur:

Utilisation du plugin Script

Sur la première commande, il te faut créer un nouveau script que tu appelles tel_sfr.php par exemple:
avec à l’intérieur:

<?php

$IP="192.168.1.31"; // a changer
$PORT=7682;

$ws = new ws(array('host' => $IP,'port' => $PORT,'wskey' => 'XXXXXXXXXXXXXXXXXXXXXX=='));

switch ($argv[1]) {
    case "ZAP":
		$ws->send('{"Params": {"Token": "LAN", "DeviceSoftVersion": "11.2.2", "Params": ['.$argv[2].', "zapdigit"], "Action": "CustomEvent", "DeviceModel": "iPhone", "Event": "GotoLive"}}');
  		break;
    case "BUTTONEVENT":
    	$ws->send('{"Params": {"Token": "LAN", "DeviceSoftVersion": "11.2.2", "Action": "ButtonEvent", "Press": ['.$argv[2].'], "DeviceModel": "iPhone"}}');
    	break;
   	case "APP":
    	$ws->send('{"Params":{"Token":"LAN","DeviceSoftVersion":"11.2.2","Action":"GotoApp","AppName":"'.$argv[2].'","DeviceModel":"iPhone","DeviceId":"375CC21F-2E8D-4C31-B728-7790E6D24BD0"}}');
    	break;
}

$ws->close();

class ws
{
	private $params;
	private $head;
	private $instance;
		
	public function __construct($params)
	{
		foreach($params as $key => $value)
			$this->params[$key] = $value;

		$this->head =	"GET / HTTP/1.1\r\n" .
						"Upgrade: websocket\r\n" .
						"Host: ".$this->params['host'].":".$this->params['port']."\r\n" .
						"Origin: ".$this->params['host'].":".$this->params['port']."\r\n" .
						"Sec-WebSocket-Key: ".$this->params['wskey']."\r\n" .
						"Sec-WebSocket-Version: 13\r\n" .
            "Connection: upgrade\r\n" .
            "Sec-WebSocket-Protocol: lws-bidirectional-protocol\r\n";		
	}

	public function send($method)
	{
      	echo $method."</br >";
		$this->head .= "Content-Length: ".strlen($method)."\r\n\r\n";
		$this->connect();		
		fwrite($this->instance, $this->hybi10Encode($method));
		//$wsdata = fread($this->instance, 2000);
      	//echo $this->hybi10Decode($wsdata);
		//return $this->hybi10Decode($wsdata);		
	}

	public function close()
	{
		if($this->instance)
		{
			fclose($this->instance);
			$this->instance = NULL;
		}
	}
	
	private function connect()
	{
		$sock = fsockopen($this->params['host'], $this->params['port'], $errno, $errstr, 2);
		fwrite($sock, $this->head);
		$headers = fread($sock, 2000);

		$this->instance = $sock;		
	}
	
	private function hybi10Decode($data)
	{
		$bytes = $data;
		$dataLength = '';
		$mask = '';
		$coded_data = '';
		$decodedData = '';
		$secondByte = sprintf('%08b', ord($bytes[1]));
		$masked = ($secondByte[0]=='1') ? true : false;
		$dataLength = ($masked===true) ? ord($bytes[1]) & 127 : ord($bytes[1]);

		if ($masked===true)
		{
			if ($dataLength===126)
			{
				$mask = substr($bytes, 4, 4);
				$coded_data = substr($bytes, 8);
			}
			elseif ($dataLength===127)
			{
				$mask = substr($bytes, 10, 4);
				$coded_data = substr($bytes, 14);
			}
			else
			{
				$mask = substr($bytes, 2, 4);
				$coded_data = substr($bytes, 6);
			}
			for ($i = 0; $i<strlen($coded_data); $i++)
				$decodedData .= $coded_data[$i] ^ $mask[$i % 4];
		}
		else
		{
			if ($dataLength===126)
				$decodedData = substr($bytes, 4);
			elseif ($dataLength===127)
				$decodedData = substr($bytes, 10);
			else
				$decodedData = substr($bytes, 2);
		}

		return $decodedData;
	}

	private function hybi10Encode($payload, $type = 'text', $masked = true)
	{
		$frameHead = array();
		$frame = '';
		$payloadLength = strlen($payload);

		switch ($type)
		{
			case 'text' :
				// first byte indicates FIN, Text-Frame (10000001):
				$frameHead[0] = 129;
				break;

			case 'close' :
				// first byte indicates FIN, Close Frame(10001000):
				$frameHead[0] = 136;
				break;

			case 'ping' :
				// first byte indicates FIN, Ping frame (10001001):
				$frameHead[0] = 137;
				break;

			case 'pong' :
				// first byte indicates FIN, Pong frame (10001010):
				$frameHead[0] = 138;
				break;
		}

		// set mask and payload length (using 1, 3 or 9 bytes)
		if ($payloadLength>65535)
		{
			$payloadLengthBin = str_split(sprintf('%064b', $payloadLength), 8);
			$frameHead[1] = ($masked===true) ? 255 : 127;
			for ($i = 0; $i<8; $i++)
				$frameHead[$i + 2] = bindec($payloadLengthBin[$i]);

			// most significant bit MUST be 0 (close connection if frame too big)
			if ($frameHead[2]>127)
			{
				$this->close(1004);
				return false;
			}
		}
		elseif ($payloadLength>125)
		{
			$payloadLengthBin = str_split(sprintf('%016b', $payloadLength), 8);
			$frameHead[1] = ($masked===true) ? 254 : 126;
			$frameHead[2] = bindec($payloadLengthBin[0]);
			$frameHead[3] = bindec($payloadLengthBin[1]);
		}
		else
			$frameHead[1] = ($masked===true) ? $payloadLength + 128 : $payloadLength;

		// convert frame-head to string:
		foreach (array_keys($frameHead) as $i)
			$frameHead[$i] = chr($frameHead[$i]);

		if ($masked===true)
		{
			// generate a random mask:
			$mask = array();
			for ($i = 0; $i<4; $i++)
				$mask[$i] = chr(rand(0, 255));

			$frameHead = array_merge($frameHead, $mask);
		}
		$frame = implode('', $frameHead);
		// append payload to frame:
		for ($i = 0; $i<$payloadLength; $i++)
			$frame .= ($masked===true) ? $payload[$i] ^ $mask[$i % 4] : $payload[$i];

		return $frame;
	}
}
?>

Tu modifies l’IP de ton décodeur et enregistre.
A la fin de chaque commande tu peux faire dupliquer pour créer la nouvelle commande.
Il suffit d’ajouter les commandes pour les chaines :


Pour les boutons:

Pour les applications

La liste complète:

1 « J'aime »

Merci beaucoup @Pierrick !
Ça fonctionne :grinning:

1 « J'aime »

Bonsoir,
Les scripts sont ils pour le decodeur STB7,

Pour les commandes j’ai bien créé la premiere commande en changeant l’ip mais par la suite :

  • Quel commande créé vous pour les chaines ( TF1, FR2, etc )
  • Quel commande créé vous pour le power etc

Merci

C’est pour le décodeur SFR TV plus. Installer le Décodeur Plus SFR

Il y a tout dans l’exemple de Pierrick .

Merci de ta réponse

D’accord mais le simple ajout de ZAP 1, ZAP 2 suffit je ne suis pas sur de comprendre ?

Oui ça suffit.

Le script est compatible stb7 ou decodeur plus de sfr ou red by sfr.

En effet sa fonctionne,
j’avais pas du copié le code correctement
Merci pour vos réponse

Bonsoir,

Savez-vous si ce script est compatible avec la box THD 4K SFR https://assistance.sfr.fr/internet-tel-fixe/box-thd-4k/box-thd-4k-connecter-installer.html
Sinon, connaissez-vous un script compatible ?

Hello,
Je ne suis pas certain qu’un sujet existe concernant la STB8 mais s’agissant de piloter le décodeur, je pose la question ici.
Quelqu’un aurait-il de l’info sur le sujet ? Je n’en trouve nul part. API fermé ? Quels seraient les solutions possible ?

Merci pour vos réponses.

J’avais lu quelque part que pour obtenir les infos de la STB8, il fallait utiliser la fonction GetStatus au lieu de GetSessionsStatus.

Pour les applications, ces 8 applications là fonctionnent (il y en a peut-être d’autres, mais à chaque essai foireux, la box plante et il faut débrancher l’alim :cry:)
image

On peut rajouter l’application « Home » pour afficher la page d’accueil, aussi accessible avec la touche HOME code [292]

Je suis surpris que l’application « Live » pour revenir au direct ne fonctionne pas.

Tout semble fonctionner sauf les boutons flêches et Ok dans certaines applications comme « Replay » et Prime Video, alors qu’avec la télécommande physique, pas de souci. Il faudrait essayer d’autres codes de touches entre 0 et 320. Pour la WAF attitude, on n’y est toujours pas !

Pour le retour d’état de la box, il n’y a pas grand chose :

  • la fonction GetVersions retourne tous les détails de la box

  • la fonction GetSessionsStatus (sur la STB7) retourne quelque chose d’intéressant seulement dans les applications Live et Home


    Pour les applications autres que Live et Home, il faudrait trouver le bon paramètre sinon rien
    image

J’ai fait une boucle pour tester toutes les touches, j’ai découvert les codes raccourcis des applis Netflix, Prime, Disney, Canal et du Replay

{
    "OK": 13,
    "STOP": 19,
    "RETURN": 27,
    "SEARCH": 32,
    "NETFLIX": 124,
    "PRIME": 125,
    "DISNEY": 126,
    "CANAL": 127,
    "REPLAY": 128,
    "RIGHT": 222,
    "INFO": 229,
    "PUP": 290,
    "PDOWN": 291,
    "HOME": 292,
    "LEFT": 293,
    "DOWN": 294,
    "UP": 297,
    "VOD": 300,
    "OPTION": 301,
    "MUTE": 302,
    "POWER": 303,
    "REWIND": 304,
    "FORWARD": 305,
    "PLAYPAUSE": 306,
    "VDOWN": 307,
    "VUP": 308,
    "RECORD": 309
}