[Archiv][Modul] Squeezebox (Testversion)

Nur ganz grob / oberflächlich, da ich hier kaum TCP/IP-Grundlagen vermitteln kann.
Der Unterschied ist einfach, das ein ServerSocket auf Verbindungen wartet (z.B. WebServer) und ein Client (z.B. Browser) sich auf diesen ServerSocket verbindet.
Ein ServerSocket kann also nur Verbindungen annehmen (auch mehrere gleichzeitig), aber nicht selber eine Verbindung zu einen Client aufbauen.
Wurde die Verbindung dann hergestellt, so können beide Seiten jeweils Daten an den Partner versenden (* IPS Serversocket kann nicht gezielt an einen Client Daten versenden).
Michael

Vielen dank für die Info, wenn ich also lediglich Daten an ein Gateway schicken will und dann kurz auf dessen Response warte reicht ein Clientsocket aus. Einen Server Socket bräuchte ich also nur wenn ich die Anfrage nicht von IPS aus initiiere sondern mir ein anderes Gerät Information an IPS schickt. Richtig?

Korrekt.
Dein Gateway stellt dann den ServerSocket.
Michael

Eine scheue Frage, wäre es möglich das da noch einzubauen:
<playerid> display <line1> <line2> <duration>
ich möchte auf einer Squeezebox v3 gerne die Temperatur der Maische beim Brauen anzeigen, Cheers :smiley:

Probier mal folgendes aus:

LSQ_RawSend(12345 /*[InstanzID vom Player]*/,'display',array('<line1>','<line2>','<duration>'),true);

Der Befehl ist aktuell noch nicht dokumentiert.

Erster Parameter ist die InstanzID vom Player.
Der Zweite das / die Commandos als String oder Array mit Strings.
Der Dritte ist der / die übergebenden Parameter für die Commandos, wieder als String oder Array mit Strings.
Der Letzte legt fest, ob der Player den Befehl quittieren muss (true) oder nicht (false).

Michael

Hallo Michael
Cool, ich kriege tatsächlich was aufs Display :slight_smile:
Jedoch leider nur für eine Sekunde, egal was ich als duration eingebe:

LSQ_RawSend(28804,'display','hallo','50',true);

Oh ich glaube da habe ich einen Fehler gemacht…

Bitte mal so versuchen:

LSQ_RawSend(28804,'display',array('Hallo','Welt','50'),true);  

display ist das Command und
<line1> <line2> <duration> sind als ein Array zu übergeben.

Ich habe es oben auch noch mal verbessert.
Michael

Das wars, so zieht die Duration. Ich Teste im Moment auf dem Transporter, da wird nur „Welt“ ausgegeben, ist vielleicht weil die alten Dinger nur eine Zeile haben oder ich die Schriftart zu gross eingestellt habe…?
Aber kein Problem, ich kann super damit leben :cool:
Vielen Dank für deine Hilfe!

LSQ_RawSend(33959,'display',array('Test','Das ist ein Test','10'),true);

Bei obigem Befehl wird nur „Test Das“ angezeigt. Bricht beim ersten Leerzeichen ab.

Umlaute gehen auch nicht.

Gruß

André

Da die Werte bei diesem Befehl nicht codiert werden (der RAW-Befehl weiss ja nicht was ihr da versendet), müssen die Zeichenketten vermutlich mit rawurlencode umgewandelt werden.
Michael

Habe seit heute ein Problem. Habe das Modul komplett entfernt und alle Instanzen Socket auch. Danach ncoh mal nach Anleitung aufgesetzt.
Schalte cih nun übers Webinterface kommt

und es passiert ncihts.

Gehe ich testweise auf den LMS um zu sehen ob der Player verbunden ist und schaltet dort, funktioniert es zwar eindfrei, aber es kommt die Fehlermeldung

Wo muss ich suchen, um den Fehler beheben zu können?

Vielen Dank

Marc

Mach mal ein Update von IPS.
Heute morgen gab es eine ‚fehlerhafte‘ Version.
Michael

Das hat leider keinerlei Verbesserungen gebracht…

Die erste Meldung besagt dass das Ziel-Gerät nicht mit dem LMS verbunden ist.
Was aber durch die zweite Meldung ein Folgefehler sein kann.
Diese besagt das IPS nicht die Daten an den Splitter weiterleiten kann.
Leider liege ich gerade flach, sonst hätte ich mir das mal angesehen.
Michael

Hab nun heute meine Sprachausgabe auf diese Modul umgestellt. Funktioniert.
Leider fehlt mir bei diesem Modul noch die Moeglichkeit rauszufinden ob ( Play,Pause oder Stop )
Muss das noch mit meinem alten Skript machen.
Nach der Sprachausgabe soll er ja wieder in diesen Modus zurueck.
Hier der Hauptteil wie er bei mir laeuft.

	LSQ_Pause ($InstanceID);                                       // aktuelle Ausgabe stoppen
   $aktueller_repeat = LSQ_GetRepeat ($InstanceID);               // Repeatmodus merken
	LSQ_SetRepeat ($InstanceID, 0);                                // Repeatmode auf 0
	$aktuelle_position = LSQ_GetPosition($InstanceID);					// aktuelle Position merken
   SaveVolumeInfo();                                              // aktuelle Volumes speichern
	ActivateVolumeSzenarium(5); 												// Sprachausgabe Volumes
	LSQ_SaveTempPlaylist ($InstanceID);                            // aktuelle Playlist merken
	$result = LSQ_LoadPlaylist ($InstanceID,$file);                // Ausgabefile laden
	LSQ_Play ($InstanceID);                                      	// Sprachausgabe
	sleep($laenge + 1); // Laenge des + 1 Sekunden                 // Warte
   LoadVolumeInfo();                                              // aktuelle Volumes laden
	LSQ_LoadTempPlaylist ($InstanceID);                            // aktuelle Playlist laden
	LSQ_SetRepeat($InstanceID, $aktueller_repeat);             		// Repeatmode auf alten Wert
	if ( $aktueller_modus == "play" )                              // nur wenn vorher Play dann ausfuehren
		{
		LSQ_Play ($InstanceID);                                     // Play
		$result = LSQ_SetPosition($InstanceID,$aktuelle_position); 	// an alte Position springen
		}

Ein Schoenheitsfehler gibt es noch.
Ich lade direkt eine WAV-Datei und dann kommt jedesmal folgende Meldungen im Log.

<br />
<b>Notice</b>:  Undefined index: Title in <b>C:\Program Files (x86)\IP-SYMCON\modules\IPSSqueezeBox\SqueezeBoxDevice\module.php</b> on line <b>1633</b><br />
<br />
<b>Notice</b>:  Undefined index: Artist in <b>C:\Program Files (x86)\IP-SYMCON\modules\IPSSqueezeBox\SqueezeBoxDevice\module.php</b> on line <b>1633</b><br />
<br />
<b>Notice</b>:  Undefined index: Bitrate in <b>C:\Program Files (x86)\IP-SYMCON\modules\IPSSqueezeBox\SqueezeBoxDevice\module.php</b> on line <b>1633</b><br />

Der Status steht doch in einer IPS-Variable :wink:
Ich werde auch in Zukunft (wenn das Modul den Status Testversion verliert) alle Get-Befehle entfernen für alle einfachen Daten welche in einer Statusvariable stehen.
Gibt dann als ‚Ersatz‘ noch die Möglichkeit eine Variable per RequestState oder ähnlich anzufordern.

Die notice-Meldungen kann ich demnächst unterdrücken, danke für die Info.
Michael

Danke!
Hab die ganze Zeit nach sowas wie „LSQ_GetMode“ gesucht.
Bleibt noch zu erwaehnen, wenn man ein File direkt angibt das im kompletten Pfad kein
Leerzeichen sein darf.

Bin im Kopf gerade noch nicht so fit… kann durchaus sein, dass da noch das richtige encoding des Pfad fehlt.
Ich schreib das mal auf die Todo.
Michael

Ich denke es haengt an dem explode und dem Leerzeichen.

    public function LoadPlaylist(string $Name)
    {
        $this->Init();
        $raw = $this->SendLSQData(new LSQData(array(LSQResponse::playlist, 'load'), array($Name, 'noplay:1')));
        $ret = rawurldecode(explode(' ', $raw)[0]);
        if (($ret == '/' . $Name) or ( $ret == '\\' . $Name))
            throw new Exception("Playlist not found.");
        return rawurldecode($ret);
    }

Ne, das ist nur die Auswertung der Antwort vom Server.
Es wird ja auch erst nach Leerzeichen getrennt (ist der Feldtrenner im Protokoll) und dann rawurldecode ausgeführt. Alle Zeichen im Protokoll müssen immer URLencodiert sein, wenn sich nicht zum Protokoll gehören.

Allerdings war der Befehl auch für Playlisten und nicht für Files gedacht [emoji14]
Wobei diese natürlich auch Leerzeichen enthalten könnten.
Ich weiß aber auch gerade nicht mehr wie weit ich damit schon war und es auch dokumentiert hatte… bin gerade etwas neben der Spur.
Ich hoffe das gibt sich zum 27.
Habe da noch so einige Baustellen offen :frowning:
Michael
PS: Du kannst mir sonst bitte mal die Ausgabe des Debug vom ClientSocket per PN senden. Wenn du ein File mit Leerzeichen aufrufst.