TOD - Time Of Day - HA style

Post Reply
User avatar
Bamsefar
Z-Wave Kung
Posts: 1232
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Så det finns massor av trevliga rutiner som andra gjort för Home Assistant, bland annat just Time Of Day i flera varianter, men ingen fungerar som jag är invand, så återigen har jag gjort min egna snurra - är tydligen svårt att få denna gamla hund att sitta....

Code: Select all

  - platform: template
    sensors:
      time_of_day2:
        friendly_name: TOD@Home
        value_template: >
            {% set t = now() %}
            {% if t.hour < 7 %} Night
            {% elif t.hour < 8 %} Early Morning
            {% elif t.hour < 10 %} Morning
            {% elif t.hour < 19 %} Day
            {% elif as_timestamp(t) | timestamp_custom('%Hh:%Mm')  <  as_timestamp(states.sensor.date.state ~ " 21:30:00") | timestamp_custom('%Hh:%Mm')  %} Evening
            {% elif as_timestamp(t) | timestamp_custom('%Hh:%Mm')  <  as_timestamp(states.sun.sun.attributes.next_setting) | timestamp_custom('%Hh:%Mm')  %} Evening
            {% elif t.hour < 23 %} Turn Down
            {% else %} Night
            {% endif %}
Testar Home Assistant på Raspberry Pi4B - nice :mrgreen:
User avatar
Bamsefar
Z-Wave Kung
Posts: 1232
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Kan tydligen inte hålla fingrarna i styr direkt, så jag har redan hackat om denna snurra. Konstigt, den har varit statisk i säkert ett halvår eller något, så postar jag här och då skall jag direkt in och pilla i den....

För att använda denna version så får man börja med att skapa en hjälpare som heter "Offset_Time" och ge den datum/tid typ. Sedan är det praktiskt att sätta denna Offset_Time i en separat automatisering:

Code: Select all

alias: System - Set Offset Time
description: ""
trigger:
  - platform: time
    at: "00:01:00"
  - platform: time
    at: "12:01:00"
condition: []
action:
  - service: input_datetime.set_datetime
    metadata: {}
    data:
      time: "{{ timedelta(minutes=range(0, 30) | random) }}"
    target:
      entity_id: input_datetime.offset_time
mode: single
Som synes sätter jag offset två gånger per dygn, men det är ju valfritt såklart. Och den slumpar fram värden mellan -15 och +16, minuter då.

Sedan då definitionen i configure.yaml som är lite mera komplex och utökad:

Code: Select all

## TOD - Time Of Day
  - platform: template
    sensors:
      time_of_day2:
        friendly_name: TOD@Home
        value_template: >
            {% set t = now() %}
            {% if (as_timestamp(t) - state_attr('input_datetime.offset_time', 'timestamp')) | timestamp_custom('%Hh:%Mm') < as_timestamp(states.sensor.date.state ~ " 07:00:00") | timestamp_custom('%Hh:%Mm') %} Night
            {% elif (as_timestamp(t) - state_attr('input_datetime.offset_time', 'timestamp')) | timestamp_custom('%Hh:%Mm') < as_timestamp(states.sensor.date.state ~ " 08:00:00") | timestamp_custom('%Hh:%Mm') %} Early Morning
            {% elif (as_timestamp(t) - state_attr('input_datetime.offset_time', 'timestamp')) | timestamp_custom('%Hh:%Mm') < as_timestamp(states.sensor.date.state ~ " 10:00:00") | timestamp_custom('%Hh:%Mm') %} Morning
            {% elif (as_timestamp(t) - state_attr('input_datetime.offset_time', 'timestamp')) | timestamp_custom('%Hh:%Mm') < as_timestamp(states.sensor.date.state ~ " 19:00:00") | timestamp_custom('%Hh:%Mm') %} Day
            {% elif (as_timestamp(t) - state_attr('input_datetime.offset_time', 'timestamp')) | timestamp_custom('%Hh:%Mm') < as_timestamp(states.sensor.date.state ~ " 21:30:00") | timestamp_custom('%Hh:%Mm')  %} Evening
            {% elif (as_timestamp(t) - state_attr('input_datetime.offset_time', 'timestamp')) | timestamp_custom('%Hh:%Mm') < as_timestamp(states.sun.sun.attributes.next_setting) | timestamp_custom('%Hh:%Mm')  %} Evening
            {% elif (as_timestamp(t) - state_attr('input_datetime.offset_time', 'timestamp')) | timestamp_custom('%Hh:%Mm') < as_timestamp(states.sensor.date.state ~ " 23:00:00") | timestamp_custom('%Hh:%Mm')  %} Turn Down
            {% else %} Night
            {% endif %}
Tänk på två saker:

1) Tiden som jämför är alltid mindre än, så att det blir Turn Down efter 21.30 eller när solen går ned på sommaren

2) För den som undrar varför det finns två "Evening" så är det för att hantera när solen går ned efter i mitt fall 21.30 (plus/minus Offset_Time). Dvs Turn Down kan det inte bli förrns båda dessa inte är uppfyllda. Det är en lång IF struktur....

EDIT: Det visade sig att HA inte klarar negativa minutrar, det fungerar utmärkt i utvecklingspanelen, men i vekliga livet inte. Så jag ändrade från +/-15 minuter till 0-30 minuter - ingen större skillnad således, bara annat sätt att räkna typ. Typiskt.
Testar Home Assistant på Raspberry Pi4B - nice :mrgreen:
Post Reply