Sonos Modul

Einheitlichkeit und Einfachheit. Dummyfreundlich…

ja, bin als DAU leider wirklich nicht geeignet. Ansonsten gerne…

Moin,
auch von mir hier noch einen dicken Dank an Thorsten. Hat keine Beine und ‚läuft‘ … :smiley:

Zum Modulstore mal meine 10Cent:
Besucher des Lübecker Events und Beta-Tester - nur die würde ich hier mal als die „Meute“ bezeichnen - kennen (und lieben) den Store seit einigen Monaten. Das ist die Zukunft …
Für das „Volk“ ist der Store aber quasi erst seit gestern mit der 5.1 stable verfügbar - und auch dort noch als ‚(beta)‘ gekennzeichnet, was auch einige noch abschrecken könnte.
Ich würde mich (auch als ‚Modul-DAU‘) dem Ruf der Meute durchaus anschliessen - sehe aber eine Priorität erst dann, wenn das Volk es wirklich leid ist den einen oder anderen Link im github oder im Forum zu suchen.

Grüße, Uwe

So, ich habe noch mal eine Änderung hinterher geschoben.
Mich haben die Logs „Sonos instance 192.168.1.32 is not available“ von den Scripten genervt.

–> Version 1.06

Und als kurze Vorabankündigung (kommt in den nächsten Tagen):
Ich werde bei den Funktionen SNS_PlayFilesGrouping und SNS_PlayFiles anstelle der Arrays JSON Strings erwartet werden.
Dies wird eine inkompatible Änderung.
Muss aber sein um die „type hints“ richtig pflegen zu können.

Hallo,

nun ja, das mit „um die Sonos Geräte automatisch zu finden“ hätte ich schon länger gerne. Vielleicht muss man das ja als Chance sehen eine Version 2.0 ins Leben zu rufen.

Ich hatte da auch schon mal angefangen rumzuspielen.

Da ich nicht alle Varianten an Boxen daheim habe, könntet ihr mir mal den output von


<?php

include_once("../modules/SymconSonos/Sonos/sonosAccess.php");

$msg  = 'M-SEARCH * HTTP/1.1' . "
";
$msg .= 'HOST: 255.255.255.255:1900' . "
";
$msg .= 'MAN: "ssdp:discover"' . "
";
$msg .= "MX: 3
";
$msg .= "ST: urn:schemas-upnp-org:device:ZonePlayer:1
";
$msg .= '' . "
";

$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
socket_sendto($socket, $msg, strlen($msg), 0, '255.255.255.255', 1900);
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 2, 'usec' => 0));

$res = null;
@socket_recvfrom($socket, $res, 1024, MSG_WAITALL, $from, $port);

if (!is_null($res)) {
  $lines  = explode("
", trim($res));

  if (trim($lines[0]) == 'HTTP/1.1 200 OK') {
    array_shift($lines);
  }

  foreach ($lines as $line) {
    $tmp = explode(':', trim($line));
    if ( strtoupper(array_shift($tmp)) === 'LOCATION'){ 
      $value = (count($tmp) > 0 ? trim(join(':', $tmp)) : null);
      if (preg_match('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/', $value, $ip_match)) {
        $ip = $ip_match[0];
      }
    }
  }          
}

if (!isset($ip)){
    die('No Sonos Box found');
}

$sonos = new SonosAccess($ip);

$grouping = new SimpleXMLElement($sonos->GetZoneGroupState());
$zoneGroups = $grouping->ZoneGroups->ZoneGroup;

foreach ($zoneGroups as $zoneGroup){
 foreach ($zoneGroup->ZoneGroupMember as $zoneGroupMember){
  if ( !isset($zoneGroupMember->attributes()['Invisible']) ) {
   if (preg_match('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/', $zoneGroupMember->attributes()['Location'], $ip_match)) {
    $description = new SimpleXMLElement($zoneGroupMember->attributes()['Location'],0,true);
    echo $zoneGroupMember->attributes()['UUID'] . "	" .  $ip_match[0] . "	" . $description->device->displayName . "	"  . $zoneGroupMember->attributes()['ZoneName'] . "
";
   }         
  }
 }
}        

?>

schicken?
Zusätzlich ob alle eure Boxen (die ihr auch in der App seht) gefunden werden? Bei einem Stereo-Paar z.B: würde ich nur eine erwarten.
Auch sollte jemand testen ob es auf Windows tut.

Vorsicht: Bei Docker muss das Netzwerk als „host“ und nicht als „bridge“ konfiguriert sein.

Danke,
Thorsten

Hallo Thorsten,
hier der Output Deines Scripts. Ausgeführt auf Intel NUC Ubuntu 18.04.
Alle Sonos Instanzen die in der App angezeigt werden wurden erkannt.


HTTP/1.1 200 OK
CACHE-CONTROL: max-age = 1800
EXT:
LOCATION: http://192.168.2.55:1400/xml/device_description.xml
SERVER: Linux UPnP/1.0 Sonos/49.2-64250 (ZPS14)
ST: urn:schemas-upnp-org:device:ZonePlayer:1
USN: uuid:RINCON_949F3EC1260901400::urn:schemas-upnp-org:device:ZonePlayer:1
X-RINCON-HOUSEHOLD: Sonos_b0y9x8KLscLtQSE3NrmQW30ZFB
X-RINCON-BOOTSEQ: 35
X-RINCON-WIFIMODE: 0
X-RINCON-VARIANT: 1
HOUSEHOLD.SMARTSPEAKER.AUDIO: Sonos_b0y9x8KLscLtQSE3NrmQW30ZFB.b8DXvHBVDzz3gBFvC6RY

192.168.2.55RINCON_949F3EC1260901400	192.168.2.55	Beam	Fernseher
RINCON_7828CA04FB7201400	192.168.2.38	One	Küche

Mit freundlichen Grüßen
Volkmar

Das sollte grundsätzlich nicht das große Problem sein, Sonos meldet sich sehr zuverlääsig im Netzwerk, das funktioniert prima mit einer Discovery Instanz.

Fände ich eine prima Sache eine 2.0, Du musst ja auch nicht zwingend alles alleine machen, nur am Ende must Du schauen was wie zusammen passt und übernommen werden soll.
Du kannst ja für den Anfang vielleicht einfach mal einen Old_Version Branch und einen Beta Branch aus dem jetzigen master erstellen. Der master kann dann irgendwann mal die 2.0 werden der Old_Version ist der jetzige Stand und beim Beta können alle zusammen helfen, das man zu einer 2.0 mit Discovery Instanz kommt. Den Beta Branch könnte man zum Testen im Modul Store nutzten, bis man meint das die Version eine Stable ist.

Hallo Thorsten,

bei mir auf Windows folgendes Ergebnis: No Sonos Box found

W10 1809.

Gruß Achim

Hallo Thorsten,

bei mir auf Windows kommt auch das Ergebnis: No Sonos Box found
Das Script wird als fehlerhaft markiert. Entferne ich das „@“ in Zeile 18 kommt folgende Fehlermeldung:

Warning: socket_recvfrom(): unable to recvfrom [10045]: Der Vorgang wird von dem Objekttyp nicht unterst�tzt, auf den Bezug genommen wurde.
in C:\IP-Symcon\scripts\25259.ips.php on line 18

NUC mit Win7, IPS 5.1 Beta
Boxen: 2x Sonos 3 und 1x Sonos 1

Gruß Alex

Bei mir das gleiche. Script ist fehlerhaft durch den „die“ Befehl.

MSG_WAITALL geht nur bei TCP nicht bei UDP.
Hier ein Beispiel welches sowohl unter Windows als auch Linux getestet wurde:
IPSKodi/module.php at 042f254339bc85a4c39dd35bdd1ac28929bd4b2b · Nall-chan/IPSKodi · GitHub
Michael

Hallo
Zeile 18 aendern in dann funktioniert es unter Windows ( Danke an Nall-chan )

socket_recvfrom($socket, $res, 1024, 0, $from, $port);

RINCON_949F3E03FF5E01400 192.168.1.66 Play:1 Bad
RINCON_949F3E08D66801400 192.168.1.68 Play:1 Arbeitszimmer
RINCON_7828CA17980801400 192.168.1.67 One Schlafzimmer
RINCON_B8E937D4FAEA01400 192.168.1.65 Play:3 Wohnzimmer
RINCON_347E5C1C824401400 192.168.1.69 Play:1 Kueche

Mit der Änderung geht es bei mir auch wenn ein Stereopaar vorhanden ist wird nur ein Lautsprecher angezeigt wie bei mir in der Küche und der Terrasse:


gruß Stefan

Hallo Leute,
jetzt geht es.

RINCON_949F3E6D384801400 192.168.98.73 Playbar Sonos Büro
RINCON_949F3E6607C201400 192.168.98.84 Playbar Sonos Schlafen
RINCON_949F3E04AD4E01400 192.168.98.80 Play:1 Sonos Küche
RINCON_949F3E07E83401400 192.168.98.71 Play:1 Sonos Bad
RINCON_949F3E707EDC01400 192.168.98.78 Play:1 Sonos Flur
RINCON_949F3E1E3F2001400 192.168.98.79 Play:1 Sonos Mobil
RINCON_949F3E21FC1E01400 192.168.98.88 Connect Sonos Wohnen

Büro besteht aus: Playbar/SUB/2 x Play 1
Schlafzimmer aus: Playbar/2 x Play 1
Küche und Bad bestehen aus einem Stereo Paar.

Also alles i.O.

Gruß Achim

Mir ist jetzt noch aufgefallen das mein Boost nicht angezeigt wird.
Gruß Stefan

Hallo Stefan,
ich glaube auch nicht, dass dieser angezeigt wird, da er nicht „bedienbar“ ist.
Ist eigentlich wie ein Access-Point speziell für Sonos.

Gruß Achim

RINCON_000XXXXXXXXXXXX 192.168.10.112 Play:5 Wohnzimmer
RINCON_000XXXXXXXXXXXX 192.168.10.109 Play:1 Küche
RINCON_000XXXXXXXXXXXX 192.168.10.110 Play:3 Schlafzimmer
RINCON_000XXXXXXXXXXXX 192.168.10.40 Play:1 Dusche
RINCON_000XXXXXXXXXXXX 192.168.10.125 One Bad

Ergebnis vom raspi aus. Sind alle 5, die ich habe. Sind alles „Single“-Speaker. Also keine Stereo

Da wird bei mir kein Sonos Gerät gefunden.

Unter windows?
Wenn ja dan must du wie oben beschrieben die Zeile 18 ändern
Gruß Stefan

Gesendet von meinem SM-T825 mit Tapatalk

Danke für den Tipp das scheint aber nicht die Ursache zu sein. Das Skript ist unverändert bis auf die von Dir genannte Zeile, die hatte ich schon vorsorglich ausgetauscht. Das Problem ist vielmehr das wenn ich ein var dump auf $ip mache dort keine IP Adressen der Sonos Geräte enthalten sind, daher läuft das Skript danach auch ins Leere bzw. produziert Fehler. Es wird zwar eine IP Adresse ausgegeben, das ist aber definitiv kein Sonos Gerät, während die Sonos Geräte nicht mit den IP Adressen im Array aufgeführt sind.