Sonos Modul

Mit dem neuesten Update sind auch bei mir die Fehlermeldungen weg. Herzlichen Dank!

Hier noch den Auszug von den Boxen.

RINCON_7828CA2E4AD201400 192.168.3.25 Play:1 Schlafzimmer
RINCON_B8E937D03EF001400 192.168.3.22 Play:3 Küche
RINCON_B8E93782BBA401400 192.168.3.26 Play:1 Wohnzimmer 2
RINCON_949F3EC2237A01400 192.168.3.21 Beam Wohnzimmer
RINCON_949F3E06524001400 192.168.3.24 Play:1 Dusche
RINCON_B8E93787C82A01400 192.168.3.23 Play:1 Ankleide

Bei mir kommt auch eine Fehlermeldung unter Windows, auch wenn ich die Zeile abändere.
Wie schon gesagt, Win7 IPS 5.1 beta, Unifi Netzwerk.

Gruß Alex

Eventuell hilft das, bei mehreren Netzwerkkarten/IP Adressen auf einem System und/oder wenn eine andere Anwendung schon den Port blockiert.
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

socket_bind($socket, ‚0.0.0.0‘, 0);

Michael

Hallo Michael, leider keine Besserung.

Aktuell sieh das Script so aus:

<?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));
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

socket_bind($socket, '0.0.0.0', 0);
$res = null;
socket_recvfrom($socket, $res, 1024, 0, $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'] . "
";
   }         
  }
 }
}        

?>

Fehlermeldung:
Warning: socket_bind(): unable to bind address [10022]: Ein ung�ltiges Argument wurde angegeben.
in C:\IP-Symcon\scripts\25259.ips.php on line 18

Gruß Alex

Ich muss gestehen, dadurch daß ich kein Sonos habe, kann ich es nicht testen.
Aber wenn ich das richtig sehe, ist es eine ganz normal eine SSDP Anfrage.
Da ist 239.255.255.250 als Multicast und nicht 255.255.255.255 als Broadcast zu nutzen.
Siehe Link zu meinem Kodi Discovery.
Michael

Hallo,

bei mir sieht die Ausgabe wie folg aus. System ist Ubuntu 18.04 mit Symcon 5.1. Ich habe das Original-Script verwendet. Die für Windows geänderte Zeile findet im Ergebnis ein Sonos Gerät weniger.

Es fehlt eine Sonos Play:3. Eine Instanz gibt es, diese ist aber aktuell ohne Strom, aber natürlich dem System bekannt.


RINCON_B8E93786D09001400 192.168.114.192 Play:1 Bad 
RINCON_B8E93777C37901400 192.168.114.193 Playbar Wohnzimmer 
RINCON_5CAAFD07720201400 192.168.114.198 Play:5 Arbeitszimmer 
RINCON_5CAAFDF0658201400 192.168.114.197 Play:5 Gästezimmer

Warning: SimpleXMLElement::__construct(http://192.168.114.190:1400/xml/device_description.xml): failed to open stream: No route to host in /var/lib/symcon/scripts/13741.ips.php on line 52

Warning: SimpleXMLElement::__construct(): I/O warning : failed to load external entity "http://192.168.114.190:1400/xml/device_description.xml" in /var/lib/symcon/scripts/13741.ips.php on line 52

Fatal error: Uncaught Exception: String could not be parsed as XML in /var/lib/symcon/scripts/13741.ips.php:52 Stack trace: #0 /var/lib/symcon/scripts/13741.ips.php(52): SimpleXMLElement->__construct('http://192.168....', 0, true) #1 {main} thrown in /var/lib/symcon/scripts/13741.ips.php on line 52
Abort Processing during Fatal-Error: Uncaught Exception: String could not be parsed as XML in /var/lib/symcon/scripts/13741.ips.php:52 Stack trace: #0 /var/lib/symcon/scripts/13741.ips.php(52): SimpleXMLElement->__construct('http://192.168....', 0, true) #1 {main} thrown Error in Script /var/lib/symcon/scripts/13741.ips.php on Line 52

Noch eine Idee zu den Branches: Kugelberg hat angekündigt dass es eine Ämnderng geben wird, die nicht kompatibel mit aktuellen Scipten ist. Das würde sich ja dann auch für eine .0 in einem parallelen Branch anbieten.

Gruß
Christian

Gruß
Christian

Hallo,

Nö.

So, Version 1.7 ist da. PlayFiles und PlayFilesGrouping ist angepasst und muss nun entweder direkt mir dem JSON Array als string oder halt mit „json_encode($array)“ aufgerufen werden.

Damit sollten auch die Type Hint Warnungen verschwunden sein.

Gruß,
Thorsten

Hallo,

ja, ich habe auch schon erkannt, dass es nicht trägt diese Modul alleine zu Pflegen.

Da ich mich IPS technisch eher nicht ganz so gut auskenne, mir PHP nur für dieses Modul angelesen habe und GITHub auch nur hier verwende, bräuchte ich folgende Mithilfe:

  1. Jemand mit dem man mal telefonieren kann, der sich mit dem sauberen Aufbau eines Moduls auskennt.
    Was muss man definieren, damit ich verschiedene Instanztypen habe?
    Wie baue ich das sauber im Modul ein?
  2. Jemand der sich gut mit PHP auskennt und mir auch gerne mal zeigt wie man etwas sauberer/eleganter machen kann.
  3. Jemand, der mich vor dem schlimmsten bei GITHub bewahrt (Collaborators hinzufügen, neuen Branch oder doch lieber Temporäres Repository, …)
  4. Und vor allem jemanden (oder mehrere) mit Zeit, der/die hier mitarbeiten möchte.

Was ich auf keinen Fall will:

  • Rumgefrickel. --> Soll bedeuten, ich verzichte lieber auf Funktionalität wenn es nur unsauber (bzw. nicht stabil) implementiert werden kann.
  • Das Modul muss lokal arbeiten. --> Ich möchte nicht, dass eine Cloud API aufgerufen wird, um meine Boxen zu steuern. Das Steuern muss auch ohne Internet Verbindung funktionieren.

Also, PN (mit Mail Adresse) an mich und wir treiben dieses Modul in Richtung 2.0
Ich würde dann mal einen Skype Call aufsetzen (wer kein Skype hat, muss sich dann halt nen WebClient installieren) und dann telefonieren alle interessierten mal.

Danke,
Thorsten

Hallo Thorsten,

ich weis jetzt nicht, ob es Sinn macht im Moment alles anzupassen, da ja was von SONOS verändert wird ?
Bin da aber nicht auf dem aktuellem Stand, und gerade mal kurz gesucht :
Ikea Symfonisk: Sonos-kompatibler Lautsprecher leuchtet für 180 Euro - Golem.de
Ich glaube, etwas abwarten was sich tut, um nicht doppelte Arbeit zu haben.

Hi Thorsten,

pack das json_encode doch einfach in deine Methode, dann muss man nicht all seine Skripte anpassen. :slight_smile:

Grüße
Sven

nicht lustig.

Urgs, jetzt verstehe ich erst, wieso du das machst. Sorry, war nicht böse gemeint.

Kann mir jemand sagen was ich ändern muss ? Verstehe nur Bahnhof… Json string usw ^^
Die Doku ist glaub ich noch nicht angepasst…

Doku GitHub:

SNS_PlayFiles(17265, Array( "//ipsymcon.fritz.box/sonos/bla.mp3",
                            "http://www.sounds.com/blubb.mp3"), 0);

Mein Script:

<?
SNS_PlayFiles(59206, array("http://192.168.2.2:3777/user/sonos/mp3/klingel-ding-dong.mp3", "http://192.168.2.2:3777/user/sonos/mp3/dingdongeshatgeklingelt.mp3"), 30);
?>

Fehlermeldung


Fatal error:  Uncaught TypeError: Argument 1 passed to Sonos::PlayFiles() must be of the type string, array given, called in /var/lib/symcon/scripts/__generated.inc.php on line 1947 and defined in /var/lib/symcon/modules/SymconSonos/Sonos/module.php:515
Stack trace:
#0 /var/lib/symcon/scripts/__generated.inc.php(1947): Sonos->PlayFiles(Array, 30)
#1 /var/lib/symcon/scripts/48558.ips.php(2): SNS_PlayFiles(59206, Array, 30)
#2 {main}
  thrown in /var/lib/symcon/modules/SymconSonos/Sonos/module.php on line 515

Mag mir jemand sagen was ich ändern muss ?
Danke !

Die Antwort steht hier: Sonos Modul - Seite 117
Versuch es mal so:


SNS_PlayFiles(17265, json_encode(Array( "//ipsymcon.fritz.box/sonos/bla.mp3", 
                            "http://www.sounds.com/blubb.mp3")), 0);  

Grüße,
Kai

Dein Array json_encodieren und an die Methode übergeben.


$data = json_encode($Array);

Uli

Gesendet von iPhone mit Tapatalk

Klappt jetzt ! Danke

Beide Arten funktionieren.

SNS_PlayFiles(59206, json_encode(Array("http://192.168.2.2:3777/user/sonos/mp3/klingel-ding-dong.mp3")), 30);

und

SNS_PlayFiles(59206,$data = json_encode(Array("http://192.168.2.2:3777/user/sonos/mp3/klingel-ding-dong.mp3")), 30);

Hallo,

man könnte auch direkt den JSON string angeben:

SNS_PlayFiles(59206, '["http://192.168.2.2:3777/user/sonos/mp3/klingel-ding-dong.mp3"]', 30);

bzw bei mehreren

SNS_PlayFiles(59206, '["http://192.168.2.2:3777/user/sonos/mp3/klingel-ding.mp3","http://192.168.2.2:3777/user/sonos/mp3/klingel-dong.mp3"]', 30);

Gruß,
Thorsten

Hallo,

ich versuche gerade eine mp3 auf 4 Lautsprecher abzuspielen. habe aber noch nicht ganz verstanden wie ich den Pfad angeben mus.

Hier mein Code:

SNS_PlayFilesGrouping(43408  , array (45915 => array ("volume" => 30),
                                                                    24210 => array ("volume" => 30),
                                                                    33376 => array ("volume" => 30)),
                                                                    array('["//192.168.178.51/free/türklingel.mp3"]'), 30 );

Und die Fehlermeldung:

Fatal error: Uncaught TypeError: Argument 1 passed to Sonos::PlayFilesGrouping() must be of the type string, array given, called in /var/lib/symcon/scripts/__generated.inc.php on line 423
and defined in /var/lib/symcon/modules/SymconSonos/Sonos/module.php:609 Stack trace: #0 /var/lib/symcon/scripts/__generated.inc.php(423): Sonos->PlayFilesGrouping(Array, Array, 28) #1 /var/lib/symcon/scripts/48092.ips.php(6): SNS_PlayFilesGrouping(43408, Array, Array, 28) #2 {main} thrown in /var/lib/symcon/modules/SymconSonos/Sonos/module.php on line 609

grüße Tobi

Folgendes Problem habe ich, nach Stromausfällen ist ja bekanntermaßen der Sender in der sonos weg, wenn man jetzt über die Taste der Play diese anschalten will passiert nichts, ist auch so wenn man es über die KNX macht, gibt es da eine Möglichkeit dies zu umgehen, oder über das Modul den letzten Sender automatisch immer wieder an die sonos zu senden ?
Oder hat jemand einen ganz anderen Ansatz

Versuche es mal so:


SNS_PlayFilesGrouping(43408, [45915 => ['volume' => 30], 
                              24210 => ['volume' => 30], 
                              33376 => ['volume' => 30]
                             ], 
                             ['//192.168.178.51/free/türklingel.mp3'], 30);