diff --git a/include/templates/tesla_smart_charge.yaml b/include/templates/tesla_smart_charge.yaml index bb8d11c..9d435ab 100644 --- a/include/templates/tesla_smart_charge.yaml +++ b/include/templates/tesla_smart_charge.yaml @@ -1,17 +1,29 @@ -sensor: +binary_sensor: - name: tesla_charge_now state: > - {% set deadline = states('input_datetime.tesla_charge_deadline') | default('2026-12-31T23:59:59') %} - {% set hours_needed = states('sensor.tesla_charge_hours_needed')|float(0)|round(0,'ceil') %} - {% set prices = (state_attr('sensor.energidataservice','today') or []) + (state_attr('sensor.energidataservice','tomorrow') or []) %} + {% set deadline_raw = states('input_datetime.tesla_charge_deadline') %} + {% set deadline_ts = as_timestamp(deadline_raw) if deadline_raw not in ['unknown','unavailable',''] else none %} + + {% set hours_needed = states('sensor.tesla_charge_hours_needed') | float(0) | round(0, 'ceil') %} + + {% set prices = (state_attr('sensor.energidataservice','today') or []) + + (state_attr('sensor.energidataservice','tomorrow') or []) %} + + {# Filter valid price entries and apply deadline #} {% set valid = [] %} - {% for p in prices if as_timestamp(strptime(p.hour,'%Y-%m-%dT%H:%M:%S')) <= as_timestamp(deadline) %} - {% set valid = valid + [p] %} + {% for p in prices %} + {% if p.hour is defined and p.hour %} + {% set ts = as_timestamp(p.hour) %} + {% if not deadline_ts or ts <= deadline_ts %} + {% set valid = valid + [p] %} + {% endif %} + {% endif %} {% endfor %} - {# Sorter efter pris #} - {% set sorted = valid | sort(attribute='price') %} - {# Vælg de billigste slots der dækker ladetiden #} - {% set cheapest = sorted[:hours_needed] %} - {# Tjek om nuværende slot er i listen #} - {% set now_slot = now().replace(minute=(now().minute//15)*15, second=0, microsecond=0).isoformat() %} - {{ cheapest | selectattr('hour','equalto',now_slot) | list | count > 0 }} \ No newline at end of file + + {# Pick cheapest hours #} + {% set cheapest = (valid | sort(attribute='price'))[:hours_needed] %} + + {# Current hour #} + {% set now_slot = now().replace(minute=0, second=0, microsecond=0).isoformat() %} + + {{ cheapest | selectattr('hour','equalto',now_slot) | list | count > 0 }}