Squeezebox steuern

Es gibt ja schon einige Scripts für die Box.

Hier mal ein kleines Script, welches die Box über Webfront, Fernbedienung einfach steuert.
Ganz simpel gehalten. 4 Variablen, Clientsocket auf Port 9090 und eine Registervariable, mehr wird nicht gebraucht.

Das Steuerscript kann von überall über include eingebunden werden. Das Steuerscript enthält die Steuerung und Auswertung der Box.

Functionsscript:

<?
define('mediaserver', 37859 /*[Mediaserver Squezzebox]*/); // Client Socket

#############################Funktionen#########################################

//Box init
function SqueezeInit($box)
{
    $chr = "listen 1";
      return CSCK_SendText(mediaserver, $box." ".$chr.chr(10));
}

//Kurzwahltasten 1-6
function SquezzePresetButton($box, $button)
{
    $chr = "button preset_".$button.".single";
    CSCK_SendText(mediaserver, $box." ".$chr.chr(10));
}

//Textmeldungen an Box senden
function SquezzeDisplay($box, $text, $time)
{
    $chr = "display ".rawurlencode($text)." ".$time;
    CSCK_SendText(mediaserver, $box." ".$chr.chr(10));
}

//Playlist über Url
function SqueezePlayUrl($box, $url)
{
    $chr = "playlist play ".$url;
    CSCK_SendText(mediaserver, $box." ".$chr.chr(10));
}

//Box Ein/Ausschalten
function SqueezePower($box, $switch)
{
      $chr = "power ";
    $chr .= $switch ? 1:0;
     CSCK_SendText(mediaserver, $box." ".$chr.chr(10));
}

//Variablen setzen
function SquezzeSetValue($varID, $value)
{
    SetValue($varID, $value);
}

//Box Lautstärke
function SqueezeVolume($box, $vol)
{
    $chr = "mixer volume ".$vol;
    CSCK_SendText(mediaserver, $box." ".$chr.chr(10));
}

############################Ende Funktionen#####################################
?>

Steuerscript:

<?
include 'funcSquezzebox.ips.php';

//MAC-Adressen Boxen
$wohnzimmer = '00:04:20:2a:1c:84'; //MAC-Adresse muss klein geschrieben werden!
$buero = '00:04:20:2a:1c:7f';

######################Steuerung über Webfront###################################

if($_IPS['SENDER'] == "WebFront")
{
   SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
    switch($_IPS['VARIABLE'])
    {
        case 28831:
            SqueezePower($wohnzimmer, $_IPS['VALUE']);
            if(!$_IPS['VALUE']) SetValue(26151 /*[Squezzeboxen\Wohnzimmer\Titel]*/, "");
        break;
        case 31761:
            SqueezeVolume($wohnzimmer, $_IPS['VALUE']);
        break;
        case 21020:
            SqueezePower($buero, $_IPS['VALUE']);
            if(!$_IPS['VALUE']) SetValue(59823 /*[Squezzeboxen\Büro\Titel]*/, "");
        break;
        case 56095:
            SqueezeVolume($buero, $_IPS['VALUE']);
        break;
    }
}

######################Ende Steuerung Webfront###################################

######################Aufruf über ein Script####################################

if($_IPS['SENDER'] == "RunScript")
{
    if(GetValue(19357 /*[Etagen\Obergeschoss\Büro\Bewegungsmelder\Status]*/))
    {
        SqueezePower($buero, 1);
    }
    else
    {
        SqueezePower($buero, 0);
    }
}

######################Ende Aufruf Script########################################

######################Daten von Squezzebox######################################

if($_IPS['SENDER'] == "RegisterVariable")
{
    $mac = strstr(urldecode($_IPS['VALUE']), " ", true);
    $value = trim(stristr(urldecode($_IPS['VALUE']), " "));
    if(strpos($value, "playlist newsong") !== false)
    {
       $befehl = substr($value, 0, 16);
       $play = substr(utf8_decode($value), 16);
       if(strrpos($play, "0") !== false)
       {
           $sender = substr($play, 0, -1);
           if($mac == $wohnzimmer) SetValue(25596 /*[Squezzeboxen\Wohnzimmer\Sender]*/, $sender." # ");
           if($mac == $buero) SetValue(57152 /*[Squezzeboxen\Büro\Sender]*/, $sender." # ");
        }
        else
        {
           $titel = $play;
        }
    }
    else
    {
        $data = strrchr($value, " ");
        $befehl = substr($value, 0, -strlen($data));
    }
    switch($befehl)
    {
       case "prefset server power":
          if($mac == $wohnzimmer) SetValue(28831 /*[Squezzeboxen\Wohnzimmer\Power]*/, (int)$data);
          if($mac == $buero) SetValue(21020 /*[Squezzeboxen\Büro\Power]*/, (int)$data);
       break;
       case "prefset server volume":
          if($mac == $wohnzimmer) SquezzeSetValue(31761 /*[Squezzeboxen\Wohnzimmer\Volume]*/, (int)$data);
          if($mac == $buero) SetValue(56095 /*[Squezzeboxen\Büro\Volume]*/, (int)$data);
        break;
        case "playlist newsong":
            if(!isset($titel)) $titel = "";
           if($mac == $wohnzimmer) SquezzeSetValue(26151 /*[Squezzeboxen\Wohnzimmer\Titel]*/, GetValue(25596 /*[Squezzeboxen\Wohnzimmer\Sender]*/).$titel);
           if($mac == $buero) SetValue(59823 /*[Squezzeboxen\Büro\Titel]*/, GetValue(57152 /*[Squezzeboxen\Büro\Sender]*/).$titel);
        break;
    }
}

##########################Ende Daten von Squezzebox#############################

###################Steuerung über Homematic Fernbedienung#######################

if($_IPS['SENDER'] == "Variable")
{
    $state = (int)GetValue(28831 /*[Squezzeboxen\Wohnzimmer\Power]*/);
    
    switch($_IPS['VARIABLE'])
    {
        case 59720: // Taste Ein
            if(!$state)
            {
                SetValue(28831 /*[Squezzeboxen\Wohnzimmer\Power]*/, true);
                SqueezePower($wohnzimmer, true);
                SqueezeVolume($wohnzimmer, 25);
            }
        break;
        case 47423: // Taste Aus
            if($state)
            {
               SetValue(28831 /*[Squezzeboxen\Wohnzimmer\Power]*/, false);
               SqueezePower($wohnzimmer, false);
            }
        break;
        case 46102: // Taste leiser
            $vol = GetValue(31761 /*[Squezzeboxen\Wohnzimmer\Volume]*/);
            if($vol == 0) return;
           SqueezeVolume($wohnzimmer, $vol -= 5);
            SetValue(31761 /*[Squezzeboxen\Wohnzimmer\Volume]*/, $vol);
       break;
        case 24537: // Taste lauter
          $vol = GetValue(31761 /*[Squezzeboxen\Wohnzimmer\Volume]*/);
          if($vol <0) $vol = 0;
           SqueezeVolume($wohnzimmer, $vol += 5);
            SetValue(31761 /*[Squezzeboxen\Wohnzimmer\Volume]*/, $vol);
      break;
        case 10903:
            SquezzePresetButton($wohnzimmer, 1); //FFH
       break;
        case 19109:
           SquezzePresetButton($wohnzimmer, 2); //Radio Paloma
       break;
    }
}
#########################Ende Steuerung Fernbedienung###########################


?>

Hallo Rainer,

wie muss ich den die RegisterVariable anlegen ?

Hab gerade deine Skripte installiert und bin am basteln. Deine Scripte würden wir vom Funktionsumfang absolut reichen.

Hab jetzt das Problem das die Steuerung das PowerOn / Off nicht mitbekommt. Die Lautstärke wird im Webfront aktualisiert, die Registervariable hat auch Input.

 prefset server power

Wird wohl die Auswertung von On/Off machen… Aber ich denk ich hab da ein Problem mit meiner RegisterVariable. Wie hast du den Cutter eingestellt ?

Danke
Gruß Stephan

Wie hast du den Cutter eingestellt ?

Gar nicht, brauchst Du nicht. Steht auch nichts von drinnen. Der Powervariable hast als Aktionscript das Steuerungsscript übergeben.

Ansonsten mach mal ein Debug der Regvar. Wenn Du an der Box ausschaltest.

Ok… Also die RegVariable hab ich jetzt ohne Cutter.
Bringt aber keine Änderung.

Dump der RegVariable sieht eigentlich gut aus…
Komisch ist das die Lautstärke funktioniert…
Was ich nicht blicke - bei 43000 sagt er Objekt existiert nicht. Aber 43000 ist meine Power Variable…


    switch($befehl)
    {
       case "prefset server power":
			 echo "Test";
          if($mac == $touchwohnzimmer) SetValue(43000 /*[Objekt #24300 existiert nicht]*/, (int)$data);
          if($mac == $buero) SetValue(21020 /*[Objekt #21020 existiert nicht]*/, (int)$data);
       break;
       
       
       case "prefset server volume":
          if($mac == $touchwohnzimmer) SquezzeSetValue(12523 /*[Squeezebox\Touch Wohnzimmer\Volume]*/, (int)$data);
          if($mac == $buero) SetValue(56095 /*[Objekt #56095 existiert nicht]*/, (int)$data);
        break;
        case "playlist newsong":
            if(!isset($titel)) $titel = "";
           if($mac == $touchwohnzimmer) SquezzeSetValue(23399 /*[Squeezebox\Touch Wohnzimmer\Titel]*/, GetValue(24322 /*[Objekt #25596 existiert nicht]*/).$titel);
           if($mac == $buero) SetValue(59823 /*[Objekt #59823 existiert nicht]*/, GetValue(57152 /*[Objekt #57152 existiert nicht]*/).$titel);
        break;


case "prefset server power":
    echo $befehl." ".(int)$data;

Was kommt da in den Meldungen raus.

Tja… ich glaub so langsam komm ich der Sache auf die Schliche…
Da kommt garnix. Wenn ich ein echo bei der Lautstärke einbaue dann bekomm ich eine Ausgabe in den Meldungen. Irgendwie hab ich das Gefühl das der Case nicht getriggert wird. Welche Server setzt du ein ? Auch LMS 7.7.1 ?
Hab jetzt vor dem Switch mal noch ein Echo eingebaut… Siehe Screenshoot.

Irgendwas muss ja kommen… setz das mal über den switch.

Logitech Media Server Version: 7.7.1 - r33750 @ Mon Dec 12 09:42:47 PST 2011

Off Topic:

Herzlich Willkommen Rainer bei den LMS/SQS-Inhabern.

Dann bin ich mal auf deine Skripte gespannt.

Hmm, alles irgendwie unkoordiniert. Wenn die Macadresse nicht davor steht wird das nix.
Setz mal den Cutter dazwischen mit Trennzeichen Rechts LF. Post noch mal das Ergebnis.

Ansonsten, mach mal ein Update auf den neuen Server. Ich hab das 2 Tage durchexessiert.

@ Werner,

jo, das Ding ist ge… Soviele Ideen was man alles mit anstellen kann.

Ich komm irgendwie heut nicht weiter. Ich brich mal ab.
Als Server hab ich den LMS 7.7.1 - letzte Version aber unter OSX. Kann höchstens sein das hier das Problem herkommt.
Sieht echt so aus als würde der Befehl nicht sauber kommen. Bei der Lautstärke kommt schön die MAC, dann der Befehl. Bei Ein / Ausschalten stimmt bei mir irgendwie nix.
Naja … morgen mal weiterschauen. Schonmal danke für deine Hilfe !

Genau, morgen ist auch noch ein Tag. Aber vom Mac habe ich keine Ahnung.

So… hab nochmal ein bissel gespielt…
Lass mir jetzt die Registervariable anzeigen in den Meldungen. Hab gerade mal einen Screenshoot angehängt. Kann man da was erkennen ? Hab nur die Lautstärke verändert und die Box ein und ausgeschaltet…
OSX sollte nicht’s machen. Die Server sind ja gleich…

Kann es sein das Manchmal die Mac im Klartext kommt und das andere mal etwas komisch codiert… Kann hier das Problem liegen ?

Moin Stephan,

das ganze ist etwas sonderbar bei dir. Die Daten kommen normal rein und dann decodiert. :confused:

probier es mal so.

$mac = strstr($_IPS['VALUE'], " ", true);
    $value = trim(stristr($_IPS['VALUE'], " "));

Im Anhang mal ein Debug meiner Registervariable.

Zerlegt doch den ankommenden Stream vom Cutter/RegVar in ein Array.

$array = explode ( ' ', $antwort ); // Antwortstring in Array umwandeln
$array[0] =  urldecode ( $array[0] ); // MAC in lesbares Format umwandeln

in array[0] steht sauber die MAC und im Rest des Array die auswertbaren Befehle.

Danke Ihr beiden…
… ihr gebt nicht auf. Ich aber auch nicht :slight_smile:

Hab jetzt erstmal den Tipp von Rainer befolgt - keine Verbesserung.

Jetzt hab ich mal das ganze in ein Array gepustet und im Webfront versucht zu visualisieren. Das ist etwas komisch was dabei rauskommt. Hab jetzt nur mal die Box eingeschaltet - seht selbst…

Dann liegt es vielleicht doch am Mac.

Du müsstest dann die ganzen Daten im Buffer sammeln und auslesen, die entsprechenden Daten suchen und setzen. Sollte eigentlich mit meiner Methode gehen.

Ich kann das nachher mal testen, wenn Du es nicht selbst hinbekommst.

Danke Rainer,

bin jetzt soweit das die PowerTaste ausgewertet wird…

Hab ein Stück von Wolfgangs Script integriert - jetzt geh die Aktualisierung der Power Taste…


	    if($array[0] == $touchwohnzimmer) {          // Wohnzimmer



	// Powertaste bei Änderung aktualisieren

	if($array[1] == 'power') {

		if ($array[2] == 1) {

			SetValue(43000 /*[Tools\Squeezebox\Auswertung Squeezeboxen\Musik Wohnzimmer\Power]*/, true);

		} else {

			SetValue(43000 /*[Tools\Squeezebox\Auswertung Squeezeboxen\Musik Wohnzimmer\Power]*/, false);

		}

	SetValue(12924 /*[Tools\Squeezebox\Auswertung Squeezeboxen\Musik Wohnzimmer\MAC]*/, $array[0]); //MAC in Variable

	}
	
		}

Ich hab irgendwie das Gefühl das es beim Mac LMS ein klein bissel anderst ist…
Aber wenn es jetzt geht ist gut.
Vielleicht pack ich das jetzt noch in einen Case Switch und gut…

Danke euch beiden !

Kommando zurück… Nicht ganz.
Wenn z.B. die Squeezebox aus ist und ich direkt über das Squeeze Webinterface einen Favoriten starte bekommt IPS auch nix mit. Die Power Taste bleibt auf Aus stehen. Oh man… Irgendwo fehlt mir da noch ne Kleinigkeit.

Ihr habt den Server aber schon auf „Mitteilung“ mit „listen 1“ geschaltet.

Ansonsten bekommt ihr nur Meldungen wenn diese von IPS aus gesendet wurden.

Wollte Ihr immer alle Variablen aktuell halten muss der Server gesprächig sein und dies geschieht mit

SqueezeInit($box)

für die entsprechende Box.

Sollte der LMS neu gestartet werden muss von IPS aus das listen 1 ereut gesendet werden.

@Wolfgang
Ja - Hab ein Script SBInit wo ich ein listen 1 sende… Das kann ich ausschliessen…