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)