<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
Steve,<br>
<br>
with log level verbose for canlog, you can simply activate CAN
logging via:<br>
<br>
<font face="monospace">can log start monitor crtd</font><br>
<br>
…that will log all frames, if that's too much, add a filter like
this:<br>
<br>
<font face="monospace">can log start monitor crtd 600-7ff</font><br>
<br>
Use <font face="monospace">can log stop</font> to …well, you'll
guess it ;-)<br>
<br>
And as I said, to get the log messages of the vehicle poller, set
log level debug on "vehicle".<br>
<br>
Btw: in case you missed it, have a look at Config→Logging for
persistent levels & file logging.<br>
<br>
Regards,<br>
Michael<br>
<br>
<br>
<div class="moz-cite-prefix">Am 12.12.20 um 16:12 schrieb Steve
Davies:<br>
</div>
<blockquote type="cite"
cite="mid:CABFTEGVeBN_5mjoRo=FHwVHZfxfXQXpB756kbtNdchaZLoMi7Q@mail.gmail.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<div dir="ltr">
<div dir="ltr"><br>
</div>
<div dir="ltr"><br>
</div>
<div dir="ltr">Hi Michael,
<div><br>
</div>
<div>So I've written something to poll the SOC%.</div>
<div><br>
</div>
<div>At this stage I'm trying to debug. I'm running my code -
I configured for my BMWI3 module and my car.</div>
<div><br>
</div>
<div>I set log level debug v-bmwi3, log level verbose canlog,
and log level canopen.</div>
<div><br>
</div>
<div>I can see that can1 is running - I'm sending some packets
(I had it poll once per 60 seconds and indeed I'm sending
one packet per minute). </div>
<div><br>
</div>
<div>can can1 status says:</div>
<div><br>
</div>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div><font face="monospace">OVMS# can can1 status</font></div>
<div><font face="monospace">CAN: can1</font></div>
<div><font face="monospace">Mode: Active</font></div>
<div><font face="monospace">Speed: 500000</font></div>
<div><font face="monospace">DBC: none</font></div>
<div><font face="monospace">Interrupts: 5557</font></div>
<div><font face="monospace">Rx pkt: 5548</font></div>
<div><font face="monospace">Rx err: 0</font></div>
<div><font face="monospace">Rx ovrflw: 0</font></div>
<div><font face="monospace">Tx pkt: 9</font></div>
<div><font face="monospace">Tx delays: 0</font></div>
<div><font face="monospace">Tx err: 0</font></div>
<div><font face="monospace">Tx ovrflw: 0</font></div>
<div><font face="monospace">Wdg Resets: 0</font></div>
<div><font face="monospace">Err Resets: 0</font></div>
<div><font face="monospace">Wdg Timer: 0
sec(s)</font></div>
<div><font face="monospace">Err flags: 0x00000000</font></div>
</blockquote>
</div>
<br>
<div class="gmail_quote">
<div class="gmail_attr">I put "ESP_LOGD(TAG, "BMWI3: got
SOC=%3.1f%%", soc);" in my code after parsing the SOC.</div>
<div class="gmail_attr"><br>
</div>
<div class="gmail_attr">But I'm not seeing that log message in
the console.</div>
<div class="gmail_attr"><br>
</div>
<div class="gmail_attr">Can I enable a trace of CAN1 (without
drowning my box!). Can I see what gets transmitted?</div>
<div class="gmail_attr"><br>
</div>
<div class="gmail_attr">Thanks,</div>
<div class="gmail_attr">Steve</div>
<div class="gmail_attr"><br>
</div>
<div dir="ltr" class="gmail_attr"><br>
</div>
<div dir="ltr" class="gmail_attr"><br>
</div>
<div dir="ltr" class="gmail_attr"><br>
</div>
<div dir="ltr" class="gmail_attr">On Sat, 12 Dec 2020 at
13:49, Michael Balzer <<a href="mailto:dexter@expeedo.de"
moz-do-not-send="true">dexter@expeedo.de</a>> wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px
0.8ex;border-left:1px solid
rgb(204,204,204);padding-left:1ex">
<div> Steve,<br>
<br>
use the <font face="monospace">vehicle_obdii</font>
module to get into OBD polling on the OVMS.<br>
<br>
You begin by defining the poll requests to be sent in at
least one array of type <font face="monospace">OvmsVehicle::poll_pid_t</font>.
A request consists of<br>
<ul>
<li>the transmission address (CAN ID), this may be a
specific address or the broadcast address 0x7df<br>
</li>
<li>the expected response address (CAN ID), or 0 in case
of a broadcast</li>
<li>the type of the request; OBD also calls this "mode",
e.g. 0x22, there are preprocessor definitions for all
supported types, e.g. 0x22 = <font face="monospace">VEHICLE_POLL_TYPE_OBDIIEXTENDED</font></li>
<li>optionally the PID to access (depending on the
request type, may be none / 8 bit / 16 bit)</li>
<li>the poll interval; this may be specified for up to 4
vehicle states (normally used to switch intervals
according to the car's operation mode, like sleeping /
driving / charging)</li>
<li>optionally the CAN bus to use for the request<br>
</li>
</ul>
For your example of polling the SOC, this would be:<br>
<ul>
<li>transmission address:<font face="monospace"> 0x6F1</font></li>
<li>response address: <font face="monospace">0x607</font></li>
<li>type: <font face="monospace">0x22</font> or <font
face="monospace">VEHICLE_POLL_TYPE_OBDIIEXTENDED</font></li>
<li>PID: <font face="monospace">0xDDBC</font></li>
<li>poll interval: as you like, e.g. <font
face="monospace">{ 0, 10, 60 }</font> -- assuming
for sleeping, driving, charging<br>
</li>
</ul>
End the array with an all zero entry. The poller will
automatically loop over the list.<br>
<br>
Call <font face="monospace">OvmsVehicle::PollSetPidList()</font>
to set the array to be used, call <font face="monospace">OvmsVehicle::PollSetState()</font>
to set the vehicle state (defining the poll intervals).<br>
<br>
Override <font face="monospace">OvmsVehicle::IncomingPollReply()</font>
with your result processing. The method will be called by
the framework for each response part. The framework also
supplies polling state variables you can use (see <font
face="monospace">vehicle.h</font>). A typical pattern to
collect multiple frames is:<br>
<br>
<font face="monospace">void
OvmsVehicleRenaultTwizy::IncomingPollReply(<br>
canbus* bus, uint16_t type, uint16_t pid, uint8_t*
data, uint8_t length, uint16_t mlremain)<br>
{<br>
string& rxbuf = twizy_obd_rxbuf;<br>
<br>
// init / fill rx buffer:<br>
if (m_poll_ml_frame == 0) {<br>
rxbuf.clear();<br>
rxbuf.reserve(length + mlremain);<br>
}<br>
rxbuf.append((char*)data, length);<br>
if (mlremain)<br>
return;<br>
<br>
// complete:<br>
switch (pid) {<br>
…<br>
</font><br>
This pattern collects the payload in a string buffer,
regardless of the length.<br>
<br>
Decoding and converting the payload to metrics is up to
you, but normally is simple.<br>
<br>
For your example:<br>
<br>
<font face="monospace"> …<br>
// complete:<br>
switch (pid) {<br>
case </font><font face="monospace">0xDDBC: {<br>
unsigned int soc_raw = ((unsigned int)rxbuf[0]
<< 8) | (unsigned int)rxbuf[1];<br>
float soc = soc_raw / 10.0f;<br>
StdMetrics.ms_v_bat_soc->SetValue(soc);<br>
break;<br>
}<br>
</font><br>
<br>
On your question:<br>
<br>
<blockquote type="cite"><font face="monospace">2020-11-15
10:34:36.474 <-- 607␣F1␣03␣7F␣22␣78␣⏎ //
this is some unrelated packet?<br>
</font></blockquote>
<br>
Actually it's related, it's the first reply of the device
and means "I'm busy, but stand by, results will come
soon". The poller handles these.<br>
<br>
If you want to follow the poller operation, activate debug
logging for the vehicle module: <font face="monospace">log
level debug vehicle</font><br>
<br>
There's more on the poller, but that should get you going.<br>
<br>
Regards,<br>
Michael<br>
<br>
<br>
<div>Am 12.12.20 um 10:19 schrieb Steve Davies:<br>
</div>
<blockquote type="cite">
<div dir="ltr"><img
src="https://api2.activeinboxhq.com/1.0/anon/rr/3cfa1c481eaefb97aafad7ab1f4ae783"
style="display: none;" moz-do-not-send="true"
width="1" height="1">Hi,
<div><br>
</div>
<div>Can I ask someone to help me get started with
pulling data off the OBD-2 on the I3.</div>
<div><br>
</div>
<div>I have info on what works via an LM327 and I know
the pids, but it would help me for some pointers as
to how to do it on the OVMS.</div>
<div><br>
</div>
<div>You know - the goal to get the first one working.</div>
<div><br>
</div>
<div>Here's an example definition - the SOC of the
main battery. This is extracted from decompiling a
definition file for ediasbas/ediasblib:</div>
<div><br>
</div>
<div>(The "_EN" text is translated using Google cloud
translate so the German is the original)</div>
<div><br>
</div>
<div>The "job" is defined like so:</div>
<div><br>
</div>
<div> <font face="monospace"> {<br>
"SERVICE" : "22",<br>
"ID" : "0xDDBC",<br>
"DIV" : "-",<br>
"INFO" : "aktueller Anzeige Soc",<br>
"RES_TABELLE" : "RES_0xDDBC_D",<br>
"ARG_TABELLE" : "-",<br>
"EINHEIT" : "-",<br>
"DATENTYP" : "-",<br>
"ARG" : "ANZEIGE_SOC",<br>
"LABEL" : "-",<br>
"ADD" : "-",<br>
"MUL" : "-",<br>
"INFO_EN" : "current advertisement
Soc",<br>
"L/H" : "-",<br>
"RESULTNAME" : "-",<br>
"NAME" : "-",<br>
"SG_ADR" : "-"<br>
},<br>
</font></div>
<div><br>
</div>
<div>The "results" are defined like so:</div>
<div><br>
</div>
<div><font face="monospace"> "RES_0XDDBC_D" : [<br>
{<br>
"DIV" : "10.0",<br>
"INFO_EN" : "current advertisement
Soc",<br>
"DATENTYP" : "unsigned int",<br>
"EINHEIT" : "%",<br>
"INFO" : "aktueller Anzeige Soc",<br>
"MASKE" : "-",<br>
"RESULTNAME" :
"STAT_ANZEIGE_SOC_WERT",<br>
"L/H" : "high",<br>
"MUL" : "1.0",<br>
"ADD" : "0.0",<br>
"NAME" : "-"<br>
},<br>
{<br>
"NAME" : "-",<br>
"ADD" : "0.0",<br>
"MUL" : "1.0",<br>
"L/H" : "high",<br>
"RESULTNAME" :
"STAT_MAXIMALE_ANZEIGE_SOC_WERT",<br>
"INFO" : "obere Grenze des Anzeige
Soc",<br>
"MASKE" : "-",<br>
"INFO_EN" : "upper limit of the
display Soc",<br>
"EINHEIT" : "%",<br>
"DATENTYP" : "unsigned int",<br>
"DIV" : "10.0"<br>
},<br>
{<br>
"RESULTNAME" :
"STAT_MINIMALE_ANZEIGE_SOC_WERT",<br>
"L/H" : "high",<br>
"MUL" : "1.0",<br>
"NAME" : "-",<br>
"ADD" : "0.0",<br>
"DIV" : "10.0",<br>
"INFO_EN" : "lower limit of the
display Soc",<br>
"EINHEIT" : "%",<br>
"DATENTYP" : "unsigned int",<br>
"INFO" : "untere Grenze des Anzeige
Soc",<br>
"MASKE" : "-"<br>
}<br>
],<br>
</font></div>
<div><br>
</div>
<div>I read it that three unsigned ints (16 bits each)
are returned.</div>
<div>Each is divided by 10 to return a "%".</div>
<div><br>
</div>
<div><br>
</div>
<div>I traced an app that can retrieves this parameter
using an LM327 based OBD2 interface.</div>
<div><br>
</div>
<div>That app initialises the LM327 like so:</div>
<div><br>
</div>
<div><font face="monospace">2020-11-15 10:34:28.831
--> ATD Return all settings to default<br>
2020-11-15 10:34:28.849 --> ATE0 Disable
command echo<br>
2020-11-15 10:34:28.861 --> ATH1 Show CAN
message headers<br>
2020-11-15 10:34:28.875 --> ATAL Allow long
messages<br>
2020-11-15 10:34:28.887 --> ATPBE101 Set
programmable param 0x2c to 0xE1, 0x2d to 0x01<br>
- 2c=0xE1:<br>
- 11 bit IDs<br>
- variable data-length code<br>
- 11 or 29 bit received IDs<br>
- use data format ISO 15765-4 (CAN)<br>
- 2d=0x01<br>
- Use rate divisor of 1<br>
2020-11-15 10:34:28.901 --> ATSPB Use protocol
USER1 CAN (as set above I think)<br>
2020-11-15 10:34:28.949 --> ATBI Bypass
initialisation - apparently a bad idea... ?<br>
2020-11-15 10:34:28.964 --> ATSH6F1 Set header
bytes to 0x6F1 ( 0x06F1 ? )<br>
2020-11-15 10:34:28.978 --> ATAT0 Disable
adaptive timing - wait up to ATSF time<br>
2020-11-15 10:34:28.992 --> ATSTFF Maximum wait</font><br>
</div>
<div><font face="monospace"><br>
</font></div>
<div><br>
</div>
<div><font face="arial, sans-serif">Then, when it
fetches this PID it does the following:</font></div>
<div><font face="monospace"><br>
</font></div>
<div><font face="monospace">2020-11-15 10:34:35.101
--> ATCRA607⏎ // Listen
for 0x607<br>
2020-11-15 10:34:35.114 <-- OK⏎⏎><br>
2020-11-15 10:34:35.115 --> ATCEA07⏎
// "extended address" 0x07 [matches
607?]<br>
2020-11-15 10:34:35.127 <-- OK⏎⏎><br>
2020-11-15 10:34:35.129 --> ATFCSH6F1⏎
// Flow control header<br>
2020-11-15 10:34:35.141 <-- OK⏎⏎><br>
2020-11-15 10:34:35.143 --> ATFCSD07300800⏎
// Flow control data<br>
2020-11-15 10:34:35.156 <-- OK⏎⏎><br>
2020-11-15 10:34:35.157 --> ATFCSM1⏎
// Flow control mode<br>
2020-11-15 10:34:35.170 <-- OK⏎⏎><br>
<br>
2020-11-15 10:34:36.367 --> 22␣DD␣BC⏎
// asking for "extended" PID 0xDDBC<br>
2020-11-15 10:34:36.474 <--
607␣F1␣03␣7F␣22␣78␣⏎ // this is some
unrelated packet?<br>
2020-11-15 10:34:36.539 <--
607␣F1␣10␣09␣62␣DD␣BC␣02␣4C␣⏎ // reply -->
0x24C = 588 = 58.8 SOC<br>
607␣F1␣21␣03␣A6␣00␣69␣FF␣FF␣⏎
// 0x03A6 = = 93.4%, 0x0069 = 10.5%<br>
2020-11-15 10:34:37.598 <-- ⏎><br>
<br>
Remember the LM327 takes the sent bytes and wraps
with into a full CAN message - though I'm not sure
exactly how that comes out - I presume that
"extended address" goes in somewhere.<br>
<br>
--> 22 DD BC is the PID<br>
<-- 2 part reply. First has the SOC. Second
has 0x03A6 (934) and 0x0069 (105)<br>
<br>
First int is 588 or 58.8% which is the physical
SOC of the battery.<br>
934 is 93.4 which is the physical SOC level which
the car displays as "100%" (i3 keeps some headroom
"reserved").<br>
105 is 10.5 which is the physical SOC level that
the car displays as 0%.<br>
</font></div>
<div><font face="monospace"><br>
</font></div>
<div><font face="monospace">I'd appreciate some help
to give me a head-start to be able to retrieve
this attribute on the OVMS box.</font></div>
<div><font face="monospace"><br>
</font></div>
<div><font face="monospace">Thanks,</font></div>
<div><font face="monospace">Steve</font></div>
<div><font face="monospace"><br>
</font></div>
</div>
<br>
<fieldset></fieldset>
<pre>_______________________________________________
OvmsDev mailing list
<a href="mailto:OvmsDev@lists.openvehicles.com" target="_blank" moz-do-not-send="true">OvmsDev@lists.openvehicles.com</a>
<a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" target="_blank" moz-do-not-send="true">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a>
</pre>
</blockquote>
<br>
<pre cols="72">--
Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal
Fon 02333 / 833 5735 * Handy 0176 / 206 989 26</pre>
</div>
_______________________________________________<br>
OvmsDev mailing list<br>
<a href="mailto:OvmsDev@lists.openvehicles.com"
target="_blank" moz-do-not-send="true">OvmsDev@lists.openvehicles.com</a><br>
<a
href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev"
rel="noreferrer" target="_blank" moz-do-not-send="true">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a><br>
</blockquote>
</div>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<pre class="moz-quote-pre" wrap="">_______________________________________________
OvmsDev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:OvmsDev@lists.openvehicles.com">OvmsDev@lists.openvehicles.com</a>
<a class="moz-txt-link-freetext" href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a>
</pre>
</blockquote>
<br>
<pre class="moz-signature" cols="72">--
Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal
Fon 02333 / 833 5735 * Handy 0176 / 206 989 26</pre>
</body>
</html>