Sinds 2018 rijd ik elektrisch. In eerste instantie een Nissan Leaf Tekna (2018), wat een hele fijne ‘lelijke’ auto was. Comfortabel, snel en degelijk. Helaas was de accu (40kW) te klein en de auto inmiddels een beetje verouderd.
In 2018 heb ik toen ook meteen een EV lader zelf gebouwd. Omdat ik toen maximaal 20A over de (bestaande) kabel mocht transporteren heb ik de lader tot 1 fase 20A beperkt en de laadstroom kan ik dus van de minimale 6A tot 20A regelen. In de praktijk kan ik daar dus van 1,4kW tot 4,6kW mee laden, ofwel een volle accu in een nachtje laden. Uiteraard de lader slim gemaakt met een ESP8266 en die middels de rest-API in Home Assistant geïntegreerd.
Zie config:
Spoiler
#############################################################
# Simple EVSE Wallbox Wifi package #
# Hardware: https://github.com/CurtRod/SimpleEVSE-WiFi #
#############################################################
#### Set charging amp limits #####
input_number:
evse_max_amps:
name: "Max. stroom"
icon: mdi:power-socket
unit_of_measurement: A
min: 6
max: 20
evse_max_charge_distance:
name: "Maximaal bijladen"
min: 10
max: 270
step: 10
#### Smart charging ####
input_boolean:
solar_smart_charging:
name: "Slim laden"
icon: mdi:solar-power-variant
#### Set max amps ####
rest_command:
evse_set_max_amps:
url: "http://192.168.207.98/setCurrent?current={{ states.input_number.evse_max_amps.state }}"
#### Activate EVSE ####
command_line:
- switch:
name: EVSE
command_on: "curl http://192.168.207.98/setStatus?active=true"
command_off: "curl http://192.168.207.98/setStatus?active=false"
command_state: "curl -X GET http://192.168.207.98/getParameters"
value_template: "{{ value_json.list[0].evseState == True }}"
#### customizations ####
homeassistant:
customize:
input_number.evse_max_amps:
persistent: true
input_number.evse_max_charge_distance:
persistent: true
switch.evse:
persistent: true
icon: mdi:ev-station
#### sensors ####
sensor:
- platform: rest
resource: http://192.168.207.98/getParameters
name: evse
# scan_interval: 20
value_template: 'OK'
json_attributes_path: $.list[0]
json_attributes:
- vehicleState
- evseState
- maxCurrent
- actualCurrent
- actualPower
- duration
- alwaysActive
- lastActionUser
- lastActionUID
- energy
- mileage
- meterReading
- currentP1
## optioneel voor 3-fase laden
# - currentP2
# - currentP3
- platform: template
sensors:
evse_vehiclestate:
value_template: "{{ state_attr('sensor.evse', 'vehicleState') }}"
evse_vehicle_state_templated:
friendly_name: Status
value_template: >-
{% if is_state('sensor.evse_vehiclestate', '1') %}
Niet verbonden
{% elif is_state('sensor.evse_vehiclestate', '2') %}
Verbonden
{% elif is_state('sensor.evse_vehiclestate', '3') %}
Laadt...
{% endif %}
icon_template: >-
{% if is_state('sensor.evse_vehiclestate', '1') %}
mdi:car
{% elif is_state('sensor.evse_vehiclestate', '2') %}
mdi:ev-plug-type2
{% elif is_state('sensor.evse_vehiclestate', '3') %}
mdi:battery-charging
{% endif %}
evse_evsestate:
value_template: "{{ state_attr('sensor.evse', 'evseState') }}"
evse_maxcurrent:
value_template: "{{ state_attr('sensor.evse', 'maxCurrent') }}"
evse_actualcurrent:
friendly_name: Actuele laadstroom
value_template: "{{ state_attr('sensor.evse', 'actualCurrent') }}"
icon_template: mdi:power-socket
evse_actualpower:
value_template: "{{ state_attr('sensor.evse', 'actualPower') }}"
friendly_name: "Actueel laadvermogen"
icon_template: mdi:flash-circle
unit_of_measurement: kW
evse_duration:
value_template: "{{ state_attr('sensor.evse', 'duration') }}"
evse_duration_templated:
friendly_name: Tijd geactiveerd
value_template: >-
{% set uptime = states.sensor.evse_duration.state | float * 1 / 60000 | int %}
{% set minutes = ((uptime % 60) / 1) | int %}
{% set hours = ((uptime % 1440) / 60) | int %}
{% set days = (uptime /1440) | int %}
{%- if uptime < 1 -%}
Minder dan één minuut
{%- else -%}
{%- if days > 0 -%}
{%- if days == 1 -%}
1 dag
{%- else -%}
{{ days }} dagen
{%- endif -%}
{%- endif -%}
{%- if hours > 0 -%}
{%- if days > 0 -%}
{{ ', ' }}
{%- endif -%}
{%- if hours == 1 -%}
1 uur
{%- else -%}
{{ hours }} uren
{%- endif -%}
{%- endif -%}
{%- if minutes > 0 -%}
{%- if days > 0 or hours > 0 -%}
{{ ', ' }}
{%- endif -%}
{%- if minutes == 1 -%}
1 minuut
{%- else -%}
{{ minutes }} minuten
{%- endif -%}
{%- endif -%}
{%- endif -%}
icon_template: mdi:progress-clock
evse_alwaysactive:
value_template: "{{ state_attr('sensor.evse', 'alwaysActive') }}"
evse_lastactionuser:
value_template: "{{ state_attr('sensor.evse', 'lastActionUser') }}"
evse_lastactionuid:
value_template: "{{ state_attr('sensor.evse', 'lastActionUID') }}"
evse_energy:
friendly_name: Opgeladen vermogen
value_template: "{{ state_attr('sensor.evse', 'energy') }}"
icon_template: mdi:download
unit_of_measurement: kWh
evse_mileage:
friendly_name: Opgeladen bereik
value_template: "{{ state_attr('sensor.evse', 'mileage') }}"
icon_template: mdi:map-marker-distance
evse_meterreading:
friendly_name: Meterstand deze sessie
value_template: "{{ state_attr('sensor.evse', 'meterReading') }}"
icon_template: mdi:counter
unit_of_measurement: kWh
evse_currentp1:
friendly_name: Amperage Fase 1
value_template: "{{ state_attr('sensor.evse', 'currentP1') }}"
icon_template: mdi:power-socket
## optioneel voor 3-fase laden
# evse_currentp2:
# friendly_name: Amperage Fase 2
# value_template: "{{ state_attr('sensor.evse', 'currentP2') }}"
# icon_template: mdi:power-socket
# evse_currentp3:
# friendly_name: Amperage Fase 3
# value_template: "{{ state_attr('sensor.evse', 'currentP3') }}"
# icon_template: mdi:power-socket
template:
- sensor:
- name: "EVSE energieverbruik in kWh"
unique_id: EVSE_energieverbruik_in_kwh
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
state: "{{ states('sensor.evse_energy')|float(0) }}"
availability: "{{ states('sensor.evse_energy')|is_number }}"
icon: mdi:ev-station
– SimpleEVSE geïntegreerd in Home Assistant –
Een EV lader bouwen is geen rocket science, want in feite is het niets meer dan een apparaat dat verteld hoeveel stroom er richting de auto mag en aan- of uitgezet kan worden. De lader zelf zit immers in de auto.
Het laadprotocol is vrij simpel en hiervoor zijn veel EV-controllers beschikbaar. Zelf heb ik toen gekozen voor de EVSE Wallbox DIN (met SimpleEVSE Wifi).
Een paar jaar later hebben we zonnepanelen laten plaatsen en daar heb ik gekozen voor een installatie met Enphase micro-omvormers met een Envoy-S Metered controller op 3 fasen. Dat wil zeggen dat ik niet alleen (per fase) kan meten wat de zonnepanelen opleveren, maar ook (per fase) wat het huis totaal verbruikt. Dat alles met een meet-interval vanaf minimaal 6 seconden.
Ik heb dus beschikking over:
-
Opbrengst zonnepanelen (gemeten met Envoy S metered)
-
Verbruik huis (gemeten met Envoy S metered)
-
Afname van het net (gemeten met p1 interface: https://www.espthings.io/sm01 )
-
Teruglevering naar het net (gemeten met p1 interface: https://www.espthings.io/sm01 )
Het doel was om de zonne-energie, zodra deze opgewekt wordt, ook meteen zo veel mogelijk te verbruiken en wat is er dan beter dan zo veel mogelijk in je auto stoppen om zo de impact op het milieu zo veel mogelijk te beperken en natuurlijk ook om de zonnepanelen terug te verdienen. In België kun je immers niet meer salderen (wel nog tegen een lagere vergoeding terugleveren).
Om te weten wanneer je moet gaan laden is de eerste vereiste weten wat je NETTO energie is. Ofwel de productie minus al het eigen verbruik.
Ter illustratie de zonnepanelen:
Netto energie template sensor in Home Assistant:
Spoiler
template:
- trigger:
- platform: time_pattern
seconds: "/5"
sensor:
- name: Netto electriciteitsverbruik
unique_id: netto_electriciteitsverbruik
state: "{{ ((states('sensor.envoy_current_power_consumption') | float * 0.001) - (states('sensor.envoy_current_power_production') | float * 0.001))| round(2) | default(0)}}"
unit_of_measurement: "Kw"
Nu weet ik dus, afhankelijk van de update-interval van de Enphase Envoy-S (6-8 seconden) en de interval van de template sensor, gemiddeld iedere ~10 seconden wat het netto energieverbruik is.
Daarna werd het iets spannender, want nu wilde ik eigenlijk de lader automatisch aanschakelen als de zon gaat schijnen, ‘harder’ laten laden als de zonnepanelen opleveren en ‘zachter’ zodra er minder opgeleverd word. Uit als er enige tijd geen opbrengst is. Ofwel die ‘Netto energie’ sensor zo veel mogelijk op 0 houden.
Na wat experimenteren kwam ik tot deze oplossing: (’ duracell’ is de naam van mijn auto in de Home Assistant integratie (HACS Tesla integratie), ’ evse’ is de lader)
Spoiler
##### smart solar charging ######
# Car charger - Vehicle state: #
# 2 = connected #
# 3 = charging #
#################################
## turn smart solar charging on
- id: smart_solar_charging_on
alias: smart_solar_charging_on
initial_state: on
trigger:
platform: state
entity_id:
- sensor.envoy_current_power_production
condition:
condition: and
conditions:
- condition: numeric_state
entity_id: sensor.netto_electriciteitsverbruik
below: "-1.2"
- condition: state
entity_id: input_boolean.solar_smart_charging
state: "on"
- condition: state
entity_id: sensor.evse_vehiclestate
state: "2"
- condition: numeric_state
entity_id: sensor.duracell_battery
below: "100"
action:
- service: switch.turn_on
entity_id: switch.evse
- delay: 00:00:05
- service: switch.turn_on
entity_id: switch.duracell_charger
- delay: 00:00:05
- service: homeassistant.update_entity
entity_id: sensor.evse
## turn smart solar charging off
- id: smart_solar_charging_off
alias: smart_solar_charging_off
initial_state: on
trigger:
platform: numeric_state
entity_id: sensor.netto_electriciteitsverbruik
above: "0.3"
for:
minutes: "2"
condition:
condition: and
conditions:
- condition: state
entity_id: input_boolean.solar_smart_charging
state: "on"
- condition: state
entity_id: sensor.evse_vehiclestate
state: "3"
action:
- service: switch.turn_off
entity_id: switch.evse
#### set charging amperage ####
## up
- id: smart_solar_charging_amperage_up
alias: smart_solar_charging_amperage up
initial_state: on
trigger:
- platform: state
entity_id: sensor.netto_electriciteitsverbruik
- platform: state
entity_id: sensor.evse_actualpower
- platform: state
entity_id: sensor.envoy_current_power_consumption
- platform: state
entity_id: sensor.envoy_current_power_production
- platform: state
entity_id: switch.evse
to: "on"
condition:
condition: and
conditions:
- condition: numeric_state
entity_id: sensor.netto_electriciteitsverbruik
below: "-0.35"
- condition: state
entity_id: input_boolean.solar_smart_charging
state: "on"
- condition: state
entity_id: sensor.evse_vehiclestate
state: "3"
action:
- service: input_number.set_value
data:
value: "{{ (states.input_number.evse_max_amps.state | int ) + 1 }}"
target:
entity_id: input_number.evse_max_amps
- delay: 00:00:02
- service: homeassistant.update_entity
entity_id: sensor.evse
## down
- id: smart_solar_charging_amperage_down
alias: smart_solar_charging_amperage down
initial_state: on
trigger:
- platform: state
entity_id: sensor.netto_electriciteitsverbruik
- platform: state
entity_id: sensor.evse
- platform: state
entity_id: sensor.envoy_current_power_consumption
- platform: state
entity_id: sensor.envoy_current_power_production
- platform: state
entity_id: switch.evse
to: "on"
condition:
condition: and
conditions:
- condition: numeric_state
entity_id: sensor.netto_electriciteitsverbruik
above: "0"
- condition: state
entity_id: input_boolean.solar_smart_charging
state: "on"
- condition: state
entity_id: sensor.evse_vehiclestate
state: "3"
action:
- service: input_number.set_value
data:
value: "{{ (states.input_number.evse_max_amps.state | int ) - 1 }}"
target:
entity_id: input_number.evse_max_amps
- delay: 00:00:02
- service: homeassistant.update_entity
entity_id: sensor.evse
Tot hier werkt alles via uitsluitend lokale API’s, hier komt geen cloud dienst aan te pas!
Dit werkt perfect van 1,4kW tot 4,6kW, echter soms leveren de panelen bijvoorbeeld maar 1.3kW op en heb je ook nog 350w eigen verbruik. Dan wil je eigenlijk nog lager dan die 6A (1.4kW). Gelukkig kan mijn huidige auto zelf wel laden van 1-32A per fase, dus heb ik een automatisering gemaakt die, zodra het minimum van de lader (6A) is bereikt, de tesla zelf instelt op 1 to 5A. Zo kan ik effectief van 0.23kW tot 4,6kW optimaal gebruik maken van de opbrengst van de panelen.
De tesla integratie gaat wel via de cloud, maar die is wel erg betrouwbaar en snel:
Spoiler
## Tesla max amps up - id: tesla\_smart\_solar\_charging\_amperage\_up alias: Tesla smart\_solar\_charging\_amperage up initial\_state: on trigger: - platform: state entity\_id: sensor.netto\_electriciteitsverbruik condition: condition: and conditions: - condition: numeric\_state entity\_id: sensor.netto\_electriciteitsverbruik below: "-0.35" - condition: state entity\_id: input\_number.evse\_max\_amps state: "6.0" - condition: state entity\_id: input\_boolean.solar\_smart\_charging state: "on" - condition: state entity\_id: sensor.evse\_vehiclestate state: "3" action: - service: number.set\_value data: value: "{{ (states.number.duracell\_charging\_amps.state | int ) + 1 }}" target: entity\_id: number.duracell\_charging\_amps ## Tesla max amps down - id: tesla\_smart\_solar\_charging\_amperage\_down alias: Tesla smart\_solar\_charging\_amperage down initial\_state: on trigger: - platform: state entity\_id: sensor.netto\_electriciteitsverbruik condition: condition: and conditions: - condition: numeric\_state entity\_id: sensor.netto\_electriciteitsverbruik above: "0" - condition: state entity\_id: input\_number.evse\_max\_amps state: "6.0" - condition: state entity\_id: input\_boolean.solar\_smart\_charging state: "on" - condition: state entity\_id: sensor.evse\_vehiclestate state: "3" action: - service: number.set\_value data: value: "{{ (states.number.duracell\_charging\_amps.state | int ) - 1 }}" target: entity\_id: number.duracell\_charging\_amps ## Correct tesla charging amps - id: correct\_tesla\_charging\_amperage alias: Correct Tesla charging amperage initial\_state: on trigger: - platform: state entity\_id: input\_number.evse\_max\_amps - platform: state entity\_id: sensor.netto\_electriciteitsverbruik condition: condition: and conditions: - condition: numeric\_state entity\_id: input\_number.evse\_max\_amps above: "6" - condition: state entity\_id: input\_boolean.solar\_smart\_charging state: "on" - condition: not conditions: - condition: state entity\_id: number.duracell\_charging\_amps state: "{{ (states.input\_number.evse\_max\_amps.state) }}" action: - service: number.set\_value data: value: "{{ (states.input\_number.evse\_max\_amps.state) }}" target: entity\_id: number.duracell\_charging\_amps
Hier kan je dat mooi zien, de auto begin vanaf +/- 13.00 te laden en is rond 15.30 vol.
Het geeft in ieder geval, los van alle besparingen, een enorm goed gevoel dat de auto voor een groot deel op zonne-energie rijd.
Twee ‘nadelen’:
- Met name bij sterk wisselende bewolking of bijvoorbeeld wanneer de wasmachine en kookplaat plotseling aan gaan net niet snel genoeg geschakeld wordt, waardoor we gemiddeld zo’n 200-300w per uur van het net trekken.
- Als je thuis komt moet je altijd de laadstekker in de auto stoppen. Ook dat is gedeeltelijk geautomatiseerd, want zodra de deuren van de auto van ‘open’ naar ‘closed’ gaan, de auto niet ingeplugd is en de auto in de zone ‘thuis’ is, stuur ik met HA automatisch het laadklepje open en hoef ik alleen nog maar de vaste kabel van de EV-lader in de auto te steken.
Mvg,
Michel





