Compare start() to datetime array Hot/Cold


#1

I am working with Facilities that have devices, and each device has a measurement series. I have a couple of metrics I am trying to make work: SimpleMetric A, SimpleMetric B, SimpleMetric Datetime, and a CompoundMetric . Metrics A and B are standalone and working fine. Metric Datetime reads a value from the measurement series and returns it if it exists. e.g. “exists(datetime) ? datetime : null”. The compound metric should compare that datetime to “start()” and select metric A or B based on the result. e.g. “(start() > Metric Datetime) ? Metric A : Metric B”. The compound metric works for a single device. When calling the metric from a facility, I get an error that it can’t make the comparison between “start()” and “Metric Datetime”. I took a look at the result of Metric Datetime when called from a Facility and it returns an array of datetimes–one for each device measurement series under the facility. What I would like, is for each measurement series, it will make the comparison between the datetime and the start, and choose the correct metric A or B. I have been trying to play with the map function, but haven’t gotten it to work. Is there a way to compare “start()” to an array of values in this way?


#2

Can you share how you’re using map and why it’s result does not match your expectations?


#3

If your metric works fine at the device level, you might want to call rollupMetrics() for multiple devices instead of calling evalMetrics() at the Facility level…


#4

@bachr the usage of map that I see in existing metrics from my project is always in simple metrics. I was not able to replicate that functionality: “sum(map())” without error. I according to documentation and c3base, you can make a call in the form of: “array.map()”. I tried several variations of “DateTimeMetric.map()” but was not able to make the expressions to evaluate the mapped value against “start()”.

@ishka We were making these changes for performance reasons and my understanding was that using a rollup would be costly. The two options I found were to use a rollup or to move the logic to simple metrics and aggregate there. I’m currently trying a variation of the latter and it’s functional, but not quite as complete as I originally wanted. For our use-case it will suffice. It seems like collections need to be aggregated before the compound metric level.