FHEM Forum

FHEM => Automatisierung => Thema gestartet von: l1berty am 15 Mai 2018, 14:14:42

Titel: ECMD falsche Werte verwerfen
Beitrag von: l1berty am 15 Mai 2018, 14:14:42
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
Titel: Antw:ECMD falsche Werte verwerfen
Beitrag von: l1berty am 16 Mai 2018, 19:32:31
Hallo,

falls es wen interessiert, partial Attribut hat geholfen.

Grüße