<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">OK. I spent some time on this today, and sent in a first draft (as a bunch of extensions to vehicle.{h, cpp}). I migrated the Tesla Model S code to use it, and support came down to just a few simple lines of code.<div class=""><br class=""></div><div class="">For the moment, I dropped the idea of ‘readingsperrow’, as I think that is Tesla Model S specific, and not really necessary. Purely presentational.</div><div class=""><br class=""></div><div class="">c++ std::bitset is fixed size, so that doesn’t work for us. The std::vector<bool> seems a workable alternative, but I am not really happy with using std::find as a way of looking to see if we have everything. It works as it is, but is not very optimal. It seems there should be a better way of doing that. I think it is a pretty key feature, given the broadcast nature of the buses, to help the vehicle module know when it has a set of data ready to commit to metrics, so will need to think about this some more.</div><div class=""><br class=""></div><div class="">I also implemented min and max, for voltages and temperatures. They went in cleanly. Haven’t tackled stddev yet (or the watchers/alerts, overall aggregates, etc). There is a very basic ‘bms status’ command implemented.</div><div class=""><br class=""></div><div class="">Let me know what you think of it.</div><div class=""><br class=""></div><div class="">Regards, Mark</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On 11 Nov 2018, at 5:11 PM, Michael Balzer <<a href="mailto:dexter@expeedo.de" class="">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 text="#000000" bgcolor="#FFFFFF" class="">
    Mark,<br class="">
    <br class="">
    yes, .min & .max are the minimum and maximum readings seen since
    last battery monitor reset. The reset should be available as…<br class="">
    <ul class="">
      <li class="">OvmsVehicle::ResetCellStats();</li>
      <li class="">Command: "vehicle bms reset" …or just "bms reset" as
        we also have other vehicle commands on the root level?<br class="">
      </li>
    </ul>
    On the Twizy I do an auto reset each time the vehicle is turned on
    and each time a charge starts, but that behaviour should be
    controllable by the vehicle / user.<br class="">
    <br class="">
    <br class="">
    There's additionally the overall { .stddev, .avg } on voltages and
    temperatures of the pack. These and the cell level statistics can be
    calculated by the framework, so the vehicle simply needs to provide
    the readings. The framework needs to provide a way to reset the
    readings completion bitset, i.e.<br class="">
    <ul class="">
      <li class="">OvmsVehicle::RestartCellVoltages();</li>
      <li class="">OvmsVehicle::RestartCellTemperatures();</li>
    </ul>
    …as sometimes readings get lost, and adding new to the previous
    readings may lead to an inconsistent view leading to wrong standard
    deviation.<br class="">
    <br class="">
    <br class="">
    Speaking of standard deviation, the framework should also provide
    warnings and alerts flags. On the Twizy it does so by checking
    deviation thresholds, and there's a general stddev warn & alert
    threshold to detect overall condition and two alert thresholds on
    the cell level, one for normal stddev and one for stddev alert mode.
    Warning flags on the cell level are set when the cell deviation is
    above stddev. On the Twizy these thresholds are currently fixed to…<br class="">
    <blockquote class=""><tt class="">// Battery cell/cmod deviation alert thresholds:</tt><br class="">
      <tt class="">#define BATT_DEV_TEMP_ALERT         3       // = 3 °C</tt><br class="">
      <tt class="">#define BATT_DEV_VOLT_ALERT         6       // = 30 mV</tt><br class="">
      <br class="">
      <tt class="">// ...thresholds for overall stddev:</tt><br class="">
      <tt class="">#define BATT_STDDEV_TEMP_WATCH      2       // = 2 °C</tt><br class="">
      <tt class="">#define BATT_STDDEV_TEMP_ALERT      3       // = 3 °C</tt><br class="">
      <tt class="">#define BATT_STDDEV_VOLT_WATCH      3       // = 15 mV</tt><br class="">
      <tt class="">#define BATT_STDDEV_VOLT_ALERT      5       // = 25 mV</tt><br class="">
    </blockquote>
    …these are good defaults for the Twizy 43 Ah pouch cells, but may be
    too low for an 18650 pack, and will especially not fit cheap LFP
    type cells. So these should be configurable, i.e.<br class="">
    <ul class="">
      <li class="">vehicle bms.dev.temp.alert [°C]</li>
      <li class="">vehicle bms.dev.voltage.alert [V]</li>
      <li class="">vehicle bms.stddev.temp.watch [°C]</li>
      <li class="">vehicle bms.stddev.temp.alert [°C]</li>
      <li class="">vehicle bms.stddev.voltage.watch [V]</li>
      <li class="">vehicle bms.stddev.voltage.alert [V]</li>
    </ul>
    I can generalize the Twizy code for all of this.<br class="">
    <br class="">
    <br class="">
    The Twizy battery monitoring command set is:<br class="">
    <blockquote class=""><tt class="">OVMS# xrt batt ?</tt><br class="">
      <tt class="">data-cell            Output cell record</tt><br class="">
      <tt class="">data-pack            Output pack record</tt><br class="">
      <tt class="">reset                Reset alerts & watches</tt><br class="">
      <tt class="">status               Status report</tt><br class="">
      <tt class="">tdev                 Show temperature deviations</tt><br class="">
      <tt class="">temp                 Show temperatures</tt><br class="">
      <tt class="">vdev                 Show voltage deviations</tt><br class="">
      <tt class="">volt                 Show voltages</tt><br class="">
    </blockquote>
    The "data" commands provide the server historical records output.
    The other commands originate from the V2 and have been designed to
    keep the output within the SMS msg size limit.<br class="">
    <br class="">
    "status" gives an operative overview of the standard and max
    deviation levels of cells with warning or alert status. "volt",
    "vdev", "temp" and "tdev" show all cells.<br class="">
    <br class="">
    The Twizy generates a battery alert notification from the "status"
    output whenever some cell alert flag is set.<br class="">
    <br class="">
    <br class="">
    The Twizy server records also originate from the V2 limits, and can
    now better be changed to vectors. I've just finished a virtual
    dynamometer on the Twizy, sending a vector metric to the server is
    just a matter of…<br class="">
    <blockquote class=""><tt class="">std::string msg = "RT-ENG-MotTrqDrv,0,86400,";</tt><br class="">
      <tt class="">msg.append(m_mon.m_mot_torque_drv->AsString());</tt><br class="">
      <tt class="">MyNotify.NotifyString("data", "xrt.pwr.mon", msg.c_str());</tt><br class="">
    </blockquote>
    Neat.<br class="">
    <br class="">
    The Twizy sends server records once per minute during drive/charge.
    The server update frequency should become tunable as well, as that
    would be a lot of additional data volume on large packs.<br class="">
    <br class="">
    <br class="">
    The Twizy layout may be either…<br class="">
    <ul class="MailOutline">
      <li class="">14 cell groups in the pack</li>
      <li class="">2 cell groups in each module</li>
      <li class="">7 modules in the pack</li>
      <li class="">Each cell group has 1 voltage measurement (so, 14
        individual voltage measurements)</li>
      <li class="">Each module has 1 temperature measurements (so, 7
        individual temperature measurements)</li>
      <li class="">That means:</li>
      <ul class="">
        <li class="">OvmsVehicle::SetCellArrangementVoltage(14, 2,  7)</li>
        <li class="">OvmsVehicle::SetCellArrangementTemperature(7, 1, 7)</li>
      </ul>
    </ul><p class="">…for the original battery, or for an LFP type replacement…</p>
    <ul class="MailOutline">
      <li class="">16 cell groups in the pack</li>
      <li class="">16 cell groups in each module</li>
      <li class="">1 module in the pack</li>
      <li class="">Each cell group has 1 voltage measurement (so, 16
        individual voltage measurements)</li>
      <li class="">Each module has 3 temperature measurements (so, 3
        individual temperature measurements)</li>
      <li class="">That means:</li>
      <ul class="">
        <li class="">OvmsVehicle::SetCellArrangementVoltage(16, 16,  8)</li>
        <li class="">OvmsVehicle::SetCellArrangementTemperature(3, 3, 3)</li>
      </ul>
    </ul>
    <br class="">
    Regards,<br class="">
    Michael<br class="">
    <br class="">
    <br class="">
    <div class="moz-cite-prefix">Am 11.11.18 um 08:10 schrieb Mark
      Webb-Johnson:<br class="">
    </div>
    <blockquote type="cite" cite="mid:88AF6B7B-37D7-4698-97CD-43B6E481DBF0@webb-johnson.net" class="">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" class="">
      Looking at the discussion with Michael back in May, we came to
      some conclusions for this. I was happy back then with using ‘cell’
      rather than ‘module’ as the naming, because (a) we are talking
      about cell/brick/module level here, not pack, and (b) it is
      shorter. It seems that the twizy has:
      <div class=""><br class="">
      </div>
      <blockquote style="margin: 0 0 0 40px; border: none; padding:
        0px;" class="">
        <div class=""><tt style="background-color: rgb(255, 255, 255);" class="">xrt.b.cell.01.volt.act                   3.995V</tt><tt style="background-color: rgb(255, 255, 255);" class=""><br class="">
          </tt><tt style="background-color: rgb(255, 255, 255);" class="">xrt.b.cell.01.volt.max                   4.12V</tt><tt style="background-color: rgb(255, 255, 255);" class=""><br class="">
          </tt><tt style="background-color: rgb(255, 255, 255);" class="">xrt.b.cell.01.volt.maxdev                0.01V</tt><tt style="background-color: rgb(255, 255, 255);" class=""><br class="">
          </tt><tt style="background-color: rgb(255, 255, 255);" class="">xrt.b.cell.01.volt.min                   3.795V</tt><tt style="background-color: rgb(255, 255, 255);" class=""><br class="">
          </tt></div>
        <div class=""><tt style="background-color: rgb(255, 255, 255);" class="">...</tt></div>
        <div class=""><tt style="background-color: rgb(255, 255, 255);" class="">xrt.b.cell.cnt                           14</tt></div>
        <div class=""><tt style="background-color: rgb(255, 255, 255);" class="">...</tt></div>
        <div class=""><tt style="background-color: rgb(255, 255, 255);" class=""><tt class="">xrt.b.cmod.01.temp.act                  
              17°C</tt><tt class=""><br class="">
            </tt><tt class="">xrt.b.cmod.01.temp.max                  
              23°C</tt><tt class=""><br class="">
            </tt><tt class="">xrt.b.cmod.01.temp.maxdev               
              1°C</tt><tt class=""><br class="">
            </tt><tt class="">xrt.b.cmod.01.temp.min                  
              16°C</tt></tt></div>
        <div class=""><tt style="background-color: rgb(255, 255, 255);" class=""><tt class="">...</tt></tt></div>
        <div class=""><tt style="background-color: rgb(255, 255, 255);" class=""><tt class="">xrt.b.cmod.cnt                          
              7</tt></tt></div>
        <div class=""><tt style="background-color: rgb(255, 255, 255);" class=""><tt class="">...</tt></tt></div>
        <div class=""><tt style="background-color: rgb(255, 255, 255);" class=""><tt class=""><tt class="">xrt.b.pack.1.temp.alerts</tt><tt class=""><br class="">
              </tt><tt class="">xrt.b.pack.1.temp.max                   
                23°C</tt><tt class=""><br class="">
              </tt><tt class="">xrt.b.pack.1.temp.min                   
                16°C</tt><tt class=""><br class="">
              </tt><tt class="">xrt.b.pack.1.temp.stddev.max            
                1°C</tt><tt class=""><br class="">
              </tt><tt class="">xrt.b.pack.1.temp.watches</tt><tt class=""><br class="">
              </tt><tt class="">xrt.b.pack.1.volt.alerts</tt><tt class=""><br class="">
              </tt><tt class="">xrt.b.pack.1.volt.max                   
                57.6V</tt><tt class=""><br class="">
              </tt><tt class="">xrt.b.pack.1.volt.min                   
                52.8V</tt><tt class=""><br class="">
              </tt><tt class="">xrt.b.pack.1.volt.stddev.max            
                0.005V</tt><tt class=""><br class="">
              </tt><tt class="">xrt.b.pack.1.volt.watches               
                1,2,4,5,6,7,11,12,14</tt><tt class=""><br class="">
              </tt><tt class="">xrt.b.pack.cnt                          
                1</tt></tt></tt></div>
        <div class=""><tt style="background-color: rgb(255, 255, 255);" class=""><tt class=""><tt class="">...<br class="">
              </tt><tt class="">xrt.b.soc.max                           
                100%</tt><tt class=""><br class="">
              </tt><tt class="">xrt.b.soc.min                           
                69.78%</tt></tt></tt></div>
      </blockquote>
      <div class="">
        <div class=""><br class="">
        </div>
        <div class="">Trying to come up with a standard representation
          for this (so everyone can use a shared library, and share
          output displays), that works across all vehicles... Assuming
          we have one-dimensional arrays for different types of
          measurement (for voltage, temperature, etc), measurements are
          taken at the group of cells level (with perhaps different
          groupings for different readings), and aggregations/limits
          being automatically calculated, I think this has:</div>
        <div class=""><br class="">
        </div>
        <div class="">
          <ol class="MailOutline">
            <li class="">v.b.c.voltage<br class="">
              <br class="">
              Vector<float> metric type array of voltage
              measurements<br class="">
              <br class="">
            </li>
            <li class="">v.b.c.temp<br class="">
              <br class="">
              Vector<float> metric type array of temperature
              measurements<br class="">
              <br class="">
            </li>
            <li class="">Aggregations / limits<br class="">
              <br class="">
              We could have v.b.c.voltage.min, v.b.c.voltage.max,
              v.b.c.voltage.maxdev, v.b.c.temp.min, v.b.c.temp.max, and
              v.b.c.temp.maxdev if we wanted to store these. Presumably
              they could be automatically calculated? I am guessing
              ‘min’ is the minimal value seen, and ‘max’ the maximum?<br class="">
              <br class="">
            </li>
            <li class="">Setting as a batch<br class="">
              <br class="">
              The way I’ve implemented the Model S is to keep a bitmap
              of values set. For example, say we have 32 cell voltage
              measurements. Every time we set a voltage measurement, we
              set the appropriate bit. When the bitmap is full, zero the
              bitmap, then set the metric in bulk (setting the entire
              vector). That seems to work well for Model S at least. The
              aggregations/limits would be calculated (and set) when the
              batch is ready. I suggest something like:<br class="">
              <br class="">
            </li>
            <ul class="">
              <li class="">OvmsVehicle::SetCellVoltage(int index, float
                value);</li>
              <li class="">OvmsVehicle::SetCellTemperature(int index,
                float value);<br class="">
                <br class="">
              </li>
            </ul>
            <li class="">Arrangement<br class="">
              <br class="">
              My thinking is that the count of measurements available
              can be defined when the module initialises. We can also
              simply count the size of the vectors, to know that. The
              issue is the cell/brick/module/pack arrangement; How many
              voltage or temperature measurements per module, how many
              modules in the pack, etc. I think we need to tell the
              system (a) the number of readings expected, (b) the number
              of readings per module, and (c) a hint to say how many
              readings to show per row. I suggest something like:<br class="">
              <br class="">
            </li>
            <ul class="">
              <li class="">OvmsVehicle::SetCellArrangementVoltage(int
                readings, int readingspermodule, int readingsperrow)</li>
              <li class="">OvmsVehicle::SetCellArrangementTemperature(int
                readings, int readingspermodule, int readingsperrow)<br class="">
                <br class="">
              </li>
            </ul>
            <li class="">Commands<br class="">
              <br class="">
              Once the above is defined we can have a ‘vehicle bms
              status’ command to show the status (like the Tesla Model S
              one shown here, albeit more polished):</li>
          </ol>
        </div>
        <div class=""><br class="">
        </div>
      </div>
      <blockquote style="margin: 0 0 0 40px; border: none; padding:
        0px;" class="">
        <div class="">
          <div class="">
            <div class=""> <font class="" face="Andale Mono"><span style="font-size: 14px;" class="">
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 1 | 3.981 V | 3.981
                  V | 3.981 V | 29.5 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.981 V | 3.981
                  V | 3.981 V | 30.3 C Max</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 2 | 3.981 V | 3.981
                  V | 3.982 V | 29.4 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.981 V | 3.981
                  V | 3.981 V | 29.8 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 3 | 3.982 V | 3.982
                  V | 3.981 V | 29.1 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.981 V | 3.981
                  V | 3.982 V | 29.7 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 4 | 3.982 V | 3.982
                  V | 3.982 V | 28.9 C Min</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.981 V | 3.982
                  V | 3.982 V | 29.7 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 5 | 3.982 V | 3.982
                  V | 3.982 V | 29.0 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.982 V | 3.981
                  V | 3.981 V | 29.6 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 6 | 3.982 V | 3.982
                  V | 3.982 V | 29.3 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.982 V | 3.982
                  V | 3.982 V | 29.6 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 7 | 3.981 V | 3.981
                  V | 3.981 V | 29.0 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.981 V | 3.981
                  V | 3.981 V | 29.6 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 8 | 3.982 V | 3.983
                  V | 3.982 V | 29.2 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.983 V | 3.982
                  V | 3.982 V | 29.9 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 9 | 3.982 V | 3.982
                  V | 3.981 V | 30.0 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.982 V | 3.981
                  V | 3.981 V | 29.7 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">10 | 3.979 V | 3.980
                  V | 3.979 V | 29.1 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.980 V | 3.979
                  V | 3.979 V | 29.8 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">11 | 3.980 V | 3.981
                  V | 3.981 V | 29.1 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.981 V | 3.981
                  V | 3.981 V | 29.4 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">12 | 3.981 V | 3.982
                  V | 3.981 V | 29.1 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.981 V | 3.981
                  V | 3.982 V | 29.3 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">13 | 3.982 V | 3.983
                  V | 3.982 V | 28.9 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.982 V | 3.982
                  V | 3.982 V | 29.4 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">14 | 3.981 V | 3.982
                  V | 3.982 V | 29.3 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.982 V | 3.982
                  V | 3.982 V | 29.5 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">15 | 3.981 V | 3.982
                  V | 3.981 V | 29.6 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.982 V | 3.981
                  V | 3.981 V | 29.9 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">16 | 3.982 V | 3.982
                  V | 3.982 V | 29.5 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   | 3.982 V | 3.981
                  V | 3.981 V | 29.8 C</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 
                   -------------------------------</span></font></div>
            <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">   Tmin: 28.9  Tmax:
                  30.3  Vmax: 3.983  Vmin: 3.979  Vmax-Vmin: 0.003
                   Vtot: 382.23</span></font></div>
          </div>
        </div>
        <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""><br class="">
            </span></font></div>
        <div class="">Another variant of this display would be:</div>
        <div class=""><br class="">
        </div>
        <div class="">
          <div class=""> <font class="" face="Andale Mono"><span style="font-size: 14px;" class="">  -------------------------------</span></font><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">-------------------------------</span><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">--------------------</span></div>
          <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 1 | 3.981 V | 3.981 V
                | 3.981 V | </span></font><span style="font-family:
              "Andale Mono"; font-size: 14px;" class="">3.981
              V | 3.981 V | 3.981 V </span><font class="" face="Andale
              Mono"><span style="font-size: 14px;" class="">| 29.5 C. </span></font><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">30.3 C Max |</span></div>
          <div class=""> <font class="" face="Andale Mono"><span style="font-size: 14px;" class="">  -------------------------------</span></font><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">-------------------------------</span><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">--------------------</span></div>
          <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 2 | 3.981 V | 3.981 V
                | 3.982 V | </span></font><span style="font-family:
              "Andale Mono"; font-size: 14px;" class="">3.981
              V | 3.981 V | 3.981 V | </span><font class="" face="Andale
              Mono"><span style="font-size: 14px;" class="">29.4 C  </span></font><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">29.8 C     |</span></div>
          <div class=""> <font class="" face="Andale Mono"><span style="font-size: 14px;" class="">  -------------------------------</span></font><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">-------------------------------</span><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">--------------------</span></div>
          <div class=""><span style="font-size: 14px; font-family:
              "Andale Mono";" class=""> 3 | 3.982 V | 3.982 V
              | 3.981 V | </span><span style="font-family: "Andale
              Mono"; font-size: 14px;" class="">3.981 V | 3.981 V |
              3.982 V | </span><span style="font-size: 14px;
              font-family: "Andale Mono";" class="">29.1 C  </span><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">29.7 C     |</span></div>
          <div class=""> <font class="" face="Andale Mono"><span style="font-size: 14px;" class="">  -------------------------------</span></font><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">-------------------------------</span><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">--------------------</span></div>
          <div class=""><span style="font-size: 14px; font-family:
              "Andale Mono";" class=""> 4 | 3.982 V | 3.982 V
              | 3.982 V | </span><span style="font-family: "Andale
              Mono"; font-size: 14px;" class="">3.981 V | 3.982 V |
              3.982 V | </span><span style="font-size: 14px;
              font-family: "Andale Mono";" class="">28.9 C Min
               </span><span style="font-family: "Andale Mono";
              font-size: 14px;" class="">29.7 C |</span></div>
          <div class=""> <font class="" face="Andale Mono"><span style="font-size: 14px;" class="">  -------------------------------</span></font><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">-------------------------------</span><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">--------------------</span></div>
          <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class=""> 5 | 3.982 V | 3.982 V
                | 3.982 V | </span></font><span style="font-family:
              "Andale Mono"; font-size: 14px;" class="">3.982
              V | 3.981 V | 3.981 V | </span><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">29.0
                C  </span></font><span style="font-family: "Andale
              Mono"; font-size: 14px;" class="">29.6 C     |</span></div>
          <div class=""> <font class="" face="Andale Mono"><span style="font-size: 14px;" class="">  -------------------------------</span></font><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">-------------------------------</span><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">--------------------</span></div>
          <div class="">...</div>
          <div class=""> <font class="" face="Andale Mono"><span style="font-size: 14px;" class="">  -------------------------------</span></font><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">-------------------------------</span><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">--------------------</span></div>
          <div class=""><font class="" face="Andale Mono"><span style="font-size: 14px;" class="">16 | 3.982 V | 3.982 V
                | 3.982 V | </span></font><span style="font-family:
              "Andale Mono"; font-size: 14px;" class="">3.982
              V | 3.981 V | 3.981 V | </span><font class="" face="Andale
              Mono"><span style="font-size: 14px;" class="">29.5 C  </span></font><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">29.8 C.    |</span></div>
          <div class=""> <font class="" face="Andale Mono"><span style="font-size: 14px;" class="">  -------------------------------</span></font><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">-------------------------------</span><span style="font-family: "Andale Mono"; font-size:
              14px;" class="">--------------------</span></div>
          <div class=""><span style="font-size: 14px; font-family:
              "Andale Mono";" class="">   Tmin: 28.9  Tmax:
              30.3  Vmax: 3.983  Vmin: 3.979  Vmax-Vmin: 0.003  Vtot:
              382.23</span></div>
        </div>
        <div class=""><span style="font-size: 14px; font-family:
            "Andale Mono";" class=""><br class="">
          </span></div>
        <div class="">(The vehicle itself having the control via the
          SetCellArrangement methods)</div>
      </blockquote>
      <div class="">
        <div class=""><br class="">
        </div>
        <div class="">To provide a baseline usage case, the Tesla Model
          S has:</div>
        <div class=""><br class="">
        </div>
        <div class="">
          <ul class="MailOutline">
            <li class="">96 bricks in the pack</li>
            <li class="">6 bricks in each module</li>
            <li class="">16 modules in the pack</li>
            <li class="">Each brick has one voltage measurement (so, 96
              individual voltage measurements)</li>
            <li class="">Each module has two temperature measurements
              (so, 32 individual temperature measurements)</li>
            <li class="">That means:</li>
            <ul class="">
              <li class="">OvmsVehicle::SetCellArrangementVoltage(96, 6,
                3)</li>
              <li class="">OvmsVehicle::SetCellArrangementTemperature(32,
                2, 1)</li>
            </ul>
          </ul>
          <div class=""><br class="">
          </div>
          <div class="">Tesla Model X seems identical to Model S.</div>
          <div class=""><br class="">
          </div>
          <div class="">I am still working on reverse engineering the Tesla
            Roadster, but it seems to have:</div>
          <div class=""><br class="">
          </div>
          <div class="">
            <ul class="MailOutline">
              <li class="">99 bricks in the pack</li>
              <li class="">9 bricks in each module (aka sheet)</li>
              <li class="">11 modules in the pack</li>
              <li class="">Each brick has one voltage measurement (so,
                11*9 = 99 individual voltage measurements)</li>
              <li class="">Each module has four temperature measurements
                (so, 11*4 = 44 individual temperature measurements)</li>
              <li class="">That means:</li>
              <ul class="">
                <li class="">OvmsVehicle::SetCellArrangementVoltage(99,
                  9, 9)</li>
                <li class="">OvmsVehicle::SetCellArrangementTemperature(44,
                  4, 4)</li>
              </ul>
            </ul>
          </div>
          <div class=""><br class="">
          </div>
          <div class="">For other cars that support cell-level measurements, do
            they fit this representation? If so, can we fill in the
            following for each car, to see how it fits in?</div>
          <div class=""><br class="">
          </div>
          <div class="">
            <ul class="MailOutline">
              <li class="">XX cell groups in the pack</li>
              <li class="">XX cell groups in each module</li>
              <li class="">XX modules in the pack</li>
              <li class="">Each cell group has one voltage measurement
                (so, XX individual voltage measurements)</li>
              <li class="">Each module has four temperature measurements
                (so, XX individual temperature measurements)</li>
              <li class="">That means:</li>
              <ul class="">
                <li class="">OvmsVehicle::SetCellArrangementVoltage(N,
                  Y,  Z)</li>
                <li class="">OvmsVehicle::SetCellArrangementTemperature(N,
                  Y, Z)</li>
              </ul>
            </ul>
            <div class=""><br class="">
            </div>
            <div class="">If they don’t fit, what changes are needed to
              make it work?</div>
            <div class=""><br class="">
            </div>
            <div class="">Regards, Mark.</div>
          </div>
          <div class=""><br class="">
            <blockquote type="cite" class="">
              <div class="">On 11 Nov 2018, at 12:16 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="">
                <div class="">I originally thought ‘brick’, or ‘module’
                  rather than ‘cell’, but happy with either. These are
                  readings for groups of cells, rather than whole pack.<br class="">
                  <br class="">
                  Tesla Model S is 16 modules. 6 voltage readings, and 2
                  temperatures, per module.<br class="">
                  <br class="">
                  What is Kia Soul arrangement?<br class="">
                  <br class="">
                  Regards, Mark<br class="">
                  <br class="">
                  <blockquote type="cite" class="">On 10 Nov 2018, at
                    11:26 PM, Henrik Scheel <<a href="mailto:henrik.scheel@spjeldager.dk" class="" moz-do-not-send="true">henrik.scheel@spjeldager.dk</a>>
                    wrote:<br class="">
                    <br class="">
                    Hi Mark.<br class="">
                    <br class="">
                    Good idea with a generic array type metric, and
                    standard metrics for common EV features!<br class="">
                    <br class="">
                    Just a quick note:<br class="">
                    The Kia Soul EV vehicle module will be able to
                    utilize these metric-arrays. However, on the Soul,
                    the voltages are for each physical pair of cells
                    connected in parallel, and the temperatures are for
                    6 battery modules, and for the battery cooling air
                    inlet. <br class="">
                    <br class="">
                    So, for the Kia Soul EV, the name “v.b.cell.temp”
                    would be misleading, as each measured module
                    temperature is representing the state for 16 pairs
                    of cells.<br class="">
                    <br class="">
                    Aside from that, I am all for mapping the values in
                    these new standardized metric types. Currently, the
                    temperature average is calculated and mapped to a
                    metric, and the 96 cell voltages are unmapped for
                    Kia Soul EV.<br class="">
                    <br class="">
                    Best regards,<br class="">
                    Henrik<br class="">
                    -- <br class="">
                    <br class="">
                    Venlig hilsen / best regards <br class="">
                    Henrik R. Scheel<br class="">
                    <br class="">
                    Spjeldager Consult ApS<br class="">
                    Spjeldager 9 <br class="">
                    DK-2630 Taastrup <br class="">
                    CVR: 34491399 <br class="">
                    T: +45 2720 9828 <br class="">
                    <a href="http://www.spjeldager.dk/" class="" moz-do-not-send="true">http://www.spjeldager.dk/</a><br class="">
                    <br class="">
                    <blockquote type="cite" class="">Den 10. nov. 2018
                      kl. 15.34 skrev
                      <a class="moz-txt-link-abbreviated" href="mailto:ovmsdev-request@lists.openvehicles.com">ovmsdev-request@lists.openvehicles.com</a>:<br class="">
                      <br class="">
                      Send OvmsDev mailing list submissions to<br class="">
                        <a class="moz-txt-link-abbreviated" href="mailto:ovmsdev@lists.openvehicles.com">ovmsdev@lists.openvehicles.com</a><br class="">
                      <br class="">
                      To subscribe or unsubscribe via the World Wide
                      Web, visit<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="">
                      or, via email, send a message with subject or body
                      'help' to<br class="">
                        <a class="moz-txt-link-abbreviated" href="mailto:ovmsdev-request@lists.openvehicles.com">ovmsdev-request@lists.openvehicles.com</a><br class="">
                      <br class="">
                      You can reach the person managing the list at<br class="">
                        <a class="moz-txt-link-abbreviated" href="mailto:ovmsdev-owner@lists.openvehicles.com">ovmsdev-owner@lists.openvehicles.com</a><br class="">
                      <br class="">
                      When replying, please edit your Subject line so it
                      is more specific<br class="">
                      than "Re: Contents of OvmsDev digest..."<br class="">
                      <br class="">
                      <br class="">
                      Today's Topics:<br class="">
                      <br class="">
                      1. Re: Custom metrics (Mark Webb-Johnson)<br class="">
                      <br class="">
                      <br class="">
----------------------------------------------------------------------<br class="">
                      <br class="">
                      Message: 1<br class="">
                      Date: Sat, 10 Nov 2018 22:34:46 +0800<br class="">
                      From: Mark Webb-Johnson
                      <a class="moz-txt-link-rfc2396E" href="mailto:mark@webb-johnson.net"><mark@webb-johnson.net></a><br class="">
                      To: OVMS Developers
                      <a class="moz-txt-link-rfc2396E" href="mailto:ovmsdev@lists.openvehicles.com"><ovmsdev@lists.openvehicles.com></a><br class="">
                      Subject: Re: [Ovmsdev] Custom metrics<br class="">
                      Message-ID:
                      <a class="moz-txt-link-rfc2396E" href="mailto:1E30255B-5CC6-4EC4-BA9F-9CA41D156B11@webb-johnson.net"><1E30255B-5CC6-4EC4-BA9F-9CA41D156B11@webb-johnson.net></a><br class="">
                      Content-Type: text/plain; charset="utf-8"<br class="">
                      <br class="">
                      I?ve added UnregisterCommand() methods to
                      ovms_command.{h, cpp}. I?ve also updated the
                      vehicle_teslamodels code to UnregisterCommand in
                      the destructor. I think that is cleaner. The
                      unregistering of CAN buses already seems to be
                      working properly, config parameters should persist
                      (even without vehicle module loaded). I am still
                      considering the situation with metrics (but tend
                      to think that they should disappear when the
                      vehicle module is unloaded).<br class="">
                      <br class="">
                      I?ve also changed the vehicle_teslamodels code to
                      use single voltage and temperate metric arrays (I
                      think my previous dual voltage temperature
                      arrangement was incorrect). I think these can now
                      become standard metrics (one for battery voltage,
                      and another for temperature). How about
                      v.b.cell.voltage and v.b.cell.temp? The
                      interpretation of those vectors (how many modules
                      primarily - with the calculation of voltages and
                      temperatures per module being dependent on the
                      realtime size of each array) will still be vehicle
                      dependent, and I guess the vehicle module can
                      provide hints to our standard component for this.
                      Perhaps we can just implement it in vehicle.{h,
                      cpp}? I think this standard module can deal with:<br class="">
                      <br class="">
                      An interface for specific vehicle module to
                      specify the number of modules, number of voltage
                      measurements, and number of temperature
                      measurements available.<br class="">
                      Internal storage of cell voltages and
                      temperatures.<br class="">
                      Tracking of when all voltages and temperatures
                      have been set, and these should be written to
                      metrics (as a transaction).<br class="">
                      Standardised command to display on terminal (like
                      ?xts bms?).<br class="">
                      Web interface extensions (including the charting
                      you have, a textual display, etc).<br class="">
                      <br class="">
                      I can handle all of the above, except the web
                      interface. What do you think? Can these be
                      standardised? Certainly for Tesla Roadster and
                      Tesla Model S they appear to be able to be unified
                      under one standard framework.<br class="">
                      <br class="">
                      Regards, Mark.<br class="">
                      <br class="">
                      <blockquote type="cite" class="">On 8 Nov 2018, at
                        6:49 AM, Michael Balzer
                        <a class="moz-txt-link-rfc2396E" href="mailto:dexter@expeedo.de"><dexter@expeedo.de></a> wrote:<br class="">
                        <br class="">
                        Mark,<br class="">
                        <br class="">
                        1) yes, we're approaching a generic form now.
                        The chart currently displays actual, min &
                        max values from the arrays, and derives the
                        overall average value. It automatically adapts
                        to the number of voltages and temperatures
                        stored in the arrays.<br class="">
                        <br class="">
                        It still lacks:<br class="">
                        a) Displaying max deviations, current standard
                        deviation and max standard deviation recorded.<br class="">
                        b) Displaying cell/module warn & alert
                        status. These are currently set metrics on the
                        Twizy, could better be generalized as arrays as
                        well, i.e. 0=normal, 1=warn, 2=alert.<br class="">
                        c) SOH / capacity and internal resistance should
                        be generally available per cell as well (no data
                        on these yet on the Twizy).<br class="">
                        <br class="">
                        And as this will visually overload the chart it
                        will need some buttons to show/hide the parts.<br class="">
                        <br class="">
                        A general vehicle base support for these metrics
                        could automatically keep min & max values,
                        calculate deviations and derive warn/alert
                        status from these. So basically a vehicle
                        adapter only needs to provide voltages and
                        temperatures (+ SOH and internal resistance as
                        available). The reset command then can also
                        normally just be a generalized version.<br class="">
                        <br class="">
                        2) I should add some basic documentation on this
                        to the developer manual (lacking time). For the
                        RE tools I've got an API to inject arbitrary
                        data into the websocket stream on my todo list,
                        so live updates can be transported without
                        polling.<br class="">
                        <br class="">
                        4) Interesting idea, similar to a reverse proxy.
                        As the channel will be very slow we will need to
                        reduce the websocket update frequency, make it
                        configurable or maybe auto-adapt to the current
                        speed. Also, the proxy should cache static
                        assets to speed up first time connects.<br class="">
                        <br class="">
                        The v2 protocol using RC4 encryption is a bad
                        base for this. What's the current encryption on
                        v3/MQTT?<br class="">
                        <br class="">
                        Regards,<br class="">
                        Michael<br class="">
                        <br class="">
                        <br class="">
                        <blockquote type="cite" class="">Am 07.11.18 um
                          01:50 schrieb Mark Webb-Johnson:<br class="">
                          Some questions/comments:<br class="">
                          <br class="">
                          I guess this is fairly generic. Voltages and
                          temperatures, with possibly a different number
                          of readings for each. Model S has two
                          temperatures, but I guess we can just treat
                          those as interleaved. Could it be put into a
                          reusable component? Or could we have standard
                          metrics for this now (battery module voltages
                          and temperatures)? Maybe a single component
                          that does all this (functions to set
                          individual voltages and temperatures, define
                          the layout for display, include web interface
                          for chart and table, etc)?<br class="">
                          <br class="">
                          I really need to look at integration of
                          extensions to the web interface. See how that
                          is done. For my work on DBC and RE tools, it
                          seems easiest to just create a web interface
                          (rather than messing around with command
                          line).<br class="">
                          <br class="">
                          Regarding the registration of commands and
                          metrics, I am not sure if that is done
                          correctly at the moment. In particular in the
                          case a vehicle module is loaded, unloaded,
                          then loaded again. It seems that
                          RegisterCommand doesn?t do it right, and the
                          metric object creation needs a guard to make
                          sure the metric doesn?t already exist. I will
                          try to tidy this up in Model S code, as a
                          reference, before moving on to Roadster.<br class="">
                          <br class="">
                          I really haven?t used the web interface much,
                          as it is not available over cellular. I was
                          wondering if it could be encapsulated somehow
                          within the v2/v3 protocol, and made available
                          via the server? Something like
                          <a class="moz-txt-link-freetext" href="https://api.openvehicles.com:8080/VEHICLEID">https://api.openvehicles.com:8080/VEHICLEID</a>
                          <a class="moz-txt-link-rfc2396E" href="https://api.openvehicles.com:8080/VEHICLEID"><https://api.openvehicles.com:8080/VEHICLEID></a>
                          tunnelled through (with authentication at the
                          server level using the normal web server user
                          account). Similarly for SSH access. These are
                          both simple tcp/ip connections, so presumably
                          could be injected into mongoose as fake
                          connections. One possible approach would be
                          SOCKS, and there is some reference code for
                          LWIP
                          <a class="moz-txt-link-rfc2396E" href="https://github.com/russdill/lwip/commit/dfeba616"><https://github.com/russdill/lwip/commit/dfeba616></a>.
                          Another is TUN/TAP, again with reference code
                          for LWIP
                          <a class="moz-txt-link-rfc2396E" href="https://github.com/russdill/lwip/commit/47ca42f8"><https://github.com/russdill/lwip/commit/47ca42f8></a>.
                          And then there is the standard PPP (although
                          that would technically then be PPP within
                          tcp/ip over PPP within async within GSM, which
                          is a bit freaky).<br class="">
                          <br class="">
                          Regards, Mark.<br class="">
                          <br class="">
                          <blockquote type="cite" class="">On 7 Nov
                            2018, at 4:52 AM, Michael Balzer
                            <<a class="moz-txt-link-abbreviated" href="mailto:dexter@expeedo.de">dexter@expeedo.de</a>
                            <a class="moz-txt-link-rfc2396E" href="mailto:dexter@expeedo.de"><mailto:dexter@expeedo.de></a>> wrote:<br class="">
                            <br class="">
                            Mark, Tam?s,<br class="">
                            <br class="">
                            I've prepared a more or less generalized
                            array version of my Twizy battery chart
                            (OvmsVehicleRenaultTwizy::WebBattMon) for
                            you. Easier to collect the data from actual
                            arrays than separate metrics.<br class="">
                            <br class="">
                            This ZIP?<br class="">
                            <br class="">
                            <a class="moz-txt-link-freetext" href="https://dexters-web.de/f/ovms-dev/ovms.zip">https://dexters-web.de/f/ovms-dev/ovms.zip</a>
                            <a class="moz-txt-link-rfc2396E" href="https://dexters-web.de/f/ovms-dev/ovms.zip"><https://dexters-web.de/f/ovms-dev/ovms.zip></a><br class="">
                            <br class="">
                            ?contains my local ovms web test/development
                            folder. Unzip it into some local web server
                            (needs to be run via http for javascript),
                            then open the folder from a browser. You
                            should see an OVMS web UI lookalike.<br class="">
                            <br class="">
                            Config ? CellChart loads "cellchart.htm".
                            The blue button generates and injects test
                            data. Should look like this:<br class="">
                            <br class="">
                            <eoibkbnkbpofdlab.png><br class="">
                            <br class="">
                            Assuming you'll add some min/max records as
                            well I left that code including the reset
                            button in there. If you can't provide that
                            yet, you can simply set min & max = act
                            in the get_xxx_data functions. Other than
                            that you should basically just need to
                            change the metrics names.<br class="">
                            <br class="">
                            To generate C/C++ syntax from the file, use
                            the script bin/mksrc: "bin/mksrc
                            cellchart.htm >cellchart.cpp". The chart
                            init URL needs to be changed for the
                            production environment (see comment), and
                            the test data generator can be removed. See
                            OvmsVehicleRenaultTwizy::WebBattMon for
                            reference.<br class="">
                            <br class="">
                            Maybe I should add that stuff to the
                            repository as well?<br class="">
                            <br class="">
                            Regards,<br class="">
                            Michael<br class="">
                            <br class="">
                            <br class="">
                            <blockquote type="cite" class="">Am 06.11.18
                              um 15:56 schrieb Mark Webb-Johnson:<br class="">
                              Nice. I just implemented this for Model S
                              using your new metric type.<br class="">
                              <br class="">
                              96 individual brick voltages for each of
                              the bricks, plus two temperatures for each
                              of the 16 modules.<br class="">
                              <br class="">
                              Works well.<br class="">
                              <br class="">
                              <br class="">
                              <br class="">
                              <br class="">
                              <blockquote type="cite" class="">On 1 Nov
                                2018, at 5:58 PM, Michael Balzer
                                <<a class="moz-txt-link-abbreviated" href="mailto:dexter@expeedo.de">dexter@expeedo.de</a>
                                <a class="moz-txt-link-rfc2396E" href="mailto:dexter@expeedo.de"><mailto:dexter@expeedo.de></a>>
                                wrote:<br class="">
                                <br class="">
                                Tam?s,<br class="">
                                <br class="">
                                I've been creating separate metrics for
                                all cell values on the Twizy, but that
                                only has 14 cells.<br class="">
                                <br class="">
                                We discussed this before, a better
                                approach is introducing a new metric
                                class for arrays. I have just done that
                                for you, please pull.<br class="">
                                <br class="">
                                Usage example:<br class="">
                                OvmsMetricVector<float>* vf = new
OvmsMetricVector<float>("test.volts", SM_STALE_MIN, Volts);<br class="">
                                vf->SetElemValue(3, 1.23);<br class="">
                                vf->SetElemValue(17, 2.34);<br class="">
                                float myvals[3] = { 5.5, 6.6, 7.7 };<br class="">
                                vf->SetElemValues(10, 3, myvals);<br class="">
                                With this data set, you get:<br class="">
                                OVMS# met lis test<br class="">
                                test.volts
                              0,0,0,1.23,0,0,0,0,0,0,5.5,6.6,7.7,0,0,0,0,2.34V<br class="">
                                ?and in the web framework:<br class="">
                                metrics["test.volts"]<br class="">
                                (18) [0, 0, 0, 1.23, 0, 0, 0, 0, 0, 0,
                                5.5, 6.6, 7.7, 0, 0, 0, 0, 2.34]<br class="">
                                metrics["test.volts"][11]<br class="">
                                6.6<br class="">
                                See template definition in
                                ovms_metrics.h for more.<br class="">
                                <br class="">
                                Regards,<br class="">
                                Michael<br class="">
                                <br class="">
                                <br class="">
                                <blockquote type="cite" class="">Am
                                  31.10.18 um 20:08 schrieb Tam?s
                                  Kov?cs:<br class="">
                                  I have a Peugeot iOn, and i wan't to
                                  create own metrics for battery temp
                                  (66 piece) and voltage (88 (old) or
                                  80(new) piece) for all cell (and show
                                  on web interface), and i don't
                                  understand how can i create it. Now my
                                  data in array-s from can messages
                                  6E1-6E4.<br class="">
                                  My git fork:
                                  <a class="moz-txt-link-freetext" href="https://github.com/KommyKT/Open-Vehicle-Monitoring-System-3/tree/peugeot">https://github.com/KommyKT/Open-Vehicle-Monitoring-System-3/tree/peugeot</a>
<a class="moz-txt-link-rfc2396E" href="https://github.com/KommyKT/Open-Vehicle-Monitoring-System-3/tree/peugeot"><https://github.com/KommyKT/Open-Vehicle-Monitoring-System-3/tree/peugeot></a><br class="">
                                  vehicle_mitsubishi<br class="">
                                  <br class="">
                                </blockquote>
                                <br class="">
                                -- <br class="">
                                Michael Balzer * Helkenberger Weg 9 *
                                D-58256 Ennepetal<br class="">
                                Fon 02333 / 833 5735 * Handy 0176 / 206
                                989 26<br class="">
_______________________________________________<br class="">
                                OvmsDev mailing list<br class="">
                                <a class="moz-txt-link-abbreviated" href="mailto:OvmsDev@lists.openvehicles.com">OvmsDev@lists.openvehicles.com</a>
                                <a class="moz-txt-link-rfc2396E" href="mailto:OvmsDev@lists.openvehicles.com"><mailto: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>
                                <a class="moz-txt-link-rfc2396E" href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev"><http://lists.openvehicles.com/mailman/listinfo/ovmsdev></a><br class="">
                              </blockquote>
                              <br class="">
                              <br class="">
_______________________________________________<br class="">
                              OvmsDev mailing list<br class="">
                              <a class="moz-txt-link-abbreviated" href="mailto:OvmsDev@lists.openvehicles.com">OvmsDev@lists.openvehicles.com</a>
                              <a class="moz-txt-link-rfc2396E" href="mailto:OvmsDev@lists.openvehicles.com"><mailto: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>
                              <a class="moz-txt-link-rfc2396E" href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev"><http://lists.openvehicles.com/mailman/listinfo/ovmsdev></a><br class="">
                            </blockquote>
                            <br class="">
                            -- <br class="">
                            Michael Balzer * Helkenberger Weg 9 *
                            D-58256 Ennepetal<br class="">
                            Fon 02333 / 833 5735 * Handy 0176 / 206 989
                            26<br class="">
_______________________________________________<br class="">
                            OvmsDev mailing list<br class="">
                            <a class="moz-txt-link-abbreviated" href="mailto:OvmsDev@lists.openvehicles.com">OvmsDev@lists.openvehicles.com</a>
                            <a class="moz-txt-link-rfc2396E" href="mailto:OvmsDev@lists.openvehicles.com"><mailto: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>
                            <a class="moz-txt-link-rfc2396E" href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev"><http://lists.openvehicles.com/mailman/listinfo/ovmsdev></a><br class="">
                          </blockquote>
                          <br class="">
                          <br class="">
                          <br class="">
_______________________________________________<br class="">
                          OvmsDev mailing list<br class="">
                          <a class="moz-txt-link-abbreviated" href="mailto:OvmsDev@lists.openvehicles.com">OvmsDev@lists.openvehicles.com</a>
                          <a class="moz-txt-link-rfc2396E" href="mailto:OvmsDev@lists.openvehicles.com"><mailto: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>
                          <a class="moz-txt-link-rfc2396E" href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev"><http://lists.openvehicles.com/mailman/listinfo/ovmsdev></a><br class="">
                        </blockquote>
                        <br class="">
                        -- <br class="">
                        Michael Balzer * Helkenberger Weg 9 * D-58256
                        Ennepetal<br class="">
                        Fon 02333 / 833 5735 * Handy 0176 / 206 989 26<br class="">
                        _______________________________________________<br class="">
                        OvmsDev mailing list<br class="">
                        <a class="moz-txt-link-abbreviated" href="mailto:OvmsDev@lists.openvehicles.com">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="">
                      </blockquote>
                      <br class="">
                      -------------- next part --------------<br class="">
                      An HTML attachment was scrubbed...<br class="">
                      URL:
<a class="moz-txt-link-rfc2396E" href="http://lists.openvehicles.com/pipermail/ovmsdev/attachments/20181110/b17e54e7/attachment.html"><http://lists.openvehicles.com/pipermail/ovmsdev/attachments/20181110/b17e54e7/attachment.html></a><br class="">
                      <br class="">
                      ------------------------------<br class="">
                      <br class="">
                      Subject: Digest Footer<br class="">
                      <br class="">
                      _______________________________________________<br class="">
                      OvmsDev mailing list<br class="">
                      <a class="moz-txt-link-abbreviated" href="mailto:OvmsDev@lists.openvehicles.com">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="">
                      <br class="">
                      <br class="">
                      ------------------------------<br class="">
                      <br class="">
                      End of OvmsDev Digest, Vol 82, Issue 10<br class="">
                      ***************************************<br class="">
                    </blockquote>
                    <br class="">
                    _______________________________________________<br class="">
                    OvmsDev mailing list<br class="">
                    <a class="moz-txt-link-abbreviated" href="mailto:OvmsDev@lists.openvehicles.com">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="">
                  </blockquote>
                  <br class="">
                  _______________________________________________<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>
              </div>
            </blockquote>
          </div>
          <br class="">
        </div>
      </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">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 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="">OvmsDev@lists.openvehicles.com</a><br class="">http://lists.openvehicles.com/mailman/listinfo/ovmsdev<br class=""></div></blockquote></div><br class=""></div></body></html>