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) }}