Suche Musikalbenverwaltung für das WF

Kannst Du den relevanten Teil schon mal posten? Ich würde das gerne auf Werner’s Squeeze Skripte aufpfropfen :slight_smile:


    //---------------------------- Albumhandling --------------------------------
    
    $typ = GetValueInteger($sk_arr['id_sk_medium_typ']);
    if($typ == 3) //mp3_album
    {
        //------------------------- Alle Albumnamen einlesen ---------------------

        scan_alben();

        //--------------------- Alben für Webfront/Dashboard vorbereiten ---------

        //IPS_SetVariableProfileValues(integer $ProfilName, float $Mininlawert, float $Maximalwert , float $Schrittweite)
        IPS_SetVariableProfileValues("fm_wiedergabeliste_alben", 0, 29, 0);

        if($IPS_VARIABLE == $id_wiedergabeliste_album) //bei Albumwahl aus WF
        {
            SetValueInteger($id_wiedergabeliste_album, $IPS_VALUE); //Anzeige in WF Assoziation
            $album_aktuell_nr_alt    = GetValueInteger($sk_arr['id_album_counter']); //alte Album Nr. gespeichert
            $album_aktuell_nr            = GetValueInteger($id_album_aktuell_nr);
            if($album_aktuell_nr_alt != $album_aktuell_nr) //Wenn +/- 30
            {
            $album_aktuell_nr_alt    = $album_aktuell_nr;
                $erg1                            = $album_aktuell_nr_alt/30;
                $erg2                          = (int)$erg1;
                $album_aktuell_nr_neu    = $IPS_VALUE+($erg2*30); //neue Albumnummer
                SetValueInteger($sk_arr['id_album_counter'], $album_aktuell_nr_neu);
                SetValueInteger($id_album_aktuell_nr, $album_aktuell_nr_neu);
            }
            else
            {
               $erg1                            = $album_aktuell_nr_alt/30;
                $erg2                          = (int)$erg1;
                $album_aktuell_nr_neu    = $IPS_VALUE+($erg2*30); //neue Albumnummer
                SetValueInteger($sk_arr['id_album_counter'], $album_aktuell_nr_neu);
                SetValueInteger($id_album_aktuell_nr, $album_aktuell_nr_neu);
            }
          }

        if($IPS_VARIABLE == $id_akteuller_albumname_dash)
        {
            $album_aktuell_nr    = GetValueInteger($id_album_aktuell_nr); //von Dash gesetzt
            $erg1                    = $album_aktuell_nr/30;
            $erg2                  = (int)$erg1;
            $diff                = $album_aktuell_nr-($erg2*30);
            SetValueInteger($sk_arr['id_album_counter'], $album_aktuell_nr); //Album Nr. aus Dash kommend
            SetValueInteger($id_wiedergabeliste_album, $diff); //Anzeige in WF Assoziation
        }
        if($raum == "wf" or $raum == "dash")
        {
            $album_aktuell_nr    = GetValueInteger($sk_arr['id_album_counter']); //alte Album Nr. gespeichert
            $erg1                    = $album_aktuell_nr/30;
            $erg2                  = (int)$erg1;
            $diff                = $album_aktuell_nr-($erg2*30);
            SetValueInteger($id_album_aktuell_nr, $album_aktuell_nr);
            SetValueInteger($id_wiedergabeliste_album, $diff); //Anzeige in WF Assoziation
        }

        //WF
        if($IPS_VARIABLE == $id_album_vor_zur)
        {
           $album_vor_zur                     = GetValueInteger($id_album_vor_zur); //+30 oder -30
            $album_vor_zur_counter             = GetValueInteger($id_album_aktuell_nr); //Conterstand

           if($album_vor_zur == 1) //Minus
           {
                if($album_vor_zur_counter <30)
                {
                    SetValueInteger($id_album_aktuell_nr, 0);
                }
                else
                {
                    SetValueInteger($id_album_aktuell_nr, $album_vor_zur_counter-30);
                }
              }
               else //Plus
           {
                SetValueInteger($id_album_aktuell_nr, $album_vor_zur_counter+30);
            }
            
              $album_aktuell_nr    = GetValueInteger($id_album_aktuell_nr);
            $erg1                    = $album_aktuell_nr/30;
            $erg2                  = (int)$erg1;
            $diff                = $album_aktuell_nr-($erg2*30);
       }

       if($IPS_VARIABLE == $id_album_vor_zur or $raum == "dash" or $raum == "wf" or $IPS_VARIABLE == $id_akteuller_albumname_dash)
       {
            $i = 0;
            for($i; $i<=29; $i++)
            {
                //IPS_SetVariableProfileAssociation(integer $ProfilName, float $Wert, string $Name, string $Icon, integer $Farbe)
               $name = $i+($erg2*30);
                  IPS_SetVariableProfileAssociation("fm_wiedergabeliste_alben", $i, $dir[$name], "", 290);
            }
        }


Mitten aus dem Script das Wesentliche, unformatiert und unbehandelt…
Das Gesamtwerk ist ca. 1200 Zeilen lang. Hier sind natürlich auch noch Teile des Dashboardinterface enthalten. Einfach fragen bei Unklarheiten.:wink:

Danke. Wie sieht denn die Funktion „scan_alben“ aus?


	function scan_alben()
	{
		global $mus_dir_alben;
		global $dir;
		$dir = Array();
		
		$dir = scanDir($mus_dir_alben);

		$i = 0;
		foreach($dir as $filename)
		{
			$typ = filetype($mus_dir_alben."\\".$filename); // Typ ermitteln
			if($filename == ".")	unset($dir[$i]);  //  . filtern
			if($filename == "..")	unset($dir[$i]);  // .. filtern
			if($typ != "dir") 		unset($dir[$i]);  // nur Pfade zulassen
			$i++;
		}

		$dir = array_values(array_diff($dir, array(''))); //leere Index entfernen und neu sortieren
		return $dir;
	}

$mus_dir_alben ist das Musikvz. in dem meine Alben in Untervz. liegen, $dir wird als array zurückgegeben, dort befinden sich dann alle Albennamen.

Guten Abend =)
Also ich hätte Interesse an einem Installscript und der ganzen Verwaltung für das WF!

Das ganze wäre super geeignet um die Vorhanden (aber zzt. ausserbetrieb) Lautsprecher in Bad und Küche mit einer Soundkarte und 2 kleinen günstigen Endstufen zu befeuern.

Gruß Daniel

Hallo Daniel,

mit dem Installscript ist das schon ein großer Aufwand, das wird in nächster Zeit nix, ich bin in meiner Firma z.Z. extrem angebunden. Wenn Du gute PHP Kenntnisse hast kann ich Dir aber gern meinen Quellcode zu Verfügung stellen.

Hallo Thomas,

Schade eiegentlich aber kann man nix machen, bei stehen auch grad wieder Prüfungen an. Bei Vollzeit Arbeiten & Abendschule ist es um der Freizeit auch so ne Sache.

Danke für das Angebot mit dem Quellcode, ich bezweifle nur ein wenig das die 2 1/2 Wochen PHP Programmier Erfahrung dafür ausreichen. Anderseits lernt man mit den Aufgaben. :wink: Ich denke du wirst am besten Beurteilen können ob das für einen Anfänger machbar ist.

Gruß Daniel

Da kann ich mithalten :stuck_out_tongue:

@andy01

kannst du deine Entertaiment methode näher beschreiben?

Sieht gut aus;)

Gruß

Das kann ich machen, was möchtest du den genau wissen?

habe in 4 verschiedenen Räumen Lautsprecher die ich über IP-Symcon bespiele aus meiner Verteilung

Verstärker sind in der Verteilung verbaut.

MP3 sowie Radio bekomme ich absolut synchron hin.
Eine Dreambox streamt mir die Radiosender ins Netzwerk die ich mit der Mediaplayer Instanz von IP-Symcon abspiele.

MP3 habe ich einen Ordner gemacht mit Musik, unter diesem Ordner kann ich weitere Ordner anlegen die meine „Alben“ sind… die lese ich über einen Button in der Rubrik Extras ein.

So kann ich dann das jeweilige Album auswählen… die MP3s werden eingelesen und über die Wiedergabeliste angezeigt…

Über Play spielt er mir das komplette Album ab, zeigt mir über das Orange hinterlegte wo er sich momentan befindet in der Playlist… über klick auf ein Titel wird der jeweilige Titel sofort abgespielt und von da aus dann wieder die Playlist weiter nach unten.

gibts auch auf IPSView.

oder auf meinem IPhone:

Was soll ich noch erzählen? wenn die Haustüre klingelt… fahre ich die Musik auf einen eingestellten wert, lass die Haustüre dann klingeln und fahre dann die Musik auf die vorher eingestellte Lautstärke.

Lautstärke der Haustürklingel kann man einstellen.

sooo ich könnte noch ewig weiter erzählen :-D… auf Nachfrage gerne.

Mfg Andy

andy,
das sieht großartig aus!
Respekt!

Werde mich demnächst auch mal daran wagen.
Die ganze Verstärker-/Lautsprecher-Verwaltung hab ich schon fast fertig (das meiste läuft via Airplay).

Die ganze MP3-Verwaltung und vor allem das Einlesen von Ordnern/Alben in IPS interessiert mich aber.
Vor allem mit der Möglichkeit, die Titel als klickbare Buttons auszuführen. Magst du mal dein Skript dazu posten?

Dankö!

Alben einlesen:

15350 => Integervariable
59687 => Stringvariable

<?
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
$dir    = 'C:\Users\Public\Music/';

    $profil="Albumauswahl";
      IPS_DeleteVariableProfile($profil);
      IPS_CreateVariableProfile($profil,1);
      IPS_SetVariableCustomProfile(15350 /*[Entertainment\MP3\Albumauswahl]*/ ,$profil);
      SetValue(59687 /*[Entertainment\MP3\Ordnerbezeichungen]*/ , "");
      
$files = scandir($dir);



$i=0;
foreach ($files as $datei) { // Ausgabeschleife
   if (($datei[$i]<>".") and ($datei[$i]<>"..")) {         // die "Dateien" . und .. auslassen
      if (is_dir($dir.$datei)) {
   		IPS_SetVariableProfileAssociation($profil,$i,$datei,"", -1);
			$erweit = GetValue(59687 /*[Entertainment\MP3\Ordnerbezeichungen]*/ );
   		SetValue(59687 /*[Entertainment\MP3\Ordnerbezeichungen]*/ , $erweit.$datei.'#');
   		$i++;
   	}
   }
};
//IPS_SetVariableProfileAssociation($profil,$j,$files[$i],"");
?>

MP3s einlesen und Liste erstellen

jquery.nicescroll.340 bei google Downloaden
inuyaksa/jquery.nicescroll · GitHub

user/IPSJS/ips_functions.js

// V1.00	10.06.2015 - Erstes Release

// Diese Javascript Funktionen bilden die in PHP zur Verfügung stehenden Funktionen ab.
// Somit sind diese auch in einer HTMLBox verfügbar. Wer Ahnung hat was er tut, kann hier
// ganz einfach weitere benötigte Funktionen ergänzen. Gleichzeitig muss aber auch die
// ips_injector.php Datei angepasst werden. 
// Wer nicht damit klar kommt, kann mich gerne unter der EMail Adresse kontaktieren.
//
//  © by Kevin Heidrich 2015
//	kevinheidrich@me.com
//  Web: www.kh-solutions.de


function SetValue(variableID,value)
{
	$.post( "/user/IPSJS/ips_injector.php", {"method" : "SetValue", "variableID" : variableID, "value" : value},function( data ) { console.log(data); });
}

function SetValueBoolean(variableID,value)
{
	$.post( "/user/IPSJS/ips_injector.php", {"method" : "SetValueBoolean", "variableID" : variableID, "value" : value},function( data ) { console.log(data); });
}

function SetValueFloat(variableID,value)
{
	$.post( "/user/IPSJS/ips_injector.php", {"method" : "SetValueFloat", "variableID" : variableID, "value" : value},function( data ) { console.log(data); });
}


function SetValueString(variableID,value)
{
	$.post( "/user/IPSJS/ips_injector.php", {"method" : "SetValueString", "variableID" : variableID, "value" : value},function( data ) { console.log(data); });
}

function SetValueInteger(variableID,value)
{
	$.post( "/user/IPSJS/ips_injector.php", {"method" : "SetValueInteger", "variableID" : variableID, "value" : value},function( data ) { console.log(data); });
}

function IPS_Execute(programmpfad,parameter,dummy,warten)
{
	$.post( "/user/IPSJS/ips_injector.php", {"method" : "IPS_Execute", "programmpfad" : programmpfad, "parameter" : parameter, "dummy" : dummy, "warten" : warten},function( data ) { console.log(data); });
}

function IPS_RunScript(scriptID)
{
	$.post( "/user/IPSJS/ips_injector.php", {"method" : "IPS_RunScript", "scriptID" : scriptID},function( data ) { console.log(data); });
}

function WAC_SetPlaylistPosition(variableID)
{
	$.post( "/user/IPSJS/ips_injector.php", {"method" : "WAC_SetPlaylistPosition", "variableID" : variableID},function( data ) { console.log(data); });
}

user/IPSJS/ips_functions.php

<?php

// V1.00	10.06.2015 - Erstes Release

// Diese Datei stellt die von IPS in PHP zur Verfügung gestellten Funktionen bereit. 
// Sie werden über Javascript Funktionen per Ajax aufgerufen. Siehe ips_functions.js
// Wer Ahnung hat was er tut, kann hier ganz einfach weitere benötigte Funktionen ergänzen. 
// Gleichzeitig muss aber auch die ips_injector.php Datei angepasst werden. 
// Wer nicht damit klar kommt, kann mich gerne unter der EMail Adresse kontaktieren.
//
//  © by Kevin Heidrich 2015
//	kevinheidrich@me.com
//  Web: www.kh-solutions.de
	if ($_POST["method"] == "WAC_SetPlaylistPosition") {
		WAC_SetPlaylistPosition(58664, (int)$_POST["variableID"] + 1);
		WAC_SetPlaylistPosition(42069, (int)$_POST["variableID"] + 1);
		WAC_SetPlaylistPosition(22157, (int)$_POST["variableID"] + 1);
		WAC_SetPlaylistPosition(18367, (int)$_POST["variableID"] + 1);
		
		WAC_Play(42069);
		WAC_Play(22157);
		WAC_Play(58664);
		WAC_Play(18367);
	} else if ($_POST["method"] == "SetValue") {
		SetValue((int)$_POST["variableID"],$_POST["value"]);
	} else if ($_POST["method"] == "SetValueBoolean") {
		SetValueBoolean((int)$_POST["variableID"],$_POST["value"]);
	} else if ($_POST["method"] == "SetValueFloat") {
		SetValueFloat((int)$_POST["variableID"],$_POST["value"]);
	} else if ($_POST["method"] == "SetValueInteger") {
		SetValueInteger((int)$_POST["variableID"],$_POST["value"]);
	} else if ($_POST["method"] == "SetValueString") {
		SetValueString((int)$_POST["variableID"],$_POST["value"]);
	} else if ($_POST["method"] == "IPS_Execute") {
		IPS_Execute($_POST["programmpfad"],$_POST["parameter"],$_POST["dummy"],$_POST["warten"]);
	}else if ($_POST["method"] == "IPS_RunScript") {
		IPS_RunScript((int)$_POST["scriptID"]);
	}else{
		IPS_MessageLog("IPS JS Injector","Command unknown!");
	}
?>

da bedanke ich mich für den Code von Kevin Heidrich, den ich noch ein wenig erweitert habe.

39701 => Stringvariable Anzeige welches Album abgespielt wird.
57170 => HTML Box

<?
// Hier gibt man den Ordner an, in dem die Musik-Dateien liegen:
$ordnernum = GetValue(15350 /*[Entertainment\MP3\Albumauswahl]*/ );
$ordnerbezeichnung = GetValue(59687 /*[Entertainment\MP3\Ordnerbezeichungen]*/ );

$namen = explode("#" ,$ordnerbezeichnung);

$path = "C:\Users\Public\Music\/".$namen[$ordnernum];

$playlist = array();

// Diese Funktion durchsucht den Ordner und überprüft, dann ob es sich um
// einen Unterordner oder eine Datei handelt.
// Ist es ein Unterordner, so ruft sich die Funktion selbst wieder auf und prüft
// innerhalb von diesem weiter, ist das gefunden Objekt eine Datei, so wird
// geprüft, ob diese ein zugelassenes Dateiformat hat und fügt diese, sollte das
// der Fall sein in das Playlist-Array ein.
function getDirectoryTree($path, &$playlist)
{
    $content = scandir($path);
    $maindata = array_diff($content, Array(".",".."));

    // Hier gibt man die Dateitypen an, welche in die Playlist eingelesen werden sollen:
    $allowed = Array("mp3", "wma");

    foreach($maindata as $d)
    {
        $actpath = $path . "\\" . $d;
        if(is_dir($actpath))
        {
            getDirectoryTree($actpath, $playlist);
        }
        else
        {
            $ext = pathinfo($actpath, PATHINFO_EXTENSION);
            if(in_array(strtolower($ext), $allowed))
            {
                $playlist[] = $actpath;
            }
        }
    }
}

getDirectoryTree($path, $playlist);
$aktuelles_Projekt = '
<script type="text/javascript" src="/user/IPSJS/ips_functions.js"></script>
<script src="/user/jquery.nicescroll.340/jquery.nicescroll.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
<style type="text/css">
<!--
.row_0 {
    background-color:        #2E2E2E;
}
.row_0:hover {
    background-color:        #848484;
}
.row_1 {
    background-color:        #1C1C1C;
}
.aktiv {
    background-color:        #FF4000;
}
.row_1:hover {
    background-color:        #848484;
}

#title { padding-top:5px; padding-bottom:5px; cursor: default;}

@media only screen
and (min-device-width : 320px)
and (max-device-width : 480px) {

#title { padding-top:30px; padding-bottom:30px; cursor: default;}

}

-->
</style>
<script>
$(document).ready(

	$("html").niceScroll({styler:"fb",cursorcolor:"#000"});
	$("#scroll").niceScroll();

);
</script>
';
// Durchlaufen des Playlist-Arrays und anhängen an die Mediaplayer-Instanz-Playlist
$aktuelles_Projekt .= '<div id="scroll" style="-webkit-text-size-adjust:300%; -webkit-overflow-scrolling: touch; -webkit-transition: -webkit-transform 0ms; -webkit-transform-origin: 0px 0px; -webkit-transform: translate3d(0px, 0px, 0px); overflow-x:scroll; height:400px;"><div><h4>Titel vom Album: '.$namen[$ordnernum].'</h4></div>';

$i = 0;
foreach($playlist as $data)
{
	if(WAC_GetPlaylistPosition(42069 /*[Entertainment\Einstellungen\Wohnzimmer\Wohnzimmer]*/) == $i+1 AND GetValueString(39701 /*[Entertainment\Player\Album]*/  ) == $namen[$ordnernum]) {
	   $css = 'aktiv';
	}else{
	   $css = 'row_'.$i % 2;
	}

        $aktuelles_Projekt .= '<div onclick="WAC_SetPlaylistPosition('.$i.');" id="title" class="'.$css.'" style="padding-left:10px; border-bottom-style:solid; border-bottom-width:1px; border-bottom-color:black;">'.basename($data, '.mp3').'</div>';
$i++;
}
$aktuelles_Projekt .= "</div>";
SetValueString(57170 /*[Entertainment\MP3\Album]*/ , $aktuelles_Projekt);
?>

und jetzt entschuldige ich mich für das unschöne Programmieren.

MfG Andy

Hey Andy… schön das jemand diesen Anfang gebrauchen konnte. :slight_smile:

Wollt eben anmerken, dass „onclick“ bei mir auf Touch Geräten nicht funktioniert. Wie siehts bei dir aus? Das muss dann noch mit jquery was ergänzt werden. Nicht das sich jemand wundert, warum nix passiert.

Gruß
Kevin

Spoosie,

Das kann ich nicht bestätigen… Jquery ist eingebunden und onclick funktioniert mit dem Code den ich gepostet habe auf Android wie auch auf iOS.

Gruß Andy

Okay… dann vllt nur auf dem Internet Explorer. Bei mir gehts zumindest nicht auf dem Terminal. Leider läuft mir bei FF und Chrome regelmäßig der Speicher voll. Muss mal wieder updaten und testen.

Gruss

@spoosie:
ja, im IE geht es nicht. Der IE nimmt das JavaScript einfach nicht (im Debugger: undefinded function).
Hier im Forum gibt’s auch irgendwo nen Thread dazu („JavaScript in html box“ oder so)

@Andy: ich kriegs noch nicht ganz zum Laufen. Mir fehlt in den Scripten doch noch irgendwo ein „WAC_AddFile(…)“.
Sobald ich einen Track anklicke macht er WAC_SetPlaylistPosition welches mit dem Fehler quittiert wird, dass die Playlist der MediaPlayer-Instanz leer ist.

Grüße,
ika

oh, tut mir leid… hatte ich irgendwie vergessen…

habe noch eine integer variable gemacht mit einem Text „Einlesen“

das der code dazu:

<?

// Hier gibt man den Ordner an, in dem die Musik-Dateien liegen:

$ordnernum = GetValue(15350 );
$ordnerbezeichnung = GetValue(59687 );

$namen = explode("#" ,$ordnerbezeichnung);

$path = "C:\Users\Public\Music\/".$namen[$ordnernum];


//Album Titel hinzufügen
SetValueString(39701 , $namen[$ordnernum]);

$playlist = array();

// Diese Funktion durchsucht den Ordner und überprüft, dann ob es sich um
// einen Unterordner oder eine Datei handelt.
// Ist es ein Unterordner, so ruft sich die Funktion selbst wieder auf und prüft
// innerhalb von diesem weiter, ist das gefunden Objekt eine Datei, so wird
// geprüft, ob diese ein zugelassenes Dateiformat hat und fügt diese, sollte das
// der Fall sein in das Playlist-Array ein.
function getDirectoryTree($path, &$playlist)
{
    $content = scandir($path);
    $maindata = array_diff($content, Array(".",".."));

    // Hier gibt man die Dateitypen an, welche in die Playlist eingelesen werden sollen:
    $allowed = Array("mp3", "wma");

    foreach($maindata as $d)
    {
        $actpath = $path . "\\" . $d;
        if(is_dir($actpath))
        {
            getDirectoryTree($actpath, $playlist);
        }
        else
        {
            $ext = pathinfo($actpath, PATHINFO_EXTENSION);
            if(in_array(strtolower($ext), $allowed))
            {
                $playlist[] = $actpath;
            }
        }
    }
}

getDirectoryTree($path, $playlist);

$bad = 58664  /*Mediaplayer ID*/;
$wohn = 42069  /*Mediaplayer ID*/;
$aussen = 22157  /*Mediaplayer ID*/;
$schlafen = 18367 ;


// Leeren der vorher bestehenden Playlist:
WAC_ClearPlaylist($bad);
WAC_ClearPlaylist($wohn);
WAC_ClearPlaylist($aussen);
WAC_ClearPlaylist($schlafen);
//shuffle($playlist);

// Durchlaufen des Playlist-Arrays und anhängen an die Mediaplayer-Instanz-Playlist

foreach($playlist as $data)
{
        WAC_AddFile($bad, $data);
        WAC_AddFile($wohn, $data);
        WAC_AddFile($aussen, $data);
        WAC_AddFile($schlafen, $data);
}
$pl = WAC_GetPlaylistLength(42069 );
SetValueInteger(10789  , $pl);

?>

muss halt noch anpassen für dich dann…

bei Fragen einfach melden :wink:

jetzt kannst das album auswählen und dann musst einlesen klicken… habe das so gemacht das man hin und her switchen kann falls man einen titel sucht oder ein radio sender grad läuft.

Moin,

geile Sache … muss ich auch mal ausprobieren !
Kannst du vielleicht nochmal was zum Aufbau sagen.
PC Ausgang (Soundkarte mit vier Kanälen??)-> Verstärker (Welche?) -> Lautsprecher

Ist es auch möglich in den vier Räumen unterschiedliche Musik zu spielen ?!

Das wäre sehr nett von dir :slight_smile:

was soll ich sagen, das gern Stück ist ein Industriepc, mit 4 Soundkarten

Verstärker sind 250W 12V 5A Endstufen die ich über 2 Meanwall 12V 10A Netzteil versorgen 2 Verstärker je Netzteil…

Netzteil wie Verstärker schalte ich ab und an… bedeutet Verstärker 1 an Netzteil 1 an, Verstärker 2 an Netzteil 1 an, beide Verstärker aus -> Netzteil aus…

Programmiert ist meins so das in allen 4 Räumen die gleiche Musik kommt, (Kundenwunsch)
es ist natürlich aber auch kein Problem unterschiedliche Musik in den 4 Räumen abspielen zu lassen oder eine Zonenverwaltung zu schreiben. Ist halt Programmieraufwand… sowie Player Synchronisieren.

Kundenwunsch bei mir war nur, Lautstärkeregelung in den unterschiedlichen Räumen und diese über MDT KNX Glastaster auch vorort, links klick Musik An (Einstellungen ist ein Standartradiosender hinterlegt der über das starten über den Taster angewählt wird)
rechte Taste Musik aus… links lange laut, rechts lange leise…

MfG Andy