Add sum-differences characteristics to statistics component (#79439)

This commit is contained in:
Thomas Dietrich 2022-10-25 16:46:47 +02:00 committed by GitHub
parent 7838bb3ebe
commit 3346ddcd86
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 81 additions and 5 deletions

View file

@ -79,6 +79,9 @@ STAT_MEDIAN = "median"
STAT_NOISINESS = "noisiness"
STAT_QUANTILES = "quantiles"
STAT_STANDARD_DEVIATION = "standard_deviation"
STAT_SUM = "sum"
STAT_SUM_DIFFERENCES = "sum_differences"
STAT_SUM_DIFFERENCES_NONNEGATIVE = "sum_differences_nonnegative"
STAT_TOTAL = "total"
STAT_VALUE_MAX = "value_max"
STAT_VALUE_MIN = "value_min"
@ -114,6 +117,9 @@ STATS_NUMERIC_SUPPORT = {
STAT_NOISINESS,
STAT_QUANTILES,
STAT_STANDARD_DEVIATION,
STAT_SUM,
STAT_SUM_DIFFERENCES,
STAT_SUM_DIFFERENCES_NONNEGATIVE,
STAT_TOTAL,
STAT_VALUE_MAX,
STAT_VALUE_MIN,
@ -160,6 +166,9 @@ STAT_NUMERIC_RETAIN_UNIT = {
STAT_MEDIAN,
STAT_NOISINESS,
STAT_STANDARD_DEVIATION,
STAT_SUM,
STAT_SUM_DIFFERENCES,
STAT_SUM_DIFFERENCES_NONNEGATIVE,
STAT_TOTAL,
STAT_VALUE_MAX,
STAT_VALUE_MIN,
@ -670,10 +679,7 @@ class StatisticsSensor(SensorEntity):
def _stat_noisiness(self) -> StateType:
if len(self.states) >= 2:
diff_sum = sum(
abs(j - i) for i, j in zip(list(self.states), list(self.states)[1:])
)
return diff_sum / (len(self.states) - 1)
return cast(float, self._stat_sum_differences()) / (len(self.states) - 1)
return None
def _stat_quantiles(self) -> StateType:
@ -695,11 +701,31 @@ class StatisticsSensor(SensorEntity):
return statistics.stdev(self.states)
return None
def _stat_total(self) -> StateType:
def _stat_sum(self) -> StateType:
if len(self.states) > 0:
return sum(self.states)
return None
def _stat_sum_differences(self) -> StateType:
if len(self.states) >= 2:
diff_sum = sum(
abs(j - i) for i, j in zip(list(self.states), list(self.states)[1:])
)
return diff_sum
return None
def _stat_sum_differences_nonnegative(self) -> StateType:
if len(self.states) >= 2:
diff_sum_nn = sum(
(j - i if j >= i else j - 0)
for i, j in zip(list(self.states), list(self.states)[1:])
)
return diff_sum_nn
return None
def _stat_total(self) -> StateType:
return self._stat_sum()
def _stat_value_max(self) -> StateType:
if len(self.states) > 0:
return max(self.states)

View file

@ -769,6 +769,56 @@ async def test_state_characteristics(hass: HomeAssistant):
"value_9": float(round(statistics.stdev(VALUES_NUMERIC), 2)),
"unit": "°C",
},
{
"source_sensor_domain": "sensor",
"name": "sum",
"value_0": STATE_UNKNOWN,
"value_1": float(VALUES_NUMERIC[-1]),
"value_9": float(sum(VALUES_NUMERIC)),
"unit": "°C",
},
{
"source_sensor_domain": "sensor",
"name": "sum_differences",
"value_0": STATE_UNKNOWN,
"value_1": STATE_UNKNOWN,
"value_9": float(
sum(
[
abs(20 - 17),
abs(15.2 - 20),
abs(5 - 15.2),
abs(3.8 - 5),
abs(9.2 - 3.8),
abs(6.7 - 9.2),
abs(14 - 6.7),
abs(6 - 14),
]
)
),
"unit": "°C",
},
{
"source_sensor_domain": "sensor",
"name": "sum_differences_nonnegative",
"value_0": STATE_UNKNOWN,
"value_1": STATE_UNKNOWN,
"value_9": float(
sum(
[
20 - 17,
15.2 - 0,
5 - 0,
3.8 - 0,
9.2 - 3.8,
6.7 - 0,
14 - 6.7,
6 - 0,
]
)
),
"unit": "°C",
},
{
"source_sensor_domain": "sensor",
"name": "total",