can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID.
Shane, Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering:
can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID.
I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus). Reduced example: void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) { uint8_t *d = p_frame->data.u8; switch (p_frame->MsgID) { case 0x6f2: // for example, assuming the SOC is in byte 1: StdMetrics.ms_v_bat_soc->SetValue(d[1]); break; } } If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example. Regards, Michael -- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
Shane, I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example: RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS); Regards, Michael Am 15.02.21 um 08:36 schrieb Michael Balzer:
Shane,
Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering:
can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID.
I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus).
Reduced example:
void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) { uint8_t *d = p_frame->data.u8;
switch (p_frame->MsgID) { case 0x6f2: // for example, assuming the SOC is in byte 1: StdMetrics.ms_v_bat_soc->SetValue(d[1]); break; } }
If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example.
Regards, Michael
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
Good evening Michael, Or any one that has the time to help, Ive now successfully retrieved as much info as I can without polling any info for the maxus, but I have have now found an ecu that responds to pid requests. For example if I use the obdii pid scanner I get the loads of data back and I’ve decoded some of it, just need a bit of guidance how to write the code to get the same info A part of a scan is as follows Scan complete (7e3 e000-e100) Scan started : 2021-03-04 18:32:36 GMT Last response: 2021-03-04 18:32:39 GMT 7e3[7eb]:e000 00 7e3[7eb]:e001 64 7e3[7eb]:e002 4b 7e3[7eb]:e003 26 bc 7e3[7eb]:e004 00 07 7e3[7eb]:e005 2f 7e3[7eb]:e006 2e 7e3[7eb]:e007 02 00 7e3[7eb]:e008 01 ff 7e3[7eb]:e009 02 00 7e3[7eb]:e010 02 00 I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH And e002 is a temp 4b = 75 / 10 = 7.5 degrees So if some one can help me with an example of how to correctly code this one I can work out the rest, Ive looked through various vehicles but everyone uses different methods and I can’t seem to get one to work for me. Any help much appreciated Shane
On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de> wrote:
Shane,
I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example:
RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS);
Regards, Michael
Am 15.02.21 um 08:36 schrieb Michael Balzer:
Shane,
Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering:
can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID.
I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus).
Reduced example:
void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) { uint8_t *d = p_frame->data.u8;
switch (p_frame->MsgID) { case 0x6f2: // for example, assuming the SOC is in byte 1: StdMetrics.ms_v_bat_soc->SetValue(d[1]); break; } }
If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example.
Regards, Michael
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
Shane, on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html Regards, Michael Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering:
Good evening Michael,
Or any one that has the time to help,
Ive now successfully retrieved as much info as I can without polling any info for the maxus, but I have have now found an ecu that responds to pid requests.
For example if I use the obdii pid scanner I get the loads of data back and I’ve decoded some of it, just need a bit of guidance how to write the code to get the same info
A part of a scan is as follows
Scan complete (7e3 e000-e100) Scan started : 2021-03-04 18:32:36 GMT Last response: 2021-03-04 18:32:39 GMT 7e3[7eb]:e000 00 7e3[7eb]:e001 64 7e3[7eb]:e002 4b 7e3[7eb]:e003 26 bc 7e3[7eb]:e004 00 07 7e3[7eb]:e005 2f 7e3[7eb]:e006 2e 7e3[7eb]:e007 02 00 7e3[7eb]:e008 01 ff 7e3[7eb]:e009 02 00 7e3[7eb]:e010 02 00
I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH And e002 is a temp 4b = 75 / 10 = 7.5 degrees
So if some one can help me with an example of how to correctly code this one I can work out the rest,
Ive looked through various vehicles but everyone uses different methods and I can’t seem to get one to work for me.
Any help much appreciated
Shane
On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example:
RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS);
Regards, Michael
Am 15.02.21 um 08:36 schrieb Michael Balzer:
Shane,
Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering:
can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID.
I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus).
Reduced example:
void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) { uint8_t *d = p_frame->data.u8;
switch (p_frame->MsgID) { case 0x6f2: // for example, assuming the SOC is in byte 1: StdMetrics.ms_v_bat_soc->SetValue(d[1]); break; } }
If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example.
Regards, Michael
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
Thanks Michael, Had a try and ended up with this bit added but return anything Where am I going wrong? Shane ******* #include "ovms_log.h" static const char *TAG = "v-edeliver3"; #include "vehicle_edeliver3.h" #include "metrics_standard.h" namespace { const OvmsVehicle::poll_pid_t obdii_polls[] = { { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH POLL_LIST_END }; }; OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Start eDeliver3 vehicle module"); RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); } OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Stop eDeliver3 vehicle module"); memset(m_vin, 0, sizeof(m_vin)); } //testing polls void OvmsVehicleEdeliver3::IncomingPollReply( canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) { string& rxbuf = med_obd_rxbuf; OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0); // init / fill rx buffer: if (m_poll_ml_frame == 0) { rxbuf.clear(); rxbuf.reserve(length + mlremain); } rxbuf.append((char*)data, length); if (mlremain) return; // complete: switch (pid) { case 0xe003: { unsigned int soh_raw = ((unsigned int)rxbuf[0] << 8) | (unsigned int)rxbuf[1]; float soh = soh_raw / 10; StdMetrics.ms_v_bat_soh->SetValue(soh); break; } } } // end testing polls
On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de> wrote:
Shane,
on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html <http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html>
Regards, Michael
Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering:
Good evening Michael,
Or any one that has the time to help,
Ive now successfully retrieved as much info as I can without polling any info for the maxus, but I have have now found an ecu that responds to pid requests.
For example if I use the obdii pid scanner I get the loads of data back and I’ve decoded some of it, just need a bit of guidance how to write the code to get the same info
A part of a scan is as follows
Scan complete (7e3 e000-e100) Scan started : 2021-03-04 18:32:36 GMT Last response: 2021-03-04 18:32:39 GMT 7e3[7eb]:e000 00 7e3[7eb]:e001 64 7e3[7eb]:e002 4b 7e3[7eb]:e003 26 bc 7e3[7eb]:e004 00 07 7e3[7eb]:e005 2f 7e3[7eb]:e006 2e 7e3[7eb]:e007 02 00 7e3[7eb]:e008 01 ff 7e3[7eb]:e009 02 00 7e3[7eb]:e010 02 00
I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH And e002 is a temp 4b = 75 / 10 = 7.5 degrees
So if some one can help me with an example of how to correctly code this one I can work out the rest,
Ive looked through various vehicles but everyone uses different methods and I can’t seem to get one to work for me.
Any help much appreciated
Shane
On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example:
RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS);
Regards, Michael
Am 15.02.21 um 08:36 schrieb Michael Balzer:
Shane,
Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering:
can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID.
I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus).
Reduced example:
void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) { uint8_t *d = p_frame->data.u8;
switch (p_frame->MsgID) { case 0x6f2: // for example, assuming the SOC is in byte 1: StdMetrics.ms_v_bat_soc->SetValue(d[1]); break; } }
If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example.
Regards, Michael
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
Shane, OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0); needs to be done in your vehicle init, i.e. the constructor after RegisterCanBus(). Please read the vehicle_obdii module source for a complete polling example. Regards, Michael Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering:
Thanks Michael,
Had a try and ended up with this bit added but return anything
Where am I going wrong?
Shane
*******
#include "ovms_log.h" *static**const**char**TAG= "v-edeliver3";
#include "vehicle_edeliver3.h" #include "metrics_standard.h"
*namespace* {
*const*OvmsVehicle::poll_pid_tobdii_polls[] = { { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH POLL_LIST_END }; };
OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Start eDeliver3 vehicle module");
RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); }
OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Stop eDeliver3 vehicle module");
memset(m_vin, 0, *sizeof*(m_vin)); }
//testing polls
*void*OvmsVehicleEdeliver3::IncomingPollReply( canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) { string& rxbuf = med_obd_rxbuf;
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
// init / fill rx buffer: *if* (m_poll_ml_frame == 0) { rxbuf.clear(); rxbuf.reserve(length + mlremain); } rxbuf.append((*char**)data, length); *if* (mlremain) *return*;
// complete: *switch* (pid) { *case* 0xe003: { *unsigned* *int* soh_raw = ((*unsigned* *int*)rxbuf[0] << 8) | (*unsigned* *int*)rxbuf[1]; *float* soh = soh_raw / 10; StdMetrics.ms_v_bat_soh->SetValue(soh); *break*; } } }
// end testing polls
On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html
Regards, Michael
Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering:
Good evening Michael,
Or any one that has the time to help,
Ive now successfully retrieved as much info as I can without polling any info for the maxus, but I have have now found an ecu that responds to pid requests.
For example if I use the obdii pid scanner I get the loads of data back and I’ve decoded some of it, just need a bit of guidance how to write the code to get the same info
A part of a scan is as follows
Scan complete (7e3 e000-e100) Scan started : 2021-03-04 18:32:36 GMT Last response: 2021-03-04 18:32:39 GMT 7e3[7eb]:e000 00 7e3[7eb]:e001 64 7e3[7eb]:e002 4b 7e3[7eb]:e003 26 bc 7e3[7eb]:e004 00 07 7e3[7eb]:e005 2f 7e3[7eb]:e006 2e 7e3[7eb]:e007 02 00 7e3[7eb]:e008 01 ff 7e3[7eb]:e009 02 00 7e3[7eb]:e010 02 00
I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH And e002 is a temp 4b = 75 / 10 = 7.5 degrees
So if some one can help me with an example of how to correctly code this one I can work out the rest,
Ive looked through various vehicles but everyone uses different methods and I can’t seem to get one to work for me.
Any help much appreciated
Shane
On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example:
RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS);
Regards, Michael
Am 15.02.21 um 08:36 schrieb Michael Balzer:
Shane,
Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering:
can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID.
I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus).
Reduced example:
void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) { uint8_t *d = p_frame->data.u8;
switch (p_frame->MsgID) { case 0x6f2: // for example, assuming the SOC is in byte 1: StdMetrics.ms_v_bat_soc->SetValue(d[1]); break; } }
If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example.
Regards, Michael
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
can any one tell me what the "v.e.c.login" is and is it need for something to work? also any one with any ideas how to deal with cell voltages in a string this long? took me blumim ages to find the bms when the tx and rx are 128 address apart!! 748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 can any one tell me what the "v.e.c.login" is and is it need for something to work? Shane
On 5 Mar 2021, at 20:45, Michael Balzer <dexter@expeedo.de> wrote:
Shane,
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
needs to be done in your vehicle init, i.e. the constructor after RegisterCanBus().
Please read the vehicle_obdii module source for a complete polling example.
Regards, Michael
Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering:
Thanks Michael,
Had a try and ended up with this bit added but return anything
Where am I going wrong?
Shane
*******
#include "ovms_log.h" static const char *TAG = "v-edeliver3";
#include "vehicle_edeliver3.h" #include "metrics_standard.h"
namespace {
const OvmsVehicle::poll_pid_t obdii_polls[] = { { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH POLL_LIST_END }; };
OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Start eDeliver3 vehicle module");
RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); }
OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Stop eDeliver3 vehicle module");
memset(m_vin, 0, sizeof(m_vin)); }
//testing polls
void OvmsVehicleEdeliver3::IncomingPollReply( canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) { string& rxbuf = med_obd_rxbuf;
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
// init / fill rx buffer: if (m_poll_ml_frame == 0) { rxbuf.clear(); rxbuf.reserve(length + mlremain); } rxbuf.append((char*)data, length); if (mlremain) return;
// complete: switch (pid) { case 0xe003: { unsigned int soh_raw = ((unsigned int)rxbuf[0] << 8) | (unsigned int)rxbuf[1]; float soh = soh_raw / 10; StdMetrics.ms_v_bat_soh->SetValue(soh); break; } } }
// end testing polls
On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html <http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html>
Regards, Michael
Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering:
Good evening Michael,
Or any one that has the time to help,
Ive now successfully retrieved as much info as I can without polling any info for the maxus, but I have have now found an ecu that responds to pid requests.
For example if I use the obdii pid scanner I get the loads of data back and I’ve decoded some of it, just need a bit of guidance how to write the code to get the same info
A part of a scan is as follows
Scan complete (7e3 e000-e100) Scan started : 2021-03-04 18:32:36 GMT Last response: 2021-03-04 18:32:39 GMT 7e3[7eb]:e000 00 7e3[7eb]:e001 64 7e3[7eb]:e002 4b 7e3[7eb]:e003 26 bc 7e3[7eb]:e004 00 07 7e3[7eb]:e005 2f 7e3[7eb]:e006 2e 7e3[7eb]:e007 02 00 7e3[7eb]:e008 01 ff 7e3[7eb]:e009 02 00 7e3[7eb]:e010 02 00
I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH And e002 is a temp 4b = 75 / 10 = 7.5 degrees
So if some one can help me with an example of how to correctly code this one I can work out the rest,
Ive looked through various vehicles but everyone uses different methods and I can’t seem to get one to work for me.
Any help much appreciated
Shane
On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example:
RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS);
Regards, Michael
Am 15.02.21 um 08:36 schrieb Michael Balzer:
Shane,
Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering: > can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID.
I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus).
Reduced example:
void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) { uint8_t *d = p_frame->data.u8;
switch (p_frame->MsgID) { case 0x6f2: // for example, assuming the SOC is in byte 1: StdMetrics.ms_v_bat_soc->SetValue(d[1]); break; } }
If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example.
Regards, Michael
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
Shane, Am 29.03.21 um 20:17 schrieb Shane @ Kilve Engineering:
can any one tell me what the "v.e.c.login" is and is it need for something to work?
v.e.c.config yes = ECU/controller in configuration state It's not used by the framework currently.
also any one with any ideas how to deal with cell voltages in a string this long? took me blumim ages to find the bms when the tx and rx are 128 address apart!!
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Simply loop over the cells contained. Have a look at the buffer macro utils, e.g.: https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master... Regards, Michael
Shane
On 5 Mar 2021, at 20:45, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
needs to be done in your vehicle init, i.e. the constructor after RegisterCanBus().
Please read the vehicle_obdii module source for a complete polling example.
Regards, Michael
Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering:
Thanks Michael,
Had a try and ended up with this bit added but return anything
Where am I going wrong?
Shane
*******
#include "ovms_log.h" *static**const**char**TAG= "v-edeliver3";
#include "vehicle_edeliver3.h" #include "metrics_standard.h"
*namespace* {
*const*OvmsVehicle::poll_pid_tobdii_polls[] = { { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH POLL_LIST_END }; };
OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Start eDeliver3 vehicle module");
RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); }
OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Stop eDeliver3 vehicle module");
memset(m_vin, 0, *sizeof*(m_vin)); }
//testing polls
*void*OvmsVehicleEdeliver3::IncomingPollReply( canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) { string& rxbuf = med_obd_rxbuf;
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
// init / fill rx buffer: *if* (m_poll_ml_frame == 0) { rxbuf.clear(); rxbuf.reserve(length + mlremain); } rxbuf.append((*char**)data, length); *if* (mlremain) *return*;
// complete: *switch* (pid) { *case* 0xe003: { *unsigned* *int* soh_raw = ((*unsigned* *int*)rxbuf[0] << 8) | (*unsigned* *int*)rxbuf[1]; *float* soh = soh_raw / 10; StdMetrics.ms_v_bat_soh->SetValue(soh); *break*; } } }
// end testing polls
On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html
Regards, Michael
Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering:
Good evening Michael,
Or any one that has the time to help,
Ive now successfully retrieved as much info as I can without polling any info for the maxus, but I have have now found an ecu that responds to pid requests.
For example if I use the obdii pid scanner I get the loads of data back and I’ve decoded some of it, just need a bit of guidance how to write the code to get the same info
A part of a scan is as follows
Scan complete (7e3 e000-e100) Scan started : 2021-03-04 18:32:36 GMT Last response: 2021-03-04 18:32:39 GMT 7e3[7eb]:e000 00 7e3[7eb]:e001 64 7e3[7eb]:e002 4b 7e3[7eb]:e003 26 bc 7e3[7eb]:e004 00 07 7e3[7eb]:e005 2f 7e3[7eb]:e006 2e 7e3[7eb]:e007 02 00 7e3[7eb]:e008 01 ff 7e3[7eb]:e009 02 00 7e3[7eb]:e010 02 00
I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH And e002 is a temp 4b = 75 / 10 = 7.5 degrees
So if some one can help me with an example of how to correctly code this one I can work out the rest,
Ive looked through various vehicles but everyone uses different methods and I can’t seem to get one to work for me.
Any help much appreciated
Shane
On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example:
RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS);
Regards, Michael
Am 15.02.21 um 08:36 schrieb Michael Balzer: > Shane, > > Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering: >> can any one help me with a bit of code to retrieve ve some data >> from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this >> ecu it just broadcasts when its active, ive tried polling it >> but does not respond, i need to choose one byte and allocate it >> to a PID. > > I don't know what you mean by "allocating a byte to a PID", but > if you want to process frames received directly, simply override > IncomingFrameCan1() (or …2/3/4 depending on your bus). > > Reduced example: > > void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) > { > uint8_t *d = p_frame->data.u8; > > switch (p_frame->MsgID) > { > case 0x6f2: > // for example, assuming the SOC is in byte 1: > StdMetrics.ms_v_bat_soc->SetValue(d[1]); > break; > } > } > > If you're outside a vehicle context, you can register your own > CAN receiver by creating a queue and calling > MyCan.RegisterListener(). See the vehicle module for an example. > > Regards, > Michael >
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
Hi has anyone got a sample of the data for the cell voltages on the ioniq vfl just so I can see how the macro is handling it? Or is it played out the same as below? Regards Shane
On 29 Mar 2021, at 22:20, Michael Balzer <dexter@expeedo.de> wrote:
Shane,
Am 29.03.21 um 20:17 schrieb Shane @ Kilve Engineering:
can any one tell me what the "v.e.c.login" is and is it need for something to work?
v.e.c.config yes = ECU/controller in configuration state It's not used by the framework currently.
also any one with any ideas how to deal with cell voltages in a string this long? took me blumim ages to find the bms when the tx and rx are 128 address apart!!
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Simply loop over the cells contained. Have a look at the buffer macro utils, e.g.: https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master... <https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master/vehicle/OVMS.V3/components/vehicle_hyundai_ioniqvfl/src/vehicle_hyundai_ioniqvfl.cpp#L44>
Regards, Michael
Shane
On 5 Mar 2021, at 20:45, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
needs to be done in your vehicle init, i.e. the constructor after RegisterCanBus().
Please read the vehicle_obdii module source for a complete polling example.
Regards, Michael
Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering:
Thanks Michael,
Had a try and ended up with this bit added but return anything
Where am I going wrong?
Shane
*******
#include "ovms_log.h" static const char *TAG = "v-edeliver3";
#include "vehicle_edeliver3.h" #include "metrics_standard.h"
namespace {
const OvmsVehicle::poll_pid_t obdii_polls[] = { { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH POLL_LIST_END }; };
OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Start eDeliver3 vehicle module");
RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); }
OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Stop eDeliver3 vehicle module");
memset(m_vin, 0, sizeof(m_vin)); }
//testing polls
void OvmsVehicleEdeliver3::IncomingPollReply( canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) { string& rxbuf = med_obd_rxbuf;
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
// init / fill rx buffer: if (m_poll_ml_frame == 0) { rxbuf.clear(); rxbuf.reserve(length + mlremain); } rxbuf.append((char*)data, length); if (mlremain) return;
// complete: switch (pid) { case 0xe003: { unsigned int soh_raw = ((unsigned int)rxbuf[0] << 8) | (unsigned int)rxbuf[1]; float soh = soh_raw / 10; StdMetrics.ms_v_bat_soh->SetValue(soh); break; } } }
// end testing polls
On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html <http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html>
Regards, Michael
Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering:
Good evening Michael,
Or any one that has the time to help,
Ive now successfully retrieved as much info as I can without polling any info for the maxus, but I have have now found an ecu that responds to pid requests.
For example if I use the obdii pid scanner I get the loads of data back and I’ve decoded some of it, just need a bit of guidance how to write the code to get the same info
A part of a scan is as follows
Scan complete (7e3 e000-e100) Scan started : 2021-03-04 18:32:36 GMT Last response: 2021-03-04 18:32:39 GMT 7e3[7eb]:e000 00 7e3[7eb]:e001 64 7e3[7eb]:e002 4b 7e3[7eb]:e003 26 bc 7e3[7eb]:e004 00 07 7e3[7eb]:e005 2f 7e3[7eb]:e006 2e 7e3[7eb]:e007 02 00 7e3[7eb]:e008 01 ff 7e3[7eb]:e009 02 00 7e3[7eb]:e010 02 00
I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH And e002 is a temp 4b = 75 / 10 = 7.5 degrees
So if some one can help me with an example of how to correctly code this one I can work out the rest,
Ive looked through various vehicles but everyone uses different methods and I can’t seem to get one to work for me.
Any help much appreciated
Shane
> On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: > > Shane, > > I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example: > > RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS); > > Regards, > Michael > > > Am 15.02.21 um 08:36 schrieb Michael Balzer: >> Shane, >> >> Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering: >>> can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID. >> >> I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus). >> >> Reduced example: >> >> void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) >> { >> uint8_t *d = p_frame->data.u8; >> >> switch (p_frame->MsgID) >> { >> case 0x6f2: >> // for example, assuming the SOC is in byte 1: >> StdMetrics.ms_v_bat_soc->SetValue(d[1]); >> break; >> } >> } >> >> If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example. >> >> Regards, >> Michael >> >
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
OVMS# obd can1 request device -t1000 7e4 7ec 2102 7e4[7ec] 2102: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c5 | ................ c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 | .... OVMS# obd can1 request device -t1000 7e4 7ec 2103 7e4[7ec] 2103: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c5 c5 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c5 c5 c5 c4 c5 c5 c5 c4 c5 c4 c4 | ................ c5 c4 c4 c4 | .... OVMS# obd can1 request device -t1000 7e4 7ec 2104 7e4[7ec] 2104: Response: ff ff ff ff c4 c4 c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c5 c4 c4 | .... Your voltages obviously are 16 bit values, so you'll need to use RXB_UINT16() and multiply your loop index by 2. Regards, Michael Am 03.04.21 um 12:04 schrieb Shane @ Kilve Engineering:
Hi has anyone got a sample of the data for the cell voltages on the ioniq vfl just so I can see how the macro is handling it? Or is it played out the same as below?
Regards Shane
On 29 Mar 2021, at 22:20, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
Am 29.03.21 um 20:17 schrieb Shane @ Kilve Engineering:
can any one tell me what the "v.e.c.login" is and is it need for something to work?
v.e.c.config yes = ECU/controller in configuration state
It's not used by the framework currently.
also any one with any ideas how to deal with cell voltages in a string this long? took me blumim ages to find the bms when the tx and rx are 128 address apart!!
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Simply loop over the cells contained. Have a look at the buffer macro utils, e.g.: https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master...
Regards, Michael
Shane
On 5 Mar 2021, at 20:45, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
needs to be done in your vehicle init, i.e. the constructor after RegisterCanBus().
Please read the vehicle_obdii module source for a complete polling example.
Regards, Michael
Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering:
Thanks Michael,
Had a try and ended up with this bit added but return anything
Where am I going wrong?
Shane
*******
#include "ovms_log.h" *static**const**char**TAG= "v-edeliver3";
#include "vehicle_edeliver3.h" #include "metrics_standard.h"
*namespace* {
*const*OvmsVehicle::poll_pid_tobdii_polls[] = { { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH POLL_LIST_END }; };
OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Start eDeliver3 vehicle module");
RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); }
OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Stop eDeliver3 vehicle module");
memset(m_vin, 0, *sizeof*(m_vin)); }
//testing polls
*void*OvmsVehicleEdeliver3::IncomingPollReply( canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) { string& rxbuf = med_obd_rxbuf;
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
// init / fill rx buffer: *if* (m_poll_ml_frame == 0) { rxbuf.clear(); rxbuf.reserve(length + mlremain); } rxbuf.append((*char**)data, length); *if* (mlremain) *return*;
// complete: *switch* (pid) { *case* 0xe003: { *unsigned* *int* soh_raw = ((*unsigned* *int*)rxbuf[0] << 8) | (*unsigned* *int*)rxbuf[1]; *float* soh = soh_raw / 10; StdMetrics.ms_v_bat_soh->SetValue(soh); *break*; } } }
// end testing polls
On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html
Regards, Michael
Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering: > Good evening Michael, > > Or any one that has the time to help, > > Ive now successfully retrieved as much info as I can without > polling any info for the maxus, but I have have now found an ecu > that responds to pid requests. > > For example if I use the obdii pid scanner I get the loads of > data back and I’ve decoded some of it, just need a bit of > guidance how to write the code to get the same info > > A part of a scan is as follows > > Scan complete (7e3 e000-e100) > Scan started : 2021-03-04 18:32:36 GMT > Last response: 2021-03-04 18:32:39 GMT > 7e3[7eb]:e000 00 > 7e3[7eb]:e001 64 > 7e3[7eb]:e002 4b > 7e3[7eb]:e003 26 bc > 7e3[7eb]:e004 00 07 > 7e3[7eb]:e005 2f > 7e3[7eb]:e006 2e > 7e3[7eb]:e007 02 00 > 7e3[7eb]:e008 01 ff > 7e3[7eb]:e009 02 00 > 7e3[7eb]:e010 02 00 > > I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH > And e002 is a temp 4b = 75 / 10 = 7.5 degrees > > So if some one can help me with an example of how to correctly > code this one I can work out the rest, > > Ive looked through various vehicles but everyone uses different > methods and I can’t seem to get one to work for me. > > Any help much appreciated > > Shane > >> On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de >> <mailto:dexter@expeedo.de>> wrote: >> >> Shane, >> >> I forgot to mention: if you're working on a new vehicle module, >> you'll also need to start the bus somewhere in your >> initialization code. Example: >> >> RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS); >> >> Regards, >> Michael >> >> >> Am 15.02.21 um 08:36 schrieb Michael Balzer: >>> Shane, >>> >>> Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering: >>>> can any one help me with a bit of code to retrieve ve some >>>> data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant >>>> poll this ecu it just broadcasts when its active, ive tried >>>> polling it but does not respond, i need to choose one byte >>>> and allocate it to a PID. >>> >>> I don't know what you mean by "allocating a byte to a PID", >>> but if you want to process frames received directly, simply >>> override IncomingFrameCan1() (or …2/3/4 depending on your bus). >>> >>> Reduced example: >>> >>> void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) >>> { >>> uint8_t *d = p_frame->data.u8; >>> >>> switch (p_frame->MsgID) >>> { >>> case 0x6f2: >>> // for example, assuming the SOC is in byte 1: >>> StdMetrics.ms_v_bat_soc->SetValue(d[1]); >>> break; >>> } >>> } >>> >>> If you're outside a vehicle context, you can register your own >>> CAN receiver by creating a queue and calling >>> MyCan.RegisterListener(). See the vehicle module for an example. >>> >>> Regards, >>> Michael >>> >>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
Cheers Michael that’s a great help 👍🏼 Regards Shane
On 3 Apr 2021, at 12:02, Michael Balzer <dexter@expeedo.de> wrote:
OVMS# obd can1 request device -t1000 7e4 7ec 2102 7e4[7ec] 2102: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c5 | ................ c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2103 7e4[7ec] 2103: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c5 c5 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c5 c5 c5 c4 c5 c5 c5 c4 c5 c4 c4 | ................ c5 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2104 7e4[7ec] 2104: Response: ff ff ff ff c4 c4 c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c5 c4 c4 | ....
Your voltages obviously are 16 bit values, so you'll need to use RXB_UINT16() and multiply your loop index by 2.
Regards, Michael
Am 03.04.21 um 12:04 schrieb Shane @ Kilve Engineering:
Hi has anyone got a sample of the data for the cell voltages on the ioniq vfl just so I can see how the macro is handling it? Or is it played out the same as below?
Regards Shane
On 29 Mar 2021, at 22:20, Michael Balzer <dexter@expeedo.de> wrote:
Shane,
Am 29.03.21 um 20:17 schrieb Shane @ Kilve Engineering:
can any one tell me what the "v.e.c.login" is and is it need for something to work?
v.e.c.config yes = ECU/controller in configuration state It's not used by the framework currently.
also any one with any ideas how to deal with cell voltages in a string this long? took me blumim ages to find the bms when the tx and rx are 128 address apart!!
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Simply loop over the cells contained. Have a look at the buffer macro utils, e.g.: https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master...
Regards, Michael
Shane
On 5 Mar 2021, at 20:45, Michael Balzer <dexter@expeedo.de> wrote:
Shane,
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
needs to be done in your vehicle init, i.e. the constructor after RegisterCanBus().
Please read the vehicle_obdii module source for a complete polling example.
Regards, Michael
Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering:
Thanks Michael,
Had a try and ended up with this bit added but return anything
Where am I going wrong?
Shane
*******
#include "ovms_log.h" static const char *TAG = "v-edeliver3";
#include "vehicle_edeliver3.h" #include "metrics_standard.h"
namespace {
const OvmsVehicle::poll_pid_t obdii_polls[] = { { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH POLL_LIST_END }; };
OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Start eDeliver3 vehicle module");
RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); }
OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Stop eDeliver3 vehicle module");
memset(m_vin, 0, sizeof(m_vin)); }
//testing polls
void OvmsVehicleEdeliver3::IncomingPollReply( canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) { string& rxbuf = med_obd_rxbuf;
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
// init / fill rx buffer: if (m_poll_ml_frame == 0) { rxbuf.clear(); rxbuf.reserve(length + mlremain); } rxbuf.append((char*)data, length); if (mlremain) return;
// complete: switch (pid) { case 0xe003: { unsigned int soh_raw = ((unsigned int)rxbuf[0] << 8) | (unsigned int)rxbuf[1]; float soh = soh_raw / 10; StdMetrics.ms_v_bat_soh->SetValue(soh); break; } } }
// end testing polls
> On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de> wrote: > > Shane, > > on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html > > Regards, > Michael > > > Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering: >> Good evening Michael, >> >> Or any one that has the time to help, >> >> Ive now successfully retrieved as much info as I can without polling any info for the maxus, but I have have now found an ecu that responds to pid requests. >> >> For example if I use the obdii pid scanner I get the loads of data back and I’ve decoded some of it, just need a bit of guidance how to write the code to get the same info >> >> A part of a scan is as follows >> >> Scan complete (7e3 e000-e100) >> Scan started : 2021-03-04 18:32:36 GMT >> Last response: 2021-03-04 18:32:39 GMT >> 7e3[7eb]:e000 00 >> 7e3[7eb]:e001 64 >> 7e3[7eb]:e002 4b >> 7e3[7eb]:e003 26 bc >> 7e3[7eb]:e004 00 07 >> 7e3[7eb]:e005 2f >> 7e3[7eb]:e006 2e >> 7e3[7eb]:e007 02 00 >> 7e3[7eb]:e008 01 ff >> 7e3[7eb]:e009 02 00 >> 7e3[7eb]:e010 02 00 >> >> I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH >> And e002 is a temp 4b = 75 / 10 = 7.5 degrees >> >> So if some one can help me with an example of how to correctly code this one I can work out the rest, >> >> Ive looked through various vehicles but everyone uses different methods and I can’t seem to get one to work for me. >> >> Any help much appreciated >> >> Shane >> >>> On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de> wrote: >>> >>> Shane, >>> >>> I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example: >>> >>> RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS); >>> >>> Regards, >>> Michael >>> >>> >>> Am 15.02.21 um 08:36 schrieb Michael Balzer: >>>> Shane, >>>> >>>> Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering: >>>>> can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID. >>>> >>>> I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus). >>>> >>>> Reduced example: >>>> >>>> void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) >>>> { >>>> uint8_t *d = p_frame->data.u8; >>>> >>>> switch (p_frame->MsgID) >>>> { >>>> case 0x6f2: >>>> // for example, assuming the SOC is in byte 1: >>>> StdMetrics.ms_v_bat_soc->SetValue(d[1]); >>>> break; >>>> } >>>> } >>>> >>>> If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example. >>>> >>>> Regards, >>>> Michael >>>> >>> > > -- > Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal > Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 > _______________________________________________ > OvmsDev mailing list > OvmsDev@lists.openvehicles.com > http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
Thanks all for your help on this but think I need to learn a bit more before I tackle this one, Ill stick to the easier ones for now, If anyone else turns up will a maxus ill happy collaborate Regards Shane
On 3 Apr 2021, at 12:02, Michael Balzer <dexter@expeedo.de> wrote:
OVMS# obd can1 request device -t1000 7e4 7ec 2102 7e4[7ec] 2102: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c5 | ................ c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2103 7e4[7ec] 2103: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c5 c5 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c5 c5 c5 c4 c5 c5 c5 c4 c5 c4 c4 | ................ c5 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2104 7e4[7ec] 2104: Response: ff ff ff ff c4 c4 c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c5 c4 c4 | ....
Your voltages obviously are 16 bit values, so you'll need to use RXB_UINT16() and multiply your loop index by 2.
Regards, Michael
Am 03.04.21 um 12:04 schrieb Shane @ Kilve Engineering:
Hi has anyone got a sample of the data for the cell voltages on the ioniq vfl just so I can see how the macro is handling it? Or is it played out the same as below?
Regards Shane
On 29 Mar 2021, at 22:20, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
Am 29.03.21 um 20:17 schrieb Shane @ Kilve Engineering:
can any one tell me what the "v.e.c.login" is and is it need for something to work?
v.e.c.config yes = ECU/controller in configuration state It's not used by the framework currently.
also any one with any ideas how to deal with cell voltages in a string this long? took me blumim ages to find the bms when the tx and rx are 128 address apart!!
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Simply loop over the cells contained. Have a look at the buffer macro utils, e.g.: https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master... <https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master/vehicle/OVMS.V3/components/vehicle_hyundai_ioniqvfl/src/vehicle_hyundai_ioniqvfl.cpp#L44>
Regards, Michael
Shane
On 5 Mar 2021, at 20:45, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
needs to be done in your vehicle init, i.e. the constructor after RegisterCanBus().
Please read the vehicle_obdii module source for a complete polling example.
Regards, Michael
Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering:
Thanks Michael,
Had a try and ended up with this bit added but return anything
Where am I going wrong?
Shane
*******
#include "ovms_log.h" static const char *TAG = "v-edeliver3";
#include "vehicle_edeliver3.h" #include "metrics_standard.h"
namespace {
const OvmsVehicle::poll_pid_t obdii_polls[] = { { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH POLL_LIST_END }; };
OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Start eDeliver3 vehicle module");
RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); }
OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Stop eDeliver3 vehicle module");
memset(m_vin, 0, sizeof(m_vin)); }
//testing polls
void OvmsVehicleEdeliver3::IncomingPollReply( canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) { string& rxbuf = med_obd_rxbuf;
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
// init / fill rx buffer: if (m_poll_ml_frame == 0) { rxbuf.clear(); rxbuf.reserve(length + mlremain); } rxbuf.append((char*)data, length); if (mlremain) return;
// complete: switch (pid) { case 0xe003: { unsigned int soh_raw = ((unsigned int)rxbuf[0] << 8) | (unsigned int)rxbuf[1]; float soh = soh_raw / 10; StdMetrics.ms_v_bat_soh->SetValue(soh); break; } } }
// end testing polls
> On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: > > Shane, > > on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html <http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html> > > Regards, > Michael > > > Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering: >> Good evening Michael, >> >> Or any one that has the time to help, >> >> Ive now successfully retrieved as much info as I can without polling any info for the maxus, but I have have now found an ecu that responds to pid requests. >> >> For example if I use the obdii pid scanner I get the loads of data back and I’ve decoded some of it, just need a bit of guidance how to write the code to get the same info >> >> A part of a scan is as follows >> >> Scan complete (7e3 e000-e100) >> Scan started : 2021-03-04 18:32:36 GMT >> Last response: 2021-03-04 18:32:39 GMT >> 7e3[7eb]:e000 00 >> 7e3[7eb]:e001 64 >> 7e3[7eb]:e002 4b >> 7e3[7eb]:e003 26 bc >> 7e3[7eb]:e004 00 07 >> 7e3[7eb]:e005 2f >> 7e3[7eb]:e006 2e >> 7e3[7eb]:e007 02 00 >> 7e3[7eb]:e008 01 ff >> 7e3[7eb]:e009 02 00 >> 7e3[7eb]:e010 02 00 >> >> I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH >> And e002 is a temp 4b = 75 / 10 = 7.5 degrees >> >> So if some one can help me with an example of how to correctly code this one I can work out the rest, >> >> Ive looked through various vehicles but everyone uses different methods and I can’t seem to get one to work for me. >> >> Any help much appreciated >> >> Shane >> >>> On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: >>> >>> Shane, >>> >>> I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example: >>> >>> RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS); >>> >>> Regards, >>> Michael >>> >>> >>> Am 15.02.21 um 08:36 schrieb Michael Balzer: >>>> Shane, >>>> >>>> Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering: >>>>> can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID. >>>> >>>> I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus). >>>> >>>> Reduced example: >>>> >>>> void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) >>>> { >>>> uint8_t *d = p_frame->data.u8; >>>> >>>> switch (p_frame->MsgID) >>>> { >>>> case 0x6f2: >>>> // for example, assuming the SOC is in byte 1: >>>> StdMetrics.ms_v_bat_soc->SetValue(d[1]); >>>> break; >>>> } >>>> } >>>> >>>> If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example. >>>> >>>> Regards, >>>> Michael >>>> >>> > > -- > Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal > Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 > _______________________________________________ > OvmsDev mailing list > OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> > http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
morning peeps, sorry for the newbie question whats different about the cell vmax/vmin i see in metrics_standard.h its a vector? (OvmsMetricVector<float>* ms_v_bat_cell_vmax; // Cell maximum voltages [V]) does that mean i have ot handle these different? if so how? as all i get is errors trying to setvalue to this metric /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp: In member function 'void OvmsVehicleMaxed3::IncomingBmsReply(canbus*, uint16_t, uint16_t, uint8_t*, uint8_t, uint16_t)': /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:159:82: error: no matching function for call to 'OvmsMetricVector<float>::SetValue(float)' StandardMetrics.ms_v_bat_cell_vmax->SetValue((float)value2 / 1000); ^ In file included from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32: /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: no known conversion for argument 1 from 'float' to 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: no known conversion for argument 1 from 'float' to 'const std::vector<float, std::allocator<float> >&' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:162:82: error: no matching function for call to 'OvmsMetricVector<float>::SetValue(float)' StandardMetrics.ms_v_bat_cell_vmin->SetValue((float)value2 / 1000); ^ In file included from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32: /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: no known conversion for argument 1 from 'float' to 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: no known conversion for argument 1 from 'float' to 'const std::vector<float, std::allocator<float> >&' make[1]: *** [src/vehicle_med3.o] Error 1 make: *** [component-vehicle_maxus_edeliver3-build] Error 2 shane@Shanes-MacBook-Pro OVMS.V3 % Regards Shane
On 3 Apr 2021, at 12:02, Michael Balzer <dexter@expeedo.de> wrote:
OVMS# obd can1 request device -t1000 7e4 7ec 2102 7e4[7ec] 2102: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c5 | ................ c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2103 7e4[7ec] 2103: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c5 c5 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c5 c5 c5 c4 c5 c5 c5 c4 c5 c4 c4 | ................ c5 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2104 7e4[7ec] 2104: Response: ff ff ff ff c4 c4 c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c5 c4 c4 | ....
Your voltages obviously are 16 bit values, so you'll need to use RXB_UINT16() and multiply your loop index by 2.
Regards, Michael
Am 03.04.21 um 12:04 schrieb Shane @ Kilve Engineering:
Hi has anyone got a sample of the data for the cell voltages on the ioniq vfl just so I can see how the macro is handling it? Or is it played out the same as below?
Regards Shane
On 29 Mar 2021, at 22:20, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
Am 29.03.21 um 20:17 schrieb Shane @ Kilve Engineering:
can any one tell me what the "v.e.c.login" is and is it need for something to work?
v.e.c.config yes = ECU/controller in configuration state It's not used by the framework currently.
also any one with any ideas how to deal with cell voltages in a string this long? took me blumim ages to find the bms when the tx and rx are 128 address apart!!
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Simply loop over the cells contained. Have a look at the buffer macro utils, e.g.: https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master... <https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master/vehicle/OVMS.V3/components/vehicle_hyundai_ioniqvfl/src/vehicle_hyundai_ioniqvfl.cpp#L44>
Regards, Michael
Shane
On 5 Mar 2021, at 20:45, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
needs to be done in your vehicle init, i.e. the constructor after RegisterCanBus().
Please read the vehicle_obdii module source for a complete polling example.
Regards, Michael
Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering:
Thanks Michael,
Had a try and ended up with this bit added but return anything
Where am I going wrong?
Shane
*******
#include "ovms_log.h" static const char *TAG = "v-edeliver3";
#include "vehicle_edeliver3.h" #include "metrics_standard.h"
namespace {
const OvmsVehicle::poll_pid_t obdii_polls[] = { { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH POLL_LIST_END }; };
OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Start eDeliver3 vehicle module");
RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); }
OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() { ESP_LOGI(TAG, "Stop eDeliver3 vehicle module");
memset(m_vin, 0, sizeof(m_vin)); }
//testing polls
void OvmsVehicleEdeliver3::IncomingPollReply( canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) { string& rxbuf = med_obd_rxbuf;
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
// init / fill rx buffer: if (m_poll_ml_frame == 0) { rxbuf.clear(); rxbuf.reserve(length + mlremain); } rxbuf.append((char*)data, length); if (mlremain) return;
// complete: switch (pid) { case 0xe003: { unsigned int soh_raw = ((unsigned int)rxbuf[0] << 8) | (unsigned int)rxbuf[1]; float soh = soh_raw / 10; StdMetrics.ms_v_bat_soh->SetValue(soh); break; } } }
// end testing polls
> On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: > > Shane, > > on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html <http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html> > > Regards, > Michael > > > Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering: >> Good evening Michael, >> >> Or any one that has the time to help, >> >> Ive now successfully retrieved as much info as I can without polling any info for the maxus, but I have have now found an ecu that responds to pid requests. >> >> For example if I use the obdii pid scanner I get the loads of data back and I’ve decoded some of it, just need a bit of guidance how to write the code to get the same info >> >> A part of a scan is as follows >> >> Scan complete (7e3 e000-e100) >> Scan started : 2021-03-04 18:32:36 GMT >> Last response: 2021-03-04 18:32:39 GMT >> 7e3[7eb]:e000 00 >> 7e3[7eb]:e001 64 >> 7e3[7eb]:e002 4b >> 7e3[7eb]:e003 26 bc >> 7e3[7eb]:e004 00 07 >> 7e3[7eb]:e005 2f >> 7e3[7eb]:e006 2e >> 7e3[7eb]:e007 02 00 >> 7e3[7eb]:e008 01 ff >> 7e3[7eb]:e009 02 00 >> 7e3[7eb]:e010 02 00 >> >> I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH >> And e002 is a temp 4b = 75 / 10 = 7.5 degrees >> >> So if some one can help me with an example of how to correctly code this one I can work out the rest, >> >> Ive looked through various vehicles but everyone uses different methods and I can’t seem to get one to work for me. >> >> Any help much appreciated >> >> Shane >> >>> On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: >>> >>> Shane, >>> >>> I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example: >>> >>> RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS); >>> >>> Regards, >>> Michael >>> >>> >>> Am 15.02.21 um 08:36 schrieb Michael Balzer: >>>> Shane, >>>> >>>> Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering: >>>>> can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID. >>>> >>>> I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus). >>>> >>>> Reduced example: >>>> >>>> void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) >>>> { >>>> uint8_t *d = p_frame->data.u8; >>>> >>>> switch (p_frame->MsgID) >>>> { >>>> case 0x6f2: >>>> // for example, assuming the SOC is in byte 1: >>>> StdMetrics.ms_v_bat_soc->SetValue(d[1]); >>>> break; >>>> } >>>> } >>>> >>>> If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example. >>>> >>>> Regards, >>>> Michael >>>> >>> > > -- > Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal > Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 > _______________________________________________ > OvmsDev mailing list > OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> > http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
Shane, vector metrics in general can be set by passing a vector or by using the element setters provided (see API). But you don't need to set the cell max/min/stddev metrics at all, you only need to feed the cell voltages (and/or temperatures). The BMS framework automatically extracts all statistics values from them. Btw, regarding your cell voltages:
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
This looks like 96 cells with a factor of 0.001, e.g. 0x1090 = 4240 * 0.001 = 4.24V. Assuming you fix your IncomingPollReply() handler to actually use the rxbuf string and you copy the RXB_* macros from the Ioniq VFL code, you can simply do this to process the values: case 0xe113: { // Read battery cell voltages 1-96: BmsRestartCellVoltages(); for (int i = 0; i < 96; i++) { BmsSetCellVoltage(i, RXB_UINT16(i*2) * 0.001f); } break; } Doesn't look that hard, does it? Regards, Michael Am 04.04.21 um 12:37 schrieb Shane @ Kilve Engineering:
morning peeps, sorry for the newbie question whats different about the cell vmax/vmin i see in metrics_standard.h its a vector? (OvmsMetricVector<float>* ms_v_bat_cell_vmax; // Cell maximum voltages [V]) does that mean i have ot handle these different? if so how? as all i get is errors trying to setvalue to this metric
*/Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:* In member function '*void OvmsVehicleMaxed3::IncomingBmsReply(canbus*, uint16_t, uint16_t, uint8_t*, uint8_t, uint16_t)*': */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:159:82:* *error: *no matching function for call to '*OvmsMetricVector<float>::SetValue(float)*' StandardMetrics.ms_v_bat_cell_vmax->SetValue((float)value2 / 1000); * ^* In file included from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0*, from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32*, from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32*: */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18:* *note: *candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) *^* */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18:* *note: * no known conversion for argument 1 from '*float*' to '*std::__cxx11::string {aka std::__cxx11::basic_string<char>}*' */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10:* *note: *candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) * ^* */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10:* *note: * no known conversion for argument 1 from '*float*' to '*const std::vector<float, std::allocator<float> >&*' */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:162:82:* *error: *no matching function for call to '*OvmsMetricVector<float>::SetValue(float)*' StandardMetrics.ms_v_bat_cell_vmin->SetValue((float)value2 / 1000); * ^* In file included from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0*, from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32*, from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32*: */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18:* *note: *candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) *^* */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18:* *note: * no known conversion for argument 1 from '*float*' to '*std::__cxx11::string {aka std::__cxx11::basic_string<char>}*' */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10:* *note: *candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) * ^* */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10:* *note: * no known conversion for argument 1 from '*float*' to '*const std::vector<float, std::allocator<float> >&*' make[1]: *** [src/vehicle_med3.o] Error 1 make: *** [component-vehicle_maxus_edeliver3-build] Error 2 shane@Shanes-MacBook-Pro OVMS.V3 %
Regards Shane
On 3 Apr 2021, at 12:02, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
OVMS# obd can1 request device -t1000 7e4 7ec 2102 7e4[7ec] 2102: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c5 | ................ c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2103 7e4[7ec] 2103: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c5 c5 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c5 c5 c5 c4 c5 c5 c5 c4 c5 c4 c4 | ................ c5 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2104 7e4[7ec] 2104: Response: ff ff ff ff c4 c4 c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c5 c4 c4 | ....
Your voltages obviously are 16 bit values, so you'll need to use RXB_UINT16() and multiply your loop index by 2.
Regards, Michael
Am 03.04.21 um 12:04 schrieb Shane @ Kilve Engineering:
Hi has anyone got a sample of the data for the cell voltages on the ioniq vfl just so I can see how the macro is handling it? Or is it played out the same as below?
Regards Shane
On 29 Mar 2021, at 22:20, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
Am 29.03.21 um 20:17 schrieb Shane @ Kilve Engineering:
can any one tell me what the "v.e.c.login" is and is it need for something to work?
v.e.c.config yes = ECU/controller in configuration state
It's not used by the framework currently.
also any one with any ideas how to deal with cell voltages in a string this long? took me blumim ages to find the bms when the tx and rx are 128 address apart!!
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Simply loop over the cells contained. Have a look at the buffer macro utils, e.g.: https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master...
Regards, Michael
Shane
On 5 Mar 2021, at 20:45, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0);
needs to be done in your vehicle init, i.e. the constructor after RegisterCanBus().
Please read the vehicle_obdii module source for a complete polling example.
Regards, Michael
Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering: > Thanks Michael, > > Had a try and ended up with this bit added but return anything > > Where am I going wrong? > > Shane > > ******* > > #include "ovms_log.h" > *static**const**char**TAG= "v-edeliver3"; > > #include "vehicle_edeliver3.h" > #include "metrics_standard.h" > > *namespace* { > > *const*OvmsVehicle::poll_pid_tobdii_polls[] = > { > { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { > 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN > { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { > 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH > POLL_LIST_END > }; > }; > > OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() > { > ESP_LOGI(TAG, "Start eDeliver3 vehicle module"); > > RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); > } > > OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() > { > ESP_LOGI(TAG, "Stop eDeliver3 vehicle module"); > > memset(m_vin, 0, *sizeof*(m_vin)); > } > > > //testing polls > > *void*OvmsVehicleEdeliver3::IncomingPollReply( > canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t > length, uint16_t mlremain) > { > string& rxbuf = med_obd_rxbuf; > > OvmsVehicle::PollSetPidList(m_can1, obdii_polls); > OvmsVehicle::PollSetState(0); > > > // init / fill rx buffer: > *if* (m_poll_ml_frame == 0) { > rxbuf.clear(); > rxbuf.reserve(length + mlremain); > } > rxbuf.append((*char**)data, length); > *if* (mlremain) > *return*; > > // complete: > *switch* (pid) { > *case* 0xe003: { > *unsigned* *int* soh_raw = ((*unsigned* *int*)rxbuf[0] << 8) | > (*unsigned* *int*)rxbuf[1]; > *float* soh = soh_raw / 10; > StdMetrics.ms_v_bat_soh->SetValue(soh); > *break*; > } > } > } > > > // end testing polls > > > >> On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de >> <mailto:dexter@expeedo.de>> wrote: >> >> Shane, >> >> on OBD polling basics: >> http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html >> >> Regards, >> Michael >> >> >> Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering: >>> Good evening Michael, >>> >>> Or any one that has the time to help, >>> >>> Ive now successfully retrieved as much info as I can without >>> polling any info for the maxus, but I have have now found an >>> ecu that responds to pid requests. >>> >>> For example if I use the obdii pid scanner I get the loads of >>> data back and I’ve decoded some of it, just need a bit of >>> guidance how to write the code to get the same info >>> >>> A part of a scan is as follows >>> >>> Scan complete (7e3 e000-e100) >>> Scan started : 2021-03-04 18:32:36 GMT >>> Last response: 2021-03-04 18:32:39 GMT >>> 7e3[7eb]:e000 00 >>> 7e3[7eb]:e001 64 >>> 7e3[7eb]:e002 4b >>> 7e3[7eb]:e003 26 bc >>> 7e3[7eb]:e004 00 07 >>> 7e3[7eb]:e005 2f >>> 7e3[7eb]:e006 2e >>> 7e3[7eb]:e007 02 00 >>> 7e3[7eb]:e008 01 ff >>> 7e3[7eb]:e009 02 00 >>> 7e3[7eb]:e010 02 00 >>> >>> I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH >>> And e002 is a temp 4b = 75 / 10 = 7.5 degrees >>> >>> So if some one can help me with an example of how to correctly >>> code this one I can work out the rest, >>> >>> Ive looked through various vehicles but everyone uses >>> different methods and I can’t seem to get one to work for me. >>> >>> Any help much appreciated >>> >>> Shane >>> >>>> On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de >>>> <mailto:dexter@expeedo.de>> wrote: >>>> >>>> Shane, >>>> >>>> I forgot to mention: if you're working on a new vehicle >>>> module, you'll also need to start the bus somewhere in your >>>> initialization code. Example: >>>> >>>> RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS); >>>> >>>> Regards, >>>> Michael >>>> >>>> >>>> Am 15.02.21 um 08:36 schrieb Michael Balzer: >>>>> Shane, >>>>> >>>>> Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering: >>>>>> can any one help me with a bit of code to retrieve ve some >>>>>> data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant >>>>>> poll this ecu it just broadcasts when its active, ive tried >>>>>> polling it but does not respond, i need to choose one byte >>>>>> and allocate it to a PID. >>>>> >>>>> I don't know what you mean by "allocating a byte to a PID", >>>>> but if you want to process frames received directly, simply >>>>> override IncomingFrameCan1() (or …2/3/4 depending on your bus). >>>>> >>>>> Reduced example: >>>>> >>>>> void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) >>>>> { >>>>> uint8_t *d = p_frame->data.u8; >>>>> >>>>> switch (p_frame->MsgID) >>>>> { >>>>> case 0x6f2: >>>>> // for example, assuming the SOC is in byte 1: >>>>> StdMetrics.ms_v_bat_soc->SetValue(d[1]); >>>>> break; >>>>> } >>>>> } >>>>> >>>>> If you're outside a vehicle context, you can register your >>>>> own CAN receiver by creating a queue and calling >>>>> MyCan.RegisterListener(). See the vehicle module for an example. >>>>> >>>>> Regards, >>>>> Michael >>>>> >>>> >> >> -- >> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal >> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 >> _______________________________________________ >> OvmsDev mailing list >> OvmsDev@lists.openvehicles.com >> <mailto:OvmsDev@lists.openvehicles.com> >> http://lists.openvehicles.com/mailman/listinfo/ovmsdev > > > _______________________________________________ > OvmsDev mailing list > OvmsDev@lists.openvehicles.com > http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
Thanks for your help Michael!!! No it does look so hard but I seem to be making it so! Ive added it to void OvmsVehicleMaxed3::IncomingBmsReply But Im guessing my rxbuf (prob as I have 2) may be the issue and ive made some changes but to no joy see below Regards Shane #include "ovms_log.h" static const char *TAG = "v-maxed3"; #include "vehicle_med3.h" #include "metrics_standard.h" #include "ovms_metrics.h" #include <string> #include "ovms_events.h" #include "ovms_config.h" #include "ovms_command.h" #include "ovms_notify.h" #include "med3_pids.h" #include "stdio.h" // RX buffer access macros: b=byte# #define RXB_BYTE(b) m_rxbuf[b] #define RXB_UINT16(b) (((uint16_t)RXB_BYTE(b) << 8) | RXB_BYTE(b+1)) #define RXB_UINT24(b) (((uint32_t)RXB_BYTE(b) << 16) | ((uint32_t)RXB_BYTE(b+1) << 8) \ | RXB_BYTE(b+2)) #define RXB_UINT32(b) (((uint32_t)RXB_BYTE(b) << 24) | ((uint32_t)RXB_BYTE(b+1) << 16) \ | ((uint32_t)RXB_BYTE(b+2) << 8) | RXB_BYTE(b+3)) #define RXB_INT8(b) ((int8_t)RXB_BYTE(b)) #define RXB_INT16(b) ((int16_t)RXB_UINT16(b)) #define RXB_INT32(b) ((int32_t)RXB_UINT32(b)) namespace { static const OvmsVehicle::poll_pid_t obdii_polls[] = { // VCU Polls { vcutx, vcurx, VEHICLE_POLL_TYPE_OBDIIEXTENDED, vcusoh, { 0, 30, 30, 30 }, 0, ISOTP_STD }, //SOH { vcutx, vcurx, VEHICLE_POLL_TYPE_OBDIIEXTENDED, vcusoc, { 360, 30, 30, 30 }, 0, ISOTP_STD }, //SOC Scaled below { vcutx, vcurx, VEHICLE_POLL_TYPE_OBDIIEXTENDED, vcutemp1, { 0, 30, 30, 30 }, 0, ISOTP_STD }, //temp { vcutx, vcurx, VEHICLE_POLL_TYPE_OBDIIEXTENDED, vcutemp2, { 0, 30, 30, 30 }, 0, ISOTP_STD }, //temp { vcutx, vcurx, VEHICLE_POLL_TYPE_OBDIIEXTENDED, vcupackvolts, { 360, 30, 30, 30 }, 0, ISOTP_STD }, //Pack Voltage { vcutx, vcurx, VEHICLE_POLL_TYPE_OBDIIEXTENDED, vcu12vamps, { 0, 30, 30, 30 }, 0, ISOTP_STD }, //12v amps? { vcutx, vcurx, VEHICLE_POLL_TYPE_OBDIIEXTENDED, vcuchargervolts, { 0, 30, 30, 30 }, 0, ISOTP_STD }, //charger volts at a guess? { vcutx, vcurx, VEHICLE_POLL_TYPE_OBDIIEXTENDED, vcuchargeramps, { 0, 60, 60, 60 }, 0, ISOTP_STD }, //charger amps? // BMS Polls { bmstx, bmsrx, VEHICLE_POLL_TYPE_OBDIIEXTENDED, cellvoltsmax, { 0, 30, 30, 30 }, 0, ISOTP_STD }, //cell max { bmstx, bmsrx, VEHICLE_POLL_TYPE_OBDIIEXTENDED, cellvoltsmin, { 0, 30, 30, 30 }, 0, ISOTP_STD }, //cell min { bmstx, bmsrx, VEHICLE_POLL_TYPE_OBDIIEXTENDED, cellvoltsavg, { 0, 60, 60, 60 }, 0, ISOTP_STD }, //cell avg { bmstx, bmsrx, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe113u, { 0, 60, 60, 60 }, 0, ISOTP_STD }, //cell volts { bmstx, bmsrx, VEHICLE_POLL_TYPE_OBDIIEXTENDED, celltemps, { 0, 60, 60, 60 }, 0, ISOTP_STD }, //cell temps { 0, 0, 0x00, 0x00, { 0, 0, 0, 0 }, 0, 0 } }; } // anon namespace OvmsVehicleMaxed3::OvmsVehicleMaxed3() { ESP_LOGI(TAG, "Start Maxus eDeliver3 vehicle module"); memset(m_vin, 0, sizeof(m_vin)); RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); PollSetPidList(m_can1,obdii_polls); PollSetState(0); med3_cum_energy_charge_wh = 0; #ifdef CONFIG_OVMS_COMP_WEBSERVER WebInit(); #endif } OvmsVehicleMaxed3::~OvmsVehicleMaxed3() { ESP_LOGI(TAG, "Stop eDeliver3 vehicle module"); BmsSetCellArrangementVoltage(96, 12); } //testing polls void OvmsVehicleMaxed3::IncomingPollReply(canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) { // init / fill rx buffer: if (m_poll_ml_frame == 0) { rxbuf.clear(); rxbuf.reserve(length + mlremain); } rxbuf.append((char*)data, length); if (mlremain) return; int value1 = (int)data[0]; int value2 = ((int)data[0] << 8) + (int)data[1]; switch (pid) { case vcuvin: // VIN strncat(m_vin,(char*)data,length); if (mlremain==0) { StandardMetrics.ms_v_vin->SetValue(m_vin); m_vin[0] = 0; } break; case vcusoh: //soh StandardMetrics.ms_v_bat_soh->SetValue(value1); break; case vcusoc: //soc scaled from 2 - 99 StandardMetrics.ms_v_bat_soc->SetValue(value1); break; case vcutemp1: // temperature?? StandardMetrics.ms_v_mot_temp->SetValue(value1 / 10.0f); break; case vcutemp2: // temperature?? StandardMetrics.ms_v_env_temp->SetValue(value1 / 10.0f); break; case vcupackvolts: // Pack Voltage StandardMetrics.ms_v_bat_voltage->SetValue(value2 / 10.0f); break; case vcu12vamps: StandardMetrics.ms_v_bat_12v_current->SetValue(value1 / 10.0f); break; case vcuchargervolts: StandardMetrics.ms_v_charge_voltage->SetValue(value1); // possible but always 224 untill found only break; case vcuchargeramps: StandardMetrics.ms_v_charge_current->SetValue(value1); StandardMetrics.ms_v_charge_climit->SetValue(value1); StandardMetrics.ms_v_charge_power->SetValue((StandardMetrics.ms_v_charge_current->AsFloat() * (StandardMetrics.ms_v_charge_voltage->AsFloat() )) / 1000); // work out current untill pid found * (value / 10.0f) / 1000.0f break; } } // end testing polls void OvmsVehicleMaxed3::IncomingBmsReply(canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) { // init / fill rx buffer: if (m_poll_ml_frame == 0) { m_rxbuf.clear(); m_rxbuf.reserve(length + mlremain); } m_rxbuf.append((char*)data, length); if (mlremain) return; switch (pid) { case 0xe113u: { // Read battery cell voltages 1-96: BmsRestartCellVoltages(); for (int i = 0; i < 96; i++) { BmsSetCellVoltage(i, RXB_UINT16(i*2) * 0.001f); } break; } } } void OvmsVehicleMaxed3::IncomingFrameCan1(CAN_frame_t* p_frame) {
On 4 Apr 2021, at 13:26, Michael Balzer <dexter@expeedo.de> wrote:
Shane,
vector metrics in general can be set by passing a vector or by using the element setters provided (see API).
But you don't need to set the cell max/min/stddev metrics at all, you only need to feed the cell voltages (and/or temperatures). The BMS framework automatically extracts all statistics values from them.
Btw, regarding your cell voltages:
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
This looks like 96 cells with a factor of 0.001, e.g. 0x1090 = 4240 * 0.001 = 4.24V.
Assuming you fix your IncomingPollReply() handler to actually use the rxbuf string and you copy the RXB_* macros from the Ioniq VFL code, you can simply do this to process the values:
case 0xe113: { // Read battery cell voltages 1-96: BmsRestartCellVoltages(); for (int i = 0; i < 96; i++) { BmsSetCellVoltage(i, RXB_UINT16(i*2) * 0.001f); } break; }
Doesn't look that hard, does it?
Regards, Michael
Am 04.04.21 um 12:37 schrieb Shane @ Kilve Engineering:
morning peeps, sorry for the newbie question whats different about the cell vmax/vmin i see in metrics_standard.h its a vector? (OvmsMetricVector<float>* ms_v_bat_cell_vmax; // Cell maximum voltages [V]) does that mean i have ot handle these different? if so how? as all i get is errors trying to setvalue to this metric
/Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp: In member function 'void OvmsVehicleMaxed3::IncomingBmsReply(canbus*, uint16_t, uint16_t, uint8_t*, uint8_t, uint16_t)': /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:159:82: error: no matching function for call to 'OvmsMetricVector<float>::SetValue(float)' StandardMetrics.ms_v_bat_cell_vmax->SetValue((float)value2 / 1000); ^ In file included from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32: /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: no known conversion for argument 1 from 'float' to 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: no known conversion for argument 1 from 'float' to 'const std::vector<float, std::allocator<float> >&' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:162:82: error: no matching function for call to 'OvmsMetricVector<float>::SetValue(float)' StandardMetrics.ms_v_bat_cell_vmin->SetValue((float)value2 / 1000); ^ In file included from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32: /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: no known conversion for argument 1 from 'float' to 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: no known conversion for argument 1 from 'float' to 'const std::vector<float, std::allocator<float> >&' make[1]: *** [src/vehicle_med3.o] Error 1 make: *** [component-vehicle_maxus_edeliver3-build] Error 2 shane@Shanes-MacBook-Pro OVMS.V3 %
Regards Shane
On 3 Apr 2021, at 12:02, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
OVMS# obd can1 request device -t1000 7e4 7ec 2102 7e4[7ec] 2102: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c5 | ................ c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2103 7e4[7ec] 2103: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c5 c5 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c5 c5 c5 c4 c5 c5 c5 c4 c5 c4 c4 | ................ c5 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2104 7e4[7ec] 2104: Response: ff ff ff ff c4 c4 c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c5 c4 c4 | ....
Your voltages obviously are 16 bit values, so you'll need to use RXB_UINT16() and multiply your loop index by 2.
Regards, Michael
Am 03.04.21 um 12:04 schrieb Shane @ Kilve Engineering:
Hi has anyone got a sample of the data for the cell voltages on the ioniq vfl just so I can see how the macro is handling it? Or is it played out the same as below?
Regards Shane
On 29 Mar 2021, at 22:20, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
Am 29.03.21 um 20:17 schrieb Shane @ Kilve Engineering:
can any one tell me what the "v.e.c.login" is and is it need for something to work?
v.e.c.config yes = ECU/controller in configuration state It's not used by the framework currently.
also any one with any ideas how to deal with cell voltages in a string this long? took me blumim ages to find the bms when the tx and rx are 128 address apart!!
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Simply loop over the cells contained. Have a look at the buffer macro utils, e.g.: https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master... <https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master/vehicle/OVMS.V3/components/vehicle_hyundai_ioniqvfl/src/vehicle_hyundai_ioniqvfl.cpp#L44>
Regards, Michael
Shane
> On 5 Mar 2021, at 20:45, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: > > Shane, > > OvmsVehicle::PollSetPidList(m_can1, obdii_polls); > OvmsVehicle::PollSetState(0); > > needs to be done in your vehicle init, i.e. the constructor after RegisterCanBus(). > > Please read the vehicle_obdii module source for a complete polling example. > > Regards, > Michael > > > Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering: >> Thanks Michael, >> >> Had a try and ended up with this bit added but return anything >> >> Where am I going wrong? >> >> Shane >> >> ******* >> >> #include "ovms_log.h" >> static const char *TAG = "v-edeliver3"; >> >> #include "vehicle_edeliver3.h" >> #include "metrics_standard.h" >> >> namespace { >> >> const OvmsVehicle::poll_pid_t obdii_polls[] = >> { >> { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN >> { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH >> POLL_LIST_END >> }; >> }; >> >> OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() >> { >> ESP_LOGI(TAG, "Start eDeliver3 vehicle module"); >> >> RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); >> } >> >> OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() >> { >> ESP_LOGI(TAG, "Stop eDeliver3 vehicle module"); >> >> memset(m_vin, 0, sizeof(m_vin)); >> } >> >> >> //testing polls >> >> void OvmsVehicleEdeliver3::IncomingPollReply( >> canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) >> { >> string& rxbuf = med_obd_rxbuf; >> >> OvmsVehicle::PollSetPidList(m_can1, obdii_polls); >> OvmsVehicle::PollSetState(0); >> >> >> // init / fill rx buffer: >> if (m_poll_ml_frame == 0) { >> rxbuf.clear(); >> rxbuf.reserve(length + mlremain); >> } >> rxbuf.append((char*)data, length); >> if (mlremain) >> return; >> >> // complete: >> switch (pid) { >> case 0xe003: { >> unsigned int soh_raw = ((unsigned int)rxbuf[0] << 8) | (unsigned int)rxbuf[1]; >> float soh = soh_raw / 10; >> StdMetrics.ms_v_bat_soh->SetValue(soh); >> break; >> } >> } >> } >> >> >> // end testing polls >> >> >> >>> On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: >>> >>> Shane, >>> >>> on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html <http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html> >>> >>> Regards, >>> Michael >>> >>> >>> Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering: >>>> Good evening Michael, >>>> >>>> Or any one that has the time to help, >>>> >>>> Ive now successfully retrieved as much info as I can without polling any info for the maxus, but I have have now found an ecu that responds to pid requests. >>>> >>>> For example if I use the obdii pid scanner I get the loads of data back and I’ve decoded some of it, just need a bit of guidance how to write the code to get the same info >>>> >>>> A part of a scan is as follows >>>> >>>> Scan complete (7e3 e000-e100) >>>> Scan started : 2021-03-04 18:32:36 GMT >>>> Last response: 2021-03-04 18:32:39 GMT >>>> 7e3[7eb]:e000 00 >>>> 7e3[7eb]:e001 64 >>>> 7e3[7eb]:e002 4b >>>> 7e3[7eb]:e003 26 bc >>>> 7e3[7eb]:e004 00 07 >>>> 7e3[7eb]:e005 2f >>>> 7e3[7eb]:e006 2e >>>> 7e3[7eb]:e007 02 00 >>>> 7e3[7eb]:e008 01 ff >>>> 7e3[7eb]:e009 02 00 >>>> 7e3[7eb]:e010 02 00 >>>> >>>> I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH >>>> And e002 is a temp 4b = 75 / 10 = 7.5 degrees >>>> >>>> So if some one can help me with an example of how to correctly code this one I can work out the rest, >>>> >>>> Ive looked through various vehicles but everyone uses different methods and I can’t seem to get one to work for me. >>>> >>>> Any help much appreciated >>>> >>>> Shane >>>> >>>>> On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: >>>>> >>>>> Shane, >>>>> >>>>> I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example: >>>>> >>>>> RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS); >>>>> >>>>> Regards, >>>>> Michael >>>>> >>>>> >>>>> Am 15.02.21 um 08:36 schrieb Michael Balzer: >>>>>> Shane, >>>>>> >>>>>> Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering: >>>>>>> can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID. >>>>>> >>>>>> I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus). >>>>>> >>>>>> Reduced example: >>>>>> >>>>>> void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) >>>>>> { >>>>>> uint8_t *d = p_frame->data.u8; >>>>>> >>>>>> switch (p_frame->MsgID) >>>>>> { >>>>>> case 0x6f2: >>>>>> // for example, assuming the SOC is in byte 1: >>>>>> StdMetrics.ms_v_bat_soc->SetValue(d[1]); >>>>>> break; >>>>>> } >>>>>> } >>>>>> >>>>>> If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example. >>>>>> >>>>>> Regards, >>>>>> Michael >>>>>> >>>>> >>> >>> -- >>> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal >>> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 >>> _______________________________________________ >>> OvmsDev mailing list >>> OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> >>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev> >> >> >> >> _______________________________________________ >> OvmsDev mailing list >> OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> >> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev> > > -- > Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal > Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 > _______________________________________________ > OvmsDev mailing list > OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> > http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
Success Just need to do the temps now Thanks for your help im sure ill need it again Regards Shane
On 4 Apr 2021, at 13:26, Michael Balzer <dexter@expeedo.de> wrote:
Shane,
vector metrics in general can be set by passing a vector or by using the element setters provided (see API).
But you don't need to set the cell max/min/stddev metrics at all, you only need to feed the cell voltages (and/or temperatures). The BMS framework automatically extracts all statistics values from them.
Btw, regarding your cell voltages:
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
This looks like 96 cells with a factor of 0.001, e.g. 0x1090 = 4240 * 0.001 = 4.24V.
Assuming you fix your IncomingPollReply() handler to actually use the rxbuf string and you copy the RXB_* macros from the Ioniq VFL code, you can simply do this to process the values:
case 0xe113: { // Read battery cell voltages 1-96: BmsRestartCellVoltages(); for (int i = 0; i < 96; i++) { BmsSetCellVoltage(i, RXB_UINT16(i*2) * 0.001f); } break; }
Doesn't look that hard, does it?
Regards, Michael
Am 04.04.21 um 12:37 schrieb Shane @ Kilve Engineering:
morning peeps, sorry for the newbie question whats different about the cell vmax/vmin i see in metrics_standard.h its a vector? (OvmsMetricVector<float>* ms_v_bat_cell_vmax; // Cell maximum voltages [V]) does that mean i have ot handle these different? if so how? as all i get is errors trying to setvalue to this metric
/Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp: In member function 'void OvmsVehicleMaxed3::IncomingBmsReply(canbus*, uint16_t, uint16_t, uint8_t*, uint8_t, uint16_t)': /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:159:82: error: no matching function for call to 'OvmsMetricVector<float>::SetValue(float)' StandardMetrics.ms_v_bat_cell_vmax->SetValue((float)value2 / 1000); ^ In file included from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32: /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: no known conversion for argument 1 from 'float' to 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: no known conversion for argument 1 from 'float' to 'const std::vector<float, std::allocator<float> >&' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:162:82: error: no matching function for call to 'OvmsMetricVector<float>::SetValue(float)' StandardMetrics.ms_v_bat_cell_vmin->SetValue((float)value2 / 1000); ^ In file included from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32: /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: no known conversion for argument 1 from 'float' to 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: no known conversion for argument 1 from 'float' to 'const std::vector<float, std::allocator<float> >&' make[1]: *** [src/vehicle_med3.o] Error 1 make: *** [component-vehicle_maxus_edeliver3-build] Error 2 shane@Shanes-MacBook-Pro OVMS.V3 %
Regards Shane
On 3 Apr 2021, at 12:02, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
OVMS# obd can1 request device -t1000 7e4 7ec 2102 7e4[7ec] 2102: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c5 | ................ c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2103 7e4[7ec] 2103: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c5 c5 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c5 c5 c5 c4 c5 c5 c5 c4 c5 c4 c4 | ................ c5 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2104 7e4[7ec] 2104: Response: ff ff ff ff c4 c4 c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c5 c4 c4 | ....
Your voltages obviously are 16 bit values, so you'll need to use RXB_UINT16() and multiply your loop index by 2.
Regards, Michael
Am 03.04.21 um 12:04 schrieb Shane @ Kilve Engineering:
Hi has anyone got a sample of the data for the cell voltages on the ioniq vfl just so I can see how the macro is handling it? Or is it played out the same as below?
Regards Shane
On 29 Mar 2021, at 22:20, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
Am 29.03.21 um 20:17 schrieb Shane @ Kilve Engineering:
can any one tell me what the "v.e.c.login" is and is it need for something to work?
v.e.c.config yes = ECU/controller in configuration state It's not used by the framework currently.
also any one with any ideas how to deal with cell voltages in a string this long? took me blumim ages to find the bms when the tx and rx are 128 address apart!!
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Simply loop over the cells contained. Have a look at the buffer macro utils, e.g.: https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master... <https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master/vehicle/OVMS.V3/components/vehicle_hyundai_ioniqvfl/src/vehicle_hyundai_ioniqvfl.cpp#L44>
Regards, Michael
Shane
> On 5 Mar 2021, at 20:45, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: > > Shane, > > OvmsVehicle::PollSetPidList(m_can1, obdii_polls); > OvmsVehicle::PollSetState(0); > > needs to be done in your vehicle init, i.e. the constructor after RegisterCanBus(). > > Please read the vehicle_obdii module source for a complete polling example. > > Regards, > Michael > > > Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering: >> Thanks Michael, >> >> Had a try and ended up with this bit added but return anything >> >> Where am I going wrong? >> >> Shane >> >> ******* >> >> #include "ovms_log.h" >> static const char *TAG = "v-edeliver3"; >> >> #include "vehicle_edeliver3.h" >> #include "metrics_standard.h" >> >> namespace { >> >> const OvmsVehicle::poll_pid_t obdii_polls[] = >> { >> { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN >> { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH >> POLL_LIST_END >> }; >> }; >> >> OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() >> { >> ESP_LOGI(TAG, "Start eDeliver3 vehicle module"); >> >> RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); >> } >> >> OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() >> { >> ESP_LOGI(TAG, "Stop eDeliver3 vehicle module"); >> >> memset(m_vin, 0, sizeof(m_vin)); >> } >> >> >> //testing polls >> >> void OvmsVehicleEdeliver3::IncomingPollReply( >> canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) >> { >> string& rxbuf = med_obd_rxbuf; >> >> OvmsVehicle::PollSetPidList(m_can1, obdii_polls); >> OvmsVehicle::PollSetState(0); >> >> >> // init / fill rx buffer: >> if (m_poll_ml_frame == 0) { >> rxbuf.clear(); >> rxbuf.reserve(length + mlremain); >> } >> rxbuf.append((char*)data, length); >> if (mlremain) >> return; >> >> // complete: >> switch (pid) { >> case 0xe003: { >> unsigned int soh_raw = ((unsigned int)rxbuf[0] << 8) | (unsigned int)rxbuf[1]; >> float soh = soh_raw / 10; >> StdMetrics.ms_v_bat_soh->SetValue(soh); >> break; >> } >> } >> } >> >> >> // end testing polls >> >> >> >>> On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: >>> >>> Shane, >>> >>> on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html <http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html> >>> >>> Regards, >>> Michael >>> >>> >>> Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering: >>>> Good evening Michael, >>>> >>>> Or any one that has the time to help, >>>> >>>> Ive now successfully retrieved as much info as I can without polling any info for the maxus, but I have have now found an ecu that responds to pid requests. >>>> >>>> For example if I use the obdii pid scanner I get the loads of data back and I’ve decoded some of it, just need a bit of guidance how to write the code to get the same info >>>> >>>> A part of a scan is as follows >>>> >>>> Scan complete (7e3 e000-e100) >>>> Scan started : 2021-03-04 18:32:36 GMT >>>> Last response: 2021-03-04 18:32:39 GMT >>>> 7e3[7eb]:e000 00 >>>> 7e3[7eb]:e001 64 >>>> 7e3[7eb]:e002 4b >>>> 7e3[7eb]:e003 26 bc >>>> 7e3[7eb]:e004 00 07 >>>> 7e3[7eb]:e005 2f >>>> 7e3[7eb]:e006 2e >>>> 7e3[7eb]:e007 02 00 >>>> 7e3[7eb]:e008 01 ff >>>> 7e3[7eb]:e009 02 00 >>>> 7e3[7eb]:e010 02 00 >>>> >>>> I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH >>>> And e002 is a temp 4b = 75 / 10 = 7.5 degrees >>>> >>>> So if some one can help me with an example of how to correctly code this one I can work out the rest, >>>> >>>> Ive looked through various vehicles but everyone uses different methods and I can’t seem to get one to work for me. >>>> >>>> Any help much appreciated >>>> >>>> Shane >>>> >>>>> On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: >>>>> >>>>> Shane, >>>>> >>>>> I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example: >>>>> >>>>> RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS); >>>>> >>>>> Regards, >>>>> Michael >>>>> >>>>> >>>>> Am 15.02.21 um 08:36 schrieb Michael Balzer: >>>>>> Shane, >>>>>> >>>>>> Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering: >>>>>>> can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID. >>>>>> >>>>>> I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus). >>>>>> >>>>>> Reduced example: >>>>>> >>>>>> void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) >>>>>> { >>>>>> uint8_t *d = p_frame->data.u8; >>>>>> >>>>>> switch (p_frame->MsgID) >>>>>> { >>>>>> case 0x6f2: >>>>>> // for example, assuming the SOC is in byte 1: >>>>>> StdMetrics.ms_v_bat_soc->SetValue(d[1]); >>>>>> break; >>>>>> } >>>>>> } >>>>>> >>>>>> If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example. >>>>>> >>>>>> Regards, >>>>>> Michael >>>>>> >>>>> >>> >>> -- >>> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal >>> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 >>> _______________________________________________ >>> OvmsDev mailing list >>> OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> >>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev> >> >> >> >> _______________________________________________ >> OvmsDev mailing list >> OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> >> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev> > > -- > Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal > Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 > _______________________________________________ > OvmsDev mailing list > OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> > http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
Hi Michael, Me again It look like the bus framework does the calc incorrect? Surly stddev should be 0.0435 And stddev.max should be 0.0437147V v.b.p.voltage.avg 4.23496V v.b.p.voltage.grad -0.00026V v.b.p.voltage.max 4.24V v.b.p.voltage.min 4.2V v.b.p.voltage.stddev 0.00435V v.b.p.voltage.stddev.max 0.00437147V Regards Shane
On 4 Apr 2021, at 13:26, Michael Balzer <dexter@expeedo.de> wrote:
Shane,
vector metrics in general can be set by passing a vector or by using the element setters provided (see API).
But you don't need to set the cell max/min/stddev metrics at all, you only need to feed the cell voltages (and/or temperatures). The BMS framework automatically extracts all statistics values from them.
Btw, regarding your cell voltages:
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
This looks like 96 cells with a factor of 0.001, e.g. 0x1090 = 4240 * 0.001 = 4.24V.
Assuming you fix your IncomingPollReply() handler to actually use the rxbuf string and you copy the RXB_* macros from the Ioniq VFL code, you can simply do this to process the values:
case 0xe113: { // Read battery cell voltages 1-96: BmsRestartCellVoltages(); for (int i = 0; i < 96; i++) { BmsSetCellVoltage(i, RXB_UINT16(i*2) * 0.001f); } break; }
Doesn't look that hard, does it?
Regards, Michael
Am 04.04.21 um 12:37 schrieb Shane @ Kilve Engineering:
morning peeps, sorry for the newbie question whats different about the cell vmax/vmin i see in metrics_standard.h its a vector? (OvmsMetricVector<float>* ms_v_bat_cell_vmax; // Cell maximum voltages [V]) does that mean i have ot handle these different? if so how? as all i get is errors trying to setvalue to this metric
/Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp: In member function 'void OvmsVehicleMaxed3::IncomingBmsReply(canbus*, uint16_t, uint16_t, uint8_t*, uint8_t, uint16_t)': /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:159:82: error: no matching function for call to 'OvmsMetricVector<float>::SetValue(float)' StandardMetrics.ms_v_bat_cell_vmax->SetValue((float)value2 / 1000); ^ In file included from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32: /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: no known conversion for argument 1 from 'float' to 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: no known conversion for argument 1 from 'float' to 'const std::vector<float, std::allocator<float> >&' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:162:82: error: no matching function for call to 'OvmsMetricVector<float>::SetValue(float)' StandardMetrics.ms_v_bat_cell_vmin->SetValue((float)value2 / 1000); ^ In file included from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32: /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: no known conversion for argument 1 from 'float' to 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: no known conversion for argument 1 from 'float' to 'const std::vector<float, std::allocator<float> >&' make[1]: *** [src/vehicle_med3.o] Error 1 make: *** [component-vehicle_maxus_edeliver3-build] Error 2 shane@Shanes-MacBook-Pro OVMS.V3 %
Regards Shane
On 3 Apr 2021, at 12:02, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
OVMS# obd can1 request device -t1000 7e4 7ec 2102 7e4[7ec] 2102: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c5 | ................ c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2103 7e4[7ec] 2103: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c5 c5 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c5 c5 c5 c4 c5 c5 c5 c4 c5 c4 c4 | ................ c5 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2104 7e4[7ec] 2104: Response: ff ff ff ff c4 c4 c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c5 c4 c4 | ....
Your voltages obviously are 16 bit values, so you'll need to use RXB_UINT16() and multiply your loop index by 2.
Regards, Michael
Am 03.04.21 um 12:04 schrieb Shane @ Kilve Engineering:
Hi has anyone got a sample of the data for the cell voltages on the ioniq vfl just so I can see how the macro is handling it? Or is it played out the same as below?
Regards Shane
On 29 Mar 2021, at 22:20, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
Am 29.03.21 um 20:17 schrieb Shane @ Kilve Engineering:
can any one tell me what the "v.e.c.login" is and is it need for something to work?
v.e.c.config yes = ECU/controller in configuration state It's not used by the framework currently.
also any one with any ideas how to deal with cell voltages in a string this long? took me blumim ages to find the bms when the tx and rx are 128 address apart!!
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Simply loop over the cells contained. Have a look at the buffer macro utils, e.g.: https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master... <https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master/vehicle/OVMS.V3/components/vehicle_hyundai_ioniqvfl/src/vehicle_hyundai_ioniqvfl.cpp#L44>
Regards, Michael
Shane
> On 5 Mar 2021, at 20:45, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: > > Shane, > > OvmsVehicle::PollSetPidList(m_can1, obdii_polls); > OvmsVehicle::PollSetState(0); > > needs to be done in your vehicle init, i.e. the constructor after RegisterCanBus(). > > Please read the vehicle_obdii module source for a complete polling example. > > Regards, > Michael > > > Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering: >> Thanks Michael, >> >> Had a try and ended up with this bit added but return anything >> >> Where am I going wrong? >> >> Shane >> >> ******* >> >> #include "ovms_log.h" >> static const char *TAG = "v-edeliver3"; >> >> #include "vehicle_edeliver3.h" >> #include "metrics_standard.h" >> >> namespace { >> >> const OvmsVehicle::poll_pid_t obdii_polls[] = >> { >> { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN >> { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH >> POLL_LIST_END >> }; >> }; >> >> OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() >> { >> ESP_LOGI(TAG, "Start eDeliver3 vehicle module"); >> >> RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); >> } >> >> OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() >> { >> ESP_LOGI(TAG, "Stop eDeliver3 vehicle module"); >> >> memset(m_vin, 0, sizeof(m_vin)); >> } >> >> >> //testing polls >> >> void OvmsVehicleEdeliver3::IncomingPollReply( >> canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) >> { >> string& rxbuf = med_obd_rxbuf; >> >> OvmsVehicle::PollSetPidList(m_can1, obdii_polls); >> OvmsVehicle::PollSetState(0); >> >> >> // init / fill rx buffer: >> if (m_poll_ml_frame == 0) { >> rxbuf.clear(); >> rxbuf.reserve(length + mlremain); >> } >> rxbuf.append((char*)data, length); >> if (mlremain) >> return; >> >> // complete: >> switch (pid) { >> case 0xe003: { >> unsigned int soh_raw = ((unsigned int)rxbuf[0] << 8) | (unsigned int)rxbuf[1]; >> float soh = soh_raw / 10; >> StdMetrics.ms_v_bat_soh->SetValue(soh); >> break; >> } >> } >> } >> >> >> // end testing polls >> >> >> >>> On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: >>> >>> Shane, >>> >>> on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html <http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html> >>> >>> Regards, >>> Michael >>> >>> >>> Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering: >>>> Good evening Michael, >>>> >>>> Or any one that has the time to help, >>>> >>>> Ive now successfully retrieved as much info as I can without polling any info for the maxus, but I have have now found an ecu that responds to pid requests. >>>> >>>> For example if I use the obdii pid scanner I get the loads of data back and I’ve decoded some of it, just need a bit of guidance how to write the code to get the same info >>>> >>>> A part of a scan is as follows >>>> >>>> Scan complete (7e3 e000-e100) >>>> Scan started : 2021-03-04 18:32:36 GMT >>>> Last response: 2021-03-04 18:32:39 GMT >>>> 7e3[7eb]:e000 00 >>>> 7e3[7eb]:e001 64 >>>> 7e3[7eb]:e002 4b >>>> 7e3[7eb]:e003 26 bc >>>> 7e3[7eb]:e004 00 07 >>>> 7e3[7eb]:e005 2f >>>> 7e3[7eb]:e006 2e >>>> 7e3[7eb]:e007 02 00 >>>> 7e3[7eb]:e008 01 ff >>>> 7e3[7eb]:e009 02 00 >>>> 7e3[7eb]:e010 02 00 >>>> >>>> I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH >>>> And e002 is a temp 4b = 75 / 10 = 7.5 degrees >>>> >>>> So if some one can help me with an example of how to correctly code this one I can work out the rest, >>>> >>>> Ive looked through various vehicles but everyone uses different methods and I can’t seem to get one to work for me. >>>> >>>> Any help much appreciated >>>> >>>> Shane >>>> >>>>> On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: >>>>> >>>>> Shane, >>>>> >>>>> I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example: >>>>> >>>>> RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS); >>>>> >>>>> Regards, >>>>> Michael >>>>> >>>>> >>>>> Am 15.02.21 um 08:36 schrieb Michael Balzer: >>>>>> Shane, >>>>>> >>>>>> Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering: >>>>>>> can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID. >>>>>> >>>>>> I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus). >>>>>> >>>>>> Reduced example: >>>>>> >>>>>> void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) >>>>>> { >>>>>> uint8_t *d = p_frame->data.u8; >>>>>> >>>>>> switch (p_frame->MsgID) >>>>>> { >>>>>> case 0x6f2: >>>>>> // for example, assuming the SOC is in byte 1: >>>>>> StdMetrics.ms_v_bat_soc->SetValue(d[1]); >>>>>> break; >>>>>> } >>>>>> } >>>>>> >>>>>> If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example. >>>>>> >>>>>> Regards, >>>>>> Michael >>>>>> >>>>> >>> >>> -- >>> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal >>> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 >>> _______________________________________________ >>> OvmsDev mailing list >>> OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> >>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev> >> >> >> >> _______________________________________________ >> OvmsDev mailing list >> OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> >> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev> > > -- > Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal > Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 > _______________________________________________ > OvmsDev mailing list > OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> > http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
Shane, what makes you think so? Regards, Michael Am 04.04.21 um 20:47 schrieb Shane @ Kilve Engineering:
Hi Michael,
Me again It look like the bus framework does the calc incorrect? Surly stddev should be 0.0435 And stddev.max should be 0.0437147V
v.b.p.voltage.avg 4.23496V v.b.p.voltage.grad -0.00026V v.b.p.voltage.max 4.24V v.b.p.voltage.min 4.2V v.b.p.voltage.stddev 0.00435V v.b.p.voltage.stddev.max 0.00437147V
Regards Shane
On 4 Apr 2021, at 13:26, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
vector metrics in general can be set by passing a vector or by using the element setters provided (see API).
But you don't need to set the cell max/min/stddev metrics at all, you only need to feed the cell voltages (and/or temperatures). The BMS framework automatically extracts all statistics values from them.
Btw, regarding your cell voltages:
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
This looks like 96 cells with a factor of 0.001, e.g. 0x1090 = 4240 * 0.001 = 4.24V.
Assuming you fix your IncomingPollReply() handler to actually use the rxbuf string and you copy the RXB_* macros from the Ioniq VFL code, you can simply do this to process the values:
case 0xe113: { // Read battery cell voltages 1-96: BmsRestartCellVoltages(); for (int i = 0; i < 96; i++) { BmsSetCellVoltage(i, RXB_UINT16(i*2) * 0.001f); } break; }
Doesn't look that hard, does it?
Regards, Michael
Am 04.04.21 um 12:37 schrieb Shane @ Kilve Engineering:
morning peeps, sorry for the newbie question whats different about the cell vmax/vmin i see in metrics_standard.h its a vector? (OvmsMetricVector<float>* ms_v_bat_cell_vmax; // Cell maximum voltages [V]) does that mean i have ot handle these different? if so how? as all i get is errors trying to setvalue to this metric
*/Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:* In member function '*void OvmsVehicleMaxed3::IncomingBmsReply(canbus*, uint16_t, uint16_t, uint8_t*, uint8_t, uint16_t)*': */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:159:82:* *error: *no matching function for call to '*OvmsMetricVector<float>::SetValue(float)*' StandardMetrics.ms_v_bat_cell_vmax->SetValue((float)value2 / 1000); * ^* In file included from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0*, from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32*, from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32*: */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18:* *note: *candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) * ^* */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18:* *note: * no known conversion for argument 1 from '*float*' to '*std::__cxx11::string {aka std::__cxx11::basic_string<char>}*' */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10:* *note: *candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) * ^* */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10:* *note: * no known conversion for argument 1 from '*float*' to '*const std::vector<float, std::allocator<float> >&*' */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:162:82:* *error: *no matching function for call to '*OvmsMetricVector<float>::SetValue(float)*' StandardMetrics.ms_v_bat_cell_vmin->SetValue((float)value2 / 1000); * ^* In file included from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0*, from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32*, from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32*: */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18:* *note: *candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) * ^* */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18:* *note: * no known conversion for argument 1 from '*float*' to '*std::__cxx11::string {aka std::__cxx11::basic_string<char>}*' */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10:* *note: *candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) * ^* */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10:* *note: * no known conversion for argument 1 from '*float*' to '*const std::vector<float, std::allocator<float> >&*' make[1]: *** [src/vehicle_med3.o] Error 1 make: *** [component-vehicle_maxus_edeliver3-build] Error 2 shane@Shanes-MacBook-Pro OVMS.V3 %
Regards Shane
On 3 Apr 2021, at 12:02, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
OVMS# obd can1 request device -t1000 7e4 7ec 2102 7e4[7ec] 2102: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c5 | ................ c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2103 7e4[7ec] 2103: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c5 c5 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c5 c5 c5 c4 c5 c5 c5 c4 c5 c4 c4 | ................ c5 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2104 7e4[7ec] 2104: Response: ff ff ff ff c4 c4 c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c5 c4 c4 | ....
Your voltages obviously are 16 bit values, so you'll need to use RXB_UINT16() and multiply your loop index by 2.
Regards, Michael
Am 03.04.21 um 12:04 schrieb Shane @ Kilve Engineering:
Hi has anyone got a sample of the data for the cell voltages on the ioniq vfl just so I can see how the macro is handling it? Or is it played out the same as below?
Regards Shane
On 29 Mar 2021, at 22:20, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
Am 29.03.21 um 20:17 schrieb Shane @ Kilve Engineering: > can any one tell me what the "v.e.c.login" is and is it need for > something to work?
v.e.c.config yes = ECU/controller in configuration state
It's not used by the framework currently.
> also any one with any ideas how to deal with cell voltages in a > string this long? took me blumim ages to find the bms when the > tx and rx are 128 address apart!! > > 748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 > 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 > 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 > 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e > 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 > 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e > 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 > 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a > 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 > 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Simply loop over the cells contained. Have a look at the buffer macro utils, e.g.: https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master...
Regards, Michael
> Shane > > > >> On 5 Mar 2021, at 20:45, Michael Balzer <dexter@expeedo.de >> <mailto:dexter@expeedo.de>> wrote: >> >> Shane, >> >> OvmsVehicle::PollSetPidList(m_can1, obdii_polls); >> OvmsVehicle::PollSetState(0); >> >> needs to be done in your vehicle init, i.e. the constructor >> after RegisterCanBus(). >> >> Please read the vehicle_obdii module source for a complete >> polling example. >> >> Regards, >> Michael >> >> >> Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering: >>> Thanks Michael, >>> >>> Had a try and ended up with this bit added but return anything >>> >>> Where am I going wrong? >>> >>> Shane >>> >>> ******* >>> >>> #include "ovms_log.h" >>> *static**const**char**TAG= "v-edeliver3"; >>> >>> #include "vehicle_edeliver3.h" >>> #include "metrics_standard.h" >>> >>> *namespace* { >>> >>> *const*OvmsVehicle::poll_pid_tobdii_polls[] = >>> { >>> { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { >>> 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN >>> { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { >>> 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH >>> POLL_LIST_END >>> }; >>> }; >>> >>> OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() >>> { >>> ESP_LOGI(TAG, "Start eDeliver3 vehicle module"); >>> >>> RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); >>> } >>> >>> OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() >>> { >>> ESP_LOGI(TAG, "Stop eDeliver3 vehicle module"); >>> >>> memset(m_vin, 0, *sizeof*(m_vin)); >>> } >>> >>> >>> //testing polls >>> >>> *void*OvmsVehicleEdeliver3::IncomingPollReply( >>> canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, >>> uint8_t length, uint16_t mlremain) >>> { >>> string& rxbuf = med_obd_rxbuf; >>> >>> OvmsVehicle::PollSetPidList(m_can1, obdii_polls); >>> OvmsVehicle::PollSetState(0); >>> >>> >>> // init / fill rx buffer: >>> *if* (m_poll_ml_frame == 0) { >>> rxbuf.clear(); >>> rxbuf.reserve(length + mlremain); >>> } >>> rxbuf.append((*char**)data, length); >>> *if* (mlremain) >>> *return*; >>> >>> // complete: >>> *switch* (pid) { >>> *case* 0xe003: { >>> *unsigned* *int* soh_raw = ((*unsigned* *int*)rxbuf[0] << 8) | >>> (*unsigned* *int*)rxbuf[1]; >>> *float* soh = soh_raw / 10; >>> StdMetrics.ms_v_bat_soh->SetValue(soh); >>> *break*; >>> } >>> } >>> } >>> >>> >>> // end testing polls >>> >>> >>> >>>> On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de >>>> <mailto:dexter@expeedo.de>> wrote: >>>> >>>> Shane, >>>> >>>> on OBD polling basics: >>>> http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html >>>> >>>> Regards, >>>> Michael >>>> >>>> >>>> Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering: >>>>> Good evening Michael, >>>>> >>>>> Or any one that has the time to help, >>>>> >>>>> Ive now successfully retrieved as much info as I can without >>>>> polling any info for the maxus, but I have have now found an >>>>> ecu that responds to pid requests. >>>>> >>>>> For example if I use the obdii pid scanner I get the loads >>>>> of data back and I’ve decoded some of it, just need a bit of >>>>> guidance how to write the code to get the same info >>>>> >>>>> A part of a scan is as follows >>>>> >>>>> Scan complete (7e3 e000-e100) >>>>> Scan started : 2021-03-04 18:32:36 GMT >>>>> Last response: 2021-03-04 18:32:39 GMT >>>>> 7e3[7eb]:e000 00 >>>>> 7e3[7eb]:e001 64 >>>>> 7e3[7eb]:e002 4b >>>>> 7e3[7eb]:e003 26 bc >>>>> 7e3[7eb]:e004 00 07 >>>>> 7e3[7eb]:e005 2f >>>>> 7e3[7eb]:e006 2e >>>>> 7e3[7eb]:e007 02 00 >>>>> 7e3[7eb]:e008 01 ff >>>>> 7e3[7eb]:e009 02 00 >>>>> 7e3[7eb]:e010 02 00 >>>>> >>>>> I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH >>>>> And e002 is a temp 4b = 75 / 10 = 7.5 degrees >>>>> >>>>> So if some one can help me with an example of how to >>>>> correctly code this one I can work out the rest, >>>>> >>>>> Ive looked through various vehicles but everyone uses >>>>> different methods and I can’t seem to get one to work for me. >>>>> >>>>> Any help much appreciated >>>>> >>>>> Shane >>>>> >>>>>> On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de >>>>>> <mailto:dexter@expeedo.de>> wrote: >>>>>> >>>>>> Shane, >>>>>> >>>>>> I forgot to mention: if you're working on a new vehicle >>>>>> module, you'll also need to start the bus somewhere in your >>>>>> initialization code. Example: >>>>>> >>>>>> RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS); >>>>>> >>>>>> Regards, >>>>>> Michael >>>>>> >>>>>> >>>>>> Am 15.02.21 um 08:36 schrieb Michael Balzer: >>>>>>> Shane, >>>>>>> >>>>>>> Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering: >>>>>>>> can any one help me with a bit of code to retrieve ve >>>>>>>> some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i >>>>>>>> cant poll this ecu it just broadcasts when its active, >>>>>>>> ive tried polling it but does not respond, i need to >>>>>>>> choose one byte and allocate it to a PID. >>>>>>> >>>>>>> I don't know what you mean by "allocating a byte to a >>>>>>> PID", but if you want to process frames received directly, >>>>>>> simply override IncomingFrameCan1() (or …2/3/4 depending >>>>>>> on your bus). >>>>>>> >>>>>>> Reduced example: >>>>>>> >>>>>>> void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) >>>>>>> { >>>>>>> uint8_t *d = p_frame->data.u8; >>>>>>> >>>>>>> switch (p_frame->MsgID) >>>>>>> { >>>>>>> case 0x6f2: >>>>>>> // for example, assuming the SOC is in byte 1: >>>>>>> StdMetrics.ms_v_bat_soc->SetValue(d[1]); >>>>>>> break; >>>>>>> } >>>>>>> } >>>>>>> >>>>>>> If you're outside a vehicle context, you can register your >>>>>>> own CAN receiver by creating a queue and calling >>>>>>> MyCan.RegisterListener(). See the vehicle module for an >>>>>>> example. >>>>>>> >>>>>>> Regards, >>>>>>> Michael >>>>>>> >>>>>> >>>> >>>> -- >>>> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal >>>> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 >>>> _______________________________________________ >>>> OvmsDev mailing list >>>> OvmsDev@lists.openvehicles.com >>>> <mailto:OvmsDev@lists.openvehicles.com> >>>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev >>> >>> >>> _______________________________________________ >>> OvmsDev mailing list >>> OvmsDev@lists.openvehicles.com >>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev >> >> -- >> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal >> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 >> _______________________________________________ >> OvmsDev mailing list >> OvmsDev@lists.openvehicles.com >> <mailto:OvmsDev@lists.openvehicles.com> >> http://lists.openvehicles.com/mailman/listinfo/ovmsdev > > > _______________________________________________ > OvmsDev mailing list > OvmsDev@lists.openvehicles.com > http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
Hi Michael look as the data below, ignoring there is some rounding up done somewhere Max 4.240 Min 4.200 That’s 40mv deviation Stddev showing 4.35mv 0.00435 its one decimal place out Regards Shane
On 5 Apr 2021, at 07:50, Michael Balzer <dexter@expeedo.de> wrote:
Shane,
what makes you think so?
Regards, Michael
Am 04.04.21 um 20:47 schrieb Shane @ Kilve Engineering:
Hi Michael,
Me again It look like the bus framework does the calc incorrect? Surly stddev should be 0.0435 And stddev.max should be 0.0437147V
v.b.p.voltage.avg 4.23496V v.b.p.voltage.grad -0.00026V v.b.p.voltage.max 4.24V v.b.p.voltage.min 4.2V v.b.p.voltage.stddev 0.00435V v.b.p.voltage.stddev.max 0.00437147V
Regards Shane
<Screenshot 2021-04-04 at 19.45.35.png>
On 4 Apr 2021, at 13:26, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
vector metrics in general can be set by passing a vector or by using the element setters provided (see API).
But you don't need to set the cell max/min/stddev metrics at all, you only need to feed the cell voltages (and/or temperatures). The BMS framework automatically extracts all statistics values from them.
Btw, regarding your cell voltages:
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
This looks like 96 cells with a factor of 0.001, e.g. 0x1090 = 4240 * 0.001 = 4.24V.
Assuming you fix your IncomingPollReply() handler to actually use the rxbuf string and you copy the RXB_* macros from the Ioniq VFL code, you can simply do this to process the values:
case 0xe113: { // Read battery cell voltages 1-96: BmsRestartCellVoltages(); for (int i = 0; i < 96; i++) { BmsSetCellVoltage(i, RXB_UINT16(i*2) * 0.001f); } break; }
Doesn't look that hard, does it?
Regards, Michael
Am 04.04.21 um 12:37 schrieb Shane @ Kilve Engineering:
morning peeps, sorry for the newbie question whats different about the cell vmax/vmin i see in metrics_standard.h its a vector? (OvmsMetricVector<float>* ms_v_bat_cell_vmax; // Cell maximum voltages [V]) does that mean i have ot handle these different? if so how? as all i get is errors trying to setvalue to this metric
/Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp: In member function 'void OvmsVehicleMaxed3::IncomingBmsReply(canbus*, uint16_t, uint16_t, uint8_t*, uint8_t, uint16_t)': /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:159:82: error: no matching function for call to 'OvmsMetricVector<float>::SetValue(float)' StandardMetrics.ms_v_bat_cell_vmax->SetValue((float)value2 / 1000); ^ In file included from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32: /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: no known conversion for argument 1 from 'float' to 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: no known conversion for argument 1 from 'float' to 'const std::vector<float, std::allocator<float> >&' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:162:82: error: no matching function for call to 'OvmsMetricVector<float>::SetValue(float)' StandardMetrics.ms_v_bat_cell_vmin->SetValue((float)value2 / 1000); ^ In file included from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32: /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: no known conversion for argument 1 from 'float' to 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: no known conversion for argument 1 from 'float' to 'const std::vector<float, std::allocator<float> >&' make[1]: *** [src/vehicle_med3.o] Error 1 make: *** [component-vehicle_maxus_edeliver3-build] Error 2 shane@Shanes-MacBook-Pro OVMS.V3 %
Regards Shane
On 3 Apr 2021, at 12:02, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
OVMS# obd can1 request device -t1000 7e4 7ec 2102 7e4[7ec] 2102: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c5 | ................ c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2103 7e4[7ec] 2103: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c5 c5 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c5 c5 c5 c4 c5 c5 c5 c4 c5 c4 c4 | ................ c5 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2104 7e4[7ec] 2104: Response: ff ff ff ff c4 c4 c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c5 c4 c4 | ....
Your voltages obviously are 16 bit values, so you'll need to use RXB_UINT16() and multiply your loop index by 2.
Regards, Michael
Am 03.04.21 um 12:04 schrieb Shane @ Kilve Engineering:
Hi has anyone got a sample of the data for the cell voltages on the ioniq vfl just so I can see how the macro is handling it? Or is it played out the same as below?
Regards Shane
> On 29 Mar 2021, at 22:20, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: > > Shane, > > Am 29.03.21 um 20:17 schrieb Shane @ Kilve Engineering: >> can any one tell me what the "v.e.c.login" is and is it need for something to work? > > v.e.c.config yes = ECU/controller in configuration state > It's not used by the framework currently. > >> also any one with any ideas how to deal with cell voltages in a string this long? took me blumim ages to find the bms when the tx and rx are 128 address apart!! >> >> 748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > > Simply loop over the cells contained. Have a look at the buffer macro utils, e.g.: > https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master... <https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master/vehicle/OVMS.V3/components/vehicle_hyundai_ioniqvfl/src/vehicle_hyundai_ioniqvfl.cpp#L44> > > Regards, > Michael > > >> Shane >> >> >> >>> On 5 Mar 2021, at 20:45, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: >>> >>> Shane, >>> >>> OvmsVehicle::PollSetPidList(m_can1, obdii_polls); >>> OvmsVehicle::PollSetState(0); >>> >>> needs to be done in your vehicle init, i.e. the constructor after RegisterCanBus(). >>> >>> Please read the vehicle_obdii module source for a complete polling example. >>> >>> Regards, >>> Michael >>> >>> >>> Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering: >>>> Thanks Michael, >>>> >>>> Had a try and ended up with this bit added but return anything >>>> >>>> Where am I going wrong? >>>> >>>> Shane >>>> >>>> ******* >>>> >>>> #include "ovms_log.h" >>>> static const char *TAG = "v-edeliver3"; >>>> >>>> #include "vehicle_edeliver3.h" >>>> #include "metrics_standard.h" >>>> >>>> namespace { >>>> >>>> const OvmsVehicle::poll_pid_t obdii_polls[] = >>>> { >>>> { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN >>>> { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH >>>> POLL_LIST_END >>>> }; >>>> }; >>>> >>>> OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() >>>> { >>>> ESP_LOGI(TAG, "Start eDeliver3 vehicle module"); >>>> >>>> RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); >>>> } >>>> >>>> OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() >>>> { >>>> ESP_LOGI(TAG, "Stop eDeliver3 vehicle module"); >>>> >>>> memset(m_vin, 0, sizeof(m_vin)); >>>> } >>>> >>>> >>>> //testing polls >>>> >>>> void OvmsVehicleEdeliver3::IncomingPollReply( >>>> canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) >>>> { >>>> string& rxbuf = med_obd_rxbuf; >>>> >>>> OvmsVehicle::PollSetPidList(m_can1, obdii_polls); >>>> OvmsVehicle::PollSetState(0); >>>> >>>> >>>> // init / fill rx buffer: >>>> if (m_poll_ml_frame == 0) { >>>> rxbuf.clear(); >>>> rxbuf.reserve(length + mlremain); >>>> } >>>> rxbuf.append((char*)data, length); >>>> if (mlremain) >>>> return; >>>> >>>> // complete: >>>> switch (pid) { >>>> case 0xe003: { >>>> unsigned int soh_raw = ((unsigned int)rxbuf[0] << 8) | (unsigned int)rxbuf[1]; >>>> float soh = soh_raw / 10; >>>> StdMetrics.ms_v_bat_soh->SetValue(soh); >>>> break; >>>> } >>>> } >>>> } >>>> >>>> >>>> // end testing polls >>>> >>>> >>>> >>>>> On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: >>>>> >>>>> Shane, >>>>> >>>>> on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html <http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html> >>>>> >>>>> Regards, >>>>> Michael >>>>> >>>>> >>>>> Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering: >>>>>> Good evening Michael, >>>>>> >>>>>> Or any one that has the time to help, >>>>>> >>>>>> Ive now successfully retrieved as much info as I can without polling any info for the maxus, but I have have now found an ecu that responds to pid requests. >>>>>> >>>>>> For example if I use the obdii pid scanner I get the loads of data back and I’ve decoded some of it, just need a bit of guidance how to write the code to get the same info >>>>>> >>>>>> A part of a scan is as follows >>>>>> >>>>>> Scan complete (7e3 e000-e100) >>>>>> Scan started : 2021-03-04 18:32:36 GMT >>>>>> Last response: 2021-03-04 18:32:39 GMT >>>>>> 7e3[7eb]:e000 00 >>>>>> 7e3[7eb]:e001 64 >>>>>> 7e3[7eb]:e002 4b >>>>>> 7e3[7eb]:e003 26 bc >>>>>> 7e3[7eb]:e004 00 07 >>>>>> 7e3[7eb]:e005 2f >>>>>> 7e3[7eb]:e006 2e >>>>>> 7e3[7eb]:e007 02 00 >>>>>> 7e3[7eb]:e008 01 ff >>>>>> 7e3[7eb]:e009 02 00 >>>>>> 7e3[7eb]:e010 02 00 >>>>>> >>>>>> I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH >>>>>> And e002 is a temp 4b = 75 / 10 = 7.5 degrees >>>>>> >>>>>> So if some one can help me with an example of how to correctly code this one I can work out the rest, >>>>>> >>>>>> Ive looked through various vehicles but everyone uses different methods and I can’t seem to get one to work for me. >>>>>> >>>>>> Any help much appreciated >>>>>> >>>>>> Shane >>>>>> >>>>>>> On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: >>>>>>> >>>>>>> Shane, >>>>>>> >>>>>>> I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example: >>>>>>> >>>>>>> RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS); >>>>>>> >>>>>>> Regards, >>>>>>> Michael >>>>>>> >>>>>>> >>>>>>> Am 15.02.21 um 08:36 schrieb Michael Balzer: >>>>>>>> Shane, >>>>>>>> >>>>>>>> Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering: >>>>>>>>> can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID. >>>>>>>> >>>>>>>> I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus). >>>>>>>> >>>>>>>> Reduced example: >>>>>>>> >>>>>>>> void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) >>>>>>>> { >>>>>>>> uint8_t *d = p_frame->data.u8; >>>>>>>> >>>>>>>> switch (p_frame->MsgID) >>>>>>>> { >>>>>>>> case 0x6f2: >>>>>>>> // for example, assuming the SOC is in byte 1: >>>>>>>> StdMetrics.ms_v_bat_soc->SetValue(d[1]); >>>>>>>> break; >>>>>>>> } >>>>>>>> } >>>>>>>> >>>>>>>> If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example. >>>>>>>> >>>>>>>> Regards, >>>>>>>> Michael >>>>>>>> >>>>>>> >>>>> >>>>> -- >>>>> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal >>>>> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 >>>>> _______________________________________________ >>>>> OvmsDev mailing list >>>>> OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> >>>>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev> >>>> >>>> >>>> >>>> _______________________________________________ >>>> OvmsDev mailing list >>>> OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> >>>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev> >>> >>> -- >>> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal >>> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 >>> _______________________________________________ >>> OvmsDev mailing list >>> OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> >>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev> >> >> >> >> _______________________________________________ >> OvmsDev mailing list >> OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> >> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev> > > -- > Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal > Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 > _______________________________________________ > OvmsDev mailing list > OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> > http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev <http://lists.openvehicles.com/mailman/listinfo/ovmsdev>
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
Shane, the standard deviation isn't the distance between the minimum and maximum, it's a measure of variation from the mean value. Standard deviation is one of the main basic statistical analysis tools. Read more on this on the web: https://duckduckgo.com/?q=standard+deviation In the battery chart, the standard deviation is shown as the horizontal stripe with light blue background. The maximum standard deviation observed since the last reset is shown by the two blue lines. A high standard deviation, especially under load, means a high cell drift = defective / aged / poorly selected pack. Regards, Michael Am 05.04.21 um 16:40 schrieb Shane @ Kilve Engineering:
Hi Michael look as the data below, ignoring there is some rounding up done somewhere
Max 4.240 Min 4.200
That’s 40mv deviation Stddev showing 4.35mv 0.00435 its one decimal place out
Regards Shane
On 5 Apr 2021, at 07:50, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
what makes you think so?
Regards, Michael
Am 04.04.21 um 20:47 schrieb Shane @ Kilve Engineering:
Hi Michael,
Me again It look like the bus framework does the calc incorrect? Surly stddev should be 0.0435 And stddev.max should be 0.0437147V
v.b.p.voltage.avg 4.23496V v.b.p.voltage.grad -0.00026V v.b.p.voltage.max 4.24V v.b.p.voltage.min 4.2V v.b.p.voltage.stddev 0.00435V v.b.p.voltage.stddev.max 0.00437147V
Regards Shane
<Screenshot 2021-04-04 at 19.45.35.png>
On 4 Apr 2021, at 13:26, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
Shane,
vector metrics in general can be set by passing a vector or by using the element setters provided (see API).
But you don't need to set the cell max/min/stddev metrics at all, you only need to feed the cell voltages (and/or temperatures). The BMS framework automatically extracts all statistics values from them.
Btw, regarding your cell voltages:
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
This looks like 96 cells with a factor of 0.001, e.g. 0x1090 = 4240 * 0.001 = 4.24V.
Assuming you fix your IncomingPollReply() handler to actually use the rxbuf string and you copy the RXB_* macros from the Ioniq VFL code, you can simply do this to process the values:
case 0xe113: { // Read battery cell voltages 1-96: BmsRestartCellVoltages(); for (int i = 0; i < 96; i++) { BmsSetCellVoltage(i, RXB_UINT16(i*2) * 0.001f); } break; }
Doesn't look that hard, does it?
Regards, Michael
Am 04.04.21 um 12:37 schrieb Shane @ Kilve Engineering:
morning peeps, sorry for the newbie question whats different about the cell vmax/vmin i see in metrics_standard.h its a vector? (OvmsMetricVector<float>* ms_v_bat_cell_vmax; // Cell maximum voltages [V]) does that mean i have ot handle these different? if so how? as all i get is errors trying to setvalue to this metric
*/Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:* In member function '*void OvmsVehicleMaxed3::IncomingBmsReply(canbus*, uint16_t, uint16_t, uint8_t*, uint8_t, uint16_t)*': */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:159:82:* *error: *no matching function for call to '*OvmsMetricVector<float>::SetValue(float)*' StandardMetrics.ms_v_bat_cell_vmax->SetValue((float)value2 / 1000); * ^* In file included from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0*, from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32*, from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32*: */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18:* *note: *candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) * ^* */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18:* *note: * no known conversion for argument 1 from '*float*' to '*std::__cxx11::string {aka std::__cxx11::basic_string<char>}*' */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10:* *note: *candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) * ^* */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10:* *note: * no known conversion for argument 1 from '*float*' to '*const std::vector<float, std::allocator<float> >&*' */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:162:82:* *error: *no matching function for call to '*OvmsMetricVector<float>::SetValue(float)*' StandardMetrics.ms_v_bat_cell_vmin->SetValue((float)value2 / 1000); * ^* In file included from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0*, from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32*, from */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32*: */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18:* *note: *candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) * ^* */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18:* *note: * no known conversion for argument 1 from '*float*' to '*std::__cxx11::string {aka std::__cxx11::basic_string<char>}*' */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10:* *note: *candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) * ^* */Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10:* *note: * no known conversion for argument 1 from '*float*' to '*const std::vector<float, std::allocator<float> >&*' make[1]: *** [src/vehicle_med3.o] Error 1 make: *** [component-vehicle_maxus_edeliver3-build] Error 2 shane@Shanes-MacBook-Pro OVMS.V3 %
Regards Shane
On 3 Apr 2021, at 12:02, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
OVMS# obd can1 request device -t1000 7e4 7ec 2102 7e4[7ec] 2102: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c5 | ................ c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2103 7e4[7ec] 2103: Response: ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c5 c5 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c5 c5 c5 c4 c5 c5 c5 c4 c5 c4 c4 | ................ c5 c4 c4 c4 | ....
OVMS# obd can1 request device -t1000 7e4 7ec 2104 7e4[7ec] 2104: Response: ff ff ff ff c4 c4 c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ c4 c5 c4 c4 | ....
Your voltages obviously are 16 bit values, so you'll need to use RXB_UINT16() and multiply your loop index by 2.
Regards, Michael
Am 03.04.21 um 12:04 schrieb Shane @ Kilve Engineering: > Hi has anyone got a sample of the data for the cell voltages on > the ioniq vfl just so I can see how the macro is handling it? Or > is it played out the same as below? > > Regards > Shane > >> On 29 Mar 2021, at 22:20, Michael Balzer <dexter@expeedo.de >> <mailto:dexter@expeedo.de>> wrote: >> >> Shane, >> >> Am 29.03.21 um 20:17 schrieb Shane @ Kilve Engineering: >>> can any one tell me what the "v.e.c.login" is and is it need >>> for something to work? >> >> v.e.c.config yes = ECU/controller in configuration state >> >> It's not used by the framework currently. >> >>> also any one with any ideas how to deal with cell voltages in >>> a string this long? took me blumim ages to find the bms when >>> the tx and rx are 128 address apart!! >>> >>> 748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 >>> 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 >>> 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e >>> 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 >>> 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 >>> 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 >>> 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 >>> 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 >>> 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 >>> 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 >>> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >> >> Simply loop over the cells contained. Have a look at the buffer >> macro utils, e.g.: >> https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master... >> >> Regards, >> Michael >> >> >>> Shane >>> >>> >>> >>>> On 5 Mar 2021, at 20:45, Michael Balzer <dexter@expeedo.de >>>> <mailto:dexter@expeedo.de>> wrote: >>>> >>>> Shane, >>>> >>>> OvmsVehicle::PollSetPidList(m_can1, obdii_polls); >>>> OvmsVehicle::PollSetState(0); >>>> >>>> needs to be done in your vehicle init, i.e. the constructor >>>> after RegisterCanBus(). >>>> >>>> Please read the vehicle_obdii module source for a complete >>>> polling example. >>>> >>>> Regards, >>>> Michael >>>> >>>> >>>> Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering: >>>>> Thanks Michael, >>>>> >>>>> Had a try and ended up with this bit added but return anything >>>>> >>>>> Where am I going wrong? >>>>> >>>>> Shane >>>>> >>>>> ******* >>>>> >>>>> #include "ovms_log.h" >>>>> *static**const**char**TAG= "v-edeliver3"; >>>>> >>>>> #include "vehicle_edeliver3.h" >>>>> #include "metrics_standard.h" >>>>> >>>>> *namespace* { >>>>> >>>>> *const*OvmsVehicle::poll_pid_tobdii_polls[] = >>>>> { >>>>> { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, >>>>> { 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN >>>>> { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, >>>>> { 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH >>>>> POLL_LIST_END >>>>> }; >>>>> }; >>>>> >>>>> OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() >>>>> { >>>>> ESP_LOGI(TAG, "Start eDeliver3 vehicle module"); >>>>> >>>>> RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); >>>>> } >>>>> >>>>> OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() >>>>> { >>>>> ESP_LOGI(TAG, "Stop eDeliver3 vehicle module"); >>>>> >>>>> memset(m_vin, 0, *sizeof*(m_vin)); >>>>> } >>>>> >>>>> >>>>> //testing polls >>>>> >>>>> *void*OvmsVehicleEdeliver3::IncomingPollReply( >>>>> canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, >>>>> uint8_t length, uint16_t mlremain) >>>>> { >>>>> string& rxbuf = med_obd_rxbuf; >>>>> >>>>> OvmsVehicle::PollSetPidList(m_can1, obdii_polls); >>>>> OvmsVehicle::PollSetState(0); >>>>> >>>>> >>>>> // init / fill rx buffer: >>>>> *if* (m_poll_ml_frame == 0) { >>>>> rxbuf.clear(); >>>>> rxbuf.reserve(length + mlremain); >>>>> } >>>>> rxbuf.append((*char**)data, length); >>>>> *if* (mlremain) >>>>> *return*; >>>>> >>>>> // complete: >>>>> *switch* (pid) { >>>>> *case* 0xe003: { >>>>> *unsigned* *int* soh_raw = ((*unsigned* *int*)rxbuf[0] << 8) >>>>> | (*unsigned* *int*)rxbuf[1]; >>>>> *float* soh = soh_raw / 10; >>>>> StdMetrics.ms_v_bat_soh->SetValue(soh); >>>>> *break*; >>>>> } >>>>> } >>>>> } >>>>> >>>>> >>>>> // end testing polls >>>>> >>>>> >>>>> >>>>>> On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de >>>>>> <mailto:dexter@expeedo.de>> wrote: >>>>>> >>>>>> Shane, >>>>>> >>>>>> on OBD polling basics: >>>>>> http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html >>>>>> >>>>>> Regards, >>>>>> Michael >>>>>> >>>>>> >>>>>> Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering: >>>>>>> Good evening Michael, >>>>>>> >>>>>>> Or any one that has the time to help, >>>>>>> >>>>>>> Ive now successfully retrieved as much info as I can >>>>>>> without polling any info for the maxus, but I have have >>>>>>> now found an ecu that responds to pid requests. >>>>>>> >>>>>>> For example if I use the obdii pid scanner I get the loads >>>>>>> of data back and I’ve decoded some of it, just need a bit >>>>>>> of guidance how to write the code to get the same info >>>>>>> >>>>>>> A part of a scan is as follows >>>>>>> >>>>>>> Scan complete (7e3 e000-e100) >>>>>>> Scan started : 2021-03-04 18:32:36 GMT >>>>>>> Last response: 2021-03-04 18:32:39 GMT >>>>>>> 7e3[7eb]:e000 00 >>>>>>> 7e3[7eb]:e001 64 >>>>>>> 7e3[7eb]:e002 4b >>>>>>> 7e3[7eb]:e003 26 bc >>>>>>> 7e3[7eb]:e004 00 07 >>>>>>> 7e3[7eb]:e005 2f >>>>>>> 7e3[7eb]:e006 2e >>>>>>> 7e3[7eb]:e007 02 00 >>>>>>> 7e3[7eb]:e008 01 ff >>>>>>> 7e3[7eb]:e009 02 00 >>>>>>> 7e3[7eb]:e010 02 00 >>>>>>> >>>>>>> I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH >>>>>>> And e002 is a temp 4b = 75 / 10 = 7.5 degrees >>>>>>> >>>>>>> So if some one can help me with an example of how to >>>>>>> correctly code this one I can work out the rest, >>>>>>> >>>>>>> Ive looked through various vehicles but everyone uses >>>>>>> different methods and I can’t seem to get one to work for me. >>>>>>> >>>>>>> Any help much appreciated >>>>>>> >>>>>>> Shane >>>>>>> >>>>>>>> On 15 Feb 2021, at 08:05, Michael Balzer >>>>>>>> <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote: >>>>>>>> >>>>>>>> Shane, >>>>>>>> >>>>>>>> I forgot to mention: if you're working on a new vehicle >>>>>>>> module, you'll also need to start the bus somewhere in >>>>>>>> your initialization code. Example: >>>>>>>> >>>>>>>> RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS); >>>>>>>> >>>>>>>> Regards, >>>>>>>> Michael >>>>>>>> >>>>>>>> >>>>>>>> Am 15.02.21 um 08:36 schrieb Michael Balzer: >>>>>>>>> Shane, >>>>>>>>> >>>>>>>>> Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering: >>>>>>>>>> can any one help me with a bit of code to retrieve ve >>>>>>>>>> some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as >>>>>>>>>> i cant poll this ecu it just broadcasts when its >>>>>>>>>> active, ive tried polling it but does not respond, i >>>>>>>>>> need to choose one byte and allocate it to a PID. >>>>>>>>> >>>>>>>>> I don't know what you mean by "allocating a byte to a >>>>>>>>> PID", but if you want to process frames received >>>>>>>>> directly, simply override IncomingFrameCan1() (or …2/3/4 >>>>>>>>> depending on your bus). >>>>>>>>> >>>>>>>>> Reduced example: >>>>>>>>> >>>>>>>>> void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) >>>>>>>>> { >>>>>>>>> uint8_t *d = p_frame->data.u8; >>>>>>>>> >>>>>>>>> switch (p_frame->MsgID) >>>>>>>>> { >>>>>>>>> case 0x6f2: >>>>>>>>> // for example, assuming the SOC is in byte 1: >>>>>>>>> StdMetrics.ms_v_bat_soc->SetValue(d[1]); >>>>>>>>> break; >>>>>>>>> } >>>>>>>>> } >>>>>>>>> >>>>>>>>> If you're outside a vehicle context, you can register >>>>>>>>> your own CAN receiver by creating a queue and calling >>>>>>>>> MyCan.RegisterListener(). See the vehicle module for an >>>>>>>>> example. >>>>>>>>> >>>>>>>>> Regards, >>>>>>>>> Michael >>>>>>>>> >>>>>>>> >>>>>> >>>>>> -- >>>>>> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal >>>>>> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 >>>>>> _______________________________________________ >>>>>> OvmsDev mailing list >>>>>> OvmsDev@lists.openvehicles.com >>>>>> <mailto:OvmsDev@lists.openvehicles.com> >>>>>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev >>>>> >>>>> >>>>> _______________________________________________ >>>>> OvmsDev mailing list >>>>> OvmsDev@lists.openvehicles.com >>>>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev >>>> >>>> -- >>>> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal >>>> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 >>>> _______________________________________________ >>>> OvmsDev mailing list >>>> OvmsDev@lists.openvehicles.com >>>> <mailto:OvmsDev@lists.openvehicles.com> >>>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev >>> >>> >>> _______________________________________________ >>> OvmsDev mailing list >>> OvmsDev@lists.openvehicles.com >>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev >> >> -- >> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal >> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 >> _______________________________________________ >> OvmsDev mailing list >> OvmsDev@lists.openvehicles.com >> <mailto:OvmsDev@lists.openvehicles.com> >> http://lists.openvehicles.com/mailman/listinfo/ovmsdev > > > _______________________________________________ > OvmsDev mailing list > OvmsDev@lists.openvehicles.com > http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
Well you learn something new every day! So 1.3mv standard deviation is pretty good 😌 Thanks for the clarification! And a bit of bed time reading ;-) Regards Shane
On 5 Apr 2021, at 16:02, Michael Balzer <dexter@expeedo.de> wrote:
Shane,
the standard deviation isn't the distance between the minimum and maximum, it's a measure of variation from the mean value.
Standard deviation is one of the main basic statistical analysis tools. Read more on this on the web: https://duckduckgo.com/?q=standard+deviation
In the battery chart, the standard deviation is shown as the horizontal stripe with light blue background. The maximum standard deviation observed since the last reset is shown by the two blue lines.
A high standard deviation, especially under load, means a high cell drift = defective / aged / poorly selected pack.
Regards, Michael
Am 05.04.21 um 16:40 schrieb Shane @ Kilve Engineering:
Hi Michael look as the data below, ignoring there is some rounding up done somewhere
Max 4.240 Min 4.200
That’s 40mv deviation Stddev showing 4.35mv 0.00435 its one decimal place out
Regards Shane
On 5 Apr 2021, at 07:50, Michael Balzer <dexter@expeedo.de> wrote:
Shane,
what makes you think so?
Regards, Michael
Am 04.04.21 um 20:47 schrieb Shane @ Kilve Engineering:
Hi Michael,
Me again It look like the bus framework does the calc incorrect? Surly stddev should be 0.0435 And stddev.max should be 0.0437147V
v.b.p.voltage.avg 4.23496V v.b.p.voltage.grad -0.00026V v.b.p.voltage.max 4.24V v.b.p.voltage.min 4.2V v.b.p.voltage.stddev 0.00435V v.b.p.voltage.stddev.max 0.00437147V
Regards Shane
<Screenshot 2021-04-04 at 19.45.35.png>
On 4 Apr 2021, at 13:26, Michael Balzer <dexter@expeedo.de> wrote:
Shane,
vector metrics in general can be set by passing a vector or by using the element setters provided (see API).
But you don't need to set the cell max/min/stddev metrics at all, you only need to feed the cell voltages (and/or temperatures). The BMS framework automatically extracts all statistics values from them.
Btw, regarding your cell voltages:
748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
This looks like 96 cells with a factor of 0.001, e.g. 0x1090 = 4240 * 0.001 = 4.24V.
Assuming you fix your IncomingPollReply() handler to actually use the rxbuf string and you copy the RXB_* macros from the Ioniq VFL code, you can simply do this to process the values:
case 0xe113: { // Read battery cell voltages 1-96: BmsRestartCellVoltages(); for (int i = 0; i < 96; i++) { BmsSetCellVoltage(i, RXB_UINT16(i*2) * 0.001f); } break; }
Doesn't look that hard, does it?
Regards, Michael
Am 04.04.21 um 12:37 schrieb Shane @ Kilve Engineering:
morning peeps, sorry for the newbie question whats different about the cell vmax/vmin i see in metrics_standard.h its a vector? (OvmsMetricVector<float>* ms_v_bat_cell_vmax; // Cell maximum voltages [V]) does that mean i have ot handle these different? if so how? as all i get is errors trying to setvalue to this metric
/Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp: In member function 'void OvmsVehicleMaxed3::IncomingBmsReply(canbus*, uint16_t, uint16_t, uint8_t*, uint8_t, uint16_t)': /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:159:82: error: no matching function for call to 'OvmsMetricVector<float>::SetValue(float)' StandardMetrics.ms_v_bat_cell_vmax->SetValue((float)value2 / 1000); ^ In file included from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32: /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: no known conversion for argument 1 from 'float' to 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: no known conversion for argument 1 from 'float' to 'const std::vector<float, std::allocator<float> >&' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:162:82: error: no matching function for call to 'OvmsMetricVector<float>::SetValue(float)' StandardMetrics.ms_v_bat_cell_vmin->SetValue((float)value2 / 1000); ^ In file included from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle/vehicle.h:40:0, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.h:32, from /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/components/vehicle_maxus_edeliver3/src/vehicle_med3.cpp:32: /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(std::__cxx11::string) [with ElemType = float; Allocator = std::allocator<float>; std::__cxx11::string = std::__cxx11::basic_string<char>] virtual bool SetValue(std::string value) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:747:18: note: no known conversion for argument 1 from 'float' to 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: candidate: bool OvmsMetricVector<ElemType, Allocator>::SetValue(const std::vector<_Tp, _Alloc>&, metric_unit_t) [with ElemType = float; Allocator = std::allocator<float>] bool SetValue(const std::vector<ElemType, Allocator>& value, metric_unit_t units = Other) ^ /Users/shane/Open-Vehicle-Monitoring-System-3-MGEV/vehicle/OVMS.V3/main/ovms_metrics.h:763:10: note: no known conversion for argument 1 from 'float' to 'const std::vector<float, std::allocator<float> >&' make[1]: *** [src/vehicle_med3.o] Error 1 make: *** [component-vehicle_maxus_edeliver3-build] Error 2 shane@Shanes-MacBook-Pro OVMS.V3 %
Regards Shane
> On 3 Apr 2021, at 12:02, Michael Balzer <dexter@expeedo.de> wrote: > > OVMS# obd can1 request device -t1000 7e4 7ec 2102 > 7e4[7ec] 2102: Response: > ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c5 | ................ > c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ > c4 c4 c4 c4 | .... > > OVMS# obd can1 request device -t1000 7e4 7ec 2103 > 7e4[7ec] 2103: Response: > ff ff ff ff c4 c4 c4 c4 c4 c4 c4 c5 c5 c4 c4 c4 | ................ > c4 c4 c4 c4 c4 c5 c5 c5 c4 c5 c5 c5 c4 c5 c4 c4 | ................ > c5 c4 c4 c4 | .... > > OVMS# obd can1 request device -t1000 7e4 7ec 2104 > 7e4[7ec] 2104: Response: > ff ff ff ff c4 c4 c5 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ > c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 c4 | ................ > c4 c5 c4 c4 | .... > > > Your voltages obviously are 16 bit values, so you'll need to use RXB_UINT16() and multiply your loop index by 2. > > Regards, > Michael > > > Am 03.04.21 um 12:04 schrieb Shane @ Kilve Engineering: >> Hi has anyone got a sample of the data for the cell voltages on the ioniq vfl just so I can see how the macro is handling it? Or is it played out the same as below? >> >> Regards >> Shane >> >>> On 29 Mar 2021, at 22:20, Michael Balzer <dexter@expeedo.de> wrote: >>> >>> Shane, >>> >>> Am 29.03.21 um 20:17 schrieb Shane @ Kilve Engineering: >>>> can any one tell me what the "v.e.c.login" is and is it need for something to work? >>> >>> v.e.c.config yes = ECU/controller in configuration state >>> It's not used by the framework currently. >>> >>>> also any one with any ideas how to deal with cell voltages in a string this long? took me blumim ages to find the bms when the tx and rx are 128 address apart!! >>>> >>>> 748[7c8]:e113 10 90 10 92 10 93 10 93 10 8e 10 92 10 8f 10 90 10 92 10 6c 10 93 10 93 10 8f 10 91 10 92 10 92 10 92 10 92 10 92 10 92 10 90 10 8e 10 90 10 92 10 8d 10 90 10 91 10 8f 10 8e 10 8f 10 91 10 90 10 90 10 91 10 8e 10 91 10 8e 10 91 10 90 10 8e 10 90 10 92 10 90 10 94 10 91 10 91 10 93 10 90 10 91 10 90 10 8f 10 93 10 92 10 8e 10 90 10 91 10 8b 10 92 10 90 10 91 10 8e 10 90 10 90 10 90 10 91 10 90 10 8f 10 90 10 90 10 8e 10 92 10 8e 10 91 10 89 10 91 10 91 10 91 10 8d 10 8f 10 8d 10 86 10 8a 10 8e 10 8f 10 91 10 90 10 92 10 94 10 88 10 8f 10 94 10 91 10 91 10 91 10 93 10 91 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >>> >>> Simply loop over the cells contained. Have a look at the buffer macro utils, e.g.: >>> https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/blob/master... >>> >>> Regards, >>> Michael >>> >>> >>>> Shane >>>> >>>> >>>> >>>>> On 5 Mar 2021, at 20:45, Michael Balzer <dexter@expeedo.de> wrote: >>>>> >>>>> Shane, >>>>> >>>>> OvmsVehicle::PollSetPidList(m_can1, obdii_polls); >>>>> OvmsVehicle::PollSetState(0); >>>>> >>>>> needs to be done in your vehicle init, i.e. the constructor after RegisterCanBus(). >>>>> >>>>> Please read the vehicle_obdii module source for a complete polling example. >>>>> >>>>> Regards, >>>>> Michael >>>>> >>>>> >>>>> Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering: >>>>>> Thanks Michael, >>>>>> >>>>>> Had a try and ended up with this bit added but return anything >>>>>> >>>>>> Where am I going wrong? >>>>>> >>>>>> Shane >>>>>> >>>>>> ******* >>>>>> >>>>>> #include "ovms_log.h" >>>>>> static const char *TAG = "v-edeliver3"; >>>>>> >>>>>> #include "vehicle_edeliver3.h" >>>>>> #include "metrics_standard.h" >>>>>> >>>>>> namespace { >>>>>> >>>>>> const OvmsVehicle::poll_pid_t obdii_polls[] = >>>>>> { >>>>>> { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //VIN >>>>>> { 0x7e3, 0x7eb, VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, { 10, 10, 10, 10 }, 0, ISOTP_STD }, //SOH >>>>>> POLL_LIST_END >>>>>> }; >>>>>> }; >>>>>> >>>>>> OvmsVehicleEdeliver3::OvmsVehicleEdeliver3() >>>>>> { >>>>>> ESP_LOGI(TAG, "Start eDeliver3 vehicle module"); >>>>>> >>>>>> RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS); >>>>>> } >>>>>> >>>>>> OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3() >>>>>> { >>>>>> ESP_LOGI(TAG, "Stop eDeliver3 vehicle module"); >>>>>> >>>>>> memset(m_vin, 0, sizeof(m_vin)); >>>>>> } >>>>>> >>>>>> >>>>>> //testing polls >>>>>> >>>>>> void OvmsVehicleEdeliver3::IncomingPollReply( >>>>>> canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain) >>>>>> { >>>>>> string& rxbuf = med_obd_rxbuf; >>>>>> >>>>>> OvmsVehicle::PollSetPidList(m_can1, obdii_polls); >>>>>> OvmsVehicle::PollSetState(0); >>>>>> >>>>>> >>>>>> // init / fill rx buffer: >>>>>> if (m_poll_ml_frame == 0) { >>>>>> rxbuf.clear(); >>>>>> rxbuf.reserve(length + mlremain); >>>>>> } >>>>>> rxbuf.append((char*)data, length); >>>>>> if (mlremain) >>>>>> return; >>>>>> >>>>>> // complete: >>>>>> switch (pid) { >>>>>> case 0xe003: { >>>>>> unsigned int soh_raw = ((unsigned int)rxbuf[0] << 8) | (unsigned int)rxbuf[1]; >>>>>> float soh = soh_raw / 10; >>>>>> StdMetrics.ms_v_bat_soh->SetValue(soh); >>>>>> break; >>>>>> } >>>>>> } >>>>>> } >>>>>> >>>>>> >>>>>> // end testing polls >>>>>> >>>>>> >>>>>> >>>>>>> On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de> wrote: >>>>>>> >>>>>>> Shane, >>>>>>> >>>>>>> on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html >>>>>>> >>>>>>> Regards, >>>>>>> Michael >>>>>>> >>>>>>> >>>>>>> Am 04.03.21 um 19:45 schrieb Shane @ Kilve Engineering: >>>>>>>> Good evening Michael, >>>>>>>> >>>>>>>> Or any one that has the time to help, >>>>>>>> >>>>>>>> Ive now successfully retrieved as much info as I can without polling any info for the maxus, but I have have now found an ecu that responds to pid requests. >>>>>>>> >>>>>>>> For example if I use the obdii pid scanner I get the loads of data back and I’ve decoded some of it, just need a bit of guidance how to write the code to get the same info >>>>>>>> >>>>>>>> A part of a scan is as follows >>>>>>>> >>>>>>>> Scan complete (7e3 e000-e100) >>>>>>>> Scan started : 2021-03-04 18:32:36 GMT >>>>>>>> Last response: 2021-03-04 18:32:39 GMT >>>>>>>> 7e3[7eb]:e000 00 >>>>>>>> 7e3[7eb]:e001 64 >>>>>>>> 7e3[7eb]:e002 4b >>>>>>>> 7e3[7eb]:e003 26 bc >>>>>>>> 7e3[7eb]:e004 00 07 >>>>>>>> 7e3[7eb]:e005 2f >>>>>>>> 7e3[7eb]:e006 2e >>>>>>>> 7e3[7eb]:e007 02 00 >>>>>>>> 7e3[7eb]:e008 01 ff >>>>>>>> 7e3[7eb]:e009 02 00 >>>>>>>> 7e3[7eb]:e010 02 00 >>>>>>>> >>>>>>>> I know that e003 is SOH = 26bc = 9916 /100 = 99.16% SOH >>>>>>>> And e002 is a temp 4b = 75 / 10 = 7.5 degrees >>>>>>>> >>>>>>>> So if some one can help me with an example of how to correctly code this one I can work out the rest, >>>>>>>> >>>>>>>> Ive looked through various vehicles but everyone uses different methods and I can’t seem to get one to work for me. >>>>>>>> >>>>>>>> Any help much appreciated >>>>>>>> >>>>>>>> Shane >>>>>>>> >>>>>>>>> On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de> wrote: >>>>>>>>> >>>>>>>>> Shane, >>>>>>>>> >>>>>>>>> I forgot to mention: if you're working on a new vehicle module, you'll also need to start the bus somewhere in your initialization code. Example: >>>>>>>>> >>>>>>>>> RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS); >>>>>>>>> >>>>>>>>> Regards, >>>>>>>>> Michael >>>>>>>>> >>>>>>>>> >>>>>>>>> Am 15.02.21 um 08:36 schrieb Michael Balzer: >>>>>>>>>> Shane, >>>>>>>>>> >>>>>>>>>> Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering: >>>>>>>>>>> can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID. >>>>>>>>>> >>>>>>>>>> I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus). >>>>>>>>>> >>>>>>>>>> Reduced example: >>>>>>>>>> >>>>>>>>>> void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) >>>>>>>>>> { >>>>>>>>>> uint8_t *d = p_frame->data.u8; >>>>>>>>>> >>>>>>>>>> switch (p_frame->MsgID) >>>>>>>>>> { >>>>>>>>>> case 0x6f2: >>>>>>>>>> // for example, assuming the SOC is in byte 1: >>>>>>>>>> StdMetrics.ms_v_bat_soc->SetValue(d[1]); >>>>>>>>>> break; >>>>>>>>>> } >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example. >>>>>>>>>> >>>>>>>>>> Regards, >>>>>>>>>> Michael >>>>>>>>>> >>>>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal >>>>>>> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 >>>>>>> _______________________________________________ >>>>>>> OvmsDev mailing list >>>>>>> OvmsDev@lists.openvehicles.com >>>>>>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev >>>>>> >>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> OvmsDev mailing list >>>>>> OvmsDev@lists.openvehicles.com >>>>>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev >>>>> >>>>> -- >>>>> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal >>>>> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 >>>>> _______________________________________________ >>>>> OvmsDev mailing list >>>>> OvmsDev@lists.openvehicles.com >>>>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev >>>> >>>> >>>> >>>> _______________________________________________ >>>> OvmsDev mailing list >>>> OvmsDev@lists.openvehicles.com >>>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev >>> >>> -- >>> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal >>> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 >>> _______________________________________________ >>> OvmsDev mailing list >>> OvmsDev@lists.openvehicles.com >>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev >> >> >> >> _______________________________________________ >> OvmsDev mailing list >> OvmsDev@lists.openvehicles.com >> http://lists.openvehicles.com/mailman/listinfo/ovmsdev > > -- > Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal > Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 > _______________________________________________ > OvmsDev mailing list > OvmsDev@lists.openvehicles.com > http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26 _______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
Morning Michael, Thank you for taking the time to reply, I did get there in the end and now have battery soc and pack voltage in the app, :-) Your suggestion helped me tidy up my work thanks. Just need to work out a few more and then get some help how to do a pull request and get a graphic of the vehicle in the app Regards Shane
On 15 Feb 2021, at 07:36, Michael Balzer <dexter@expeedo.de> wrote:
Shane,
Am 14.02.21 um 16:42 schrieb Shane @ Kilve Engineering:
can any one help me with a bit of code to retrieve ve some data from ecu can1/6f2 00 4c 00 00 01 97 bc 00 as i cant poll this ecu it just broadcasts when its active, ive tried polling it but does not respond, i need to choose one byte and allocate it to a PID.
I don't know what you mean by "allocating a byte to a PID", but if you want to process frames received directly, simply override IncomingFrameCan1() (or …2/3/4 depending on your bus).
Reduced example:
void OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t *p_frame) { uint8_t *d = p_frame->data.u8;
switch (p_frame->MsgID) { case 0x6f2: // for example, assuming the SOC is in byte 1: StdMetrics.ms_v_bat_soc->SetValue(d[1]); break; } }
If you're outside a vehicle context, you can register your own CAN receiver by creating a queue and calling MyCan.RegisterListener(). See the vehicle module for an example.
Regards, Michael
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
participants (3)
-
Michael Balzer -
Shane @ Kilve Engineering -
Shane@Kilve-Engineering.co.uk