[Ovmsdev] OVMS Poller module/singleton
Michael Balzer
dexter at expeedo.de
Wed Jun 19 00:08:45 HKT 2024
Michael,
I've received the new drive report notifications now; these need to be
changed: please do not use text notifications to transport CSV data.
That's what "data" notifications are meant for, which are stored in
their raw form on the server for later retrieval. See e.g. the vehicle
trip & grid logs for reference on how to build the messages, or have a
look at the specific Twizy and UpMiiGo data messages.
Data notifications also are designed to transport one row at a time, so
you normally don't run into buffer size issues. A header can be supplied
as a row, but you normally add one when downloading the data from the
server, so tools don't need to filter these out. I provide headers
automatically on my server for known message types, just send me your
template and I'll include that.
Apart from that, the timing statistics now seem to work pretty well,
providing valuable insights.
Regards,
Michael
Am 14.06.24 um 08:59 schrieb Michael Geddes:
> Thankyou.
> I was more worried that we might be waiting on each other.
>
> I don't think I have quite the correct able to test on my friends Leaf
> properly, or does it use the standard cable?
>
> Anyway, let me know what I can do to.
>
> //.ichael
>
> On Fri, 14 Jun 2024 at 14:46, Michael Balzer via OvmsDev
> <ovmsdev at lists.openvehicles.com> wrote:
>
> Sorry, I know I'm behind with PRs.
>
> I'll try to find some time this weekend.
>
> Regards,
> Michael
>
>
> Am 14.06.24 um 08:31 schrieb Michael Geddes via OvmsDev:
>> Was this all good? I want to make sure I get to the bottom of
>> this whole issue asap!
>>
>> https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/pull/1018
>>
>>
>> Was there something else you needed me to work on to make sure
>> this all works for all supported cars?
>>
>> //.ichael
>>
>> On Sun, 26 May 2024 at 21:15, Michael Balzer via OvmsDev
>> <ovmsdev at lists.openvehicles.com> wrote:
>>
>> OK, I see now why it wouldn't send the notification: the V2 &
>> V3 server register for notifications up to
>> COMMAND_RESULT_NORMAL = 1024 characters.
>>
>> The report quickly becomes larger than 1024 characters, so
>> the notifications no longer get sent via the server connectors.
>>
>> You need to either reduce the size, split the report, or use
>> data notifications instead.
>>
>> On the reset value init: for my float targeting smoothing
>> helper class for the UpMiiGo, I implemented a gradual ramp up
>> from 1 to the requested sample size. You can do something
>> similar also with powers of 2. IOW, yes, initialization from
>> the first values received is perfectly OK.
>>
>> Regards,
>> Michael
>>
>>
>> Am 26.05.24 um 14:35 schrieb Michael Geddes:
>>>
>>> It _/should/_ already be sending a report on charge stop.
>>>
>>> MyEvents.RegisterEvent(TAG, "vehicle.charge.stop",
>>> std::bind(&OvmsPollers::VehicleChargeStop, this, _1, _2));
>>>
>>> Reset on charge start/vehicle on is a good idea.
>>>
>>> A question – would it be silly if the first value after a
>>> reset, rather than using 0 average to start with, if the
>>> average got set to the initial value? I’m in 2 minds about
>>> it. It would make the average more useful quicker.
>>>
>>> //.ichael
>>>
>>> On Sun, 26 May 2024, 19:39 Michael Balzer via OvmsDev,
>>> <ovmsdev at lists.openvehicles.com> wrote:
>>>
>>> As the averages quickly decline when idle, an automatic
>>> report should probably also be sent on charge stop.
>>>
>>> Also, I think you should automatically reset the timer
>>> statistics on drive & charge start.
>>>
>>> First stats from charging my UpMiiGo:
>>>
>>> Type | count | Utlztn | Time
>>> | per s | [‰] | [ms]
>>> ---------------+--------+--------+---------
>>> Poll:PRI Avg| 1.00| 0.723| 0.716
>>> Peak| | 1.282| 3.822
>>> ---------------+--------+--------+---------
>>> Poll:SRX Avg| 7.72| 1.246| 0.184
>>> Peak| | 3.128| 1.058
>>> ---------------+--------+--------+---------
>>> RxCan1[7ae] Avg| 2.48| 0.915| 0.362
>>> Peak| | 1.217| 1.661
>>> ---------------+--------+--------+---------
>>> RxCan1[7cf] Avg| 4.76| 1.928| 0.397
>>> Peak| | 2.317| 2.687
>>> ---------------+--------+--------+---------
>>> RxCan1[7ed] Avg| 3.38| 1.251| 0.327
>>> Peak| | 8.154| 12.273
>>> ---------------+--------+--------+---------
>>> RxCan1[7ee] Avg| 0.21| 0.066| 0.297
>>> Peak| | 0.225| 1.690
>>> ---------------+--------+--------+---------
>>> TxCan1[744] Avg| 1.49| 0.022| 0.011
>>> Peak| | 0.032| 0.095
>>> ---------------+--------+--------+---------
>>> TxCan1[765] Avg| 3.89| 0.134| 0.027
>>> Peak| | 0.155| 0.113
>>> ---------------+--------+--------+---------
>>> TxCan1[7e5] Avg| 2.32| 0.038| 0.013
>>> Peak| | 0.295| 0.084
>>> ---------------+--------+--------+---------
>>> TxCan1[7e6] Avg| 1 0.21| 0.002| 0.008
>>> Peak| | 0.010| 0.041
>>> ---------------+--------+--------+---------
>>> Cmd:State Avg| 0.00| 0.000| 0.007
>>> Peak| | 0.005| 0.072
>>> ===============+========+========+=========
>>> Total Avg| 27.46| 6.324| 2.349
>>>
>>>
>>> Overall healthy I'd say, but let's see how it compares.
>>>
>>> 7ed is the BMS, the peak time is probably related to the
>>> extended cell data logging -- I've enabled log intervals
>>> for both cell voltages & temperatures.
>>>
>>> Regards,
>>> Michael
>>>
>>> Am 26.05.24 um 08:42 schrieb Michael Balzer via OvmsDev:
>>>
>>> The notification works on my devices, it only has a
>>> garbled per mille character -- see attached
>>> screenshot. The same applies to the mail version:
>>>
>>>
>>> Poller timing is: on
>>>
>>> Type | count | Utlztn | Time
>>>
>>> | per s | [‰] | [ms]
>>>
>>> ---------------+--------+--------+---------
>>>
>>> Poll:PRI Avg| 0.25| 0.119| 0.382
>>>
>>> Peak| | 0.513| 0.678
>>>
>>> ---------------+--------+--------+---------
>>>
>>> RxCan1[597] Avg| 0.01| 0.004| 0.021
>>>
>>> Peak| | 0.000| 0.338
>>>
>>> ---------------+--------+--------+---------
>>>
>>> RxCan1[59b] Avg| 0.01| 0.011| 0.053
>>>
>>> Peak| | 0.000| 0.848
>>>
>>> ---------------+--------+--------+---------
>>>
>>> Cmd:State Avg| 0.01| 0.002| 0.012
>>>
>>> Peak| | 0.000| 0.120
>>>
>>> ===============+========+========+=========
>>>
>>> Total Avg| 0.28| 0.135| 0.468
>>>
>>>
>>> The encoding is a general issue. The character
>>> encoding for text messages via V2/MP is quite old &
>>> clumsy, it's got an issue with the degree celcius
>>> character as well. We previously tried to keep all
>>> text messages within the SMS safe character set
>>> (which e.g. lead to writing just "C" instead of
>>> "°C"). I'd say we should head towards UTF-8 now. If
>>> we ever refit SMS support, we can recode on the fly.
>>>
>>> Regarding not seeing the notification on your phone:
>>>
>>> a) Check your notification subtype/channel filters
>>> on the module. See
>>> https://docs.openvehicles.com/en/latest/userguide/notifications.html#suppress-notifications
>>>
>>> b) Check your notification vehicle filters on the
>>> phone (menu on notification tab): if you enabled the
>>> vehicle filter, it will add the messages of not
>>> currently selected vehicles to the list only, but
>>> not raise a system notification. (Applies to the
>>> Android App, no idea about the iOS version)
>>>
>>> Regards,
>>> Michael
>>>
>>> Am 26.05.24 um 06:32 schrieb Michael Geddes:
>>>
>>> Hi,
>>>
>>> I'm trying to finalise this now .. and one last
>>> thing is that I don't get the report coming to
>>> my mobile. I'm using the command:
>>>
>>> MyNotify.NotifyString("info", "poller.report",
>>> buf.c_str());
>>>
>>> Where the buffer string is just the same as the
>>> report output. Should I be using some other
>>> format or command?
>>>
>>> I get "alert" types (like the ioniq5 door-open
>>> alert) fine to my mobile.
>>>
>>> Michael.
>>>
>>> On Sun, 19 May 2024, 12:51 Michael Balzer via
>>> OvmsDev, <ovmsdev at lists.openvehicles.com> wrote:
>>>
>>> A builtin web UI for this seems a bit over
>>> the top. Builtin web config pages should
>>> focus on user features, this is clearly a
>>> feature only needed during/for the
>>> development/extension of a vehicle adapter.
>>> Development features in the web UI are
>>> confusing for end users.
>>>
>>> If persistent enabling/disabling is done by
>>> a simple config command (e.g. "config set
>>> can poller.trace on"), that's also doable by
>>> users.
>>>
>>> Regards,
>>> Michael
>>>
>>> Am 19.05.24 um 02:06 schrieb Michael Geddes:
>>>
>>> I was so focused on how I calculated the
>>> value that I totally missed that ‰ would
>>> be a better description. I could also
>>> use the system 'Ratio' unit... so % or ‰.
>>>
>>> I'll make space to put 'Avg' on the row.
>>> Was trying to limit the width for output
>>> on a mobile. I agree it would make it
>>> easier to understand.
>>>
>>> Totals also makes sense.
>>>
>>> Should I make this a configuration that
>>> can be set on the web-page? I'd
>>> probably use a configuration change
>>> notification so that the very bit
>>> setting is sync'd with the
>>> 'configuration' value.
>>>
>>> //.ichael
>>>
>>> On Sat, 18 May 2024, 14:05 Michael
>>> Balzer, <dexter at expeedo.de> wrote:
>>>
>>> I'm not sure whether the 'max'
>>> should be the maximum of the
>>> smoothed value.. or the maximum
>>> of the raw value.
>>>
>>>
>>> It should normally be the maximum of
>>> the raw value I think, the maximum
>>> of the smoothed value cannot tell
>>> about how bad the processing of an
>>> ID can become.
>>>
>>> The naming in the table is a bit
>>> confusing I think. (besides: I've
>>> never seen "ave" as the abbreviation
>>> for average)
>>>
>>> If I understand you correctly, "time
>>> ms per s" is the time share in per
>>> mille, so something in that
>>> direction would be more clear, and
>>> "length ms" would then be "time [ms]".
>>>
>>> The totals for all averages in the
>>> table foot would also be nice.
>>>
>>> Maybe "Ave" (or avg?) also should be
>>> placed on the left, as the "peak"
>>> label now suggests being the peak of
>>> the average.
>>>
>>> Btw, keep in mind, not all "edge"
>>> users / testers are developers (e.g.
>>> the Twizy driver I'm in contact
>>> with), collecting stats feedback for
>>> vehicles from testers should be
>>> straight forward. Maybe add a
>>> data/history record, sent
>>> automatically on every drive/charge
>>> stop when the poller tracing is on?
>>>
>>> Regards,
>>> Michael
>>>
>>> Am 18.05.24 um 02:28 schrieb Michael
>>> Geddes:
>>>
>>> You did say max/pead value. I
>>> also halved the N for both.
>>>
>>> I'm not sure whether the 'max'
>>> should be the maximum of the
>>> smoothed value.. or the maximum
>>> of the raw value.
>>>
>>> This is currently the raw-value
>>> maximum.
>>>
>>> The problem is that the middle
>>> column is the maximum of the
>>> {{sum over 10s} / (10*1000,000)
>>>
>>> I could easily change the
>>> 'period' to 1s and see how that
>>> goes.. was just trying to reduce
>>> the larger calculations.
>>>
>>> Usage: poller
>>> [pause|resume|status|times|trace]
>>>
>>>
>>> OVMS# poller time status
>>> Poller timing is: on
>>> Type | Count | Ave
>>> time | Ave length
>>> | per s | ms per
>>> s | ms
>>> -------------+----------+-----------+-----------
>>> Poll:PRI | 1.00|
>>> 0.559| 0.543
>>> peak | |
>>> 0.663| 1.528
>>> -------------+----------+-----------+-----------
>>> Poll:SRX | 0.08|
>>> 0.009| 0.038
>>> peak | |
>>> 0.068| 0.146
>>> -------------+----------+-----------+-----------
>>> CAN1 RX[778] | 0.11|
>>> 0.061| 0.280
>>> peak | |
>>> 0.458| 1.046
>>> -------------+----------+-----------+-----------
>>> CAN1 RX[7a8] | 0.04|
>>> 0.024| 0.124
>>> peak | |
>>> 0.160| 0.615
>>> -------------+----------+-----------+-----------
>>> CAN1 TX[770] | 0.05|
>>> 0.004| 0.016
>>> peak | |
>>> 0.022| 0.102
>>> -------------+----------+-----------+-----------
>>> CAN1 TX[7a0] | 0.02|
>>> 0.002| 0.011
>>> peak | |
>>> 0.010| 0.098
>>> -------------+----------+-----------+-----------
>>> CAN1 TX[7b3] | 0.01|
>>> 0.001| 0.006
>>> peak | |
>>> 0.000| 0.099
>>> -------------+----------+-----------+-----------
>>> CAN1 TX[7e2] | 0.02|
>>> 0.002| 0.011
>>> peak | |
>>> 0.010| 0.099
>>> -------------+----------+-----------+-----------
>>> CAN1 TX[7e4] | 0.08|
>>> 0.008| 0.048
>>> peak | |
>>> 0.049| 0.107
>>> -------------+----------+-----------+-----------
>>> Cmd:State | 0.00|
>>> 0.000| 0.005
>>> peak | |
>>> 0.000| 0.094
>>>
>>> On Fri, 17 May 2024 at 15:26,
>>> Michael Geddes
>>> <frog at bunyip.wheelycreek.net> wrote:
>>>
>>> This is what I have now.
>>>
>>> The one on the end is the
>>> one MIchael B was after
>>> using an N of 32. (up for
>>> discussion).
>>>
>>> The middle is the time
>>> spent in that even t per
>>> second. It accumulates
>>> times (in microseconds), and
>>> then every 10s it stores it
>>> as smoothed (N=16) value.
>>>
>>> The Count is similar (except
>>> that we store a value of
>>> '100' as 1 event so it can
>>> be still integers and has 2
>>> decimal places).
>>>
>>> Every received poll does a
>>> 64bit difference to 32bit
>>> (for the elapsed time) and
>>> 64bit comparison (for
>>> end-of-period).
>>>
>>> It also does 1x 32bit
>>> smoothing and 2x 32bit adds.
>>>
>>> Then at the end of a 10s
>>> period, it will do a 64bit
>>> add to get the next
>>> end-of-period value, as well
>>> as the 2x 32bit smoothing calcs.
>>>
>>> This is from the Ioniq 5 so
>>> not any big values yet. You
>>> can certainly see how
>>> insignificant the TX
>>> callbacks are.
>>>
>>> I'll leave it on for when
>>> the car is moving and gets
>>> some faster polling.
>>>
>>> OVMS# poll time status
>>> Poller timing is: on
>>> Type | Count |
>>> Ave time | Ave Length
>>> | per s | ms
>>> per s | ms
>>> -------------+----------+-----------+-----------
>>> Poll:PRI | 1.00|
>>> 0.540| 0.539
>>> Poll:SRX | 0.03|
>>> 0.004| 0.017
>>> CAN1 RX[778] | 0.06|
>>> 0.042| 0.175
>>> CAN1 TX[770] | 0.04|
>>> 0.002| 0.008
>>> Cmd:State | 0.01|
>>> 0.001| 0.005
>>>
>>> ----------------------8<--------------------------------
>>>
>>> Nice smoothing class (forces
>>> N as a power of 2):
>>>
>>> constexpr unsigned
>>> floorlog2(unsigned x)
>>> {
>>> return x == 1 ? 0 :
>>> 1+floorlog2(x >> 1);
>>> }
>>> /* Maintain a smoothed
>>> average using shifts for
>>> division.
>>> * T should be an integer type
>>> * N needs to be a power of 2
>>> */
>>> template <typename T,
>>> unsigned N>
>>> class average_util_t
>>> {
>>> private:
>>> T m_ave;
>>> public:
>>> average_util_t() : m_ave(0) {}
>>> static const uint8_t
>>> _BITS = floorlog2(N);
>>> void add( T val)
>>> {
>>> static_assert(N == (1 <<
>>> _BITS), "N must be a power
>>> of 2");
>>> m_ave = (((N-1) *
>>> m_ave) + val) >> _BITS;
>>> }
>>> T get() { return m_ave; }
>>> operator T() { return
>>> m_ave; }
>>> };
>>>
>>> On Thu, 16 May 2024 at
>>> 10:29, Michael Geddes
>>> <frog at bunyip.wheelycreek.net>
>>> wrote:
>>>
>>> Thanks Michael,
>>>
>>> My calculations give me
>>> ((2^32)-1) /
>>> (1000*1000*3600) = only
>>> 1.2 hours of processing
>>> time in 32bit. The
>>> initial subtraction is
>>> 64bit anyway and I can't
>>> see a further 64bit
>>> addition being a
>>> problem. I have the
>>> calculations being
>>> performed in doubles at
>>> print-out where
>>> performance is not
>>> really an issue anyway.
>>> (Though apparently doing
>>> 64 bit division is worse
>>> than floating point).
>>>
>>> In addition
>>>
>>> * I currently have this
>>> being able to be turned
>>> on and off and reset
>>> manually (only do it
>>> when required).
>>>
>>> * For the lower volume
>>> commands, the smoothed
>>> average is not going to
>>> be useful - the count is
>>> more interesting for
>>> different reasons.
>>>
>>> * The total time is
>>> quite useful. Ie a high
>>> average time doesn't
>>> matter if the count is
>>> low. The things that are
>>> affecting performance
>>> are stuff with high
>>> total time. Stuff which
>>> is happening 100 times a
>>> second needs to be a
>>> much lower average than
>>> once a second.
>>>
>>> * A measure like 'time
>>> per minute/second' and
>>> possibly count per
>>> minute/seconds as a
>>> smoothed average would
>>> potentially be more
>>> useful. (or in addition?)
>>>
>>> I think we could do
>>> _that_ in a reasonably
>>> efficient manner using a
>>> 64 bit 'last measured
>>> time', a 32 bit
>>> accumulated value and
>>> the stored 32 bit
>>> rolling average.
>>>
>>> It would boils down to
>>> some iterative (integer)
>>> sums and multiplications
>>> plus a divide by n ^
>>> (time periods passed) -
>>> which is a shift - and
>>> which can be optimised
>>> to '0' if
>>> 'time-periods-passed' is
>>> more than
>>> 32/(bits-per-n) -
>>> effectively limiting the
>>> number of iterations.
>>>
>>> The one issue I can see
>>> is that we need to
>>> calculate 'number of
>>> time-periods passed'
>>> which is a 64 bit
>>> subtraction followed by
>>> a 32 bit division (not
>>> optimisable to a simple
>>> shift).
>>>
>>> * I'm also happy to keep
>>> a rolling (32bit)
>>> average time.
>>>
>>> Even if you assume
>>> averages in the 100ms,
>>> 32bit is going to
>>> happily support an N
>>> of 64 or even 128.
>>>
>>> Am I right in
>>> thinking that the choice
>>> of N is highly dependent
>>> on frequency. For things
>>> happening 100 times per
>>> second, you might want
>>> an N like 128.. where
>>> things happening once per
>>>
>>> second, you might
>>> want an N of 4 or 8.
>>> The other things we keep
>>> track of in this manner
>>> we have a better idea of
>>> the frequency of the thing.
>>>
>>> How about we have (per
>>> record type):
>>>
>>> * total count (since
>>> last reset?) (32 bit)
>>>
>>> * smoothed average of
>>> time per instance (32 bit)
>>>
>>> * ?xx? total
>>> accumulated time since
>>> last reset (64bit) ??
>>> <-- with the below stats
>>> this is much less useful
>>>
>>> * last-measured-time
>>> (64 bit)
>>>
>>> * accumulated count
>>> since last time-period
>>> (16bit - but maybe 32bit
>>> anyway for byte alignment?)
>>>
>>> * smoothed average of
>>> count per time-period
>>> (32bit)
>>>
>>> * accumulated time
>>> since last time-period
>>> (32bit)
>>>
>>> * smoothed average of
>>> time per time-period (32bit)
>>>
>>> It's possible to keep the
>>>
>>> Is this going to be too
>>> much per record type?
>>> The number of 'records'
>>> we are keeping is quite
>>> low (so 10 to 20 maybe)
>>> - so it's not a huge
>>> memory burden.
>>>
>>> Thoughts?
>>>
>>> //.ichael
>>>
>>> On Thu, 16 May 2024 at
>>> 03:09, Michael Balzer
>>> via OvmsDev
>>> <ovmsdev at lists.openvehicles.com>
>>> wrote:
>>>
>>> esp_timer_get_time()
>>> is the right choice
>>> for precision timing.
>>>
>>> I'd say uint32 is
>>> enough though, even
>>> if counting
>>> microseconds that
>>> can hold a total of
>>> more than 71 hours
>>> of actual processing
>>> time. uint64 has a
>>> significant
>>> performance penalty,
>>> although I don't
>>> recall the overhead
>>> for simple additions.
>>>
>>> Also & more
>>> important, the
>>> average wouldn't be
>>> my main focus, but
>>> the maximum
>>> processing time seen
>>> per ID, which seems
>>> to be missing in
>>> your draft.
>>>
>>> Second thought on
>>> the average… the
>>> exact overall
>>> average really has a
>>> minor meaning, I'd
>>> rather see the
>>> current average,
>>> adapting to the
>>> current mode of
>>> operation
>>> (drive/charge/…). I
>>> suggest feeding the
>>> measurements to a
>>> low pass filter to
>>> get the smoothed
>>> average of the last
>>> n measurements. Pattern:
>>>
>>> runavg = ((N-1) *
>>> runavg + newval) / N
>>>
>>> By using a low power
>>> of 2 for N (e.g. 8
>>> or 16), you can
>>> replace the division
>>> by a simple bit
>>> shift, and have
>>> enough headroom to
>>> use 32 bit integers.
>>>
>>> Regards,
>>> Michael
>>>
>>> Am 15.05.24 um 06:51
>>> schrieb Michael
>>> Geddes via OvmsDev:
>>>
>>> Formatting
>>> aside, I have
>>> implemented what
>>> I think Michael
>>> B was
>>> suggesting. This
>>> is a sample run
>>> on the Ioniq 5
>>> (which doesn't
>>> have
>>> unsolicited RX
>>> events).
>>>
>>> This uses the
>>> call esp_timer_get_time()
>>> got get a 64bit
>>> *microseconds*
>>> since started
>>> value - and
>>> works out the
>>> time to execute
>>> that way. It's
>>> looking at
>>> absolute time
>>> and not time in
>>> the Task - so
>>> other things
>>> going on at the
>>> same time in
>>> other tasks will
>>> have an effect.
>>> (The normal tick
>>> count doesn't
>>> have nearly
>>> enough
>>> resolution to be
>>> useful - any
>>> other ideas on
>>> measurement?)
>>> I've got total
>>> accumulated time
>>> displaying in
>>> seconds and the
>>> average in
>>> milliseconds
>>> currently - but
>>> I can change
>>> that easy enough.
>>>
>>> The cumulative
>>> time is stored
>>> as uint64_t
>>> which will be
>>> plenty, as 32bit
>>> wouldn't be
>>> nearly enough.
>>>
>>> OVMS# *poller
>>> time on*
>>> Poller timing is
>>> now on
>>>
>>> OVMS# *poller
>>> time status*
>>> Poller timing is: on
>>> Poll [PRI]
>>> : n=390
>>> tot=0.2s ave=0.586ms
>>> Poll [SRX]
>>> : n=316
>>> tot=0.1s ave=0.196ms
>>> CAN1 RX[0778]
>>> : n=382
>>> tot=0.2s ave=0.615ms
>>> CAN1 RX[07a8]
>>> : n=48
>>> tot=0.0s ave=0.510ms
>>> CAN1 RX[07bb]
>>> : n=162
>>> tot=0.1s ave=0.519ms
>>> CAN1 RX[07ce]
>>> : n=33
>>> tot=0.0s ave=0.469ms
>>> CAN1 RX[07ea]
>>> : n=408
>>> tot=0.2s ave=0.467ms
>>> CAN1 RX[07ec]
>>> : n=486
>>> tot=0.2s ave=0.477ms
>>> CAN3 RX[07df]
>>> : n=769
>>> tot=0.2s ave=0.261ms
>>> CAN1 TX[0770]
>>> : n=191
>>> tot=0.0s ave=0.054ms
>>> CAN1 TX[07a0]
>>> : n=16
>>> tot=0.0s ave=0.047ms
>>> CAN1 TX[07b3]
>>> : n=31
>>> tot=0.0s ave=0.069ms
>>> CAN1 TX[07c6]
>>> : n=11
>>> tot=0.0s ave=0.044ms
>>> CAN1 TX[07e2]
>>> : n=82
>>> tot=0.0s ave=0.067ms
>>> CAN1 TX[07e4]
>>> : n=54
>>> tot=0.0s ave=0.044ms
>>> Set State
>>> : n=7
>>> tot=0.0s ave=0.104ms
>>>
>>> This is probably
>>> going to be
>>> quite useful in
>>> general! The TX
>>> call-backs don't
>>> seem to be
>>> significant
>>> here. (oh, I
>>> should probably
>>> implement a
>>> reset of the
>>> values too).
>>>
>>> //.ichael
>>>
>>> On Sun, 12 May
>>> 2024 at 22:58,
>>> Michael Geddes
>>> <frog at bunyip.wheelycreek.net>
>>> wrote:
>>>
>>> Yeah - I
>>> certainly
>>> wasn't going
>>> to put a
>>> hard limit.
>>> Just a log
>>> above a
>>> certain
>>> time, that
>>> being said,
>>> the idea of
>>> just
>>> collecting
>>> stats (being
>>> able to turn
>>> it on via a
>>> "poller
>>> timer" set
>>> of commands)
>>> would be
>>> much more
>>> useful. I'll
>>> look into that.
>>>
>>> Average time
>>> is probably
>>> a good stat
>>> - and
>>> certainly
>>> what we care
>>> about.
>>>
>>> I actually
>>> am hopeful
>>> that those
>>> couple of
>>> things I did
>>> might help
>>> reduce that
>>> average time
>>> quite a bit
>>> (that
>>> short-cutting
>>> the isotp
>>> protocol
>>> handling
>>> especially).
>>>
>>> That p/r
>>> with logging
>>> changes
>>> might help
>>> reduce the
>>> unproductive
>>> log time
>>> further, but
>>> also makes
>>> it possible
>>> to turn on
>>> the poller
>>> logging
>>> without the
>>> RX task logs
>>> kicking in.
>>>
>>> //.ichael
>>>
>>> On Sun, 12
>>> May 2024 at
>>> 22:29,
>>> Michael
>>> Balzer via
>>> OvmsDev
>>> <ovmsdev at lists.openvehicles.com>
>>> wrote:
>>>
>>> Warning
>>> /
>>> gathering
>>> debug
>>> statistics
>>> about
>>> slow
>>> processing
>>> can be
>>> helpful,
>>> but
>>> there
>>> must not
>>> be a
>>> hard
>>> limit.
>>> Frame/poll
>>> response
>>> processing
>>> may need
>>> disk or
>>> network
>>> I/O, and
>>> the
>>> vehicle
>>> task may
>>> be
>>> starving
>>> from
>>> punctual
>>> high
>>> loads on
>>> higher
>>> priority
>>> tasks
>>> (e.g.
>>> networking)
>>> or by
>>> needing
>>> to wait
>>> for some
>>> semaphore
>>> --
>>> that's
>>> outside
>>> the
>>> application's
>>> control,
>>> and must
>>> not lead
>>> to
>>> termination/recreation
>>> of the
>>> task (in
>>> case
>>> you're
>>> heading
>>> towards
>>> that
>>> direction).
>>>
>>> I have
>>> no idea
>>> how much
>>> processing
>>> time the
>>> current
>>> vehicles
>>> actually
>>> need in
>>> their
>>> respective
>>> worst
>>> cases.
>>> Your
>>> draft is
>>> probably
>>> too lax,
>>> poll
>>> responses
>>> and
>>> frames
>>> normally
>>> need to
>>> be
>>> processed
>>> much
>>> faster.
>>> I'd say
>>> 10 ms is
>>> already
>>> too
>>> slow,
>>> but any
>>> wait for
>>> a
>>> queue/semaphore
>>> will
>>> already
>>> mean at
>>> least 10
>>> ms
>>> (FreeRTOS
>>> tick).
>>> Probably
>>> best to
>>> begin
>>> with
>>> just
>>> collecting
>>> stats.
>>>
>>> Btw, to
>>> help in
>>> narrowing
>>> down the
>>> actual
>>> problem
>>> case,
>>> the
>>> profiler
>>> could
>>> collect
>>> max
>>> times
>>> per RX
>>> message ID.
>>>
>>> Regards,
>>> Michael
>>>
>>> Am
>>> 12.05.24
>>> um 10:41
>>> schrieb
>>> Michael
>>> Geddes:
>>>
>>> I
>>> have
>>> a
>>> question
>>> for
>>> Michael
>>> B
>>> (or
>>> whoever)
>>> - I
>>> have
>>> a
>>> commit
>>> lined
>>> up
>>> that
>>> would
>>> add
>>> a
>>> bit
>>> of a
>>> time
>>> check
>>> to
>>> the
>>> poller
>>> loop.
>>> What
>>> do
>>> we
>>> expect
>>> the
>>> maximum time
>>> to
>>> execute
>>> a
>>> poller
>>> loop
>>> command
>>> should
>>> be?
>>>
>>> This
>>> is a
>>> rough
>>> idea
>>> (in
>>> ms)
>>> I
>>> have..
>>> based
>>> on
>>> nothing
>>> much
>>> really,
>>> so
>>> any
>>> ideas
>>> would
>>> be
>>> appreciated:
>>>
>>>
>>> int
>>> TardyMaxTime_ms(OvmsPoller::OvmsPollEntryType
>>> entry_type)
>>> {
>>>
>>>
>>> switch
>>> (entry_type)
>>>
>>> {
>>>
>>>
>>> case
>>> OvmsPoller::OvmsPollEntryType::Poll:
>>> return
>>> 80;
>>>
>>>
>>> case
>>> OvmsPoller::OvmsPollEntryType::FrameRx:
>>> return
>>> 30;
>>>
>>>
>>> case
>>> OvmsPoller::OvmsPollEntryType::FrameTx:
>>> return
>>> 20;
>>>
>>>
>>> case
>>> OvmsPoller::OvmsPollEntryType::Command:
>>> return
>>> 10;
>>>
>>>
>>> case
>>> OvmsPoller::OvmsPollEntryType::PollState:
>>> return
>>> 15;
>>> default:
>>> return
>>> 80;
>>>
>>> }
>>> }
>>>
>>> //.ichael
>>>
>>> On
>>> Mon,
>>> 6
>>> May
>>> 2024
>>> at
>>> 07:45,
>>> Michael
>>> Geddes
>>> <frog at bunyip.wheelycreek.net>
>>> wrote:
>>>
>>> I
>>> realise
>>> that
>>> I
>>> was
>>> only
>>> using
>>> the
>>> standard
>>> cable
>>> to
>>> test
>>> -
>>> which
>>> probably is
>>> not
>>> sufficient
>>> -
>>> I
>>> haven't
>>> looked
>>> closely
>>> at
>>> how
>>> the
>>> Leaf
>>> OBD
>>> to
>>> Db9
>>> cable
>>> is
>>> different
>>> from
>>> standard.
>>>
>>> Ah,
>>> my
>>> bad
>>> out
>>> the
>>> queue
>>> length.
>>> We
>>> are
>>> definitely
>>> queueing
>>> more
>>> messages
>>> though.
>>> From
>>> my
>>> log
>>> of
>>> when
>>> the
>>> overflow
>>> happened,
>>> the
>>> poller
>>> was
>>> in
>>> state
>>> 0
>>> which
>>> means
>>> OFF
>>> -
>>> ie
>>> nothing
>>> was
>>> being
>>> sent!!
>>>
>>> I'll
>>> look
>>> at
>>> the
>>> TX
>>> message
>>> thing
>>> -
>>> opt
>>> in
>>> sounds
>>> good
>>> -
>>> though
>>> it
>>> shouldn't
>>> be
>>> playing
>>> that
>>> much
>>> of
>>> a
>>> part
>>> here
>>> as
>>> the
>>> TXs
>>> are
>>> infrequent
>>> in
>>> this
>>> case
>>> (or
>>> zero
>>> when
>>> the
>>> leaf
>>> is
>>> off
>>> or driving)
>>> -
>>> On
>>> the
>>> ioniq
>>> 5
>>> when
>>> I'm
>>> using
>>> the
>>> HUD
>>> -
>>> I'm
>>> polling
>>> quite
>>> frequently
>>> -
>>> multiple
>>> times
>>> per
>>> second
>>> and
>>> that
>>> seems
>>> to
>>> be
>>> fine!.
>>>
>>> I
>>> did
>>> find
>>> an
>>> issue
>>> with
>>> the
>>> throttling ..
>>> but
>>> it
>>> would
>>> still
>>> mostly
>>> apply
>>> the
>>> throttling
>>> where
>>> it
>>> matters,
>>> so
>>> again,
>>> it
>>> shouldn't
>>> be
>>> the
>>> problem
>>> (also,
>>> we
>>> aren't
>>> transmitting
>>> in
>>> the
>>> leaf
>>> case).
>>>
>>> The
>>> change
>>> I
>>> made
>>> to
>>> the
>>> logging
>>> of
>>> RX
>>> messages
>>> showed
>>> how
>>> many
>>> in
>>> a
>>> row
>>> were
>>> dropped...
>>> and
>>> it
>>> was
>>> mostly
>>> 1
>>> only
>>> in
>>> a
>>> run
>>> -
>>> which
>>> means
>>> even
>>> if
>>> it
>>> is
>>> a
>>> short
>>> time
>>> between
>>> -
>>> that
>>> means
>>> that
>>> the
>>> drops
>>> are
>>> being
>>> interleaved
>>> by
>>> at
>>> least
>>> one
>>> success!
>>>
>>> Sooo..
>>> I'm
>>> still
>>> wondering
>>> what
>>> is
>>> going
>>> on.
>>> Some
>>> things
>>> I'm
>>> going
>>> to
>>> try:
>>>
>>> *
>>> If
>>> the
>>> number
>>> of
>>> messages
>>> on
>>> the
>>> Can
>>> bus
>>> (coming
>>> in
>>> through
>>> RX)
>>> means
>>> that
>>> the
>>> queue
>>> is
>>> slowly
>>> getting
>>> longer
>>> and
>>> not
>>> quite
>>> catching
>>> up,
>>> then
>>> making
>>> the
>>> queue
>>> longer
>>> will
>>> help
>>> it
>>> last
>>> longer...
>>> but
>>> only
>>> pushes
>>> the
>>> problem
>>> down
>>> the
>>> road.
>>>
>>>
>>> -
>>> Add
>>> 'current
>>> queue
>>> length'
>>> to
>>> the
>>> poller
>>> status
>>> information
>>> to
>>> see
>>> if
>>> this
>>> is
>>> indeed
>>> the
>>> case?
>>>
>>>
>>>
>>> -
>>> Add
>>> some
>>> kind
>>> of
>>> alert
>>> when
>>> the
>>> queue
>>> reaches
>>> a
>>> %
>>> full?
>>>
>>> *
>>> Once
>>> you
>>> start
>>> overflowing
>>> and
>>> getting
>>> overflow
>>> log
>>> messages,
>>> I
>>> wonder
>>> if
>>> this
>>> is
>>> then
>>> contributing
>>> to
>>> the
>>> problem.
>>>
>>>
>>> -
>>> Push
>>> the
>>> overflow
>>> logging
>>> into
>>> Poller
>>> Task
>>> which
>>> can
>>> look
>>> at
>>> how
>>> many
>>> drops
>>> occurred
>>> since
>>> last
>>> received
>>> item.
>>>
>>> *
>>> Split
>>> up
>>> the
>>> flags
>>> for
>>> the
>>> poller
>>> messages
>>> into
>>> 2:
>>>
>>>
>>> -
>>> Messages
>>> that
>>> are/could
>>> be
>>> happening
>>> in
>>> the
>>> TX/RX
>>> tasks
>>>
>>>
>>> -
>>> Other
>>> noisy
>>> messages
>>> that
>>> always
>>> happen
>>> in
>>> the
>>> poller
>>> task.
>>>
>>> Thoughts
>>> on
>>> what
>>> else
>>> we
>>> might
>>> measure
>>> to
>>> figure
>>> out
>>> what
>>> is
>>> going
>>> on?
>>>
>>> //.ichael
>>>
>>> On
>>> Sun,
>>> 5
>>> May
>>> 2024,
>>> 19:29
>>> Michael
>>> Balzer
>>> via
>>> OvmsDev,
>>> <ovmsdev at lists.openvehicles.com>
>>> wrote:
>>>
>>> Michael,
>>>
>>> the
>>> queue
>>> size
>>> isn't
>>> in
>>> bytes,
>>> it's
>>> in
>>> messages:
>>>
>>>
>>> *
>>> @param
>>> uxQueueLength
>>> The
>>> maximum
>>> number
>>> of
>>> items
>>> that
>>> the
>>> queue
>>> can
>>> contain.
>>> *
>>> *
>>> @param
>>> uxItemSize
>>> The
>>> number
>>> of
>>> bytes
>>> each
>>> item
>>> in
>>> the
>>> queue
>>> will
>>> require.
>>>
>>>
>>> Also,
>>> from
>>> the
>>> time
>>> stamps
>>> in
>>> Dereks
>>> log
>>> excerpt,
>>> there
>>> were
>>> quite
>>> some
>>> dropped
>>> frames
>>> in
>>> that
>>> time
>>> window
>>> --
>>> at
>>> least
>>> 23
>>> frames
>>> in
>>> 40
>>> ms,
>>> that's
>>> bad.
>>>
>>> Queue
>>> sizes
>>> are
>>> currently:
>>>
>>> CONFIG_OVMS_HW_CAN_RX_QUEUE_SIZE=60
>>> CONFIG_OVMS_VEHICLE_CAN_RX_QUEUE_SIZE=60
>>>
>>> The
>>> new
>>> poller
>>> now
>>> channels
>>> all
>>> TX
>>> callbacks
>>> through
>>> the
>>> task
>>> queue
>>> additionally
>>> to
>>> RX
>>> and
>>> commands.
>>> So
>>> setting
>>> the
>>> queue
>>> size
>>> to
>>> be
>>> larger
>>> than
>>> the
>>> CAN
>>> RX
>>> queue
>>> size
>>> seems
>>> appropriate.
>>>
>>> Nevertheless,
>>> an
>>> overflow
>>> with
>>> more
>>> than
>>> 60
>>> waiting
>>> messages
>>> still
>>> indicates
>>> some
>>> too
>>> long
>>> processing
>>> time
>>> in
>>> the
>>> vehicle
>>> task.
>>>
>>> TX
>>> callbacks
>>> previously
>>> were
>>> done
>>> directly
>>> in
>>> the
>>> CAN
>>> context,
>>> and
>>> no
>>> current
>>> vehicle
>>> overrides
>>> the
>>> empty
>>> default
>>> handler,
>>> so
>>> this
>>> imposed
>>> almost
>>> no
>>> additional
>>> overhead.
>>> By
>>> requiring
>>> a
>>> queue
>>> entry
>>> for
>>> each
>>> TX
>>> callback,
>>> this
>>> feature
>>> now
>>> has
>>> a
>>> potentially
>>> high
>>> impact
>>> for
>>> all
>>> vehicles.
>>> If
>>> passing
>>> these
>>> to
>>> the
>>> task
>>> is
>>> actually
>>> necessary,
>>> it
>>> needs
>>> to
>>> become
>>> an
>>> opt-in
>>> feature,
>>> so
>>> only
>>> vehicles
>>> subscribing
>>> to
>>> the
>>> callback
>>> actually
>>> need
>>> to
>>> cope
>>> with
>>> that
>>> additional
>>> load
>>> &
>>> potential
>>> processing
>>> delays
>>> involved.
>>>
>>> Regards,
>>> Michael
>>>
>>>
>>
>> --
>> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal
>> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
>>
>> _______________________________________________
>> OvmsDev mailing list
>> OvmsDev at lists.openvehicles.com
>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
>>
>>
>> _______________________________________________
>> OvmsDev mailing list
>> OvmsDev at lists.openvehicles.com
>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
>
> --
> Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal
> Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
>
> _______________________________________________
> OvmsDev mailing list
> OvmsDev at lists.openvehicles.com
> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
>
--
Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal
Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openvehicles.com/pipermail/ovmsdev/attachments/20240618/1a1f9f3e/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 203 bytes
Desc: OpenPGP digital signature
URL: <http://lists.openvehicles.com/pipermail/ovmsdev/attachments/20240618/1a1f9f3e/attachment-0001.sig>
More information about the OvmsDev
mailing list