NEWS
IOBroker Anbindung an einen Kostal Plenticore
-
@diginix sagte in IOBroker Anbindung an einen Kostal Plenticore:
@lemonbiter Das beginnt ab der Uhrzeit wo "generated" nicht mehr existiert. Wahrs. löscht der Adapter zu Tagesbeginn bzw. ab Sonnenaufgang die Objekte vom Vortag. Bei mir fing es am 2021-01-24 08:04:26 an und am 23.01. abends hatte ich den JS-Controller aktualisiert. Sonnenaufgang ist bei mir zZt kurz vor 8 Uhr. Passt also kausal zusammen.
Was wir hier sehen, hängt mit dem js-controller 3.2.x im Latest zusammen. Gefixt muss es allerdings in den jeweiligen Adaptern werden.
Siehe z.B. hier im Forum -
@joefarm da Dein Heimnetz den Bereich 192.168.5.* hat und der BYD 192.168.1.* brauchst Du nur im Router die subnet Einstellungen auf 255.255.0.0 ändern. Default ist normalerweise 255.255.255.0,
Dann geht alles, d.h Dein Rechner kann auf alles zugreifen was im Bereich 192.168.. ist.
Der Bereich muss aber frei sein, manche Router vergeben dort auch GAST LAN/WLAN IP adress Bereiche -
@ukl-pv Sorry hab mich falsch ausgedrückt. Ja das ist mir klar, wie ich von einem Subnetz ins andere komme. Das mit dem 1.x Netz hab ich nur zum testen gemacht, ich habe das normalerweise nicht installiert. Ich hab alle meine Geräte im 5.x Netz und das kollidiert mit der WLAN-IP des Byd, aus welchen Gründen auch immer. Eine Lösung ist, einen Router dazwischenzuschalten, das die Byd über LAN ein anderes Subnetz als 5.x routet, nur wollte ich nicht einen Router extra nur für diesen Zweck betreiben. Wenn es aber nicht anders geht, mache ich es vielleicht trotzdem...
Vielen Dank jedenfalls für die Ideen.
-
@ak1 Ist bekannt und von mir so auch schon hier geschrieben und ebenfalls von @StrathCole schon als todo bestätigt.
-
@tom57 said in IOBroker Anbindung an einen Kostal Plenticore:
@joefarm Ich habe verstanden, dass Du per WLAN auf die BYD HV-Box kommst. Hat der Router denn eine IP-Adresse aus dem DHCP Bereich für eth0 vergeben?
Bei mir sieht das unter Device Information so aus:
Ein redirect erfolgt bei der eigenen IP nicht.
Doch noch eine Frage: hat es schon jemand geschafft, über eth0:2, d.h. 192.168.6.1 auf die Weboberfläche zu kommen? Oder wofür ist diese Adresse gut?
-
@joefarm es gibt bei dem HVS Speichern keine Weboberfläche mehr, dafür aber das tool "Be Connect Plus (BCP) V1.4" um auf die Batterie zuzugreifen. Zu finden hier: https://www.eft-systems.de/de/downloads.
Das tool findet die BYD alleine (oder auch nicht), nachdem man auf connect gedrückt hat -
@ukl-pv Danke, aber es geht um die HV, nicht die HVS. Die ist nur über eine Weboberfläche zu erreichen.
-
Zur Info, falls es noch nicht bekannt ist:
@arteck hat einen Adapter für die Byd geschrieben (Vielen Dank!!), der schon einmal einige Werte aus der HV-Box ausliest, v.a. die Zustände der einzelnen Zellen. Leider fehlen noch die Daten von der Seite "Statistics Information", die ich speziell interessant finde, weil man dann z.B. "Total Charge" und "Total Discharge" sehen kann.
Leider sind meine Programmierkenntnisse nicht so großartig, sonst würde ich beim Implementieren mitmachen. Vielleicht kommt es ja noch...Verwendet den Adapter sonst schon jemand?
-
Neue Firware vom 29.01.2021 "UI: 01.18.05255 / MC: 01.46 / IOC: 01.45"
Changelog:
Änderungen
Die Funktion AutoUpdate ist nun verfügbar. Es kann gewählt werden zwischen „manuellem Update per Dateiupload“ / „über verfügbare Updates informieren“ / „Updates automatisch durchführen“.
Ändern Sie hierzu nach erfolgter Softwareaktualisierung im Updatemenü des Webservers die Updatemethode. -
@joefarm Mich würde ein Adapter für BYD HVS interessieren. Bisher klappt damit nur das Windows Programm "Be Connect Plus-V1.4.exe" und abgespeckt die "Be Connect App". Es soll wohl auch mittels pearl Script gehen, aber auf meinem Tinkerboard kriege ich das nicht zum laufen .
#!/usr/bin/perl # # readBYD.pl # # This program reads some current values from a BYD HVS/HVM Premium Battery Box. # There is NO WARRANTY # # # If you find this program useful send me some greetings to forenandi73@kabelmail.de # # redirect STDERR to nul (Windows) or /dev/null (UNIX) if you are not interested in the debugging output use strict; use IO::Socket; use Digest::CRC; # connect to BYD HVS/HVM Premium device, adjust PeerAddr to match your IP my $sock = IO::Socket::INET->new(PeerAddr => '192.168.178.78', PeerPort => '8080', Proto => 'tcp') or die; # commands to be sent to BYD my $tobyd1="\x01\x03\x00\x00\x00\x13\x04\x07"; my $tobyd2="\x01\x03\x05\x00\x00\x19\x84\xcc"; # 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 STDERR "data length=%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 &getvals1(\%rh,$pl1); # send second command print $sock $tobyd2; print STDERR "Data2 sent!\n"; # read 3 bytes from response my $b21=<$sock>; #0x01 my $b22=<$sock>; #0x03 my $b23=<$sock>; # length of data my $dl2=ord($b23); # data length printf STDERR "data length=%d\n",$dl2; # read the payload my $pl2=$b23; # payload for (my $i=0;$i<$dl2;$i++) { $pl2.=<$sock>; } # read checksum bytes my $c21=<$sock>; # checksum LSB my $c22=<$sock>; # checksum MSB # get overall checksum from data my $crc2=ord($c22)*256 + ord($c21); # calculate checksum from actual payload my $ctx2 = Digest::CRC->new(width=>16, init=>0x0284, xorout=>0x0000, refout=>1, poly=>0x8005, refin=>1, cont=>0); $ctx2->add($pl2); my $digest2=$ctx2->digest; printf STDERR "Payload length: %d, Checksum=%04X, Digest=%04X\n",length($pl2),$crc2,$digest2; if ($b21 ne "\x01" || $b22 ne "\x03" || $crc2 != $digest2) { die "illegal/unexpected data received"; } # print payload bytes my $num2=0; for (my $i=0;$i<length($pl2);$i++) { my $c=substr($pl2,$i,1); $num2++; my $o=ord($c); $c="."; if ($o > 31 && $o < 127) { $c=chr($o); } printf STDERR "%03d: %03d %02X %s\n",$num2,$o,$o,$c; } # extract the values from the payload &getvals2(\%rh,$pl2); # finally print the accumulated results foreach my $k (sort keys %rh) { printf STDOUT "%s = %s\n",$k,$rh{$k}; } $sock->close(); print STDERR "End.\n"; exit(0); sub getvals1 { my $h=shift @_; my $pl=shift @_; $$h{SerialNo}=substr($pl,1,19); $$h{"BMU-A"}=getvers(substr($pl,25,2)); $$h{"BMU-B"}=getvers(substr($pl,27,2)); $$h{BMS}=getvers(substr($pl,29,2)); } sub getvals2 { my $h=shift @_; my $pl=shift @_; $$h{SoC}=getshort(substr($pl,1,2)); $$h{CellVhigh}=getshort(substr($pl,3,2))/100; $$h{CellVlow}=getshort(substr($pl,5,2))/100; $$h{SoH}=getshort(substr($pl,7,2)); $$h{Vbatt}=getshort(substr($pl,11,2))/100; $$h{CellTempHigh}=getshort(substr($pl,13,2)); $$h{CellTempLow}=getshort(substr($pl,15,2)); $$h{Vout}=getshort(substr($pl,33,2))/100; my $currval=getshort(substr($pl,9,2)); if ($currval < 32768) { $$h{Current}=$currval/10; } else { $$h{Current}=($currval-2**16)/10; } } sub getshort { my $v=shift @_; return( ord(substr($v,0,1))*256 + ord(substr($v,1,1)) ); } sub getvers { my $v=shift @_; return( ord(substr($v,0,1)) . "." . ord(substr($v,1,1)) ); }
-
@hal Mit dem HVS kann ich leider nicht helfen, da ich einen HV habe. Und bei der Adapterprogrammierung muss ich leider auch passen.
Ich habs zumindest per Javascript und einen request geschafft, einzelne Werte aus der Statistik Info der BYD HV auszulesen, als Info, die @arteck noch nicht implementiert hat. Ging mir erst mal nur um Total Charge und Total Discharge Energy. Noch ziemlich rudimentär...var request = require("request"); var username = "user"; var pass = "user"; var url = "http://" + username + ":" + pass + "@192.168.6.1/asp/StatisticInformation.asp"; var cronStr = "3-58/5 * * * *"; // run every 5 minutes starting at 3 createState('Solar.BydTotalChargeEnergy', 0, {type: 'number',unit: 'kWh',role: 'value', name: 'BydTotalChargeEnergy',desc: 'Byd Gesamte Ladeleistung'}); createState('Solar.BydTotalDischargeEnergy', 0, {type: 'number',unit: 'kWh',role: 'value', name: 'BydTotalDischargeEnergy',desc: 'Byd Gesamte Entladeleistung'}); createState('Solar.BydBatteryEfficiency', 0, {type: 'number',unit: '%',role: 'value', name: 'BydBatteryEfficiency',desc: 'Byd Batterieeffizienz'}); function readBattStatistic() { request(url, function(err, state, body) { if (body) { //console.log(body); var match; var myRegexp = /Charge Energy:[\s\S]+?>(\d{3,5}\.\d{1,3})[\s\S]+?Discharge Energy:[\s\S]+?(\d{3,5}\.\d{1,3})/m; if ((match = body.match(myRegexp)) !== null) { //console.log(match); var charge = parseFloat(match[1]); //console.log(charge); setState('Solar.BydTotalChargeEnergy', charge, true); var discharge = parseFloat(match[2]); //console.log(discharge); setState('Solar.BydTotalDischargeEnergy', discharge, true); setState('Solar.BydBatteryEfficiency', discharge / charge * 100, true); } else console.log("not matched"); } }); }; schedule(cronStr, readBattStatistic);
-
Hallo zusammen,
hoffe hier auf Plenticore-Leidgenossen zu treffen, die auch gerne versch. Infos visualisieren möchten.
Würde gerne in einer Wochenansicht (Mo - So) den Hausverbrauch + Erzeugung PV auf Tagesebene nachvollziehen können. Wenn möglich gerne als klassisches Säulendiagramm.
Hat von euch jemand dies schon bewerkstelligt bekommen? Denke, dass @Scrounger material design bar chart von Hilfe sein könnte. Aber hier habe ich so meine Probleme dies zu über ein JSON zu realisieren.
Jemand eine Idee?? DANKE.
Das sind die Datensätze, die die Meisten kennen werden:
-
@bostil Ich nutze Influxdb für die Sammlung (also statt history Adapter) und habe dann Grafana installiert, das auf Influx zugreift.
Mein Graph sieht so aus:
So sieht es dann mit der Einstellung
6 Monate
ausUnd so mit der von dir genannten Woche
-
Kannst du mal bitte folgendes testen:
In der Datei
/opt/iobroker/node_modules/iobroker.plenticore/node_modules/@strathcole/iob-lib/lib/iob-lib.js
Zeile 111:
delete objectStates[id];
direkt dahinter noch eine Zeile einfügen:
delete stateStates[id];
Dann Adapter neu starten und nach dem nächsten Löschen der States (also Tageswechsel) den Logmodus wieder umstellen
Danke.
-
@strathcole In Version 2.1.6 gibt es die Ordnerstruktur so nicht. Ich finde nicht mal eine Datei mit "delete objectStates[id];" unterhalb von /opt/iobroker/node_modules/iobroker.plenticore/
Ich vermute dass es bei dieser Ver. noch in /opt/iobroker/node_modules/iobroker.plenticore/lib/plenticore.js ist? -
@diginix vielleicht hat er das iob-lib direkt im Hauptverzeichnis node_modules installiert. Sollte es schon länger geben.
-
@strathcole Stimmt, da liegt die Datei.
Sieht nun so aus. Den Loglevel aber erst morgen früh von error zurück nehmen?
-
@diginix kannst du auch jetzt schon
-
@strathcole Ok, erledigt. Ich werde berichten.
-
@strathcole Die Anpassung hat leider keine Besserung gebracht:
2021-02-04 07:48:47.262 - warn: plenticore.0 (1512441) State "plenticore.0.forecast.day1.power.1h.generated" has no existing object, this might lead to an error in future versions
Ich habe aber eben noch mal ein "adapter upload" gemacht und somit die Instanz neu gestartet. In den 10 Minuten seit dem sind keine Meldungen mehr gekommen.