Hi,
ich versuche mich aktuell dran eine BWT Aqaperla USB per Raspberry in Fhem einzubinden.
Im moment bin ich mir nicht sicher ob das überhaupt klappt und ECMD das richtige tool ist.
Ich muss per Serieller verbindung einen HEX string an die aquaperla senden und erhalte einen hex string mit Daten zurück.
Per Terminal verbindung erhalte ich bei eingabe von
0D 25 02 D8 01 0D 0A
als Rückgabe
0d 25 02 b6 01 eb 0a
siehe auch den Screenshot.
Versionen
ZitatFile Rev Last Change
66_ECMD.pm 14495 2017-06-11 05:47:17Z neubert
File Rev Last Change
67_ECMDDevice.pm 12877 2016-12-26 09:15:55Z neubert
ECMD
define USB1 ECMD serial /dev/ttyACM1@19200
attr USB1 autoReopen 0
attr USB1 classdefs aqa=/opt/fhem/cdaqaperla.classdef
attr USB1 logTraffic 5
attr USB1 verbose 5
ECMDDevice
define aqaperla1 ECMDDevice aqa
attr aqaperla1 IODev USB1
cdaqaperla.classdef
get value cmd {"0d 25 02 b6 01 eb 0a"}
get value expect ".*"
Versuch mit
get USB1 raw '0D 25 02 D8 01 0D 0A'
2017.11.09 14:31:13 5: USB1: write 0D 25 02 D8 01 0D 0A (\060\104\040\062\065\040\060\062\040\104\070\040\060\061\040\060\104\040\060\101), expect .*
2017.11.09 14:31:13 5: SW: 3044203235203032204438203031203044203041
2017.11.09 14:31:16 2: USB1: first attempt to read timed out, trying to close and open the device.
2017.11.09 14:31:16 3: Opening USB1 device /dev/ttyACM0
2017.11.09 14:31:16 3: Setting USB1 serial parameters to 19200,8,N,1
2017.11.09 14:31:16 3: USB1 device opened
2017.11.09 14:31:16 5: SW: 3044203235203032204438203031203044203041
2017.11.09 14:31:19 2: USB1: second attempt to read timed out, this is an unrecoverable error.
2017.11.09 14:31:19 1: USB1: no answer received (wrote 0D 25 02 D8 01 0D 0A (\060\104\040\062\065\040\060\062\040\104\070\040\060\061\040\060\104\040\060\101), expected .*)
get USB1 raw {"0d 25 02 b6 01 eb 0a"}
2017.11.09 14:36:09 5: USB1: write 0d 25 02 b6 01 eb 0a (\060\144\040\062\065\040\060\062\040\142\066\040\060\061\040\145\142\040\060\141), expect .*
2017.11.09 14:36:09 5: SW: 3064203235203032206236203031206562203061
2017.11.09 14:36:12 2: USB1: first attempt to read timed out, trying to close and open the device.
2017.11.09 14:36:12 3: Opening USB1 device /dev/ttyACM0
2017.11.09 14:36:12 3: Setting USB1 serial parameters to 19200,8,N,1
2017.11.09 14:36:12 3: USB1 device opened
2017.11.09 14:36:12 5: SW: 3064203235203032206236203031206562203061
2017.11.09 14:36:15 2: USB1: second attempt to read timed out, this is an unrecoverable error.
2017.11.09 14:36:15 1: USB1: no answer received (wrote 0d 25 02 b6 01 eb 0a (\060\144\040\062\065\040\060\062\040\142\066\040\060\061\040\145\142\040\060\141), expected .*)
get aqaperla1 value
2017.11.09 14:59:12 2: USB1: first attempt to read timed out, trying to close and open the device.
2017.11.09 14:59:12 3: Opening USB0 device /dev/ttyACM0
2017.11.09 14:59:12 3: Setting USB0 serial parameters to 19200,8,N,1
2017.11.09 14:59:12 3: USB1 device opened
2017.11.09 14:59:12 5: SW: 3064203235203032206236203031206562203061
2017.11.09 14:59:15 2: USB1: second attempt to read timed out, this is an unrecoverable error.
2017.11.09 14:59:15 1: USB1: no answer received (wrote 0d 25 02 b6 01 eb 0a (\060\144\040\062\065\040\060\062\040\142\066\040\060\061\040\145\142\040\060\141), expected .*)
2017.11.09 14:59:15 5: USB1: received answer empty string
verschiedene Versuche mit diversen Maskierungen des Hex String schlugen auch fehl bzw. Liefern direkt fehler im Log wegen fehlerhafter Maskierung.
\x0D ...
0x0D ...
\0D
\n
\r als abschluss funktionieren auch nicht.
Kann ich mit dem ECMD komplett in Hex kommunizieren? Da ich Text Strings Senden kann müsste das doch auch gehen. oder ?
Mich wundert das hier.
Zitat(\060\144\040\062\065\040\060\062\040\142\066\040\060\061\040\145\142\040\060\141)
Hat jemand einen tipp? Habe schon diverse Einträge im Forum/Wiki/Inet durch und komme nicht weiter. Ich vermute ja das ich total auf der Leitung stehe und es ein banaler Fehler ist
Das ich einen Textstring sende ist unpraktisch.
Danke für den Tipp. Da muss ich mich jetzt wohl mal einlesen. Wird etwas dauern bis ich dazu wieder etwas Zeit habe, werde dann berichten.
Alternativ würde ich natürlich auch einen wink mit dem Zaunpfahl bzw. ein beispiel nehmen ;)
So, ich habe es hin bekommen.
cdaqaperla.classdef sieht jetzt so aus.
get Soll_1 cmd {pack("(H2)*", split(/ /, '0D 25 02 D8 01 0D 0A'))}
get Soll_1 expect ".*"
get Soll_1 postproc {\
my $hexval = hex(trim("$_"));\
my $hash = $defs{%NAME};\
my $reading = unpack("H*", $_);\
$reading = substr($reading,6,length($reading));\
$reading = substr($reading,0,length($reading)-4);\
my $temp = "";\
my $i=0;\
for ( my $i=2; $i <= length($reading) ; $i=$i+2) { \
substr($temp, $i-2) = substr($reading,-$i,2);\
}\
my $wert = hex $temp;\
readingsSingleUpdate($hash, 'state', $wert, 1);\
}
Als Rückgabe wird jetzt die Sollkapazität der Säule 1 in Liter zurück gegeben.
Das ganze kann dann für weitere Abfragemöglichkeiten erweitert werden.
Der Code ist vermutlich nicht optimal, bin aber kein Programier Profi.