RS485 ASCII mit ECMD

Begonnen von iBeSmart, 12 Mai 2020, 18:52:24

Vorheriges Thema - Nächstes Thema

iBeSmart

Hi liebe Leute,

ich steh ein bisschen auf dem Schlauch mit RegEx & dem Zerlegen einer Antwort und könnte bitte ein wenig Hilfe gebrauchen-

Es geht dabei um ein altes RS485 Gerät, welches auf ASCII Telegramme antwortet.
[A-Z] [0-9] [.]
Trennsymbol: ;
Ende (SUB): \x1A bzw. \032

Beispiel:
Ich schicke N;1;\x1A auf den Bus mit dem ECMDDevice

get Temperatur cmd {"N;1;\x1A"}
modbus: write N;1;\032 (\116\073\061\073\032)

und bekomme als Antwort:

modbus: read N (\116)
modbus: read ;1;18.2;50.0;10.0 (\073\061\073\061\070\056\062\073\065\060\056\060\073\061\060\056\060)
modbus: read ;0;\032 (\073\060\073\032)

Dort ist der gesuchte Temperaturwert 18.2 enthalten, den ich gern als userReading speichern möchte.

Leider bin ich nicht fit mit RegEx ...

Zuerst müsste wahrscheinlich die gesamte die Antwort in einen String gepackt werden
- > N;1;18.2;50.0;10.0;0;\032
(\116\073\061\073\061\070\056\062\073\065\060\056\060\073\061\060\056\060\073\060\073\032)

Da immer die gleiche Länge als Antwort kommt, sollte es doch irgendwie möglich sein, die 18.2 zu matchen.

Meine bisherigen Versuche:

get Temp cmd {"N;1;\x1A"}
get Temp expect "^\N+"
reading Temp match "([1-2][0-9].[0-9])"

get Temp1 cmd {"N;1;\x1A"}
get Temp1 expect "^\N+"
reading Temp1 match "^\N+"

get Temp2 cmd {"N;1;\x1A"}
get Temp2 expect "^\N+"
reading Temp2 match "\116\073\061\073\0%NUM."
reading Temp2 postproc {/^\116\073\061\073\0%NUM(.)$/;$_ = ord(trim("$1"));}

haben leider keine brauchbaren Ergebnisse gebracht.


KölnSolar

ZitatZuerst müsste wahrscheinlich die gesamte die Antwort in einen String gepackt werden
Sehe ich auch so. Und dann ginge anstatt regexpmy @data = split(";",$string);Die Temperatur steht dann in $data[2].
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

iBeSmart

Hi KölnSolar,

vielen Dank für den Tip! Das hast geklappt :-) zwar mehr quick&dirty, aber es läuft.

Jetzt wollte ich mich gleich an den nächsten Wert vom RS485 Gerät (ph-Wert) machen -> anderer Buchstabe am Anfang des Telegrams.

get ph cmd {"H;1;\x1A"}

Das klappt auch. Nur leider wird jetzt der Temperaturwert mit dem pH Wert überschrieben.
Temp: 18.3 ---> get ph ---> 7.21 ---> Temp 7.21

Also fehlt mir jetzt noch etwas um die Antwort zu unterscheiden.

Leider wird die Anwort immernoch auf mehrere Zeilen aufgeteilt:
modbus: read H (\110)
modbus: read ;1;7.21;9.20;3.20;7 (\073\061\073\067\056\062\061\073\071\056\062\060\073\063\056\062\060\073\067)
modbus: read .20;5;1;3;0;0;\032 (\056\062\060\073\065\073\061\073\063\073\060\073\060\073\032)

ein partial hat leider nicht geholfen

KölnSolar

Zum ECMD kann ich Dir leider nichts sagen. Ich hab mir damals für "mein serielles device" ein eigenes Modul geschrieben. Bei mir gibt es immer 3 Startbytes, so dass sich der Anfang eines Datensatzes erkennen lässt. Dazu dann noch ein length-field und eine einfache checksum, um Satzende und Validität zu prüfen und ggfs. zu "warten" bis der vollständige Datensatz eingelesen ist.

Vielleicht änderst Du mal das Thema auf "RS485 ASCII mit ECMD".
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt