diff --git a/OVMS.V3/components/vehicle_renaultzoe_ph2/src/ph2_poller.h b/OVMS.V3/components/vehicle_renaultzoe_ph2/src/ph2_poller.h index e4c694d..f8fe37f 100644 --- a/OVMS.V3/components/vehicle_renaultzoe_ph2/src/ph2_poller.h +++ b/OVMS.V3/components/vehicle_renaultzoe_ph2/src/ph2_poller.h @@ -45,7 +45,7 @@ static const OvmsVehicle::poll_pid_t renault_zoe_polls[] = { //EVC-HCM-VCM //{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIISESSION, SESSION_EXTDIAG, { 60, 60, 60, 60 }, 0, ISOTP_EXTFRAME }, // OBD Extended Diagnostic Session -{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x2006, { 180, 10, 10, 300 }, 0, ISOTP_EXTFRAME }, // Odometer +{ 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x2006, { 0, 10, 10, 300 }, 0, ISOTP_EXTFRAME }, // Odometer { 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x2A8C, { 0, 10, 5, 3 }, 0, ISOTP_EXTFRAME }, // 12Battery Current { 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x2005, { 0, 10, 5, 3 }, 0, ISOTP_EXTFRAME }, // 12Battery Voltage { 0x18dadaf1, 0x18daf1da, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x21D0, { 0, 10, 10, 3 }, 0, ISOTP_EXTFRAME }, // DCDC Temperature diff --git a/OVMS.V3/components/vehicle_renaultzoe_ph2/src/vehicle_renaultzoe_ph2.cpp b/OVMS.V3/components/vehicle_renaultzoe_ph2/src/vehicle_renaultzoe_ph2.cpp index 020a3a5..d3c34e7 100644 --- a/OVMS.V3/components/vehicle_renaultzoe_ph2/src/vehicle_renaultzoe_ph2.cpp +++ b/OVMS.V3/components/vehicle_renaultzoe_ph2/src/vehicle_renaultzoe_ph2.cpp @@ -99,13 +99,47 @@ 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]); - if (data[0] == 0x83 && data[1] == 0xc0 && mt_bus_awake) { + // Poll reply gives 0x83 0xc0 that means zoe is sleeping and CAN gateway does not respond to anything + if (mt_bus_awake && 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_awake->SetValue(false); - car_on(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 ); POLLSTATE_OFF; + } + //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 && (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_on->SetValue(true); + StandardMetrics.ms_v_env_awake->SetValue(true); + StandardMetrics.ms_v_env_charging12v->SetValue(true); + POLLSTATE_ON; } + if (mt_bus_awake && data[data[2] == 0x92 && data[3] == 0x10]) { //received 0x9210 from LBC, only sent freely on starting charge so far + ESP_LOGI(TAG,"Zoe stared charging"); + StandardMetrics.ms_v_env_on->SetValue(false); + StandardMetrics.ms_v_charge_state->SetValue("charging"); + POLLSTATE_CHARGING; + } + if (mt_bus_awake && data[data[2] == 0x92 && data[3] == 0x43]) { //received 0x9243 from LBC, only sent freely on stopping charge so far + ESP_LOGI(TAG,"Zoe stopped charging"); + StandardMetrics.ms_v_charge_state->SetValue("stopped"); + POLLSTATE_ON; + } + if (mt_bus_awake && !CarIsDriving && StandardMetrics.ms_v_pos_gpsspeed->AsFloat() > 5) { //If GPS speed bigger than 5km/h then assume Vehicle driving, later I used OBD speed for that + ESP_LOGI(TAG,"Zoe is driving"); + StandardMetrics.ms_v_env_on->SetValue(false); + POLLSTATE_RUNNING; + CarIsDriving = true; + } else if (mt_bus_awake && CarIsDriving && StandardMetrics.ms_v_pos_gpsspeed->AsFloat() < 5) { + ESP_LOGI(TAG,"Zoe stopped driving"); + POLLSTATE_ON; + } } /** @@ -154,36 +188,6 @@ void OvmsVehicleRenaultZoePh2::IncomingPollReply(canbus* bus, uint16_t type, uin } } -/** - * Takes care of setting all the state appropriate when the car is on - * or off. Centralized so we can more easily make on and off mirror - * images. - */ -void OvmsVehicleRenaultZoePh2::car_on(bool isOn) { - if (isOn && !StandardMetrics.ms_v_env_on->AsBool()) { - // Car is beeing turned ON - ESP_LOGI(TAG,"CAR IS ON"); - StandardMetrics.ms_v_env_on->SetValue(isOn); - StandardMetrics.ms_v_env_awake->SetValue(isOn); - // Handle 12Vcharging - StandardMetrics.ms_v_env_charging12v->SetValue(true); - POLLSTATE_RUNNING; - } - else if(!isOn && StandardMetrics.ms_v_env_on->AsBool()) { - // Car is being turned OFF - ESP_LOGI(TAG,"CAR IS OFF"); - if (!StandardMetrics.ms_v_charge_inprogress->AsBool()) { - StandardMetrics.ms_v_env_charging12v->SetValue(false); - POLLSTATE_ON; - } else { - POLLSTATE_CHARGING; - } - StandardMetrics.ms_v_env_on->SetValue( isOn ); - StandardMetrics.ms_v_env_awake->SetValue( isOn ); - StandardMetrics.ms_v_pos_speed->SetValue( 0 );; - } -} - class OvmsVehicleRenaultZoePh2Init { public: OvmsVehicleRenaultZoePh2Init(); } MyOvmsVehicleRenaultZoePh2Init __attribute__ ((init_priority (9000))); diff --git a/OVMS.V3/components/vehicle_renaultzoe_ph2/src/vehicle_renaultzoe_ph2.h b/OVMS.V3/components/vehicle_renaultzoe_ph2/src/vehicle_renaultzoe_ph2.h index f5be7b8..bbaf1ba 100644 --- a/OVMS.V3/components/vehicle_renaultzoe_ph2/src/vehicle_renaultzoe_ph2.h +++ b/OVMS.V3/components/vehicle_renaultzoe_ph2/src/vehicle_renaultzoe_ph2.h @@ -69,6 +69,7 @@ class OvmsVehicleRenaultZoePh2 : public OvmsVehicle { void IncomingPollReply(canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t remain); void WebInit(); void WebDeInit(); + bool CarIsDriving = false; protected: void IncomingINV(uint16_t type, uint16_t pid, const char* data, uint16_t len); @@ -77,8 +78,6 @@ class OvmsVehicleRenaultZoePh2 : public OvmsVehicle { void IncomingLBC(uint16_t type, uint16_t pid, const char* data, uint16_t len); 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); - - void car_on(bool isOn); // Renault ZOE specific metrics OvmsMetricFloat *mt_pos_odometer_start; // ODOmeter at Start