Add battery capacity web chooser, minor fixes, add trip counter
This commit is contained in:
parent
c8cbbfe5a0
commit
0e32024133
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)));
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue