Hauptmenü

BYD Battery

Begonnen von MadMax, 05 März 2022, 14:36:44

Vorheriges Thema - Nächstes Thema

MadMax

Hallo Zusammen,

ich versuche mich gerade mal daran die Daten aus meine BYD HVM zu bekommen, dazu habe ich das hier gefunden ich möchte das in ein Modul für FHEM integrieren / umbauen.

https://solaranzeige.de/phpBB3/viewtopic.php?p=13748#p13748

Leider scheitere ich gerade hier an der Stelle, wenn ich das richtig verstehe sollen hier die ersten drei Bytes von $sock gelesen werden? Unteranderem die Länge.


# read 3 bytes
my $b11=<$sock>;         # 0x01
my $b12=<$sock>; # 0x03
my $b13=<$sock>; # length of data


Im Log bekomme ich folgende Meldung.


2022.03.05 14:19:45 1: PERL WARNING: Use of uninitialized value $b13 in ord at ./FHEM/76_BYD_Battery.pm line 367.


Scheinbar wird dort die $B13 nicht initialisiert.
Eventuell gibt es hierfür auch eine bessere oder einfachere Lösung.

Perl ist mir in einigen dingen noch nicht so ganz klar...
Würde mich über Hilfe freuen.

Der Code ist erstmal nur zum Testen, werde das noch schön mit Attributen und alle machen ;)


Hier noch der Code von der kompletten Sub.


###############################################################
#          non-blocking
###############################################################
sub BYD_Battery_Run($)
{
my ($name)   = @_;
my $hash     = $defs{$name};
my $interval = AttrVal($name, "interval", 60);
my $response = "";
my $code = 0;
my $ret = 0;

Log3 ($name, 4, "$name -> Start BlockingCall BYD_Battery_Run");

# connect to BYD HVS/HVM Premium device, adjust PeerAddr to match your IP
my $sock = IO::Socket::INET->new(PeerAddr => '192.168.10.67', PeerPort => '8080', Proto => 'tcp') or die;

#my $tobyd1="\x01\x03\x00\x00\x00\x13\x04\x07";
my $tobyd1="\x01\x03\x00\x00\x00\x66\xc5\xe0";
my $tobyd2="\x01\x03\x05\x00\x00\x19\x84\xcc";

#New Commands for Extended Reading
my $tobyd2a="\x01\x03\x00\x10\x00\x03\x04\x0e";
my $tobyd3="\x01\x10\x05\x50\x00\x02\x04\x00\x01\x81\x00\xf8\x53";
my $tobyd4="\x01\x03\x05\x51\x00\x01\xd5\x17";
my $tobyd5="\x01\x03\x05\x58\x00\x41\x04\xe5";


# unbuffer output on socket, stdout, stderr
my $old=select($sock); $|=1;
select(STDOUT);$|=1;
select(STDERR);$|=1;
select($old);

# always read one byte from stream
$/=\1;

# create empty hash for results
my %rh=();

# send first command to BYD
print $sock $tobyd1;
# print STDERR "Data1 sent!\n";

# read 3 bytes
my $b11=<$sock>; # 0x01
my $b12=<$sock>; # 0x03
my $b13=<$sock>; # length of data

my $dl1=ord($b13); # data length
# printf STDOUT "%d\n",$dl1;

# read payload
my $pl1=$b13;
for (my $i=0;$i<$dl1;$i++)
{
$pl1.=<$sock>;
}

# read checksum bytes
my $c11=<$sock>; # checksum LSB
my $c12=<$sock>; # checksum MSB

# get overall checksum from data
my $crc1=ord($c12)*256 + ord($c11);

# calculate checksum from actual data
my $ctx1 = Digest::CRC->new(width=>16, init=>0x0284, xorout=>0x0000, refout=>1, poly=>0x8005, refin=>1, cont=>0);
$ctx1->add($pl1);
my $digest1=$ctx1->digest;

# printf STDERR "Payload length: %d, Checksum=%04X, Digest=%04X\n",length($pl1),$crc1,$digest1;

if ($b11 ne "\x01" || $b12 ne "\x03" || $crc1 != $digest1)
{
die "illegal/unexpected data received";
}

# print received bytes
my $num1=0;
for (my $i=0;$i<length($pl1);$i++)
{
my $c=substr($pl1,$i,1);
$num1++;
my $o=ord($c);
$c=".";
if ($o > 31 && $o < 127) { $c=chr($o); }

# printf STDERR "%03d: %03d %02X %s\n",$num1,$o,$o,$c;
}

# extract the values from the payload
my $Xmodules=getvers(substr($pl1,34,1))-16;
&getvals1(\%rh,$pl1);

Log3 ($name, 4, "$name -> BlockingCall BYD_Battery_Run finished");
 
return "$name|$ret|$response";
}


Danke.

Gruß
Max
Lenovo M910Q Tiny Debian 12, FHEM 6.3, 2x Siemens Logo 0BA7, Homematic CCU3, Philips HUE, 5x SMA Wechselrichter, BYD HVM, SMA EVCharger, Daikin Wärmepumpe über CAN

Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/MadMax

betateilchen

naja, $b13 erhält vermutlich keinen Wert aus <$sock>.

Warum machst Du das über eine eigene Socket-Verbindung und nicht z.B. über DevIo.pm ?

https://wiki.fhem.de/wiki/DevIo
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

MadMax

Stimmt eigentlich, damit hatte ich schon Geräte angebunden...

Ich hatte halt das so in dem eine forum gesehen und das do übernehmen wollen ohne nachzudenken.
Werde mir das morgen mal mit Devlo anschauen.


Gruß
Max
Lenovo M910Q Tiny Debian 12, FHEM 6.3, 2x Siemens Logo 0BA7, Homematic CCU3, Philips HUE, 5x SMA Wechselrichter, BYD HVM, SMA EVCharger, Daikin Wärmepumpe über CAN

Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/MadMax