Add standard deviation calculation to group (#112076)

* Add standard deviation calculation to group

* Add missing bits

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
This commit is contained in:
Bertrand Roussel 2024-05-10 01:16:09 -07:00 committed by GitHub
parent 8c54587d7e
commit 11f5b48724
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 25 additions and 8 deletions

View file

@ -35,14 +35,15 @@ from .sensor import async_create_preview_sensor
from .switch import async_create_preview_switch from .switch import async_create_preview_switch
_STATISTIC_MEASURES = [ _STATISTIC_MEASURES = [
"min", "last",
"max", "max",
"mean", "mean",
"median", "median",
"last", "min",
"range",
"sum",
"product", "product",
"range",
"stdev",
"sum",
] ]

View file

@ -66,6 +66,7 @@ ATTR_MEDIAN = "median"
ATTR_LAST = "last" ATTR_LAST = "last"
ATTR_LAST_ENTITY_ID = "last_entity_id" ATTR_LAST_ENTITY_ID = "last_entity_id"
ATTR_RANGE = "range" ATTR_RANGE = "range"
ATTR_STDEV = "stdev"
ATTR_SUM = "sum" ATTR_SUM = "sum"
ATTR_PRODUCT = "product" ATTR_PRODUCT = "product"
SENSOR_TYPES = { SENSOR_TYPES = {
@ -75,6 +76,7 @@ SENSOR_TYPES = {
ATTR_MEDIAN: "median", ATTR_MEDIAN: "median",
ATTR_LAST: "last", ATTR_LAST: "last",
ATTR_RANGE: "range", ATTR_RANGE: "range",
ATTR_STDEV: "stdev",
ATTR_SUM: "sum", ATTR_SUM: "sum",
ATTR_PRODUCT: "product", ATTR_PRODUCT: "product",
} }
@ -250,6 +252,16 @@ def calc_range(
return {}, value return {}, value
def calc_stdev(
sensor_values: list[tuple[str, float, State]],
) -> tuple[dict[str, str | None], float]:
"""Calculate standard deviation value."""
result = (sensor_value for _, sensor_value, _ in sensor_values)
value: float = statistics.stdev(result)
return {}, value
def calc_sum( def calc_sum(
sensor_values: list[tuple[str, float, State]], sensor_values: list[tuple[str, float, State]],
) -> tuple[dict[str, str | None], float]: ) -> tuple[dict[str, str | None], float]:
@ -284,6 +296,7 @@ CALC_TYPES: dict[
"median": calc_median, "median": calc_median,
"last": calc_last, "last": calc_last,
"range": calc_range, "range": calc_range,
"stdev": calc_stdev,
"sum": calc_sum, "sum": calc_sum,
"product": calc_product, "product": calc_product,
} }

View file

@ -189,14 +189,15 @@
"selector": { "selector": {
"type": { "type": {
"options": { "options": {
"min": "Minimum", "last": "Most recently updated",
"max": "Maximum", "max": "Maximum",
"mean": "Arithmetic mean", "mean": "Arithmetic mean",
"median": "Median", "median": "Median",
"last": "Most recently updated", "min": "Minimum",
"product": "Product",
"range": "Statistical range", "range": "Statistical range",
"sum": "Sum", "stdev": "Standard deviation",
"product": "Product" "sum": "Sum"
} }
} }
}, },

View file

@ -48,6 +48,7 @@ MAX_VALUE = max(VALUES)
MEAN = statistics.mean(VALUES) MEAN = statistics.mean(VALUES)
MEDIAN = statistics.median(VALUES) MEDIAN = statistics.median(VALUES)
RANGE = max(VALUES) - min(VALUES) RANGE = max(VALUES) - min(VALUES)
STDEV = statistics.stdev(VALUES)
SUM_VALUE = sum(VALUES) SUM_VALUE = sum(VALUES)
PRODUCT_VALUE = prod(VALUES) PRODUCT_VALUE = prod(VALUES)
@ -61,6 +62,7 @@ PRODUCT_VALUE = prod(VALUES)
("median", MEDIAN, {}), ("median", MEDIAN, {}),
("last", VALUES[2], {ATTR_LAST_ENTITY_ID: "sensor.test_3"}), ("last", VALUES[2], {ATTR_LAST_ENTITY_ID: "sensor.test_3"}),
("range", RANGE, {}), ("range", RANGE, {}),
("stdev", STDEV, {}),
("sum", SUM_VALUE, {}), ("sum", SUM_VALUE, {}),
("product", PRODUCT_VALUE, {}), ("product", PRODUCT_VALUE, {}),
], ],