Sonos URL in IPS View aktualisieren

Hallo,

ich bastel gerade an einer Sonos Oberfläche für meine View. Ich will dort auch (selbst aktualisierende) Cover darstellen. Nur habe ich bei der Aktualisiereung noch Probleme. Über das manuelle Befüllen einer Webview Box mit dem String „Cover URL“ aus dem Skript von Thorsten klappt es. Nur wird das halt nicht aktualisiert.
Wie bekomme ich IPS View dazu den wechselnden URL`s zu folgen?

Grüße
Bruno

Ich würde Dir hier ein MediaImage empfehlen, aktuelles Cover in ein MediaImage speichern, das wird dann auch auf allen IPSView Clients und auch im WebFront automatisch aktualisiert…

Hallo Andreas,

ich verstehe das detailliert so.

  1. Mediaimage in IPS anlegen und vom entsprechendem String im Sonos Modul mit aktueller URL befüllen lassen.
  2. in IPS View ein Mediaimage einfügen und mit dem Pfad des Mediaimages in IPS verlinken.

Ist das so korrekt?

Gruß Bruno

Kann man bei Intervall Aktualisierung eigentlich nur Minutenwerte eintragen oder gehen da auch Sekunden? Wenn die Seite mit Ajax gebaut ist wird diese dann auch in IPSView aktualisiert oder müsste da trotzdem ein Seitenaktualisierungsintervall angegeben werden? Ich selber würde ja eine Webseite bevorzugen weil ich nicht weis wie ich auf dem Mediaelement in IPSView dann CSS Effekte einbauen soll.

Erst Media Element anlegen, dann ein Skript anlegen mit z.B. folgendem Inhalt oder ähnlich (Objectids müssen angepasst werden)
Dann noch ein Ereignis auf das Skript legen bei Variablenaktualisierung von Details.



$sonosid = 28677 /*[Geräte\Heimkino\Audio\Sonos\Sonos Bad]*/;
 $details = GetValue(IPS_GetObjectIDByIdent("Details", $sonosid)); // Detail Variable des Sonos Players
 
 //var_dump($details);
 if($details == "")
 {
	// nix
 }
 else
 {
 	$picurlstart = strpos($details, '<img src="');   
 	$picurlend = strpos($details, '" style="max-width: 170px; max-height: 170px; -webkit-box-reflect');
 	$picurllength = $picurlend - ($picurlstart+10); 
 	$picurl = substr($details, ($picurlstart+10), ($picurllength));
	$Content = Sys_GetURLContent($picurl);
	$MediaID = 29373 /*[Geräte\Heimkino\Audio\Sonos\Sonos Cover\Sonos Cover Bad]*/;                  // Image im MedienPool anlegen
	IPS_SetMediaContent($MediaID, base64_encode($Content));  //Bild Base64 codieren und ablegen
	IPS_SendMediaEvent($MediaID); //aktualisieren	
 }

Moin,
ich versuche gerade, das mal nachzubauen.

Im Sonos Modul habe ich eine URL zum Cover. Wenn ich die im Browser aufrufe, wird das Cover angezeigt. So weit so gut.

Wenn ich jetzt aber unter Media Dateien ein neues Medium vom Mediumtyp „Bild“ anlege, dann muss ich ja eine lokale Datei angeben. Diese will ich ja aber gar nicht verwenden. Oder muss ich mir für die erste Einbindung erstmal irgendein Cover lokal als Datei ablegen, damit ich mit IPS_SetMediaContent dann den Inhalt verändertn kann?

Wäre es nicht sinnvoller, das Cover als Grafik zu holen, lokal abzulegen und mit IPS_SetMediaFile zuzuweisen?

Grüße,
Christoph

Du darfst hier nicht über die GUI gehen sondern must initial einmal ein Skript ausführen was dir das Medien Element anlegt danach kannst Du es mit dem Skript s.o. Post aktualisieren.

Beispiel Anlegen:


$sonosid = 28677 /*[Geräte\Heimkino\Audio\Sonos\Sonos Bad]*/;
 $details = GetValue(IPS_GetObjectIDByIdent("Details", $sonosid)); // Detail Variable des Sonos Players
 $catid = 37830 /*[Geräte\Heimkino\Audio\Sonos\Sonos Cover]*/;
 
 
 	$picurlstart = strpos($details, '<img src="');   
 	$picurlend = strpos($details, '" style="max-width: 170px; max-height: 170px; -webkit-box-reflect');
 	$picurllength = $picurlend - ($picurlstart+10); 
 	$picurl = substr($details, ($picurlstart+10), ($picurllength)); 
	$Content = file_get_contents($picurl);
	$MediaID = IPS_CreateMedia(1);                  // Image im MedienPool anlegen
	IPS_SetParent($MediaID, $catid); // Medienobjekt einsortieren unter der Sonos Cover Kategorie
	IPS_SetIdent ($MediaID, "SonosCoverKueche");
	IPS_SetPosition($MediaID, 2);
	IPS_SetMediaCached($MediaID, true);
	// Das Cachen für das Mediaobjekt wird aktiviert.
	// Beim ersten Zugriff wird dieses von der Festplatte ausgelesen
	// und zukünftig nur noch im Arbeitsspeicher verarbeitet.
	$ImageFile = IPS_GetKernelDir()."media".DIRECTORY_SEPARATOR."sonoscoverkueche.jpg";  // Image-Datei
	IPS_SetMediaFile($MediaID, $ImageFile, False);    // Image im MedienPool mit Image-Datei verbinden
	IPS_SetName($MediaID, "Sonos Cover Küche"); // Medienobjekt benennen
	IPS_SetInfo ($MediaID, "Sonos Cover Küche");
	IPS_SetMediaContent($MediaID, base64_encode($Content));  //Bild Base64 codieren und ablegen
	IPS_SendMediaEvent($MediaID); //aktualisieren	

Eventuell kann man ja auch einfach kugelberg darum bitten doch noch ein Medienelement im Sonos Modul zu ergänzen dann muss das nicht jeder selber machen.

Verstehe, vielen Dank!

Hallo Fonzo,

ich nutze schon eine ganze weile deine o.g. Skripte um mir die Radio-Cover in IPS anzeigen zu lassen.
Mir ist vor kurzem aufgefallen, das dies anscheinend nicht mehr richtig funktioniert. Einige Covers werden geladen bzw. aktualisiert andere leider nicht.
Zum Besispiel 1 Live, BigFM und Antenne Bayern werden nicht geladen.
Beim Wechsel auf diese Sender geben die Skripte folgende Fehlermeldung.

Hast du eine Idee, woran das liegen kann?

<?
$sonosid = 59425 /*[Hardware\Sonos]*/;
$details = GetValue(IPS_GetObjectIDByIdent("Details", $sonosid)); // Detail Variable des Sonos Players
 
 //var_dump($details);
 if($details == "")
 {
    // nix
 }
 else
 {
     $picurlstart = strpos($details, '<img src="');   
     $picurlend = strpos($details, '" style="max-width: 170px; max-height: 170px; -webkit-box-reflect');
     $picurllength = $picurlend - ($picurlstart+10); 
     $picurl = substr($details, ($picurlstart+10), ($picurllength));
    $Content = Sys_GetURLContent($picurl);
    $MediaID = 58792 /*[Hardware\Sonos\CoverURL\Sonos Cover Wohnzimmer]*/; // Image im MedienPool anlegen
    IPS_SetMediaContent($MediaID, base64_encode($Content));  //Bild Base64 codieren und ablegen
    IPS_SendMediaEvent($MediaID); //aktualisieren    
 }  
?>

Fehlermeldung:

Warning:  Error 403, 
AccessDeniedAccess Denied4F7B7C30CABE8EAC/ObSIBskCKJw+a7y7RPwWB4ys4m7Ja/YoUShECryixm/Fnf7XsT+H2Z7X9HuhjpQ+Xb0x/m7RQk= in /var/lib/symcon/scripts/30872.ips.php on line 17
<?
$sonosid = 59425 /*[Hardware\Sonos]*/;
$details = GetValue(IPS_GetObjectIDByIdent("Details", $sonosid)); // Detail Variable des Sonos Players
$catid = 15625 /*[Hardware\Sonos\CoverURL]*/;
 
 
     $picurlstart = strpos($details, '<img src="');   
     $picurlend = strpos($details, '" style="max-width: 170px; max-height: 170px; -webkit-box-reflect');
     $picurllength = $picurlend - ($picurlstart+10); 
     $picurl = substr($details, ($picurlstart+10), ($picurllength)); 
    $Content = file_get_contents($picurl);
    $MediaID = IPS_CreateMedia(1);                  // Image im MedienPool anlegen
    IPS_SetParent($MediaID, $catid); // Medienobjekt einsortieren unter der Sonos Cover Kategorie
    IPS_SetIdent ($MediaID, "SonosCoverWohnzimmer");
    IPS_SetPosition($MediaID, 2);
    IPS_SetMediaCached($MediaID, true);
    // Das Cachen für das Mediaobjekt wird aktiviert.
    // Beim ersten Zugriff wird dieses von der Festplatte ausgelesen
    // und zukünftig nur noch im Arbeitsspeicher verarbeitet.
    $ImageFile = IPS_GetKernelDir()."media".DIRECTORY_SEPARATOR."sonoscoverwohnzimmer.jpg";  // Image-Datei
    IPS_SetMediaFile($MediaID, $ImageFile, False);    // Image im MedienPool mit Image-Datei verbinden
    IPS_SetName($MediaID, "Sonos Cover Wohnzimmer"); // Medienobjekt benennen
    IPS_SetInfo ($MediaID, "Sonos Cover Wohnzimmer");
    IPS_SetMediaContent($MediaID, base64_encode($Content));  //Bild Base64 codieren und ablegen
    IPS_SendMediaEvent($MediaID); //aktualisieren  
?>

Fehlermeldung:

Warning:  file_get_contents(http://cdn-radiotime-logos.tunein.com/_0.jpg?t=151334): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden
 in /var/lib/symcon/scripts/26440.ips.php on line 12

Beste Grüße
Kai

Hallo Kai,

bin noch ein Newcomer in Sachen IP-Symcon und IPS Studio, doch wollte ich mir die Cover-Logos von SONOS anzeigen lassen. Nun habe ich wie Du das gleiche Problem, dass einige Sender klappen und bei anderen kommt auch bei mir die Meldung :
Warning: Error 403,
AccessDeniedAccess Denied6FEE6BE20FC99DF2dL1zsqRMgpPmBmH3NM7NRGDbMCp4XzCuHR2A+A0hUjcZ+4zR+2Is5UbGl8nkkpeGdTlXpbz6Qv0= in C:\IP-Symcon\scripts\14382.ips.php on line 20

Hast Du das Problem lösen können ? Wenn ja würde mich die Lösung brennend interessieren.
Danke.
Gruß
Ekkehard

@Karlinho

Ich hänge mich mal bei Ekkehard „an“ - hast du evtl. eine Lösung dafür gefunden?

Hallo,
wahrscheinlich ist Urlaubszeit und deshalb gibt’s keine Rückantwort.
Wäre toll, wenn ich hier weiterkommen würde.
Danke.
Gruß
Ekkehard

hi,

ich habe das problem nicht!
aber ich habe ein kleines script geschrieben, welches das geflackere unterbindet!

bei einer aktualisierungszeit von 5s werden alle variablen aktualisiert. das ist beim cover sichtbar, da das bild flackert.

ich habe mir eine kleine „old/new“ abfrage gebaut und einen neuen resultstring, den ich alternativ zur variable „Details“ an meine htmlbox anschließe.

falls jemand interesse hat, auf diesem weg kann man sich die ausgabe auch individualisieren.

da ich sie nutze für eine ausgabe der aktuellen musik in meinem footer brauche ich z.b. das album und die laufenden minuten nicht.

Hallo Sven,
dann kannst Du ja das Bild das hinter der URL steht in einer HTML Box anzeigen.
Wie hast Du das geschafft? Besten Dank für eine Info, damit auch ich ein Stück weiter komme.
Danke.
Grüße von
Ekkehard

Hi
Ekkehard.

Bei mir steht in dem Sonos modul in der Variablen „Details“ ein html string drin!

Dieser sieht beispielsweise im original so aus:

<table width="100%">
<tr>
  <td>
    <div style="text-align: right;">
      <div><b>Thank God It's Over [Explicit]</b></div>
      <div> </div>
      <div>Stone Sour</div>
      <div>Hydrograd [Explicit]</div>
      <div> </div>
      <div>0:01:33 / 0:03:36</div>
    </div>
  </td>
  <td width="170px" valign="top">
    <div style="width: 170px; height: 170px; perspective: 170px; right: 0px; margin-bottom: 10px;">
      <img src="http://192.168.0.64:1400/getaa?s=1&u=x-sonosapi-hls-static%3acatalog%252ftracks%252fB07VW752D5%252f%3fsid%3d201%26flags%3d0%26sn%3d1" 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>
</tr>
</table>

Da mir aber größe und inhalt für meine minivorschau im footer meiner View zu viel/groß war habe ich das ganze wenig umgebaut und in eine neue stringvariable geschrieben. diese wird dann an die htmlbox angebunden.

hier mal das ergebnis:

So sieht es aus, wenn Sonos nicht spielt

und so wenn gerade etwas läuft

das Cover wird durch das sonos modul automatisch alle 5s aktualisiert.

und hier mein Script

<?php

$nowPlaying = GetValueString(13486);
$cover      = GetValueString(12724);

// ------------------------------------------------------------- //
// KEIN STREAM
if (GetValueString(40209)=="") {    

    $seperator = strpos($nowPlaying, "|");
    $artist = substr($nowPlaying, $seperator+2);
    $title = substr($nowPlaying, 0, $seperator-1);    
 
    if($nowPlaying!=str_replace("http","",$nowPlaying)) {
        $artist = "Werbung";
        $title  = "";
     }

}

// ------------------------------------------------------------- //
// STREAM
else {
    $stream = GetValueString(40209);

    $seperator = strpos($nowPlaying, "-");
    $artist = substr($nowPlaying,0, $seperator-1);
    $title = substr($nowPlaying, $seperator+2);
}

// ------------------------------------------------------------- //
// ------------------------------------------------------------- //
// ------------------------------------------------------------- //




// ------------------------------------------------------------- //
// ANPASSUNG DER LÄNGE
if (strlen($artist) > 19){
    $artist = substr($artist, 0,19);
    $artist .="..";
}

if (strlen($title) > 17){
    $title = substr($title, 0,17);
    $title .="..";
}



// ------------------------------------------------------------- //
// Hat sich Artist/Title oder Cover geändert?
if ((strcmp($artist, GetValueString(35679)) !== 0)
   or (strcmp($title, GetValueString(29230)) !== 0)
   or (strcmp($cover, GetValueString(44493)) !== 0) )
   {

    $htmlText = '<table width="284px" height="100px" cellspacing="0" cellpadding="2" border="0px" style="margin-top:-5px;">
                <tr>
                    <td width="184px" align="center" valign="top" style="padding-top:12px;"><b>' .$title. '</b><br>' .$artist. '</td>      
                    <td width="100px" align="center" valign="middle">
                    <img src="' .$cover. '" style="max-width: 80px; max-height: 80px;">                   
                    </td>
                </tr>
                </table>';

    SetValueString(35679,$artist);
    SetValueString(29230,$title);
    SetValueString(44493,$cover);             

    SetValueString(15043, $htmlText);
}

Hallo Sven,
habe den PHP Code übernommen und angepasst.
Klappt perfekt.
Für meine Anforderung würde mir das Senderlogo alleine genügen.
Das hast Du in den HTML String mit eingebunden.
Habe an dieser Einstellung : .$cover. '" style="max-width: 400px; max-height: 400px
geändert, doch manche Sender habe kein Logo, oder egal was ich einstelle, es kommt immer ein ganz kleines Logo.
Wie könnte ich das Logo alleine anzeigen lassen?
Danke.

Grüße von
Ekkehard

ich habe das heute programmiert und habe mit songs/streams/radios und playlists rumgespielt.
aufgefallen ist mir, dass manche cover „klein“ sind. und manche radiosender haben nur das icon eines kopfhörers.
ich bin noch nicht ganz durch das thema mit der station list durch, da in dem profil der sender nicht alle enthalten sind.

auf welche art „beziehst“ du denn dein radio? als stream?

ich unterscheide das in meinem script, da manche song und interpret mit dem bindestrich und manche mit diesem strich | trennen.

das hat jetzt allerdings nichts mit dem cover zutun :smiley:

Hallo Sven,
ich höre Radio Sender.
Z.B. SWR 4, HR 4, Bayern 1 etc.
SWR 4 hat nur das Kopfhörer Logo, hr 4 hat ein ganz kleines Logo, Bayern 1 hätte ein in der Größe passendes Logo.
Wenn ich mir die SONOS App auf dem Handy anschauen, dann bekomme ich für SWR 4 bzw. HR 4 ein korrektes Logo.
Das sind die Ergebnisse meiner Recherche.
Danke für die weitere Unterstützung.
Grüße von
Ekkehard

Z.B. SWR 4, HR 4, Bayern 1 etc.
SWR 4 hat nur das Kopfhörer Logo, hr 4 hat ein ganz kleines Logo, Bayern 1 hätte ein in der Größe passendes Logo.
Wenn ich mir die SONOS App auf dem Handy anschauen, dann bekomme ich für SWR 4 bzw. HR 4 ein korrektes Logo.
Das sind die Ergebnisse meiner Recherche.

Die Frage an der Stelle ist nach wie vor, wie lädst du deine Radiosender.

Wenn ich die Liste im Webfront durchsuche, welche vom Modul gelistet ist, dann sind die drei genannten Sender nicht vorhanden in dieser!

Wenn du die Sender via der Sonos App startest und IPS wertet dies aus habe ich folgende Ergebnisse:

SWR4 -> Kopfhörer
Bayern1 -> Logo vorhanden
HR4 -> Kopfhörer

Wenn der Stream also kein Logo mitliefert muss man sich eben Abhilfe schaffen :wink:
Dafür gibt es dann z.B. die Möglichkeit eigene Logos zu parsen, wenn du einen dieser Sender hörst.

Beispiel:
Du hörst SWR4 und bekommst diese url als Link in der Variable Cover
http://cdn-radiotime-logos.tunein.com/_0.png
Dann muss man sich parallel ein script schriben, welches dann abfrage, ob der stream beispielsweise „swr4“ enthält und dann lädt man das senberlogo lokal, oder mit fester url aus dem netz.

ich bastel dir gleich was, muss erst was essen!

Hallo Ekkehard!

also ich habe mir das mal angeschaut:

bei SWR4 ist das nicht so einfach. 1) wird die Variable „nowPlaying“ ständig aktualisiert. demnach spinnt meine Anzeige ein wenig.
Da ich aber kein SWR4 höre muss ich das nicht umbauen.

Für dein Logoproblem kann ich dir folgendes anbieten, was ich auch getestet habe:

in den Bereich „STREAM“ unter die separator Abfrage kannst du folgendes einbauen:

    if ($cover == "http://cdn-radiotime-logos.tunein.com/_0.png") {
        if (strpos(GetValueString(48966),"swr4") !== 0) {
            $cover = "https://www.swr.de/unternehmen/kommunikation/service/SWR4-Logo%2C1547196865399%2Clogos-swr4-100~_v-16x9@2dS_-6be50a9c75559ca1aaf1d0b25bae287afdcd877a.png";
        }
    }

allerdings ist die URL zu dem Logo nur so lange nutzbar, solange die URL auch existiert.
Alternativ wäre hier die Möglichkeit lokal zu arbeiten, das müsste ich mir anschauen, da müsste man die Datei direkt adressieren und wissen, in welchen Ordnern man die Logos ablegt. Ist aber machbar.