Automatyzacja Deye w Home Assistant: bateria, Time of Use, taryfy, prognoza PV i nadwyżki krok po kroku
Samo wyświetlanie produkcji, zużycia domu i stanu baterii jest dopiero początkiem. Prawdziwa wartość integracji Deye z Home Assistant pojawia się wtedy, gdy system zaczyna podejmować przewidywalne decyzje: chroni rezerwę baterii, ładuje magazyn w tanim oknie, pozostawia miejsce na energię z paneli, przygotowuje zapas przed awarią i uruchamia duże odbiorniki dopiero przy rzeczywistym eksporcie.
Ten poradnik prowadzi od podstaw. Najpierw wyjaśnia Time of Use i wymagane encje. Następnie budujemy automatyzacje od najprostszych alarmów i profili ręcznych po taryfy, prognozę PV, ceny dynamiczne, nadwyżki, pompę ciepła i ładowanie samochodu. Każdy ma tryb ręczny, kontrolę świeżości danych, ograniczenie liczby zapisów, procedurę testową i bezpieczny stan awaryjny.
Seria Deye i Home Assistant — gdzie jesteś?
Ten artykuł jest trzecią częścią kompletnej serii. Zakłada, że falownik jest już poprawnie połączony, a najważniejsze wartości zostały zweryfikowane. Gdy dopiero zaczynasz albo dane wyglądają podejrzanie, najpierw przejdź przez wcześniejsze części.
Najważniejsza zasada: jeden system podejmuje decyzję, jeden zapisuje
Najgroźniejsza konfiguracja powstaje wtedy, gdy kilka niezależnych mechanizmów zmienia te same ustawienia. Harmonogram falownika, automatyzacja Home Assistant, SolarAssistant, Node-RED, EMHASS i aplikacja producenta mogą działać poprawnie osobno, ale razem zaczną wzajemnie nadpisywać SOC, godziny oraz Grid Charge.
Od czego chcesz zacząć?
Nie musisz wdrażać całego systemu od razu. Wybierz problem, który chcesz rozwiązać jako pierwszy. Najbezpieczniejsza kolejność to: sprawdzenie encji, symulacja decyzji, jedna prosta automatyzacja i dopiero później kolejne funkcje.
Czy te automatyzacje zadziałają z Twoją metodą integracji?
Do automatyzacji bojlera lub ładowarki wystarczą poprawne sensory z falownika. Do zmiany SOC, Grid Charge i Time of Use potrzebne są dodatkowo encje sterujące. To najważniejsze rozróżnienie w całym artykule.
| Metoda | Monitoring | SOC / TOU | Nadwyżka PV |
|---|---|---|---|
| Solarman tylko z sensorami | Tak | Nie | Tak |
| Solarman z encjami R/W | Tak | Zależnie od profilu | Tak |
| Kellerza Sunsynk/Deye | Tak | Dla obsługiwanych modeli | Tak |
| ESPHome | Tak | Tylko gdy konfiguracja udostępnia zapis | Tak |
| MQTT | Tak | Zależnie od mostu | Tak |
| SolarAssistant | Tak | Dla udostępnionych ustawień | Tak |
sensor, masz monitoring. Encje number, switch i select mogą pozwalać na zmianę ustawień, ale każdą z nich trzeba najpierw sprawdzić ręcznie.1. Jak działa Time of Use w Deye
W instrukcjach Deye funkcja Time of Use służy do programowania, kiedy sieć lub generator mogą ładować baterię oraz kiedy bateria może zasilać odbiorniki. Typowy ekran zawiera sześć programów. Każdy opisuje czas, SOC, moc i zgodę na Grid Charge. Znaczenie szczegółów może różnić się między rodzinami i firmware, więc instrukcja konkretnego modelu ma pierwszeństwo.
2. Skąd biorą się encje Deye i dlaczego nie są takie same u każdego
W przykładach pojawiają się nazwy takie jak sensor.deye_battery_soc, sensor.deye_grid_power czy number.deye_minimum_soc. Home Assistant nie tworzy ich sam z siebie. Encje pojawiają się dopiero wtedy, gdy falownik zostanie połączony z Home Assistant przez konkretną integrację. To właśnie integracja odczytuje rejestry falownika, nadaje im nazwy i wystawia je jako sensory, przełączniki, listy wyboru albo pola liczbowe.
Cały łańcuch wygląda tak
Dlaczego nazwy różnią się między instalacjami
Jak znaleźć własne encje krok po kroku
sensor.deye_battery_soc w tym poradniku jest miejscem do podmiany. Jeżeli Twoja integracja utworzyła sensor.sunsynk_battery_soc, właśnie tej nazwy musisz użyć w automatyzacji.Które encje pochodzą z falownika, a które tworzymy sami
3. Co musi być dostępne w Home Assistant
Zanim utworzysz automatykę, sprawdź, czy integracja udostępnia dane i encje zapisu. Sam monitoring nie oznacza możliwości zmiany harmonogramu.
sensor.deye..., number.deye... i switch.deye... oznaczają dane utworzone przez Twoją integrację falownika. Encje zaczynające się od input_... tworzymy sami jako helpery.Dane pomiarowe
Encje sterujące
4. Zanim skopiujesz YAML — cztery pojęcia dla początkującego
Encja to pojedyncza wartość lub sterowanie w Home Assistant, np. SOC baterii albo przełącznik Grid Charge. Helper to wirtualne pokrętło lub przełącznik tworzony przez użytkownika. Wyzwalacz uruchamia automatyzację, warunek pozwala jej działać tylko w określonej sytuacji, a akcja wykonuje zmianę.
alias:, bez dopisywania automation:.5. Helpery i ręczny wyłącznik automatyki
Helpery pozwalają zmieniać progi z panelu. Główny przełącznik musi zatrzymywać wszystkie zapisy, ale nie powinien wyłączać lokalnych zabezpieczeń falownika.
Gdzie wkleić ten kod
input_boolean:
deye_automatyka:
name: Deye — automatyka energii
icon: mdi:home-lightning-bolt
deye_tryb_awaryjny:
name: Deye — rezerwa awaryjna
icon: mdi:battery-alert
deye_ladowanie_sieci:
name: Deye — zezwól na ładowanie z sieci
icon: mdi:transmission-tower-import
input_number:
deye_soc_normalny:
name: Deye — normalna rezerwa SOC
min: 10
max: 80
step: 5
unit_of_measurement: "%"
icon: mdi:battery-medium
deye_soc_awaryjny:
name: Deye — awaryjna rezerwa SOC
min: 30
max: 100
step: 5
unit_of_measurement: "%"
icon: mdi:battery-alert-variant
deye_nadwyzka_start:
name: Deye — eksport wymagany do startu
min: 200
max: 5000
step: 100
unit_of_measurement: "W"
icon: mdi:transmission-tower-export
input_datetime:
deye_tania_od:
name: Deye — tania taryfa od
has_date: false
has_time: true
deye_tania_do:
name: Deye — tania taryfa do
has_date: false
has_time: true
Najłatwiejsza droga: utwórz helpery w interfejsie
6. Świeżość danych i kierunek przepływu
Automatyzacja działająca na starych danych może pozostawić ładowanie lub odbiornik w złym stanie. Najpierw utwórz sensor świeżości. W przykładzie dane są aktualne przez 90 sekund od ostatniej aktualizacji mocy sieci.
Najpierw ustal znak mocy sieci
template:
- binary_sensor:
- name: "Deye — podstawowe dane dostępne"
unique_id: deye_podstawowe_dane_dostepne
availability: >
{{ states('sensor.deye_grid_power') not in
['unknown', 'unavailable', 'none', ''] }}
state: >
{{ states('sensor.deye_grid_power') not in
['unknown', 'unavailable', 'none', ''] }}
- sensor:
- name: "Deye — eksport do sieci"
unique_id: deye_eksport_do_sieci
unit_of_measurement: "W"
device_class: power
state_class: measurement
availability: >
{{ states('sensor.deye_grid_power') not in
['unknown', 'unavailable', 'none', ''] }}
state: >
{% set grid = states('sensor.deye_grid_power') | float(0) %}
{# Ten wariant zakłada: import dodatni, eksport ujemny. #}
{{ [0, -grid] | max | round(0) }}
- name: "Deye — import z sieci"
unique_id: deye_import_z_sieci
unit_of_measurement: "W"
device_class: power
state_class: measurement
availability: >
{{ states('sensor.deye_grid_power') not in
['unknown', 'unavailable', 'none', ''] }}
state: >
{% set grid = states('sensor.deye_grid_power') | float(0) %}
{{ [0, grid] | max | round(0) }}
last_updated nie zawsze jest wiarygodnym znacznikiem świeżości, jeśli urządzenie przez dłuższy czas raportuje identyczną wartość.Najpierw symulacja: sprawdź decyzje bez zmiany falownika
To najbezpieczniejszy sposób rozpoczęcia. Zamiast od razu wywoływać number.set_value lub switch.turn_on, automatyzacja zapisuje w Dzienniku, co zrobiłaby w danej chwili. Przez dzień lub dwa możesz sprawdzić, czy decyzje są rozsądne.
alias: Deye — symulacja decyzji SOC
description: Nie zmienia falownika, tylko zapisuje planowaną decyzję
triggers:
- trigger: time_pattern
minutes: "/15"
conditions:
- condition: state
entity_id: input_boolean.deye_automatyka
state: "on"
actions:
- variables:
nowy_soc: "{{ states('input_number.deye_soc_normalny') | int }}"
obecny_soc: "{{ states('number.deye_minimum_soc') | int(-1) }}"
- action: logbook.log
data:
name: "Deye — symulacja"
message: >
Obecny limit: {{ obecny_soc }}%.
Ustawiłbym limit na {{ nowy_soc }}%.
mode: single
7. Scenariusz 1 — ręczna rezerwa baterii
Pierwsza automatyzacja robi tylko jedną rzecz: przenosi wartość helpera do encji minimalnego SOC. To najbezpieczniejszy test całego łańcucha zapisu.
Przygotowanie krok po kroku
alias: Deye — ustaw normalną rezerwę baterii
id: deye_ustaw_normalna_rezerwe_baterii
description: Kopiuje wartość helpera do encji minimalnego SOC po sprawdzeniu danych.
triggers:
- trigger: state
entity_id: input_number.deye_soc_normalny
for: "00:00:10"
conditions:
- condition: state
entity_id: input_boolean.deye_automatyka
state: "on"
- condition: state
entity_id: binary_sensor.deye_podstawowe_dane_dostepne
state: "on"
actions:
- variables:
nowy_soc: "{{ states('input_number.deye_soc_normalny') | int(20) }}"
obecny_soc: "{{ states('number.deye_minimum_soc') | int(-1) }}"
- condition: template
value_template: "{{ obecny_soc >= 0 and nowy_soc != obecny_soc }}"
- action: number.set_value
target:
entity_id: number.deye_minimum_soc
data:
value: "{{ nowy_soc }}"
- delay: "00:00:05"
- if:
- condition: template
value_template: >
{{ states('number.deye_minimum_soc') | int(-1) == nowy_soc }}
then:
- action: logbook.log
data:
name: Deye
message: "Potwierdzono normalną rezerwę: {{ nowy_soc }}%"
else:
- action: persistent_notification.create
data:
title: "Deye — zapis SOC niepotwierdzony"
message: >
Próbowano ustawić {{ nowy_soc }}%, ale encja pokazuje
{{ states('number.deye_minimum_soc') }}%.
mode: restart
sensor.deye_, number.deye_, switch.deye_ oraz encje sterowanych odbiorników są nazwami przykładowymi. Skopiuj własne identyfikatory z Narzędzi deweloperskich.Test
8. Scenariusz 2 — ładowanie w stałej taniej taryfie
Najbardziej przewidywalny wariant to stałe okno taryfowe. System sprawdza czas, zgodę użytkownika i SOC. Dopiero wtedy włącza Grid Charge i ustawia cel.
Przygotowanie krok po kroku
alias: Deye — nocne ładowanie w stałej taniej taryfie
id: deye_nocne_ladowanie_stala_taryfa
description: Włącza Grid Charge w ustalonym oknie do osiągnięcia celu SOC.
triggers:
- trigger: time_pattern
minutes: "/5"
- trigger: state
entity_id:
- input_boolean.deye_automatyka
- input_boolean.deye_ladowanie_sieci
- input_datetime.deye_tania_od
- input_datetime.deye_tania_do
conditions: []
actions:
- variables:
dane_ok: >
{{ is_state('binary_sensor.deye_podstawowe_dane_dostepne', 'on') }}
automatyka_on: >
{{ is_state('input_boolean.deye_automatyka', 'on') }}
zgoda_on: >
{{ is_state('input_boolean.deye_ladowanie_sieci', 'on') }}
soc: "{{ states('sensor.deye_battery_soc') | float(-1) }}"
cel_soc: 80
start: "{{ states('input_datetime.deye_tania_od')[0:5] }}"
stop: "{{ states('input_datetime.deye_tania_do')[0:5] }}"
teraz: "{{ now().strftime('%H:%M') }}"
w_oknie: >
{% if start < stop %}
{{ start <= teraz < stop }}
{% else %}
{{ teraz >= start or teraz < stop }}
{% endif %}
ma_ladowac: >
{{ dane_ok and automatyka_on and zgoda_on
and soc >= 0 and soc < cel_soc and w_oknie }}
- choose:
- conditions:
- condition: template
value_template: "{{ ma_ladowac }}"
sequence:
- if:
- condition: template
value_template: >
{{ states('number.deye_program_1_soc') | int(-1) != cel_soc }}
then:
- action: number.set_value
target:
entity_id: number.deye_program_1_soc
data:
value: "{{ cel_soc }}"
- if:
- condition: state
entity_id: switch.deye_program_1_grid_charge
state: "off"
then:
- action: switch.turn_on
target:
entity_id: switch.deye_program_1_grid_charge
default:
- if:
- condition: state
entity_id: switch.deye_program_1_grid_charge
state: "on"
then:
- action: switch.turn_off
target:
entity_id: switch.deye_program_1_grid_charge
mode: single
sensor.deye_, number.deye_, switch.deye_ oraz encje sterowanych odbiorników są nazwami przykładowymi. Skopiuj własne identyfikatory z Narzędzi deweloperskich.Kiedy ma sens
9. Scenariusz 3 — prognoza PV i dynamiczny cel SOC
Forecast.Solar może udostępnić prognozę energii na jutro. Prognoza nie jest gwarancją. Reaguj szerokimi przedziałami i miej neutralny cel, gdy sensor jest niedostępny.
Przygotowanie krok po kroku
alias: Deye — ustaw cel ładowania według prognozy PV
id: deye_cel_ladowania_prognoza_pv
description: Raz dziennie dobiera docelowy SOC na podstawie produkcji prognozowanej na jutro.
triggers:
- trigger: time
at: "21:30:00"
conditions:
- condition: state
entity_id: input_boolean.deye_automatyka
state: "on"
- condition: state
entity_id: binary_sensor.deye_podstawowe_dane_dostepne
state: "on"
actions:
- variables:
prognoza: >
{{ states('sensor.energy_production_tomorrow') | float(-1) }}
cel_soc: >
{% if prognoza < 0 %}
70
{% elif prognoza >= 20 %}
30
{% elif prognoza >= 12 %}
50
{% elif prognoza >= 6 %}
70
{% else %}
90
{% endif %}
- condition: template
value_template: >
{{ states('number.deye_program_1_soc') | int(-1) != cel_soc | int }}
- action: number.set_value
target:
entity_id: number.deye_program_1_soc
data:
value: "{{ cel_soc | int }}"
- delay: "00:00:05"
- action: logbook.log
data:
name: Deye
message: >
Prognoza PV na jutro: {{ prognoza }} kWh.
Ustawiony cel nocnego ładowania: {{ cel_soc }}%.
mode: single
sensor.deye_, number.deye_, switch.deye_ oraz encje sterowanych odbiorników są nazwami przykładowymi. Skopiuj własne identyfikatory z Narzędzi deweloperskich.Pełny przykład: nocne ładowanie do 70% przed pochmurnym dniem
Złóżmy teraz wszystkie elementy w jeden prosty projekt. Załóżmy, że jutro prognozowana produkcja jest słaba. Chcemy więc w taniej taryfie doładować baterię do 70%, ale tylko wtedy, gdy dane z Deye są aktualne.
10. Scenariusz 4 — rezerwa przed zanikiem sieci
Tryb awaryjny najpierw uruchamiaj ręcznie. Dopiero po testach można powiązać go z ostrzeżeniem pogodowym lub planowaną przerwą. Podnosi rezerwę i zezwala automatyzacji taryfowej na ładowanie.
Przygotowanie krok po kroku
alias: Deye — ręczny tryb rezerwy awaryjnej
id: deye_reczny_tryb_rezerwy_awaryjnej
description: Podnosi minimalny SOC po włączeniu helpera i przywraca wartość normalną po wyłączeniu.
triggers:
- trigger: state
entity_id: input_boolean.deye_tryb_awaryjny
to: "on"
id: alarm_on
- trigger: state
entity_id: input_boolean.deye_tryb_awaryjny
to: "off"
id: alarm_off
conditions:
- condition: state
entity_id: binary_sensor.deye_podstawowe_dane_dostepne
state: "on"
actions:
- choose:
- conditions:
- condition: trigger
id: alarm_on
- condition: state
entity_id: input_boolean.deye_automatyka
state: "on"
sequence:
- action: number.set_value
target:
entity_id: number.deye_minimum_soc
data:
value: >
{{ states('input_number.deye_soc_awaryjny') | int(60) }}
- action: input_boolean.turn_on
target:
entity_id: input_boolean.deye_ladowanie_sieci
- conditions:
- condition: trigger
id: alarm_off
sequence:
- action: number.set_value
target:
entity_id: number.deye_minimum_soc
data:
value: >
{{ states('input_number.deye_soc_normalny') | int(20) }}
- action: input_boolean.turn_off
target:
entity_id: input_boolean.deye_ladowanie_sieci
mode: restart
sensor.deye_, number.deye_, switch.deye_ oraz encje sterowanych odbiorników są nazwami przykładowymi. Skopiuj własne identyfikatory z Narzędzi deweloperskich.Testy
11. Scenariusz 5 — rzeczywista nadwyżka PV
Najczęstszy błąd to sterowanie na podstawie mocy PV. Produkcja 5 kW nie oznacza 5 kW nadwyżki, jeśli dom i bateria zużywają całość. Używaj rzeczywistego eksportu.
Przygotowanie krok po kroku
alias: Deye — bojler z rzeczywistej nadwyżki PV
id: deye_bojler_z_nadwyzki_pv
description: Włącza bojler po stabilnym eksporcie i bezpiecznie wyłącza go po zaniku nadwyżki lub danych.
triggers:
- trigger: numeric_state
entity_id: sensor.deye_eksport_do_sieci
above: input_number.deye_nadwyzka_start
for: "00:03:00"
id: start
- trigger: numeric_state
entity_id: sensor.deye_eksport_do_sieci
below: 200
for: "00:02:00"
id: stop
- trigger: state
entity_id: binary_sensor.deye_podstawowe_dane_dostepne
to: "off"
id: brak_danych
- trigger: state
entity_id: input_boolean.deye_automatyka
to: "off"
id: automatyka_off
conditions: []
actions:
- choose:
- conditions:
- condition: trigger
id: start
- condition: state
entity_id: input_boolean.deye_automatyka
state: "on"
- condition: state
entity_id: binary_sensor.deye_podstawowe_dane_dostepne
state: "on"
- condition: numeric_state
entity_id: sensor.deye_battery_soc
above: 85
- condition: state
entity_id: switch.bojler_nadwyzka
state: "off"
sequence:
- action: switch.turn_on
target:
entity_id: switch.bojler_nadwyzka
- conditions:
- condition: trigger
id:
- stop
- brak_danych
- automatyka_off
- condition: state
entity_id: switch.bojler_nadwyzka
state: "on"
sequence:
- action: switch.turn_off
target:
entity_id: switch.bojler_nadwyzka
mode: restart
sensor.deye_, number.deye_, switch.deye_ oraz encje sterowanych odbiorników są nazwami przykładowymi. Skopiuj własne identyfikatory z Narzędzi deweloperskich.Histereza
Po włączeniu odbiornika eksport spada. Identyczny próg startu i stopu powoduje taktowanie. Start powinien wymagać wyższego progu i stabilności, a wyłączenie niższego progu przez określony czas.
12. Priorytety: bateria, CWU, pompa ciepła i EV
Nie każda instalacja powinna aktywować wszystkie scenariusze jednocześnie. Ustal kolejność wykorzystania energii.
13. Ograniczanie importu i redukcja obciążeń
Home Assistant może odłączać odbiorniki niekrytyczne, lecz nie zastępuje zabezpieczeń elektrycznych ani wewnętrznego peak shaving falownika.
Przygotowanie krok po kroku
alias: Energia — redukcja obciążenia przy wysokim imporcie
id: energia_redukcja_obciazenia_wysoki_import
description: Najpierw wyłącza bojler, a potem ogranicza wallbox.
triggers:
- trigger: numeric_state
entity_id: sensor.deye_import_z_sieci
above: 7000
for: "00:00:20"
conditions:
- condition: state
entity_id: binary_sensor.deye_podstawowe_dane_dostepne
state: "on"
actions:
- if:
- condition: state
entity_id: switch.bojler_nadwyzka
state: "on"
then:
- action: switch.turn_off
target:
entity_id: switch.bojler_nadwyzka
- stop: "Wyłączono bojler — nie ograniczaj wallboxa w tym samym cyklu."
- if:
- condition: numeric_state
entity_id: number.wallbox_current
above: 6
then:
- action: number.set_value
target:
entity_id: number.wallbox_current
data:
value: 6
mode: single
sensor.deye_, number.deye_, switch.deye_ oraz encje sterowanych odbiorników są nazwami przykładowymi. Skopiuj własne identyfikatory z Narzędzi deweloperskich.14. EMHASS — poziom zaawansowany
EMHASS może uwzględniać prognozę PV, obciążenie, ceny zakupu i sprzedaży, parametry baterii oraz odbiorniki przesuwalne. Wynikiem jest plan mocy i trajektoria SOC. Nie zna jednak automatycznie sposobu sterowania każdym Deye.
15. Plan wdrożenia i testy awaryjne
Wdrażaj system etapami. Każdy etap powinien działać kilka dni przed dołożeniem następnego.
Test awaryjny
16. Mapa encji do uzupełnienia
Wypełnij mapę własnymi encjami przed kopiowaniem automatyzacji.
17. Najważniejsze zasady
Skuteczny system składa się z małych warstw: poprawnych danych, helperów, blokady zapisu, prostych decyzji i lokalnego harmonogramu.
Kontrola poprawności przykładów YAML
Wszystkie bloki zostały ponownie sprawdzone jako poprawne struktury YAML. Składnia automatyzacji odpowiada aktualnemu formatowi Home Assistant z polami triggers, conditions i actions. Nie da się jednak automatycznie potwierdzić nazw encji ani znaczenia ustawień konkretnego Deye — te zależą od Twojej integracji i modelu.
Checklista przed pierwszym prawdziwym zapisem
Profile pracy zamiast automatyzacji walczących ze sobą
Najczytelniejszy jest system profili. Automatyzacje nie ustawiają osobno przypadkowych pól, lecz wybierają profil: Lato, Zima, Tania taryfa, Rezerwa, Urlop albo Ręczny. Jeden centralny skrypt przekłada profil na konkretne ustawienia falownika.
input_select:
deye_profil:
name: "Deye — profil pracy"
options:
- Ręczny
- Lato
- Zima
- Tania taryfa
- Rezerwa
- Urlop
initial: Ręczny
input_boolean:
deye_automatyka:
name: "Deye — automatyka włączona"
deye_tryb_testowy:
name: "Deye — tylko symulacja"
Centralny skrypt zapisu z kontrolą i odczytem zwrotnym
Nazwy encji są przykładowe. Wzorzec najpierw ustawia cel SOC, później Grid Charge, czeka na odświeżenie danych i sprawdza, czy falownik zwrócił oczekiwaną wartość.
script:
deye_ustaw_okno_ladowania:
alias: "Deye — ustaw okno ładowania"
mode: queued
max: 2
fields:
cel_soc:
required: true
grid_charge:
required: true
sequence:
- condition: state
entity_id: input_boolean.deye_automatyka
state: "on"
- condition: state
entity_id: binary_sensor.deye_podstawowe_dane_dostepne
state: "on"
- variables:
wymagany_soc: "{{ cel_soc | int }}"
wymagany_grid: "{{ grid_charge | bool }}"
- choose:
- conditions: "{{ is_state('input_boolean.deye_tryb_testowy', 'on') }}"
sequence:
- action: logbook.log
data:
name: "Deye — symulacja"
message: >
Ustawiłbym SOC {{ wymagany_soc }}%,
Grid Charge {{ wymagany_grid }}.
default:
- action: number.set_value
target:
entity_id: number.deye_program_1_soc
data:
value: "{{ wymagany_soc }}"
- delay: "00:00:03"
- choose:
- conditions: "{{ wymagany_grid }}"
sequence:
- action: switch.turn_on
target:
entity_id: switch.deye_program_1_grid_charge
default:
- action: switch.turn_off
target:
entity_id: switch.deye_program_1_grid_charge
- delay: "00:00:10"
- if:
- condition: template
value_template: >
{{ states('number.deye_program_1_soc') | int(-1)
!= wymagany_soc }}
then:
- action: notify.notify
data:
title: "Deye — zapis niepotwierdzony"
message: >
Oczekiwano SOC {{ wymagany_soc }}%,
odczytano {{ states('number.deye_program_1_soc') }}%.
- stop: "Falownik nie potwierdził SOC"
Watchdog: reakcja na brak świeżych danych
Automatyzacja nie może podejmować decyzji na podstawie wartości zachowanej kilka godzin wcześniej. Watchdog zatrzymuje odbiorniki nadwyżkowe i zgłasza problem.
alias: "Deye — watchdog danych"
triggers:
- trigger: state
entity_id: binary_sensor.deye_podstawowe_dane_dostepne
to: "off"
for: "00:03:00"
actions:
- action: switch.turn_off
target:
entity_id:
- switch.bojler_nadwyzka
- switch.ladowarka_ev_nadwyzka
- action: notify.notify
data:
title: "Deye — brak świeżych danych"
message: >
Sterowanie odbiornikami zostało zatrzymane.
Sprawdź integrację, logger albo Modbus.
mode: single
Dodatkowe scenariusze warte wdrożenia
Powiadomienie bez sterowania — najlepszy pierwszy krok
Przez kilka dni Home Assistant może jedynie informować, jaką decyzję podjąłby na podstawie prognozy, ceny i SOC. Dopiero po porównaniu rekomendacji z rzeczywistą pracą domu włączamy zapis.
alias: "Deye — rekomendacja nocnego SOC"
triggers:
- trigger: time
at: "20:30:00"
actions:
- variables:
prognoza: "{{ states('sensor.energy_production_tomorrow') | float(-1) }}"
soc: "{{ states('sensor.deye_battery_soc') | float(-1) }}"
rekomendacja: >
{% if prognoza < 0 or soc < 0 %}
Brak wiarygodnych danych — profil ręczny.
{% elif prognoza >= 18 %}
Słoneczny dzień — zostaw miejsce na PV.
{% elif prognoza >= 8 %}
Umiarkowana produkcja — doładuj częściowo.
{% else %}
Słaba produkcja — rozważ wyższy nocny SOC.
{% endif %}
- action: notify.notify
data:
title: "Deye — rekomendacja"
message: "{{ rekomendacja }}"
mode: single
G12w i weekend
Godziny taniej strefy zależą od umowy. Zapisz je w helperach. Automatyzacja może wybierać profil roboczy lub weekendowy, ale nie powinna zawierać na stałe godzin przedstawionych jako uniwersalne.
Ceny dynamiczne
Lepsze od prostego progu jest wybranie określonej liczby najtańszych godzin. Trzeba uwzględnić cenę detaliczną, opłaty zmienne, sprawność cyklu, przewidywane zużycie oraz dostępną pojemność baterii.
Tryb urlopowy
Ogranicza zbędne cykle i blokuje odbiorniki nadwyżkowe. Zalecany SOC przechowywania zależy jednak od producenta baterii, więc artykuł nie narzuca jednej wartości.
Rezerwa zależna od pory dnia
Wieczorem można zachować więcej energii na noc, rano pozostawić miejsce na PV, a przed spodziewaną przerwą zasilania podnieść rezerwę ręcznym helperem.
Nadwyżka PV bez taktowania odbiorników
Rzeczywista nadwyżka nie jest równa produkcji PV. Stabilne sterowanie wymaga dwóch progów, czasu potwierdzenia, minimalnego czasu pracy i limitu importu.
alias: "Deye — bojler z nadwyżki PV"
triggers:
- trigger: numeric_state
entity_id: sensor.deye_export_power
above: 2200
for: "00:03:00"
id: start
- trigger: numeric_state
entity_id: sensor.deye_grid_import_power
above: 500
for: "00:01:00"
id: stop_import
- trigger: numeric_state
entity_id: sensor.deye_export_power
below: 500
for: "00:03:00"
id: stop_surplus
conditions:
- condition: state
entity_id: input_boolean.deye_automatyka
state: "on"
- condition: state
entity_id: binary_sensor.deye_podstawowe_dane_dostepne
state: "on"
actions:
- choose:
- conditions: "{{ trigger.id == 'start' }}"
sequence:
- condition: numeric_state
entity_id: sensor.deye_battery_soc
above: 80
- action: switch.turn_on
target:
entity_id: switch.bojler_nadwyzka
- conditions: "{{ trigger.id in ['stop_import', 'stop_surplus'] }}"
sequence:
- action: switch.turn_off
target:
entity_id: switch.bojler_nadwyzka
mode: restart
Pompa ciepła
Preferuj SG Ready, Modbus producenta, zmianę zadanej temperatury lub oficjalny tryb autokonsumpcji. Nie odcinaj sprężarki jak zwykłego gniazdka i zachowaj minimalne czasy pracy.
Samochód elektryczny
Steruj prądem ładowarki, uwzględnij minimalny prąd, liczbę faz, limit przyłącza i opóźnienie pomiędzy zmianami. Rezerwa domu powinna mieć wyższy priorytet niż EV.
Czy cykl baterii się opłaca?
Automatyzacja może być technicznie poprawna, a mimo to zwiększać koszt. Porównaj cenę ładowania z ceną unikniętego zakupu, sprawnością całego cyklu i przyjętym kosztem zużycia baterii.
Nie podajemy jednej sprawności ani kosztu cyklu. Zależą od baterii, falownika, temperatury, mocy i sposobu wyceny degradacji.
Dashboard operatora
Jedna karta powinna pokazywać stan systemu i powód decyzji automatyki.
Podstawa merytoryczna i aktualne źródła
Dokumentacja Home Assistant potwierdza wykorzystanie prognozy produkcji w automatyzacjach. Definicje projektu Deye/Sunsynk wskazują dostępne encje R/W. SolarAssistant zaleca najpierw test zmian z wyłączonym wykonywaniem zapisów, a dopiero później uruchomienie sterowania. Rozbudowane przykłady adaptacyjnego ładowania i EMHASS są wzorcami społeczności i wymagają dopasowania.
