Add cluster trip

This commit is contained in:
Carsten Schmiemann 2022-04-18 20:26:15 +02:00
parent 0a9eee465c
commit 5207fec284
7 changed files with 82 additions and 18 deletions

View File

@ -47,7 +47,7 @@ void OvmsVehicleRenaultZoePh2::IncomingEVC(uint16_t type, uint16_t pid, const ch
ESP_LOGD(TAG, "21D0 EVC ms_v_charge_12v_temp: %f", (CAN_UINT(0) - 40) * 0.001);
break;
}
case 0x21CF: { //Inverter status
case 0x21CF: { //Inverter status --- Main switch for polling and driving state
//ESP_LOGD(TAG, "21CF EVC mt_inv_status: %d", CAN_NIBL(0));
if (CAN_NIBL(0) == 1) {
mt_inv_status->SetValue("Inverter off");

View File

@ -27,8 +27,8 @@
void OvmsVehicleRenaultZoePh2::IncomingHVAC(uint16_t type, uint16_t pid, const char* data, uint16_t len) {
switch (pid) {
case 0x4361: { //Cabin temperature
StandardMetrics.ms_v_env_cabintemp->SetValue(float((CAN_NIBL(0) - 40) * 0.1), Celcius);
ESP_LOGD(TAG, "4361 HVAC ms_v_env_cabintemp: %f", (CAN_NIBL(0) - 40) * 0.1);
StandardMetrics.ms_v_env_cabintemp->SetValue(float(CAN_NIBL(0) - 40), Celcius);
ESP_LOGD(TAG, "4361 HVAC ms_v_env_cabintemp: %f", (float(CAN_NIBL(0) - 40)));
break;
}
case 0x4360: { //Cabin setpoint

View File

@ -0,0 +1,49 @@
/*
; Project: Open Vehicle Monitor System
; Date: 15th Apr 2022
;
; (C) 2022 Carsten Schmiemann
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
#include "vehicle_renaultzoe_ph2.h"
void OvmsVehicleRenaultZoePh2::IncomingCLUSTER(uint16_t type, uint16_t pid, const char* data, uint16_t len) {
switch (pid) {
case 0x2101: { // Cluster - trip counter
mt_pos_car_trip->SetValue(CAN_UINT24(0), Kilometers);
ESP_LOGD(TAG, "2102 CLUSTER mt_pos_car_trip: %f", float(CAN_UINT24(0)));
break;
}
default: {
char *buf = NULL;
size_t rlen = len, offset = 0;
do {
rlen = FormatHexDump(&buf, data + offset, rlen, 16);
offset += 16;
ESP_LOGW(TAG, "OBD2: unhandled reply from CLUSTER [%02x %02x]: %s", type, pid, buf ? buf : "-");
} while (rlen);
if (buf)
free(buf);
break;
}
}
}

View File

@ -226,5 +226,9 @@ static const OvmsVehicle::poll_pid_t renault_zoe_polls[] = {
//UCM
//{ 0x74D, 0x76D, VEHICLE_POLL_TYPE_OBDIISESSION, SESSION_AfterSales, { 0, 60, 60, 60 }, 0, ISOTP_STD }, // OBD Extended Diagnostic Session
{ 0x74D, 0x76D, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x6079, { 0, 10, 5, 3 }, 0, ISOTP_STD }, // 12V Battery current
//TDB
//{ 0x743, 0x763, VEHICLE_POLL_TYPE_OBDIISESSION, SESSION_AfterSales, { 0, 60, 60, 60 }, 0, ISOTP_STD }, // OBD Extended Diagnostic Session
{ 0x743, 0x763, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0x2101, { 0, 10, 10, 300 }, 0, ISOTP_STD }, // Cluster - trip counter
POLL_LIST_END
};

View File

@ -45,26 +45,21 @@ using namespace std;
void OvmsVehicleRenaultZoePh2::WebCfgBattery(PageEntry_t& p, PageContext_t& c)
{
std::string error, rangeideal, battcapacity;
std::string error, rangeideal, battcapacity, UseCarTrip;
if (c.method == "POST") {
rangeideal = c.getvar("rangeideal");
battcapacity = c.getvar("battcapacity");
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 < 40000 || v > 52000)
error += "<li data-input=\"battcapacity\">Battery Capacity must be of 40000…52000 Wh</li>";
}
if (error == "") {
// store:
MyConfig.SetParamValue("xrz", "rangeideal", rangeideal);
MyConfig.SetParamValue("xrz", "battcapacity", battcapacity);
MyConfig.SetParamValue("xrz2", "rangeideal", rangeideal);
MyConfig.SetParamValue("xrz2", "battcapacity", battcapacity);
MyConfig.SetParamValue("xrz2", "UseCarTrip", UseCarTrip);
c.head(200);
c.alert("success", "<p class=\"lead\">Renault Zoe Ph2 battery setup saved.</p>");
@ -79,8 +74,9 @@ void OvmsVehicleRenaultZoePh2::WebCfgBattery(PageEntry_t& p, PageContext_t& c)
}
else {
// read configuration:
rangeideal = MyConfig.GetParamValue("xrz", "rangeideal", "350");
battcapacity = MyConfig.GetParamValue("xrz", "battcapacity", "52000");
rangeideal = MyConfig.GetParamValue("xrz2", "rangeideal", "350");
battcapacity = MyConfig.GetParamValue("xrz2", "battcapacity", "52000");
UseCarTrip = MyConfig.GetParamValueBool("xrz2", "UseCarTrip", false);
c.head(200);
}
@ -88,7 +84,7 @@ void OvmsVehicleRenaultZoePh2::WebCfgBattery(PageEntry_t& p, PageContext_t& c)
c.panel_start("primary", "Renault Zoe Ph2 Battery Setup");
c.form_start(p.uri);
c.fieldset_start("Battery size and Ideal range");
c.fieldset_start("Battery size and ideal range");
c.input_radio_start("Battery size", "battcapacity");
c.input_radio_option("battcapacity", "R240 (22kWh)", "22000", battcapacity == "22000");
@ -99,6 +95,12 @@ void OvmsVehicleRenaultZoePh2::WebCfgBattery(PageEntry_t& p, PageContext_t& c)
c.input_slider("Range Ideal", "rangeideal", 3, "km", -1, atoi(rangeideal.c_str()), 350, 80, 500, 1,
"<p>Default 350km. Ideal Range...</p>");
c.fieldset_start("Trip counter settings");
c.input_radio_start("Which tripcounter to use", "UseCarTrip");
c.input_radio_option("UseCarTrip", "Internal (New trip everytime car starts)", "false", UseCarTrip == "false");
c.input_radio_option("UseCarTrip", "Car trip counter from Cluster", "true", UseCarTrip == "true");
c.fieldset_end();
c.print("<hr>");

View File

@ -55,7 +55,7 @@ OvmsVehicleRenaultZoePh2::OvmsVehicleRenaultZoePh2() {
POLLSTATE_OFF;
PollSetPidList(m_can1, renault_zoe_polls);
PollSetThrottling(5);
PollSetThrottling(10);
PollSetResponseSeparationTime(20);
// init metrics:
@ -76,10 +76,12 @@ OvmsVehicleRenaultZoePh2::OvmsVehicleRenaultZoePh2() {
mt_hvac_compressor_pressure = MyMetrics.InitFloat("zph2.h.compressor.pressure", SM_STALE_MID, 0, kPa);
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_pos_car_trip = MyMetrics.InitFloat("zph2.v.pos.car.trip", SM_STALE_MID, 0, Kilometers);
// get values from config store
m_range_ideal = MyConfig.GetParamValueInt("xrz2", "rangeideal", 350);
m_battery_capacity = MyConfig.GetParamValueInt("xrz2", "battcapacity", 52000);
m_UseCarTrip = MyConfig.GetParamValueBool("xrz2", "UseCarTrip", false);
StandardMetrics.ms_v_bat_range_ideal->SetValue(m_range_ideal, Kilometers);
// BMS configuration:
@ -171,6 +173,10 @@ void OvmsVehicleRenaultZoePh2::IncomingPollReply(canbus* bus, uint16_t type, uin
// ****** UCM *****
case 0x76D:
IncomingUCM(type, pid, rxbuf.data(), rxbuf.size());
break;
// ****** CLUSTER *****
case 0x763:
IncomingCLUSTER(type, pid, rxbuf.data(), rxbuf.size());
break;
}
}
@ -249,7 +255,7 @@ void OvmsVehicleRenaultZoePh2::Ticker10(uint32_t ticker) {
}
void OvmsVehicleRenaultZoePh2::Ticker1(uint32_t ticker) {
if (StandardMetrics.ms_v_env_on->AsBool() && !CarIsDriving) {
if (StandardMetrics.ms_v_env_on->AsBool() && !CarIsDriving && !m_UseCarTrip) {
CarIsDriving = true;
//Start trip after power on
StandardMetrics.ms_v_pos_trip->SetValue(0);
@ -257,7 +263,7 @@ void OvmsVehicleRenaultZoePh2::Ticker1(uint32_t ticker) {
StandardMetrics.ms_v_bat_energy_used->SetValue(0);
StandardMetrics.ms_v_bat_energy_recd->SetValue(0);
}
if (StandardMetrics.ms_v_env_on->AsBool()) {
if (StandardMetrics.ms_v_env_on->AsBool() && !m_UseCarTrip) {
StandardMetrics.ms_v_pos_trip->SetValue(StandardMetrics.ms_v_pos_odometer->AsFloat(0) - mt_pos_odometer_start->AsFloat(0));
}
StandardMetrics.ms_v_bat_range_est->SetValue((m_range_ideal / (StandardMetrics.ms_v_bat_soc->AsFloat(1) * 100.0)), Kilometers);

View File

@ -76,12 +76,14 @@ class OvmsVehicleRenaultZoePh2 : public OvmsVehicle {
protected:
int m_range_ideal;
int m_battery_capacity;
bool m_UseCarTrip = false;
void IncomingINV(uint16_t type, uint16_t pid, const char* data, uint16_t len);
void IncomingEVC(uint16_t type, uint16_t pid, const char* data, uint16_t len);
void IncomingBCM(uint16_t type, uint16_t pid, const char* data, uint16_t len);
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 IncomingCLUSTER(uint16_t type, uint16_t pid, const char* data, uint16_t len);
int calcMinutesRemaining(float charge_voltage, float charge_current);
void ChargeStatistics();
void EnergyStatistics();
@ -107,6 +109,7 @@ class OvmsVehicleRenaultZoePh2 : public OvmsVehicle {
OvmsMetricFloat *mt_hvac_compressor_pressure;//Compressor pressure
OvmsMetricFloat *mt_hvac_compressor_power; //Compressor power
OvmsMetricString *mt_hvac_compressor_mode; //Compressor mode
OvmsMetricFloat *mt_pos_car_trip; //Cluster tripcounter
protected:
string zoe_obd_rxbuf;