Sonos Modul

Hallo Thorsten,

ich habe auch noch ein Fehlereintrag im Log wenn der optische Eingang aktiv ist:

IPSymcon-Err-PHP            2016-02-25 00:00:05.829  Notice: Undefined variable: image 
Error in Script /mnt/data/symcon/scripts/44773.ips.php on Line 158    
134 in /mnt/data/symcon/IPSLibrary/app/core/IPSLogger/IPSLogger.inc.php (call IPSLogger_Out) 
44 in /mnt/data/symcon/IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)    
158 in /mnt/data/symcon/44773.ips.php (call IPSLogger_PhpErrorHandler)

44773 ist " _updateStatus"

Hallo,

mit Version 1.3.4 erzeuge ich jetzt „hoffentlich“ die detailsHTML nicht mehr für SPDIF und Analog.

„Notice: Undefined variable: image“ sollte damit weg sein.

Gruß,
Thorsten

Ich würde mir eine Option in der Konfiguration wünschen, welche die in Sonos ‚Importierten Playlisten‘ anzeigt anstatt der in Sonos angelegten Playlisten. Hintergrund: Ich verwalte meine Playlisten innerhalb eines extra Programms und nicht im Sonos selbst.

Das dürfte recht einfach machbar sein:

  • Option in die Konfiguration
  • Soap Parameter in sonosAccess.php / BrowseContentDirectory(…) entsprechend der Option verändern
  • Kosmetik bei der Darstellung des Playlistnamens (.m3u etc. substituieren)

Sinnvoll ?

Daniel

Hallo,

das macht einen Unterschied?
Wie sähe denn die Query (also BrowseContentDirectory(…) ) aus?

Ich könnte mir eine Select Box für die Playlists vorstellen.

  • none
  • saved playlists
  • imported playlists
  • imported and saved playlists

Gruß,
Thorsten

Hallo zusammen.

Habe auf das neue Sonos Modul umgestellt. Macht Spass, Danke allen.
Gibt es eine Möglichkeit, die Radiostationen auch ohne Nachfrage über dieses Board anzupassen?
Ich komme aus einer anderen Region, da sind die bereits vordefinierten Stationen nicht ganz so gefragt.

Gruss
Danny

Hi Danny!

Sollte keine deiner Radiostationen im Modul verfügbar sein, dann einfach Name des Radiosenders + Stream URL hier posten und kugelberg nett bitten das einzubauen und dann macht er das auch meistens ruck zuck :slight_smile:

Selbst einbauen geht theoretisch auch, wird aber beim nächsten Modul-Update überschrieben…ist deshalb nicht zu empfehlen.

Grüße,
Chris

Das macht einen Unterschied, du bekommst dann nämlich andere Playlisten zur Auswahl :slight_smile:

Für die ObjectID im SOAP Call musst du „A:PLAYLISTS“ setzen.

Gute Idee mit der Selectbox!

Hallo,

Du hast auch die Möglichkeit die Favoriten aus der Konfiguration in Sonos zu importieren.
Schau Dir mal in der Doku fast ganz unten die Erläuterung zu „SNS_UpdateRadioStations(integer $InstanceID)“ an.
Bzw. unter Konfiguration die Beschreibung von „Include TuneIn favorites“ und „Stations in WebFront“.

Wenn Du Deine Favoriten nicht im WebFront anzeigen willst, kannst Du sie auch mit „SNS_SetRadio(integer $InstanceID, string $radio)“, indem Du für $radio einfach den Namen Deines Favoriten angibts. Das sollte auf jeden Fall gehen.

Gruß,
Thorsten

Also ich hätte die Playlist Sache mal kurz programmiert, falls du Lust drauf hast das einzubauen hier die relvanten Stellen:

form.json:


                { "name": "PlaylistSelection",        "type": "Select",            "caption": "Playlist selection",
                    "options": [
                                { "label": "Sonos Playlists",                    "value": "sonos" },
                                { "label": "Imported Playlists",                 "value": "import" }
                    ] 
                },

module.php:


$this->RegisterPropertyString("PlaylistSelection", "sonos");

public function SetPlaylist($name){
        $ip      = $this->ReadPropertyString("IPAddress");
        $timeout = $this->ReadPropertyString("TimeOut");
        if ($timeout && Sys_Ping($ip, $timeout) != true)
           throw new Exception("Sonos Box ".$ip." is not available");

        if(@GetValue($this->GetIDForIdent("MemberOfGroup")))
          $this->SetGroup(0);

        include_once(__DIR__ . "/sonosAccess.php");
        $sonos = new SonosAccess($ip);

        $uri = '';
        
        switch ($this->ReadPropertyString("PlaylistSelection")) {
            case 'sonos':
                $queryObject = "SQ:";
                break;
            case 'import':
                $queryObject = "A:PLAYLISTS";
                break;
            default:
                $queryObject = "SQ:";
                break;
        }

        $replace =  array(
                          '.m3u' // to be extended on demand
                         );
        
        foreach ((new SimpleXMLElement($sonos->BrowseContentDirectory($queryObject)['Result']))->container as   $container) {
            if (str_replace($replace, '', $container->xpath('dc:title')[0]) == $name){
              $uri = (string)$container->res;
              break;
            }
        }  

        if($uri === '')
            throw new Exception('Playlist \''.$name.'\' not found');

        $sonos->ClearQueue();
        $sonos->AddToQueue($uri);
        $sonos->SetAVTransportURI('x-rincon-queue:'.$this->ReadPropertyString("RINCON").'#0');
        $sonos->Play();

    }

public function UpdatePlaylists()
    {
        $ip      = $this->ReadPropertyString("IPAddress");
        $timeout = $this->ReadPropertyString("TimeOut");
        if ($timeout && Sys_Ping($ip, $timeout) != true)
           throw new Exception("Sonos Box ".$ip." is not available");

        include_once(__DIR__ . "/sonosAccess.php");
        $sonos = new SonosAccess($ip);

        $Associations          = Array();
        $Value                 = 1;

        switch ($this->ReadPropertyString("PlaylistSelection")) {
            case 'sonos':
                $queryObject = "SQ:";
                break;
            case 'import':
                $queryObject = "A:PLAYLISTS";
                break;
            default:
                $queryObject = "SQ:";
                break;
        }

        $replace =  array(
                          '.m3u' // to be extended on demand
                         );
        
        foreach ((new SimpleXMLElement($sonos->BrowseContentDirectory($queryObject)['Result']))->container as $container) {
            
            $Associations[] = Array($Value++, (string)str_replace($replace, '', $container->xpath('dc:title')[0]), "", -1);
            // associations only support up to 32 variables
            if( $Value === 33 ) break;
        }

        if(IPS_VariableProfileExists("Playlist.SONOS"))
            IPS_DeleteVariableProfile("Playlist.SONOS");

        $this->RegisterProfileIntegerEx("Playlist.SONOS", "Database", "", "", $Associations);
      
    }

Die Option beides zu Kombinieren könnte Problematisch werden, speziell dann wenn die Playlisten zufällig den gleichen Namen haben. Deshalb habe ich die Option bewusst erst einmal weg gelassen.

Hallo Thorsten,

nach meinem Umstieg auf 4.0 mache ich mich nun gleich an dein tolles Modul heran:)
Bei uns in OWL hören wir gerne

[ul]
[li]WDR 2 BI -> x-rincon-mp3radio://www.wdr.de/wdrlive/media/wdr2_bielefeld.m3u
[/li][li]Radio Hochstift -> x-rincon-mp3radio://www.radiohochstift.de/worx/mobile/stream.m3u
[/li][/ul]

Könntest du mir wohl noch die zwei Radiostationen aufnehmen?

Viele Grüße

Burkhard

Ich würd Dir die Lösung mit den eigenen Radiofavoriten empfehlen:

                 [IMG]https://www.symcon.de/forum/images/misc/quote_icon.png[/IMG] Zitat von [b]Schablone[/b]                     [[IMG]https://www.symcon.de/forum/images/buttons/viewpost-right.png[/IMG]](https://www.symcon.de/forum/showthread.php?p=280329#post280329)                 
             Ich habe da in deiner Konfiguration eine Auswahlliste mit Radiosendern die mich nicht die Bohne interressieren. 

Wie kann ich die in die Tonne kloppen. Kann ich nicht automatisch meine Favoriten einlesen lassen?
Doch, geht.

  1. In dem Parameter „Stations in Webfront“ nichts (auch nicht „<all>“) eintragen
  2. Den Haken „Include TuneIn favorites“ setzen
  3. Den Knopf „update Radiolist“ drücken

Sonos Modul - Seite 31

Ich habe die Detaildarstellung verbessert und verschönert, sieht dann folgendermaßen aus (mein Farbschema mal außen vor):

Das Cover wird nach Verfügbarkeit ein/aus-geblendet.
Den hässlichen (Sorry!) und eigentlich ja auch sinnlosen Positionsbalken habe ich mal weggelassen. Warum ist der überhaupt drin, wenn man doch die Playtime eingeblendet hat ? Verstehe ich nicht so ganz. Wenn man anhand des Positionsbalkens Vor- und Zurück- Spulen könnte würde ich sagen: Okay, aber so verschandelt der nur das Bild meiner Meinung nach.

Radio:

Song:

Der Code kommt in die _updateStatus.php.

Der Code für das Radio:


$detailHTML =   "<table width=\"100%\">
                          <tr>
                            <td>
                              <div style=\"text-align: right;\">
                                <div><b>".$positionInfo['streamContent']."</b></div>
                                <div> </div>
                                <div>".$mediaInfo['title']."</div>
                              </div>
                            </td>";

			if(strlen($image) > 0) {
			   $detailHTML .= "<td width=\"170px\" valign=\"top\">
                              <div style=\"width: 170px; height: 170px; perspective: 170px; right: 0px; margin-bottom: 10px;\">
                              	<img src=\"".@$image."\" style=\"max-width: 170px; max-height: 170px; -webkit-box-reflect: below 0 -webkit-gradient(linear, left top, left bottom, from(transparent), color-stop(0.88, transparent), to(rgba(255, 255, 255, 0.5))); transform: rotateY(-10deg) translateZ(-35px);\">
                              </div>
                            </td>";
			}

         $detailHTML .= "</tr>
                        </table>";

Der Code für den Song:


$detailHTML =   "<table width=\"100%\">
                          <tr>
                            <td>
                              <div style=\"text-align: right;\">
                                <div><b>".$positionInfo['title']."</b></div>
                                <div> </div>
                                <div>".$positionInfo['artist']."</div>
                                <div>".$positionInfo['album']."</div>
                                <div> </div>
                                <div>".$positionInfo['RelTime']." / ".$positionInfo['TrackDuration']."</div>
                              </div>
                            </td>";
                            
         if(isset($positionInfo['albumArtURI'])) {
            $detailHTML .= "<td width=\"170px\" valign=\"top\">
                              <div style=\"width: 170px; height: 170px; perspective: 170px; right: 0px; margin-bottom: 10px;\">
                              	<img src=\"".@$positionInfo['albumArtURI']."\" style=\"max-width: 170px; max-height: 170px; -webkit-box-reflect: below 0 -webkit-gradient(linear, left top, left bottom, from(transparent), color-stop(0.88, transparent), to(rgba(255, 255, 255, 0.5))); transform: rotateY(-10deg) translateZ(-35px);\">
                              </div>
                            </td>";
         }
         
         $detailHTML .= "</tr>
                        </table>";

Falls es gefällt, würde ich mich über das Einbauen ins Release freuen.

Die aufgehüschte Grafik finde ich prima das gleiche habe ich bei mir auch gemacht wenn das Einzug in das Release bekommen würde fände ich das toll. Den Positionsbalken finde ich nützlich. Im Webfront mag dieser ja nicht so hübsch aussehen vielleicht wäre da ja eine Option zum Ein/Ausblenden sinnvoll. Zumindest würde ich gerne eine Variable um einen Slider anzeigen zu lassen behalten denn es gibt ja auch Leute die zur Visualisierung z.B. IPSView oder NEO benutzten, da kannst Du den „hässlichen“ Slider dann so anpassen wie Du willst.

Fände ich auch eine gute Option.

Ja danke, das hatte ich schon gesehen und ausprobiert. Es funktioniert, jedoch sind die Stationsnamen in SONOS arg lang (z.B. „WDR 2 (Ostwestfalen Lippe)“) und sprengen das Webfront.

Auch lassen sich die Sender nicht als „Favorite radio station“ festlegen.

Daher fände ich es schön, wenn es die beiden Sender in den Standard schaffen:)

Gruß

Burkhard

Hi,

zwei meiner Songs-Geräte sind meistens abgeschaltet (vom Strom getrennt), da sie nur selten benutzt werden.

IPS versucht die aber alle 5 Sekunden zu erreichen. Das führt zu Stress auf dem System.

Kann man das irgendwie galant lösen?

Gruß

Jimmy

Einfach in den Einstellungen mehr Sekunden eingeben. Sollte eigentlich standardmäßig auf 600 Sekunden stehen.

Ich bekomme seit neusten bei zwei Boxen eine Fehlermeldung:


06.03.2016 13:24:02*| PHP*| Error: Error: Uncaught exception 'Exception' with message 'Error during Soap Call: UPnPError s:Client 701 (ERROR_AV_UPNP_AVT_INVALID_TRANSITION)' in /var/lib/symcon/modules/SymconSonos/Sonos/sonosAccess.php:525
Stack trace:
#0 /var/lib/symcon/modules/SymconSonos/Sonos/sonosAccess.php(293): SonosAccess->processSoapCall('/MediaRenderer/...', 'urn:schemas-upn...', 'Play', Array)
#1 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(378): SonosAccess->Play()
#2 /var/lib/symcon/modules/SymconSonos/Sonos/module.php(1011): Sonos->Play()
#3 -(4): Sonos->RequestAction('Status', 1)
#4 {main}
  thrown
   Error in Script /var/lib/symcon/modules/SymconSonos/Sonos/sonosAccess.php on Line 525
  134 in IPSLibrary/app/core/IPSLogger/IPSLogger.inc.php (call IPSLogger_Out)
   33 in IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
  121 in IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_PhpErrorHandler)
      in IPSLogger_PhpFatalErrorHandler

Jemand eine Idee was das sein könnte?

Wann genau tritt das Problem auf, wenn du eine Playlist / Song wechselst ?
Anscheinend versteht er diesen Wechsel nicht (Transition).

Mehr Informationen bitte.

Wenn ich auf play drücke z.B.