home-assistant.io/source/_components/sensor.history_stats.markdown
2017-06-08 22:25:43 -07:00

4.8 KiB

layout, title, description, date, sidebar, comments, sharing, footer, logo, ha_category, ha_iot_class, ha_release
layout title description date sidebar comments sharing footer logo ha_category ha_iot_class ha_release
page History Statistics Sensor Instructions about how to integrate historical statistics into Home Assistant. 2017-02-10 12:00 true false true true home-assistant.png Sensor Local Polling 0.39

The history_stats sensor platform provides quick statistics about another component or platforms, using data from the history.

It can track how long the component has been in a specific state, in a custom time period.

Examples of what you can track:

  • How long you were at home this week
  • How long the lights were ON yesterday
  • How long you watched TV today

{% linkable_title Configuration %}

To enable the history statistics sensor, add the following lines to your configuration.yaml:

# Example configuration.yaml entry
sensor:
  - platform: history_stats
    name: Lamp ON today
    entity_id: light.my_lamp
    state: 'on'
    type: time
    start: '{% raw %}{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}{% endraw %}'
    end: '{% raw %}{{ now() }}{% endraw %}'

Configuration variables:

  • entity_id (Required): The entity you want to track
  • state (Required): The state you want to track
  • name (Optional): Name displayed on the frontend
  • type (Optional): The type of sensor: time, ratio, or count. Defaults to time
  • start: When to start the measure (timestamp or datetime).
  • end: When to stop the measure (timestamp or datetime)
  • duration: Duration of the measure

You have to provide **exactly 2** of `start`, `end` and `duration`.
You can use [template extensions](/topics/templating/#home-assistant-template-extensions) such as `now()` or `as_timestamp()` to handle dynamic dates, as shown in the examples below.

{% linkable_title Sensor type %}

Depending on the sensor type you choose, the history_stats component can show different values:

  • time: The default value, which is the tracked time, in hours
  • ratio: The tracked time divided by the length of your period, as a percentage
  • count: How many times the component you track was changed to the state you track

{% linkable_title Time periods %}

The history_stats component will execute a measure within a precise time period. You should always provide 2 of the following :

  • When the period starts (start variable)
  • When the period ends (end variable)
  • How long is the period (duration variable)

As start and end variables can be either datetimes or timestamps, you can configure almost any period you want.

{% linkable_title Duration %}

The duration variable is used when the time period is fixed. Different syntaxes for the duration are supported, as shown below.

# 6 hours
duration: 06:00
# 1 minute, 30 seconds
duration: 00:01:30
# 2 hours and 30 minutes
duration:
  # supports seconds, minutes, hours, days
  hours: 2
  minutes: 30

{% linkable_title Examples %}

Here are some examples of periods you could work with, and what to write in your configuration.yaml:

Today: starts at 00:00 of the current day and ends right now.

    start: '{% raw %}{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}{% endraw %}'
    end: '{% raw %}{{ now() }}{% endraw %}'

Yesterday: ends today at 00:00, lasts 24 hours.

    end: '{% raw %}{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}{% endraw %}'
    duration:
      hours: 24

This morning (6AM - 11AM): starts today at 6, lasts 5 hours.

    start: '{% raw %}{{ now().replace(hour=6).replace(minute=0).replace(second=0) }}{% endraw %}'
    duration:
      hours: 5

Current week: starts last Monday at 00:00, ends right now.

Here, last Monday is today as a timestamp, minus 86400 times the current weekday (86400 is the number of seconds in one day, the weekday is 0 on Monday, 6 on Sunday).

    start: '{% raw %}{{ as_timestamp( now().replace(hour=0).replace(minute=0).replace(second=0) ) - now().weekday() * 86400 }}{% endraw %}'
    end: '{% raw %}{{ now() }}{% endraw %}'

Last 30 days: ends today at 00:00, lasts 30 days. Easy one.

    end: '{% raw %}{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}{% endraw %}'
    duration:
      days: 30

All your history starts at timestamp = 0, and ends right now.

    start: '{% raw %}{{ 0 }}{% endraw %}'
    end: '{% raw %}{{ now() }}{% endraw %}'

The `/dev-template` page of your home-assistant UI can help you check if the values for `start`, `end` or `duration` are correct. If you want to check if your period is right, just click on your component, the `from` and `to` attributes will show the start and end of the period, nicely formatted.