This commit is contained in:
Carsten Schmiemann 2022-04-10 20:30:54 +02:00
parent 062e0fbbc5
commit 655176c238
8 changed files with 45 additions and 405 deletions

View file

@ -49,9 +49,6 @@ static const char *TAG = "v-zoe";
void OvmsVehicleRenaultZoe::zoe_trip(int verbosity, OvmsWriter* writer, OvmsCommand* cmd, int argc, const char* const* argv) {
OvmsVehicleRenaultZoe* zoe = GetInstance(writer);
if (!zoe)
return;
zoe->CommandTrip(verbosity, writer);
}

View file

@ -7,7 +7,7 @@
# please read the ESP-IDF documents if you need to do this.
#
ifdef CONFIG_OVMS_VEHICLE_RENAULTZOE
ifdef CONFIG_OVMS_VEHICLE_RENAULTZOE_PH2
COMPONENT_ADD_INCLUDEDIRS:=src
COMPONENT_SRCDIRS:=src
COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive

View file

@ -46,167 +46,7 @@ static const char *TAG = "v-zoe-ph2";
#include "ovms_notify.h"
#include "ovms_peripherals.h"
#include "vehicle_renaultzoe.h"
void OvmsVehicleRenaultZoePh2::zoe_trip(int verbosity, OvmsWriter* writer, OvmsCommand* cmd, int argc, const char* const* argv) {
OvmsVehicleRenaultZoePh2* zoe = GetInstance(writer);
if (!zoe)
return;
zoe->CommandTrip(verbosity, writer);
}
OvmsVehicle::vehicle_command_t OvmsVehicleRenaultZoePh2::CommandClimateControl(bool climatecontrolon) {
return NotImplemented;
}
OvmsVehicle::vehicle_command_t OvmsVehicleRenaultZoePh2::CommandWakeup() {
if(!m_enable_write)
return Fail;
ESP_LOGI(TAG, "Send Wakeup Command");
if (IsZoe()) {
uint8_t data[8] = {0xf1, 0x04, 0x1f, 0xc5, 0x35, 0xfe, 0x65, 0x08};
canbus *obd;
obd = m_can1;
obd->WriteStandard(0x35C, 8, data);
data[1] = 0x06;
data[7] = 0x61;
vTaskDelay(50 / portTICK_PERIOD_MS);
obd->WriteStandard(0x35C, 8, data);
}
if (IsKangoo()) {
uint8_t data[8] = {0x10, 0x03, 0x00, 0x00, 0x08, 0xC0, 0x12, 0x00};
canbus *obd;
obd = m_can1;
obd->WriteStandard(0x35D, 8, data);
data[7] = 0x52;
vTaskDelay(50 / portTICK_PERIOD_MS);
obd->WriteStandard(0x35D, 8, data);
}
return Success;
}
OvmsVehicle::vehicle_command_t OvmsVehicleRenaultZoePh2::CommandLock(const char* pin) {
if (IsKangoo()) {
CommandWakeup();
vTaskDelay(500 / portTICK_PERIOD_MS);
uint32_t txid = 0x745, rxid = 0x765;
uint8_t protocol = ISOTP_STD;
int timeout_ms = 100;
std::string request;
std::string response;
request = hexdecode("10C0");
int err = PollSingleRequest(m_can1, txid, rxid, request, response, timeout_ms, protocol);
request = hexdecode("30010001");
err = PollSingleRequest(m_can1, txid, rxid, request, response, timeout_ms, protocol);
if (err == POLLSINGLE_TXFAILURE)
{
ESP_LOGD(TAG, "ERROR: transmission failure (CAN bus error)");
return Fail;
}
else if (err < 0)
{
ESP_LOGD(TAG, "ERROR: timeout waiting for poller/response");
return Fail;
}
else if (err)
{
ESP_LOGD(TAG, "ERROR: request failed with response error code %02X\n", err);
return Fail;
}
StdMetrics.ms_v_env_locked->SetValue(true);
return Success;
}
return NotImplemented;
}
OvmsVehicle::vehicle_command_t OvmsVehicleRenaultZoePh2::CommandUnlock(const char* pin) {
if (IsKangoo()) {
CommandWakeup();
vTaskDelay(500 / portTICK_PERIOD_MS);
uint32_t txid = 0x745, rxid = 0x765;
uint8_t protocol = ISOTP_STD;
int timeout_ms = 100;
std::string request;
std::string response;
request = hexdecode("10C0");
int err = PollSingleRequest(m_can1, txid, rxid, request, response, timeout_ms, protocol);
request = hexdecode("30010002");
err = PollSingleRequest(m_can1, txid, rxid, request, response, timeout_ms, protocol);
if (err == POLLSINGLE_TXFAILURE)
{
ESP_LOGD(TAG, "ERROR: transmission failure (CAN bus error)");
return Fail;
}
else if (err < 0)
{
ESP_LOGD(TAG, "ERROR: timeout waiting for poller/response");
return Fail;
}
else if (err)
{
ESP_LOGD(TAG, "ERROR: request failed with response error code %02X\n", err);
return Fail;
}
StdMetrics.ms_v_env_locked->SetValue(false);
return Success;
}
return NotImplemented;
}
OvmsVehicle::vehicle_command_t OvmsVehicleRenaultZoePh2::CommandActivateValet(const char* pin) {
return NotImplemented;
}
OvmsVehicle::vehicle_command_t OvmsVehicleRenaultZoePh2::CommandDeactivateValet(const char* pin) {
return NotImplemented;
}
OvmsVehicle::vehicle_command_t OvmsVehicleRenaultZoePh2::CommandHomelink(int button, int durationms) {
#ifdef CONFIG_OVMS_COMP_MAX7317
if(m_enable_egpio) {
if (button == 0) {
MyPeripherals->m_max7317->Output(MAX7317_EGPIO_3, 0);
vTaskDelay(500 / portTICK_PERIOD_MS);
MyPeripherals->m_max7317->Output(MAX7317_EGPIO_3, 1);
return Success;
}
if (button == 1) {
MyPeripherals->m_max7317->Output(MAX7317_EGPIO_4, 0);
vTaskDelay(500 / portTICK_PERIOD_MS);
MyPeripherals->m_max7317->Output(MAX7317_EGPIO_4, 1);
return Success;
}
if (button == 2) {
MyPeripherals->m_max7317->Output(MAX7317_EGPIO_5, 0);
vTaskDelay(500 / portTICK_PERIOD_MS);
MyPeripherals->m_max7317->Output(MAX7317_EGPIO_5, 1);
return Success;
}
}
#endif
return NotImplemented;
}
#include "vehicle_renaultzoe_ph2.h"
OvmsVehicle::vehicle_command_t OvmsVehicleRenaultZoePh2::CommandTrip(int verbosity, OvmsWriter* writer) {
metric_unit_t rangeUnit = (MyConfig.GetParamValue("vehicle", "units.distance") == "M") ? Miles : Kilometers;

View file

@ -43,7 +43,7 @@
#include "ovms_notify.h"
#include "ovms_webserver.h"
#include "vehicle_renaultzoe.h"
#include "vehicle_renaultzoe_ph2.h"
using namespace std;
@ -57,9 +57,7 @@ using namespace std;
void OvmsVehicleRenaultZoePh2::WebInit()
{
// vehicle menu:
MyWebServer.RegisterPage("/xrz/features", "Features", WebCfgFeatures, PageMenu_Vehicle, PageAuth_Cookie);
MyWebServer.RegisterPage("/xrz/battery", "Battery config", WebCfgBattery, PageMenu_Vehicle, PageAuth_Cookie);
MyWebServer.RegisterPage("/xrz/battmon", "Battery Monitor", OvmsWebServer::HandleBmsCellMonitor, PageMenu_Vehicle, PageAuth_Cookie);
MyWebServer.RegisterPage("/zph2/battmon", "Battery Monitor", OvmsWebServer::HandleBmsCellMonitor, PageMenu_Vehicle, PageAuth_Cookie);
}
/**
@ -67,177 +65,7 @@ void OvmsVehicleRenaultZoePh2::WebInit()
*/
void OvmsVehicleRenaultZoePh2::WebDeInit()
{
MyWebServer.DeregisterPage("/xrz/features");
MyWebServer.DeregisterPage("/xrz/battery");
MyWebServer.DeregisterPage("/xrz/battmon");
}
/**
* WebCfgFeatures: configure general parameters (URL /xrz/features)
*/
void OvmsVehicleRenaultZoePh2::WebCfgFeatures(PageEntry_t& p, PageContext_t& c)
{
std::string error, info;
bool canwrite;
std::string vehicle_type;
if (c.method == "POST") {
// process form submission:
canwrite = (c.getvar("canwrite") == "yes");
vehicle_type = c.getvar("vehicle_type");
// validate:
if (vehicle_type != "") {
int v = atoi(vehicle_type.c_str());
if (v < 0 || v > 1) {
error += "<li data-input=\"vehicle_type\">Something went wrong</li>";
}
}
if (error == "") {
// success:
MyConfig.SetParamValueBool("xrz", "canwrite", canwrite);
MyConfig.SetParamValue("xrz", "vehicle.type", vehicle_type);
info = "<p class=\"lead\">Success!</p><ul class=\"infolist\">" + info + "</ul>";
c.head(200);
c.alert("success", info.c_str());
MyWebServer.OutputHome(p, c);
c.done();
return;
}
// output error, return to form:
error = "<p class=\"lead\">Error!</p><ul class=\"errorlist\">" + error + "</ul>";
c.head(400);
c.alert("danger", error.c_str());
}
else {
// read configuration:
canwrite = MyConfig.GetParamValueBool("xrz", "canwrite", false);
vehicle_type = MyConfig.GetParamValue("xrz", "vehicle.type", "0");
c.head(200);
}
// generate form:
c.panel_start("primary", "Renault Zoe/Kangoo feature configuration");
c.form_start(p.uri);
c.input_checkbox("Enable CAN write(Poll)", "canwrite", canwrite,
"<p>Controls overall CAN write access, some functions depend on this.</p>");
c.input_select_start("Vehicle type", "vehicle_type");
c.input_select_option("Zoe R240 (PH1)", "0", vehicle_type == "0");
c.input_select_option("Kangoo", "1", vehicle_type == "1");
c.input_select_end();
c.print("<hr>");
c.input_button("default", "Save");
c.form_end();
c.panel_end();
c.done();
}
/**
* WebCfgBattery: configure battery parameters (URL /xrz/battery)
*/
void OvmsVehicleRenaultZoePh2::WebCfgBattery(PageEntry_t& p, PageContext_t& c)
{
std::string error;
// rangeideal Ideal Range (Default: 160km)
// suffsoc Sufficient SOC [%] (Default: 0=disabled)
// suffrange Sufficient range [km] (Default: 0=disabled)
std::string rangeideal, battcapacity, suffrange, suffsoc;
if (c.method == "POST") {
// process form submission:
rangeideal = c.getvar("rangeideal");
battcapacity = c.getvar("battcapacity");
suffrange = c.getvar("suffrange");
suffsoc = c.getvar("suffsoc");
// check:
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 < 90 || v > 500)
error += "<li data-input=\"battcapacity\">Battery Capacity must be of 10000…50000 Wh</li>";
}
if (!suffrange.empty()) {
float n = atof(suffrange.c_str());
if (n < 0)
error += "<li data-input=\"suffrange\">Sufficient range invalid, must be &ge; 0</li>";
}
if (!suffsoc.empty()) {
float n = atof(suffsoc.c_str());
if (n < 0 || n > 100)
error += "<li data-input=\"suffsoc\">Sufficient SOC invalid, must be 0…100</li>";
}
if (error == "") {
// store:
MyConfig.SetParamValue("xrz", "rangeideal", rangeideal);
MyConfig.SetParamValue("xrz", "battcapacity", battcapacity);
MyConfig.SetParamValue("xrz", "suffrange", suffrange);
MyConfig.SetParamValue("xrz", "suffsoc", suffsoc);
c.head(200);
c.alert("success", "<p class=\"lead\">Renault Zoe/Kangoo battery setup saved.</p>");
MyWebServer.OutputHome(p, c);
c.done();
return;
}
// output error, return to form:
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", "160");
battcapacity = MyConfig.GetParamValue("xrz", "battcapacity", "27000");
suffrange = MyConfig.GetParamValue("xrz", "suffrange", "0");
suffsoc = MyConfig.GetParamValue("xrz", "suffsoc", "0");
c.head(200);
}
// generate form:
c.panel_start("primary", "Renault Zoe/Kangoo Battery Setup");
c.form_start(p.uri);
c.fieldset_start("Charge control");
c.input_slider("Range Ideal", "rangeideal", 3, "km",
-1, atoi(rangeideal.c_str()), 160, 80, 500, 1,
"<p>Default 160km. Ideal Range...</p>");
c.input_slider("Battery Capacity", "battcapacity", 5, "Wh",
-1, atoi(battcapacity.c_str()), 27000, 10000, 50000, 100,
"<p>Default 27000. Battery Capacity...</p>");
c.input_slider("Sufficient range", "suffrange", 3, "km",
atof(suffrange.c_str()) > 0, atof(suffrange.c_str()), 75, 0, 150, 1,
"<p>Default 0=off. Notify/stop charge when reaching this level.</p>");
c.input_slider("Sufficient SOC", "suffsoc", 3, "%",
atof(suffsoc.c_str()) > 0, atof(suffsoc.c_str()), 80, 0, 100, 1,
"<p>Default 0=off. Notify/stop charge when reaching this level.</p>");
c.fieldset_end();
c.print("<hr>");
c.input_button("default", "Save");
c.form_end();
c.panel_end();
c.done();
MyWebServer.DeregisterPage("/zph2/battmon");
}
#endif //CONFIG_OVMS_COMP_WEBSERVER

View file

@ -46,7 +46,7 @@ static const char *TAG = "v-zoe-ph2";
#include "ovms_peripherals.h"
#include "ovms_netmanager.h"
#include "vehicle_renaultzoe.h"
#include "vehicle_renaultzoe_ph2.h"
// Pollstate 0 - POLLSTATE_OFF - car is off
// Pollstate 1 - POLLSTATE_ON - car is on
@ -80,37 +80,25 @@ static const OvmsVehicle::poll_pid_t renault_zoe_polls[] = {
POLL_LIST_END
};
static const OvmsVehicle::poll_pid_t renault_kangoo_polls[] = {
// { 0x7e4, 0x7ec, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x2006, { 0, 60, 0, 0 }, 0, ISOTP_STD }, // Odometer
{ 0x7e4, 0x7ec, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x3203, { 0, 10, 1, 2 }, 0, ISOTP_STD }, // Battery Voltage
{ 0x7e4, 0x7ec, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x3204, { 0, 10, 1, 2 }, 0, ISOTP_STD }, // Battery Current
{ 0x7e4, 0x7ec, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x33F6, { 0, 60, 600, 60 }, 0, ISOTP_STD }, // Inverter Temp
{ 0x79b, 0x7bb, VEHICLE_POLL_TYPE_OBDIIGROUP, 0x04, { 0, 60, 600, 60 }, 0, ISOTP_STD }, // Temp Bat Module 1
{ 0x79b, 0x7bb, VEHICLE_POLL_TYPE_OBDIIGROUP, 0x41, { 0, 60, 600, 60 }, 0, ISOTP_STD }, // Cell Bat Module 1-62
{ 0x79b, 0x7bb, VEHICLE_POLL_TYPE_OBDIIGROUP, 0x42, { 0, 60, 600, 60 }, 0, ISOTP_STD }, // Cell Bat Module 63-96
// { 0x792, 0x793, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x504A, { 0, 0, 0, 10 }, 0, ISOTP_STD }, // Mains active Power consumed
POLL_LIST_END
};
OvmsVehicleRenaultZoePh2* OvmsVehicleRenaultZoePh2::GetInstance(OvmsWriter* writer /*=NULL*/)
{
OvmsVehicleRenaultZoePh2* zoe = (OvmsVehicleRenaultZoePh2*) MyVehicleFactory.ActiveVehicle();
string type = StdMetrics.ms_v_type->AsString();
if (!zoe || type != "RZ") {
if (!zoe || type != "RZ2") {
if (writer)
writer->puts("Error: Renault Zoe/Kangoo vehicle module not selected");
writer->puts("Error: Renault Zoe Ph2 vehicle module not selected");
return NULL;
}
return zoe;
}
OvmsVehicleRenaultZoePh2::OvmsVehicleRenaultZoePh2() {
ESP_LOGI(TAG, "Start Renault Zoe/Kangoo vehicle module");
ESP_LOGI(TAG, "Start Renault Zoe Ph2 vehicle module");
StandardMetrics.ms_v_type->SetValue("RZ");
StandardMetrics.ms_v_type->SetValue("RZ2");
StandardMetrics.ms_v_charge_inprogress->SetValue(false);
MyConfig.RegisterParam("xrz", "Renault Zoe/Kangoo", true, true);
MyConfig.RegisterParam("zph2", "Renault Zoe Ph2", true, true);
ConfigChanged(NULL);
// Zoe CAN bus runs at 500 kbps
@ -118,26 +106,24 @@ OvmsVehicleRenaultZoePh2::OvmsVehicleRenaultZoePh2() {
// Poll Specific PIDs
POLLSTATE_OFF;
if (IsZoe()) PollSetPidList(m_can1, renault_zoe_polls);
if (IsKangoo()) PollSetPidList(m_can1, renault_kangoo_polls);
PollSetPidList(m_can1, renault_zoe_polls);
PollSetThrottling(5);
PollSetResponseSeparationTime(20);
// init metrics:
mt_pos_odometer_start = MyMetrics.InitFloat("xrz.v.pos.odometer.start", SM_STALE_MID, 0, Kilometers);
mt_bus_awake = MyMetrics.InitBool("xrz.v.bus.awake", SM_STALE_MIN, false);
mt_available_energy = MyMetrics.InitFloat("xrz.v.avail.energy", SM_STALE_MID, 0, kWh);
mt_heatwater_temp = MyMetrics.InitFloat("xrz.v.heatwater.temp", SM_STALE_MID, 0, Celcius);
mt_main_power_consumed = MyMetrics.InitFloat("xrz.c.main.power.consumed", SM_STALE_MID, 0, kWh);
mt_pos_odometer_start = MyMetrics.InitFloat("zph2.v.pos.odometer.start", SM_STALE_MID, 0, Kilometers);
mt_bus_awake = MyMetrics.InitBool("zph2.v.bus.awake", SM_STALE_MIN, false);
mt_available_energy = MyMetrics.InitFloat("zph2.v.avail.energy", SM_STALE_MID, 0, kWh);
mt_heatwater_temp = MyMetrics.InitFloat("zph2.v.heatwater.temp", SM_STALE_MID, 0, Celcius);
mt_main_power_consumed = MyMetrics.InitFloat("zph2.c.main.power.consumed", SM_STALE_MID, 0, kWh);
// init commands:
cmd_zoe = MyCommandApp.RegisterCommand("zoe", "Renault Zoe/Kangoo");
cmd_zoe = MyCommandApp.RegisterCommand("zoe-ph2", "Renault Zoe Ph2");
cmd_zoe->RegisterCommand("trip", "Show vehicle trip", zoe_trip);
// BMS configuration:
BmsSetCellArrangementVoltage(96, 8);
if (IsZoe()) BmsSetCellArrangementTemperature(12, 1);
if (IsKangoo()) BmsSetCellArrangementTemperature(4, 1);
BmsSetCellArrangementTemperature(12, 1);
BmsSetCellLimitsVoltage(2.0, 5.0);
BmsSetCellLimitsTemperature(-39, 200);
BmsSetCellDefaultThresholdsVoltage(0.030, 0.050);
@ -149,7 +135,7 @@ OvmsVehicleRenaultZoePh2::OvmsVehicleRenaultZoePh2() {
}
OvmsVehicleRenaultZoePh2::~OvmsVehicleRenaultZoePh2() {
ESP_LOGI(TAG, "Stop Renault Zoe/Kangoo vehicle module");
ESP_LOGI(TAG, "Stop Renault Zoe Ph2 vehicle module");
#ifdef CONFIG_OVMS_COMP_WEBSERVER
WebDeInit();
@ -161,7 +147,7 @@ OvmsVehicleRenaultZoePh2::~OvmsVehicleRenaultZoePh2() {
*/
void OvmsVehicleRenaultZoePh2::IncomingFrameCan1(CAN_frame_t* p_frame) {
uint8_t *data = p_frame->data.u8;
//ESP_LOGI(TAG, "PID:%x DATA: %02x %02x %02x %02x %02x %02x %02x %02x", p_frame->MsgID, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
ESP_LOGI(TAG, "PID:%x DATA: %02x %02x %02x %02x %02x %02x %02x %02x", p_frame->MsgID, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
if (m_candata_poll != 1 && m_ready) {
ESP_LOGI(TAG,"Car has woken (CAN bus activity)");
@ -368,10 +354,8 @@ void OvmsVehicleRenaultZoePh2::IncomingFrameCan1(CAN_frame_t* p_frame) {
// 42e,18,19,1,0,0,,,,ff,HV Bat Level2 Failure
// 42e,20,24,5,0,0,%,,,e2,Engine Fan Speed
// 42e,25,34,0.5,0,0,V,,,ff,HV Network Voltage
if (IsZoe()) {
StandardMetrics.ms_v_bat_voltage->SetValue((float) (((CAN_UINT(3))>>5) & 0x3ff) * 0.5); // HV Voltage
StandardMetrics.ms_v_charge_voltage->SetValue((float) (((CAN_UINT(3))>>5) & 0x3ff) * 0.5);
}
StandardMetrics.ms_v_bat_voltage->SetValue((float) (((CAN_UINT(3))>>5) & 0x3ff) * 0.5); // HV Voltage
StandardMetrics.ms_v_charge_voltage->SetValue((float) (((CAN_UINT(3))>>5) & 0x3ff) * 0.5);
// 42e,38,43,1,0,1,A,,,e3,Charging Pilot Current
StandardMetrics.ms_v_charge_climit->SetValue((((CAN_UINT(4))>>4) & 0x3Fu));
// StandardMetrics.ms_v_charge_current->SetValue((((CAN_UINT(4))>>4) & 0x3Fu)); // Todo change to charger current
@ -925,7 +909,6 @@ void OvmsVehicleRenaultZoePh2::IncomingBCB(uint16_t type, uint16_t pid, const ch
switch (pid) {
case 0x504A: {
// 793,24,39,1,20000,0,W,22504A,62504A,ff\n" // Mains active power consumed
if (IsKangoo()) mt_main_power_consumed->SetValue((float(CAN_UINT(0)-20000)/1000));
break;
}
case 0x5063: {
@ -999,19 +982,9 @@ void OvmsVehicleRenaultZoePh2::IncomingLBC(uint16_t type, uint16_t pid, const ch
break;
}
case 0x04: {
if (IsZoe()) {
for(int i=2; i<36; i+=3){
BmsSetCellTemperature( (i-2)/3, (INT)CAN_BYTE(i)-40 );
//ESP_LOGD(TAG, "temp %d - %d", (i-2)/3, (INT)CAN_BYTE(i)-40);
}
}
if (IsKangoo()) {
int x=0;
for(int i=2; i<12; i+=3){
BmsSetCellTemperature( x, (INT)CAN_BYTE(i) );
ESP_LOGD(TAG, "temp %d - %d", x, (INT)CAN_BYTE(i));
x++;
}
for(int i=2; i<36; i+=3){
BmsSetCellTemperature( (i-2)/3, (INT)CAN_BYTE(i)-40 );
//ESP_LOGD(TAG, "temp %d - %d", (i-2)/3, (INT)CAN_BYTE(i)-40);
}
break;
}
@ -1248,21 +1221,21 @@ int OvmsVehicleRenaultZoePh2::calcMinutesRemaining(float target_soc, float charg
* ConfigChanged: reload single/all configuration variables
*/
void OvmsVehicleRenaultZoePh2::ConfigChanged(OvmsConfigParam* param) {
if (param && param->GetName() != "xrz")
if (param && param->GetName() != "zph2")
return;
ESP_LOGI(TAG, "Renault Zoe/Kangoo reload configuration");
m_enable_write = MyConfig.GetParamValueBool("xrz", "canwrite", false);
m_range_ideal = MyConfig.GetParamValueInt("xrz", "rangeideal", 160);
m_battery_capacity = MyConfig.GetParamValueInt("xrz", "battcapacity", 27000);
m_enable_egpio = MyConfig.GetParamValueBool("xrz", "enable_egpio", false);
m_enable_write = MyConfig.GetParamValueBool("zph2", "canwrite", false);
m_range_ideal = MyConfig.GetParamValueInt("zph2", "rangeideal", 160);
m_battery_capacity = MyConfig.GetParamValueInt("zph2", "battcapacity", 27000);
m_enable_egpio = MyConfig.GetParamValueBool("zph2", "enable_egpio", false);
m_reset_trip = MyConfig.GetParamValueBool("xrz", "reset.trip.charge", false);
m_vehicle_type = MyConfig.GetParamValueInt("xrz", "vehicle.type", 0);
m_reset_trip = MyConfig.GetParamValueBool("zph2", "reset.trip.charge", false);
m_vehicle_type = MyConfig.GetParamValueInt("zph2", "vehicle.type", 0);
StandardMetrics.ms_v_charge_limit_soc->SetValue((float) MyConfig.GetParamValueInt("xrz", "suffsoc", 0), Percentage );
StandardMetrics.ms_v_charge_limit_range->SetValue((float) MyConfig.GetParamValueInt("xrz", "suffrange", 0), Kilometers );
StandardMetrics.ms_v_charge_limit_soc->SetValue((float) MyConfig.GetParamValueInt("zph2", "suffsoc", 0), Percentage );
StandardMetrics.ms_v_charge_limit_range->SetValue((float) MyConfig.GetParamValueInt("zph2", "suffrange", 0), Kilometers );
}
/**
@ -1272,15 +1245,15 @@ void OvmsVehicleRenaultZoePh2::ConfigChanged(OvmsConfigParam* param) {
bool OvmsVehicleRenaultZoePh2::SetFeature(int key, const char *value) {
switch (key) {
case 10:
MyConfig.SetParamValue("xrz", "suffsoc", value);
MyConfig.SetParamValue("zph2", "suffsoc", value);
return true;
case 11:
MyConfig.SetParamValue("xrz", "suffrange", value);
MyConfig.SetParamValue("zph2", "suffrange", value);
return true;
case 15:
{
int bits = atoi(value);
MyConfig.SetParamValueBool("xrz", "canwrite", (bits& 1)!=0);
MyConfig.SetParamValueBool("zph2", "canwrite", (bits& 1)!=0);
return true;
}
default:
@ -1295,12 +1268,12 @@ bool OvmsVehicleRenaultZoePh2::SetFeature(int key, const char *value) {
const std::string OvmsVehicleRenaultZoePh2::GetFeature(int key) {
switch (key) {
case 10:
return MyConfig.GetParamValue("xrz", "suffsoc", STR(0));
return MyConfig.GetParamValue("zph2", "suffsoc", STR(0));
case 11:
return MyConfig.GetParamValue("xrz", "suffrange", STR(0));
return MyConfig.GetParamValue("zph2", "suffrange", STR(0));
case 15:
{
int bits = ( MyConfig.GetParamValueBool("xrz", "canwrite", false) ? 1 : 0);
int bits = ( MyConfig.GetParamValueBool("zph2", "canwrite", false) ? 1 : 0);
char buf[4];
sprintf(buf, "%d", bits);
return std::string(buf);
@ -1321,7 +1294,7 @@ class OvmsVehicleRenaultZoePh2Init {
} MyOvmsVehicleRenaultZoePh2Init __attribute__ ((init_priority (9000)));
OvmsVehicleRenaultZoePh2Init::OvmsVehicleRenaultZoePh2Init() {
ESP_LOGI(TAG, "Registering Vehicle: Renault Zoe/Kangoo (9000)");
ESP_LOGI(TAG, "Registering Vehicle: Renault Zoe Ph2 (9000)");
MyVehicleFactory.RegisterVehicle<OvmsVehicleRenaultZoePh2>("RZ","Renault Zoe/Kangoo");
MyVehicleFactory.RegisterVehicle<OvmsVehicleRenaultZoePh2>("RZ2","Renault Zoe Ph2");
}

View file

@ -691,6 +691,7 @@ CONFIG_OVMS_VEHICLE_JAGUARIPACE=y
CONFIG_OVMS_VEHICLE_TOYOTARAV4EV=y
CONFIG_OVMS_VEHICLE_RXTASK_STACK=8192
CONFIG_OVMS_VEHICLE_CAN_RX_QUEUE_SIZE=60
CONFIG_OVMS_VEHICLE_RENAULTZOE_PH2=y
#
# Component Options

View file

@ -691,6 +691,7 @@ CONFIG_OVMS_VEHICLE_JAGUARIPACE=y
CONFIG_OVMS_VEHICLE_TOYOTARAV4EV=y
CONFIG_OVMS_VEHICLE_RXTASK_STACK=8192
CONFIG_OVMS_VEHICLE_CAN_RX_QUEUE_SIZE=60
CONFIG_OVMS_VEHICLE_RENAULTZOE_PH2=y
#
# Component Options