Add battery capacity web chooser, minor fixes, add trip counter

This commit is contained in:
Carsten Schmiemann 2022-04-18 03:13:01 +02:00
parent c8cbbfe5a0
commit 0e32024133
4 changed files with 83 additions and 9 deletions

View File

@ -55,6 +55,8 @@ void OvmsVehicleRenaultZoePh2::IncomingEVC(uint16_t type, uint16_t pid, const ch
if (!CarIsCharging) { POLLSTATE_ON; }
} else if (CAN_NIBL(0) == 2) {
mt_inv_status->SetValue("Inverter on");
StandardMetrics.ms_v_pos_trip->SetValue(0);
mt_pos_odometer_start->SetValue(StandardMetrics.ms_v_pos_odometer->AsFloat(0));
StandardMetrics.ms_v_env_on->SetValue(true);
POLLSTATE_RUNNING;
} else if (CAN_NIBL(0) == 3) {

View File

@ -43,6 +43,67 @@ using namespace std;
#define _attr(text) (c.encode_html(text).c_str())
#define _html(text) (c.encode_html(text).c_str())
void OvmsVehicleRenaultZoePh2::WebCfgBattery(PageEntry_t& p, PageContext_t& c)
{
std::string error, rangeideal, battcapacity;
if (c.method == "POST") {
rangeideal = c.getvar("rangeideal");
battcapacity = c.getvar("battcapacity");
if (!rangeideal.empty()) {
int v = atoi(rangeideal.c_str());
if (v < 90 || v > 500)
error += "<li data-input=\"rangeideal\">Range Ideal must be of 80…500 km</li>";
}
if (!battcapacity.empty()) {
int v = atoi(rangeideal.c_str());
if (v < 40000 || v > 52000)
error += "<li data-input=\"battcapacity\">Battery Capacity must be of 40000…52000 Wh</li>";
}
if (error == "") {
// store:
MyConfig.SetParamValue("xrz", "rangeideal", rangeideal);
MyConfig.SetParamValue("xrz", "battcapacity", battcapacity);
c.head(200);
c.alert("success", "<p class=\"lead\">Renault Zoe Ph2 battery setup saved.</p>");
MyWebServer.OutputHome(p, c);
c.done();
return;
}
error = "<p class=\"lead\">Error!</p><ul class=\"errorlist\">" + error + "</ul>";
c.head(400);
c.alert("danger", error.c_str());
}
else {
// read configuration:
rangeideal = MyConfig.GetParamValue("xrz", "rangeideal", "350");
battcapacity = MyConfig.GetParamValue("xrz", "battcapacity", "52000");
c.head(200);
}
c.panel_start("primary", "Renault Zoe Ph2 Battery Setup");
c.form_start(p.uri);
c.fieldset_start("Battery size and Ideal range");
c.input_slider("Range Ideal", "rangeideal", 3, "km", -1, atoi(rangeideal.c_str()), 350, 80, 500, 1,
"<p>Default 350km. Ideal Range...</p>");
c.input_slider("Battery Capacity", "battcapacity", 5, "Wh", -1, atoi(battcapacity.c_str()), 52000, 40000, 52000, 100,
"<p>Default 52000. Battery Capacity...</p>");
c.fieldset_end();
c.print("<hr>");
c.input_button("default", "Save");
c.form_end();
c.panel_end();
c.done();
}
/**
* WebInit: register pages
@ -50,6 +111,7 @@ using namespace std;
void OvmsVehicleRenaultZoePh2::WebInit()
{
MyWebServer.RegisterPage("/xrz2/battmon", "BMS View", OvmsWebServer::HandleBmsCellMonitor, PageMenu_Vehicle, PageAuth_Cookie);
MyWebServer.RegisterPage("/xrz2/battery", "Battery config", WebCfgBattery, PageMenu_Vehicle, PageAuth_Cookie);
ESP_LOGI(TAG, "Register BMS Web Page");
}
@ -59,7 +121,9 @@ void OvmsVehicleRenaultZoePh2::WebInit()
void OvmsVehicleRenaultZoePh2::WebDeInit()
{
MyWebServer.DeregisterPage("/xrz2/battmon");
MyWebServer.DeregisterPage("/xrz2/battery");
ESP_LOGI(TAG, "De-Register BMS Web Page");
}
#endif //CONFIG_OVMS_COMP_WEBSERVER

View File

@ -77,6 +77,10 @@ OvmsVehicleRenaultZoePh2::OvmsVehicleRenaultZoePh2() {
mt_hvac_compressor_power = MyMetrics.InitFloat("zph2.h.compressor.power", SM_STALE_MID, 0, Watts);
mt_hvac_compressor_mode = MyMetrics.InitString("zph2.h.compressor.mode", SM_STALE_MID, 0);
// get values from config store
m_range_ideal = MyConfig.GetParamValueInt("xrz2", "rangeideal", 350);
m_battery_capacity = MyConfig.GetParamValueInt("xrz2", "battcapacity", 52000);
// BMS configuration:
BmsSetCellArrangementVoltage(96, 1);
BmsSetCellArrangementTemperature(12, 1);
@ -85,9 +89,6 @@ OvmsVehicleRenaultZoePh2::OvmsVehicleRenaultZoePh2() {
BmsSetCellDefaultThresholdsVoltage(0.030, 0.050);
BmsSetCellDefaultThresholdsTemperature(4.0, 5.0);
//Battery capacity
m_battery_capacity= 52000;
#ifdef CONFIG_OVMS_COMP_WEBSERVER
WebInit();
#endif
@ -109,7 +110,6 @@ void OvmsVehicleRenaultZoePh2::IncomingFrameCan1(CAN_frame_t* p_frame) {
if (mt_bus_awake->AsBool() && data[0] == 0x83 && data[1] == 0xc0) {
ESP_LOGI(TAG,"Zoe has gone to sleep (CAN Gateway NAK response)");
mt_bus_awake->SetValue(false);
StandardMetrics.ms_v_env_on->SetValue(false);
StandardMetrics.ms_v_env_awake->SetValue(false);
StandardMetrics.ms_v_env_charging12v->SetValue(false);
StandardMetrics.ms_v_pos_speed->SetValue( 0 );
@ -121,7 +121,6 @@ void OvmsVehicleRenaultZoePh2::IncomingFrameCan1(CAN_frame_t* p_frame) {
if (!mt_bus_awake->AsBool() && (data[0] == 0x05 || data[0] == 0x06 || data[0] == 0x07)) { //listen for SingleFrames (0x0) with length of 5-7
ESP_LOGI(TAG,"Zoe woke up (CAN Bus activity detected)");
mt_bus_awake->SetValue(true);;
StandardMetrics.ms_v_env_on->SetValue(true);
StandardMetrics.ms_v_env_awake->SetValue(true);
StandardMetrics.ms_v_env_charging12v->SetValue(true);
POLLSTATE_ON;
@ -217,13 +216,20 @@ void OvmsVehicleRenaultZoePh2::Ticker10(uint32_t ticker) {
int minsremaining = calcMinutesRemaining(charge_voltage, charge_current);
StandardMetrics.ms_v_charge_duration_range->SetValue(minsremaining / 10, Minutes);
ESP_LOGV(TAG, "Charge time remaining: %d mins, AC current: %f with %s", minsremaining / 10, ac_current, ac_phases.c_str());
ESP_LOGV(TAG, "Charge time remaining: %d mins at %f kW, AC current: %f A with %s", minsremaining / 10, charger_power, ac_current, ac_phases.c_str());
StandardMetrics.ms_v_charge_efficiency->SetValue(fabs(battery_power / charger_power) * 100.0);
ESP_LOGD(TAG, "Charger efficiency %f", StandardMetrics.ms_v_charge_efficiency->AsFloat(100));
}
}
//Handle trip counter
void OvmsVehicleRenaultZoePh2::Ticker1(uint32_t ticker) {
if (StandardMetrics.ms_v_env_on->AsBool()) {
StandardMetrics.ms_v_pos_trip->SetValue(StandardMetrics.ms_v_pos_odometer->AsFloat(0) - mt_pos_odometer_start->AsFloat(0));
}
}
class OvmsVehicleRenaultZoePh2Init {
public: OvmsVehicleRenaultZoePh2Init();
} MyOvmsVehicleRenaultZoePh2Init __attribute__ ((init_priority (9000)));

View File

@ -63,8 +63,7 @@ class OvmsVehicleRenaultZoePh2 : public OvmsVehicle {
public:
OvmsVehicleRenaultZoePh2();
~OvmsVehicleRenaultZoePh2();
static OvmsVehicleRenaultZoePh2* GetInstance(OvmsWriter* writer=NULL);
static void WebCfgBattery(PageEntry_t& p, PageContext_t& c);
void IncomingFrameCan1(CAN_frame_t* p_frame);
void IncomingPollReply(canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t remain);
void WebInit();
@ -74,6 +73,7 @@ class OvmsVehicleRenaultZoePh2 : public OvmsVehicle {
bool CarLastCharging = false;
protected:
int m_range_ideal;
int m_battery_capacity;
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);
@ -82,7 +82,9 @@ class OvmsVehicleRenaultZoePh2 : public OvmsVehicle {
void IncomingHVAC(uint16_t type, uint16_t pid, const char* data, uint16_t len);
void IncomingUCM(uint16_t type, uint16_t pid, const char* data, uint16_t len);
int calcMinutesRemaining(float charge_voltage, float charge_current);
virtual void Ticker10(uint32_t ticker); //Charging statistics
virtual void Ticker10(uint32_t ticker); //Handle charge statistics
virtual void Ticker1(uint32_t ticker); //Handle trip counter
// Renault ZOE specific metrics
OvmsMetricFloat *mt_pos_odometer_start; // ODOmeter at Start