SQUEEZEBOX - Mediawiedergabe von IPS steuern

Hi!

Hat es schon jemand geschafft, die Wiedergabe von irgendwelchen Audiofiles (mp3 etc.) von IPS aus zu inszenieren? Die Textmeldungsausgabe funktioniert prima, aber wie ist das mit Soundfiles?

Ich habe mir schon die CommandLine-Instructions von Squeezecenter ausgedruckt, komme damit aber auch nicht weiter.

Hat jemand Erfahrung damit und eventuell ein paar Script-Schnipsel anzubieten, oder sonst einen heißen Tipp?

P.S. Ich schreibe das mal ins Forum für V1, obwohl ich V2 einsetze. Das dürfte vermutlich egal sein.

Also das Kommando an Squeezecenter wäre (ungetestet)…

<playerid> playlist play </album/name.mp3>

playerid = Mac-Adresse der Squeezebox

Nur…
Wie schicke ich das Kommando an Squeezecenter-Server auf Port 9090?

Welchen IPS-Befehl muss ich dafür benutzen?

Hi!

Also mit Telnet funktioniert das einwandfrei.
Wenn ich nun die selben Telnet-Anweisungen über den Server-Socket von IPS bekommen könnte, würde ich sicher weiter kommen, nur weiss ich momentan nicht wie.
Für die echten PHP-Profis von euch sicher kein Problem.

Ich habe da auch schon fsockopen, psockopen und fputs rumexperimentiert, komme aber nicht zum Erfolg. Momentan kein Plan mehr, wie ich das anstellen soll, nur die eine Variable $buffer über den Squeezeserver an die Squeezebox zu schicken.:o

Hi!

Steiner hatte in dem Thread http://www.ip-symcon.de/forum/f30/squeezebox-4190/#post34177 schon das Grundlegende erklärt.

Also einfach einen Client Socket anlegen (IP vom Squeezecenter-Server) und dann mal testen mit

$result = CSCK_SendText(41246, "00:04:20:16:9d:ab pause 1 " .chr(13));

Der angegebene Player sollte dann auf Pause gehen.

Du musst natürlich die InstanzenID und die MAC-Adresse von dem jeweiligen Player anpassen, bei der MAC-Adresse müssen Buchstaben kleingeschrieben werden.

Hallo Snoop2,

ja, das funktioniert tatsächlich auch. Habe eben nochmals den Test gemacht…

CSCK_SendText(27592, $box3_mac.' playlist play '.rawurlencode('http://streams.br-online.de/bayern3_2.asx').chr(13));

Ich weiss nun auch, was ich bei meinen ersten Versuchen vergaß …

.chr(13)

!

Danke für den „Gedanken-Rüttler“. Manchmal sieht man vor lauter Probiererei den richtigen Kniff einfach nicht mehr :rolleyes:

Hallo nochmals,

das Senden der Anweisungen zu den Boxen funktioniert einwandfrei, nur möchte ich zum Ablauf einige Abfragen senden, wie diese:

$result = CSCK_SendText($sqc, $no1box.' power ?'.chr(13));                  // Power-Status Box 1 abfragen
	echo $result;
	if (substr($result, 34, 1) == "1") {$powerstatus_no1box = 1;}
	else {$powerstatus_no1box = 0;}
	$result = CSCK_SendText($sqc, $no1box.' mixer volume ?'.chr(13));           // Lautstärke Box 1 abfragen
	echo $result;
		if ($meldung_aktiv == false){
		SetValueString(58702 /*[2. Etage\.Squeezebox\Squeezebox No1 Lautstärke]*/ , substr($result, 41, 3));} // Lautstärke Box 1 speichern

Wie bekomme ich die Echos zu den Abfragen ausgewertet?
Mit telnet klappt das. Was brauche ich noch zur Auswertung bzw. Empfang der Echos?

OK, so gehts:

    CSCK_SendText($sqc, $no1box.' power ?'.chr(13));                  // Power-Status Box 1 abfragen
	IPS_Sleep(1);
	$result = GetValue(48808  /*[2. Etage\.Squeezebox\Squeezebox Text]*/);       // Register Variable abfragen
	echo $result;
	if (substr($result, 34, 1) == "1") {$powerstatus_no1box = 1;}
	else {$powerstatus_no1box = 0;}
	CSCK_SendText($sqc, $no1box.' mixer volume ?'.chr(13));           // Lautstärke Box 1 abfragen
    IPS_Sleep(1);
	$result = GetValue(48808  /*[2. Etage\.Squeezebox\Squeezebox Text]*/);       // Register Variable abfragen
	echo $result;
		if ($meldung_aktiv == false){
		SetValueString(58702 /*[2. Etage\.Squeezebox\Squeezebox No1 Lautstärke]*/ , substr($result, 41, 3));} // Lautstärke Box 1 speichern

1 Millisekunde warten und dann Register-Variable vom Clientsocket abfragen.

Hallo,

Du brauchst noch einen mit dem Client Socket verbundenen Cutter mit Chr(13) rechts. Dann eine Register Variable die mit dem Cutter verbunden wird.

Die Ausgabe aller Meldungen musst Du dann einmalig, wie beim Telnet, mit

$result = CSCK_SendText($sqc, $no1box.' listen 1'.chr(13));  

anstoßen.

Die Ausgabe der Register Variablen kannst Du dann mit rawurldecode wieder „hübsch“ machen.

Ich wollte mir so eigentlich den aktuell gespielten Titel in IPS anzeigen lassen, leider gibt das CLI an dieser Stelle aber nur den Titelnamen aus, kein Album oder Interpret. Das muss man sich dann mit „album ?“ und „artist ?“ noch holen. Ein schönes Script dazu muss man/ich noch dafür schreiben.
Meine PHP-Kentnisse sind aber (noch) sehr eingeschränkt.

Gruß

Das ist ja das, was ich w.o. beschrieben mache

$result = GetValue(ID-Registervariable);       // Register Variable abfragen 

und dann mit

substr($result, 34, 1)

auswerte. Zählt bis Stelle 34 und übergibt den Wert, der an 35ster Stelle steht.
In dem Fall eine 1 oder 0, für an oder aus.
Ob ich das mit ‚rawurldecode‘ vorher wieder „schön“ mache oder nicht, ist dabei egal. Mich interessiert nur der letzte Wert und der verändert sich dadurch nicht.
Ich musste nur die Wartezeiten noch etwas erhöhen von 1 auf 5 Millisekunden, sonst lief das nicht immer zuverlässig und es stand schon der nächste/folgende Wert drin, der mit ‚CSCK_SendText‘ abgefragt wird. Es kommt dabei auch immer darauf an, wie der Squeezecenter-Server gerade beschäftigt ist und sich dementsprechend die Ausführung der Befehle bzw. die Antworten verzögern. Deshalb lieber die Wartezeit etwas höher.
Im Gegensatz zu dem, wie ich es vorher gemacht habe, hat sich die Ausführungszeit doch dramatisch verringert. Das läuft so alle in Bruchteilen der Zeit ab, wie mit PHPtelnet.

Hallo Nancilla,

versuche gerade Dein Squeezebox Abfrageskript zu nutzen.

<?
$sqc = 26726 /*[Squeezebox Client Socket]*/;
$box_mac = "00:04:20:26:1d:10";

	 CSCK_SendText($sqc, $box_mac.' power ?'.chr(13));                  // Power-Status Box 1 abfragen
    IPS_Sleep(1);
    $result = GetValue(36168 /*[Hifi\Garten\Register Variable Squeezebox]*/ );       // Register Variable abfragen
    echo $result;
    if (substr($result, 34, 1) == "1") {$powerstatus_no1box = 1;}
    else {$powerstatus_no1box = 0;}
    CSCK_SendText($sqc, $box_mac.' mixer volume ?'.chr(13));           // Lautstärke Box 1 abfragen
    IPS_Sleep(1);
    $result = GetValue(36168 /*[Hifi\Garten\Register Variable Squeezebox]*/ );       // Register Variable abfragen
    echo $result;
    SetValueString(16420 /*[Hifi\Garten\Volume_Squeezebox]*/ , substr($result, 41, 3)); // Lautstärke Box 1 speichern
?>

Allerdings bekomme ich immer die Fehlermeldung, dass die Variable 36168 nicht existiert. Das ist allerdings meine Registervariabel. Kann man die nicht mehr abfragen? Siehst Du einen Fehler?

Moinsen…

…hab heute meine Squeezebox Radio bekommen und wurde diese gerne von IPS steuern. Das scheint hier ja auch irgendwie zu funktionieren nur steige ich hier nicht ganz durch.

Könnte hier mal einer ne Schritt für Schritt Anleitung geben was man unter IPS machen muss damit man die Box steuern kann. Vielleicht auch gleich paar PHP Zeilen zum z.B. Einschalten, nächster Track etc. :smiley:

Vielen Dank und Grüße aus HH,

Peter

Hi!

Ich habe noch das alte System zur Abfrage der Registervariable in Benutzung und noch nicht auf die neue Abfrage umgestellt. Bei mir direkt vom Cutter in eine Stringvariable geschrieben und nicht an ein Skript übergeben. Deshalb funktioniert bei dir scheinbar der Code nicht.

$result = GetValue(48808  /*[2. Etage\.Squeezebox\Squeezebox Text]*/);

…liest also direkt den String an der Variablen.

Mal ein einfaches Beispiel, wie ich die Boxen früh einschalten lasse… im Kinderzimmer und Küche, bevor es zur Schule geht.
Lautstärke der Boxen einstelle, ein paar Titel aus der Musikbibliothek und Internetradio streamen lasse, Boxen wieder ausschalte…

if ( !$freier_tag and !$meldung_aktiv ){}

…kannst du dabei erstmal weglassen.
$freier_tag wird errechnet, wenn Wochenende, Feiertag oder schulfrei ist (aus anderem Script) und $meldung_aktiv wird gesetzt, wenn gerade eine andere Meldung (Alarm, Warnung, Hinweis zum Wetter oder etc.) wiedergegeben wird.

Als erstes musst du aber erstmal den Squeezebox-Server an IPS über Clientsocket anmelden, Registervariablen usw., fallsdu das noch nicht gemacht hast. Das ist eine andere Geschichte…

<?
/*
************************************************************
				Weckzeiten an Squeezeboxen
************************************************************
*/

// Steuerdaten
$sqc = 46204 /*[SqueezeCenter - BIGFRIEND [Akustisch] ]*/  ;                    // Squeezecenter - Client Socket
$freier_tag = GetValueBoolean(39649 /*[.Steuerung\Freier Tag]*/ );   			  // Freier Tag
$meldung_aktiv = GetValueBoolean(10268 /*[2. Etage\.Squeezebox\Squeezebox Meldung aktiv]*/ ); // Wird bereits eine Meldung wiedergegeben?
$zeit = date("Hi");     																		  // Uhrzeit
$tag = date("d");                                                               // Tag des Monats
$monat = date("m");                                                             // Monat
$jahr = date("Y");                                                              // Jahr
$datum = date ("Ymd");                                                          // Datum (Format: JJJJMMTT)

// MAC-Adressen (Player-IDs) der Boxen
$no1box = "00:04:20:1e:22:11";   // Box 1 MAC-Adresse (Squeezebox-Flur)
$no2box = "00:04:20:1e:57:11";   // Box 2 MAC-Adresse (Squeezebox-Küche)
$no3box = "00:04:20:1e:5b:11";   // Box 3 MAC-Adresse (Squeezebox-Boom3)
$no4box = "00:04:20:26:1b:11";   // Box 3 MAC-Adresse (Squeezebox-Radio 1)
$no5box = "00:04:20:26:1b:11";   // Box 3 MAC-Adresse (Squeezebox-Radio-Kinderzimmer)


// ************************************************WECKZEITEN*********************************************

// -----------------------------------------------------------------------------
// Name:			****** SCHULE (Küche) ******
// Zyklus:  		täglich
// Tage:    		Mo-Fr
// Ausnahmen:  	Ferien und freie Tage
// Sperrzeiten:   wenn eine Meldung aktiv ist
// Beginn:			06:20
// Ende:    		06:48
// Box:     		Küche

if ( !$freier_tag and !$meldung_aktiv ){                    // Ausnahmen: Freier Tag oder Meldung aktiv

	if ($zeit == "0620"){                                                        // Uhrzeit: Weckthema 1 AN
	   CSCK_SendText($sqc, $no2box.' mixer volume 19'.chr(13));                  // Lautstärke einstellen
	   //CSCK_SendText($sqc, $no2box.' playlist play '.rawurlencode('http://streams.br-online.de/bayern3_2.asx').chr(13)); // Bayern3
	   CSCK_SendText($sqc, $no2box.' playlist play '.rawurlencode('http://opml.radiotime.com/Tune.ashx?id=s25774&username=sampletime&PartnerId=16').chr(13)); // Antenne Thüringen
    	}
	if ($zeit == "0646"){                                                        // Uhrzeit: Weckthema 2 AN
		CSCK_SendText($sqc, $no2box.' playlist play '.rawurlencode('M:\AUDIO\Rolf Zuckowski und seine Freunde\Rolfs Top 100\18- Schulbus.mp3').chr(13) );   // Titel aus Musikbibliothek
		CSCK_SendText($sqc, $no2box.' mixer volume 30'.chr(13));				  		  // Lautstärke einstellen
		}
	if ($zeit == "0648"){                                                        // Uhrzeit: Wecker AUS
	   CSCK_SendText($sqc, $no2box.' playlist clear'.chr(13));                   // Wiedergabeliste leeren
		CSCK_SendText($sqc, $no2box.' power 0'.chr(13));							     // Ausschalten
		}
	}
// -----------------------------------------------------------------------------

// -----------------------------------------------------------------------------
// Name:			****** SCHULE (Kinderzimmer) ******
// Zyklus:  		täglich
// Tage:    		Mo-Fr
// Ausnahmen:  	Ferien und freie Tage
// Sperrzeiten:   wenn eine Meldung aktiv ist
// Beginn:			06:15
// Ende:    		06:30
// Box:     		Küche

if ( !$freier_tag and !$meldung_aktiv ){                    // Ausnahmen: Freier Tag oder Meldung aktiv

	if ($zeit == "0615"){                                                        // Uhrzeit: Weckthema 1 AN
	   CSCK_SendText($sqc, $no5box.' mixer volume 21'.chr(13));                  // Lautstärke einstellen
	   CSCK_SendText($sqc, $no5box.' playlist play '.rawurlencode('M:\AUDIO\Diverse\Kinder singen mit großen und kleinen Freunden   CD3\02- Wer hat an der Uhr gedreht (Rosaroter Panther)__Kinder und Freunde.mp3').chr(13) );   // Titel aus Musikbibliothek
    	}
	if ($zeit == "0617"){                                                        // Uhrzeit: Weckthema 2 AN
		CSCK_SendText($sqc, $no5box.' playlist play '.rawurlencode('http://opml.radiotime.com/Tune.ashx?id=s25774&username=sampletime&PartnerId=16').chr(13)); // Antenne Thüringen
		CSCK_SendText($sqc, $no5box.' mixer volume 25'.chr(13));				  		  // Lautstärke einstellen
		}
	if ($zeit == "0630"){                                                        // Uhrzeit: Wecker AUS
	   CSCK_SendText($sqc, $no5box.' playlist clear'.chr(13));                   // Wiedergabeliste leeren
		CSCK_SendText($sqc, $no5box.' power 0'.chr(13));							     // Ausschalten
		}
	}
// -----------------------------------------------------------------------------

?>

Hallo Leute,

leider habe ich ein Problem mit der Register Variable, die mit dem Client Socket verbunden ist. In meinem Script bekomme ich die Fehlermeldung:

Warning:  Variable #30798 existiert nicht in [Squeezebox\Squeezebox] on line 8

mein Script sieht so aus:


<?
    $sqc = 12742  /*[Squeezebox Client Socket]*/;
    $box_mac = "00:1d:ba:65:**:**";
    CSCK_SendText($sqc, $box_mac.' power ?'.chr(13));                 
    IPS_Sleep(1);
    $result = GetValue(30798  /*[Squeezebox\Reg. Variable Squezzebox]*/);
    echo $result;
?>

Die Register Variable (30798) ist auch mit kein Skript verbunden.

Hat vielleicht einer noch eine Idee :confused:

Danke + Grüße
Sid

Hallo Sid,

die Registervariable ist keine Variable im eigentlichen Sinn. Versuch es mal so:

  <?
    $sqc = 12742  /*[Squeezebox Client Socket]*/;
    $box_mac = "00:1d:ba:65:**:**";
    CSCK_SendText($sqc, $box_mac.' power ?'.chr(13));                 
    IPS_Sleep(100); // 100ms auf Antwort warten
    $result = RegVar_GetBuffer(30798  /*[Squeezebox\Reg. Variable Squezzebox]*/);  // Puffer auslesen
    RegVar_SetBuffer(30798, "");  //Puffer leeren
    echo $result;
?> 

Gruß
Attain

Hallo,

leider liefert die

$result = RegVar_GetBuffer(30798  /*[Squeezebox\Reg. Variable Squezzebox]*/);  // Puffer auslesen 

kein Wert zurück :frowning:

Wenn ich mitr aber den Debug von der Reg. Variable anschaue (30798 /[Squeezebox\Reg. Variable Squezzebox]/), haben ich zwei Einträge:

  1. Nachricht: Received Data / Daten:00%3A1D…usw
  2. Nachricht: Buffer / Daten:

Kann ich irgend wie auf die Daten von „Received Data“ zugreifen?

Danke u. Grüße
Sid

Hallo Sid

also ich hab das bei mir so gelöst:

  1. Einen „Client Socket“ als „I/O Instanz“
    Mit der entsprechender IP auf Port 9090

  2. Einen „Cutter“ als „Splitter Instanz“

  • „Benutze Zeichen für Schritte“ - Benutzerdefiniert - Rechte Trennzeichen 0D (HEX)
  • Übergeordnete Instanz: Client Socket aus 1.
  1. „Register Variable“
  • Übergeordnete Instanz: Cutter aus 2.
  • Script (z.B. SqueezeReceive):
<?

  $paramline = rawurldecode($IPS_VALUE);
  
  // Daten extrahieren
  $params = explode(" ", $paramline, 3);
  $player = $params[0];
  $cmd = $params[1];
  $cmdadd = "";
  if (count($params) >=3) $cmdadd = trim($params[2]);

  switch ($cmd)
  {
    case "power":
    {
      // StatusVariable des Players setzen
      SetValue(1234, ($cmdadd != "0"));
    }
    break;

    case "prefset":  
    {
      // Daten extrahieren
      $prefparams = explode(" ", $cmdadd, 3);
      $who = "";
      if (count($prefparams) >=1) $who = $prefparams[0];
      $what = "";
      if (count($prefparams) >=2) $what = $prefparams[1];
      $val = "";
      if (count($prefparams) >=3) $val = trim($prefparams[2]);

      if ($who == "server" && $what == "volume") // Volume-Info vom Server
      {
        $val = abs($val);  // bei mute werden negative Werte gemeldet
        // ...
      }
    }
    break;

    case "playlist":
    {
      // Daten extrahieren
      $prefparams = explode(" ", $cmdadd, 2);
      $what = "";
      if (count($prefparams) >=1) $what = $prefparams[0];
      $val = "";
      if (count($prefparams) >=2) $val = trim($prefparams[1]);
      

      if ($what == "stop")
      {
        SetValue(27911 /*[System\Scripts\DeviceFunctions\Squeeze\NowPlaying]*/, "--stopped--");
      }
      else if ($what == "newsong")
      {
        $val = utf8_encode($val);
        $oldVal = GetValue(27911 /*[System\Scripts\DeviceFunctions\Squeeze\NowPlaying]*/);
        if ($val != $oldVal)  // nur bei Wechsel (alle Player melden newsong)
        {
          // hier schalte ich bei unbeliebten Interpreten mal weiter ;)

          SetValue(27911 /*[System\Scripts\DeviceFunctions\Squeeze\NowPlaying]*/, $val);
        }
      }
    }
    break;

    case "button":
    {
      if (substr($cmdadd, 0, 11) == "playPreset_")
      {
        SetValue(51779 /*[System\Scripts\DeviceFunctions\Squeeze\PlaylistItem]*/ , substr($cmdadd,11, 1));
      }
    }
    break;

    case "mixer":
    {
      // Daten extrahieren
      $prefparams = explode(" ", $cmdadd, 2);
      $what = "";
      if (count($prefparams) >=1) $what = $prefparams[0];
      $val = "";
      if (count($prefparams) >=2) $val = trim($prefparams[1]);
      
      if ($what == "volume")
      {

      }
    }
    break;
  }
?>

Mal so als Beispiel, für Power bräuchtest du nur den oberen Teil.

Um die Statusvaiable zu aktualisieren:
a) Abfragen mit „power ?“
b) Beim Aufstarten von IPS „listen 1“ an den Server schicken, es werden dann alle Meldungen automatisch vom Squeeze geschickt.

Gruss
Tinu

Sehr cool! Vielen Dank an alle, es funzt alles.

@tinu Danke für die super Anleitung!

Hallo,

ich bin nun auch im Besitz einer Squeezebox und wollte mich jetzt mal an die Integration in IPS heranwagen.

Ich habe mal das Script von tinu ausprobiert.
Funktioniert soweit, allerdings würde ich das gerne ein wenig weiter ausbauen und bin auch gleich auf einen Schönheitsfehler gestoßen, den zu eleminieren mir noch der passende Befehl oder Denkanstoß fehlt.

Wie kann ich aus einem String alles nach dem letzten Leerzeichen entfernen?
Grund ist das das SqueezeCenter bei dem Song immer die Tracknummer hinten mit anstellt?

z.B. bla bla bla 13

Wie kann mal bei einer variablen Anzahl an Leerzeichen z.B. diese 13 entfernen, bzw. zur weiteren Verwendung abschneiden?

Weiter würde mich auch mal interessieren, ob es schonmal jemand umgesetzt hat, die Text2Speech Ansagen von IPS auf die Squeezebox umzuleiten, entweder über einer File oder Stream, wenn das überhabt geht.

Grüße,
Doc

Klar geht das.

Ich lasse TTS die Ansagen abspeichern und hole sie z.B. so…


$sqc = Clientsocket des Squeezecenters;
$no1box = die MAC-Adresse einer Box;
$meldung = "H:\Alarm_1.wav"; 
$titel = rawurlencode($meldung);

CSCK_SendText($sqc, $no1box.' playlist play '.$titel.chr(13));

auf die Box.

Lautstärke einstellen:

$box1_vol = 85;
CSCK_SendText($sqc, $no2box.' mixer volume '.$box1_vol.chr(13));

Box ausschalten:

CSCK_SendText($sqc, $no1box.' power 0'.chr(13));

usw.

Die Befehle findest du in der CLI-Anleitung des SBServer.