For maximumSince and minimumSince, there is no way to do what you are asking, unless you use the persistence data directly from your database, or by accessing it through the REST API. There are some examples of this in the forum, like this one…
I’m not sure what you mean.
Here is a simple example script for using Jython to get the length of time in milliseconds that an Item was in each it’s states within a given time period. SwitchItems are tricky, but I think I got them working with this too. I have only done some simple testing, so let me know if you find any issues. Should be enough to play with… and much easier than the rules DSL.
import json
from java.sql import Timestamp
from core.actions import Exec
from core.log import lo…
The averageSince can be gotten using the following:
The average of the data from the last 24 hours:
day1_average = averageSince(now.minusDays(1))
The average of the data between the last 2*24
hours and 24 hours:
day2_average = 2 * averageSince(now.minusDays(2)) - day1_average
The average of the data between the last 3*24
hours and 2*24
hours:
day3_average = 3 * averageSince(now.minusDays(3)) - day2_average - day1_average
day3_average = 3 * averageSince(now.minusDays(3)) - (2 * averageSince(now.minusDays(2)) - day1_average) - day1_average
day3_average = 3 * averageSince(now.minusDays(3)) - 2 * averageSince(now.minusDays(2)) + day1_average - day1_average
day3_average = 3 * averageSince(now.minusDays(3)) - 2 * averageSince(now.minusDays(2))
The average of the data between the last 4*24
hours and 3*24
hours:
day4_average = 4 * averageSince(now.minusDays(4)) - (3 * averageSince(now.minusDays(3)) - day2_average - day1_average) - day2_average - day1_average
day4_average = 4 * averageSince(now.minusDays(4)) - 3 * averageSince(now.minusDays(3)) + day2_average + day1_average - day2_average - day1_average
day4_average = 4 * averageSince(now.minusDays(4)) - 3 * averageSince(now.minusDays(3))
So, this all just reduces down to…
dayX_average = X * averageSince(now.minusDays(X)) - (X - 1)(averageSince(now.minusDays(X - 1)))
Here is a function that you can use in Jython…
from core.log import logging, LOG_PREFIX, log_traceback
LOG = logging.getLogger("{}.TEST".format(LOG_PREFIX))
@log_traceback
def daily_average(item_name, days_ago):
from org.joda.time.DateTime import now
from core.actions import PersistenceExtensions
item = itemRegistry.getItem(item_name)
if days_ago == 1:
return PersistenceExtensions.averageSince(item, now().minusDays(1)).doubleValue()
else:
return days_ago * PersistenceExtensions.averageSince(item, now().minusDays(days_ago)).doubleValue() - (days_ago - 1) * PersistenceExtensions.averageSince(item, now().minusDays(days_ago - 1)).doubleValue()
If you look into your persistence database to verify this formula, keep in mind that averageSince is a time-weighted average.