Statistic sensor reset/clear at midnight for daily min & max temperature

I created a helper for it and an automation to update it based on the forecasted peak time provided by the forecast.solar integration

alias: Set PV peak time
description: >-
  Update the PV peak time for today. Always update at sunrise. For updates,
  check the validity of the time set.
trigger:
  - platform: sun
    event: sunrise
    offset: 0
    id: sunrise
  - platform: state
    entity_id:
      - sensor.energy_production_today
    id: update
condition:
  - condition: template
    value_template: "{{ states('sensor.power_highest_peak_time_today') != 'unavailable' }}"
    alias: Not unavailable
action:
  - if:
      - condition: trigger
        id: update
      - condition: or
        conditions:
          - condition: time
            after: input_datetime.pv_peak_time
            alias: Do not update if peak time has passed
          - condition: template
            value_template: >-
              {{
              as_local(as_datetime(states('sensor.power_highest_peak_time_today')))
              < now() }}
            alias: Do not set time to the past
    then:
      - stop: ""
    alias: Stop if update conditions are not met
  - service: input_datetime.set_datetime
    target:
      entity_id: input_datetime.pv_peak_time
    data:
      datetime: >-
        {{ as_local(as_datetime(states('sensor.power_highest_peak_time_today')))
        }}
mode: queued
max: 10

Interesting idea.
Until now I use the peak time from SolCast integration for Node-Red flows with which I distribute the charge of the battery over the day.

However, for my sensor with the highest output of the day, I want to store the time when my PV modules delivered the highest output.
For this I now use the following definition:

      attributes:
        power_updated: "{{ states.sensor.sg_total_dc_power_max_today.last_changed | as_local }}"
2 Likes

This might be a bit out of the discussion, but it’s still related so will give it a try.

I’m looking for a long term statistic of the outdoor average temperature for each day (from midnight to midnight). A sensor providing daily outside temperature as average, max and min combined would be all in.

Long description of reason: this is for tracing power usage vs. outside temperature. And since I do have power consumption for each day easily available a daily average of the outside temperature would be a great way to monitor the performance. Heating is heat pump, 3x16kW air-to-water heat pumps, and the arrangement of the outside modules is questioned for low performace (mounted too close, and short circuit of air) so any changes made could affect power consumtion, but if outside temperature differs is’t nothing worth when comparing.

I have invested quite some time in this and thought I want to share the results:

To create two sensors that saves the max/min with timestamp as an attribute and resets periodically:

template:
  - trigger:
      - platform: state
        not_to:
          - unknown
          - unavailable
        entity_id: sensor.my_temp_sensor
      - platform: template
        value_template: "{{ now().hour == 0 }}" #resets each day
    action:
      - variables:
          source: "{{ states('sensor.my_temp_sensor') | float }}"
          now: "{{ now() }}"
    sensor:
      - name: Todays Maximum Temp
        unique_id: today_temp_max_d
        unit_of_measurement: "°C"
        device_class: temperature
        state_class: measurement
        icon: mdi:thermometer-chevron-up
        state: |
          {% set current = (this.state or trigger.to_state.state) | float(source) %}
          {{ source if trigger.platform == 'template' else [source, current] | max }}
        attributes:
          datetime: |
            {% set current = (this.state or trigger.to_state.state) | float(source) %}
            {{ now if (trigger.platform == 'template' or source > current) else this.attributes.datetime|default(now) }}
           
      - name: Todays Minimum Temp
        unique_id: today_temp_min_d
        unit_of_measurement: "°C"
        device_class: temperature
        state_class: measurement
        icon: mdi:thermometer-chevron-down
        state: |
          {% set current = (this.state or trigger.to_state.state) | float(source) %}
          {{ source if trigger.platform == 'template' else [source, current] | min }}
        attributes:
          datetime: |
            {% set current = (this.state or trigger.to_state.state) | float(source) %}
            {{ now if (trigger.platform == 'template' or source < current) else this.attributes.datetime|default(now) }}

Change this for other intervals:

value_template: "{{ now().hour == 0 }}" #resets every day
value_template: "{{ now().weekday() == 0 }}" #resets every week
value_template: "{{  now().day == 1 }}" #resets every month
value_template: "{{ now().month == 1 }}" #resets each year

Thanks to @Didgeridrew for the idea.

3 Likes

Hello
Using the utility meter to retain non changing records longer is neat, thanks for that.
I seem to have implemented what you suggested successfully. One qq please, the timestamp recorded with the daily reading doesn’t appear to get stored in the utility helper attributes. Is there a way to add that too?
Apologies if I missed a detail along the way.

The only timestamp attribute recorded by a Utility Meter sensor is when it is reset (last_reset).

1 Like

Wow 
 I didn’t expect so complicate when trying to get outdoor min temperature of the day :crazy_face:
First I tried with a custom intergration “Daily Sensor” but got non reliable results
I will learn these template and try to play with it
Thank you

I’m gonna reply here. We now have the statistic sensor in the GUI. I set it on 24 hour interval for some test value, but there is no option to reset it at midnight. It looks like it resets at the time I created the sensor
 Is there a way to fix this?

I have a little bit different need of a maximum sensor value of the last calendar day (=yesterday). How to do that?