From 7f0859f446c417dd0a98dba2bb5e4f06be5a4c91 Mon Sep 17 00:00:00 2001 From: Claus Dethlefsen Date: Tue, 24 Mar 2026 18:25:18 +0100 Subject: [PATCH] tesla --- include/templates/tesla_charge_plan.yaml | 41 ++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 include/templates/tesla_charge_plan.yaml diff --git a/include/templates/tesla_charge_plan.yaml b/include/templates/tesla_charge_plan.yaml new file mode 100644 index 0000000..ebbd4e1 --- /dev/null +++ b/include/templates/tesla_charge_plan.yaml @@ -0,0 +1,41 @@ +- binary_sensor: + - name: tesla_charge_now + state: > + {% 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 gyldige slots før deadline #} + {% set valid = [] %} + {% for p in prices %} + {% if p.hour %} + {% set ts = as_timestamp(p.hour) %} + {% if not deadline_ts or ts <= deadline_ts %} + {% set valid = valid + [p] %} + {% endif %} + {% endif %} + {% endfor %} + + {# Sortér kronologisk #} + {% set valid = valid | sort(attribute='hour') %} + + {# Find billigste sammenhængende blok #} + {% set best_block = [] %} + {% set best_price = 999 %} + + {% for i in range(0, (valid | length) - hours_needed + 1) %} + {% set block = valid[i:i+hours_needed] %} + {% set total = block | map(attribute='price') | sum %} + {% if total < best_price %} + {% set best_price = total %} + {% set best_block = block %} + {% endif %} + {% endfor %} + + {% set now_slot = now().replace(minute=0, second=0, microsecond=0).isoformat() %} + + {{ best_block | selectattr('hour','equalto',now_slot) | list | count > 0 }}