Template Entities
The entities above are created from the yaml below. These are defined as trigger based template sensors in Home Assistant.
The code as I have it written makes extensive use of a Jinja based custom template. That code is available here.
Code:
- trigger:
- id: nightly_reset
platform: time
at: '23:59:30'
- id: off_2on
platform: state
entity_id: switch.nachio_zone_1_active
to: 'on'
from: 'off'
- id: on_2off
platform: state
entity_id: switch.nachio_zone_1_active
to: 'off'
from: 'on'
sensor:
- name: Valve Z01 Last Start Time
unique_id: valve_z01_last_start_time
state: |
{% from 'irrigation_time.jinja' import get_last_start_time %}
{{ get_last_start_time(1, trigger.id) }}
attributes:
run_duration: |
{% from 'irrigation_time.jinja' import get_run_duration %}
{{ get_run_duration(1, trigger.id) }}
last_end_time: |
{% from 'irrigation_time.jinja' import get_last_end_time %}
{{ get_last_end_time(1, trigger.id) }}
count_today: |
{% from 'irrigation_time.jinja' import get_count_today %}
{{ get_count_today(1, trigger.id) }}
count_last_week: |
{% from 'irrigation_time.jinja' import get_count_last_week %}
{{ get_count_last_week(1, trigger.id) }}
count_this_week: |
{% from 'irrigation_time.jinja' import get_count_this_week %}
{{ get_count_this_week(1, trigger.id) }}
day1: |
{% from 'irrigation_time.jinja' import get_run_day_of_week %}
{{ get_run_day_of_week(1, 0, trigger.id) }}
day2: |
{% from 'irrigation_time.jinja' import get_run_day_of_week %}
{{ get_run_day_of_week(1, 1, trigger.id) }}
day3: |
{% from 'irrigation_time.jinja' import get_run_day_of_week %}
{{ get_run_day_of_week(1, 2, trigger.id) }}
day4: |
{% from 'irrigation_time.jinja' import get_run_day_of_week %}
{{ get_run_day_of_week(1, 3, trigger.id) }}
day5: |
{% from 'irrigation_time.jinja' import get_run_day_of_week %}
{{ get_run_day_of_week(1, 4, trigger.id) }}
day6: |
{% from 'irrigation_time.jinja' import get_run_day_of_week %}
{{ get_run_day_of_week(1, 5, trigger.id) }}
day7: |
{% from 'irrigation_time.jinja' import get_run_day_of_week %}
{{ get_run_day_of_week(1, 6, trigger.id) }}
- trigger:
- id: nightly_reset
platform: time
at: '23:59:30'
- platform: state
entity_id: switch.nachio_zone_1_active
to: 'off'
from: 'on'
sensor:
- name: Valve Z01 Time Today
unique_id: valve_z01_time_today
state: |
{% set date_last_run = (states('sensor.valve_z01_last_start_time') | float(0) | timestamp_custom('%Y-%m-%d')) %}
{% set date_today = now().date() | string %}
{% set prev_time = states('sensor.valve_z01_time_today') | default('00:00', true) %}
{% set parsed_prev = strptime(prev_time, '%M:%S') %}
{% set seconds_prev_today = parsed_prev.minute * 60 + parsed_prev.second %}
{% set seconds_this_run = state_attr('sensor.valve_z01_last_start_time','run_duration') | float(0) %}
{% if trigger is defined and trigger.id == 'nightly_reset' %}
{{ '00:00' }}
{% elif date_last_run == date_today %}
{{ (seconds_prev_today + seconds_this_run) | timestamp_custom('%M:%S', false) }}
{% else %}
{{ seconds_this_run | timestamp_custom('%M:%S', false) }}
{% endif %}
attributes:
time_last_week: |
{% set time_this_week = state_attr('sensor.valve_z01_time_today', 'time_this_week') | default('00:00:00', true) %}
{% set time_last_week = state_attr('sensor.valve_z01_time_today', 'time_last_week') | default('00:00:00', true) %}
{% if trigger.id == "nightly_reset" and (now() + timedelta(seconds=30)).weekday() == 6 %}
{{ time_this_week }}
{% else %}
{{ time_last_week }}
{% endif %}
time_this_week: |
{% set prev_time = state_attr('sensor.valve_z01_time_today', 'time_this_week') | default('00:00:00', true) %}
{% set parsed = strptime(prev_time, '%H:%M:%S') %}
{% set seconds_prev = (parsed.hour * 3600) + (parsed.minute * 60) + parsed.second %}
{% set seconds_this_run = state_attr('sensor.valve_z01_last_start_time', 'run_duration') | float(0) %}
{% if trigger is defined and trigger.id == 'nightly_reset' and (now() + timedelta(seconds=30)).weekday() == 6 %}
{{ '00:00:00' }}
{% elif trigger is defined and trigger.id == 'nightly_reset' %}
{{ seconds_prev | timestamp_custom('%H:%M:%S', false) }}
{% else %}
{{ (seconds_prev + seconds_this_run) | timestamp_custom('%H:%M:%S', false) }}
{% endif %}
time_jan: |
{% from 'irrigation_time.jinja' import get_month_time %}
{{ get_month_time(1, 1) }}
time_feb: |
{% from 'irrigation_time.jinja' import get_month_time %}
{{ get_month_time(1, 2) }}
time_mar: |
{% from 'irrigation_time.jinja' import get_month_time %}
{{ get_month_time(1, 3) }}
time_apr: |
{% from 'irrigation_time.jinja' import get_month_time %}
{{ get_month_time(1, 4) }}
time_may: |
{% from 'irrigation_time.jinja' import get_month_time %}
{{ get_month_time(1, 5) }}
time_jun: |
{% from 'irrigation_time.jinja' import get_month_time %}
{{ get_month_time(1, 6) }}
time_jul: |
{% from 'irrigation_time.jinja' import get_month_time %}
{{ get_month_time(1, 7) }}
time_aug: |
{% from 'irrigation_time.jinja' import get_month_time %}
{{ get_month_time(1, 8) }}
time_sep: |
{% from 'irrigation_time.jinja' import get_month_time %}
{{ get_month_time(1, 9) }}
time_oct: |
{% from 'irrigation_time.jinja' import get_month_time %}
{{ get_month_time(1, 10) }}
time_nov: |
{% from 'irrigation_time.jinja' import get_month_time %}
{{ get_month_time(1, 11) }}
time_dec: |
{% from 'irrigation_time.jinja' import get_month_time %}
{{ get_month_time(1, 12) }}