Squeezebox / Squeezeserver Skript

Da sich meine Squeezeboxen mittlerweile vermehren habe ich mir gedacht nutze diese doch als Durchsagegeräte.

Nichts einfacher als das und habe folgende Funktion dafür gebastelt.

//------------- Durchsage an Squeezebox ----------------------------------------
// parameters:
// (define) $box      = Name der Box oder MAC-Adresse
// (int)  $id_status    = ID der Statusvariable ob Box vor Durchsage AN oder AUS war
// (int)  $id_playlist_old  = ID der Variable für die Wiedergabeliste der entsprechenden Box
// (int)  $id_volume_old  = ID der Lautstärke-Variable der Box vor Durchsage
// (int)    $id_time_old      = ID der Positionsvariable in Sekunden
// (int)  $volume_durchsage = Lautstärke der Durchsage
// (array)  $array_mp3    = Pfade der Sounddateien
// (int)    $id_wf            = ID des Webfronts auf dem Meldung ausgegeben wird
// -----------------------------------------------------------------------------
function SqueezeDurchsage($boxname, $id_status, $id_playlist_old, $id_volume_old, $id_time_old, $volume_durchsage, $array_mp3, $id_wf) {
 include "getid3/getid3.php";        // Class zum Auslesen der Informationen einer Multimediadatei
 $box     = $boxname;            // Raum
 $status    = GetValue($id_status);          // Status Box An oder Aus
 $playlist_old  = GetValue($id_playlist_old);    // aktuelle Wiedergabeliste zwischenspeichern
 $volume_old  = GetValue($id_volume_old);      // aktuelle Lautstärke der Box zwischenspeichern
 $time_old  = GetValue($id_time_old);        // Position des aktuellen Titels merken (float Sekunden)
 $volume_durch  = $volume_durchsage;       // Lautstärke für Durchsage
 $mp3     = $array_mp3;                    // Array mit Audiodateien
 $id_webfront   = $id_wf;
 $offset        = 2;                             // Offset für längere Spielzeit
 // Informationen über die Mediadateien sammeln insbesondere Länge der Dateien
 $getID3 = new getid3;
 $laenge = 0;
 $playtime = array();
 
 foreach($mp3 as $key => $value) {
  $playtime[$key] = $getID3->analyze($mp3[$key]);
  IPS_Logmessage("Playtime", "Dauer von Media [".$key."] ".$value." ist ".$playtime[$key]['playtime_seconds']." Sekunden.");
  $laenge = $laenge + $playtime[$key]['playtime_seconds'];
 }
 $laenge = ($laenge + $offset ) * 1000;
 IPS_Logmessage("Playtime", "Gesamtdauer: ".round($laenge, 2)." ms");
 // Aktuelle Wiedergabeliste löschen
 $cmd= "playlist clear ";
 CSCK_SendText(SqueezeServer, $box." ".$cmd.chr(13));
 // Abzuspielende Dateien in die gelöschte Wiedergabeliste schreiben
 foreach($mp3 as $key => $value) {
  $cmd= "playlist add ".$value;
  CSCK_SendText(SqueezeServer, $box." ".$cmd.chr(13));
 }
 WFC_SendNotification($id_webfront, "Durchsage für ".round(($laenge/1000), 2)." Sekunden!","", "Speaker", ($laenge/1000)-1);
 SqueezeVolume($box, $volume_durch);
 $cmd = "play";
 CSCK_SendText(SqueezeServer, $box." ".$cmd.chr(13));
 // Warten bis Audiodateien abgespielt wurden
 IPS_Sleep($laenge); // Dauer ca. Gesamtspielzeit der Durchsage
 // Temporäre Wiedergabeliste wieder löschen
 $cmd= "playlist clear ";
 CSCK_SendText(SqueezeServer, $box." ".$cmd.chr(13));
 $SQ_Playlist = IPS_GetVariableProfile(".SQ_Playlist");                       // Variablenprofil in Array schreiben
 $SQ_Playlist_ID = $SQ_Playlist['Associations'][$playlist_old-1]['Icon'];
 // Alte Wiedergabeliste wieder starten
 $cmd = "playlist loadtracks playlist.id=";
 CSCK_SendText(SqueezeServer, $box. " ". $cmd . $SQ_Playlist_ID . chr(13));
 WFC_SendNotification($id_webfront, "Playlist", $SQ_Playlist['Associations'][$playlist_old-1]['Name']." wird neu gestartet.", "Speaker", 5);
 SqueezeVolume($box, $volume_old);
 $cmd = "time $time_old";
 CSCK_SendText(SqueezeServer, $box." ".$cmd.chr(13));
 
 // War die Box zuvor aus wieder ausschalten
 if(!$status) {
  SqueezePower($box, false);
 }
}

Diese Funktion ist eine Erweitung meines Squeezeskriptes und sollte so erst einmal nicht ohne weiteres auf anderen Squeeze-Skripten im Forum laufen da diese etliche Variablen benötigt die meine Skripte derzeit anbieten.

Als weiteres wird die Klasse getid3 benötigt die Ihr hier im Anhang findet. Die Klasse kann verdammt viel Informationen aus Mediendateien auslesen, ich benötige hier nur die Abspielzeit der eigentlich Durchsagen und in der Funktion damit arbeiten zu können.

[ol]
[li]Die Klasse einfach entpacken und den darin befindlichen Ordner getid3 komplett ins Skriptverzeichnis von IPS kopieren.[/li][li]Die oben stehende Funktion in eure inc_squeezebox ans Ende kopieren.[/li][/ol]Das folgende Skript zeigt ein Beispiel wie man durchsagen steuern kann.


<?
include('59910.ips.php'); // Squeeze-Funktionssammlung laden
// Sprachdatei generieren ------------------------------------------------------
$id_tts = 39243 /*[Tools\Squeezebox\Auswertung Squeezeboxen\Durchsagen\Text To Speech für SQ-Durchsagen]*/;
TTS_GenerateFile($id_tts, "  So ein scheiß Wind!", "L://Daten/mp3/IPSymcon/durchsage.wav", 35);
//------------- Durchsage an Squeezebox ----------------------------------------
// parameters:
// (define) $box      = Name der Box oder MAC-Adresse
// (int)  $id_status    = ID der Statusvariable ob Box vor Durchsage AN oder AUS war
// (int)  $id_playlist_old  = ID der Variable für die Wiedergabeliste der entsprechenden Box
// (int)  $id_volume_old  = ID der Lautstärke-Variable der Box vor Durchsage
// (int)    $id_time_old      = ID der Positionsvariable des Titels
// (int)  $volume_durchsage = Lautstärke der Durchsage
// (array)  $array_mp3    = Pfade der Sounddateien
// (int)    $id_wf            = ID des Webfronts auf dem Meldung ausgegeben wird
// -----------------------------------------------------------------------------
SqueezeDurchsage( Wohnzimmer,
      36142 /*[Tools\Squeezebox\Auswertung Squeezeboxen\Musik Büro\Power]*/,
      41742,
      47000 /*[Tools\Squeezebox\Auswertung Squeezeboxen\Musik Büro\Volume]*/,
      37989,
      20,
      array("K://IP-Symcon2/media/meldung.wav", "L://Daten/mp3/IPSymcon/durchsage.wav"),
      43269 /*[WebFront Hauptsteuerung]*/
     );
?>
 

Die TTS-Instanz wird nur dann benötigt wenn man sich Durchsagen selber durch IPS generieren möchte, ansonsten einfach eine beliebige Datei erzeugen und ins Array eintragen.

Der Aufruf der Funktion bzw. die benötigten Parameter sollte für Nutzer meines Skriptes verständlich sein.

Kleiner Hinweis zu meinem Array.

[ul]
[li]Die erste Datei ist ein Hinweiston um Aufmerksamkeit zu erreichen[/li][li]Die zweite Datei ist dann die eigentliche Durchsage die ich durch TTS erzeuge und anschließend abspiele.[/li][/ul]Ein kleines Manko hat diese Funktion noch was aber in Kürze noch beseitigt wird. Die Funktion muss derzeit für jede Box nacheinander aufgerufen werden, d.h. es spielt derzeit noch nicht parallel an mehreren Box gleichzeit ab.

Nun viel Spaß

getid3-1.9.3-20111213.zip (470 KB)

habe ein Problem beim Starten des Auswertungsskriptes, bekomme folgende Fehlermeldung.
Kann sich das einer von euch erklären???

so noch den Baum

Als allererstes heißt dein Includescript nicht 56479.ips.php sondern inc_squeezebox.php (rechte Spalte) und zweitens darfst Du das Skript nicht per Hand (Execute/Ausführen) starten. Es wird nur per RegisterVariable gestartet.

Die restlichen Fehler haben sich dann entweder erledigt oder wir suchen weiter. :slight_smile:

Hallo Werner,

kannst Du mir mal auf die Sprüge helfen, ich bastle ja gerade an meiner SQB Lösung für mein WF Player. Dank Deiner tollen Scripte, aus denen ich schon einiges exportiert habe, gehts auch gut vorwärts.:smiley:

Ich lade ja immer einen Ordner (auf meiner HDD) in die SQB, wie kann ich die Info bekommen wie die Playlist dann aussieht, wenn z.B. shuffle an ist… Kann ich die Info aus der SQB zurücklesen? Ich möchte quasi eine Liste mit der Reihenfolge und dem Namen der mp3 Dateien.

Hui,

gute Frage und dazu auch noch eine gute Idee.

Kommen über

<MAC> status 0 50 tags: <LF>

die Tracks in der Originalen oder geshuffelten Reihenfolge zurück.

Ansonsten kann ich es im Moment auch nicht beantworten.

Evtl. das LMS-Interface parsen, so bin ich auch auf manche Lösungen gekommen.

Werner, das klappt wunderbar, Danke!!!
Sogar mit shuffle funktioniert es.


.....
 [24] id:2731
 [25] title:Caruso
 [26] playlist index:1
 [27] id:2732
 [28] title:Non Ti Scordar Di Me
 [29] playlist index:2
 [30] id:2733
 [31] title:Il Canto
 [32] playlist index:3
....

Seltsam ist eigentlich nur das ich diese Abfrage bei mir auch nutze und es bei mir nicht korrekt angezeigt wird.
Hmmmm.

Hallo
Ich habe auch mehrere Boxen ( 3 + Squeezeplay ) und hab mir auch eine
„Durchsage“ gebastelt. Wie verhinderst du , dass dein Script gleichzeitig
mehrmals aufgerufen wirst? Ich hab mir dafuer ein Spooldir eingerichtet,
aber denk ich zu kompliziert?

Hier meine Durchsagescript als Info

//******************************************************************************
//	Name			:	Sprachausgabe.ips.php
//	Aufruf		:	Erstellen einer MP3-Datei im Spooldir danach dieses Script
//						aufrufen.Solange noch Files im Spooldir alle 10 Sekunden
//                probieren. ( IPS_Semaphore )
//                Wenn keine Files zum Ansagen Scripttimer auf 2 Minuten,
//                nur zur Sicherheit
// Info        :  Spooldir eingerichtet weil gleichzeitige Ausgabe
//                von Meldungen , von verschiedenen Scripts , moeglich ist.
//                Und dann kam Chaos !
//                Wenn nicht anwesend oder nicht wach MP3-Files im
//                Spooldir sammeln.
//                Wird dann bei anwesend und wach angesagt.
//
//******************************************************************************

   require_once("squeeze_func.ips.php");
   require_once("Funcpool.ips.php");

	$debug = false;

	$scriptid = $_IPS['SELF'];

	$x = GetValueBoolean(IPS_GetVariableIDByName("EINSTELLUNGEN.SPRACHAUSGABE",$root_settings));
	if (!$x) { IPS_SetScriptTimer($scriptid,120); return; }     										// wenn Sprachausgabe abgewaehlt dann raus
	$x = GetValueBoolean(IPS_GetVariableIDByName("STATUS.WACH",$root_status));
	if (!$x) { IPS_SetScriptTimer($scriptid,120); return; }    											// wenn nicht wach raus
	$x = GetValueBoolean(IPS_GetVariableIDByName("STATUS.ANWESEND",$root_status));
	if (!$x) { IPS_SetScriptTimer($scriptid,120); return; }    											// wenn nicht anwesend raus

   $dir        = IPS_GetKernelDir();
	$dir 	      = $dir . "voicereader\\";
	$spooldir   = $dir . "spooler\\";                                 								// Spooldirectory

	$files = scandir($spooldir);                                      								// sind MP3-Files zum Ansagen
	$files = array_slice($files,2);                                   								// ".." und "." weg

	if ( !$files )          																						// Keine Files zum ausgeben
		{
	   IPS_SetScriptTimer($scriptid,120);                                                     // Scripttimer auf 2 Minuten
		if ( $debug ) IPS_Logmessage("Sprachausgabe","Scripttimer auf 60");
		return;
		}
	IPS_SetScriptTimer($scriptid,10);      																	// In 10 Sekunden wieder probieren

	if (!IPS_SemaphoreEnter("SPRACHAUSGABE", 1000))                                           // Sprachausgabe sperren wenn noch ausgeben wird
		{
	  	IPS_LogMessage("Sprachausgabe","Script gesperrt!");
		return;
		}


	$file = $spooldir . $files[0];            																// erstes File ausgeben im Spooldir

	$squeezebox_alias = "WOHNEN";             																// Squeezebox WOHNEN - egal welche da alle sync

	if ( isset($file) )
		$meldung   = $file;
	else
		$meldung   = IPS_GetKernelDir() . "//Voicereader//test.mp3";                           // Testfunktion

	if ( !file_exists($meldung))
		{ IPS_LogMessage("Sprachausgabe","
Sprachfile nicht gefunden") ; return; }            // wenn File nicht gefunden raus

	$fadeinsec = 8 ;                    																		// Fadeinzeit nach der Ansage
	$volume    = 60;                    																		// Volume der Ansage

	$anzahl_player = squeeze_command("PLAYERS_PLAYERCOUNT");
	if ( $anzahl_player == 0 ) { echo "
Kein Player connected ! "; return; }                 // wenn kein Player connected dann raus

	$connected = squeeze_command("PLAYERS_PLAYERCONNECTED",$squeezebox_alias);
	if ( $connected == 0 )
		{ echo "
Player : ".$squeezebox_alias." nicht connected ! "; return; }                // wenn der Player nicht connected raus

   $mode = squeeze_command("PLAYLIST_MODE",$squeezebox_alias);       								// Modes merken ( Play , Pause , Stop )

	$aktuelle_repeat   = squeeze_command("PLAYLIST_PLAYLISTREPEAT",$squeezebox_alias,"?");    // Repeatmodus merken

	$aktuelle_position = squeeze_command("PLAYLIST_TIME",$squeezebox_alias,"?");              // aktuelle Position merken

	$aktuelle_volume   = squeeze_command("PLAYERS_PLAYERMIXERVOLUME",$squeezebox_alias,"?");  // aktuelles Volume merken

	$aktuelle_position = $aktuelle_position - 3 ;            											// aktuelle Position - 3 Sekunden
	if( $aktuelle_position < 0 ) $aktuelle_position = 0;     											// nicht kleiner als 0 werden

	squeeze_command("PLAYERS_PLAYERMIXERVOLUME",$squeezebox_alias,"-10");   						// Etwas leiser

	sleep(1);                                                                                 // kurz warten

	squeeze_command("PLAYLIST_STOP",$squeezebox_alias);                     						// Plaliste stoppen

	squeeze_command("PLAYLIST_PLAYLISTSAVE",$squeezebox_alias,"playlist");     					// aktuelle Playlist speichern

   squeeze_command("PLAYERS_PLAYERMIXERVOLUME",$squeezebox_alias,"0");        					// Volumen auf 0

	squeeze_command("PLAYLIST_PLAYLISTREPEAT",$squeezebox_alias,"0");          					// Repeatmode auf 0

	squeeze_command("PLAYERS_PLAYERMIXERVOLUME",$squeezebox_alias,$volume);    					// Volume auf Ausgabelevel

	squeeze_command("PLAYLIST_PLAYLISTPLAY",$squeezebox_alias,$meldung);       					// Meldung ausgeben

	$laenge = squeeze_command("PLAYLIST_DURATION",$squeezebox_alias);          					// Laenge der Ausgabe in Sekunden

	$laenge = ($laenge + 1 );                                                  					// Laenge plus 1 Sekunde

	sleep($laenge);                                                            					// warte bis Meldung beendet

	squeeze_command("PLAYLIST_PLAYLISTRESUME",$squeezebox_alias,"playlist noplay:1");   		// alte Playliste laden - mit noplay Option

	squeeze_command("PLAYERS_PLAYERMIXERVOLUME",$squeezebox_alias,$aktuelle_volume);    		// altes Volume einstellen

	squeeze_command("PLAYLIST_PLAYLISTREPEAT",$squeezebox_alias,$aktuelle_repeat);      		// altes Repeat einstellen

	if ( $mode == "play" )                                                              		// nur wenn vorher Play dann ausfuehren
		{
		squeeze_command("PLAYLIST_PLAY",$squeezebox_alias,$fadeinsec);                   		// Play mit fadein Sekunden
		squeeze_command("PLAYLIST_TIME",$squeezebox_alias,"+".$aktuelle_position);       		// an alte Position springen
		}
		
	unlink($file);                                                                      		// ausgegebenes File aus Spool loeschen
	
  	IPS_SemaphoreLeave("SPRACHAUSGABE"); 																		// Semaphore wieder freigeben!


Chaos dürfte eigentlich nicht passieren da ich auf der SQB ein Playliste einrichte, diese mit den abzuspielenden Dateien befüttere und dann erst abspiele.

Danach wird die Playliste gelöscht.

Von der Logik her sollte bei einem mehrfachen Ausführen die Playliste erweitert werden, habe ich aber noch nicht getestet.

Hallo Werner,
kannst du mir das mit den Parametern genauer erklären was ich wie und wo eintragen muss bei der Durchsage.
bekomm das irgendwie nicht hin.

Danke
Andi

Hallo Andi,

sind doch eigentlich beschrieben.

//------------- Durchsage an Squeezebox ----------------------------------------
// parameters:
// (define) $box = Name der Box oder MAC-Adresse
// (int) $id_status = ID der Statusvariable ob Box vor Durchsage AN oder AUS war
// (int) $id_playlist_old = ID der Variable für die Wiedergabeliste der entsprechenden Box
// (int) $id_volume_old = ID der Lautstärke-Variable der Box vor Durchsage
// (int) $id_time_old = ID der Positionsvariable in Sekunden
// (int) $volume_durchsage = Lautstärke der Durchsage
// (array) $array_mp3 = Pfade der Sounddateien
// (int) $id_wf = ID des Webfronts auf dem Meldung ausgegeben wird
// -----------------------------------------------------------------------------
function SqueezeDurchsage($boxname, $id_status, $id_playlist_old, $id_volume_old, $id_time_old, $volume_durchsage, $array_mp3, $id_wf) {
include "getid3/getid3.php"; // Class zum Auslesen der Informationen einer Multimediadatei
$box = $boxname; // Raum
$status = GetValue($id_status); // Status Box An oder Aus
$playlist_old = GetValue($id_playlist_old); // aktuelle Wiedergabeliste zwischenspeichern
$volume_old = GetValue($id_volume_old); // aktuelle Lautstärke der Box zwischenspeichern
$time_old = GetValue($id_time_old); // Position des aktuellen Titels merken (float Sekunden)
$volume_durch = $volume_durchsage; // Lautstärke für Durchsage
$mp3 = $array_mp3; // Array mit Audiodateien
$id_webfront = $id_wf;
$offset = 2; // Offset für längere Spielzeit

setzt aber mein Hauptskript voraus. Bin mir nicht sicher ob Du dieses im Einsatz hast.

ja, das hab ich im einsatz und funktioniert auch alles super.

muss ich die // bei den Parametern entfernen oder bleiben die?

Nein.

Die // sind ja nur ein Comment, sprich das ist ja die eigentlich Anleitung oder Beschreibung was unterhalb rein muss.

Habe leider die Beschreibung der Function gerade oben gepostet.

Hier der Aufruf der Funktion

<?
include('59910.ips.php'); // Squeeze-Funktionssammlung laden
// Sprachdatei generieren ------------------------------------------------------
$id_tts = 39243 /*[Tools\Squeezebox\Auswertung Squeezeboxen\Durchsagen\Text To Speech für SQ-Durchsagen]*/;
TTS_GenerateFile($id_tts, " So ein scheiß Wind!", "L://Daten/mp3/IPSymcon/durchsage.wav", 35);
//------------- Durchsage an Squeezebox ----------------------------------------
// parameters:
// (define) $box = Name der Box oder MAC-Adresse
// (int) $id_status = ID der Statusvariable ob Box vor Durchsage AN oder AUS war
// (int) $id_playlist_old = ID der Variable für die Wiedergabeliste der entsprechenden Box
// (int) $id_volume_old = ID der Lautstärke-Variable der Box vor Durchsage
// (int) $id_time_old = ID der Positionsvariable des Titels
// (int) $volume_durchsage = Lautstärke der Durchsage
// (array) $array_mp3 = Pfade der Sounddateien
// (int) $id_wf = ID des Webfronts auf dem Meldung ausgegeben wird
// -----------------------------------------------------------------------------
SqueezeDurchsage( Wohnzimmer,
36142 /*[Tools\Squeezebox\Auswertung Squeezeboxen\Musik Büro\Power]*/,
41742,
47000 /*[Tools\Squeezebox\Auswertung Squeezeboxen\Musik Büro\Volume]*/,
37989,
20,
array("K://IP-Symcon2/media/meldung.wav", "L://Daten/mp3/IPSymcon/durchsage.wav"),
43269 /*[WebFront Hauptsteuerung]*/
);
?> 

Dort siehst Du auch welche Variablen ich aus den bereits vorhandenen ich nutze.

ohje wie peinlich,

jetzt versteh ich das.
Danke

Kann ja passieren wenn es mir sogar beim erklären passiert ist :rolleyes:

Hallo,

zuerst mal vielen Dank Werner für die tollen Scripte :).
Ich habe jetzt auch ein Squeezebox Radio und konnte bisher fast alles problemlos umsetzen - ABER …

Ich sehe die Inhalte der Wiedergabelisten nicht. Da steht immer „Radiosender oder keine Wiedergabeliste vorhanden.“ (als HTMLBox ist sie definiert).
Die Variable „Wiedergabelisten (Rohdaten)“ wird leider nicht gefüllt.

Das was hier unseren Erklär-Bär stutzig gemacht hat, verwirrt auch mich ein wenig :confused:.

Woran könnte es denn eventuell liegen?

Gruß
Thorsten

Hallo Thorsten,

das Skript „Wiedergabelisten_starten.php“ ist im 2. Thread bzgl. der Wiedergabelisten drin, sollte Du aber bereits haben da ja mit einem Klick auf einen Button deiner Playlists diese auch gestartet wird.

Falls nicht die Datei aus dem Paket holen, in IPS entsprechend anlegen und die Variable „Wiedergabelisten Raum“ mit diesem Actionsskript versehen.

Sehe gerade das die Rohdaten garnicht gefüllt wird.

Lass mich noch ein wenig suchen…

Hast Du im Auswerteskript am Ende diese Daten stehen.

//===========================================================================
// Rohdaten Wiedergabelisten füllen
//===========================================================================
if($array[0] == 'playlists' and $array[1] == 'tracks' and $array[2] == 0) {
 SetValue(43991 /*[Tools\Squeezebox\Auswertung Squeezeboxen\Wiedergabelisten Inhalte\Wiedergabelisten (Rohdaten)]*/, $antwort);
}

Falls nicht einfügen und ID deiner Rohdatenvariablen anpassen.