ECMD, ECMDDEVICE, Kommunikation mit Mastervolt Wechselrichter

Begonnen von Knallkopp_02, 22 April 2020, 11:08:03

Vorheriges Thema - Nächstes Thema

Knallkopp_02

Ich würde dir gern mehr dazu sagen, ob das so ist, dazu verstehe ich aber zu wenig von dem allem, und die Doku vom Hersteller ist so wie du warscheinlich sagen würdest $doku=""

Ich habe hier aber eine Teil eines PHP Scriptes, der funktionieren soll. Vielleich bringt dir das noch etwas. Ich verlinke dir auch noch wo ich es her habe. https://github.com/langemeijer/mastervolt-php/blob/master/MasterVolt.php

Aber ich lese darin etwas was darauf hindeuten könnte "bin2hex($flush)"


private function writeCommand($command)
{
$data = pack('nn', $this->identifier, 0xFFFF);

$command = func_get_args();
array_unshift($command, 'C*');
$data .= call_user_func_array('pack', $command);

$data .= chr($this->calcChecksum($data));

// Flush data from read buffer
$flush = fread($this->serial, 1024);
if ($this->debug && $flush) {
echo "< " . bin2hex($flush) . "\n";
}

if ($this->debug) {
echo "> " . bin2hex($data) . "\n";
}

$time = microtime(true);
while ($data) {
$bytesWritten = fwrite($this->serial, $data);
$data = substr($data, $bytesWritten);
if (microtime(true) > $time + $this->writeTimeout) {
if ($this->debug) {
echo "Timeout on sending data\n";
}
return false;
}
}

return true;
}

public function getDeviceInfo()
{
if (!$read = $this->doCommand(array(0xB4, 0x00, 0x00, 0x00), 26)) {
return false;
}

return array(
'type' => dechex($read[1]),
'typeName' => $this->types[$read[1]],
'serial' => dechex($read[2]) . dechex($read[3]) . dechex($read[4]) . dechex($read[5]) . dechex($read[6]) . dechex($read[7]) . dechex($read[8]),
'firmware1' => dechex($read[9]) . dechex($read[10]) . dechex($read[11]) . dechex($read[12]) . dechex($read[13]) . dechex($read[14]),
'firmware2' => dechex($read[15]) . dechex($read[16]) . dechex($read[17]) . dechex($read[18]) . dechex($read[19]) . dechex($read[20]),
'firmware3' => dechex($read[21]) . dechex($read[22]) . dechex($read[23]) . dechex($read[24]) . dechex($read[25]),
);
}


Gruß
Ich bin kein Programmierer und habe keine Ahnung.

Raspberry PI 3B+ mit HM-MOD-RPI-PCB,     
HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-SEC-SCo
Raspberry PI 3B+ mit 7" Touchdisplay

Dr. Boris Neubert

Binär.

Du musst also die Kommandos als Bytes absetzen und die Antwort als Bytes verstehen. Pack und Unpack sind Deine Freunde. Und versuche es bitte mal mit meinem Regex. Dazu müssen es dann aber immer 39 Bytes sein.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Knallkopp_02

#17
Hallo Boris,

nachdem ich mich nun die letzten 2 Tage wieder mit dem Problem beschäftigt habe - und geflucht habe wie ein Spatz - glaube ich nun etwas mehr Erfolg gehabt zu haben.
Mit Bytes senden und empfangen scheint nicht zu stimmen, ich sende jetzt in HEX.
Ich erhalte nun immer eine Antwort die auch die gewünschte Länge hat. Es ist zwar schwer das entsprechende heraus zu filtern, aber so ist das bei einer nicht vorhandenen Doku.

Die Antwort die ich zurück bekomme ist mal Hex, mal nichts, mal bin, zumindest sieht es so aus. Ich würde sie gern hier Zeichen, nur bleibt davon nicht viel übrig.


Hier mal meine aktuelle cfg


################# mastervolt.cfg ###############
#
#!/usr/bin/perl
# Modell/Firmware/Seriennummer
# Wechselrichter 1
get state cmd {pack("(H2)*", split(/ /, '22 01 ff ff b4 00 00 00 d5'))}
# Wechselrichter 2
#get state cmd {pack("(H2)*", split(/ /, '21 01 ff ff b4 00 00 00 d4'))}
# Wechselrichter 3
#get state cmd {pack("(H2)*", split(/ /, 'b1 00 ff ff b4 00 00 00 63'))}
# Wechselrichter 4
#get state cmd {pack("(H2)*", split(/ /, '11 01 ff ff b4 00 00 00 c4'))}

#get state expect "([0-9a-f]{2} ){39}[0-9a-f]{2}"

get state expect ".........................................*"

#get state postproc { $_}
get state postproc { my ($model,$serial,$firmware1,$test,$xval,$zval);\
        my $hash  = $defs{"%NAME"};\
        if( ($_ eq "")||($_ eq "no data stored") ){\
                $model = "err";\
                $serial = "err";\
                $firmware1 = "err";\
$test = "err";\
                $xval = "err";\
                $zval = "err";\
        }else{\
                my @values=split('',$_);\
                $firmware1 = unpack('H*', $values[31]).".".unpack('H*', $values[30]);\
                $model = unpack('H*', $values[14]);\
if( $model eq "fe" ){\
$model = "XS6500";\
}elsif( $model eq "ff" ){\
$model = "XS4300";\
}elsif( $model eq "dc" ){\
$model = "XS3200";\
}elsif( $model eq "db" ){\
$model = "XS2000";\
}else{\
$model = "err";\
}\
$serial = $values[16].$values[17].unpack('H*', $values[18]).$values[19].unpack('H*', $values[20]).unpack('H*', $values[21]);\
                $test = "";\
$xval = unpack('H*', $values[0]).unpack('H*', $values[1]).unpack('H*', $values[2]).unpack('H*', $values[3]).unpack('H*', $values[4]).unpack('H*', $values[5]).unpack('H*', $values[6]).unpack('H*', $values[7]).unpack('H*', $values[8]).unpack('H*', $values[9]).unpack('H*', $values[10]).unpack('H*', $values[11]).unpack('H*', $values[12]).unpack('H*', $values[13]).unpack('H*', $values[14]).unpack('H*', $values[15]).$values[16].$values[17].unpack('H*', $values[18]).$values[19].unpack('H*', $values[20]).unpack('H*', $values[21]).unpack('H*', $values[22]).unpack('H*', $values[23]).unpack('H*', $values[24]).unpack('H*', $values[25]).unpack('H*',$values[26]).unpack('H*', $values[27]).unpack('H*', $values[28]).unpack('H*', $values[29]).unpack('H*', $values[30]).unpack('H*', $values[31]).unpack('H*', $values[32]).unpack('H*', $values[33]).unpack('H*', $values[34]).unpack('H*', $values[35]).unpack('H*', $values[36]).unpack('H*', $values[37]).unpack('H*', $values[38]).unpack('H*', $values[39]);\
                $zval = "$_";\
        }\
        readingsSingleUpdate($hash, "Model", $model, 1);\
        readingsSingleUpdate($hash, "Seriennummer", $serial, 1);\
        readingsSingleUpdate($hash, "Firmware1", $firmware1, 1);\
readingsSingleUpdate($hash, "Test", $test, 1);\
        readingsSingleUpdate($hash, "reading", $xval, 1);\
        $zval;\
}



wie bekomme ich das schöner hin

get state expect ".......................................*"

habe schon

get state expect ".*{39}"

versucht, da schmiert aber FHEM ab und startet nicht mehr.

herzlichen Dank für die Hilfe, auch wenn es noch viel Arbeit ist das lesbar zu machen.

Gruß Knallkopp_02
Ich bin kein Programmierer und habe keine Ahnung.

Raspberry PI 3B+ mit HM-MOD-RPI-PCB,     
HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-SEC-SCo
Raspberry PI 3B+ mit 7" Touchdisplay

Dr. Boris Neubert

Hallo,

bitte unbedingt ein Tutorial zu regulären Ausdrücken in Perl durcharbeiten!

Das mit dem Sternchen ist falsch. Bitte nicht mit Shell Globs verwechseln.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!