Interessant wäre vermutlich noch der SOC mit Kommastelle. Dieser kommt als vorletzter Wert bei readBYD2.pl. Damit hat man halt einen noch genaueren Verlauf. Nach dem SOH kämen dann noch Turmspannungen (netto / brutto) und dann SOC mit Kommastelle und als letztes der Errorcode.
Hier mal mein Auslesen, vielleicht kannst Du es damit leichter nachvollziehen / bzw. nachbauen:
Code: Alles auswählen
/****************************************************************************
// CvT Anpassungen Auslesen BYD, Voltage, Temperatur, SOH
****************************************************************************/
$shell_befehl = "perl /var/www/html/readBYD2.pl";
#print_r ($shell_befehl);
$temp = shell_exec($shell_befehl);
$Einzelwerte = preg_split("/[\s,\n ]+/", $temp);
$aktuelleDaten["XSOC"] = 0;
if ($Einzelwerte[0] == 0) {
$aktuelleDaten["CellTempHigh"] = 20;
$aktuelleDaten["CellTempLow"] = 20;
$aktuelleDaten["CellVoltHigh"] = 3.30;
$aktuelleDaten["CellVoltLow"] = 3.28;
$aktuelleDaten["SOH"] = 100;
$aktuelleDaten["XSOC"] = 0;
$aktuelleDaten["Error"] = 0;
} else {
$aktuelleDaten["CellTempHigh"] = $Einzelwerte[4];
$aktuelleDaten["CellTempLow"] = $Einzelwerte[5];
$aktuelleDaten["CellVoltHigh"] = $Einzelwerte[6];
$aktuelleDaten["CellVoltLow"] = $Einzelwerte[7];
$aktuelleDaten["SOH"] = $Einzelwerte[11];
$aktuelleDaten["XSOC"] = $Einzelwerte[14];
$aktuelleDaten["Error"] = $Einzelwerte[15];
}
if ($aktuelleDaten["XSOC"] == 0) {
$aktuelleDaten["Query"] = "db=" . $InfluxDBLokal . "&q=" . urlencode("select last(XSOC) from Batterie");
$rc = $funktionen->po_influxdb_lesen($aktuelleDaten);
$aktuelleDaten["XSOC"] = $rc["results"][0]["series"][0]["values"][0][1];
}
$aktuelleDaten["ErrorStr"] = "";
if ($aktuelleDaten["Error"] & 1) { //1. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "High Temperature Charging (Cells); ";
}
if ($aktuelleDaten["Error"] & 2) { //2. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "Low Temperature Charging (Cells); ";
}
if ($aktuelleDaten["Error"] & 4) { //3. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "Over Current Discharging; ";
}
if ($aktuelleDaten["Error"] & 8) { //4. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "Over Current Charging; ";
}
if ($aktuelleDaten["Error"] & 16) { //5. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "Main circuit Failure; ";
}
if ($aktuelleDaten["Error"] & 32) { //6. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "Short Current Alarm; ";
}
if ($aktuelleDaten["Error"] & 64) { //7. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "Cells Imbalance; ";
}
if ($aktuelleDaten["Error"] & 128) { //8. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "Current Sensor Failure; ";
}
if ($aktuelleDaten["Error"] & 256) { //9. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "Battery Over Voltage; ";
}
if ($aktuelleDaten["Error"] & 512) { //10. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "Battery Under Voltage; ";
}
if ($aktuelleDaten["Error"] & 1024) { //11. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "Cell Over Voltage; ";
}
if ($aktuelleDaten["Error"] & 2048) { //12. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "Cell Under Voltage; ";
}
if ($aktuelleDaten["Error"] & 4096) { //13. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "Voltage Sensor Failure; ";
}
if ($aktuelleDaten["Error"] & 8192) { //14. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "Temperature Sensor Failure; ";
}
if ($aktuelleDaten["Error"] & 16384) { //15. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "High Temperature Discharging (Cells); ";
}
if ($aktuelleDaten["Error"] & 32768) { //16. Bit gesetzt
$aktuelleDaten["ErrorStr"] .= "Low Temperature Discharging (Cells); ";
}
if ($aktuelleDaten["ErrorStr"] == "") {
$aktuelleDaten["ErrorStr"] = "no Errors";
}