<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div dir="ltr">That’s good news. An easy change.</div><div dir="ltr"><br></div><div dir="ltr">Regarding performance, I guess the vast majority is the asymmetric crypto during the initial rsa / ec negotiation. That is brutal even for desktop/server class stuff. Once the session is established, bulk symmetric crypto takes over and that is orders of magnitude faster.</div><div dir="ltr"><br></div><div dir="ltr">Session tickets would help for multiple requests, and not too hard to implement. They avoid the expensive asymmetric crypto for subsequent connections to the same server. But the majority of our stuff is reasonably long term connections.</div><div dir="ltr"><br></div><div dir="ltr">For the symmetric crypto part, we could also restrict the ciphers to those we have acceleration enabled in mbedtls, but that might impact compatibility.</div><div dir="ltr"><br></div><div dir="ltr">I haven’t had much chance to test big transfers yet. The OTA stuff is the most obvious - but that doesn’t currently use mongoose. Need to change the ovms_net and ovms_http classes to use mongoose wrapped in the blocking framework.</div><div dir="ltr"><br></div><div dir="ltr">Regards, Mark</div><div dir="ltr"><br><blockquote type="cite">On 14 Feb 2020, at 8:18 PM, Michael Balzer <dexter@expeedo.de> wrote:<br><br></blockquote></div><blockquote type="cite"><div dir="ltr">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Mark,<br>
<br>
it's really a memory issue, but I wouldn't have expected that,
given…<br>
<blockquote><tt>OVMS# mo me</tt><br>
<tt>Free 8-bit 58944/271108, 32-bit 1900/27848, SPIRAM
3761072/4194252</tt><br>
</blockquote>
Switching to vehicle NONE gave me<br>
<blockquote><tt>OVMS# mo me</tt><br>
<tt>Free 8-bit 69124/271108, 32-bit 1900/27848, SPIRAM
3802648/4194252</tt><br>
</blockquote>
… and a working HTTP.Request with SSL (but it's sloooooow, see
below).<br>
<br>
I now did some more tests and could get it working with…<br>
<blockquote><tt>> CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y</tt><br>
</blockquote>
… so I assume we need to add that change to our default sdkconfig as
well.<br>
<br>
Regarding the performance, SSL connections are somewhere beteen
awful & unusable now. Test:<br>
<blockquote><tt>(function(){</tt><br>
<tt> var t0 = performance.now();</tt><br>
<tt> HTTP.Request({</tt><br>
<tt> url: <a class="moz-txt-link-rfc2396E" href="http://ovms.dexters-web.de/f/test.json">"http://ovms.dexters-web.de/f/test.json"</a>,</tt><br>
<tt> always: function() {</tt><br>
<tt> var t1 = performance.now();</tt><br>
<tt> print(this.url + " => " + (t1-t0).toFixed(0) + " ms,
body.length=" + this.response.body.length);</tt><br>
<tt> }</tt><br>
<tt> });</tt><br>
<tt>})();</tt><br>
</blockquote>
This gives me:<br>
<blockquote><tt>I (520500) script: [eval:7:]
<a class="moz-txt-link-freetext" href="http://ovms.dexters-web.de/f/test.json">http://ovms.dexters-web.de/f/test.json</a> => 267 ms,
body.length=13</tt><br>
<tt>I (550250) script: [eval:7:]
<a class="moz-txt-link-freetext" href="https://ovms.dexters-web.de/f/test.json">https://ovms.dexters-web.de/f/test.json</a> => 5347 ms,
body.length=13<br>
… up to …</tt><br>
<tt>I (68270) script: [eval:7:]
<a class="moz-txt-link-freetext" href="https://ovms.dexters-web.de/f/test.json">https://ovms.dexters-web.de/f/test.json</a> => 11930 ms,
body.length=13</tt><br>
</blockquote>
… regardless of actually using the CA verification or reverting to
"*".<br>
<br>
I don't know how much of this is TLS session init overhead. Do you
have better performance with the persistent V2 SSL connection?
Haven't had time to test that yet.<br>
<br>
Regards,<br>
Michael<br>
<br>
<br>
<br>
<div class="moz-cite-prefix">Am 14.02.20 um 10:08 schrieb Mark
Webb-Johnson:<br>
</div>
<blockquote type="cite" cite="mid:8417C4F5-10C2-4008-BA0C-0100DC2DE4ED@webb-johnson.net">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Michael,
<div class=""><br class="">
</div>
<div class="">I am getting:</div>
<div class=""><br class="">
</div>
<blockquote style="margin: 0 0 0 40px; border: none; padding:
0px;" class="">
<div class="">
<div class="">OVMS# script eval 'HTTP.Request({url: "<a href="http://dexters-web.de/f/test.json" class="" moz-do-not-send="true">http://dexters-web.de/f/test.json</a>",always:
function() { JSON.print(this, false); } });'</div>
<div class="">I (140781) script: [eval:1:] {"url":"<a href="https://dexters-web.de/f/test.json" class="" moz-do-not-send="true">https://dexters-web.de/f/test.json</a>","always":function
() { [ecmascript code]
},"redirectCount":1,"error":"","response":{"statusCode":200,"statusText":"OK","body":"{\"foo\":\"bar\"}","headers":[{"Date":"Fri,
14 Feb 2020 08:45:05 GMT"},{"Server":"Apache/2.2.15
(CentOS)"},{"Last-Modified":"Sun, 01 Dec 2019 20:36:31
GMT"},{"ETag":"\"73806cb-d-598aa6b0f7003\""},{"Accept-Ranges":"bytes"},{"Content-Length":"13"},{"Cache-Control":"max-age=0"},{"Expires":"Fri,
14 Feb 2020 08:45:05
GMT"},{"Content-Type":"application/json"}]}}</div>
<div class=""><br class="">
</div>
<div class="">OVMS# script eval 'HTTP.Request({url: "<a href="https://dexters-web.de/f/test.json" class="" moz-do-not-send="true">https://dexters-web.de/f/test.json</a>",always:
function() { JSON.print(this, false); } });'</div>
<div class="">I (169991) script: [eval:1:] {"url":"<a href="https://dexters-web.de/f/test.json" class="" moz-do-not-send="true">https://dexters-web.de/f/test.json</a>","always":function
() { [ecmascript code]
},"redirectCount":0,"error":"","response":{"statusCode":200,"statusText":"OK","body":"{\"foo\":\"bar\"}","headers":[{"Date":"Fri,
14 Feb 2020 08:45:34 GMT"},{"Server":"Apache/2.2.15
(CentOS)"},{"Last-Modified":"Sun, 01 Dec 2019 20:36:31
GMT"},{"ETag":"\"73806cb-d-598aa6b0f7003\""},{"Accept-Ranges":"bytes"},{"Content-Length":"13"},{"Cache-Control":"max-age=0"},{"Expires":"Fri,
14 Feb 2020 08:45:34
GMT"},{"Content-Type":"application/json"}]}}</div>
<div class=""><br class="">
</div>
<div class="">OVMS# metrics list version</div>
<div class="">m.version
3.2.010-15-g931ca3d3-dirty/factory/edge (build idf
v3.3-beta3-770-ge97f72ea2 Feb 13 2020 13:01:16)</div>
</div>
</blockquote>
<div class="">
<div><br class="">
</div>
<div>That seems correct to me.</div>
<div><br class="">
</div>
<div>Maybe increased ram usage for you? I your memory status ok?</div>
<div><br class="">
</div>
<div>The change I made to mongoose would only affect if the
ca_cert started with “-----“. Nothing else should have changed
(at least in that part). Maybe the increase of fragment size
to 16384 has impacted something?</div>
<div><br class="">
</div>
<div>
<blockquote type="cite" class=""><span style="caret-color:
rgb(0, 0, 0); color: rgb(0, 0, 0);" class="">I've seen you
set opts.ssl_server_name in server V2 & V3. This could
be left NULL for using the hostname before, is it now
necessary to set this?</span></blockquote>
<br class="">
</div>
<div>I think you are right. I hadn’t noticed that default
ca_cert != NULL, but server_name is null. I don’t think it is
necessary to set explicitly, but should not matter.</div>
<div><br class="">
</div>
<div>However, I have just noticed:</div>
</div>
<div><br class="">
</div>
<blockquote style="margin: 0 0 0 40px; border: none; padding:
0px;" class="">
<div class="">
<div>
<div><font class="" face="Andale Mono"><span style="font-style: normal; font-size: 14px;" class="">void
mg_ssl_if_conn_free(struct mg_connection *nc) {</span></font></div>
<div><font class="" face="Andale Mono"><span style="font-style: normal; font-size: 14px;" class="">
struct mg_ssl_if_ctx *ctx = (struct mg_ssl_if_ctx *)
nc->ssl_if_data;</span></font></div>
<div><font class="" face="Andale Mono"><span style="font-style: normal; font-size: 14px;" class="">
if (ctx == NULL) return;</span></font></div>
<div><font class="" face="Andale Mono"><span style="font-style: normal; font-size: 14px;" class="">
nc->ssl_if_data = NULL;</span></font></div>
<div><font class="" face="Andale Mono"><span style="font-style: normal; font-size: 14px;" class="">
MG_FREE(ctx->ssl_cert);</span></font></div>
<div><font class="" face="Andale Mono"><span style="font-style: normal; font-size: 14px;" class="">
MG_FREE(ctx->ssl_key);</span></font></div>
<div><font class="" face="Andale Mono"><span style="font-style: normal; font-size: 14px;" class="">
MG_FREE(ctx->ssl_ca_cert);</span></font></div>
<div><font class="" face="Andale Mono"><span style="font-style: normal; font-size: 14px;" class="">
MG_FREE(ctx->ssl_server_name);</span></font></div>
<div><font class="" face="Andale Mono"><span style="font-style: normal; font-size: 14px;" class="">
memset(ctx, 0, sizeof(*ctx));</span></font></div>
<div><font class="" face="Andale Mono"><span style="font-style: normal; font-size: 14px;" class="">
MG_FREE(ctx);</span></font></div>
<div><font class="" face="Andale Mono"><span style="font-style: normal; font-size: 14px;" class="">}</span></font></div>
</div>
</div>
</blockquote>
<div class="">
<div><br class="">
</div>
<div>Which is scary. But that seems to be the ’simplessl’
version of that function. There are two other ones, for
different SSL implementations, which seem to behave
differently. That monolithic mongoose.{h,c} is really
confusing to work through. Maybe I should look at their python
mechanism to pack/unpack from individual scripts and then try
to build a mongoose.{h,c} specific to our needs (without the
crud we don’t use such as openssl, simplessl)?</div>
<div><br class="">
</div>
<div>Regards, Mark.</div>
<div><br class="">
<blockquote type="cite" class="">
<div class="">On 14 Feb 2020, at 6:25 AM, Michael Balzer
<<a href="mailto:dexter@expeedo.de" class="" moz-do-not-send="true">dexter@expeedo.de</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8" class="">
<div class=""> Mark,<br class="">
<br class="">
something's wrong now with the Mongoose SSL support. I
could do this javascript call before (example from
scripting API doc):<br class="">
<br class="">
<tt class=""> HTTP.Request({</tt><tt class=""><br class="">
</tt><tt class=""> url: <a class="moz-txt-link-rfc2396E" href="https://dexters-web.de/f/test.json" moz-do-not-send="true">"https://dexters-web.de/f/test.json"</a>,</tt><tt class=""><br class="">
</tt><tt class=""> always: function() {
JSON.print(this, false); }</tt><tt class=""><br class="">
</tt><tt class=""> });</tt><br class="">
<br class="">
This now no longer works, neither with the previous
opts.ssl_ca_cert = "*":<br class="">
<br class="">
<tt class="">E (37350) mongoose: mg_ssl_if_mbed_err
0x3f85befc SSL error: -17040</tt><tt class=""><br class="">
</tt><tt class="">I (37410) script: [eval:3:] {"url":<a class="moz-txt-link-rfc2396E" href="https://dexters-web.de/f/test.json" moz-do-not-send="true">"https://dexters-web.de/f/test.json"</a>,"always":function
() { [ecmascript code]
},"redirectCount":0,"error":"SSL error"}</tt><br class="">
<br class="">
…nor with opts.ssl_ca_cert = MyOvmsTLS.GetTrustedList(),
it then sometimes fails with…<br class="">
<br class="">
<tt class="">{"url":<a class="moz-txt-link-rfc2396E" href="https://dexters-web.de/f/test.json" moz-do-not-send="true">"https://dexters-web.de/f/test.json"</a>,"always":function
() { [ecmascript code]
},"redirectCount":0,"error":"Failed to create SSL
session"}</tt><br class="">
<br class="">
…but mostly causes some kind of lockup (USB console not
responding) and / or wifi / mongoose restart:<br class="">
<br class="">
<tt class="">I (55980) wifi:
bcn_timout,ap_probe_send_start</tt><tt class=""><br class="">
</tt><tt class="">I (58480) wifi: ap_probe_send over,
resett wifi status to disassoc</tt><tt class=""><br class="">
</tt><tt class="">I (58480) wifi: state: run -> init
(c800)</tt><tt class=""><br class="">
</tt><tt class="">I (58490) wifi: pm stop, total sleep
time: 35296441 us / 53655320 us</tt><tt class=""><br class="">
</tt><tt class="">I (58490) wifi: new:<11,0>,
old:<11,2>, ap:<11,2>, sta:<11,0>,
prof:11</tt><tt class=""><br class="">
</tt><tt class="">E (58490) mongoose:
mg_ssl_if_mbed_err 0x3f85dd64 SSL error: -1</tt><tt class=""><br class="">
</tt><tt class="">D (58520) events:
Signal(server.web.socket.closed)</tt><tt class=""><br class="">
</tt><tt class="">I (58580) script: [eval:3:] {"url":<a class="moz-txt-link-rfc2396E" href="https://dexters-web.de/f/test.json" moz-do-not-send="true">"https://dexters-web.de/f/test.json"</a>,"always":function
() { [ecmascript code]
},"redirectCount":0,"error":"SSL error"}</tt><tt class=""><br class="">
</tt><tt class="">W (58600) wifi: Haven't to connect to
a suitable AP now!</tt><tt class=""><br class="">
</tt><tt class="">W (58630) wifi: Haven't to connect to
a suitable AP now!</tt><tt class=""><br class="">
</tt><tt class="">W (58640) wifi: Haven't to connect to
a suitable AP now!</tt><tt class=""><br class="">
</tt><tt class="">W (58660) wifi: Haven't to connect to
a suitable AP now!</tt><tt class=""><br class="">
</tt><tt class="">W (58680) wifi: Haven't to connect to
a suitable AP now!</tt><tt class=""><br class="">
</tt><tt class="">W (58700) wifi: Haven't to connect to
a suitable AP now!</tt><tt class=""><br class="">
</tt><tt class="">W (58720) wifi: Haven't to connect to
a suitable AP now!</tt><tt class=""><br class="">
</tt><tt class="">W (58740) wifi: Haven't to connect to
a suitable AP now!</tt><tt class=""><br class="">
</tt><tt class="">D (58770) events: Signal(system.event)</tt><tt class=""><br class="">
</tt><tt class="">D (58780) events:
Signal(system.wifi.sta.disconnected)</tt><br class="">
<br class="">
<br class="">
I've seen you set opts.ssl_server_name in server V2
& V3. This could be left NULL for using the hostname
before, is it now necessary to set this?<br class="">
<br class="">
Regards,<br class="">
Michael<br class="">
<br class="">
<br class="">
<div class="moz-cite-prefix">Am 13.02.20 um 08:26
schrieb Mark Webb-Johnson:<br class="">
</div>
<blockquote type="cite" cite="mid:FA48611F-5376-4758-A701-A4F901B83802@webb-johnson.net" class="">
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8" class="">
<div class=""><br class="">
</div>
And #2 now done. To add to the trusted CA list we can
now add the CA into firmware (like the 3 already
there), or put the PEM formatted certificate in
/store/trustedca on the module itself. A set of
commands (like ’tls trusted reload’, ’tls trusted
list’, etc) are also now provided to help management.
<div class=""><br class="">
</div>
<div class="">I’ve also added a short document to the
user guide to explain this.</div>
<div class=""><br class="">
</div>
<div class="">Regards, Mark.<br class="">
<div class=""><br class="">
<blockquote type="cite" class="">
<div class="">On 12 Feb 2020, at 3:25 PM, Mark
Webb-Johnson <<a href="mailto:mark@webb-johnson.net" class="" moz-do-not-send="true">mark@webb-johnson.net</a>>
wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" class="">
<div style="word-wrap: break-word;
-webkit-nbsp-mode: space; line-break:
after-white-space;" class="">I managed to
get quite a lot done last night, and just
committed my changes. Current status:
<div class=""><br class="">
</div>
<div class="">#1 is done. An extension had
to be made to mongoose to support this, so
please update submodules. I’ve added the
trusted CAs for openvehicles, dexters
(letsencrypt) and pushover.</div>
<div class=""><br class="">
</div>
<div class="">#3 is done. A couple of lines
of code. It is enabled by ‘config set
server.v2 tls yes’.</div>
<div class=""><br class="">
</div>
<div class=""><span style="caret-color:
rgb(0, 0, 0);" class="">#4 is done. A
couple of lines of code. It is enabled
by ‘config set server.v3 tls yes’.</span></div>
<div class=""><font class=""><span style="caret-color: rgb(0, 0, 0);" class=""><br class="">
</span></font></div>
<div class=""><font class=""><span style="caret-color: rgb(0, 0, 0);" class="">#5 is done, and live on <a href="http://api.openvehicles.com/" class="" moz-do-not-send="true">api.openvehicles.com</a>.</span></font></div>
<div class=""><font class=""><span style="caret-color: rgb(0, 0, 0);" class=""><br class="">
</span></font></div>
<div class=""><font class=""><span style="caret-color: rgb(0, 0, 0);" class="">#8 can start when ready. Have
a look at the ovms_server_v[23] code
for an example - it is literally a
couple of lines to be added.</span></font></div>
<div class=""><font class=""><span style="caret-color: rgb(0, 0, 0);" class=""><br class="">
</span></font></div>
<div class=""><font class="">I did find a
few servers that didn’t support the
segment size negotiation option in SSL
that we were relying on (including
mosquitto!). So had to change my
sdkconfig to:</font></div>
<div class=""><font class=""><br class="">
</font></div>
<blockquote style="margin: 0 0 0 40px;
border: none; padding: 0px;" class="">
<div class=""><font class="">CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=16384</font></div>
</blockquote>
<div class=""><font class=""><br class="">
</font></div>
<div class=""><font class="">I suggest you
do the same for best compatibility.</font></div>
<div class=""><font class=""><br class="">
</font></div>
<div class=""><font class=""><span style="caret-color: rgb(0, 0, 0);" class="">The rest is pending. I will
work on #2 next, then move on to the
iOS App.</span></font></div>
<div class=""><font class=""><span style="caret-color: rgb(0, 0, 0);" class=""><br class="">
</span></font></div>
<div class=""><font class=""><span style="caret-color: rgb(0, 0, 0);" class="">Regards, Mark.<br class="">
</span></font>
<div class=""><br class="">
<blockquote type="cite" class="">
<div class="">On 10 Feb 2020, at 11:24
AM, Mark Webb-Johnson <<a href="mailto:mark@webb-johnson.net" class="" moz-do-not-send="true">mark@webb-johnson.net</a>>
wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" class="">
<div style="word-wrap: break-word;
-webkit-nbsp-mode: space;
line-break: after-white-space;" class="">
<div class=""><br class="">
</div>
<div class="">Given that we use
the mongoose library for most of
our stuff, adding SSL support
should not be hard. This would
finally bring strong encryption
and server side authentication.
Given the number of attacks now
on IoT devices that would not be
a bad thing.</div>
<div class=""><br class="">
</div>
<div class="">I think what we need
is:</div>
<div class=""><br class="">
</div>
<div class="">
<ol class="MailOutline">
<li class="">A set of helper
functions to make it easier
for components to use SSL.
Build on top of mongoose.<br class="">
<br class="">
</li>
<li class="">A way to manage a
list of trusted Certificate
Authorities, including
adding to the trusted list
via:<br class="">
</li>
<ul class="">
<li class=""><span style="caret-color:
rgb(0, 0, 0);" class="">Components
providing Certificate
Authorities in firmware.</span></li>
<li class=""><span style="caret-color:
rgb(0, 0, 0);" class="">Certificate
Authorities in
configuration.<br class="">
<br class="">
</span></li>
</ul>
<li class="">Extensions to
ovms_server_v2 to support an
SSL connection option.<br class="">
<br class="">
</li>
<li class="">Extensions to
ovms_server_v3 to support an
SSL connection option.<br class="">
<br class="">
</li>
<li class="">Extensions to the
Ovms Server v2 code to
support an SSL connection
listener.<br class="">
<br class="">
</li>
<li class="">Extensions to the
iOS App to support an SSL
connection option.<br class="">
<br class="">
</li>
<li class=""><span style="caret-color: rgb(0,
0, 0);" class="">Extensions
to the Android App to
support an SSL connection
option.</span><br class="">
<br class="">
</li>
<li class="">Migration of any
components already
supporting SSL to this new
standardised approach.<br class="">
<br class="">
</li>
<li class="">Then we can open
up the discussion of the
whole thing of passwords. We
have far too many of these
at the moment (user
account+password, vehicle
ID, server password, module
password, hologram
account+password, etc). Once
we have an encrypted
connection, we don’t need to
use the password for
encryption, but merely for
authentication. That
simplifies things, as we can
perhaps just use the user
account+password for most
things (giving access to all
vehicles registered under
that user account - in a
similar way to MQTT does it
already for ovms_server_v3).</li>
</ol>
</div>
<div class=""><br class="">
</div>
<div class="">I will take on the
majority of this project. I can
do #1, #2, #3, #4, #5, and #6).</div>
<div class=""><br class="">
</div>
<div class="">If anyone has any
feedback on requirements, please
let me know.</div>
<div class=""><br class="">
</div>
<div class="">Regards, Mark.</div>
<div class=""><br class="">
</div>
</div>
_______________________________________________<br class="">
OvmsDev mailing list<br class="">
<a href="mailto:OvmsDev@lists.openvehicles.com" class="" moz-do-not-send="true">OvmsDev@lists.openvehicles.com</a><br class="">
<a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" class="" moz-do-not-send="true">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a><br class="">
</div>
</blockquote>
</div>
<br class="">
</div>
</div>
_______________________________________________<br class="">
OvmsDev mailing list<br class="">
<a href="mailto:OvmsDev@lists.openvehicles.com" class="" moz-do-not-send="true">OvmsDev@lists.openvehicles.com</a><br class="">
<a class="moz-txt-link-freetext" href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" moz-do-not-send="true">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a><br class="">
</div>
</blockquote>
</div>
<br class="">
</div>
<br class="">
<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" moz-do-not-send="true">OvmsDev@lists.openvehicles.com</a>
<a class="moz-txt-link-freetext" href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" moz-do-not-send="true">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a>
</pre>
</blockquote>
<br class="">
<pre class="moz-signature" cols="160">--
Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal
Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
</pre>
</div>
_______________________________________________<br class="">
OvmsDev mailing list<br class="">
<a href="mailto:OvmsDev@lists.openvehicles.com" class="" moz-do-not-send="true">OvmsDev@lists.openvehicles.com</a><br class="">
<a class="moz-txt-link-freetext" href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a><br class="">
</div>
</blockquote>
</div>
<br class="">
</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="160">--
Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal
Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
</pre>
<span>_______________________________________________</span><br><span>OvmsDev mailing list</span><br><span>OvmsDev@lists.openvehicles.com</span><br><span>http://lists.openvehicles.com/mailman/listinfo/ovmsdev</span><br></div></blockquote></body></html>