Just in case someone else can benefit, I’m posting my solution to turn 3 lights on with different colors by light and for each holiday. If there are better ways to achieve the same, I’m happy to learn. I (just an amateur) had to combine quite a few different community posts and googling to get the setup working.
In short:
- Create a sensor for each holiday, with:
- state = date of the holiday
- attributes = rgb code for each light’s sensor entity_id (as a comma separated string)
- For those wanting to include Easter, here’s another post where I got the calculation
# Holidays
- trigger:
- platform: time_pattern
# This will update every night, as there is no need to update more than once per day
hours: 1
minutes: 0
- sensor:
- name: "Easter"
icon: mdi:egg-easter
device_class: date
state: >
{% set Y = now().year %}
{% set G = Y % 19 + 1 %}
{% set C = (Y / 100) | int + 1 %}
{% set X = (3*C / 4) |int - 12 %}
{% set Z = ((8*C + 5) / 25) |int - 5 %}
{% set D = (5*Y / 4)|int - X - 10 %}
{% set E = (11*G + 20 + Z - X ) % 30 %}
{% set E = E+1 if (E==25 and G>11 or E==24) else E %}
{% set N = 44 - E %}
{% set N = N+30 if N<21 else N %}
{% set N = N + 7 - (( D + N ) % 7) %}
{% set M = 4 if N>31 else 3 %}
{% set N = N-31 if N>31 else N %}
{{ '%04d-%02d-%02d'%(Y,M,N) }}
attributes:
oprit_1: 255,255,0
oprit_2: 255,255,0
oprit_3: 255,255,0
- name: "Christmas Eve"
icon: mdi:pine-tree
device_class: date
state: "{{ now().year ~ '-12-24' }}"
attributes:
oprit_1: 255,0,0
oprit_2: 255,255,255
oprit_3: 0,255,0
- name: "Christmas Day"
icon: mdi:pine-tree
device_class: date
state: "{{ now().year ~ '-12-25' }}"
attributes:
oprit_1: 255,0,0
oprit_2: 255,255,255
oprit_3: 0,255,0
- Create a sensor to determine if ‘today’ is one of those holidays
- use a template to determine the holiday sensor entity_id
- name: "Holiday"
icon: >
{% if is_state('sensor.holiday','Easter') %}
mdi:egg-easter
{% elif is_state('sensor.holiday','Christmas Eve') %}
mdi:pine-tree
{% elif is_state('sensor.holiday','Christmas Day') %}
mdi:pine-tree
{% else %}
mdi:party-popper
{% endif %}
state: >
{% if is_state('sensor.easter',now().date()|string) %}
Easter
{% elif is_state('sensor.christmas_eve',now().date()|string) %}
Christmas Eve
{% elif is_state('sensor.christmas_day',now().date()|string) %}
Christmas Day
{% endif %}
attributes:
holiday_entity_id: >
{{ 'sensor.' ~ (states('sensor.holiday')|regex_replace(find='[^\w\*]', replace='_', ignorecase=False)).lower() }}
- Create a script to turn lights on with the desired color per light
alias: Lights - Oprit - Turn on Color
sequence:
- service: light.turn_on
target:
entity_id: light.oprit_1
data:
rgb_color: >-
{{ state_attr(state_attr('sensor.holiday','holiday_entity_id'),'oprit_1').split(',') }}
- service: light.turn_on
target:
entity_id: light.oprit_2
data:
rgb_color: >-
{{ state_attr(state_attr('sensor.holiday','holiday_entity_id'),'oprit_2').split(',') }}
- service: light.turn_on
target:
entity_id: light.oprit_3
data:
rgb_color: >-
{{ state_attr(state_attr('sensor.holiday','holiday_entity_id'),'oprit_3').split(',') }}
mode: single
icon: mdi:wall-sconce-outline
- Create an automation that triggers the script, when desired