From 074737e6b4a2a52a3b8458105752a14f1bb4a7cf Mon Sep 17 00:00:00 2001 From: ttrabatt Date: Wed, 17 Sep 2025 23:43:52 +0200 Subject: [PATCH] EVcharge_PRO: WIP1 --- automations.yaml | 5 +- .../homeassistant/evcharge_process_pro.yaml | 311 ++++++++++++++++++ custom_templates/template_library.jinja | 38 +-- 3 files changed, 334 insertions(+), 20 deletions(-) create mode 100644 blueprints/automation/homeassistant/evcharge_process_pro.yaml diff --git a/automations.yaml b/automations.yaml index 5ca4d2d..4744dc0 100644 --- a/automations.yaml +++ b/automations.yaml @@ -226,4 +226,7 @@ evcharge_entity2: switch.evcharge_back use_entity1: input_boolean.evcharge_front_request use_entity2: input_boolean.evcharge_back_request - start_button: input_button.evcharge_start + start_button: input_button.evcharge_pro_start + charged_entity1: input_number.evcharge_front_charged + charged_entity2: input_number.evcharge_back_charged + stop_button: input_button.evcharge_pro_stop diff --git a/blueprints/automation/homeassistant/evcharge_process_pro.yaml b/blueprints/automation/homeassistant/evcharge_process_pro.yaml new file mode 100644 index 0000000..f74af93 --- /dev/null +++ b/blueprints/automation/homeassistant/evcharge_process_pro.yaml @@ -0,0 +1,311 @@ +blueprint: + name: evcharge_process_pro + description: Manage charging process between two charging points with Charged Energy calculation + domain: automation + author: Tiziano Trabattoni + input: + evcharge_entity1: + name: Charge via 'Controlled Plug1' + description: Identifies the Switch1 (eg EVcharge-front) + selector: + entity: + filter: + - domain: switch + evcharge_entity2: + name: Charge via 'Controlled Plug2' + description: Identifies the Switch2 (eg EVcharge-back) + selector: + entity: + filter: + - domain: switch + use_entity1: + name: Enable charge via 'Controlled Plug1' + description: Identifies the input flag for charging on 'Controlled Plug1' (eg EVcharge_front_request) + selector: + entity: + filter: + - domain: input_boolean + use_entity2: + name: Enable charge via 'Controlled Plug2' + description: Identifies the input flag for charging on 'Controlled Plug2' (eg EVcharge_back_request) + selector: + entity: + filter: + - domain: input_boolean + charged_entity1: + name: Shows energy charged through 'Controlled Plug1' + description: Identifies the card showing energy charged by 'Controlled Plug1' + selector: + entity: + filter: + - domain: input_number + charged_entity2: + name: Shows energy charged through 'Controlled Plug2' + description: Identifies the card showing energy charged by 'Controlled Plug2' (eg EVcharge_back_request) + selector: + entity: + filter: + - domain: input_number + start_button: + name: start_button + description: Identifies the button to start EVcharge process + selector: + entity: + filter: + - domain: input_button + stop_button: + name: stop_button + description: Identifies the button to stop EVcharge process + selector: + entity: + filter: + - domain: input_button +triggers: + - trigger: state # Want to trigger start now + entity_id: !input start_button + id: start_now + # - trigger: state # Want to trigger stop now + # entity_id: !input stop_button + # id: stop_now + - trigger: time # Start at F3 start tome + at: input_datetime.evcharge_good_time_start + id: start_at_good_time + +# for time being let's do sequential charge for Plug1 and then Plug2 +mode: single + +# here we could stop immediately if sensor.pw_load_power is above 5000W but lets decide after +conditions: [] + +variables: + evcharge_entity1_var: !input evcharge_entity1 + evcharge_entity2_var: !input evcharge_entity2 + + evcharge_entity1_power_var: >- + {% from 'template_library.jinja' import getpower_id %} + {{ getpower_id(evcharge_entity1_var) }} + evcharge_entity2_power_var: >- + {% from 'template_library.jinja' import getpower_id %} + {{ getpower_id(evcharge_entity2_var) }} + evcharge_entity1_energy_var: >- + {% from 'template_library.jinja' import getenergy_id %} + {{ getenergy_id(evcharge_entity1_var) }} + evcharge_entity2_energy_var: >- + {% from 'template_library.jinja' import getenergy_id %} + {{ getenergy_id(evcharge_entity2_var) }} + + use_entity1_var: !input use_entity1 + use_entity2_var: !input use_entity2 + + # here list of mobile APP to be notified + recipient_list_notification: + - notify.mobile_app_tiziano_iphone15pro + - notify.mobile_app_emanuele_s24 + + recipient_list_gmail: + title: "EVcharge Process" + target: + - "tiziano.trabattoni@gmail.com" + #- "ema.trabattoni@gmail.com" + +actions: + # + - if: + - or: + - condition: template + value_template: "{{ is_state(evcharge_entity1_var, 'on') }}" + # value_template: "{{ false }}" # TEST ONLY + - condition: template + value_template: "{{ is_state(evcharge_entity2_var, 'on') }}" + # value_template: "{{ false }}" # TEST ONLY + + then: + # charge already active, send message email and terminate + sequence: + - repeat: + for_each: "{{ recipient_list_notification }}" + sequence: + - action: "{{ repeat.item }}" + metadata: {} + data: + message: >- + "EVcharge process is ALREADY RUNNING" + title: "EV Charge process ERROR" + + else: + # EVcharge can continue + sequence: + - if: + - condition: template + value_template: "{{ is_state(use_entity1_var, 'on') }}" + then: # EVcharge entity_1 (eg front) charge is requested + sequence: + - repeat: # send message to all recipient-list members + for_each: "{{ recipient_list_notification }}" + sequence: + - action: "{{ repeat.item }}" + metadata: {} + data: + message: >- + "EVcharge process on {{ evcharge_entity1_var }} has started" + title: EV Charge process + - action: notify.tiziano_trabattoni_gmail_com + data: + title: "EVcharge process on {{ evcharge_entity1_var }} has started" + target: "{{ recipient_list_gmail['target'] }}" + message: >- + "EVcharge process on {{ evcharge_entity1_var }} has started" + + # take energy counter before charging + - variables: + energy1_before: "{{ states(evcharge_entity1_energy_var) | float | round(2) }}" + + # Start plug1 and wait until power measured is below input_number.evcharge_no_charge_threshold for 10 minutes = 600 seconds + - action: switch.turn_on + # automation.apri_cancellettoentity_id: !input evcharge_entity1 + entity_id: switch.presa_smart_1 # TEST ONLY + + # need to wait car to start charging + # - delay: 120 + - delay: 10 # TEST ONLY + + # Wait for charging to complete + - repeat: + until: + - condition: and + conditions: + - "{{ ( states('input_number.test_evcharge_front') | int) < (states('input_number.evcharge_no_charge_threshold') | int) }}" # TEST ONLY + # - "{{ ( states(evcharge_entity1_power_var) | int ) < ( states('input_number.evcharge_no_charge_threshold') | int ) }}" + - "{{ isstate('input_boolean.let_run')}}" + + sequence: + - variables: + energy1_while_var: >- + {% from 'template_library.jinja' import getenergy_id %} + {{ getenergy_id(evcharge_entity1_var) }} + energy1_while: "{{ states(energy1_while_var ) }}" + evcharge_entity1_energy_charged: "{{ ((energy1_while | float| round(2)) - energy1_before )| float | round(2) }}" + + # - delay: 120 + - delay: 10 # TEST ONLY + + # take energy counter after charging + - variables: + energy1_after: "{{ states(evcharge_entity1_energy_var) | float | round(2) }}" + + # turn off evcharge_entity1 + - action: switch.turn_off + # entity_id: !input evcharge_entity1 + entity_id: switch.presa_smart_1 # TEST ONLY + - delay: 10 + - action: switch.turn_off + # entity_id: !input evcharge_entity1 + entity_id: switch.presa_smart_1 # TEST ONLY + + - repeat: # send message to all recipient-list members + for_each: "{{ recipient_list_notification }}" + sequence: + - action: "{{ repeat.item }}" + metadata: {} + data: + message: >- + "EVcharge process on {{ evcharge_entity1_var }} has ended: {{ ( energy1_after - energy1_before ) | round(2) }} kW/h charged" + title: EV Charge process + + - action: notify.tiziano_trabattoni_gmail_com + data: + title: "EVcharge process on {{ evcharge_entity1_var }} has ended: {{ ( energy1_after - energy1_before ) | round(2) }} kW/h charged" + target: "{{ recipient_list_gmail['target'] }}" + message: >- + "EVcharge process on {{ evcharge_entity1_var }} has ended: {{ ( energy1_after - energy1_before ) | round(2) }} kW/h charged" + + # wait couple of minutes before starting charge on plug2 + # - delay: 120 + - delay: 10 # TEST ONLY + # - if: + # - condition: template + # value_template: "{{ is_state(use_entity2_var, 'on') }}" + # then: + # sequence: + # # then start plug2 and wait until power measured is below input_number.evcharge_no_charge_threshold for 10 minutes = 600 seconds + # - repeat: # send message to all recipient-list members + # for_each: "{{ recipient_list_notification }}" + # sequence: + # - action: "{{ repeat.item }}" + # metadata: {} + # data: + # message: >- + # "EVcharge process on {{ evcharge_entity2_var }} has started" + # title: EV Charge process + # - action: notify.tiziano_trabattoni_gmail_com + # data: + # title: "EVcharge process on {{ evcharge_entity2_var }} has started" + # target: "{{ recipient_list_gmail['target'] }}" + # message: >- + # "EVcharge process on {{ evcharge_entity2_var }} has started" + # + # # take energy counter before charging + # - variables: + # energy2_before: "{{ states(evcharge_entity2_energy_var) | float | round(2) }}" + # + # # turn_on evcharge_entity2 + # - action: switch.turn_on + # entity_id: !input evcharge_entity2 + # # entity_id: switch.presa_smart_2 # TEST ONLY + # + # # need to wait car to start charging + # - delay: 120 + # # - delay: 10 # TEST ONLY + # + # # Wait for charging to complete + # - repeat: + # until: "{{ ( states(evcharge_entity2_power_var) | int ) < ( states('input_number.evcharge_no_charge_threshold') | int) }}" + # # until: "{{ ( states('input_number.test_evcharge_back') | int) < ( states('input_number.evcharge_no_charge_threshold') | int) }}" # TEST ONLY + # sequence: + # - delay: 120 + # # - delay: 10 # TEST ONLY + # + # # take energy counter after charging + # - variables: + # energy2_after: "{{ states(evcharge_entity2_energy_var) | float | round(2) }}" + # + # # turn off evcharge_entity2 + # - action: switch.turn_off + # entity_id: !input evcharge_entity2 + # # entity_id: switch.presa_smart_2 # TEST ONLY + # - delay: 10 + # - action: switch.turn_off + # entity_id: !input evcharge_entity2 + # + # - repeat: # send message to all recipient-list members + # for_each: "{{ recipient_list_notification }}" + # sequence: + # - action: "{{ repeat.item }}" + # metadata: {} + # data: + # message: >- + # "EVcharge process on {{ evcharge_entity2_var }} has ended: {{ ( energy2_after - energy2_before ) | round(2) }} kW/h charged" + # title: EV Charge process + # - action: notify.tiziano_trabattoni_gmail_com + # data: + # title: "EVcharge process on {{ evcharge_entity2_var }} has ended: {{ ( energy2_after - energy2_before ) | round(2) }} kW/h charged" + # target: "{{ recipient_list_gmail['target'] }}" + # message: >- + # "EVcharge process on {{ evcharge_entity2_var }} has ended: {{ ( energy2_after - energy2_before ) | round(2) }} kW/h charged" + - if: + - and: + - condition: template + value_template: "{{ is_state(use_entity1_var, 'off') }}" + - condition: template + value_template: "{{ is_state(use_entity2_var, 'off') }}" + then: + - repeat: # send message to all recipient-list members + for_each: "{{ recipient_list }}" + + sequence: + - action: "{{ repeat.item }}" + metadata: {} + data: + message: >- + "EVcharge process activation ERROR, select what to charge" + title: EV Charge process ERROR diff --git a/custom_templates/template_library.jinja b/custom_templates/template_library.jinja index a3b79ee..e75811d 100644 --- a/custom_templates/template_library.jinja +++ b/custom_templates/template_library.jinja @@ -1,27 +1,27 @@ {# This macro returns _power entity for a controlled plug device #} - {% macro getpower_id(evcharge_id) %} - {% set attrib_list = device_entities( device_id (evcharge_id ) ) %} + {% macro getpower_id(evcharge_id) %} + {% set attrib_list = device_entities( device_id (evcharge_id ) ) %} - {% for attrib in attrib_list -%} - {% if ( attrib | regex_search('power$')) -%} - {{ attrib }} - {%- endif %} - {%- endfor %} - {% endmacro %} + {% for attrib in attrib_list -%} + {% if ( attrib | regex_search('power$')) -%} + {{ attrib }} + {%- endif %} + {%- endfor %} + {% endmacro %} - {########################################################################} + {########################################################################} - {# This macro returns _energy entity for a controlled plug device #} + {# This macro returns _energy entity for a controlled plug device #} - {% macro getenergy_id(evcharge_id) %} - {% set attrib_list = device_entities( device_id (evcharge_id ) ) %} - - {% for attrib in attrib_list -%} - {% if ( attrib | regex_search('energy$')) -%} - {{ attrib }} - {%- endif %} - {%- endfor %} - {% endmacro %} + {% macro getenergy_id(evcharge_id) %} + {% set attrib_list = device_entities( device_id (evcharge_id ) ) %} + + {% for attrib in attrib_list -%} + {% if ( attrib | regex_search('energy$')) -%} + {{ attrib }} + {%- endif %} + {%- endfor %} + {% endmacro %}