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) %} {{ [0, ((limit - soc)/100 * capacity)] | max | 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) }} tesla_charging_plan: friendly_name: "Tesla Charging Plan" value_template: > {% 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 = [1, states('sensor.tesla_charge_hours_needed') | float(0) | round(0, 'ceil') ] | max %} {% set prices = (state_attr('sensor.energidataservice','today') or []) + (state_attr('sensor.energidataservice','tomorrow') or []) %} {% set valid = [] %} {% 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 %} {% set cheapest = (valid | sort(attribute='price'))[:hours_needed] %} {% set times = cheapest | map(attribute='hour') | map('as_timestamp') | map('timestamp_local') | list %} {{ times | join(', ') if times | count > 0 else 'none' }} 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 }}