Compare commits

...

9 commits

7 changed files with 78 additions and 42 deletions

View file

@ -77,7 +77,7 @@ void OvmsVehicleRenaultZoePh2::IncomingBCM(uint16_t type, uint16_t pid, const ch
if (CAN_UINT(0) == 2 || CAN_UINT(0) == 4 || CAN_UINT(0) == 6 ) {
StandardMetrics.ms_v_tpms_alert->SetElemValue(MS_V_TPMS_IDX_FL, 1);
}
ESP_LOGD(TAG, "40FF BCM tpms alert FL: %d", CAN_UINT(0));
//ESP_LOGD(TAG, "40FF BCM tpms alert FL: %d", CAN_UINT(0));
break;
}
case 0x410A: { // TPMS alert - front right
@ -90,7 +90,7 @@ void OvmsVehicleRenaultZoePh2::IncomingBCM(uint16_t type, uint16_t pid, const ch
if (CAN_UINT(0) == 2 || CAN_UINT(0) == 4 || CAN_UINT(0) == 6 ) {
StandardMetrics.ms_v_tpms_alert->SetElemValue(MS_V_TPMS_IDX_FR, 1);
}
ESP_LOGD(TAG, "40FF BCM tpms alert FR: %d", CAN_UINT(0));
//ESP_LOGD(TAG, "40FF BCM tpms alert FR: %d", CAN_UINT(0));
break;
}
case 0x410B: { // TPMS alert - rear left
@ -103,7 +103,7 @@ void OvmsVehicleRenaultZoePh2::IncomingBCM(uint16_t type, uint16_t pid, const ch
if (CAN_UINT(0) == 2 || CAN_UINT(0) == 4 || CAN_UINT(0) == 6 ) {
StandardMetrics.ms_v_tpms_alert->SetElemValue(MS_V_TPMS_IDX_RL, 1);
}
ESP_LOGD(TAG, "40FF BCM tpms alert RL: %d", CAN_UINT(0));
//ESP_LOGD(TAG, "40FF BCM tpms alert RL: %d", CAN_UINT(0));
break;
}
case 0x410C: { // TPMS alert - rear right
@ -116,12 +116,12 @@ void OvmsVehicleRenaultZoePh2::IncomingBCM(uint16_t type, uint16_t pid, const ch
if (CAN_UINT(0) == 2 || CAN_UINT(0) == 4 || CAN_UINT(0) == 6 ) {
StandardMetrics.ms_v_tpms_alert->SetElemValue(MS_V_TPMS_IDX_RR, 1);
}
ESP_LOGD(TAG, "40FF BCM tpms alert RR: %d", CAN_UINT(0));
//ESP_LOGD(TAG, "40FF BCM tpms alert RR: %d", CAN_UINT(0));
break;
}
case 0x4081: { //Vehicle running aka ignition
//reliability test needed
ESP_LOGD(TAG, "4081 BCM Ignition on: %d", CAN_UINT(0));
StandardMetrics.ms_v_env_on->SetValue((bool) CAN_UINT(0));
//ESP_LOGD(TAG, "4081 BCM Ignition on: %d", CAN_UINT(0));
break;
}
case 0x8004: { //Car secure aka vehicle locked
@ -155,8 +155,8 @@ void OvmsVehicleRenaultZoePh2::IncomingBCM(uint16_t type, uint16_t pid, const ch
break;
}
case 0x0495: { //Hood
StandardMetrics.ms_v_door_hood->SetValue((bool)CAN_NIBL(0));
//ESP_LOGD(TAG, "0495 Hood: %d", CAN_NIBL(0));
StandardMetrics.ms_v_door_hood->SetValue((bool)CAN_NIB(0));
ESP_LOGD(TAG, "0495 Hood: %d", CAN_NIB(0));
break;
}

View file

@ -46,19 +46,19 @@ void OvmsVehicleRenaultZoePh2::IncomingEVC(uint16_t type, uint16_t pid, const ch
//ESP_LOGD(TAG, "21CF EVC mt_inv_status: %d", CAN_NIBL(0));
if (CAN_NIBL(0) == 1) {
mt_inv_status->SetValue("Inverter off");
StandardMetrics.ms_v_env_on->SetValue(false);
//StandardMetrics.ms_v_env_on->SetValue(false);
} else if (CAN_NIBL(0) == 2) {
mt_inv_status->SetValue("Inverter on");
StandardMetrics.ms_v_env_on->SetValue(true);
//StandardMetrics.ms_v_env_on->SetValue(true);
} else if (CAN_NIBL(0) == 3) {
mt_inv_status->SetValue("Inverter decharging");
StandardMetrics.ms_v_env_on->SetValue(false);
//StandardMetrics.ms_v_env_on->SetValue(false);
} else if (CAN_NIBL(0) == 4) {
mt_inv_status->SetValue("Inverter alternator mode");
StandardMetrics.ms_v_env_on->SetValue(false);
//StandardMetrics.ms_v_env_on->SetValue(false);
} else if (CAN_NIBL(0) == 5) {
mt_inv_status->SetValue("Inverter ready to sleep");
StandardMetrics.ms_v_env_on->SetValue(false);
//StandardMetrics.ms_v_env_on->SetValue(false);
} else {
mt_inv_status->SetValue("Inverter state unknown");
}
@ -98,7 +98,7 @@ void OvmsVehicleRenaultZoePh2::IncomingEVC(uint16_t type, uint16_t pid, const ch
}
break;
}
case 0x2B6D: { // Charge MMI States
case 0x2B6D: { // Charge MMI States, will be polled every 30s even car is off, because free frames are unreliable
//ESP_LOGD(TAG, "2B6D Charge MMI States RAW: %d", CAN_NIBL(0));
if (CAN_NIBL(0) == 0) {
StandardMetrics.ms_v_charge_state->SetValue("stopped");
@ -145,6 +145,9 @@ void OvmsVehicleRenaultZoePh2::IncomingEVC(uint16_t type, uint16_t pid, const ch
StandardMetrics.ms_v_charge_inprogress->SetValue(false);
//ESP_LOGD(TAG, "2B6D Charge MMI States : Charge preparation");
}
if (!mt_bus_awake->AsBool()) {
ZoeWakeUp();
}
break;
}
case 0x2B7A: { // Charge type
@ -178,23 +181,45 @@ void OvmsVehicleRenaultZoePh2::IncomingEVC(uint16_t type, uint16_t pid, const ch
}
case 0x300D: { // AC input current
StandardMetrics.ms_v_charge_current->SetValue((float) (CAN_UINT(0) * 0.1), Amps);
//Power factor measured with simple power meter, using later a Janitza UMG512 Class A power analyser to get more precision
if (StandardMetrics.ms_v_charge_current->AsFloat() > 30.0f) {
ACInputPowerFactor = 0.9;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() > 25.0f) {
ACInputPowerFactor = 0.8;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() > 20.0f) {
ACInputPowerFactor = 0.7;
//Power factor measured with a Janitza UMG512 Class A power analyser to get more precision
//Only three phases measurement at the moment
if (StandardMetrics.ms_v_charge_current->AsFloat() > 19.0f) {
ACInputPowerFactor = 1.0;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() > 18.0f) {
ACInputPowerFactor = 0.997;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() > 17.0f) {
ACInputPowerFactor = 0.99;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() > 16.0f) {
ACInputPowerFactor = 0.978;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() > 15.0f) {
ACInputPowerFactor = 0.948;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() > 14.0f) {
ACInputPowerFactor = 0.931;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() > 13.0f) {
ACInputPowerFactor = 0.916;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() > 12.0f) {
ACInputPowerFactor = 0.902;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() > 11.0f) {
ACInputPowerFactor = 0.888;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() > 10.0f) {
ACInputPowerFactor = 0.6;
ACInputPowerFactor = 0.905;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() > 9.0f) {
ACInputPowerFactor = 0.929;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() > 8.0f) {
ACInputPowerFactor = 0.5;
ACInputPowerFactor = 0.901;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() > 7.0f) {
ACInputPowerFactor = 0.1;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() < 6.0f) {
ACInputPowerFactor = 0.775;
} else if (StandardMetrics.ms_v_charge_current->AsFloat() < 6.0f && StandardMetrics.ms_v_charge_inprogress->AsBool(false)) {
ACInputPowerFactor = 0.05;
ESP_LOGE(TAG, "Warning charge current too low, charging not possible");
}
if (mt_main_phases_num->AsFloat() == 3 && StandardMetrics.ms_v_charge_inprogress->AsBool(false)) {
StandardMetrics.ms_v_charge_power->SetValue((StandardMetrics.ms_v_charge_current->AsFloat() * StandardMetrics.ms_v_charge_voltage->AsFloat() * ACInputPowerFactor * 1.732f) * 0.001, kW);
} else if (mt_main_phases_num->AsFloat() == 2 || mt_main_phases_num->AsFloat() == 1) {
StandardMetrics.ms_v_charge_power->SetValue((StandardMetrics.ms_v_charge_current->AsFloat() * StandardMetrics.ms_v_charge_voltage->AsFloat() * ACInputPowerFactor) * 0.001, kW);
} else {
StandardMetrics.ms_v_charge_power->SetValue(0);
}
StandardMetrics.ms_v_charge_power->SetValue((float) (StandardMetrics.ms_v_charge_current->AsFloat() * StandardMetrics.ms_v_charge_voltage->AsFloat() * mt_main_phases_num->AsFloat() * ACInputPowerFactor), kW);
//ESP_LOGD(TAG, "300D EVC mt_main_current: %f", (CAN_UINT(0) * 0.1));
break;
}
@ -220,7 +245,6 @@ void OvmsVehicleRenaultZoePh2::IncomingEVC(uint16_t type, uint16_t pid, const ch
}
case 0x2B8A: { // AC mains voltage
StandardMetrics.ms_v_charge_voltage->SetValue((float) (CAN_UINT(0) * 0.5), Volts);
StandardMetrics.ms_v_charge_power->SetValue((float) (StandardMetrics.ms_v_charge_current->AsFloat() * StandardMetrics.ms_v_charge_voltage->AsFloat() * mt_main_phases_num->AsFloat() * ACInputPowerFactor), kW);
//ESP_LOGD(TAG, "2B8A EVC ms_v_charge_voltage: %f", (CAN_UINT(0) * 0.5));
break;
}

View file

@ -48,12 +48,11 @@ static const OvmsVehicle::poll_pid_t renault_zoe_polls[] = {
{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x2003, { 0, 60, 2, 300 }, 0, ISOTP_EXTFRAME }, // Vehicle Speed
{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x2005, { 0, 10, 10, 10 }, 0, ISOTP_EXTFRAME }, // 12Battery Voltage
{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x21CF, { 0, 2, 10, 300 }, 0, ISOTP_EXTFRAME }, // Inverter Status
//{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x303D, { 0, 10, 10, 3 }, 0, ISOTP_EXTFRAME }, // HV Battery Insulation Resistance
{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x2218, { 0, 20, 20, 20 }, 0, ISOTP_EXTFRAME }, // Ambient air temperature
{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x2A09, { 0, 10, 10, 10 }, 0, ISOTP_EXTFRAME }, // Power usage by consumer
{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x2191, { 0, 10, 10, 10 }, 0, ISOTP_EXTFRAME }, // Power usage by ptc
{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x2B85, { 0, 2, 300, 10 }, 0, ISOTP_EXTFRAME }, // Charge plug preset
{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x2B6D, { 60, 2, 300, 10 }, 0, ISOTP_EXTFRAME }, // Charge MMI states
{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x2B6D, { 30, 2, 300, 10 }, 0, ISOTP_EXTFRAME }, // Charge MMI states
{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x2B7A, { 0, 2, 300, 10 }, 0, ISOTP_EXTFRAME }, // Charge type
{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x3064, { 0, 10, 3, 10 }, 0, ISOTP_EXTFRAME }, // Motor rpm
{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x300F, { 0, 2, 300, 3 }, 0, ISOTP_EXTFRAME }, // AC charging power available
@ -77,7 +76,7 @@ static const OvmsVehicle::poll_pid_t renault_zoe_polls[] = {
{ 0x745, 0x765, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x410A, { 0, 300, 300, 300 }, 0, ISOTP_STD }, // TPMS alert - front right
{ 0x745, 0x765, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x410B, { 0, 300, 300, 300 }, 0, ISOTP_STD }, // TPMS alert - rear left
{ 0x745, 0x765, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x410C, { 0, 300, 300, 300 }, 0, ISOTP_STD }, // TPMS alert - rear right
{ 0x745, 0x765, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x4081, { 0, 3, 10, 60 }, 0, ISOTP_STD }, // Vehicle running aka ignition, need testing
{ 0x745, 0x765, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x4081, { 0, 2, 2, 60 }, 0, ISOTP_STD }, // Vehicle running aka ignition
{ 0x745, 0x765, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x8004, { 0, 3, 3, 3 }, 0, ISOTP_STD }, // Car secure aka vehicle locked
{ 0x745, 0x765, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x6026, { 0, 3, 3, 3 }, 0, ISOTP_STD }, // Front left door
{ 0x745, 0x765, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x6027, { 0, 3, 3, 3 }, 0, ISOTP_STD }, // Front right door

View file

@ -84,13 +84,13 @@ OvmsVehicleRenaultZoePh2::OvmsVehicleRenaultZoePh2() {
mt_inv_hv_current = MyMetrics.InitFloat("zph2.i.current", SM_STALE_MID, 0, Amps);
mt_mot_temp_stator1 = MyMetrics.InitFloat("zph2.m.temp.stator1", SM_STALE_MID, 0, Celcius);
mt_mot_temp_stator2 = MyMetrics.InitFloat("zph2.m.temp.stator2", SM_STALE_MID, 0, Celcius);
mt_hvac_compressor_speed = MyMetrics.InitFloat("zph2.h.compressor.speed", SM_STALE_MID, 0);
mt_hvac_compressor_pressure = MyMetrics.InitFloat("zph2.h.compressor.pressure", SM_STALE_MID, 0);
mt_hvac_compressor_speed = MyMetrics.InitFloat("zph2.h.compressor.speed", SM_STALE_MID, 0, rpm);
mt_hvac_compressor_pressure = MyMetrics.InitFloat("zph2.h.compressor.pressure", SM_STALE_MID, 0, Bar);
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);
mt_v_env_pressure = MyMetrics.InitFloat("zph2.v.e.pressure", SM_STALE_MIN, 0);
mt_bat_lbc_soc = MyMetrics.InitFloat("zph2.b.lbc.soc", SM_STALE_NONE, 0, Percentage);
mt_bat_user_soc = MyMetrics.InitFloat("zph2.b.user.soc", SM_STALE_NONE, 0, Percentage);
mt_hvac_compressor_mode = MyMetrics.InitString("zph2.h.compressor.mode", SM_STALE_MID, 0, Other);
mt_v_env_pressure = MyMetrics.InitFloat("zph2.v.e.pressure", SM_STALE_MIN, 0, mBar);
mt_bat_lbc_soc = MyMetrics.InitFloat("zph2.b.lbc.soc", SM_STALE_MAX, 0, Percentage, true);
mt_bat_user_soc = MyMetrics.InitFloat("zph2.b.user.soc", SM_STALE_MAX, 0, Percentage, true);
// BMS configuration:
BmsSetCellArrangementVoltage(96, 1);
@ -123,6 +123,15 @@ void OvmsVehicleRenaultZoePh2::ConfigChanged(OvmsConfigParam* param) {
ESP_LOGI(TAG, "Renault Zoe Ph2 reload configuration: Range ideal: %d, Battery capacity: %d, Use Car trip counter: %s, Use BMS as energy counter: %s, Use BMS for SOC: %s", m_range_ideal, m_battery_capacity, m_UseCarTrip ? "Yes" : "No", m_UseBMScalculation ? "yes" : "no", m_UseBMSsoc ? "yes" : "no");
}
void OvmsVehicleRenaultZoePh2::ZoeWakeUp() {
ESP_LOGI(TAG,"Zoe woke up (CAN Bus activity detected)");
mt_bus_awake->SetValue(true);;
StandardMetrics.ms_v_env_awake->SetValue(true);
StandardMetrics.ms_v_env_charging12v->SetValue(true);
POLLSTATE_ON;
ESP_LOGI(TAG, "Pollstate switched to ON");
}
/**
* Handles incoming CAN-frames on bus 1
*/
@ -146,12 +155,7 @@ void OvmsVehicleRenaultZoePh2::IncomingFrameCan1(CAN_frame_t* p_frame) {
}
//There are some free frames on wakeup and start and stop charging.... I try to use them to see if Car is awake and charging, see /Reference/ZOE_Ph2_xxx text files
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_awake->SetValue(true);
StandardMetrics.ms_v_env_charging12v->SetValue(true);
POLLSTATE_ON;
ESP_LOGI(TAG, "Pollstate switched to ON");
ZoeWakeUp();
}
}

View file

@ -65,6 +65,7 @@ class OvmsVehicleRenaultZoePh2 : public OvmsVehicle {
~OvmsVehicleRenaultZoePh2();
static void WebCfgCommon(PageEntry_t& p, PageContext_t& c);
void ConfigChanged(OvmsConfigParam* param);
void ZoeWakeUp();
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();

View file

@ -1465,6 +1465,10 @@ const char* OvmsMetricUnitLabel(metric_unit_t units)
case WattHoursPK: return "Wh/km";
case WattHoursPM: return "Wh/mi";
case Nm: return "Nm";
case rpm: return "rpm";
case kVA: return "kVA";
case Bar: return "bar";
case mBar: return "mBar";
default: return "";
}
}

View file

@ -71,6 +71,8 @@ typedef enum : uint8_t
kPa = 30,
Pa = 31,
PSI = 32,
Bar = 33,
mBar = 34,
Volts = 40,
Amps = 41,
@ -79,6 +81,7 @@ typedef enum : uint8_t
kWh = 44,
Watts = 45,
WattHours = 46,
kVA = 47,
Seconds = 50,
Minutes = 51,
@ -100,6 +103,7 @@ typedef enum : uint8_t
sq = 81, // Signal Quality (in SQ units)
Percentage = 90,
rpm = 91,
// Energy consumption:
WattHoursPK = 100, // Wh/km