Wczoraj przyszedł go-e gemini, naprawdę bardzo dobra jest ta ładowarka! Płynna zmiana prądu ładowania 6-32A w skoku co 1A (wersja 22kW, wersja 11kW ma 6-16A), dla jednej fazy bez zatrzymania ładowania, albo zmiana 1faza → 3fazy z zatrzymaniem i również sterowanie 6-32A dla 3 faz bez zatrzymania - zmiana 1faza na 3 fazy symuluje odłączenie kabla od auta - to jest już limit po stronie auta dlatego wiąże się z zatrzymaniem i startem ładowania na nowo.
Integruje się z HA przez mqtt, albo modbus tcp albo przez http (gotowe integrację dla http API i mqtt w HACS).
Aplikacja również bardzo przyjazna (jedyny minus dla osób nieznających angielskiego bo aplikacja nie ma polskiego ale myślę że to już nie jest problemem w dzisiejszych czasach).
Zastanawiałem się nad sterowaniem, w taki sposób aby było to najefektywniej wymyśliłem aby zrobić tak:
Sprawdzić bilansowanie w danej godzinie i jeżeli jest dodatnie i powyżej 0,3kWh
Zrobić obliczenie max prądu co można nastawić produkcja_pv / napiecie_ac + 0,9 (0,9 aby zaokrąglone było w górę) i nastawić taki prąd aby zużywać całość produkcji pv, a jeżeli jest poniżej 0,3kWh w danej godzinie to zmieniać prąd w skoku o 1A góra, dół aby nie zejść na bilansowaniu poniżej 0, gdy spadnie poniżej 0 to zmienić prąd na 6A (minimalna wartość).
Myślę aby to zrobić co 2-5 minut aby nie zmieniać prądu zbyt często.
A więc biorę się za pisanie tej dość skomplikowanej automatyzacji i zobaczymy co z tego wyjdzie, podzielę się efektem jak już będę miał jakiś dzień ze słońcem aby sprawdzić czy to działa.
Z racji pogody zrobiłem automatyzację ale nie było okazji do testów, lecz myślę, że zadziała jak ktoś zainteresowany analizą, testami to YAML automatyzacji poniżej - w moim przypadku przyłącze energetyczne z zabezpieczeniem 25A, więc limit ładowania 1fazowego założyłem 22A aby mieć mały zapas na jakieś zużycie w domu, a ładowanie 3 fazowe 16A bo i tak mam w aucie tylko ładowarkę 11kW czyli 16A, w automatyzacji dążę do uzyskania bilansu godzinowego jak najbliższego “0”, dlatego, że rozliczenie z energetyką opiera się na bilansowaniu godzinowym to nie ma sensu dążyć do zerowego eksportu, a jedynie do zerowego bilansu w godzinie.
alias: Dynamiczne ładowanie EV
description: >
Automatyczna regulacja prądu ładowania go-e Gemini na podstawie bilansu energii i produkcji PV.
mode: restart
trigger:
- platform: time_pattern
minutes: "/2" # aktualizacja co 2 minuty (można zmienić np na 5 minut, myślę że mniej nie ma sensu aby nie regulować za często prądu bo to niezdrowe dla baterii)
condition:
# Działa tylko w dzień (1h po wschodzie, 1h przed zachodem) - tutaj chce jeszcze dodać jeden warunek - aby działało tylko gdy podłączone auto do ładowarki, ale zobaczymy czy nie lepiej bez niego aby po podłączeniu gdy bilans na eksport od razu nie ładować większym prądem)
- condition: sun
after: sunrise
after_offset: "01:00:00"
- condition: sun
before: sunset
before_offset: "-01:00:00"
variables:
# Dane wejściowe
bilans_kwh: "{{ states('sensor.bilansowanie_godzina') | float(0) }}"
bilans: "{{ bilans_kwh * 1000 }}" # przeliczenie na W bo moja zmienna bilansowania międzyfazowego jest w kWh a tu prościej operować na W, więc dostosować należy pod siebie
moc_pv: "{{ states('sensor.fronius_ac_power') | float(0) }}"
moc_dom: "{{ states('sensor.pobierana_moc') | float(0) }}"
aktualny_prad: "{{ states('number.go_echarger_xxxxxxx_amp') | int(6) }}"
napiecie_l1: "{{ state_attr('sensor.go_echarger_xxxxxxx_nrg') | float(230) }}"
napiecie_l2: "{{ state_attr('sensor.go_echarger_xxxxxxx_nrg_2') | float(230) }}"
napiecie_l3: "{{ state_attr('sensor.go_echarger_xxxxxxx_nrg_3') | float(230) }}"
napiecie_srednie: "{{ (napiecie_l1 + napiecie_l2 + napiecie_l3) / 3 }}"
# Ograniczenia
limit_1f: 22
limit_3f: 16
min_prad: 6
max_delta: 3 # maksymalna zmiana prądu w jednym cyklu, zapobiega dużym zmianą prądu w każdym cyklu co mogłoby szkodzić baterii.
action:
# Log diagnostyczny – aby móc debugować automatyzację, jak już zadziała to można wyłączyć. (Do oglądania w dzienniku).
- service: logbook.log
data:
name: "EV Debug"
message: >
Bilans={{ bilans|round(0) }} W | Prąd={{ aktualny_prad }} A |
Napięcia: L1={{ napiecie_l1 }} V, L2={{ napiecie_l2 }} V, L3={{ napiecie_l3 }} V
- choose:
# ========================== TRYB 1-FAZOWY ==========================
- conditions:
- condition: template
value_template: >-
{{ states('select.go_echarger_xxxxxx_psm') == 'Force single phase'
}}
sequence:
- choose:
# --- Duży bilans: dynamiczna korekta ---
- conditions: "{{ bilans > 300 or bilans < -300 }}"
sequence:
- variables:
# Korekta prądu I = P / U
delta_i: >-
{% set val = (bilans / napiecie_l1) | int %}
{% if val > max_delta %} {{ max_delta }}
{% elif val < (0 - max_delta) %} {{ 0 - max_delta }}
{% else %} {{ val }}
{% endif %}
tmp: "{{ aktualny_prad + delta_i }}"
docelowy_prad: >-
{% if tmp > limit_1f %} {{ limit_1f }}
{% elif tmp < min_prad %} {{ min_prad }}
{% else %} {{ tmp }}
{% endif %}
- service: number.set_value
target:
entity_id: number.go_echarger_xxxxxxx_amp
data:
value: "{{ docelowy_prad }}"
# --- Bilans bliski zera: delikatna korekta ±1A ---
- conditions: "{{ -300 <= bilans <= 300 }}"
sequence:
- choose:
# Eksport (PV nadwyżka)
- conditions: "{{ bilans > 100 }}"
sequence:
- service: number.set_value
target:
entity_id: number.go_echarger_xxxxxxx_amp
data:
value: "{{ [aktualny_prad + 1, limit_1f] | min }}"
# Import (brak PV)
- conditions: "{{ bilans < -100 }}"
sequence:
- service: number.set_value
target:
entity_id: number.go_echarger_xxxxxxx_amp
data:
value: "{{ [aktualny_prad - 1, min_prad] | max }}"
# ========================== TRYB 3-FAZOWY ==========================
- conditions:
- condition: template
value_template: >-
{{ states('select.go_echarger_xxxxxx_psm') == 'Force three phases'
}}
sequence:
- choose:
# --- Duży bilans: dynamiczna korekta ---
- conditions: "{{ bilans > 300 or bilans < -300 }}"
sequence:
- variables:
# Korekta prądu I ≈ P / (1.732 * U) - 1,732 to pierwiastek z 3 (dla tych co nie wiedza skąd to się wzięło)
delta_i: >-
{% set val = (bilans / (1.732 * napiecie_srednie)) | int %}
{% if val > max_delta %} {{ max_delta }}
{% elif val < (0 - max_delta) %} {{ 0 - max_delta }}
{% else %} {{ val }}
{% endif %}
tmp: "{{ aktualny_prad + delta_i }}"
docelowy_prad: >-
{% if tmp > limit_3f %} {{ limit_3f }}
{% elif tmp < min_prad %} {{ min_prad }}
{% else %} {{ tmp }}
{% endif %}
- service: number.set_value
target:
entity_id: number.go_echarger_xxxxxxx_amp
data:
value: "{{ docelowy_prad }}"
# --- Bilans bliski zera: delikatna korekta ±1A ---
- conditions: "{{ -300 <= bilans <= 300 }}"
sequence:
- choose:
# Eksport (nadwyżka PV)
- conditions: "{{ bilans > 100 }}"
sequence:
- service: number.set_value
target:
entity_id: number.go_echarger_xxxxxxx_amp
data:
value: "{{ [aktualny_prad + 1, limit_3f] | min }}"
# Import (niedobór PV)
- conditions: "{{ bilans < -100 }}"
sequence:
- service: number.set_value
target:
entity_id: number.go_echarger_xxxxxxx_amp
data:
value: "{{ [aktualny_prad - 1, min_prad] | max }}"