Clean up
This commit is contained in:
parent
062e0fbbc5
commit
655176c238
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 ≥ 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
|
||||
|
|
|
@ -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");
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue