Erste Erfahrungen mit MQTT

Hallo Leute,

aktuell versuche ich gerade Sharepoint-Sync (GitHub - mikebrady/shairport-sync: AirPlay audio player. Shairport Sync adds multi-room capability with Audio Synchronisation) über MQTT in IP-Symcon einzubinden. Da stehe ich noch ganz am Anfang und werde wahrscheinlich noch die eine oder andere Frage haben.
Drei Dinge sind mir aufgefallen:

  1. Die Abbildung im Objektbaum wird „verzerrt“ wenn der Wert sehr „groß“ ist

  2. ebenso im MQTT-Konfigurator

  3. das für mich überraschenste war jedoch dass ich nun mit meinem iPhone die Pro-Konsole zum Neustart „provozieren“ konnte!
    Immer dann wenn ein Titelwechsel war wurde die Pro-Konsole getrennt und startete neu in der Starteinstellung. Wenn ich also im iPhone bewußt einen Titel springen wollte war das selber Verhalten zu beobachten… Das Verhalten war auch im Google-Chrome nachvollziehbar.

Joachim

Hallo Joachim,

den Neustart haben wir tatsächlich auch schon entdeckt. Der kommt, wenn man in einen String Nicht-UTF-8-Zeichen schreibt. Das werden wir aber noch abfangen.

Der Zeilenumbruch bzw. die Verschiebung ist allerdings spannend. Kannst du den passenden Wert mal hier rein kopieren? Ggfs. ist es clever den vorher zu codieren, damit die Informationen über verschiedene Arten von Leerzeichen nicht verloren gehen, beispielsweise per PHP-Funktion bin2hex.

Da ich nicht weiß, wie fit du mit PHP bist, wäre das einmal folgendes PHP-Skript um den Wert der von dir im Screenshot dargestellten Variable mit der ID 31888 (ich hoffe ich lese das richtig) auszugeben:

<?php

$variableID = 31888;
var_dump(bin2hex(GetValue($variableID)));

Wenn die Anzeige also verschoben ist, einfach das Skript hier ausführen und die Ausgabe hier posten, dann kann ich von da aus super weitermachen.

Hallo Niels,

die Ausgabe ist zu groß für die Abbildung hier
Ausgabe.txt (194,9 KB)

Deswegen als txt-Datei im Anhang.

Vermutlich ist das das Cover.

Joachim

…bei der Gelegenheit:

Wie bindet man das Cover korrekt in ein Media-Objekt ein?
Ich habe im Modul ein Media-Objekt eingebunden.
Ich versuche es aktuell so zu füllen:

case $MainTopic."/ssnc/PICT": // Cover
		IPS_SetMediaContent($this->GetIDForIdent("Cover_".$this->InstanceID), $Payload."jpg");  
		IPS_SendMediaEvent($this->GetIDForIdent("Cover_".$this->InstanceID));
		break;

In der Beschreibung zu diesem MQTT-Wert steht:

  • PICT – the payload is a picture, either a JPEG or a PNG. Check the first few bytes to see which.
    Wie erkenne ich aus den „first few bytes“ das Dateiformat? Muss ich noch eine Base64Codierung vornehmen?

Gibt es dazu vielleicht auch schon ein Beispiel?

Joachim

Ich gehe Mal davon aus das dein $Payload die Rohdaten (bin) sind.
Dann kannst du den Typ so ermitteln (egal welches Format).

$ImagaData = @getimagesize('data://text/plain;base64' . base64encode($Payload));

Echo $ImageData['mime'];

Wobei der Typ eigentlich egal ist, solange Symcon es unterstützt, musst du es nur in das MedianObjekt werfen.

Ja.
base64encode($Payload) für IPS_SetMediaContent benutzen.
Michael

Hallo Michael,

erst einmal vielen Dank für die Erläuterung.

Da ist aber etwas anderes noch nicht ganz in Ordnung…

Wenn ich über den MQTT-Konfigurator eine Instanz anlege sind die Daten im Verzeichnisbaum sichtbar (die Menge der Daten führt wohl zu der Verschiebung in der grafischen Darstellung), die Datei ist ja oben als txt hinterlegt.

In meinem Modul kommen diese aber nicht vollständig an - Payload ist leer…

Kann es an der Datenmenge liegen (anhand der txt-Datei würde ich sie mal auf um und bei 200kB schätzen)? Hat die Übertragung zum Modul irgendeine Größenbeschränkung?
Alle anderen Daten sehen so weit vollständig aus, nur beim Cover ist der Payload leer.

Von Shairport-Sync kommen die Daten ja auch im IP-Symcon an wenn ich ein einzelnes Device aus dem Konfigurator anlege…

Joachim

Zeig doch Mal was du bisher hast.
Hast du eine Debug Ausgabe des Datenpaket versucht?

Das payload ist ja bin, also musst du vermutlich es einmal mit utf8_decode verarbeiten.
Michael

Hallo Michael,

der Beginn des Moduls ist hier:

Der Datenempfang aktuell ab Zeile 88, die Bildauswertung ab Zeile 140.

UTF-8 ist aktuell überall raus, hatte ich drin, wollte ausschließen das es daran liegt.
debug_10371.txt (851,3 KB)

In der Debug-Datei mal nach „PICT“ suchen - keine Daten sichtbar. In der durch die Konfigurator erstellten Instanz sind aber Datei enthalten (siehe weiter oben).

Joachim

Nachtrag: Wenn ich die Instanz für „PICT“ aus dem Konfigurator heraus erstelle, dann kommt es zu der Situation die ich oben bereits beschrieben habe: Wenn für „PICT“ neue Daten kommen setzt sich die Prokonsole auf „Start“ zurück.
Möglicherweise wird daher das Payload aus dem Grund nicht an mein Modul geliefert?

…kann man zumindest eine Aussage treffen, ob meine Vermutung durchaus der Grund für das Fehlerbild sein könnte?
Die Daten des Covers kommen über die aus dem Konfigurator angelegten Instanz an aber nicht im Modul. Meine Vermutung ist ja die Payload-Größe von um und bei 200kB…

Joachim

…wollte nur mal anfragen wie es in der Fragestellung weiter geht? Liegt der Fehler bei mir im Modul oder ist das ein Thema von IP-Symcon - hänge so jetzt etwas in der Luft…

Joachim

…kümmert sich bitte mal jemand um diese Fragestellung?

Joachim

Ich hatte das Thema zugegebenerweise nicht weiter verfolgt, da MQTT nicht wirklich mein Steckenpferd ist. Eine String-Variable mit einem großen Wert füttern funktioniert bei mir einwandfrei. Deine Ausgabe in Rohform funktioniert weiterhin nicht, da es kein UTF-8 ist, die codierte Version hat aber problemlos funktioniert.

Ich könnte dir anbieten, dass wir uns das mal per TeamViewer zusammen ansehen können. Aktuell wüsste ich, insbesondere mit der 6.2, von keinen Limitationen.

paresy

…mit dem Hinweis von Dr.Niels kommt mir doch noch eine Idee. Aktuell gehe ich ja mit allen ankommenden Daten so um:

		// Empfangene Daten vom I/O
	    	$Data = json_decode($JSONString);
		if (isset($Data->PacketType)) {
	    		$PacketType = utf8_decode($Data->PacketType);
		} else {
			return;
		}
		$QualityOfService = utf8_decode($Data->QualityOfService);
		$Retain = utf8_decode($Data->Retain);
		$Topic = utf8_decode($Data->Topic);
		$Payload = utf8_decode($Data->Payload);

Dr.Niels schrieb ja, das die komische Darstellung daraus resultiert das das Cover kein UTF-8 ist, muss man vielleicht anders damit umgehen wenn das topic „/cover“ ist?

Also könnte es das Problem lösen wenn man zuerst auf das topic prüft und mit „/cover“ anders umgeht?

Joachim

Leider hast du Niels Beitrag falsch verstanden.
Der Datenaustausch ist immer utf8 encodiert und somit ist dein decode schon korrekt.
Er meinte das Schreiben der Rohdaten in einer IPS-Variable, welches die Konsole zum Absturz bringt.
Der Code auf GitHub schaut so okay aus.
Wenn gar keine Daten vom cover im Debug landen, dann ist das Problem dich im oder vor dem Case?!
Michael

Hallo Michael,

um das noch einmal zu prüfen habe ich den Code wie folgt angepasst:

                // Empfangene Daten vom I/O
	    	$Data = json_decode($JSONString);
		if (isset($Data->PacketType)) {
	    		$PacketType = utf8_decode($Data->PacketType);
		} else {
			return;
		}
		$QualityOfService = utf8_decode($Data->QualityOfService);
		$Retain = utf8_decode($Data->Retain);
		$Topic = utf8_decode($Data->Topic);
		$MainTopic = $this->ReadPropertyString("Topic");
		If ($Topic <> $MainTopic."/cover") {
			$Payload = utf8_decode($Data->Payload);
		} else {
			$Payload = utf8_decode($Data->Payload);
			$this->SendDebug("ReceiveData", "Länge Payload: ".strlen($Payload), 0);
		}

Der Payload ist da schon leer.
In der MQTT Server Device Instanz kommen die Daten aber an, sind also im IP-Symcon vorhanden, nur den Weg in mein Modul finden sie nicht, alle anderen aber schon…

Ist aber ja auch der Moment wo die Konsole abstürzt.

Joachim