String mit mehreren Leerzeichen publishen

Begonnen von roedert, 17 Dezember 2017, 04:20:32

Vorheriges Thema - Nächstes Thema

roedert

Ich sende per MQTT Daten an ein 20x4-LCD-Display und will eigentlich immer eine komplette Zeile mit 20 Stellen senden.
set <MQTT-Device> LINE1=a b c d
klappt auch bestens, allerdings werden bei
set <MQTT-Device> LINE1=     a  b  c  d
alle mehrfach auftretenden Leerzeichen durch nur ein Leerzeichen ersetzt.
Hochkomme oder Anführungszeichen helfen auch nicht, diese werden per MQQT auch mit gesendet.

Gibt es irgendeine Möglichkeit den String formatiert ohne Veränderung zu senden?

hexenmeister

Das Problem ist, dass FHEM-set-Befehl die Daten bereits zerlegt in einem Array weitergibt. Bei der Zerlegung gehen alle Leerzeichen erstmal verloren ( my @a = split("[ \t][ \t]*", $param); ). In dem MQTT-DEVICE-Modul werden diese dann mit Leerzeichen dazwischen zusammengesetzt (my $value = join " ",@values;).
Einzige Möglichkeit, die ich sehe, wäre das MQTT-DEVICE-Modul so umzubauen, dass dieser ein eigenes Publish-Befehl und/oder eine Methode anbietet, die man direkt aufrufen kann.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

justme1968

es gibt eine parseParams routine die ein modul verwenden kann um im define in " eingeschlossene parameter mit leerzeichen  zu verstehen. doku im wiki.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

hexenmeister

#3
Ah! Danke, gut zu wissen (ist an mich irgendwie vorbeigegangen ??? ).
Die Änderung dürfte also recht einfach sein. Jetzt muss nur noch jemand mal einen Patch für den Modul-Maintainer erstellen. Kann ich auch machen, wird aber etwas dauern...


Edit: wenn ich Quelle in fhem.pl ansehe, irgendwie denke ich, das wird eben die Leerzeichen speziell für 'set' (auch in Anführungszeichzen versteckt) auch nicht retten.  :(
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

justme1968

mehrere einzelne leerzeichen wie im beispiel ganz oben die z.b. die wörter eines satzes trennen gehen.

nur strings mit mehreren direkt aufeinander folgenden leerzeichen gehen (noch) nicht.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

hexenmeister

Ja, so habe ich das gemeint. Im Sinne der Erstanfrage wird das leider nichts bringen.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

kask

Falls einer danach sucht..es gibt eine Möglichkeit.
Im Charset des Displays nach einem Zeichen suchen was auch "leer" ist und das als Hex übergeben.

my $ww_tu = sprintf("%.0f",(ReadingsNum("DeltaSol_BX","Temp_Speicher_unten",0)));;
my $ww_tm = sprintf("%.0f",(ReadingsNum("DeltaSol_BX","Temp_Speicher_mitte",0)));;
my $ww_to = sprintf("%.0f",(ReadingsNum("DeltaSol_BX","Temp_Speicher_oben",0)));;
my $ww_pow = sprintf("%.0f",((ReadingsNum("VarWWepower","state",0) + ReadingsNum("DeltaSol_BX","Waermemenge.calc",0))));;
   ##$ww_pow = substr("\xFE\xFE\xFE\xFE\xFE".$ww_pow."W", -5);;
   $ww_pow = substr("\xA0\xA0\xA0\xA0\xA0".$ww_pow."W", -5);;
fhem ("set MQTT2_DVES_C04CC9 Row3 W: " . $ww_tu ."/".$ww_tm."/".$ww_to. "\xDFC " . $ww_pow);;