From f9a8396d6d3b973dc67c45c9b3ab2e44180e71a7 Mon Sep 17 00:00:00 2001 From: Thomas Dietrich Date: Thu, 2 Dec 2021 10:50:28 +0100 Subject: [PATCH] Statistics additional binary characteristics (#20543) --- source/_integrations/statistics.markdown | 27 +++++++++++++++------ source/images/screenshots/stats-sensor.png | Bin 15464 -> 0 bytes 2 files changed, 20 insertions(+), 7 deletions(-) delete mode 100644 source/images/screenshots/stats-sensor.png diff --git a/source/_integrations/statistics.markdown b/source/_integrations/statistics.markdown index 451c18871ce..f2df4ff171c 100644 --- a/source/_integrations/statistics.markdown +++ b/source/_integrations/statistics.markdown @@ -18,7 +18,7 @@ The `statistics` sensor platform observes the state of a source sensor and provi The statistics sensor updates with every source sensor update. The value of the sensor represents one statistical characteristic, with `mean` being the default. The time period and/or number of recent state that should be considered is an important factor here. Check the configuration section below for options. -Both `sensor` and `binary_sensor` are supported as source sensor. In the case of a binary sensor only the state changes are counted. +Both `sensor` and `binary_sensor` are supported as source sensor. A number of characteristics is supported by each, please check below. Assuming the [`recorder`](/integrations/recorder/) integration is running, historical sensor data is read from the database on startup and is available immediately after a restart of the platform. If the [`recorder`](/integrations/recorder/) integration is *not* running, it can take some time for the sensor to start reporting data because some characteristics calculations require more than one source sensor value. @@ -26,6 +26,10 @@ Assuming the [`recorder`](/integrations/recorder/) integration is running, histo The following statistical characteristics are available. Pay close attention to the right configuration of `sampling_size` and `max_age`, as most characterists are directly related to the count of samples or the age of processed samples. +### Numeric Source Sensor + +The following characteristics are supported for `sensor` source sensors: + | State Characteristic | Description | | -------------------- | ----------- | | `average_linear` | The average value of stored measurements under consideration of the time distances between them. A linear interpolation is applied per measurement pair. Good suited to observe a source sensor with non-periodic sensor updates and when continuous behavior is represented by the measurements (e.g. outside temperature). @@ -50,6 +54,17 @@ The following statistical characteristics are available. Pay close attention to | `value_min` | The smallest value among the number of measurements. | `variance` | The [variance](https://en.wikipedia.org/wiki/Standard_deviation) of an assumed normal distribution from all measurements. +### Binary Source Sensor + +The following characteristic are supported for `binary_sensor` source sensors: + +| State Characteristic | Description | +| -------------------- | ----------- | +| `average_step` | A percentage of time across all stored measurements, in which the binary source sensor was "On". If over the course of one hour, movement was detected for 6 minutes, the `average_step` is 10%. +| `average_timeless` | The percentage of stored measurements, for which the binary source sensor was "On". Time in on/off states is ignored. If over the course of one hour, a single movement was detected, the `average_timeless` is 33.3% (assuming the stored measurements "Off", "On", "Off"). Equal to `mean`. +| `count` | The number of stored source sensor readings. This number is limited by `sampling_size` and can be low within the bounds of `max_age`. +| `mean` | The percentage of stored measurements, for which the binary source sensor was "On". Time in on/off states is ignored. If over the course of one hour, a single movement was detected, the `average_timeless` is 33.3% (assuming the stored measurements "Off", "On", "Off"). + ## Attributes A statistics sensor presents the following attributes for context about its internal status. @@ -69,6 +84,7 @@ sensor: - platform: statistics name: "Bathroom humidity mean over last 24 hours" entity_id: sensor.bathroom_humidity + state_characteristic: mean max_age: hours: 24 @@ -83,6 +99,7 @@ sensor: - platform: statistics entity_id: binary_sensor.movement + state_characteristic: count ``` {% configuration %} @@ -96,9 +113,9 @@ name: default: Stats type: string state_characteristic: - description: The characteristic that should be used as the state of the statistics sensor (see table above). + description: The characteristic that should be used as the state of the statistics sensor (see table above). **Beware** that this parameter will become mandatory in a future version. Include in your configuration. If currently omitted, the default characteristic for a `sensor` source sensor is "mean", for a `binary_sensor` "count". required: false - default: mean + default: mean / count type: string sampling_size: description: Maximum number of source sensor measurements stored. Be sure to choose a reasonably high number if the limit should be driven by `max_age` instead. @@ -125,7 +142,3 @@ quantile_method: default: exclusive type: string {% endconfiguration %} - -

- -

diff --git a/source/images/screenshots/stats-sensor.png b/source/images/screenshots/stats-sensor.png deleted file mode 100644 index 7d6f40773674d1c10f7e030d3124144eef98216a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15464 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 DJxQMD