Hi,
I’m not sure if this helps or if it’s the best or simplest approach, but I’ll share how I’ve handled a similar setup using a Solax EV charger.
To keep everything organized and maintainable, I use a folder structure for my configuration files:
configuration.yaml
homeassistant:
packages: !include_dir_named includes
This allows breaking configurations into smaller, more readable parts:
In the main automation YAML, I created a state machine to control the EV charger. It evaluates various binary sensors to determine the current operation mode.
template:
- sensor:
- name: evc_operation_mode
icon: mdi:state-machine
state: >
{% set ns = namespace(result='Standby') %}
{% set sensor_modes = [
('binary_sensor.evc_mode_disabled', 'Disabled'),
('binary_sensor.evc_mode_manual_charge', 'Charge_Manual'),
('binary_sensor.evc_mode_solar_charge', 'Charge_From_Solar'),
('binary_sensor.evc_mode_spot_charge', 'Charge_Spot'),
('binary_sensor.evc_mode_scheduled_charge', 'Charge_Scheduled')
] %}
{% for sensor, mode in sensor_modes %}
{% if mode == 'Disabled' %}
{% set sensor_state = states(sensor) | bool(default=true) %}
{% else %}
{% set sensor_state = states(sensor) | bool(default=false) %}
{% endif %}
{% if sensor_state %}
{% set ns.result = mode %}
{% break %}
{% endif %}
{% endfor %}
{{ ns.result }}
script:
evc_select_operation_mode:
alias: "Select and run EVC automation mode"
sequence:
- variables:
mode: "{{ states('sensor.evc_operation_mode') }}"
- choose:
- conditions: "{{ mode == 'Disabled' }}"
sequence:
- service: script.evc_reset
- conditions: "{{ mode in ['Charge_Manual', 'Charge_From_Solar', 'Charge_Scheduled'] }}"
sequence:
- service: script.evc_start_charge
- conditions: "{{ mode == 'Charge_Spot' }}"
sequence:
- service: script.evc_set_max_charge_current
- service: script.evc_start_charge
default:
- service: script.evc_reset
Each mode is driven by a binary sensor. Here’s an example for planned charging, which activates based on dashboard inputs and conditions.
template:
- binary_sensor:
# EVC Automation Mode - Scheduled Charging
- name: evc_mode_scheduled_charge
state: >
{% set scheduled = states('input_boolean.evc_scheduled_enabled') | bool(default=false) %}
{% set connected = states('binary_sensor.evc_connected') | bool(default=false) %}
{% set time_check_enabled = states('binary_sensor.evc_sched_time_check_enabled') | bool(default=false) %}
{% set time_ok = states('binary_sensor.evc_sched_time_ok') | bool(default=false) %}
{% set energy_check_enabled = states('binary_sensor.evc_sched_energy_check_enabled') | bool(default=false) %}
{% set energy_ok = states('binary_sensor.evc_sched_energy_ok') | bool(default=false) %}
{% set time_valid = time_ok if time_check_enabled else false %}
{% set energy_valid = energy_ok if energy_check_enabled else false %}
{{
connected and
scheduled and
time_valid and
energy_valid
}}
# Time condition for scheduled charging (active within time window)
- name: evc_sched_time_ok
state: >
{% set start = states('input_datetime.evc_sched_start') %}
{% set end = states('input_datetime.evc_sched_end') %}
{% set now = now().strftime('%H:%M:%S') %}
{{
(start <= now < end) or
(start > end and (now >= start or now < end))
}}
# Energy condition for scheduled charging (not yet fully charged)
- name: evc_sched_energy_ok
state: >
{% set target = states('input_number.evc_sched_target_energy') | int(default=0) %}
{% set current = states('sensor.evc_energy_charged') | int(default=0) %}
{{ current < target }}
# Is scheduled time condition enabled
- name: evc_sched_time_check_enabled
state: >
{% set start = states('input_datetime.evc_sched_start') %}
{% set end = states('input_datetime.evc_sched_end') %}
{{ start != end }}
# Is scheduled energy condition enabled
- name: evc_sched_energy_check_enabled
state: >
{% set target = states('input_number.evc_sched_target_energy') | int(default=0) %}
{{ target != 0 }}
My control dashboard lets me toggle modes and conditions:
Through which I manage actually manage following entities, available from the integration: