Implement BMS trip energy calculation

This commit is contained in:
Carsten Schmiemann 2022-04-20 22:56:03 +02:00
parent db8ec152e5
commit a7d3c42791
4 changed files with 39 additions and 15 deletions

View File

@ -92,9 +92,9 @@ static const OvmsVehicle::poll_pid_t renault_zoe_polls[] = {
{ 0x18dadbf1, 0x18daf1db, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x925D, { 0, 10, 3, 5 }, 0, ISOTP_EXTFRAME }, // Battery Current
{ 0x18dadbf1, 0x18daf1db, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x9012, { 0, 10, 60, 5 }, 0, ISOTP_EXTFRAME }, // Battery Average Temperature
{ 0x18dadbf1, 0x18daf1db, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x91C8, { 0, 60, 60, 5 }, 0, ISOTP_EXTFRAME }, // Battery Available Energy kWh
{ 0x18dadbf1, 0x18daf1db, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x9243, { 0, 60, 60, 60 }, 0, ISOTP_EXTFRAME }, // Energy charged kWh
{ 0x18dadbf1, 0x18daf1db, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x9245, { 0, 60, 60, 60 }, 0, ISOTP_EXTFRAME }, // Energy discharged kWh
{ 0x18dadbf1, 0x18daf1db, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x9247, { 0, 60, 60, 60 }, 0, ISOTP_EXTFRAME }, // Energy regenerated kWh
{ 0x18dadbf1, 0x18daf1db, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x9243, { 0, 60, 60, 10 }, 0, ISOTP_EXTFRAME }, // Energy charged kWh
{ 0x18dadbf1, 0x18daf1db, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x9245, { 0, 60, 10, 60 }, 0, ISOTP_EXTFRAME }, // Energy discharged kWh
{ 0x18dadbf1, 0x18daf1db, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x9247, { 0, 60, 10, 60 }, 0, ISOTP_EXTFRAME }, // Energy regenerated kWh
//{ 0x18dadbf1, 0x18daf1db, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x21D9, { 0, 10, 10, 10 }, 0, ISOTP_EXTFRAME }, // Charging State (1: Slow, 2: Fast, 3: Init Charging)
//{ 0x18dadbf1, 0x18daf1db, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x9007, { 0, 10, 60, 10 }, 0, ISOTP_EXTFRAME }, // Cell Max Voltage
//{ 0x18dadbf1, 0x18daf1db, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x9009, { 0, 10, 60, 10 }, 0, ISOTP_EXTFRAME }, // Cell Min Voltage

View File

@ -47,11 +47,13 @@ void OvmsVehicleRenaultZoePh2::WebCfgCommon(PageEntry_t& p, PageContext_t& c)
{
std::string error, rangeideal, battcapacity;
bool UseCarTrip;
bool UseBMScalculation;
if (c.method == "POST") {
rangeideal = c.getvar("rangeideal");
battcapacity = c.getvar("battcapacity");
UseCarTrip = (c.getvar("UseCarTrip") == "yes");
UseCarTrip = (c.getvar("UseCarTrip") == "no");
UseBMScalculation = (c.getvar("UseBMScalculation") == "no");
if (!rangeideal.empty()) {
int v = atoi(rangeideal.c_str());
@ -63,6 +65,7 @@ void OvmsVehicleRenaultZoePh2::WebCfgCommon(PageEntry_t& p, PageContext_t& c)
MyConfig.SetParamValue("xrz2", "rangeideal", rangeideal);
MyConfig.SetParamValue("xrz2", "battcapacity", battcapacity);
MyConfig.SetParamValueBool("xrz2", "UseCarTrip", UseCarTrip);
MyConfig.SetParamValueBool("xrz2", "UseBMScalculation", UseBMScalculation);
c.head(200);
c.alert("success", "<p class=\"lead\">Renault Zoe Ph2 battery setup saved.</p>");
@ -77,10 +80,10 @@ void OvmsVehicleRenaultZoePh2::WebCfgCommon(PageEntry_t& p, PageContext_t& c)
}
else {
// read configuration:
rangeideal = MyConfig.GetParamValue("xrz2", "rangeideal", "350");
battcapacity = MyConfig.GetParamValue("xrz2", "battcapacity", "52000");
UseCarTrip = MyConfig.GetParamValueBool("xrz2", "UseCarTrip", false);
rangeideal = MyConfig.GetParamValue("xrz2", "rangeideal", "350");
battcapacity = MyConfig.GetParamValue("xrz2", "battcapacity", "52000");
UseCarTrip = MyConfig.GetParamValueBool("xrz2", "UseCarTrip", false);
UseBMScalculation = MyConfig.GetParamValueBool("xrz2", "UseBMScalculation", false);
c.head(200);
}
@ -99,9 +102,14 @@ void OvmsVehicleRenaultZoePh2::WebCfgCommon(PageEntry_t& p, PageContext_t& c)
"<p>Default 350km. Ideal Range...</p>");
c.fieldset_start("Trip counter settings");
c.input_radio_start("Which tripcounter to use", "UseCarTrip");
c.input_radio_option("UseCarTrip", "Internal (New trip everytime car starts)", "internal", UseCarTrip == false);
c.input_radio_option("UseCarTrip", "Car trip counter from Cluster", "Car trip", UseCarTrip == true);
c.input_radio_start("Which tripcounter to use?", "UseCarTrip");
c.input_radio_option("UseCarTrip", "Internal (New trip everytime car starts)", "no", UseCarTrip == false);
c.input_radio_option("UseCarTrip", "Car trip counter from Cluster", "yes", UseCarTrip == true);
c.input_radio_end("");
c.input_radio_start("Which trip energy calculation?", "UseBMScalculation");
c.input_radio_option("UseBMScalculation", "OVMS energy calculation", "no", UseBMScalculation == false);
c.input_radio_option("UseBMScalculation", "BMS-based calculation", "yes", UseBMScalculation == true);
c.input_radio_end("");
c.fieldset_end();

View File

@ -114,8 +114,9 @@ void OvmsVehicleRenaultZoePh2::ConfigChanged(OvmsConfigParam* param) {
m_range_ideal = MyConfig.GetParamValueInt("xrz2", "rangeideal", 350);
m_battery_capacity = MyConfig.GetParamValueInt("xrz2", "battcapacity", 52000);
m_UseCarTrip = MyConfig.GetParamValueBool("xrz2", "UseCarTrip", false);
m_UseBMScalculation = MyConfig.GetParamValueBool("xrz2", "UseBMScalculation", false);
StandardMetrics.ms_v_bat_range_ideal->SetValue(m_range_ideal, Kilometers);
ESP_LOGI(TAG, "Renault Zoe Ph2 reload configuration: Range ideal: %d, Battery capacity: %d", m_range_ideal, m_battery_capacity);
ESP_LOGI(TAG, "Renault Zoe Ph2 reload configuration: Range ideal: %d, Battery capacity: %d, Use Car trip counter: %s, Use BMS as energy cout: %s", m_range_ideal, m_battery_capacity, m_UseCarTrip ? "Yes" : "No", m_UseBMScalculation ? "yes" : "no");
}
/**
@ -248,7 +249,7 @@ void OvmsVehicleRenaultZoePh2::ChargeStatistics() {
}
}
void OvmsVehicleRenaultZoePh2::EnergyStatistics() {
void OvmsVehicleRenaultZoePh2::EnergyStatisticsOVMS() {
float voltage = StandardMetrics.ms_v_bat_voltage->AsFloat(0, Volts);
float current = StandardMetrics.ms_v_bat_current->AsFloat(0, Amps);
@ -263,11 +264,20 @@ void OvmsVehicleRenaultZoePh2::EnergyStatistics() {
}
}
void OvmsVehicleRenaultZoePh2::EnergyStatisticsBMS() {
StandardMetrics.ms_v_bat_energy_used->SetValue(StandardMetrics.ms_v_bat_energy_used_total->AsFloat() - mt_bat_used_start->AsFloat());
StandardMetrics.ms_v_bat_energy_recd->SetValue(StandardMetrics.ms_v_bat_energy_recd_total->AsFloat() - mt_bat_recd_start->AsFloat());
}
void OvmsVehicleRenaultZoePh2::Ticker10(uint32_t ticker) {
if (StandardMetrics.ms_v_charge_pilot->AsBool() && !StandardMetrics.ms_v_env_on->AsBool()) {
ChargeStatistics();
} else {
EnergyStatistics();
if (m_UseBMScalculation) {
EnergyStatisticsBMS();
} else {
EnergyStatisticsOVMS();
}
}
}
@ -279,6 +289,10 @@ void OvmsVehicleRenaultZoePh2::Ticker1(uint32_t ticker) {
mt_pos_odometer_start->SetValue(StandardMetrics.ms_v_pos_odometer->AsFloat(0));
StandardMetrics.ms_v_bat_energy_used->SetValue(0);
StandardMetrics.ms_v_bat_energy_recd->SetValue(0);
if (m_UseBMScalculation) {
mt_bat_used_start->SetValue(StandardMetrics.ms_v_bat_energy_used_total->AsFloat());
mt_bat_recd_start->SetValue(StandardMetrics.ms_v_bat_energy_recd_total->AsFloat());
}
}
if (CarIsDriving && !CarIsDrivingInit) {
CarIsDrivingInit = true;

View File

@ -79,6 +79,7 @@ class OvmsVehicleRenaultZoePh2 : public OvmsVehicle {
int m_range_ideal;
int m_battery_capacity;
bool m_UseCarTrip = false;
bool m_UseBMScalculation = false;
void IncomingINV(uint16_t type, uint16_t pid, const char* data, uint16_t len);
void IncomingEVC(uint16_t type, uint16_t pid, const char* data, uint16_t len);
void IncomingBCM(uint16_t type, uint16_t pid, const char* data, uint16_t len);
@ -88,7 +89,8 @@ class OvmsVehicleRenaultZoePh2 : public OvmsVehicle {
void IncomingCLUSTER(uint16_t type, uint16_t pid, const char* data, uint16_t len);
int calcMinutesRemaining(float charge_voltage, float charge_current);
void ChargeStatistics();
void EnergyStatistics();
void EnergyStatisticsOVMS();
void EnergyStatisticsBMS();
virtual void Ticker10(uint32_t ticker);//Handle charge, energy statistics
virtual void Ticker1(uint32_t ticker); //Handle trip counter