Pour les utilisateurs de SONOS

Discutez ici de vos souhaits d'évolutions et de vos idées pour eedomus

Pour les utilisateurs de SONOS

Messagepar darkwinter » 05 Déc 2012 15:07

Bonjour,

Je souhaite savoir si il est possible de couper via une requête HTTP l'ensemble des sonos (pour ceux qui utilise l'appli, cela équivaut à la touche "suspendre tout").

J'ai trouvé quelques infos pour différentes requêtes sur Sonos :

http://192.168.1.XXX:1400/reboot - Reboots the Sonos
http://192.168.1.XXX:1400/advconfg.htm - Not quite sure what this is doing, it has an enable/disable list box and the ability to submit the selection.
http://192.168.1.XXX:1400/support/review - Lists a brief summary of the connected devices on your Sonos network.
http://192.168.1.XXX:1400/status - Has several links that provide status information regarding the Sonos. There are ~30ish links on this page. Some of the more interesting ones are "dmesg", "mount", and "upnp"
http://192.168.1.XXX:1400/unlock.htm - Not sure what this one does, but seems like it could be potentially interesting. All that the page provides is a text box and a "submit" button.



Si vous avez une piste je suis preneur. Par avance, merci.
darkwinter
 
Messages : 251
Inscription : 28 Juil 2012

Re: Pour les utilisateurs de SONOS

Messagepar starmich » 05 Déc 2012 18:27

Ahh je ne savais même pas qu'on pouvais suspendre l'activité d'un Sonos :)
Du coup je vais regarder ça dès que j'ai un peu de temps...

Les seuls choses que je fais avec Sonos c'est envoyer des commandes Upnp pour faire du classique : play/pause/suivant/précédent/volume etc...
Et rien que ça c'est déjà horrible car leur langage est semi propriétaire :evil:
starmich
 
Messages : 59
Inscription : 08 Mars 2012

Re: Pour les utilisateurs de SONOS

Messagepar darkwinter » 16 Déc 2012 18:36

Ok merci de l'info. Possible d'associer une commande upnp dans une règles par exemple.

Exemple: lorsque j'active mon alarme j'envoie en même temps une commande upnp qui coupe (stop) tous les sonos?
darkwinter
 
Messages : 251
Inscription : 28 Juil 2012

Re: Pour les utilisateurs de SONOS

Messagepar starmich » 17 Déc 2012 19:08

Oui tu peux couper tes Sonos via une requete Upnp.
C'est ce que je fais d'ailleurs quand j'active mon alarme.

Je passe via un script PHP pour le faire, si tu veux je peux t'envoyer un bout de code que tu pourras adapter a tes besoins.
starmich
 
Messages : 59
Inscription : 08 Mars 2012

Re: Pour les utilisateurs de SONOS

Messagepar darkwinter » 17 Déc 2012 20:24

Ah super bonne nouvelle je suis preneur :) Je t'envoi mon email en MP.

Merci beaucoup :)
darkwinter
 
Messages : 251
Inscription : 28 Juil 2012

Re: Pour les utilisateurs de SONOS

Messagepar DjMomo » 18 Déc 2012 10:24

Et pourquoi pas en faire profiter tout le monde sur le forum ?? ;)
Moi ? C'est Fabien
--------------------------------------------
Mon Github : http://www.github.com/DjMomo/
DjMomo
 
Messages : 1121
Inscription : 26 Sep 2012

Re: Pour les utilisateurs de SONOS

Messagepar starmich » 18 Déc 2012 14:34

Je poste ça se soir sur le forum pour que tout le monde y ai accès :)
starmich
 
Messages : 59
Inscription : 08 Mars 2012

Re: Pour les utilisateurs de SONOS

Messagepar darkwinter » 18 Déc 2012 18:19

Merci beaucoup.

Pour djmomo, effectivement bonne remarque le partage à la communauté.
darkwinter
 
Messages : 251
Inscription : 28 Juil 2012

Re: Pour les utilisateurs de SONOS

Messagepar starmich » 19 Déc 2012 00:45

Comme promis, voici un fichier qui permet d'envoyer des requêtes Upnp au Sonos.
Il n'y a aucune gestion d'erreur, j'ai simplifié au maximum le code pour que vous puissiez l'adapter à vos besoin donc on trouve uniquement les requêtes upnp.

sonos.php.zip
(1.13 Kio) Téléchargé 866 fois


Il y a 2 tableaux PHP tout en haut du code où il faut lister les différents sonos dans l'appartement avec leur IP et le port (il est possible de récupérer l'IP de chaque Sonos depuis l'application Sonos de votre tablet ou smartphone, le port lui reste toujours le même : 1400).

Exemple :
$IP_TABLE = array(
'sonos_salon' => '192.168.XXX.XXX'
);
$PORT_TABLE = array(
'sonos_salon' => 1400
);

// va lancer la lecture du Sonos ayant l'IP 192.168.XXX.XXX
playSonos('salon');

Si vous avez des soucis avec, laissez un message :)
starmich
 
Messages : 59
Inscription : 08 Mars 2012

Re: Pour les utilisateurs de SONOS

Messagepar darkwinter » 19 Déc 2012 13:34

Je viens de faire quelques tests :

IP serveur d'hébergement en local: 192.168.0.90

J'ai créer un fichier stop.php comprenant :

<?php
include("sonos.php");
stopSonos($_GET['room']);
?>


Normalement avec la commande :

http://192.168.0.90/sonos/stop.php?room=bain

La musique dans la salle de bain dois se couper mais à priori non. Si vous avez une idée du pb, je suis preneur.

Voici le fichier sonos. php (merci encore starmich) avec mes IP locale:

<?php

$IP_TABLE = array(
'sonos_chambre' => '192.168.0.17',
'sonos_cuisine' => '192.168.0.15',
'sonos_dressing' => '192.168.0.18',
'sonos_hall' => '192.168.0.19',
'sonos_bain' => '192.168.0.23',
'sonos_salon' => '192.168.0.20'
);

$PORT_TABLE = array(
'sonos_chambre' => 1400,
'sonos_cuisine' => 1400,
'sonos_dressing' => 1400,
'sonos_hall' => 1400,
'sonos_bain' => 1400,
'sonos_salon' => 1400
);

function sendUpnp($sendTo, $msg, $type = 'control'){
global $STREAM_TIMEOUT, $DEBUG, $IP_TABLE, $PORT_TABLE;

if($type == 'control'){
$sRequestXml = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:'.$msg.' xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><Speed>1</Speed></u:'.$msg.'></s:Body></s:Envelope>';

$url = 'http://' . $IP_TABLE[$sendTo] . ':' . $PORT_TABLE[$sendTo] . '/MediaRenderer/AVTransport/Control';
}
else if($type == 'volume'){
$sRequestXml = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetVolume xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><InstanceID>0</InstanceID><Channel>Master</Channel><DesiredVolume>' . $msg . '</DesiredVolume></u:SetVolume></s:Body></s:Envelope>';

$url = 'http://' . $IP_TABLE[$sendTo] . ':' . $PORT_TABLE[$sendTo] . '/MediaRenderer/RenderingControl/Control';

}
else if($type == 'getvolume'){
$sRequestXml = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetVolume xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><InstanceID>0</InstanceID><Channel>Master</Channel></u:GetVolume></s:Body></s:Envelope>';

$url = 'http://' . $IP_TABLE[$sendTo] . ':' . $PORT_TABLE[$sendTo] . '/MediaRenderer/RenderingControl/Control';

}
else if($type == 'information'){
$sRequestXml = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetPositionInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><Channel>Master</Channel></u:GetPositionInfo></s:Body></s:Envelope>';

$url = 'http://' . $IP_TABLE[$sendTo] . ':' . $PORT_TABLE[$sendTo] . '/MediaRenderer/AVTransport/Control';
}
else if($type == 'playing'){
$sRequestXml = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetTransportInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><Channel>Master</Channel></u:GetTransportInfo></s:Body></s:Envelope>';

$url = 'http://' . $IP_TABLE[$sendTo] . ':' . $PORT_TABLE[$sendTo] . '/MediaRenderer/AVTransport/Control';
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 300); //timeout after 5 minutes (60 * 5 = 300)
if($type == 'control'){
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml", "SOAPAction: \"urn:schemas-upnp-org:service:AVTransport:1#$msg\""));
}
else if($type == 'volume'){
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml", "SOAPAction: \"urn:schemas-upnp-org:service:RenderingControl:1#SetVolume\""));
}
else if($type == 'getvolume'){
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml", "SOAPAction: \"urn:schemas-upnp-org:service:RenderingControl:1#GetVolume\""));
}
else if($type == 'information'){
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml", "SOAPAction: \"urn:schemas-upnp-org:service:RenderingControl:1#GetPositionInfo\""));
}
else if($type == 'playing'){
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml", "SOAPAction: \"urn:schemas-upnp-org:service:RenderingControl:1#GetTransportInfo\""));
}

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $sRequestXml);

$sResponse = curl_exec($ch);

return $sResponse;
}

// Lance la lecture de la playlist
function playSonos($room){
sendUpnp('sonos_'.$room, 'Play');
}

// Met en pause la lecture
function pauseSonos($room){
sendUpnp('sonos_'.$room, 'Pause');
}

// Prochain morceau dans la playlist
function nextSonos($room){
sendUpnp('sonos_'.$room, 'Next');
}

// Précédent morceau dans la playlist
function previousSonos($room){
sendUpnp('sonos_'.$room, 'Previous');
}

// Stop la lecture de la musique
function stopSonos($room){
sendUpnp('sonos_'.$room, 'Stop');
}

// Change le volume du Sonos (entre 0 et 100)
function volumeSonos($volume = 0, $room){
sendUpnp('sonos_'.$room, $volume, 'volume');
}

?>
darkwinter
 
Messages : 251
Inscription : 28 Juil 2012

Re: Pour les utilisateurs de SONOS

Messagepar DjMomo » 19 Déc 2012 13:49

sonos.php :
Code : Tout sélectionner
<?php

$IP_TABLE = array(
'sonos_chambre' => '192.168.0.17',
'sonos_cuisine' => '192.168.0.15',
'sonos_dressing' => '192.168.0.18',
'sonos_hall' => '192.168.0.19',
'sonos_bain' => '192.168.0.23',
'sonos_salon' => '192.168.0.20'
);

$PORT_TABLE = array(
'sonos_chambre' => 1400,
'sonos_cuisine' => 1400,
'sonos_dressing' => 1400,
'sonos_hall' => 1400,
'sonos_bain' => 1400,
'sonos_salon' => 1400
);

function sendUpnp($sendTo, $msg, $type = 'control'){
global $STREAM_TIMEOUT, $DEBUG, $IP_TABLE, $PORT_TABLE;

if($type == 'control'){
$sRequestXml = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:'.$msg.' xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><Speed>1</Speed></u:'.$msg.'></s:Body></s:Envelope>';

$url = 'http://' . $IP_TABLE[$sendTo] . ':' . $PORT_TABLE[$sendTo] . '/MediaRenderer/AVTransport/Control';
}
else if($type == 'volume'){
$sRequestXml = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetVolume xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><InstanceID>0</InstanceID><Channel>Master</Channel><DesiredVolume>' . $msg . '</DesiredVolume></u:SetVolume></s:Body></s:Envelope>';

$url = 'http://' . $IP_TABLE[$sendTo] . ':' . $PORT_TABLE[$sendTo] . '/MediaRenderer/RenderingControl/Control';

}
else if($type == 'getvolume'){
$sRequestXml = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetVolume xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><InstanceID>0</InstanceID><Channel>Master</Channel></u:GetVolume></s:Body></s:Envelope>';

$url = 'http://' . $IP_TABLE[$sendTo] . ':' . $PORT_TABLE[$sendTo] . '/MediaRenderer/RenderingControl/Control';

}
else if($type == 'information'){
$sRequestXml = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetPositionInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><Channel>Master</Channel></u:GetPositionInfo></s:Body></s:Envelope>';

$url = 'http://' . $IP_TABLE[$sendTo] . ':' . $PORT_TABLE[$sendTo] . '/MediaRenderer/AVTransport/Control';
}
else if($type == 'playing'){
$sRequestXml = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetTransportInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><Channel>Master</Channel></u:GetTransportInfo></s:Body></s:Envelope>';

$url = 'http://' . $IP_TABLE[$sendTo] . ':' . $PORT_TABLE[$sendTo] . '/MediaRenderer/AVTransport/Control';
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 300); //timeout after 5 minutes (60 * 5 = 300)
if($type == 'control'){
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml", "SOAPAction: \"urn:schemas-upnp-org:service:AVTransport:1#$msg\""));
}
else if($type == 'volume'){
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml", "SOAPAction: \"urn:schemas-upnp-org:service:RenderingControl:1#SetVolume\""));
}
else if($type == 'getvolume'){
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml", "SOAPAction: \"urn:schemas-upnp-org:service:RenderingControl:1#GetVolume\""));
}
else if($type == 'information'){
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml", "SOAPAction: \"urn:schemas-upnp-org:service:RenderingControl:1#GetPositionInfo\""));
}
else if($type == 'playing'){
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml", "SOAPAction: \"urn:schemas-upnp-org:service:RenderingControl:1#GetTransportInfo\""));
}

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $sRequestXml);

$sResponse = curl_exec($ch);

return $sResponse;
}

// Lance la lecture de la playlist
function playSonos($room){
sendUpnp('sonos_'.$room, 'Play');
}

// Met en pause la lecture
function pauseSonos($room){
sendUpnp('sonos_'.$room, 'Pause');
}

// Prochain morceau dans la playlist
function nextSonos($room){
sendUpnp('sonos_'.$room, 'Next');
}

// Précédent morceau dans la playlist
function previousSonos($room){
sendUpnp('sonos_'.$room, 'Previous');
}

// Stop la lecture de la musique
function stopSonos($room){
sendUpnp('sonos_'.$room, 'Stop');
}

// Change le volume du Sonos (entre 0 et 100)
function volumeSonos($volume = 0, $room){
sendUpnp('sonos_'.$room, $volume, 'volume');
}

?>


framework_sonos.php
Code : Tout sélectionner
<?php
include ('sonos.php');

$action = $_GET('action');
$room = $_GET('room');
$volume = $GET('volume');

switch ($action) {
case "play" : playSonos($room); break;
case "pause" : pauseSonos($room); break;
case "next" : nextSonos($room); break;
case "previous" : previousSonos($room); break;
case "stop" : stopSonos($room); break;
case "volume" : volumeSonos($volume,$room); break;
default: break;
}
?>


Appel :
Code : Tout sélectionner
http://IP/framework_sonos.php?action=stop&room=sonos_dressing


Pas testé, mais ca devrait fonctionner.

PS : pensez aux balises code pour poster du code sur le forum, c'est plus lisible.
Moi ? C'est Fabien
--------------------------------------------
Mon Github : http://www.github.com/DjMomo/
DjMomo
 
Messages : 1121
Inscription : 26 Sep 2012

Re: Pour les utilisateurs de SONOS

Messagepar darkwinter » 19 Déc 2012 14:01

Tester chez moi :

http://192.168.0.90/sonos/framework_son ... &room=bain

Fonctionne pas. Tu pourras tester chez toi DJ momo?
darkwinter
 
Messages : 251
Inscription : 28 Juil 2012

Re: Pour les utilisateurs de SONOS

Messagepar DjMomo » 19 Déc 2012 14:57

darkwinter a écrit:Tu pourras tester chez toi DJ momo?


Si tu me prêtes un sonos :mrgreen:
Moi ? C'est Fabien
--------------------------------------------
Mon Github : http://www.github.com/DjMomo/
DjMomo
 
Messages : 1121
Inscription : 26 Sep 2012

Re: Pour les utilisateurs de SONOS

Messagepar DjMomo » 19 Déc 2012 15:00

Question : l'extension curl est activée sur ton serveur web ?
Moi ? C'est Fabien
--------------------------------------------
Mon Github : http://www.github.com/DjMomo/
DjMomo
 
Messages : 1121
Inscription : 26 Sep 2012

Re: Pour les utilisateurs de SONOS

Messagepar darkwinter » 19 Déc 2012 15:30

Bonne question: je suis sur un serveur web sur un NAS synology. Je me renseigne.
darkwinter
 
Messages : 251
Inscription : 28 Juil 2012

Re: Pour les utilisateurs de SONOS

Messagepar DjMomo » 19 Déc 2012 15:38

DSM -> Panneau de configuration -> Services web -> Extensions PHP
Moi ? C'est Fabien
--------------------------------------------
Mon Github : http://www.github.com/DjMomo/
DjMomo
 
Messages : 1121
Inscription : 26 Sep 2012

Re: Pour les utilisateurs de SONOS

Messagepar darkwinter » 19 Déc 2012 15:51

Oui par contre dans les extensions, tu n'as pas curl.
darkwinter
 
Messages : 251
Inscription : 28 Juil 2012

Re: Pour les utilisateurs de SONOS

Messagepar DjMomo » 19 Déc 2012 16:03

Code : Tout sélectionner
<?
phpinfo();
?>

Appelle ce script, et vérifie dans la section curl s'il est actif.

J'y repense, mais sur les Syno, curl n'est pas une extension, c'est compilé avec. Donc normalement si ton Syno est à jour, curl est présent et activé.
Moi ? C'est Fabien
--------------------------------------------
Mon Github : http://www.github.com/DjMomo/
DjMomo
 
Messages : 1121
Inscription : 26 Sep 2012

Re: Pour les utilisateurs de SONOS

Messagepar darkwinter » 19 Déc 2012 16:12

Oui oui c'est bien enable dans le php.info



On va attendre le retour de starmich. C'est peux être un pb au niveau du sonos.php
darkwinter
 
Messages : 251
Inscription : 28 Juil 2012

Re: Pour les utilisateurs de SONOS

Messagepar starmich » 19 Déc 2012 17:00

Je vais regarder tout ca dès que je rentre à la maison... j'ai sorti le code de mon framework et je ne l'ai pas testé entièrement donc il se peut que j'ai zappé une variable quelque part ;)

Je prépare donc un code un peu plus clean tout à l'heure !
starmich
 
Messages : 59
Inscription : 08 Mars 2012

Suivant

Retour vers Suggestions

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 10 invité(s)