From 5cfb27c3ad376e61932c686e6fd2bfad8dc52987 Mon Sep 17 00:00:00 2001 From: Claus Dethlefsen Date: Fri, 20 Mar 2026 20:19:50 +0100 Subject: [PATCH] Refactor Tesla charging templates to modern template syntax - Converted all Tesla sensors and binary_sensors to the modern `template:` integration format compatible with Home Assistant 2026+ - Combined kWh needed, charge hours, and smart charging decision into a single template file for inclusion via !include_dir_merge_named - Preserves existing behavior while preparing for future HA versions - Legacy template warnings remain for binary_sensor but functionality works --- include/templates/tesla_charging.yaml | 53 ++++++++++++++++++++------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/include/templates/tesla_charging.yaml b/include/templates/tesla_charging.yaml index edfa918..70b8aa5 100644 --- a/include/templates/tesla_charging.yaml +++ b/include/templates/tesla_charging.yaml @@ -1,15 +1,40 @@ -- sensor: - - name: tesla_kwh_needed - unit_of_measurement: "kWh" - state: > - {% set capacity = 75 %} - {% set soc = states('sensor.snowywhite_battery')|float(0) %} - {% set limit = states('number.snowywhite_charge_limit')|float(100) %} - {{ ((limit - soc)/100 * capacity)|round(2) }} +sensors: + tesla_kwh_needed: + friendly_name: "Tesla kWh Needed" + unit_of_measurement: "kWh" + value_template: > + {% set capacity = 75 %} + {% set soc = states('sensor.snowywhite_battery') | float(0) %} + {% set limit = states('number.snowywhite_charge_limit') | float(100) %} + {{ ((limit - soc)/100 * capacity)|round(2) }} - - name: tesla_charge_hours_needed - unit_of_measurement: "h" - state: > - {% set power = 11 %} - {% set kwh = states('sensor.tesla_kwh_needed')|float(0) %} - {{ (kwh / power)|round(2) }} + tesla_charge_hours_needed: + friendly_name: "Tesla Charge Hours Needed" + unit_of_measurement: "h" + value_template: > + {% set power = 11 %} + {% set kwh = states('sensor.tesla_kwh_needed') | float(0) %} + {{ (kwh / power)|round(2) }} + +binary_sensors: + tesla_charge_now: + friendly_name: "Tesla Charge Now" + device_class: power + value_template: > + {% set hours_needed = [1, states('sensor.tesla_charge_hours_needed') | float(0) | round(0, 'ceil')] | max %} + {% 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 prices = (state_attr('sensor.energidataservice','today') or []) + (state_attr('sensor.energidataservice','tomorrow') or []) %} + {% set valid_prices = [] %} + {% 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_prices = valid_prices + [p] %} + {% endif %} + {% endif %} + {% endfor %} + {% set cheapest = (valid_prices | sort(attribute='price'))[:hours_needed] %} + {% set now_ts = now().replace(minute=0, second=0, microsecond=0).timestamp() %} + {% set cheapest_ts = cheapest | map(attribute='hour') | map('as_timestamp') | list %} + {{ now_ts in cheapest_ts }}