Hallo,
ich verwende das Modul ECDM um Daten aus einem Regensensor Hydreon RG-9 via RS232-Schnittstelle auszulesen.
Dies funktioniert soweit gut. Daten die vom Sensor automatisch gesendet werden, werden korrekt verarbeitet. Die Daten sind R 0, R 1 usw. je nach Regenstärke.
Jedoch habe ich das Problem, dass nach einem get raw "r\n" zum Auslesen der Schittstelle nicht alle Zeichen verarbeitet werden. Es fehlt immer das erste Zeichen.
Vielleicht kann mir einer der Spezialisten weiterhelfen.
Vielen Dank
Jenno
Die Modulversionen sind:
66_ECMD.pm 16372
67_ECMDDevice.pm 12877
Konfiguration der Module:
Internals:
DEF serial /dev/rainsensor@9600
DeviceName /dev/rainsensor@9600
FD 46
FUUID 60aa1745-f33f-1f55-59b9-4f50c16864f3ae59
NAME RS
NR 1290
PARTIAL
Protocol serial
STATE opened
TYPE ECMD
READINGS:
2021-05-26 16:04:37 raw B
2021-05-26 16:03:57 state opened
fhem:
classDefs:
rsdata.class:
filename /opt/fhem/FHEM/rsdata.classdef
state Rainlevel
gets:
readings:
DIP:
match DIP.*\r\n
postproc {s/DIP\s([0-9]+)/$1/;; $_;}
Emitters:
match Emitters.*\r\n
Parameters:
match Baud.*\r\n
postproc {s/Baud\s([0-9]+)/$1/;; $_;}
PwrDays:
match PwrDays.*\r\n
postproc {s/PwrDays\s([0-9]+)/$1/;; $_;}
Rainlevel:
match R\s[0-9].*\r\n
postproc {s/R\s([0-9]+)/$1/;; $_;}
Reset:
match Reset.*\r\n
postproc {s/Reset\s(.)/$1/;; $_;}
sets:
partial:
msg aud 9600
ts 1622037877.43359
Attributes:
DbLogExclude .*
classdefs rsdata.class=/opt/fhem/FHEM/rsdata.classdef
logTraffic 5
partial 3
room Comm
split \r\n
verbose 5
Internals:
CFGFN
DEF rsdata.class
FUUID 60aa7e90-f33f-1f55-a12b-525da767bdf9a8f2
IODev RS
LASTInputDev RS
MSGCNT 124
NAME wetter_rainsensor
NR 5552
RS_MSGCNT 124
RS_TIME 2021-05-26 15:11:41
STATE 0
TYPE ECMDDevice
Helper:
DBLOG:
Rainlevel:
logdbweather:
TIME 1622034701.28104
VALUE 0
READINGS:
2021-05-26 13:19:46 DIP 0000
2021-05-26 13:19:46 Emitters Emitters 14 13, EmTotal 27
2021-05-26 13:19:46 PwrDays 0
2021-05-26 15:11:41 Rainlevel 0
2021-05-26 13:19:44 Reset B
2021-05-26 15:11:41 state 0
fhem:
classname rsdata.class
cache:
readings:
command:
DIP {s/DIP\s([0-9]+)/$1/;; $_;}
Emitters
PwrDays {s/PwrDays\s([0-9]+)/$1/;; $_;}
Rainlevel {s/R\s([0-9]+)/$1/;; $_;}
Reset {s/Reset\s(.)/$1/;; $_;}
match:
DIP DIP.*\r\n
Emitters Emitters.*\r\n
Parameters Baud\s(.*)\r\n
PwrDays PwrDays.*\r\n
Rainlevel R\s[0-9].*\r\n
Reset Reset.*\r\n
specials:
%NAME RS.Data
%TYPE ECMDDevice
Attributes:
DbLogExclude .*
DbLogInclude Rainlevel
IODev RS
devStateIcon 0:weather_cloudy_heavy_more
room Comm
Auszug aus der Log-Datei:
nach Abfrage mit r + newline
2021.05.26 13:31:40.430 5: RS: write r\n (\162\012), expect .*
2021.05.26 13:31:40.430 5: SW: 720a
2021.05.26 13:31:40.438 5: RS: read R (\122)
2021.05.26 13:31:40.443 5: RS: read 0\r\n (\040\060\015\012)
2021.05.26 13:31:40.444 5: RS: Spontaneously received 0\r\n (\040\060\015\012)
2021.05.26 13:31:40.445 5: RS: dispatch 0\r\n
2021.05.26 13:31:40.447 5: RS: partial message 0\r\n (\040\060\015\012) expired.
2021.05.26 13:31:40.448 5: RS: trying to match message 0\r\n (\040\060\015\012)
2021.05.26 13:31:40.453 5: RS: partial message 0\r\n (\040\060\015\012) kept
Gerät sendet selbst
2021.05.26 15:11:30.878 5: RS: read R (\122\040)
2021.05.26 15:11:30.879 5: RS: Spontaneously received R (\122\040)
2021.05.26 15:11:30.880 5: RS: dispatch R
2021.05.26 15:11:30.881 5: RS: trying to match message R (\122\040)
2021.05.26 15:11:30.886 5: RS: partial message R (\122\040) kept
2021.05.26 15:11:30.889 5: RS: read 1\r\n (\061\015\012)
2021.05.26 15:11:30.890 5: RS: Spontaneously received 1\r\n (\061\015\012)
2021.05.26 15:11:30.891 5: RS: dispatch 1\r\n
2021.05.26 15:11:30.892 5: RS: merging partial message R (\122\040) and 1\r\n (\061\015\012)
2021.05.26 15:11:30.893 5: RS: trying to match message R 1\r\n (\122\040\061\015\012)
2021.05.26 15:11:30.897 5: RS: R 1\r\n (\122\040\061\015\012) matches regex R\s[0-9].*\r\n for reading Rainlevel of device wetter_rainsensor with class rsdata.class
2021.05.26 15:11:41.099 5: RS: read R (\122\040)
2021.05.26 15:11:41.101 5: RS: Spontaneously received R (\122\040)
2021.05.26 15:11:41.101 5: RS: dispatch R
2021.05.26 15:11:41.103 5: RS: trying to match message R (\122\040)
2021.05.26 15:11:41.108 5: RS: partial message R (\122\040) kept
2021.05.26 15:11:41.110 5: RS: read 0\r\n (\060\015\012)
2021.05.26 15:11:41.111 5: RS: Spontaneously received 0\r\n (\060\015\012)
2021.05.26 15:11:41.112 5: RS: dispatch 0\r\n
2021.05.26 15:11:41.113 5: RS: merging partial message R (\122\040) and 0\r\n (\060\015\012)
2021.05.26 15:11:41.114 5: RS: trying to match message R 0\r\n (\122\040\060\015\012)
2021.05.26 15:11:41.116 5: RS: R 0\r\n (\122\040\060\015\012) matches regex R\s[0-9].*\r\n for reading Rainlevel of device wetter_rainsensor with class rsdata.class
Hallo,
es dauert 5 Sekunden, bis nach dem R noch das 0\r\n kommt. partial ist aber auf nur Warten für 3 Sekunden gesetzt. Partial auf 6 setzen sollte es bringen.
Grüße
Boris
Hallo Boris,
danke für die schnelle Reaktion. Das gesamte Schreiben und Lesen der Schnittstelle dauert laut Protokoll doch nur 23 ms?
Grüße Jens
Ach herrje, ich hab mich verguckt:
2021.05.26 13:31:40.438 5: RS: read R (\122)
2021.05.26 13:31:40.443 5: RS: read 0\r\n (\040\060\015\012)
Sind ja Millisekunden.
Die Zeile
2021.05.26 13:31:40.430 5: RS: write r\n (\162\012), expect .*
sagt mir, dass das expect alles matcht und damit gleich das erste R.
Definiere bitte mal ein get, dass auf R\s[0-9].*\r\n matcht.
Hallo,
das mit dem Parameter expect war das richtige Stichwort. Ich dachte die Antwort der Schnittstelle wird wie beim read eingelesen, die Verarbeitung erfolgt aber schon mit dem get.
Ich habe jetzt meine classdefs entsprechend angepasst (Reset=Rainlevel). get für die manuelle Abfrage des Gerätes, reading für das automatische senden des Gerätes.
get Rainlevel cmd {"r\n"}
get Rainlevel expect "R\s[0-9]\r\n"
get Rainlevel postproc {s/R\s([0-9])\r\n/$1/;; $_;}
reading Rainlevel match "R\s[0-9]\r\n"
reading Rainlevel postproc {s/R\s([0-9])\r\n/$1/;; $_;}
Vielen Dank für die Hilfe
Jens