Die Software ist eine funktionsfähige Version, die in einigen Punkten auf die eigenen Bedürfnisse angepasst werden müssen. Wer Fehler entdeckt oder Verbesserungen hat, möge mich benachrichtigen.
Nachdem die allgemeine Abfrage der RFID-Karte durch den downloadbaren Adafruit-Sketch (Link bereits geblogged) sehr einfach ist, geht es jetzt um die Steuerung der Squeezegeräte und die Zusammenarbeit mit dem SqueezeCenter (heute Logitech Media Server = LMS).
Grundsätzliches
Alle Media Geräte der Squeezegruppe benötigen zum Abspielen von Musikinhalten einen Server. Das ist entweder der Server im Internet (mysqueezbox.com) oder wie bei mir der LMS, der auf einem Gerät im Netz läuft; einzelne Geräte haben einen Server in der internen SW (Squeezebox Touch).
Ich betrachte nur die Variante LMS im lokalen Netz. Die meist genutzte Betriebsart dürfte die Einzelsteuerung sein.
Jeder Player wird vom LMS individuell gesteuert. Um diese Individualität beizubehalten, ist bei einer RFID-Steuerung im Netz erforderlich, dem Server mitzuteilen, für welches Gerät der/die folgende/n Befehl/e gedacht sind. Diese Mitteilung an den LMS, welches Zielgerät gewünscht wird, übernimmt die DeviceCard.
Wenn es eine Einzelsteuerung gibt, muss es auch eine Gruppensteuerung geben. Über das Setup der Geräte kann man einzelne Gruppen bilden oder alle Geräte logisch zusammenschalten. Die Gruppenbildung kann nicht über diese Software vorgenommen werden!! Dazu reicht leider die Kapazität des Arduino nicht.
Alle Aktionen an einem Gerät innerhalb einer Gruppe wirken sich auf alle anderen in gleicher Weise aus! Ich bezeichne die Gruppensteuerung gerne als Partymode. In allen Räumen die gleiche Musik!
Wenn alle Geräte in Gruppensteuerung laufen, ist es unerheblich an welches Gerät der Datenstrom geleitet wird. Es betrifft ja ohnehin alle Geräte. Dann kann man sich die DeviceCard auch sparen.
Zur Software:
Ich beschreibe die SW in den wesentlichen Teilen, die projektspezifisch sind.
// ***** Squeezebox-Settings *****
uchar serNum[5]; // Seriennummer der gelesenen Karte
char namTmp[20]="SB%20Touch PC"; // Aktueller Gerätename mit default
char SBox[150]; // Reservierter Speicherplatz für die Zeichenkette an den Server
boolean steuerkarte=0; // Erkennungsflag, ob GeräteCard
In diesem Teil werden Speicherbereiche für bestimmte Inhalte reserviert. Ich arbeite bewusst nicht mit Strings, weil die unkontrolliert Speicherbereich belegen. Das führte bei mir dann dazu, dass irgendwann das Programm stehen bleibt. Also habe ich mit Hilfe des deutschen Forums umgestellt. Jetzt werden die oben gezeigten Speicherstellen gezielt "befüllt".
// +++++++++++++++++++++++++++ zur Information ++++++++++++++++++++++++++++
/**** Geräte-Karten-ID's unter denen die Geräte angesprochen werden ****
* const uchar Squeezebox01[5]={110,190,163,209,162}; //Squeezebox1 = SBClassic Wohnzimmer
* const uchar Squeezebox02[5]={222,225,153,209,119}; //Squeezebox2 = SBClassic Küche
* const uchar Squeezebox03[5]={30,211,170,209,182}; //Squeezebox3 = SBTouch
* const uchar SqueezeplayPC[5]={94,111,152,209,120}; //Squeezebox4 = SBTouch PC (Squeezeplay)
* const uchar SqueezeplayMAC[5]={158,29,168,209,250}; //Squeezebox5 = SBTouch MAC (Squeezeplay)
* const uchar SoftsqueezePC[5]={222,91,164,209,240}; //Squeezebox6 = SBClassic PC (Softsqueeze)
* const uchar iPengIPOD[5]={142,72,165,209,178}; //Squeezebox7 = SBiPeng (iPOD) */
In diesem Bereich sind lediglich die UID/PZ informativ aufgeführt. Könnte man auch löschen, wenn man möchte.
//**2-dimensionales Array für alle Squeezeboxen (DeviceCards)
const uchar Squeezebox[7][5]= {
{110,190,163,209,162},
{222,225,153,209,119},
{30,211,170,209,182},
{94,111,152,209,120},
{158,29,168,209,250},
{222,91,164,209,240},
{142,72,165,209,178} };
Es gibt im Ablauf zuerst einen Bereich, in dem überprüft wird ob es sich um eine DeviceCard handelt. Dazu müssen alle UID der DeviceCards bekannt sein.
//**2-dimensionales Array für alle Mac-Adressen
byte macAdrSbox[7][6]={
{0x00,0x04,0x20,0x00,0x00,0x00},
{0x00,0x04,0x20,0x00,0x00,0x00},
{0x00,0x04,0x20,0x00,0x00,0x00},
{0x00,0x15,0xaf,0x00,0x00,0x00},
{0x00,0x26,0xbb,0x00,0x00,0x00},
{0xe3,0xf8,0xd4,0x00,0x00,0x00},
{0x00,0x24,0x36,0x00,0x00,0x00} };
Der Befehl an den Logitech Media Server enthält die Zieladresse der angesprochenen Squeezebox. Diese Zieladresse muss SW-mäßig eingestellt werden. Deshalb stelle ich immer einen Default-Wert ein.
// +++++++++++++++++++++++++ Einstellen des aktuellen Default-Wertes ++++++++++++++++++++++++
//byte macAdrTmp[6]= {0x00,0x04,0x20,0x00,0x00,0x00}; //default SBClassic Wohnzimmer
//byte macAdrTmp[6]= {0x00,0x04,0x20,0x00,0x00,0x00}; //default SBClassic Küche
//byte macAdrTmp[6]= {0x00,0x04,0x20,0x00,0x00,0x00}; //default SBTouch
byte macAdrTmp[6]= {0x00,0x15,0xaf,0xab,0xcd,0xef}; //default SBTouch PC (Squeezeplay)
//byte macAdrTmp[6]= {0x00,0x04,0x20,0x00,0x00,0x16}; //default SBTouch MAC (Squeezeplay)
//byte macAdrTmp[6]= {0x00,0x04,0x20,0xab,0xcd,0xef}; //default SBClassic PC (Softsqueeze)
//byte macAdrTmp[6]= {0x00,0x04,0x20,0xab,0xcd,0xef}; //default SBiPeng (iPod)
Damit das einfacher geht, habe ich alle Möglichkeiten vorab aufgeführt, von denen ich mir eine aussuche. Für meine Testversuche war das sehr hilfreich.
//**2-dimensionales Array der Namen der Squeeezegeräte-Namen
// Hier nicht über 18 Zeichen hinausgehen! Sonst ändern!
char namSbox[7][18]={
{"SB-Classic%20(WZ)"},
{"SB-Classic%20(KU)"},
{"SB-Touch"},
{"SB-Touch%20PC"},
{"SB-Touch%20Mac"},
{"SB-Classic%20PC"},
{"SB-iPeng%20iPOD"} };
Wenn der Datenstrom auf ein anderes Squeezebox-Gerät umgeleitet wurde, wird eine Meldung für das neue Gerät generiert, dass der Datenstrom erfolgreich umgeleitet wurde. Wie das gemacht wird zeige ich später.
Nachricht auf SB-Touch PC |
Nachricht auf SB-Classic PC |
Die Bilder zeigen die Software-Varianten der SB-Touch und der SB-Classic.
Beim nächsten Mal sehen wir und den Codeschnipsel an, der für die Nachricht zuständig ist.
Keine Kommentare:
Kommentar veröffentlichen