Implement car on of driving charging method depending on some free frames

This commit is contained in:
Carsten Schmiemann 2022-04-16 14:41:36 +02:00
parent 464a2e4b39
commit 7d3889fbcc
3 changed files with 38 additions and 35 deletions

View file

@ -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

View file

@ -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)));

View file

@ -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