FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: manne44 am 24 Juni 2016, 17:44:20

Titel: [gelöst] EMCD und Arduino
Beitrag von: manne44 am 24 Juni 2016, 17:44:20
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.