[23_BYDBox] - Modul für BYD Box Battery

Begonnen von MiniBlister, 14 Juni 2021, 18:37:02

Vorheriges Thema - Nächstes Thema

MiniBlister

Hallo,

ich bin dabei, ein Modul zum Auslesen einer BYD Battery Box zu schreiben.
Es gibt dazu ein ioBroker Adapter, welchen ich als Basis genommen haben. Vielen Dank dafür.

Im Anhang eine erste Version. Es gibt noch keine Beschreibung dazu, noch ist das State Reading sauber definiert.
Ich stehe noch vor einer größeren Herausforderung, wobei mir gerne jemand helfen kann. Es geht darum, dass die Battery ca 4-5 Sekunden braucht, bis die Daten der Zellen verfügbar sind.
Derzeit mache ich das mit sleep(4), was blockiered ist. Wenn jemand eine besser Lösung hat freue ich mich über jede Hilfe.

Jeder der eine BYD Box Zuhause hat muss diese zuerst per LAN in sein Netzwerk nehmen und in seinem Router das Port Forwarding einrichten. Hierzu gibt es im Internet gute Erklärungen.
Sobald ich zur Dokumentation komme, werde ich dieses entsprechend beschreiben.


define [name] BYDBox IP-Addresse Intervall

Beispiel:
define myBYDBox BYDBox 192.168.178.32 60


Ich habe ein Polling Mechanismus implementiert. Alle 60 Sekunde werden die Daten geholt. Dies kann man über das Interval einstellen.
60 Sekunden ist das minimum.

Feedback und Hilfe wie beschrieben ist willkommen.

KölnSolar

#1
Zitatin seinem Router das Port Forwarding einrichten
Wozu ? Kannst Du grob die Basis Deines Moduls schildern ?

ZitatIch stehe noch vor einer größeren Herausforderung, wobei mir gerne jemand helfen kann. Es geht darum, dass die Battery ca 4-5 Sekunden braucht, bis die Daten der Zellen verfügbar sind.
Derzeit mache ich das mit sleep(4), was blockiered ist.
Kannst Du nicht beim define den socket-Aufbau mit FHEM-Mitteln(ich meine damit eine permanente, dauerhafte Verbindung) machen ? Du setzt dann nur den Read-request ab und nach den 4s meldet sich FHEM mit dem Aufruf Deiner Read-Funktion.

Ansonsten könntest Du BlockingCall einsetzen, um das Blockieren des Haupt-FHEM zu vermeiden.

Den Leitfaden für die Modulentwicklung kennst Du ?

Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

MiniBlister

#2
Zitat von: KölnSolar am 14 Juni 2021, 22:08:33
Wozu ? Kannst Du grob die Basis Deines Moduls schildern ?
Sicherlich und bitte entschuldige die nur kurze Erklärung in meinem ersten Post.
Die BYD Battery hat sowohl ein WLAN Access Point als auch eine Ethernet Schnittstelle. Beides ist nicht wirklich konfigurierbar. Es gibt auch keine "Werksreset" Möglichkeit. Sobald man eine falsche Einstellung vornimmt, kann es sein, dass die BYD Box nicht mehr erreichbar ist.
Daher ist die allgemeine Empfehlung, die Einstellungen zu belassen. 192.168.16.254 bei 255.255.255.255
Zu dieser Addresse habe ich eine IPV4 Route in der Fritzbox eingerichtet.

Was ich aus der BYD Box auslesen ist die State Of Charge Info bzw. die einzelnen Zell-Temeraturen und die Spannungen.
Zitat von: KölnSolar am 14 Juni 2021, 22:08:33
Ansonsten könntest Du BlockingCall einsetzen, um das Blockieren des Haupt-FHEM zu vermeiden.
Wenn du durch meinen Code durch gehst, wirst du sehen, dass ich es so implementiert habe. Wenn das ok ist, dann passt das für mich auch. Ich habe mich sehr an das Luxtronic Module gehalten, welches ich selbst verwende und noch kaum Probleme mit hatte.
Zitat von: KölnSolar am 14 Juni 2021, 22:08:33
Kannst Du nicht beim define den socket-Aufbau mit FHEM-Mitteln(ich meine damit eine permanente, dauerhafte Verbindung) machen ? Du setzt dann nur den Read-request ab und nach den 4s meldet sich FHEM mit dem Aufruf Deiner Read-Funktion.
Ich habe im Code ein paar Zeilen drin, die sowas abbilden (auskommentiert). Leider hat das noch nicht funktioniert. Es ist eine Sequenz von Hex Codes, die man an die Box schicken muss, und die in einer Sequenz kommen müssen:

Send: "\x01\x10\x05\x50\x00\x02\x04\x00\x01\x81\x00\xf8\x53"
Wait 4 Seconds
Send: "\x01\x03\x05\x51\x00\x01\xd5\x17"
Read: first 64 Module
Send: "\x01\x03\x05\x51\x00\x01\xd5\x17"
Read: next 64 Module
Send: "\x01\x03\x05\x51\x00\x01\xd5\x17"
Read: next 64 Module

Wie ich eine solche Sequenz üeber syswrite und sysread abbilden soll ist mir nicht klar. Hier wäre ich über jede Hilfe dankbar.
Hoffe das hilft etwas.

KölnSolar

ZitatZu dieser Addresse habe ich eine IPV4 Route in der Fritzbox eingerichtet.Zu dieser Addresse habe ich eine IPV4 Route in der Fritzbox eingerichtet.
Route ist ja OK. Bei
Zitatin seinem Router das Port Forwarding einrichten
gingen bei mir die roten Lampen bzgl. Öffnung(=Einfallstor) nach außen an.

ZitatSend: "\x01\x10\x05\x50\x00\x02\x04\x00\x01\x81\x00\xf8\x53"
Wait 4 Seconds
Send: "\x01\x03\x05\x51\x00\x01\xd5\x17"
Ah, erst etwas senden und dann nochmal ohne vorherige Antwort etwas senden. Bei permanenter FHEM-Verbindung könntest Du es vielleicht über einen internaltimer lösen ?

ZitatWenn du durch meinen Code durch gehst, wirst du sehen, dass ich es so implementiert habe. Wenn das ok ist, dann passt das für mich auch.
BlockingCall ist ja grundsätzlich nicht verkehrt. Ich nutze es auch gerne, aber es gibt Stimmen, dass es Probleme geben kann. Insbesondere, wenn es nicht sauber implementiert ist(Speicherproblematik).

In meinem SamsungAV hab ich es auch implementiert. Ich hab das Problem, dass der TV laaangsam antwortet. Mein Ziel(wenn Zeit ist) ist, den BlockingCall zu eliminieren. Ist aber nur ein Gedanke u. ob es klappt, weiß ich noch nicht. In der dauerhaften Verbindung sehe ich die Vorteile
- Standard reconnect-Management durch FHEM
- zeitnaher presence-Status ohne internaltimer/interval
- weniger Systemlast(von Last kann man dabei natürlich kaum reden)

Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

isy

Hallo Miniblister, gibt es eine aktuelle Info zu deinem Modul?
VG Helmut
Ein Weg wird erst zu einem Weg, wenn man ihn geht

stephan-221

#5
Hi,

ich habe das Modul heute mal probeweise installiert.
verbose sollte man auf 0 setzen, sonst bekommt man das Logfile sehr voll.

Das BYD HVS erkennt meinen Intervertypen nicht.

Fehlermeldung:
Use of uninitialized value within %BYDBox_myInvTypes in concatenation (.) or string at ./FHEM/23_BYDBox.pm line 417.


Die Liste habe ich erweitert:
Ab Zeile 104:   Eintrag 19

my %BYDBox_myInvTypes = (
    "0" => "Fronius HV",
    "1" => "Goodwe HV",
    "2" => "Fronius HV",
    "3" => "Kostal HV",
    "4" => "Goodwe HV",
    "5" => "SMA SBS3.7/5.0",
    "6" => "Kostal HV",
    "7" => "SMA SBS3.7/5.0",
    "8" => "Sungrow HV",
    "9" => "Sungrow HV",
    "10" => "Kaco HV",
    "11" => "Kaco HV",
    "12" => "Ingeteam HV",
    "13" => "Ingeteam HV",
    "14" => "SMA SBS 2.5 HV",
    "15" => "",
    "16" => "SMA SBS 2.5 HV",
    "17" => "Fronius HV",
     "19" => "SMA STPx.0-3SE-40"
  );



So bleibt zumindest erstmal das Log etwas sauberer.


stephan-221

Ich habe ein paar Kleinigkeiten angepasst und teile die Version gerne.

- verbose 1 gibt nun keine überflüssigen Ausgaben aus
- Kompletter Datenstring in den Readings auskommentiert. -> Nur zum Debugging notwendig
- Liste der bekannten Wechselrichter erweitert.
- Experimentell: state ok wenn Daten empfangen wurden.

Folgendes stateFormat Attribut habe ich gesetzt, damit man die wichtigsten Infos im Blick hat:

stateFormat SOC % hvsPower Watt Entladen (+), Laden (-)<br> hvsBatTemp °C




MadMax

#7
Hallo MiniBlister, hallo Stephan,

erstmal Danke!

Ich musste noch zwei Pakete nachinstallieren.

sudo apt-get install libswitch-perl
sudo apt-get install libio-socket-timeout-perl


So, ich habe mir das Modul zum testen mal eingerichtet.
Was mir aufgefallen ist es steht immer hvs, ich habe aber einen HVM Speicher, das ist aber erstmal unwichtig.
Bald kommen die HVC und HVL Speicher mit dem selben BMS, also wäre hier eine allgemeinere Bezeichnung besser?

Dann hvsBatteryVoltsperCell_xx geht bis 15, das wären dann die Zellen vom ersten Block, davon wären es bei mir dann alsi 112st.
Hängen die Daten noch hinten mit an und müssen nur ausgelesen werden?

Die einzelnen Temperaturen der Zellen würden mich noch interessieren :)

Aber erstmal super das es funktioniert und ich daten aus dem Speicher bekomme, würde eventuell zum Wochenende mal selbst Forschen.

Freue mich auf die Weiterentwicklung!

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

stephan-221

Hi Max,

Die Variablen/Readings heißen zwar hvs, aber der BatteryType wird ja erkannt und auch als Reading ausgegeben:

BatteryType           HVS

Die Liste kennt aktuell die IDs für HVL,HVS und HVM:

my %BYDBox_myBattTypes  = (
    "0" => "HVL",
    "1" => "HVM",
    "2" => "HVS",
);

In die weiteren Strukturen habe ich mich noch nicht eingelesen.
Aber ich füge dir mal zwei perl-scripte von solaranzeige.de oder aus dem Photovoltaikforum an.
Die kann man auf der shell ausführen.   Das Problem bei den Detaildaten ist, dass diese ein paar Sekunden brauchen.
Das ist mit der orig. Windows SW von BYD ja auch so.

Im FHEM Modul Zeile 468 solltest du vielleicht Glück haben, wenn du die 16 auf 112 erhöhst:

  my @hvsBatteryVoltsperCell = ();
  for(my $fi=0; $fi<16; $fi++) {
    $hvsBatteryVoltsperCell[$fi + 1] = BYDBox_buf2int16SI(\@BYDCell_values1, $fi * 2 + 101);
    $return_str .= "|".BYDBox_buf2int16SI(\@BYDCell_values1, $fi * 2 + 101);
  }

  return "$return_str";
}



MadMax

Hallo Stephan,

das hatte ich mir im Modul auch schon angeschaut und werde es mal probieren.
Die angehängten scripte werde ich mal ausprobieren.

Ja das die Aufrege eine weile dauert kenne ich aus dem PC Programm. Mal sehen ob die Daten sowieso schon mitgesendet werden. Dann sollte es nicht so lange dauern.

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

stephan-221

Hallo Max,

soviel sei verraten:

So einfach ist es wohl nicht. Ich habe in den Zeilen  469,706,719 jeweils  <16 gegen <32 ausgetauscht. Die Readings sehen dann so aus:

hvsBatteryVoltsperCell_16 8535
hvsBatteryVoltsperCell_17 0   (und alle weiteren auch 0)

Anhand des BattTypes wird auch schon korrekt vorher definiert (Zeile 433 ff.) wieviele Spannungs und Temp Sensoren vorhanden sind. Hier wird aber an diesen Stellen immer fest von 16 Sensoren ausgegangen.

Also noch ein wenig Studium für dich ;-)

Viele Grüße
Stephan


MadMax

Hallo Stephan,

mit der Angehängten Version bekomme ich schon fast alles.
Die Daten wurden bereits gelesen nur nicht in readings geschrieben.

Das ist jetzt etwas quick&dirty zum testen ;)

Mache die Tage mal weiter.

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

stephan-221


Ich habe nun mit meinem HVS mit 4 Modulen 29 Tempsensoren und müsste 48 haben.
Bei den Spannungswerten sind es 128 Sensoren und FHEM hat 0-127. Passt also.
Allerdings bei den Spannungen sind die Werte 127=0 und  79=12788.
Bei den Temperaturen sind 28 und 29 nicht korrekt (38° 203°).

Die Prefixe der Readings könnte man ja auf bms statt hvs ändern.
Ich würde die Spannungssensoren mit 2 führenden Nullen anlegen. Dann ist alles in FHEM ordentlich sortiert.

Soweit mal der Gegencheck ;-)


MadMax

Ja, bei den Temperaturen lese ich noch nicht alle.
Das mit den zwei führenden Nullen hatte ich auch so überlegt.
Das mit der Spannung 79 kann ich so bestätigen, ich denke hier stimmen noch irgendwelche Längen nicht.
Werde das mal direkt mit den Werten aus dem Programm abgleichen.
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

stephan-221


Jetzt habe ich mir deine Änderungen auch mal angesehen. Mehr Temperaturen gehen auch.
Allerdings zwei falsche Readings.

Die Readings 3-stellig für Spannung geht ja recht einfach mit sprintf("%2.3d"

Im Perlscript (ext) sieht man die Pakete, wo jeweils die Spannungen und Temperaturen liegen.
Das wird im FHEM Modul ab Zeile 469 auch so ungefähr gemacht.

Ich vermute hier noch einen Fehler dank Zählweise beginn mit 0 oder 1.

BTW: Was willst du mit allen Spannungen und Temperaturen machen? Mir persönlich reichen die min/max Werte. Primär gehts mir um SOC, Current, Leistung und dann noch Error, damit ich direkt ne SMS bekomme, wenn man ein Fehler da ist, oder die Temperatur >120° im Akku ist.