FHEM frisst Leerzeichen

Begonnen von gdie, 03 März 2018, 16:10:23

Vorheriges Thema - Nächstes Thema

gdie

Hallo Mitstreiter,

ich entwickle derzeit ein Anzeige-Panel, das die anzuzeigenden Daten über MQTT erhält. Als Display sollen dabei Text-LCDs mit HD44780-kompatiblem Controller oder e-Paper (z.B. Waveshare 4.2 inch) möglich sein.

Um die Firmware des Gerätes möglichst einfach zu halten, sollen die Daten bereits passend vorformatiert in MQTT geschrieben werden.

Da FHEM auf Perl basiert und Perl wiederum sprintf enthält, liegt es nahe, die Formatierung in FHEM zu erledigen.
Deshalb lasse ich in FHEM durch ein notify-Element ein Reading in einem MQTT_DEVICE aktualisieren.

    my $s2 = sprintf("%-10.10s %5.1f%3.0f", "AZ", ReadingsVal("multisensv3_2", "temperature", 0), ReadingsVal("multisensv3_2", "humidity", 0));
    fhem("set multisensv3_2 display20 $s2");


Dieses Reading ist mit einem MQTT-Topic verknüpft. Das funktioniert so weit, die Daten kommen im QMTT-Topic an und werden auf meinem Display auch angezeigt.


Hier ergibt sich aber das Problem: Irgendwo zwischen sprintf und MQTT-Topic frisst FHEM mehrfach aufeinander folgende Leerzeichen und lässt jeweils nur ein einzelnes übrig!


Da ich bei so etwas den Fehler zuerst bei mir selbst suche, in diesem Fall beim von mir gebauten Display, führte ich einige Tests mittels MQTT.fx und der Client-Tools von Mosquitto durch. Dabei ergab sich, dass, wenn FHEM die Daten in das MQTT-Topic schreibt, mein Display, MQTT.fx und mosquitto_sub den Text mit fehlenden Leerzeichen anzeigen. Wenn ich dagegen mittels MQTT.fx oder mosquitto_pub die korrekt formatierte Zeichenkette in das Topic schreibe, dann wird sie auch von allen dreien korrekt mit allen Leerzeichen angezeigt.

In meinem Display steckt der Fehler also nicht, denn korrekte Daten zeigt es auch korrekt an.
An MQTT liegt es wohl auch nicht, denn es behandelt die Payload transparent und belässt alle Leerzeichen.
Auch an meinem Format-String für sprintf liegt es nicht. Diesen habe ich in einem kurzen C-Programm getestet, welches genau das gewünschte Ergebnis inklusive aller Leerzeichen liefert.

Bleibt also nur FHEM als Leerzeichenfresser übrig.



Meine Frage ist nun: Wie schreibt man in FHEM korrekt formatierte Daten inklusive mehrerer aufeinander folgender Leerzeichen in MQTT-Topics?



Grüße,

Günther

rudolfkoenig

ZitatBleibt also nur FHEM als Leerzeichenfresser übrig.
Stimmt.

ZitatWie schreibt man in FHEM korrekt formatierte Daten inklusive mehrerer aufeinander folgender Leerzeichen in MQTT-Topics?
Ich fuerchte das muss man irgendwie kodieren (HTML:  URL:%20, usw), und jemand weiter hinten in der Kette (das MQTT Modul?) muss das wieder zurueckwandeln.

gdie

Hallo Rudolf,

Zitat
Zitat
Bleibt also nur FHEM als Leerzeichenfresser übrig.
Stimmt.
Ist das ein Bug, oder ein "Feature"? Warum sollte man aus dem Ergebnis von sprintf die mehrfachen Leerzeichen herauslöschen? Werden da auch noch andere unerwartete Dinge mit der Ausgabe von sprintf gemacht? Ist das irgendwo dokumentiert? Inwieweit kann man sich überhaupt darauf verlassen, dass da annähernd das herauskommt, was man erwarten würde?
Wenn das ein Bug ist, wird der eventuell mal behoben?

Zitat
Zitat
Wie schreibt man in FHEM korrekt formatierte Daten inklusive mehrerer aufeinander folgender Leerzeichen in MQTT-Topics?
Ich fuerchte das muss man irgendwie kodieren (HTML:  URL:%20, usw), und jemand weiter hinten in der Kette (das MQTT Modul?) muss das wieder zurueckwandeln.
Ein Display-Panel, das seine Daten per MQTT bekommt, sollte eigentlich universell funktionieren, also den übertragenen Text 1:1 wiedergeben. Eine Spezialbehandlung für bestimmte Datenquellen ist da eher kontraproduktiv. Woher sollte das Teil auch wissen, wann es die Texte verhackstücken soll, und wann es sie nehmen kann, wie sie sind? Es weiß ja gar nicht, woher die Daten kommen.
Das ist etwas unbefriedigend.

Danke für die Antwort, damit weiß ich zumindest, dass meine Sachen tatsächlich so arbeiten, wie sie sollen.



Grüße,

Günther

rudolfkoenig

ZitatIst das ein Bug, oder ein "Feature"?
Das ist ein Feature, sonst muesste man ueberall darauf achten, dass man exakt ein Leerzeichen zum Trennen der Parameter eingibt.
So ziemlich alle Systeme die ich kenne und Benutzereingaben akzeptieren, machen das so, siehe z.Bsp. alle Shells oder beliebige Programmiersprachen.
-> FHEM bleibt auch dabei.