ECMD falsche Werte verwerfen

Begonnen von l1berty, 15 Mai 2018, 14:14:42

Vorheriges Thema - Nächstes Thema

l1berty

Hallo Leute,

Ich habe ein paar Probleme mit Messwerten, die ich über die Serielle Schnittstelle empfange. In 95% der Fälle wird der Serial String korrekt ausgewertet. in den restlichen 5 % leider nur ein Teil des Strings.

Auszug aus der Log:
2018.05.15 13:48:40 5 : Arduino_Serial: sending command lux0\r (\154\165\170\060\015)
2018.05.15 13:48:40 5 : SW: 6c7578300d
2018.05.15 13:48:40 5 : Arduino_Serial: received answer 7453.74\r\n (\067\064\065\063\056\067\064\015\012)
2018-05-15 13:48:40 ECMDDevice LUX0 lux: 7453.74
2018-05-15 13:48:40 ECMDDevice LUX0 lux 7453.74
2018.05.15 13:48:40 3 : Messung_LUX: lux 7453.74
2018-05-15 13:48:40 at Messung_LUX Next: 13:49:40
2018.05.15 13:49:40 5 : Arduino_Serial: sending command lux0\r (\154\165\170\060\015)
2018.05.15 13:49:40 5 : SW: 6c7578300d
2018.05.15 13:49:40 5 : Arduino_Serial: received answer 7205.83\r\n (\067\062\060\065\056\070\063\015\012)
2018-05-15 13:49:40 ECMDDevice LUX0 lux: 7205.83
2018-05-15 13:49:40 ECMDDevice LUX0 lux 7205.83
2018.05.15 13:49:40 3 : Messung_LUX: lux 7205.83
2018-05-15 13:49:40 at Messung_LUX Next: 13:50:40
2018.05.15 13:50:40 5 : Arduino_Serial: sending command lux0\r (\154\165\170\060\015)
2018.05.15 13:50:40 5 : SW: 6c7578300d
2018.05.15 13:50:40 1 : Arduino_Serial: unexpected answer 7461. (\067\064\066\061\056) received (wrote lux0\r (\154\165\170\060\015), expected \d+\.\d+\r\n)
2018.05.15 13:50:40 5 : Arduino_Serial: received answer 7461. (\067\064\066\061\056)
2018-05-15 13:50:40 ECMDDevice LUX0 lux: 7461.
2018-05-15 13:50:40 ECMDDevice LUX0 lux 7461.
2018.05.15 13:50:40 3 : Messung_LUX: lux 7461.
2018-05-15 13:50:40 at Messung_LUX Next: 13:51:40
2018.05.15 13:50:40 5 : Arduino_Serial: Spontaneously received 66\r\n (\066\066\015\012)
2018.05.15 13:50:40 5 : Arduino_Serial: dispatch 66\r\n
2018.05.15 13:50:40 5 : Arduino_Serial: trying to match message 66\r\n (\066\066\015\012)


Die expect Expression der classdef scheint also zu funktionieren, da eine unexpected Answer erkannt wird. Leider übernimmt aber das ECMDDevice auch den unvollständigen Wert. Gibt es eine einfache Möglichkeit unexpected Answers zu verwerfen und eine neue Messung zu triggern ?

wenn nur ein Teil des Strings als Wert verwendet wird, führt das leider zu hässlichen Graphen (Anhang).



FHEM läuft auf einem RasPi, ein Arduino nano ist per USB verbunden.

Define für das ECMD:
define Arduino_Serial ECMD serial /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9BTBPF6-if00-port0@57600
attr Arduino_Serial classdefs LUXCAN=/opt/fhem/arducan.classdef
attr Arduino_Serial verbose 5


Inhalt der classdef:
#Uebergabeparam ID 0..n
params devID

#Befehle in ECMD
get lux cmd { "lux%devID\r" }
get lux expect "\d+\.\d+\r\n"


Define für das ECMDDevice:
define LUX0 ECMDDevice LUXCAN 0
attr LUX0 IODev Arduino_Serial


Define für die zyklische Messung 1 Min:
define Messung_LUX at +*00:01 get LUX0 lux
attr Messung_LUX verbose 3



Define für Logfile und Plot:
define LUX0_FileLog_1 FileLog ./log/LUX0_FileLog_1.log LUX0:lux:..*
define SVG_LUX0_FileLog_1_1 SVG LUX0_FileLog_1:SVG_LUX0_FileLog_1_1:CURRENT


Hat jemand nen guten Hinweis für mich ?

Grüße

l1berty

Hallo,

falls es wen interessiert, partial Attribut hat geholfen.

Grüße