Templating: to convert str in dict

Macro returns only string value, evenif the result is a dictionary.
For instance simple macro:

{%- macro dates_sun() -%}
{%- set myvar = namespace(start=now(), end=now(), power=0) -%}
{%- set myvar.start = ((states('sensor.solcast_pv_forecast_heure_du_pic_demain') | as_datetime | as_local) + timedelta(hours=-1)) -%}
{%- set myvar.end   = ((states('sensor.solcast_pv_forecast_heure_du_pic_demain') | as_datetime | as_local) + timedelta(hours=+1)) -%}
{%- set myvar.power = states('sensor.solcast_pv_forecast_previsions_pour_demain')|float -%}
{{- myvar -}}
{%- endmacro -%}

The result will be:

{%- set result= dates_sun() -%}
{{ result }}

<Namespace {'start': datetime.datetime(2025, 5, 15, 11, 0, tzinfo=zoneinfo.ZoneInfo(key='Europe/Paris')), 'end': datetime.datetime(2025, 5, 15, 13, 0, tzinfo=zoneinfo.ZoneInfo(key='Europe/Paris')), 'power': '25.13'}>

But I can’t find a way to transform result wich is actually a str into a dictionary or namespace object :weary:

For the moment, I do this in my macro:

{# formatage de la sortie en tableau #}
{{- "%s,%s,%f"|format(myvar.start.isoformat(), myvar.end.isoformat(), myvar.power) -}}
{%- endmacro -%}

and the result is

{%- set result= dates_sun().split(',') -%}
{{ result }}

['2025-05-15T11:00:00+02:00', '2025-05-15T13:00:00+02:00', '25.130000']

But it is not so satisfying…

In the macro, define a dict then report it in JSON format. That format doesn’t support datetime objects so report them as datetime strings in ISO format.

The revised macro:

{%- macro dates_sun() -%}
{%- set a = (states('sensor.solcast_pv_forecast_heure_du_pic_demain') | as_datetime | as_local + timedelta(hours=-1)).isoformat() -%}
{%- set b = (states('sensor.solcast_pv_forecast_heure_du_pic_demain') | as_datetime | as_local + timedelta(hours=+1)).isoformat() -%}
{%- set c = states('sensor.solcast_pv_forecast_previsions_pour_demain')|float(0) -%}
{{- dict(start=a, end=b, power=c) | to_json -}}
{%- endmacro -%}

Testing the revised macro:

{% set x = dates_sun() | from_json %}
{{ x.power }}
{{ x.start }}
{{ x.end | as_datetime }}
1 Like