Forum eedomus
http://forum.eedomus.fr/

Pour les utilisateurs de SONOS
http://forum.eedomus.fr/viewtopic.php?f=13&t=756
Page 1 sur 18  Suivant »
Auteur:  darkwinter [ 05 Déc 2012 15:07 ]
Sujet du message:  Pour les utilisateurs de SONOS

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.
Auteur:  starmich [ 05 Déc 2012 18:27 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

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:
Auteur:  darkwinter [ 16 Déc 2012 18:36 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

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?
Auteur:  starmich [ 17 Déc 2012 19:08 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

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.
Auteur:  darkwinter [ 17 Déc 2012 20:24 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

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

Merci beaucoup :)
Auteur:  DjMomo [ 18 Déc 2012 10:24 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

Et pourquoi pas en faire profiter tout le monde sur le forum ?? ;)
Auteur:  starmich [ 18 Déc 2012 14:34 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

Je poste ça se soir sur le forum pour que tout le monde y ai accès :)
Auteur:  darkwinter [ 18 Déc 2012 18:19 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

Merci beaucoup.

Pour djmomo, effectivement bonne remarque le partage à la communauté.
Auteur:  starmich [ 19 Déc 2012 00:45 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

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é 911 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 :)
Auteur:  darkwinter [ 19 Déc 2012 13:34 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

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');
}

?>
Auteur:  DjMomo [ 19 Déc 2012 13:49 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

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.
Auteur:  darkwinter [ 19 Déc 2012 14:01 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

Tester chez moi :

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

Fonctionne pas. Tu pourras tester chez toi DJ momo?
Auteur:  DjMomo [ 19 Déc 2012 14:57 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

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


Si tu me prêtes un sonos :mrgreen:
Auteur:  DjMomo [ 19 Déc 2012 15:00 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

Question : l'extension curl est activée sur ton serveur web ?
Auteur:  darkwinter [ 19 Déc 2012 15:30 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

Bonne question: je suis sur un serveur web sur un NAS synology. Je me renseigne.
Auteur:  DjMomo [ 19 Déc 2012 15:38 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

DSM -> Panneau de configuration -> Services web -> Extensions PHP
Auteur:  darkwinter [ 19 Déc 2012 15:51 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

Oui par contre dans les extensions, tu n'as pas curl.
Auteur:  DjMomo [ 19 Déc 2012 16:03 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

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é.
Auteur:  darkwinter [ 19 Déc 2012 16:12 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

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
Auteur:  starmich [ 19 Déc 2012 17:00 ]
Sujet du message:  Re: Pour les utilisateurs de SONOS

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 !
Page 1 sur 18 Le fuseau horaire est UTC+1 heure