Ich habe folgendes Problem, das ich so einfach nicht lösen kann:
FHEM soll mit einem Arduino Nana über USB kommunizieren:
fhem.cfg:
define usArduino ECMD serial /dev/ttyUSB0@9600
attr usArduino classdefs usDef=/opt/fhem/usArduino.classdef
attr usArduino logTraffic 3
attr usArduino partial 2
define usSensor ECMDDevice usDef
attr usSensor IODev usArduino
define usDistance at +*00:01:00 set usSensor usStr
usArduino.classdef:
set usStr cmd {chr(83)}
set usStr postproc { $_ }
im list usSensor erscheint folgendes:
Internals:
CFGFN ./FHEM/99_Wire.cfg
DEF usDef
IODev usArduino
NAME usSensor
NR 120
STATE usStr
TYPE ECMDDevice
Readings:
2016-06-24 17:38:42 state usStr
Fhem:
classname usDef
Cache:
Specials:
%NAME usSensor
%TYPE ECMDDevice
Attributes:
IODev usArduino
Ich will aber nicht usStr als state haben, sondern den gesendeten String, wie im Logfile auch empfangen. Was mache ich falsch?
...
2016.06.24 17:39:42 3: usArduino: write "S"
2016.06.24 17:39:43 3: usArduino: read "77, 2193, 10"
Vielleicht kann mal jemand durch einfaches Hinschauen den Fehler erkennen, denn gesendet wird das Richtige, aber ich kriege es nicht ins System.
Nachtrag:
Durch eine kleine Änderung in der usArduino.classdef:
get usStr cmd {chr(83)}
get usStr expect ".*"
get usStr postproc { $_ }
ergibt sich nun die "fast" richtige Antwort des Arduino in einem String: Distanz, Temperatur * 100 und Lfd.Messung:
Internals:
CFGFN ./FHEM/99_Wire.cfg
DEF usDef
IODev usArduino
NAME usSensor
NR 120
STATE usStr 77, 2068, 4
TYPE ECMDDevice
Readings:
2016-06-25 13:38:18 state usStr 77, 2068, 4
2016-06-25 13:38:18 usStr 77, 2068, 4
Fhem:
classname usDef
Cache:
Specials:
%NAME usSensor
%TYPE ECMDDevice
Attributes:
IODev usArduino
Man soll mich aber nicht nicht dem Warum fragen, ich weiß es nicht, denn Perl ist für mich wie chinesisch.
Endgültige Fassung für alle, die bei ähnlicher Fragestellung auch "auf dem Schlauch" stehen:
get usStr cmd {chr(83)}
get usStr expect ".*"
get usStr postproc {\
my $state = "$_";\
$state =~ tr/,//d;\
my $hash = $defs{%NAME};\
my @fields = split / /, $state;\
my ($distance,$temp,$cnt) = @fields[0, 1, 2];\
$temp = $temp/100;\
readingsSingleUpdate($hash, "distance", $distance, 1);\
readingsSingleUpdate($hash, "temperature", $temp, 1);\
readingsSingleUpdate($hash, "counter", $cnt, 1);\
my $retval = "ok";\
}
Jetzt muß ich nur noch herausfinden, ob auch die Entfernung von rd. 50m überbrückt werden kann. Mit I2C ging das problemlos auf kürzere Distanz, aber leider nicht brauchbar für längere Distanzen.