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
image

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 :
image
Pour les boutons:
image
Pour les applications
image

La liste complète:

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. https://assistance.sfr.fr/television/decodeur-plus/installer-decodeur-plus-de-sfr.html

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