Squeezeboxen einpflegen ohne GROßEN AUFWAND

Hallo Gemeinde,

da meine Squeezeboxen sich stetig vermehren, und ich Werners Scripte doch recht „wartungsintensiv“ finde, habe ich mir mal die Mühe gemacht und die Steuer- und Auswertescripte auf Idents umgestellt.
Damit brauche ich keine IDs mehr eingeben und der Code reduziert sich auch sehr stark, wenn mann so wie ich mehr als 3 Boxen im Einsatz hat.
Es gibt auch eine Installationsroutine, die eine Dummy-Instanz mit allen möglichen/nötigen Variablen erzeugt.

Wer also ein neues Gerät anschafft, braucht nur ein neues Steuer-Script anlegen, in dieses Script die MAC-Adresse eintragen und den Ausführen-Knopf drücken.

<?php
/******************************************************************************
* Script-Name: Squeezebox AZ Steuerung.php                                                 *
* Version: 2.0                                                                     *
* Autor: wgreipl & McKevin                                                        *
* Erstellt am: 2011-11-02                                                          *
* Letzte Änderung am: 2012-09-23                                                 *
* Beschreibung: Bei manueller Ausführung wird überprüft, ob Script versteckt    *
*               ist, wenn nein, dann wird ein neues Dummy-Modul erstellt mit  *
*               allen benötigten Variablen. Bei Steuerung über Webfront werden*
*               die Befehle ausgeführt und an die Squeezebox mit der gegebenen*
*               MAC-Adresse gesendet.                                         *
* Changelog:   V1.0 (2011-11-02) Initial Release                              *
*              V2.0 (2012-09-23) Erweiterung um Installer und Umstellung auf  *
*                                Idents zur einfacheren Ersteinrichtung       *
******************************************************************************/

//***** Definitionsbereich ****************************************************
include_once "Squeezebox.inc.php";      // Squeezefunktions-Sammlung

//***** Konfigurationsbereich *************************************************
$boxmac = SQArbeitszimmer;      // Hier die Squeezebox-MAC-Adresse eintragen

//***** Scriptbereich *********************************************************
//INSTALLER
// Bei manueller Ausführung wird ein Dummy-Modul erstellt, welches mit den für
// die Benutzung wichtigen Variablen ausgestattet wird. Dieses Script verschiebt
// sich dann automatisch in dieses Objekt und wird unsichtbar im WebFront.
// Als Variablen (Idents) werden erstellt: Power, Volume, Modus, Repeat, Shuffle,
// Position, Cover, Interpret, Title, Album, Duration
if ($_IPS['SENDER'] == "Execute")
{
    $object = IPS_GetObject($_IPS['SELF']);    // Hole alle Scripteigenschaften
    $ishidden = $object['ObjectIsHidden']; // Script versteckt?

    if (!$ishidden) // wenn Script nicht versteckt, dann los
    {
        $device = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}"); // erstellt Dummy-Modul
        if (IPS_ApplyChanges($device)) // prüft, ob device erstellt werden konnte
        {
            $parent = IPS_GetParent($_IPS['SELF']); // merke den Ort des Scriptes
            IPS_SetName($device, "Squeezebox");
            IPS_SetParent($device, $parent); // verschiebe Dummy-Modul zum Scriptort
            IPS_SetParent($_IPS['SELF'], $device); // verschiebe Script in Dummy-Modul
            IPS_SetHidden($_IPS['SELF'], true); // mache Script unsichtbar im Webfront
            $power = IPS_CreateVariable(0); // erstelle Boolean-Variable
            IPS_SetParent($power, $device); // verschiebe Variable in Dummy-Modul
            IPS_SetIdent($power, "Power"); // setze Ident Power
            IPS_SetName($power, "Power"); // bennene Variable in Power
            IPS_SetPosition($power, 1); // setze Position 1 für Visu
            IPS_SetVariableCustomProfile($power, "PowerSwitch"); // setze Schalterprofil
            IPS_SetVariableCustomAction($power, $_IPS['SELF']); // setze Aktion auf dieses Script
            $modus = IPS_CreateVariable(1); // Integervariable
            IPS_SetParent($modus, $device);
            IPS_SetIdent($modus, "Modus");
            IPS_SetName($modus, "Modus");
            IPS_SetPosition($modus, 2);
            IPS_SetVariableCustomProfile($modus, "Squeezebox_Status");
            IPS_SetVariableCustomAction($modus, $_IPS['SELF']); // setze Aktion auf dieses Script
            $volume = IPS_CreateVariable(1); // Integervariable
            IPS_SetParent($volume, $device);
            IPS_SetIdent($volume, "Volume");
            IPS_SetName($volume, "Lautstärke");
            IPS_SetPosition($volume, 3);
            IPS_SetVariableCustomProfile($volume, "Squeezebox_Volume");
            IPS_SetVariableCustomAction($volume, $_IPS['SELF']); // setze Aktion auf dieses Script
            $repeat = IPS_CreateVariable(1); // Integervariable
            IPS_SetParent($repeat, $device);
            IPS_SetIdent($repeat, "Repeat");
            IPS_SetName($repeat, "Repeat");
            IPS_SetPosition($repeat, 4);
            IPS_SetVariableCustomProfile($repeat, "Squeezebox_Repeat");
            IPS_SetVariableCustomAction($repeat, $_IPS['SELF']); // setze Aktion auf dieses Script
          IPS_SetIcon($repeat, "Gnome-Media-Playlist-Repeat-32"); // setze Icon
            $shuffle = IPS_CreateVariable(1); // Integervariable
            IPS_SetParent($shuffle, $device);
            IPS_SetIdent($shuffle, "Shuffle");
            IPS_SetName($shuffle, "Zufall");
            IPS_SetPosition($shuffle, 5);
            IPS_SetVariableCustomProfile($shuffle, "Squeezebox_function");
            IPS_SetVariableCustomAction($shuffle, $_IPS['SELF']); // setze Aktion auf dieses Script
          IPS_SetIcon($shuffle, "Gnome-Media-Playlist-Shuffle-32"); // setze Icon
            $interpret = IPS_CreateVariable(3); // Stringvariable
            IPS_SetParent($interpret, $device);
            IPS_SetIdent($interpret, "Interpret");
            IPS_SetName($interpret, "Interpret");
            IPS_SetPosition($interpret, 6);
            $title = IPS_CreateVariable(3); // Stringvariable
            IPS_SetParent($title, $device);
            IPS_SetIdent($title, "Title");
            IPS_SetName($title, "Titel");
            IPS_SetPosition($title, 7);
            $album = IPS_CreateVariable(3); // Stringvariable
            IPS_SetParent($album, $device);
            IPS_SetIdent($album, "Album");
            IPS_SetName($album, "Album");
            IPS_SetPosition($album, 8);
            $cover = IPS_CreateVariable(3); // Stringvariable
            IPS_SetParent($cover, $device);
            IPS_SetIdent($cover, "Cover");
            IPS_SetName($cover, "Cover");
            IPS_SetPosition($cover, 9);
            $position = IPS_CreateVariable(3); // Stringvariable
            IPS_SetParent($position, $device);
            IPS_SetIdent($position, "Position");
            IPS_SetName($position, "Position");
            IPS_SetPosition($position, 10);
            $duration = IPS_CreateVariable(3); // Stringvariable
            IPS_SetParent($duration, $device);
            IPS_SetIdent($duration, "Duration");
            IPS_SetName($duration, "Dauer");
            IPS_SetPosition($duration, 11);
        }; //    if (IPS_ApplyChanges($device)) // Objekt angelegt?
    }; //    if (!$ishidden) // wenn Script nicht versteckt, dann los
}; //if ($_IPS['SENDER'] == "Execute")
//=============================================================================
if ($_IPS['SENDER'] == "WebFront")
{
    SqueezeInit($boxmac);
      SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
};
//=============================================================================
$deviceid = IPS_GetParent($_IPS['SELF']);
$powerID = IPS_GetObjectIDByIdent("Power", $deviceid);
$volumeID = IPS_GetObjectIDByIdent("Volume", $deviceid);
$modusID = IPS_GetObjectIDByIdent("Modus", $deviceid);
$repeatID = IPS_GetObjectIDByIdent("Repeat", $deviceid);
$shuffleID = IPS_GetObjectIDByIdent("Shuffle", $deviceid);
$coverID = IPS_GetObjectIDByIdent("Cover", $deviceid);
$albumID = IPS_GetObjectIDByIdent("Album", $deviceid);
$interpretID = IPS_GetObjectIDByIdent("Interpret", $deviceid);
$durationID = IPS_GetObjectIDByIdent("Duration", $deviceid);
$positionID = IPS_GetObjectIDByIdent("Position", $deviceid);
$titleID = IPS_GetObjectIDByIdent("Title", $deviceid);

if ($_IPS['VARIABLE'] == $powerID)
{
    SqueezePower($boxmac, $_IPS['VALUE']);
};

if ($_IPS['VARIABLE'] == $volumeID)
{
    SqueezeSetVolume($boxmac, $_IPS['VALUE']);
};

if ($_IPS['VARIABLE'] == $modusID)
{
    switch($_IPS['VALUE'])
    {
       case 0:
          SqueezeButton($boxmac, 'stop');
        break;
        case 1:
           SqueezeButton($boxmac, 'pause');
        break;
        case 2:
           SqueezeButton($boxmac, 'play');
        break;
        case 3:
           SqueezeButton($boxmac, 'jump_fwd');
        break;
        case 4:
           SqueezeButton($boxmac, 'jump_rew');
        break;
    };
};

if ($_IPS['VARIABLE'] == $repeatID)
{
    SqueezeSend($boxmac, "playlist repeat ".$_IPS['VALUE']);
};

if ($_IPS['VARIABLE'] == $shuffleID)
{
    SqueezeSend($boxmac, "playlist shuffle ".$_IPS['VALUE']);
};
?>

So nun weiter zum Auswerte-Script: Hier muss nun noch die Switch-Anweisung um die neue MAC-Adresse erweitert werden. Das war’s!

<?php
/******************************************************************************
* Script-Name: Squeezebox Auswertescript.php                                           *
* Version: 2.0                                                                     *
* Autor: McKevin                                                                   *
* Erstellt am: 2011-11-02                                                          *
* Letzte Änderung am: 2012-09-23                                                 *
* Beschreibung: Ändert die IPS-Variablen in Abhängigkeit der Rückmeldung vom  *
*               Logitech Media Server je nach Gerät.                          *
* Changelog:   V1.0 (2011-11-02) Initial Release                              *
*              V2.0 (2012-09-23) Umstellung auf Idents, Code-Reduzierung      *
******************************************************************************/

//******** Definitionsbereich *************************************************
include_once "Squeezebox.inc.php";

//***** Scriptbereich *********************************************************
if ($_IPS['SENDER'] == "RegisterVariable") // wenn Daten von Registervariable kommen, dann
{
    $antwort = $_IPS['VALUE'];
    $array = explode(' ', $antwort); // Antwortstring in Array umwandeln
    $array[0] = urldecode($array[0]); // MAC in lesbares Format umwandeln
    // Ermittlung DeviceID aus MAC-Adresse
    // Bei Neugeräten hier die MAC-Adressen und IPS-DeviceIDs nachtragen
    switch ($array[0])
    {
        case SQBadezimmer: //MAC-Adresse
           $boxID = SQBadezimmerID; // ObjektID des Dummy-Moduls
           break;
        case SQWohnzimmer:
           $boxID = SQWohnzimmerID;
           break;
        case SQSchlafzimmer:
           $boxID = SQSchlafzimmerID;
           break;
        case SQController:
           $boxID = SQControllerID;
           break;
        case SQKinderzimmer:
           $boxID = SQKinderzimmerID;
           break;
        case SQGaestezimmer:
           $boxID = SQGaestezimmerID;
           break;
        case SQArbeitszimmer:
           $boxID = SQArbeitszimmerID;
           break;
    }; // switch

$powerID = IPS_GetObjectIDByIdent("Power", $boxID);
$volumeID = IPS_GetObjectIDByIdent("Volume", $boxID);
$modusID = IPS_GetObjectIDByIdent("Modus", $boxID);
$repeatID = IPS_GetObjectIDByIdent("Repeat", $boxID);
$shuffleID = IPS_GetObjectIDByIdent("Shuffle", $boxID);
$coverID = IPS_GetObjectIDByIdent("Cover", $boxID);
$albumID = IPS_GetObjectIDByIdent("Album", $boxID);
$interpretID = IPS_GetObjectIDByIdent("Interpret", $boxID);
$durationID = IPS_GetObjectIDByIdent("Duration", $boxID);
$positionID = IPS_GetObjectIDByIdent("Position", $boxID);
$titleID = IPS_GetObjectIDByIdent("Title", $boxID);

    // Werte aus der RegVar in die entsprechenden Variablen von IPS eintragen
    // Powertaste bei Änderung aktualisieren
    if ($array[1] == 'power')
    {
        if ($array[2] == '1')
        {
            SetValueBoolean($powerID, true);
        }
        else
        {
            SetValueBoolean($powerID, false);
        };
    };
    //Lautstärke bei Änderung aktualisieren
    if (($array[1] == 'prefset') and ($array[3] == 'volume'))
    {
        SetValue($volumeID, urldecode($array[4]));
    };
    // Repeat bei Änderung aktualisieren
    if (($array[1] == 'prefset') and ($array[3] == 'repeat'))
    {
        SetValue($repeatID, $array[4]);
    };
    // Shuffle bei Änderung aktualisieren
    if (($array[1] == 'prefset') and ($array[3] == 'shuffle'))
        SetValue($shuffleID, $array[4]);

    //Titel-Tag aktualisieren
    if (($array[1] == 'playlist') and ($array[2] == 'newsong'))
    {
        SetValue($titleID, utf8_decode(urldecode($array[3])));
        SetValue($modusID, 2); // Button auf play
        // Subscripe auf entsprechende Box für Anzeige der Laufzeit
        CSCK_SendText(SqueezeServer, $array[0]." status - 1 subscribe:2".chr(13));
        SqueezeSend($array[0], "artist ?");
        SqueezeSend($array[0], "album ?");
//        IPS_Sleep(10);
        cover($array[0], $coverID); // Cover anzeigen
    };
    // Album aktualisieren
    if ($array[1] == 'album')
    {
       SetValue($albumID, utf8_decode(urldecode($array[2])));
    };
    // Artist aktualisieren
    if ($array[1] == 'artist')
    {
       SetValue($interpretID, utf8_decode(urldecode($array[2])));
    };
    // Steuerungstasten im Webfront aktualisieren
    if ($array[1] == 'play')
    {
       SetValue($modusID, 2);
    };
    if ($array[1] == 'stop')
    {
       SetValue($modusID, 0);
    };
    if (($array[1] == 'pause') and ($array[2] == 1))
    {
       SetValue($modusID, 1);
    };
    if (($array[1] == 'pause') and ($array[2] == 0))
    {
       SetValue($modusID, 2);
    };
    if (($array[1] == 'button') and ($array[2] == 'jump_rew'))
    {
       SetValue($modusID, 4);
    };
    if (($array[1] == 'button') and ($array[2] == 'jump_fwd'))
    {
       SetValue($powerID, 3);
    };
    if (($array[1] == 'status') and ($array[4] == 'subscribe%3A2'))
    {
        foreach ($array as $item)
        {
            $item = utf8_decode(urldecode($item));
            $chunks = explode(":", $item);
            if ($chunks[0] == "time")
            {
                SetValue($positionID, date('i:s', $chunks[1]));
            };
            if ($chunks[0] == "duration")
            {
                SetValue($durationID, date('i:s', $chunks[1]));
            };
        };
    };
};
?>

So, viel Spaß damit, und weniger Arbeit.

Grüße
McKevin


Edit: Hier noch ein Screenshot, wie es dann aussehen sollte. Icons sind die von Gnome. Gnome Icons.zip (64.1 KB)

Edit: Da immer wieder Probleme auftreten, wegen Funktionsaufrufen zu fehlenden Funktionen hier noch meine Squeezebox.inc.php

<?php
/******************************************************************************
* Script-Name: Squeezebox.inc.php                  						 			*
* Version: 2.1                                                         			*
* Autor: McKevin                                                       			*
* Erstellt am: 2011-10-24                                              			*
* Letzte Änderung am: 2012-10-02                           	                  *
* Beschreibung: Squeezeserver Funktionen zum Inkludieren in anderen Scripten. *
* Dependencies: Logitech Media Server                         						*
* Changelog:   V1.0 (2011-10-24) Initial Release                              *
*              V2.0 (2012-09-23) Umstellung auf Idents, Code-Reduzierung      *
*              V2.1 (2012-10-02) Bugfix SqueezePlayMessageFile() Resume       *
*              V2.2 (2012-10-11) neu: SqueezeSync() und SqueezeUnsync() 		*
******************************************************************************/
//******** Konfigurationsbereich **********************************************
define('SqueezeServer', 50629); //ClientSocketID
define('SQserverIP', '192.168.1.1:9000'); 	//IP-Adresse und Port des Servers

// MAC-Adresse(n) auf verständliche Konstante(n) definieren
define('SQKinderzimmer',  	'00:04:20:xx:xx:xx');
define('SQArbeitszimmer',  '00:04:20:xx:xx:xx');
define('SQSchlafzimmer',	'00:04:20:xx:xx:xx');
define('SQWohnzimmer',		'00:04:20:xx:xx:xx');
define('SQController',    	'00:04:20:xx:xx:xx');
define('SQBadezimmer', 		'00:04:20:xx:xx:xx');
define('SQGaestezimmer',	'00:04:20:xx:xx:xx');
$allPlayers = array(SQArbeitszimmer, SQGaestezimmer, SQSchlafzimmer, SQWohnzimmer,
						  SQController, SQBadezimmer, SQKinderzimmer);

// Definiere Lautstärken für Meldungen/Alarme (wichtig für SQB Radio)
define('SQWarnung', GetValue(51287 ));
define('SQNotificationHi', GetValue(23140 ));
define('SQBAlarm', GetValue(57369 ));
define('SQNotificationLo', GetValue(59840));

// definiere DeviceIDs auf verständliche Namen
define('SQSchlafzimmerID',  53258);
define('SQWohnzimmerID',    30996 );
define('SQControllerID',    53127);
define('SQBadezimmerID',    53951 );
define('SQKinderzimmerID',  25212);
define('SQGaestezimmerID',  10834);
define('SQArbeitszimmerID', 28760);
$allPlayerIDs = array(SQSchlafzimmerID, SQWohnzimmerID, SQControllerID, SQGaestezimmer,
							 SQBadezimmerID, SQKinderzimmerID, SQArbeitszimmer);

// definiere MediaIDs für unterscheidbare Info-Töne vor Durchsagen
define('SQNotificationLoSound', 48707);
define('SQAlarmSound', 10190);
define('SQWarnungSound', 41201 );
define('SQNotificationHiSound', 23539 );

//********* ab hier nichts mehr ändern ****************************************
function SqueezeSend($box, $cmd)
// Allg. Funktion zum Befehle senden
// Wenn keine MAC-Adresse angegeben, dann sende an alle oben definierten Player
{
	if ($box == "")
	{
   	foreach ($GLOBALS["allPlayers"] AS $box)
      {
			CSCK_SendText(SqueezeServer, $box." ".$cmd.chr(13));
		};
	}
	else
	{
    CSCK_SendText(SqueezeServer, $box." ".$cmd.chr(13));
	};
};
//=============================================================================
function SqueezeInit($box)
// Schaltet den Listenmodus der Box(en) an
{
	return SqueezeSend($box, 'listen 1');
};
//=============================================================================
function SqueezePowerOn($box)
// Schaltet die Squeezebox(en) an
{
	return SqueezeSend($box, 'power 1');
};
//=============================================================================
function SqueezePowerOff($box)
// Schaltet die Squeezebox(en) aus
{
	return SqueezeSend($box, 'power 0');
};
//=============================================================================
function SqueezePower($box , $on)
// Schaltet die Squeezebox(en) an oder aus
{
	$cmd = "power ";
	$cmd .= $on ? "1":"0";
	return SqueezeSend($box, $cmd);
};
//=============================================================================
function SqueezeUnSync($box)
// Nimmt den Player mit $box aus der Syncgruppe
{
	return SqueezeSend($box, 'sync -');
};
//=============================================================================
function SqueezeSync($box1mac, $box2mac)
// versucht box2 mit box1 zu syncronisieren
{
	return SqueezeSend($box1mac, 'sync '.$box2mac);
};
//=============================================================================
function SqueezeSetVolume($box, $value)
// Setzt Lautstärke 0...100
{
	return SqueezeSend($box, 'mixer volume '.$value);
};
//=============================================================================
function cover($player_id, $var_id)
// setzt die $var_id mit dem Coverbild von $player_id
{
	$time = time();
	$str = "<table width='100%' cellspacing='0'><tr><td align=right>";
	$str = $str."<img src='http://".SQserverIP."/music/current/cover_150x150_$time.jpg?player=$player_id'></img>";
	$str = $str."</td></tr></table>";
	SetValue($var_id, $str);
};
//=============================================================================
function SqueezeButton($box , $bt)
// Sendet einen Tastendruck
{
  return SqueezeSend($box, "button ".$bt);
};
//=============================================================================
// _Under Development
function SqueezeShowMessage($box, $value1, $value2)
{
  return SqueezeSend($box, 'show '.$value1);
};
//=============================================================================
function SqueezePlayMessageFile($box, $DeviceID, $MedienID, $mType)
// Spielt eine IPS-Mediendatei ab
// $box = MAC-Adresse der Squeezebox
// $DeviceID = ObjektID der Dummy-Instanz passend zur MAC-Adresse
// $MedienID = ID des Soundfiles (MP3 oder WAV)
// $mType = Messagetyp (SQNotificationHi/Lo, SQWarnung, SQAlarm = Lautstärke in %);
{
	$wait = 15; // Wartezeit in sec bis alte Playlist wiederhergestellt wird
	switch ($mType) // Spiele verschiedene Klänge als Aufmerksamkeitssteigerung je nach Lautstärke (SQNotification..)
	{
		case SQNotificationLo:
			$mediaarray1 = IPS_GetMedia(SQNotificationLoSound);  // hole Medieninformationen
			break;
		case SQNotificationHi:
			$mediaarray1 = IPS_GetMedia(SQNotificationHiSound);  // hole Medieninformationen
			break;
		case SQWarnung:
			$mediaarray1 = IPS_GetMedia(SQWarnungSound);  // hole Medieninformationen
			break;
		case SQBAlarm:
			$mediaarray1 = IPS_GetMedia(SQAlarmSound);  // hole Medieninformationen
			break;
		default:
		 // kein Klang zur Unterscheidung
	};
	$mediapath1 = rawurlencode(IPS_GetKernelDir().$mediaarray1['MediaFile']); 	// hole Medienpfad

	if (!(array_search($box, $GLOBALS["allPlayers"]) !== false)) // Prüfe, ob MAC-Adrese definiert, sonst Abbruch
	{
		IPS_LogMessage($_IPS['SELF'], "SqueezePlayMessageFile:Device mit MAC".$box." existiert nicht");
	   return false;
	};
	if (!IPS_InstanceExists($DeviceID)) // Prüfe, ob Device mit $DeviceID existiert, sonst Abbruch
	{
		IPS_LogMessage($_IPS['SELF'], "SqueezePlayMessageFile:Device mit ".$DeviceID." existiert nicht");
	   return false;
	};
	if (IPS_MediaExists($MedienID)) 	// Prüfe, ob MedienObjekt mit der $MedienID existiert, sonst Abbruch
	{
		$mediaarray2 = IPS_GetMedia($MedienID);  // hole Medieninformationen
		// Prüfe, ob Medien-Datei vorhanden und Sound-File
		if (($mediaarray2['IsAvailable'] == true) && ($mediaarray2['MediaType'] == 2))
		{
			$mediapath2 = rawurlencode(IPS_GetKernelDir().$mediaarray2['MediaFile']); 	// hole Medienpfad
//			IPS_LogMessage($_IPS['SELF'], "SqueezePlayMessageFile:MediaPath: ".$mediapath);
		}
		else 	// Datei nicht vorhanden oder kein Soundfile--> Logeintrag in IPS-Meldungen
 		{
			IPS_LogMessage($_IPS['SELF'], "SqueezePlayMessageFile:MedienID $MedienID ist nicht vorhanden oder keine WAV/MP3-Datei");
			return false; // Abbruch der Funktion mit false-Rückgabe
		};
		// Speichere Status (Power, Modus, Lautstärke, Playlist, Zeitposition)
		$status_old = GetValue(IPS_GetObjectIDByIdent("Power", $DeviceID));	// Status Box An oder Aus
		$modus_old  = GetValue(IPS_GetObjectIDByIdent("Modus", $DeviceID));  // Modus merken (Play Pause Stop)
		$volume_old = GetValue(IPS_GetObjectIDByIdent("Volume", $DeviceID));	// aktuelle Lautstärke der Box zwischenspeichern
		$time_old = GetValue(IPS_GetObjectIDByIdent("Position", $DeviceID));	// Position des aktuellen Titels merken (float Sekunden)
		$repeat = GetValue(IPS_GetObjectIDByIdent("Repeat", $DeviceID));     // War Repeat aktiviert?
		SqueezeSend($box, "playlist repeat 0"); // Repeat deaktivieren
		SqueezeSend($box, "playlist save TEMP0 silent 1"); // aktuelle Playlist speichern
		SqueezeSend($box, "playlist clear"); // Aktuelle Wiedergabeliste löschen
 	 	SqueezeSend($box, "playlist add ".$mediapath1);// neue Wiedergabeliste schreiben mit abzuspielende Datei (1. Datei)
		SqueezeSend($box, "playlist insert ".$mediapath2); // Wiedergabeliste ergänzen mit abzuspielende Datei (2. Datei)
		SqueezeSetVolume($box, $mType); // Definierte Message-Lautstärke setzen
		SqueezeSend($box, "play");		// Abspielen
		// Warten bis Audiodatei(en) abgespielt wurden (Script anhalten)
		IPS_Sleep($wait*1000); // x sec Script anhalten für Durchsage
//		SqueezeSend($box, "playlist clear"); // Temporäre Wiedergabeliste wieder löschen
		SqueezeSetVolume($box, $volume_old); // alte Lautstärke setzen
		SqueezeSend($box, "playlist resume TEMP0 noplay"); 		// Alte Wiedergabeliste wieder herstellen
		SqueezeSend($box, "playlist repeat ".$repeat); // Repeat wieder herstellen
		SqueezeSend($box, "time ".$time_old); // an die alte Stelle springen
		switch ($modus_old)
		{
			case 0: // Stop
				$cmd = "stop";
			   break;
		   case 1: // Pause
		      $cmd = "pause 1";
		      break;
		   case 2: // Play
				$cmd = "play";
		      break;
		};
		SqueezeSend($box, $cmd); // alten Modus wieder einstellen
		if ($cmd == "play" or $cmd == "pause 1") SqueezeSend($box, "time ".$time_old);
		if (!$status_old) SqueezePowerOff($box); // War die Box zuvor aus wieder ausschalten
	};
  return true;
};
//=============================================================================
function SqueezePlayMessageText($box, $DeviceID, $text, $mType)
// Spielt ein Text via TTS auf der Squeezebox ab
// $box = MAC-Adresse der Squeezebox
// $DeviceID = ObjektID der Dummy-Instanz passend zur MAC-Adresse
// $text = String der ausgegeben werden soll
// $mType = Messagetyp (SQNotificationHi/Lo, SQWarnung, SQAlarm = Lautstärke in %);
{
	$wait = 15; // Wartezeit in sec bis alte Playlist wiederhergestellt wird
	$wait_generate = 5; // Wartezeit in sec zur vollständigen Dateigenerierung
	TTS_GenerateFile(31964, $text, "C:\IP-Symcon\TTS.wav", 23); // Generiere WAV-Datei aus Text
	IPS_Sleep($wait_generate*1000); // Warte x sec für die Generierung der Datei
	switch ($mType) // Spiele verschiedene Klänge als Aufmerksamkeitssteigerung je nach Lautstärke (SQNotification..)
	{
		case SQNotificationLo:
			$mediaarray1 = IPS_GetMedia(SQNotificationLoSound);  // hole Medieninformationen
			break;
		case SQNotificationHi:
			$mediaarray1 = IPS_GetMedia(SQNotificationHiSound);  // hole Medieninformationen
			break;
		case SQWarnung:
			$mediaarray1 = IPS_GetMedia(SQWarnungSound);  // hole Medieninformationen
			break;
		case SQBAlarm:
			$mediaarray1 = IPS_GetMedia(SQAlarmSound);  // hole Medieninformationen
			break;
		default:
		 // kein Klang zur Unterscheidung
	};
	$mediapath1 = rawurlencode(IPS_GetKernelDir().$mediaarray1['MediaFile']); 	// hole Medienpfad

	if (!(array_search($box, $GLOBALS["allPlayers"]) !== false)) // Prüfe, ob MAC-Adrese definiert, sonst Abbruch
	{
		IPS_LogMessage($_IPS['SELF'], "SqueezePlayMessageText:Device mit MAC".$box." existiert nicht");
	   return false;
	};
	if (!IPS_InstanceExists($DeviceID)) // Prüfe, ob Device mit $DeviceID existiert, sonst Abbruch
	{
		IPS_LogMessage($_IPS['SELF'], "SqueezePlayMessageText:Device mit ".$DeviceID." existiert nicht");
	   return false;
	};
	if (is_file('C:/IP-Symcon/TTS.wav')) 	// Prüfe, ob MedienObjekt mit der $MedienID existiert, sonst Abbruch
	{
		$mediapath2 = rawurlencode(IPS_GetKernelDir().'TTS.wav'); 	// hole Medienpfad
	}
	else 	// Datei nicht vorhanden--> Logeintrag in IPS-Meldungen
	{
		IPS_LogMessage($_IPS['SELF'], "SqueezePlayMessageText: TTS.wav ist nicht vorhanden.");
		return false; // Abbruch der Funktion mit false-Rückgabe
	};
	// Speichere Status (Power, Modus, Lautstärke, Playlist, Zeitposition)
	$status_old = GetValue(IPS_GetObjectIDByIdent("Power", $DeviceID));	// Status Box An oder Aus
	$modus_old  = GetValue(IPS_GetObjectIDByIdent("Modus", $DeviceID));  // Modus merken (Play Pause Stop)
	$volume_old = GetValue(IPS_GetObjectIDByIdent("Volume", $DeviceID));	// aktuelle Lautstärke der Box zwischenspeichern
	$time_old = GetValue(IPS_GetObjectIDByIdent("Position", $DeviceID));	// Position des aktuellen Titels merken (float Sekunden)
	$repeat = GetValue(IPS_GetObjectIDByIdent("Repeat", $DeviceID));     // War Repeat aktiviert?
	SqueezeSend($box, "playlist repeat 0"); // Repeat deaktivieren
	SqueezeSend($box, "playlist save TEMP0 silent 1"); // aktuelle Playlist speichern
	SqueezeSend($box, "playlist clear"); // Aktuelle Wiedergabeliste löschen
 	SqueezeSend($box, "playlist add ".$mediapath1);// neue Wiedergabeliste schreiben mit abzuspielende Datei (1. Datei)
	SqueezeSend($box, "playlist insert ".$mediapath2); // Wiedergabeliste ergänzen mit abzuspielende Datei (2. Datei)
	SqueezeSetVolume($box, $mType); // Definierte Message-Lautstärke setzen
	SqueezeSend($box, "play");		// Abspielen
	// Warten bis Audiodatei(en) abgespielt wurden (Script anhalten)
	IPS_Sleep($wait*1000); // x sec Script anhalten für Durchsage
//		SqueezeSend($box, "playlist clear"); // Temporäre Wiedergabeliste wieder löschen
	SqueezeSetVolume($box, $volume_old); // alte Lautstärke setzen
	SqueezeSend($box, "playlist resume TEMP0 noplay"); 		// Alte Wiedergabeliste wieder herstellen
	SqueezeSend($box, "playlist repeat ".$repeat); // Repeat wieder herstellen
	SqueezeSend($box, "time ".$time_old); // an die alte Stelle springen
	switch ($modus_old)
	{
		case 0: // Stop
			$cmd = "stop";
		   break;
	   case 1: // Pause
	      $cmd = "pause 1";
	      break;
	   case 2: // Play
			$cmd = "play";
	      break;
	};
	SqueezeSend($box, $cmd); // alten Modus wieder einstellen
	if ($cmd == "play" or $cmd == "pause 1") SqueezeSend($box, "time ".$time_old);
	if (!$status_old) SqueezePowerOff($box); // War die Box zuvor aus wieder ausschalten
	return true;
};
?>

Hi Kevin,

damit der Thread hier nicht explodiert habe ich mal einen komplett neuen für Dich erstellt.

Bzgl. des Skriptes. Nettes Version, werde ich bei Zeiten mal testen.

Ich auch:)

Die Wiedergabelisten sowie die inc_squeezebox laufen noch nach dem alten Schema?

da ich keine Wiedergabelisten benutze, müssen diese pro Gerät nachgepflegt werden. (evtl. Scriptänderung!)
Die Include-Datei müsste aber weiterhin funktionieren, da ich hier keine großen Änderungen vorgenommen habe. Hier habe ich nur die MAC-Adressen und DummyIDs der Squeezeboxen als Konstanten definiert (wie du ja teilweise auch hast), um bei Gerätetausch bzw. Neuanschaffung nur eine Stelle ändern muss.

Gruß
Kevin

Hallo,

wenns sich einfacher integrieren lässt, bin ich sehr dran interessiert.

Welche zusätzlichen Arbeiten muss man noch erledigen ( Variablen anlegen, usw. ), da finde ich in deine Posting nichts zu oder ist das identisch mit dem Original-Squeezebox-Script ?

Danke

Siehe Beitrag :wink:

Hallo Tuxtom,

ja es werden (alle im Screenshot sichtbaren) Variablen automatisch angelegt. Es wird nur IP-Symcon V2.5 oder höher benötigt, da ich in den Scripten Idents verwende, um Variablen wieder zu finden. Es können deshalb auch ohne Scriptänderung die Variablen nach eigenen Wünschen umbenannt werden.
Wenn du mehr Variablen in allen Squeezeboxen willst, wie z.B. Playlisten, Anzahl Tracks in Playlist etc, dann müssen diese in dem Installationsscript nachgetragen werden (und dann vielleicht hier als Verbesserung zurückposten).
Als nötige Arbeiten sind nur anschließend die Dummy-InstanzID und die dazu passende MAC-Adresse der Squeezebox in Werners Squeezebox-Include-Datei am besten per:


define ('Squeezeboxname', 'MAC-address in Kleinbuchstaben');  
 define ('SqueezeboxnameID', InstanzID); 
 

zu definieren, da alle Scripte dann die gleichen Definitionen benutzen und bei Gerätewechsel bzw. Neukauf nur einmal ein bis zwei Zeilen geändert/nachgetragen werden müssen.

Grüße

Kevin

Hi Kevin,

danke für die Infos.

Werde ich direkt am Wochenende mal probieren.

Hallo,

ich bin noch rel. unbeholfen mit IPS und komme leider mit diesem Skript nicht klar.
Ich habe derzeit 3 Squeezeboxen und würde diese gerne mit IPS Steuern.

Ich verwende iPeng an meinem iPhone um die Boxen zu steuern. Daher bräuchte ich gar nicht so viele Funktionen.
Nun möchte ich allerdings gewisse Aktionen realisieren.

  1. Fritzbox eingehender Ruf. Musik soll auf Pause gehen.
    Das Fritzbox Skript funktioniert schon. Bei meinem Samsung TV funktioniert es bereits schon.
    Ich bräuchte nur ein Script, dass mir alle Squeezeboxen auf Pause stellt und ein weiteres Skript, dass wieder auf Play drückt.

  2. Wenn mein TV eingeschaltet wird, (Vaiable im IPS schon vorhanden) soll eine Squeezebox automatisch auf Line in schalten und sich einschalten. Da dort der TV angeschlossen ist.

  3. Anwesend / Abwesend: Wenn ich abwesend bin (Variable in IPS Vorhanden) sollen alle Squeezeboxen aus gehen.
    Also bräucht ich nur ein Skript, dass die Boxen ausschaltet.

  4. Zuletzt brauch ich noch ein Script, welches einen gewissen Radiosender abspielt.
    Also wenn ich das Script starte, dann soll die Box den Radiosender BLABLA starten und Lautstärke ca. 10-20% stellen.
    Ich möchte einen Chill Modus mir einrichten.

Ich weiss das sind echt sehr spezielle anforderungen, aber ich würde das gerne hinbekommen.

Wer kann mir hier ein paar Tips geben?

Leider habe ich es bis jetzt noch nicht mal geschafft das von McKevin einzurichten.
Was muss ich vorbereiten damit das Skript vom McKevin funktioniert? Das ist hier leider nicht so genau beschrieben.

Danke

um dir zu helfen ,musst du das Problem genauer beschreiben , wo es hängt !!

und ja alles ist möglich, wenn du die Boxen eingebunden hast :loveips:

Heute habe ich mich den ganzen Tag gebastelt.

Punkt 1 habe mit mit.
$result = CSCK_SendText(20301 /[Client Socket LogitechMediaServer]/, "XX:XX:XX:XX:XX:XX pause 1 " .chr(13));
hinbekommen.

Punkt 2
auch Gelöst:
$result = CSCK_SendText(20301 /[Client Socket LogitechMediaServer]/, "XX:XX:XX:XX:XX:XX playlist play " .rawurlencode(‚linein:1‘).chr(13));//Unten

Punkt 3
Habe ich mit
$result = CSCK_SendText(20301 /[Client Socket LogitechMediaServer]/, "XX:XX:XX:XX:XX:XX power 0 " .chr(13));

Punkt 4
Habe ich mit
$result = CSCK_SendText(20301 /[Client Socket LogitechMediaServer]/, "XX:XX:XX:XX:XX:XX playlist play '.rawurlencode(‚http://streams.br-online.de/bayern3_2.asx‘).chr(13));

nur zur Info, vielleicht braucht es ja noch jemand anders. :slight_smile:

Hallo Joschi,

ich denke mir, dass du meine Script nicht zum Laufen bringst, liegt an der fehlendern Include-Script-Sammlung, mit der du die Squeezeboxen ansteuern kannst.
Ursprünglich war von Werner (wgreipl) dieser Thread gestartet worden

In diesem Thread findest Du alle benötigten Infos. Nur ist die Pflege/Wartung nicht sehr benutzerfreundlich, da von Hand alle IDs eingetragen werden müssen. Darum hatte ich meine Version hier in Forum gestellt. Du musst also erstmal mit Werners Thread beginnen und kannst dann alle anderen Boxen mit meinen Scripten einbinden.

Grüße
Kevin

Hi McKevin

danke für Deine Infos.
Hier sind die Punkte (siehe unten) vom Werner. Soweit komme ich bis Punkt 4.
Dann muss ich glaub ich dein Script anlegen und anpassen:

Ich habe das wie folgt angepasst:

//***** Definitionsbereich ****************************************************
include_once „43711.ips.php“; // Squeezefunktions-Sammlung

//***** Konfigurationsbereich *************************************************
$boxmac = ‚xx:xx:xx:xx:xx:xx‘; // Hier die Squeezebox-MAC-Adresse eintragen

  1. Die ID vom Include Script vom Werners ZIP File.
  2. MAC Adresse mit kleinen Buchstaben :wink:

Beim Start erhalte ich diese fehler:
Notice: Undefined index: VARIABLE in C:\IP-Symcon\scripts\51522.ips.php on line 137

Notice: Undefined index: VARIABLE in C:\IP-Symcon\scripts\51522.ips.php on line 142

Notice: Undefined index: VARIABLE in C:\IP-Symcon\scripts\51522.ips.php on line 147

Notice: Undefined index: VARIABLE in C:\IP-Symcon\scripts\51522.ips.php on line 169

Notice: Undefined index: VARIABLE in C:\IP-Symcon\scripts\51522.ips.php on line 174

Bei mir ist die 137 diese Zeile:
if ($_IPS[‚VARIABLE‘] == $powerID)

Er hat trotzdem so einige Variablen angelegt.

Wie muss ich nun weiter vorgehen, kann ich den Fehler einfach nicht beachten?

Punkte vom Werner:

  1. Client Socket anlegen, als IP-Adresse die IP des Squeezeserver und als Port den CLI-Port der überlicherweise 9090 lautet.

  2. Cutter anlegen und auf den Client-Socket verbinden. (übergeordnete Instanz)

  3. Register-Variable anlegen und auf den Cutter verbinden (übergeordnete Instanz). Das Zielskript (Auswerteskript) folgt später.

  4. Include-Skript in IPS anlegen. (siehe ZIP-Datei). Darin befindet sich für die Coveranzeige in der Function Cover die URL:Port eures Servers. Bitte entsprechend ändern.

  5. Variablen für eine Squeezebox anlegen.

  6. Auswerteskript in IPS anlegen (ZIP-Datei) und alle ID der Variablen entsprechend der die ihr angelegt habt ändern. Jetzt könnt Ihr das Auswerteskript als Zielskript in die Register-Variable (Punkt 3) eintragen.

  7. Steuerskript anlegen (ZIP-Datei) und wieder alle Variablen-ID´s anpassen.

  8. Bei allen Variablen die im Steuerskript aufgeführt sind als Aktionskript das Steuerskript einstellen. (Siehe Beispiel 8_Variable_Steuerskript.png)

Danke

Hallo,

ich hab die Scripte mittlerweile am Laufen (nachdem ich noch die Variablenprofile erstellen bzw. umbenennen musste) und nun läuft es soweit. Vielen Dank an wgreipel und McKevin!
Aaaber. Ich bekomme keinen Interpreten bzw. Album angezeigt. In den Scripten taucht an den dafür wohl wichtigen Stellen ja die Funktion SqueezeSend auf


SqueezeSend($array[0], "artist ?");
SqueezeSend($array[0], "album ?");

die ich aber nirgendwo finden kann. IPS ist ebenfalls der Meinung, diese Funktion nicht zu kennen.


Call to undefined function SqueezeSend() in ...

Wo ist diese Funktion definiert? Was hab ich übersehen? :confused:

Danke schon mal für die Hilfe,
Carsten

Hallo,

@AltAnhalter: ich habe im ersten Thread mal noch meine Squeezebox.inc.php mit angehangen. Darin sind alle von mir benutzten Funktionsaufrufe zusammengefasst. Eine Kompatibilität mit Werners Scripten kann ich nicht garantieren. Evtl. müsst ihr Euch dann die Funktionen zusammenkopieren und/oder anpassen.

@joschi79: Welches Script versuchts du wie und wann aufzurufen? Ich vermute du nimmst das erste Script und startest es aus der Konsole (Editor) heraus? Das Script nicht aus dem Webfront direkt aufrufen, da diese Zeilen durch den WebFrontaufruf bei Variablenänderung nur einen Sinn ergeben, daher die Fehlermeldung.
Falls du das Script anders aufrufst als Execute (Installer) oder über Variablenänderung im Webfront: Lad es noch mal aus dem ersten Thread runter und probier es noch mal neu, es scheint evtl. ein Copy-Paste-Fehler zu sein.

Grüße
Kevin

Hab mir die Funktion aus Deiner Datei rauskopiert und angehängt. Klappt jetzt wunderbar! Sowohl Album als auch Interpret werden angezeigt. :slight_smile:
Vielen Dank!

Grüße,
Carsten

Hallo Carsten,

schön wenn’s jetzt endlich klappt.

Grüße
Kevin

Danke Kevin.

Also ich starte das Squeezebox AZ Steuerung.php (Erstes Script vom ersten Post) über den Ausführen Button, da wo ich im IPS das Script editieren kann.

Ich habe nochmals alles neu kopiert und angepasst. Gleiche Fehler wie bereits beschrieben.

Was mach ich falsch. :frowning:

Muss ich jetzt die Variablen und das Skript löschen und neu Anlegen, wenn es einmal schief lief?

Hallo Joschi,

ich würde noch mal alles löschen bis auf das script und dann noch mal ausführen.

Berichte doch mal wenn’s klappt bzw. nicht klappt.

Grüße
Kevin