Autor Thema: BYD Battery  (Gelesen 2011 mal)

Offline MadMax

  • Full Member
  • ***
  • Beiträge: 437
BYD Battery
« am: 05 März 2022, 14:36:44 »
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
Raspberry Pi 4B 4GB mit FHEM 6.0, Siemens Logo 0BA7, Homematic CCU3, Philips HUE

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

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18506
Antw:BYD Battery
« Antwort #1 am: 05 März 2022, 14:51:45 »
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
-----------------------
Möchte man beruflich "etwas mit Menschen" machen, ohne etwas mit deren Dummheit zu tun haben zu müssen,
bleibt eigentlich nur der Beruf des Bestatters übrig.
-----------------------
Lesen gefährdet die Unwissenheit!

Offline MadMax

  • Full Member
  • ***
  • Beiträge: 437
Antw:BYD Battery
« Antwort #2 am: 05 März 2022, 19:12:29 »
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
Raspberry Pi 4B 4GB mit FHEM 6.0, Siemens Logo 0BA7, Homematic CCU3, Philips HUE

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