The integration can be simplified using the 2 following public endpoints:
https://www.services-rte.com/cms/open_data/v1/tempoLight
https://www.services-rte.com/cms/open_data/v1/tempo?season=2025-2026
If only interested in the colors of today and tomorrow:
rest:
- resource_template: >-
{% set y = now().year %}
{% set start_year = y if now().month >= 9 else (y - 1) %}
https://www.services-rte.com/cms/open_data/v1/tempo?season={{ start_year }}-{{ start_year + 1 }}
method: GET
scan_interval: 86400 # we don't rely on polling; automation triggers at 10:40
sensor:
- name: "RTE Tempo Calendar"
unique_id: rte_tempo_calendar
icon: mdi:calendar-sync
value_template: >-
{% set vals = value_json.get('values', {}) %}
{% set k = now().strftime('%Y-%m-%d') %}
{{ vals.get(k, 'UNKNOWN') }}
json_attributes:
- values
template:
- sensor:
- name: "RTE Tempo Color Today"
unique_id: rte_tempo_color_today
icon: >-
{% set c = this.state %}
{% if c == 'BLUE' %} mdi:circle
{% elif c == 'WHITE' %} mdi:circle-outline
{% elif c == 'RED' %} mdi:alpha-r-circle-outline
{% else %} mdi:help-circle-outline
{% endif %}
availability: >-
{% set vals = state_attr('sensor.rte_tempo_calendar','values') or {} %}
{% set k = now().strftime('%Y-%m-%d') %}
{{ vals.get(k) in ['BLUE','WHITE','RED'] }}
state: >-
{% set vals = state_attr('sensor.rte_tempo_calendar','values') or {} %}
{% set k = now().strftime('%Y-%m-%d') %}
{{ vals.get(k) }}
attributes:
fallback_used: >-
{% set vals = state_attr('sensor.rte_tempo_calendar','values') or {} %}
{% set k = now().strftime('%Y-%m-%d') ~ '-fallback' %}
{{ vals.get(k, 'unknown') }}
- name: "RTE Tempo Color Tomorrow"
unique_id: rte_tempo_color_tomorrow
icon: >-
{% set c = this.state %}
{% if c == 'BLUE' %} mdi:circle
{% elif c == 'WHITE' %} mdi:circle-outline
{% elif c == 'RED' %} mdi:alpha-r-circle-outline
{% else %} mdi:help-circle-outline
{% endif %}
availability: >-
{% set vals = state_attr('sensor.rte_tempo_calendar','values') or {} %}
{% set k = (now() + timedelta(days=1)).strftime('%Y-%m-%d') %}
{{ vals.get(k) in ['BLUE','WHITE','RED'] }}
state: >-
{% set vals = state_attr('sensor.rte_tempo_calendar','values') or {} %}
{% set k = (now() + timedelta(days=1)).strftime('%Y-%m-%d') %}
{{ vals.get(k) }}
attributes:
fallback_used: >-
{% set vals = state_attr('sensor.rte_tempo_calendar','values') or {} %}
{% set k = (now() + timedelta(days=1)).strftime('%Y-%m-%d') ~ '-fallback' %}
{{ vals.get(k, 'unknown') }}
- name: "RTE Tempo Past Blue Days"
unique_id: rte_tempo_past_blue_days
icon: mdi:circle
unit_of_measurement: "jours"
availability: >-
{% set vals = state_attr('sensor.rte_tempo_calendar','values') %}
{{ vals is mapping and (vals | count) > 0 }}
state: >-
{% set vals = state_attr('sensor.rte_tempo_calendar','values') or {} %}
{% set ns = namespace(n=0) %}
{% for k, v in vals.items() %}
{% if k|length == 10 and v == 'BLUE' %}
{% set ns.n = ns.n + 1 %}
{% endif %}
{% endfor %}
{{ ns.n }}
- name: "RTE Tempo Remaining Blue Days"
unique_id: rte_tempo_remaining_blue_days
icon: mdi:circle
unit_of_measurement: "jours"
availability: >-
{{ states('sensor.rte_tempo_past_blue_days') != 'unknown' }}
state: >-
{% set past_days = states('sensor.rte_tempo_past_blue_days') | int %}
{% set y = now().year %}
{% set start_year = y if now().month >= 9 else (y - 1) %}
{% set end_year = start_year + 1 %}
{% set leap_year = (end_year % 4 == 0) and ((end_year % 100 != 0) or (end_year % 400 == 0)) %}
{{ (301 if leap_year else 300) - past_days }}
- name: "RTE Tempo Past White Days"
unique_id: rte_tempo_past_white_days
icon: mdi:circle-outline
unit_of_measurement: "jours"
availability: >-
{% set vals = state_attr('sensor.rte_tempo_calendar','values') %}
{{ vals is mapping and (vals | count) > 0 }}
state: >-
{% set vals = state_attr('sensor.rte_tempo_calendar','values') or {} %}
{% set ns = namespace(n=0) %}
{% for k, v in vals.items() %}
{% if k|length == 10 and v == 'WHITE' %}
{% set ns.n = ns.n + 1 %}
{% endif %}
{% endfor %}
{{ ns.n }}
- name: "RTE Tempo Remaining White Days"
unique_id: rte_tempo_remaining_white_days
icon: mdi:circle-outline
unit_of_measurement: "jours"
availability: >-
{{ states('sensor.rte_tempo_past_white_days') != 'unknown' }}
state: >-
{% set past_days = states('sensor.rte_tempo_past_white_days') | int %}
{{ 43 - past_days }}
- name: "RTE Tempo Past Red Days"
unique_id: rte_tempo_past_red_days
icon: mdi:alpha-r-circle-outline
unit_of_measurement: "jours"
availability: >-
{% set vals = state_attr('sensor.rte_tempo_calendar','values') %}
{{ vals is mapping and (vals | count) > 0 }}
state: >-
{% set vals = state_attr('sensor.rte_tempo_calendar','values') or {} %}
{% set ns = namespace(n=0) %}
{% for k, v in vals.items() %}
{% if k|length == 10 and v == 'RED' %}
{% set ns.n = ns.n + 1 %}
{% endif %}
{% endfor %}
{{ ns.n }}
- name: "RTE Tempo Remaining Red Days"
unique_id: rte_tempo_remaining_red_days
icon: mdi:alpha-r-circle-outline
unit_of_measurement: "jours"
availability: >-
{{ states('sensor.rte_tempo_past_red_days') != 'unknown' }}
state: >-
{% set past_days = states('sensor.rte_tempo_past_red_days') | int %}
{{ 22 - past_days }}
automation:
- id: rte_tempo_daily_refresh
alias: "RTE Tempo Daily Refresh (10:40)"
mode: single
trigger:
- platform: time
at: "10:40:00"
action:
- service: homeassistant.update_entity
target:
entity_id:
- sensor.rte_tempo_calendar
The integration can be simplified using the 2 following public endpoints:
If only interested in the colors of today and tomorrow: