<div dir="ltr"><div dir="ltr"><a href="https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/pull/771">https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/pull/771</a><br><div><br></div><div>I'm hoping this P/R is ok in this form (made of 5 separate commits).</div><div><br></div><div>I will have a look at implementing the "user" unit code. The base for how it would work is already a part of the above pull request. I'll just look at the module configuration for distance.</div><div><br></div><div>The 'power consumption' is one where it's not just a check-box.. there're 5 possible choice!</div><div><br></div><div>I should also add 'bar' for pressure given that for some reason that's still a thing people want.</div><div><br></div><div>//.ichael</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, 12 Nov 2022 at 16:24, Michael Balzer <<a href="mailto:dexter@expeedo.de">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>
I think this is pretty decent & complete now.<br>
<br>
I also like the approach of the 'user' unit code. Moving all user
unit prefs into the module configuration is an old todo. Currently
only the distance unit is defined at the module side, temperature
and pressure are App prefs.<br>
<br>
Regards,<br>
Michael<br>
<br>
<br>
<div>Am 11.11.22 um 09:54 schrieb Michael
Geddes:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Ok - so here's what I have implemented for Duktape
and Metrics. (I added IsDefined() as well).
<div>Any thoughts on this?<br>
<div><br>
<div>Noting</div>
<div> OvmsMetrics.Float( {metric} ) -> Outputs metric
as float (same)</div>
<div> OvmsMetrics.Float( {metric}, {unit}) -> Outputs
metric as float converted to given unit (new)</div>
<div> OvmsMetrics.Value( {metric} ) -> Outputs Metric
in native value (same)</div>
<div> OvmsMetrics.Value( {metric} , false) -> Outputs
Metric as string and no units (same) </div>
OvmsMetrics.Value( {metric} , {unit}) -> Outputs
Metric converted to given unit as native value. (new)
<div>
OvmsMetrics.Value( {metric} , {unit}, false ) ->
Outputs Metric converted to given unit as string including
any unit specifier. (new)
<div>also OvmsMetric.GetValues( {metric} [,{unit}] [,
{converted} ] ) Adds similar behaviour to Value()
above.</div>
<div>also the special units '<b>imperial</b>' and '<b>metric</b>'
will convert to the associated imperial / metric version
of the units as appropriate.</div>
<div><br>
<div><font face="monospace">(function() {<br>
dump = function (metric) { print( metric+ "
["+(typeof metric)+"]\n" ); }<br>
dump_obj = function (obj ) {<br>
print('--- Object ----\n')<br>
for (var k in obj) {<br>
xk = obj[k];<br>
print( k+':'+ xk + ' ['+typeof xk+ "]\n");<br>
}<br>
}<br>
dump(OvmsMetrics.Value("xiq.v.trip.consumption"));<br>
dump(OvmsMetrics.Value("xiq.v.trip.consumption",
false));<br>
dump(OvmsMetrics.Value("xiq.v.trip.consumption","kmpkwh"));<br>
dump(OvmsMetrics.Value("xiq.v.trip.consumption",
"mipkwh", false));<br>
dump(OvmsMetrics.AsFloat("xiq.v.trip.consumption"));<br>
dump(OvmsMetrics.AsFloat("xiq.v.trip.consumption","kmpkwh"));<br>
dump(OvmsMetrics.Value("xiq.v.trip.consumption","imperial"))<br>
dump(OvmsMetrics.Value("xiq.v.trip.consumption","imperial",
false))<br>
dump_obj(OvmsMetrics.GetValues("trip", "metric"))<br>
dump_obj(OvmsMetrics.GetValues("trip",
"imperial", false))<br>
})();<br>
</font></div>
<div><br>
</div>
<div>With this output:</div>
<div>
<div>
<pre id="m_-138117451584655546m_5484224439251412587gmail-output" style="box-sizing:border-box;overflow:auto;font-family:ui-monospace,"Cascadia Mono","Segoe UI Mono",Hack,"Source Code Pro","Roboto Mono",Menlo,Monaco,Consolas,monospace;font-size:13px;padding:9.5px;margin-top:0px;margin-bottom:10px;line-height:1.42857;color:rgb(0,34,0);word-break:break-all;background-color:rgb(245,245,245);border:1px solid rgb(204,204,204);border-radius:4px;height:406px;white-space:pre-wrap">19.2308 [number]
19.2308 [string]
5.2 [number]
3.23112mi/kWh [string]
19.2308 [number]
5.2 [number]
309.49 [number]
309.49Wh/mi [string]
--- Object ----
v.p.trip:13 [number]
xiq.e.trip:0 [number]
xiq.e.trip.energy.recuperated:0 [number]
xiq.e.trip.energy.used:0 [number]
xiq.v.trip.consumption:19.2308 [number]
--- Object ----
v.p.trip:8.07781M [string]
xiq.e.trip:0M [string]
xiq.e.trip.energy.recuperated:0kWh [string]
xiq.e.trip.energy.used:0kWh [string]
xiq.v.trip.consumption:309.49Wh/mi [string]</pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Wed, 9 Nov 2022 at 05:47,
Michael Geddes <<a href="mailto:frog@bunyip.wheelycreek.net" target="_blank">frog@bunyip.wheelycreek.net</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 dir="ltr">Yeah - I like HasValue. I implemented
IsDefined() but I will rename it.. that's a much clearer
name.
<div><br>
</div>
<div>Another thought. How about if we did this (but also
with GetValues() as well - see the special values below) </div>
<div><br>
<div>OvmsMetrics.Value("xiq.v.trip.consumption", true)
-> <span style="background-color:rgb(245,245,245);color:rgb(0,34,0);font-family:ui-monospace,"Cascadia Mono","Segoe UI Mono",Hack,"Source Code Pro","Roboto Mono",Menlo,Monaco,Consolas,monospace;font-size:13px;white-space:pre-wrap">17.0582</span><span style="background-color:rgb(245,245,245);color:rgb(0,34,0);font-family:ui-monospace,"Cascadia Mono","Segoe UI Mono",Hack,"Source Code Pro","Roboto Mono",Menlo,Monaco,Consolas,monospace;font-size:13px;white-space:pre-wrap"> (Number)</span><br>
</div>
<div>
<div>OvmsMetrics.Value("xiq.v.trip.consumption",
false) -> <span style="background-color:rgb(245,245,245);color:rgb(0,34,0);font-family:ui-monospace,"Cascadia Mono","Segoe UI Mono",Hack,"Source Code Pro","Roboto Mono",Menlo,Monaco,Consolas,monospace;font-size:13px;white-space:pre-wrap">17.0582</span><span style="background-color:rgb(245,245,245);color:rgb(0,34,0);font-family:ui-monospace,"Cascadia Mono","Segoe UI Mono",Hack,"Source Code Pro","Roboto Mono",Menlo,Monaco,Consolas,monospace;font-size:13px;white-space:pre-wrap"> (String)</span></div>
</div>
</div>
<div>OvmsMetrics.Value("xiq.v.trip.consumption", "mipkwh",
true) -> <span style="background-color:rgb(245,245,245);color:rgb(0,34,0);font-family:ui-monospace,"Cascadia Mono","Segoe UI Mono",Hack,"Source Code Pro","Roboto Mono",Menlo,Monaco,Consolas,monospace;font-size:13px;white-space:pre-wrap">3.64264</span><span style="background-color:rgb(245,245,245);color:rgb(0,34,0);font-family:ui-monospace,"Cascadia Mono","Segoe UI Mono",Hack,"Source Code Pro","Roboto Mono",Menlo,Monaco,Consolas,monospace;font-size:13px;white-space:pre-wrap"> (Number)</span><br>
</div>
<div>OvmsMetrics.Value("xiq.v.trip.consumption", "mipkwh",
false) -> <span style="background-color:rgb(245,245,245);color:rgb(0,34,0);font-family:ui-monospace,"Cascadia Mono","Segoe UI Mono",Hack,"Source Code Pro","Roboto Mono",Menlo,Monaco,Consolas,monospace;font-size:13px;white-space:pre-wrap">3.64264Mi/kWh</span><span style="background-color:rgb(245,245,245);color:rgb(0,34,0);font-family:ui-monospace,"Cascadia Mono","Segoe UI Mono",Hack,"Source Code Pro","Roboto Mono",Menlo,Monaco,Consolas,monospace;font-size:13px;white-space:pre-wrap"> (String)</span><br>
</div>
<div> OvmsMetrics.Value("xiq.v.trip.consumption", "native",
false) -> <span style="font-size:13px;background-color:rgb(245,245,245);color:rgb(0,34,0);font-family:ui-monospace,"Cascadia Mono","Segoe UI Mono",Hack,"Source Code Pro","Roboto Mono",Menlo,Monaco,Consolas,monospace;white-space:pre-wrap">17.0582km/kWh</span><span style="font-size:13px;background-color:rgb(245,245,245);color:rgb(0,34,0);font-family:ui-monospace,"Cascadia Mono","Segoe UI Mono",Hack,"Source Code Pro","Roboto Mono",Menlo,Monaco,Consolas,monospace;white-space:pre-wrap"> (String)</span> </div>
<div><br>
</div>
<div>and</div>
<div>
<div>OvmsMetrics.Value("xiq.v.trip.consumption",
"imperial", false) -> <span style="background-color:rgb(245,245,245);color:rgb(0,34,0);font-family:ui-monospace,"Cascadia Mono","Segoe UI Mono",Hack,"Source Code Pro","Roboto Mono",Menlo,Monaco,Consolas,monospace;font-size:13px;white-space:pre-wrap">3.64264Mi/kWh</span><span style="background-color:rgb(245,245,245);color:rgb(0,34,0);font-family:ui-monospace,"Cascadia Mono","Segoe UI Mono",Hack,"Source Code Pro","Roboto Mono",Menlo,Monaco,Consolas,monospace;font-size:13px;white-space:pre-wrap"> (String)</span><br>
</div>
</div>
<div><br>
</div>
<div>I have already implemented the special values 'native'
(existing), 'imperial' and 'metric'. </div>
<div><br>
</div>
<div>I was also thinking that in the future you could have
'user'. Where for each group of values:</div>
<div>'temperature', 'distance', 'shortdistance', 'power'
etc.. you could have a user preference. I probably won't
implement it now,.but it could be cool that any UI could
just ask for the user defined units (rather than having a
separate choice).</div>
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
<div>//.ichael</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Tue, 8 Nov 2022 at
21:57, Mark Webb-Johnson <<a href="mailto:mark@webb-johnson.net" target="_blank">mark@webb-johnson.net</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>
<div dir="ltr" style="color:rgb(0,0,0)">Or perhaps
something more specific?</div>
<div dir="ltr" style="color:rgb(0,0,0)"><br>
</div>
<div dir="ltr" style="color:rgb(0,0,0)"> HasValue()</div>
<div dir="ltr" style="color:rgb(0,0,0)"><br>
</div>
<div dir="ltr" style="color:rgb(0,0,0)">Mark</div>
<div><br>
<blockquote type="cite">
<div>On 8 Nov 2022, at 9:01 PM, Michael Balzer <<a href="mailto:dexter@expeedo.de" target="_blank">dexter@expeedo.de</a>>
wrote:</div>
<br>
<div>
<div>
<div>
<div>Signed PGP part</div>
<div>
<div> That's basically a good approach, but
be aware 'IsDefined()' has an ambiguous
meaning here, as with the API stem
"OvmsMetrics" it would naturally be
expected to mean "is this metric defined",
not "does this metric have a defined
value".<br>
<br>
An undefined metric currently can be
derived from 'Values()' returning
undefined, but that's more an undocumented
side effect than intended.<br>
<br>
Maybe 'GetDefined()' could be a better
name, leveraging this behaviour, i.e.
returning 'undefined' for an actually
undefined metric, and 'null' for a defined
metric without a value.<br>
<br>
Regards,<br>
Michael<br>
<br>
<br>
<div>Am 08.11.22 um 13:46 schrieb Michael
Geddes:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div>Ah yes. Arrays - will check
those. Yeah, how about we add a
'IsDefined' method to metrics
instead of the null thing (it does
sound like it will upset too many
applecarts).</div>
<div><br>
</div>
<div>//.</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On
Tue, 8 Nov 2022 at 20:35, Michael
Balzer <<a href="mailto:dexter@expeedo.de" target="_blank">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> Michael,<br>
<br>
looks all good to me, once again
nice find with the decode
argument. Adding decode to the
Value() call was only for
symmetry IIRC, the main use was
with GetValues() (<a href="https://docs.openvehicles.com/en/latest/userguide/scripting.html#ovmsmetrics" target="_blank">https://docs.openvehicles.com/en/latest/userguide/scripting.html#ovmsmetrics</a>).<br>
<br>
Don't forget to test arrays,
e.g. "v.t.pressure" &
"v.t.temp".<br>
<br>
Returning null for an undefined
metric seems like a natural
choice, but is a rather deep
change, as for consistency not
only the Duktape metrics API but
also the Web UI metrics API
would need to be changed
accordingly. Unless you've got a
real use case that needs that,
we should be careful.<br>
<br>
Regards,<br>
Michael<br>
<br>
<br>
<div>Am 07.11.22 um 15:00
schrieb Michael Geddes:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div dir="ltr">I have
figured out a bunch of
stuff and have implemented
the following: (having
done away with needing
AsFloatUnit)
<div><br>
</div>
<div>OvmsMetrics.Value(
{metric} [, {decode}])</div>
<div>OvmsMetrics.Value(
{metric}, {unit}
[,{decode}])</div>
<div><br>
</div>
<div>It turns out that the
[decode] flag wasn't
working anyway (since
the function was being
registered as only
having 1 param)...</div>
<div>This way it is still
really 1 function.. but
I check it the second
parameter is a
'boolean', and if not..
try the second form. </div>
<div><br>
</div>
<div>OvmsMetrics.AsFloat(
{metric} [,{unit}] )</div>
<div><br>
</div>
<div>and add the function</div>
<div><br>
</div>
<div>Ovms.Metrics.ValueUnit(
{metric} [,{unit}]) </div>
<div>This prints the value
and the unit.</div>
<div><br>
</div>
<div>Here's a sample
function and the output!
This also shows the
types of the output.</div>
<div><br>
</div>
<div><font face="monospace">(function()
{<br>
x =
OvmsMetrics.Value("xiq.v.trip.consumption");<br>
print( (typeof x) +
": "+ x+"\n" );<br>
x =
OvmsMetrics.Value("xiq.v.trip.consumption",
false);<br>
print( (typeof x) +
": "+ x +"\n" );<br>
x =
OvmsMetrics.Value("xiq.v.trip.consumption","kmpkwh")<br>
print( (typeof x) +
": "+ x +"\n");<br>
x =
OvmsMetrics.Value("xiq.v.trip.consumption",
"mipkwh", false) <br>
print( (typeof x) +
": "+ x +"\n");<br>
x =
OvmsMetrics.ValueUnit("xiq.v.trip.consumption")<br>
print( (typeof x) +
": "+ x +"\n");<br>
x =
OvmsMetrics.ValueUnit("xiq.v.trip.consumption","mipkwh")<br>
print( (typeof x) +
": "+ x +"\n");<br>
x =
OvmsMetrics.AsFloat("xiq.v.trip.consumption")<br>
print( (typeof x) +
": "+ x +"\n");<br>
x =
OvmsMetrics.AsFloat("xiq.v.trip.consumption","kmpkwh")<br>
print( (typeof x) +
": "+ x +"\n");<br>
})();</font><br>
</div>
<div><br>
</div>
<div>
<pre id="m_-138117451584655546m_5484224439251412587m_-6783916119872647666m_7514939671383041717m_-2249740601380801512gmail-output" style="box-sizing:border-box;overflow:auto;font-family:ui-monospace,"Cascadia Mono","Segoe UI Mono",Hack,"Source Code Pro","Roboto Mono",Menlo,Monaco,Consolas,monospace;font-size:13px;padding:9.5px;margin-top:0px;margin-bottom:10px;line-height:1.42857;color:rgb(0,34,0);word-break:break-all;background-color:rgb(245,245,245);border:1px solid rgb(204,204,204);border-radius:4px;height:165px;white-space:pre-wrap">number: 17.0582
string: 17.0582
number: 5.86227
string: 3.64264
string: 17.0582kWh/100km
string: 3.64264mi/kWh
number: 17.0582
number: 5.86227</pre>
</div>
<div><br>
</div>
<div><br>
</div>
<div>It still might be an
idea to use 'null' as a
return value if the
metrics is<font face="monospace">
!IsDefined() </font><font face="arial,
sans-serif">but that
would be changing the
existing behaviour
slightly.</font></div>
<div><font face="arial,
sans-serif"><br>
</font></div>
<div><font face="arial,
sans-serif">//.ichael</font></div>
<div><br>
</div>
</div>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On
Mon, 7 Nov 2022 at
08:12, Michael Geddes
<<a href="mailto:frog@bunyip.wheelycreek.net" target="_blank">frog@bunyip.wheelycreek.net</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 dir="ltr">I've
worked out what the
decode flag is for and
how it works, and I
think how optional
params work. <br>
<div>I'm pretty sure I
won't need the
'AsFloatUnit'
function; the unit
would be an option
to AsFloat(); I'll
know that soon.</div>
<div><br>
</div>
<div>The 'Value'
function is more
complicated because
of the optional
decode bool. I guess
I could add the Unit
to the end of that.</div>
<div><br>
</div>
<div>ValueUnit could
be still useful then
to provide a
'Value + Unit'.</div>
<div><br>
</div>
<div>Question: Is
there a reason we
shouldn't be
returning with <span style="color:rgb(220,220,170);background-color:rgb(30,30,30);font-family:Consolas,"Courier New",monospace;font-size:14px;white-space:pre-wrap">duk_push_null</span>
if the metric
!IsDefined() in
both AsFloat() and
Value(metric,true)
cases?</div>
<div><br>
</div>
<div>//.ichael</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On
Sun, 6 Nov 2022 at
11:22, Michael
Geddes <<a href="mailto:frog@bunyip.wheelycreek.net" target="_blank">frog@bunyip.wheelycreek.net</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 dir="ltr">
<div>Right, so
I've implemented
some stuff that
seems to work
quite well. <br>
</div>
<div><br>
</div>
<div><a href="https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/pull/764" target="_blank">https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/pull/764</a>
should be ready
now after a
couple of stupid
mistakes slipped
through. This
absolutely needs
somebody to
review it
please! (There's
a reason why
I've converted
some if()'s to
switch() - which
is that it will
be used in the
follow-up
commit).</div>
<div><br>
</div>
<div>The commit
that will follow
on from that it
implements the
new Units:
kWh/100km,
km/kWh and
mi/kWh.</div>
<div><br>
</div>
<div>This is a
summary of what
I've implemented
for scripting -
including
showing the unit
codes I have
so far. I've
considered a few
things:</div>
<div> * Should
some of the
longer unit
codes be
shortened (eg
mi, mins, m, ft,
deg, perc)</div>
<div> * The unit
codes could be
much more re<font face="arial,
sans-serif">gular
and separated
by dots eg: </font></div>
<div><font face="arial,
sans-serif">
watthours
-> w.h</font></div>
<div><font face="arial,
sans-serif">
kwhp100km
->
kw.h_100km or
kw.h/100km</font></div>
<div><font face="arial,
sans-serif">
miph
-> mi_h or
mi/h (or
should it be
mph).</font></div>
<div><font face="arial,
sans-serif">
psi
-> <a href="http://p_in.in/" target="_blank">p_in.in</a> or p/<a href="http://in.in/" target="_blank">in.in</a> or <a href="http://lb_in.in/" target="_blank">lb_in.in</a> (yes, slightly
weird, but
predictable)</font></div>
<div><font face="arial,
sans-serif"> </font><br>
</div>
<b style="font-family:monospace">OVMS#
metric units</b><br>
<font face="monospace">
km : km</font><br>
<font face="monospace">
miles : M</font><br>
<font face="monospace">
meters : m</font><br>
<font face="monospace">
feet : ft</font><br>
<font face="monospace">
celcius : °C</font><br>
<font face="monospace">
fahrenheit : °F</font><br>
<font face="monospace">
kpa : kPa</font><br>
<font face="monospace">
pa : Pa</font><br>
<font face="monospace">
psi : psi</font><br>
<font face="monospace">
volts : V</font><br>
<font face="monospace">
amps : A</font><br>
<font face="monospace">
</font>amphours<font face="monospace">
: Ah</font><br>
<font face="monospace">
kw : kW</font><br>
<font face="monospace">
kwh : kWh</font><br>
<font face="monospace">
watts : W</font><br>
<font face="monospace">
</font>watthours<font face="monospace">
: Wh</font><br>
<font face="monospace">
seconds : Sec</font><br>
<font face="monospace">
minutes : Min
</font><br>
<font face="monospace">
hours :
Hour</font><br>
<font face="monospace">
utc : UTC</font><br>
<font face="monospace">
degrees : °</font><br>
<font face="monospace">
kmph :
km/h</font><br>
<font face="monospace">
</font>miph<font face="monospace">
: Mph</font><br>
<font face="monospace">
</font>kmphps<font face="monospace">
: km/h/s</font><br>
<font face="monospace">
</font>miphps<font face="monospace">
: Mph/s</font><br>
<font face="monospace">
mpss :
m/s²</font><br>
<font face="monospace">
dbm : dBm</font><br>
<font face="monospace">
sq : sq</font><br>
<font face="monospace">
percent : %</font><br>
<font face="monospace">
whpkm :
Wh/km</font><br>
<font face="monospace">
</font>whpmi<font face="monospace">
: Wh/mi</font><br>
<font face="monospace">
kwhp100km :
kWh/100km</font><br>
<font face="monospace">
</font>kmpkwh<font face="monospace">
: km/kWh</font><br>
<font face="monospace">
</font>mipkwh<font face="monospace">
: mi/kWh</font><br>
<font face="monospace">
nm : Nm</font><br>
<font face="monospace"><br>
<b>OVMS# metric
unit mi</b><br>
miles : M<br>
minutes :
Min<br>
miph :
Mph<br>
miphps :
Mph/s<br>
whpmi :
Wh/mi<br>
mipkwh :
mi/kWh</font><br>
<br>
<b style="font-family:monospace">OVMS#
metric get
xiq.v.trip.consumption<br>
</b><font face="monospace">17.0597kWh/100km</font><br>
<b style="font-family:monospace">OVMS#
metric get
xiq.v.trip.consumption
kpkwh<br>
</b><font face="monospace">5.86177km/kWh</font><br>
<b style="font-family:monospace">OVMS#
metric get
xiq.v.trip.consumption
mpkwh<br>
</b><font face="monospace">3.64233mi/kWh</font><br>
<br>
<b style="font-family:monospace">OVMS#
metric set
xiq.c.speed 5
miph<br>
</b><font face="monospace">Metric
set</font><br>
<b style="font-family:monospace">OVMS#
metric get
xiq.c.speed<br>
</b><font face="monospace">8.04673km/h</font><br>
<b style="font-family:monospace">OVMS#
metric get
xiq.c.speed miph<br>
</b><font face="monospace">5Mph</font><br>
<br>
<font face="arial,
sans-serif">And
then in DukTape
- there are some
questions I have
about the
implementation:</font>
<div><font face="arial,
sans-serif">*
Names of
functions?
Better ideas? </font></div>
<div><font face="arial,
sans-serif">*
Should
ValueUnit
output the
units?</font></div>
<div><font face="arial,
sans-serif">*
In Value()
there is the
line </font>
bool decode =
duk_opt_boolean(ctx,
1, true);</div>
<div> * What
does 'decode'
mean here?</div>
<div> * Do I
need it for
ValueUnit() ?</div>
<div><br>
<div><b><br>
<font face="monospace">(function()
{</font><br>
<font face="monospace">
print(
OvmsMetrics.Value("xiq.v.trip.consumption"));</font><br>
<font face="monospace">
print("\n")</font><br>
<font face="monospace">
print(
OvmsMetrics.ValueUnit("xiq.v.trip.consumption",""));</font><br>
<font face="monospace">
print("\n")</font><br>
<font face="monospace">
print(
OvmsMetrics.ValueUnit("xiq.v.trip.consumption","</font>mipkwh<font face="monospace">"));</font><br>
<font face="monospace">
print("\n")</font><br>
<br>
<font face="monospace">
print(
OvmsMetrics.AsFloatUnit("xiq.v.trip.consumption","</font>kmpkwh<font face="monospace">"));</font><br>
<font face="monospace">})();</font></b><br>
<font face="monospace">---
Output ---</font><br>
<font face="monospace">17.0597</font><br>
<font face="monospace">17.0597kWh/100km</font><br>
<font face="monospace">3.64233mi/kWh</font><br>
<font face="monospace">5.86177</font><br>
<font face="monospace">------</font><br>
<br>
</div>
</div>
<div>The basic
stuff all works
- it's just
quibbling over
the details..
but let's get
them right!</div>
<div><br>
</div>
<div>//.ichael</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On
Sat, 5 Nov 2022
at 20:09,
Michael Geddes
<<a href="mailto:frog@bunyip.wheelycreek.net" target="_blank">frog@bunyip.wheelycreek.net</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 dir="ltr">
<div>Yeah -
this was
copied code
from kia/kona
and is what
triggered
these ideas; I
totally agree
this shouldn't
be doubled up
on.</div>
<div><br>
</div>
<div>I've got
some commits
centred round
Metrics that
I'll just
check over and
push up ...
and then I'll
just have the
single <span style="font-family:monospace">xiq.v.</span><span style="font-family:monospace">trip.consumption </span>metric (unless you
have some
ideas for the
namespace)
which will be
much neater.</div>
<div><br>
</div>
<div>If it's
ok with you
then I might
do that unit
conversion
proposal.</div>
<div>Would it
ok if the unit
specifications
were the same
as to the
programatic codes
in
ovms_metrics.h?</div>
<div>(kWh,
WattHours
, MetersPSS ) </div>
<div>I would
probably add a
command</div>
<div><font face="monospace">metric
units</font>
<spec> <br>
</div>
<div>to list
all (matching)
units and
their
associated
Labels.</div>
<div><br>
</div>
<div>//.ichael </div>
<div><br>
</div>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Sat, 5 Nov 2022 at 18:48, Michael Balzer <<a href="mailto:dexter@expeedo.de" target="_blank">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> Michael,<br>
<br>
adding unit
conversion
support to the
shell and
Duktape
commands is a
good idea.<br>
<br>
Metrics are
not meant to
provide a user
interface,
they should be
defined to be
efficient and
non-redundant.<br>
<br>
Btw, metrics
names also
shall not use
upper case
characters,
and shall only
use "." as a
separator.<br>
<br>
Regards,<br>
Michael<br>
<br>
<br>
<div>Am
05.11.22 um
11:22 schrieb
Michael
Geddes:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Hi
all,<br>
<div>Some of
the code I
copied from
Kona/Kia code
had both
kwh/100km and
km/kwh metrics
in the code as
'Other'. </div>
<div>Adding
the various
power
consumption
Units is not
particularly
hard (I will
have a
pull-request
soon) - though
the
conversions
between them
all required
some thought!</div>
<div>... but
it also made
me think these
two metrics
that are (with
the
consumption
units added)
defined like
this: </div>
<div><font face="monospace">m_v_trip_consumption1
=
MyMetrics.InitFloat("xiq.v.trip.consumption.KWh/100km",
10, 0,
kWHP100K);<br>
m_v_trip_consumption2 = MyMetrics.InitFloat("<a href="http://xiq.v.trip.consumption.km/kWh" target="_blank">xiq.v.trip.consumption.km/kWh</a>",
10, 0, kPkWH);<br>
</font></div>
<div><br>
</div>
<div>These are
effectively
the same
metric but in
different
units!</div>
<div>I'm
wondering if
we would be
better to have
scripting and
Duktape
support for
converting
metrics to
different
unit! This
might be also
quite useful
for those
strange
countries that
insist on
using miles as
a measurement.</div>
<div><br>
</div>
<div>On top of
the 'metric
list' and
'metric set'
we could add a
'metric get'
which gets a
single value..
and add unit
support for
get/set.</div>
<div><br>
</div>
<div>I've also
got a pull
request that
improves the
precision of
the
km<->mi
conversions
and factors it
out.</div>
<div><br>
</div>
<div>//.ichael</div>
</div>
<br>
<fieldset></fieldset>
<pre>_______________________________________________
OvmsDev mailing list
<a href="mailto:OvmsDev@lists.openvehicles.com" target="_blank">OvmsDev@lists.openvehicles.com</a>
<a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" target="_blank">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">OvmsDev@lists.openvehicles.com</a><br>
<a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" rel="noreferrer" target="_blank">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a><br>
</blockquote>
</div>
</div>
</blockquote>
</div>
</blockquote>
</div>
</blockquote>
</div>
</div>
<br>
<fieldset></fieldset>
<pre>_______________________________________________
OvmsDev mailing list
<a href="mailto:OvmsDev@lists.openvehicles.com" target="_blank">OvmsDev@lists.openvehicles.com</a>
<a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" target="_blank">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">OvmsDev@lists.openvehicles.com</a><br>
<a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" rel="noreferrer" target="_blank">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a><br>
</blockquote>
</div>
</div>
<br>
<fieldset></fieldset>
<pre>_______________________________________________
OvmsDev mailing list
<a href="mailto:OvmsDev@lists.openvehicles.com" target="_blank">OvmsDev@lists.openvehicles.com</a>
<a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" target="_blank">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>
</div>
</div>
<br>
</div>
</div>
</blockquote>
</div>
<br>
</div>
_______________________________________________<br>
OvmsDev mailing list<br>
<a href="mailto:OvmsDev@lists.openvehicles.com" target="_blank">OvmsDev@lists.openvehicles.com</a><br>
<a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" rel="noreferrer" target="_blank">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a><br>
</blockquote>
</div>
</blockquote>
</div>
<br>
<fieldset></fieldset>
<pre>_______________________________________________
OvmsDev mailing list
<a href="mailto:OvmsDev@lists.openvehicles.com" target="_blank">OvmsDev@lists.openvehicles.com</a>
<a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" target="_blank">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">OvmsDev@lists.openvehicles.com</a><br>
<a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" rel="noreferrer" target="_blank">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a><br>
</blockquote></div></div>