ECMD Leerzeichen im Parameter?

Begonnen von Carsten, 26 Mai 2013, 13:50:34

Vorheriges Thema - Nächstes Thema

Carsten

Hallo,

ich habe ein Problem, dass ext23 hier im alten Forum auch schon hatte.

Ich habe einen Arduino Uno ( mit einem Display ) an meinem Raspberry Pi und nutze die ECMD-Komponente, um ihn seriell anzusprechen. Das funktioniert soweit auch prima, mit dem Problem, dass ich keine Texte mit Leerzeichen an das Display senden kann, weil FHEM die Worte dann als einzelne Parameter interpretiert und nicht als einen langen String.

In dem Beispiel im Wiki wird ein "Hallo Welt" als "Hallo_Welt" an ein Display geschickt. Bei mir zeigt das Display dann aber den Unterstrich auch mit an. Gibt es irgendeine Möglichkeit das Leerzeichen zu escapen?

Gruß

Carsten

rudolfkoenig

Ich kenne zwar ECMD nicht, aber ich wuerde es mit Hallo\x20Welt versuchen.

Carsten

Vielen Dank!

Funktioniert.

"\x" heißt "jetzt kommt Asciicode" auf Perl?

Gruß

Carsten

Dr. Boris Neubert

Zitat von: rudolfkoenig schrieb am So, 26 Mai 2013 17:16Ich kenne zwar ECMD nicht, aber ich wuerde es mit Hallo\x20Welt versuchen.

Das ist so schön, daß ich es gleich in die Doku zu ECMDDevice als Beispiel aufgenommen habe.

Danke
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

ext23

Mhh auch nicht schlecht, per Zufall eben über den Thread gestoßen, aber ist schön zu wissen, dass es für mein Problem jetzt auch eine Lösung gibt ;-) Danke!
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

J0EK3R

Hallo  :)

...da ich im Forum keine zufriedenstellende Antwort gefunden habe, muss ich dieses Fass doch nochmal aufmachen...  :-[

Sicher, mit "\x20" kann ich Leerzeichen im Parameter übergeben - leider finde ich diese Lösung für folgenden Fall unbefriedigend!  :-X

Ich verwende ECMD und ECMDDevices für die Anbindung des ebusd an FHEM.
https://forum.fhem.de/index.php/topic,61017.0.html

Nun ist es so, dass ich inzwischen sehr viele Nachrichtendefinitionen für den ebusd und meine Weishaupt-Therme erstellt habe.

Zuerst hatte ich eine Klassendefinitionsdatei für ECMD, in der ich für jedes Feld einer Nachricht ein eigenes Tripel cmd-expect-postproc definiert hatte - jede Änderung eines Telegramm- oder Feld-Namens der ebusd-Definitionen (und während der Entwicklung hatte ich viele davon :o) musste in der ECMD-Klassendefinitionsdatei und in den ECMDDevices in FHEM durchgezogen werden. Das wurde sehr schnell unübersichtlich und Puh!  :o

Das war sehr nervig, weshalb ich mir Gedanken gemacht habe und aktuell bei folgender Lösung bin:
Ich nutze "flexible" generische ECMD-Definitionen, die ich über entsprechende Parameter steuern kann:

Hier ein Auszug aus der Klassendefinitionsdatei für ECMD - weishaupt.classdef

--- schnipp
# Klasse Read5 - Aufruf Kommando mit fünf Parametern
get Read5 params P1 P2 P3 P4 P5
get Read5 cmd {"%P1 %P2 %P3 %P4 %P5\n"}
get Read5 expect ".*\n*"
get Read5 postproc { (split("\n", "$_"))[0] }

# Klasse Read6 - Aufruf Kommando mit sechs Parametern
get Read6 params P1 P2 P3 P4 P5 P6
get Read6 cmd {"%P1 %P2 %P3 %P4 %P5 %P6\n"}
get Read6 expect ".*\n*"
get Read6 postproc { (split("\n", "$_"))[0] }
--- schnapp


Und hier ist beispielhaft die Definition eines ECMDDevices:

defmod Weishaupt.BC.ExternalTemp ECMDDevice weishaupt.class
attr Weishaupt.BC.ExternalTemp IODev EBUSD
attr Weishaupt.BC.ExternalTemp event-on-change-reading state
attr Weishaupt.BC.ExternalTemp stateFormat Read5


Die Definition des Timers, der die Werte aus dem ebusd pollt, sieht so aus:

+*00:00:10
get EBUSD.Version Read1 info;
get Weishaupt.BC.ExternalTemp Read5 read -c broadcast datetime outsidetemp;
get Weishaupt.BC.Date Read5 read -c broadcast datetime date;


Hier kann ich über die Klasse Read1, Read2, usw. festlegen, wieviele Parameter noch folgen.

Diese Lösung ist - für meinen Fall und meinen aktuellen Kenntnisstand - fast optimal...
Für eine Änderung der Parameteranzahl muss ich jetzt nur eine entsprechende Klasse ReadX verwenden und das stateFormat entsprechend anpassen, damit nur die eigentlichen Werte ausgegeben werden.

Die optimale Lösung wäre, wenn ich mir über die Anzahl der Parameter an dieser Stelle keine Gedanken machen müsste - weil sie in Form eines einzelnen Strings inklusive Leerzeichen einfach an das ECMD durchgereicht würden - und ich beispielsweise einfach schreiben könnte:

+*00:00:10
get EBUSD.Version Read "info";
get Weishaupt.BC.ExternalTemp Read "read -c broadcast datetime outsidetemp";
get Weishaupt.BC.Date Read "read -c broadcast datetime date";


In der Klassendefinitionsdatei für ECMD gäbe es nur die eine Klasse:

# allgemeine Klasse Read - Aufruf Kommando mit übergebenem String
get Read params COMMAND
get Read cmd {"%COMMAND\n"}
get Read expect ".*\n*"
get Read postproc { (split("\n", "$_"))[0] }


Viel geschrieben, hier die Frage:
Ist es möglich, den Parameter-String "read -c broadcast datetime outsidetemp" in Form von Hochkommata oder sonst wie als solchen zu kennzeichen?
Oder gibt es eine andere Lösung?
Oder muss ich mich mit meiner bisherigen Lösung zufrieden geben?  :'(