Deye i Home Assistant: automatyzacje baterii, TOU i nadwyżki PV
Mark
Autor
Deye i Home Assistant: automatyzacje baterii, TOU i nadwyżki PV

Podoba Ci się ten artykuł?

Tworzenie poradników zajmuje dużo czasu, a na stronie nie chce reklam. Jeśli pomogłem i masz na to ochotę — postaw mi kawę . To motywuje do dalszego pisania!

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.

Najważniejsze ostrzeżenie: nazwy encji zapisu zależą od modelu Deye, profilu integracji i sposobu połączenia. Przykłady używają nazw opisowych. Podmień je na encje widoczne u Ciebie. Nie kopiuj numerów rejestrów z innej rodziny falownika.

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.

Nie twórz wielu właścicieli sterowania: wybierz jedną warstwę wykonawczą. Pozostałe systemy mogą dostarczać dane i rekomendacje, lecz nie powinny równolegle zapisywać tych samych parametrów.
Warstwa danych: Deye, licznik energii, prognoza PV, ceny i odbiorniki.
Warstwa decyzji: automatyzacje lub EMHASS obliczające profil.
Warstwa wykonawcza: jeden skrypt zapisujący ustawienia do falownika.
Warstwa nadzoru: watchdog, odczyt zwrotny, powiadomienia i wyłącznik.
15+
scenariuszy i wzorców
TOU
Time of Use
PV
prognoza i eksport

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
Jak to rozpoznać? Jeżeli przy urządzeniu Deye widzisz wyłącznie encje 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.

Prosty model: Home Assistant nie steruje stopniem mocy falownika. Zmienia ustawienia, które Deye realizuje własnym firmware, z uwzględnieniem ograniczeń BMS.
Czas programu
Początek kolejnego okresu
Błędna kolejność może zmienić aktywny przedział.
SOC
Cel ładowania lub próg ochrony
Znaczenie potwierdź na ekranie konkretnego modelu.
Power
Limit mocy okresu
Nie omija limitów BMS i instalacji.
Grid Charge
Zgoda na ładowanie z sieci
Pozostawione włączone może generować koszt.
TOU enable
Uruchamia harmonogram
Zmiana pól przy wyłączonym TOU może nic nie zrobić.

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.

Najpierw podłącz falownik: jeżeli Deye nie jest jeszcze widoczny w Home Assistant, zacznij od pierwszej części serii: Jak połączyć falownik Deye z Home Assistant — Solarman, RS485, ESPHome, MQTT i SolarAssistant. Dopiero po zakończeniu integracji wróć do automatyzacji z tego artykułu.

Cały łańcuch wygląda tak

1
Falownik Deye
W swoich rejestrach przechowuje m.in. SOC, moc PV, moc sieci, temperatury, harmonogram TOU i limity.
2
Droga komunikacji
Logger Solarman, bezpośredni RS485, bramka Ethernet, ESPHome, MQTT albo SolarAssistant odczytuje te dane.
3
Integracja HA
Tłumaczy dane z falownika na obiekty rozumiane przez Home Assistant.
4
Encje
W Home Assistant pojawiają się jako sensor, binary_sensor, switch, number, select albo time.

Dlaczego nazwy różnią się między instalacjami

  • Inna integracja może nazwać tę samą wartość inaczej, np. sensor.deye_battery_soc, sensor.sunsynk_battery_soc albo sensor.solar_assistant_battery_state_of_charge.
  • Inny profil falownika może udostępniać więcej lub mniej rejestrów.
  • Inny model Deye może mieć odmienną mapę rejestrów i inne możliwości zapisu.
  • Użytkownik może zmienić nazwę encji w Home Assistant, dlatego identyfikator nie musi odpowiadać nazwie pokazanej w dokumentacji.
  • Nie każda metoda daje zapis. Sensory odczytu mogą być dostępne, ale encje number, select lub switch odpowiedzialne za TOU mogą nie istnieć.

Jak znaleźć własne encje krok po kroku

  1. Otwórz Ustawienia → Urządzenia i usługi.
  2. Znajdź integrację, przez którą dodałeś Deye, i wybierz jej urządzenie.
  3. Otwórz listę encji. Szukaj po nazwach: battery SOC, grid power, PV power, load power, TOU, program, grid charge, minimum SOC.
  4. Kliknij encję i skopiuj jej identyfikator encji, np. sensor.deye_battery_soc. Nie kopiuj wyłącznie przyjaznej nazwy widocznej na karcie.
  5. Przejdź do Narzędzia deweloperskie → Stany, wklej identyfikator i sprawdź bieżącą wartość, jednostkę oraz atrybuty.
  6. Porównaj odczyt z ekranem falownika. Dopiero po potwierdzeniu wpisz encję do YAML z tego artykułu.
Encje przykładowe nie pojawią się po wklejeniu kodu: nazwa 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

Encje z integracji Deye
sensor..., number..., switch..., select... dotyczące falownika. Powstają po poprawnym podłączeniu Deye.
Helpery użytkownika
input_boolean..., input_number... i input_datetime.... Tworzymy je sami, aby ustawiać progi i włączać automatykę.
Sensory pomocnicze
binary_sensor.deye_dane_swieze i sensor.deye_eksport_do_sieci tworzymy w tym artykule na podstawie encji z integracji.

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.

W dalszych przykładach: encje zaczynające się od 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

  • SOC baterii zgodny z ekranem falownika.
  • Moc sieci z potwierdzonym znakiem importu i eksportu.
  • Moc PV w znanej jednostce.
  • Moc baterii z rozpoznanym kierunkiem.
  • Moc domu do kontroli obciążenia.
  • Świeżość danych albo dostępność komunikacji.

Encje sterujące

  • Włączenie TOU lub właściwego trybu pracy.
  • Grid Charge używanego programu.
  • SOC programu lub minimalny SOC.
  • Czas programu, jeżeli ma być zmieniany dynamicznie.
  • Limit mocy, gdy jest potwierdzony dla modelu.
  • Sposób powrotu do ustawień normalnych.
Brak encji R/W? Możesz nadal sterować bojlerem, pompą ciepła lub EV na podstawie danych Deye. Do sterowania baterią potrzebujesz potwierdzonej integracji i profilu zapisu.

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ę.

Gdzie wkleja się automatyzację? Najłatwiej: Ustawienia → Automatyzacje i sceny → Utwórz automatyzację → Nowa automatyzacja → trzy kropki → Edytuj w YAML. Wklejasz kod zaczynający się od alias:, bez dopisywania automation:.
  1. Najpierw odszukaj własne encje i zapisz je w tabeli z końca artykułu.
  2. Wklej kod do edytora i podmień każdą przykładową nazwę.
  3. Zapisz i użyj polecenia „Uruchom akcje” tylko wtedy, gdy rozumiesz efekt.
  4. Po teście otwórz Ślady automatyzacji. Zobaczysz, który warunek zatrzymał wykonanie.

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

  1. W Home Assistant otwórz Ustawienia → Urządzenia i usługi → Pomocnicy. Najłatwiejsza droga dla początkującego to utworzenie helperów w interfejsie, bez YAML.
  2. Jeżeli korzystasz z plików konfiguracyjnych, wklej bloki input_boolean, input_number i input_datetime do configuration.yaml albo własnego pakietu.
  3. Po zapisaniu użyj Narzędzia deweloperskie → YAML → Sprawdź konfigurację, a następnie uruchom ponownie Home Assistant.
  4. W Narzędzia deweloperskie → Stany sprawdź, czy pojawiły się wszystkie encje zaczynające się od input_....
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
Źródło wzorca: Oficjalna dokumentacja input_number Home Assistant. Dokumentacja pokazuje helper liczbowy używany jako źródło wartości i wyzwalacz automatyzacji.
Zasada: jeden przełącznik zatrzymuje automatykę Home Assistant, ale falownik pozostaje w bezpiecznym, wcześniej przetestowanym profilu lokalnym.

Najłatwiejsza droga: utwórz helpery w interfejsie

  1. Otwórz Ustawienia → Urządzenia i usługi → Pomocnicy.
  2. Kliknij Utwórz pomocnika i wybierz Przełącznik. Nazwij go „Deye — automatyka energii”.
  3. Utwórz pomocnik Liczba dla normalnej i awaryjnej rezerwy SOC. Ustaw jednostkę %, krok 5 i rozsądny zakres.
  4. Utwórz pomocniki Data i/lub czas dla początku i końca taniej taryfy.
  5. Po utworzeniu każdego helpera otwórz jego ustawienia i skopiuj identyfikator encji. To właśnie ten identyfikator wpisujesz w automatyzacji.
Dla początkującego polecam interfejs. Blok YAML z helperami pozostaje w artykule jako wariant dla osób korzystających z pakietów lub zarządzających konfiguracją w plikach.

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

  1. W słoneczny dzień, gdy dom eksportuje energię, zapisz wartość sensora mocy sieci.
  2. Włącz na chwilę duży odbiornik, aby dom zaczął pobierać energię. Zapisz drugi znak i wartość.
  3. Jeśli import jest dodatni, a eksport ujemny, użyj kodu bez zmian. Jeśli jest odwrotnie, zamień obliczenia importu i eksportu.
  4. Jeżeli integracja ma już osobne sensory importu i eksportu, korzystaj z nich zamiast tworzyć szablony.
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) }}
Źródło wzorca: Home Assistant — common template patterns. Kod wykorzystuje oficjalne zasady odczytu stanów i tworzenia bezpiecznych sensorów szablonowych.
Ważne ograniczenie sensora dostępności: ten kod potwierdza, że encja ma poprawny stan, ale nie mierzy czasu od ostatniej ramki komunikacyjnej. Gdy integracja udostępnia własny sensor „last update”, „data age” albo availability, użyj go. Samo last_updated nie zawsze jest wiarygodnym znacznikiem świeżości, jeśli urządzenie przez dłuższy czas raportuje identyczną wartość.
Sprawdź znak: w jednej integracji wartość dodatnia oznacza import, w innej eksport. Włącz duży odbiornik i porównaj sensor z ekranem falownika przed użyciem szablonu.

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
Gdzie zobaczysz wynik? Otwórz Dziennik i wyszukaj „Deye — symulacja”. Jeżeli komunikaty są zgodne z tym, czego oczekujesz, możesz przejść do wersji wykonującej prawdziwy zapis.

7. Scenariusz 1 — ręczna rezerwa baterii

Rodzaj scenariuszaZapis do falownika
Potrzebne encjeSOC baterii, encja minimalnego SOC, helper liczbowy

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

  1. Znajdź w Narzędzia deweloperskie → Stany encję typu number, która odpowiada minimalnemu SOC lub rezerwie baterii.
  2. Zmień ją ręcznie o 5 punktów i sprawdź ekran falownika. Jeśli zmiana nie wraca do HA po kilku sekundach, nie używaj automatyzacji.
  3. W kodzie podmień number.deye_minimum_soc na własną encję.
  4. Utwórz automatyzację w UI, przełącz edytor na YAML i wklej kod bez nagłówka automation:.
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
Co musisz podmienić w kodzie: wszystkie encje zaczynające się od sensor.deye_, number.deye_, switch.deye_ oraz encje sterowanych odbiorników są nazwami przykładowymi. Skopiuj własne identyfikatory z Narzędzi deweloperskich.
Źródło wzorca: Kellerza Deye/Sunsynk — definicje sensorów R/W. Projekt oznacza ustawienia dostępne do odczytu i zapisu; konkretna nazwa encji zależy od konfiguracji dodatku.

Test

  1. Wyłącz automatykę i zmień helper — falownik nie powinien się zmienić.
  2. Włącz automatykę i zmień wartość o 5 punktów.
  3. Porównaj encję, ekran Deye i aplikację producenta.
  4. Zrestartuj HA; identyczna wartość nie powinna być zapisana ponownie.
  5. Przy danych unavailable zapis musi być zablokowany.
Co powinno się wydarzyć? Po zmianie helpera encja minimalnego SOC oraz ekran falownika powinny pokazać tę samą wartość.

8. Scenariusz 2 — ładowanie w stałej taniej taryfie

Rodzaj scenariuszaZapis do falownika
Potrzebne encjeSOC, Grid Charge, SOC programu, dwa helpery czasu

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

  1. Najpierw ustaw ręcznie jeden program TOU bez Home Assistant i obserwuj, jak Deye interpretuje godzinę, SOC i Grid Charge.
  2. Znajdź encję switch odpowiedzialną za Grid Charge danego programu oraz encję number dla jego SOC.
  3. Ustaw helpery początku i końca taniej taryfy. Kod obsługuje także okno przechodzące przez północ, np. 22:00–06:00.
  4. Na pierwszy test ustaw cel SOC tylko kilka punktów powyżej aktualnego. Nie zaczynaj od ładowania do 100%.
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
Co musisz podmienić w kodzie: wszystkie encje zaczynające się od sensor.deye_, number.deye_, switch.deye_ oraz encje sterowanych odbiorników są nazwami przykładowymi. Skopiuj własne identyfikatory z Narzędzi deweloperskich.
Źródło wzorca: Deye/Sunsynk — Inverter Automation. Sekcja Time-of-Use pokazuje działające automatyzacje społeczności zmieniające tryby i parametry ładowania; kod MarkLabs dodaje kontrolę stanu i ogranicza zbędne zapisy.
Przejście przez północ: okno 23:00–06:00 wymaga innej logiki niż 10:00–14:00. Przykład obsługuje oba warianty.

Kiedy ma sens

  • różnica ceny pokrywa straty magazynowania i opłaty,
  • rano występuje wysoki pobór, a prognoza jest słaba,
  • potrzebujesz rezerwy awaryjnej,
  • producent baterii dopuszcza ładowanie z sieci.
Limit nie jest obietnicą: BMS może obniżyć prąd z powodu temperatury, napięcia ogniw lub SOC.
Co powinno się wydarzyć? W tanim oknie Grid Charge powinien się włączyć, a po osiągnięciu celu lub końcu okna wyłączyć.

9. Scenariusz 3 — prognoza PV i dynamiczny cel SOC

Rodzaj scenariuszaZapis do falownika
Potrzebne encjeprognoza PV na jutro, SOC programu

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.

≥20 kWh
Cel 30%
Dużo miejsca na PV.
12–20 kWh
Cel 50%
Częściowa rezerwa.
6–12 kWh
Cel 70%
Większy zapas.
<6 kWh
Cel 90%
Słaby dzień.
Brak danych
Cel 70%
Bezpieczny profil domyślny.

Przygotowanie krok po kroku

  1. Dodaj integrację Forecast.Solar i sprawdź faktyczną nazwę sensora prognozy na jutro.
  2. Przez co najmniej tydzień porównuj prognozę z produkcją rzeczywistą. Zapisz typowy błąd dla dni słonecznych i pochmurnych.
  3. Dostosuj progi 6, 12 i 20 kWh do pojemności magazynu oraz zużycia domu.
  4. Automatyzacja powinna tylko zmieniać cel SOC. Włączanie Grid Charge pozostaw osobnej, wcześniej przetestowanej automatyzacji taryfowej.
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
Co musisz podmienić w kodzie: wszystkie encje zaczynające się od sensor.deye_, number.deye_, switch.deye_ oraz encje sterowanych odbiorników są nazwami przykładowymi. Skopiuj własne identyfikatory z Narzędzi deweloperskich.
Źródło wzorca: Home Assistant Community — Adaptive Solar Battery Charging. Wątek opisuje działający system dla Deye, helpery, limity prądu, prognozę i wieloetapowe testowanie. Uproszczony przykład w artykule zachowuje jego główną zasadę: prognoza wyznacza cel, a nie bezpośrednio steruje każdą sekundą ładowania.
Progi są przykładowe: dobierz je do pojemności baterii i zużycia między końcem taniej taryfy a startem produkcji.
Co powinno się wydarzyć? Wieczorem automatyzacja wybiera cel SOC i zapisuje decyzję w Dzienniku.

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.

  1. Sprawdź, czy SOC w Home Assistant zgadza się z ekranem Deye.
  2. Znajdź encje Grid Charge i docelowego SOC używanego programu.
  3. Utwórz helpery początku i końca taniej taryfy.
  4. Uruchom przez jeden wieczór wersję symulacyjną i sprawdź Dziennik.
  5. Wykonaj jedną ręczną zmianę celu SOC o 5 punktów i potwierdź ją na falowniku.
  6. Dopiero wtedy uruchom właściwą automatyzację taryfową.
Pierwsza noc to test. Nie zostawiaj systemu bez nadzoru. Porównaj godzinę włączenia, prąd ładowania, SOC i moment wyłączenia z tym, co pokazuje falownik.
Po udanym teście możesz stopniowo zastąpić stały cel 70% wartością wyliczaną z prognozy PV. Nie zmieniaj jednocześnie godzin, SOC, mocy i kilku programów TOU.

10. Scenariusz 4 — rezerwa przed zanikiem sieci

Rodzaj scenariuszaZapis do falownika
Potrzebne encjeminimalny SOC, helper trybu awaryjnego

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

  1. Na początku używaj wyłącznie ręcznego helpera „tryb awaryjny”.
  2. Ustaw normalną i awaryjną rezerwę na wartości bezpieczne dla Twojej baterii.
  3. Włącz tryb i sprawdź, czy minimalny SOC wzrasta oraz czy osobna automatyzacja taryfowa otrzymuje zgodę na ładowanie.
  4. Wyłącz tryb i potwierdź powrót do wartości z helpera normalnej rezerwy. Dopiero później dodawaj pogodę lub alert operatora.
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
Co musisz podmienić w kodzie: wszystkie encje zaczynające się od sensor.deye_, number.deye_, switch.deye_ oraz encje sterowanych odbiorników są nazwami przykładowymi. Skopiuj własne identyfikatory z Narzędzi deweloperskich.
Źródło wzorca: SolarAssistant — adjusting solar settings. Dokumentacja zaleca najpierw zablokować wykonywanie zmian, przetestować publikowanie ustawień, a dopiero potem włączyć realny zapis — tę samą kolejność przyjęto tutaj.
Powrót do normalnego stanu: przywracaj wartość helpera albo zapamiętany stan, nie przypadkową stałą.

Testy

  • Aktywacja przy niskim SOC.
  • Aktywacja przy SOC wyższym od celu.
  • Wyłączenie podczas ładowania.
  • Restart HA z aktywnym helperem.
  • Brak danych w chwili zakończenia alarmu.
Co powinno się wydarzyć? Po włączeniu trybu awaryjnego rezerwa rośnie; po wyłączeniu wraca wartość normalna.

11. Scenariusz 5 — rzeczywista nadwyżka PV

Rodzaj scenariuszaTylko odczyt z Deye, sterowanie odbiornikiem
Potrzebne encjeeksport, SOC, przełącznik bojlera lub innego odbiornika

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

  1. Sprawdź moc sterowanego odbiornika. Próg startu powinien być wyższy od jego mocy z dodatkowym zapasem.
  2. Ustal minimalny SOC baterii, po którym nadwyżka może trafić do bojlera lub EV.
  3. Przez kilka dni uruchamiaj automatykę w trybie obserwacji: zamiast switch.turn_on zapisuj komunikat do Logbook.
  4. Po uruchomieniu sprawdź, czy wyłączenie głównej automatyki oraz utrata danych zawsze wyłączają odbiornik.
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
Co musisz podmienić w kodzie: wszystkie encje zaczynające się od sensor.deye_, number.deye_, switch.deye_ oraz encje sterowanych odbiorników są nazwami przykładowymi. Skopiuj własne identyfikatory z Narzędzi deweloperskich.
Źródło wzorca: Home Assistant Community — PV Solar Excess Optimizer. Społecznościowy projekt opiera sterowanie elastycznymi odbiornikami na dostępnej nadwyżce, progach i czasie stabilności. Kod w artykule jest celowo prostszym wariantem dla jednego odbiornika.

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.

Sprężarki i EV: dodaj minimalny czas pracy, minimalny postój oraz ograniczenie liczby uruchomień.
Co powinno się wydarzyć? Po stabilnym eksporcie odbiornik włącza się, a przy zaniku nadwyżki lub danych wyłącza.

12. Priorytety: bateria, CWU, pompa ciepła i EV

Nie każda instalacja powinna aktywować wszystkie scenariusze jednocześnie. Ustal kolejność wykorzystania energii.

<60% SOC
Bateria
Nie uruchamiaj dużych odbiorników z nadwyżki.
60–85%
Bateria + elastyczny odbiornik
Można wykorzystać część eksportu.
>85%
Autokonsumpcja
Bojler lub EV przejmuje większość nadwyżki.
Tryb awaryjny
Rezerwa
Odbiorniki elastyczne zablokowane.
Priorytet jest indywidualny: dom z codziennym EV może traktować samochód jako ważniejszy od pełnej baterii. Najważniejsze, by dwie automatyzacje nie walczyły o tę samą energię.

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

  1. Ustal bezpieczny próg razem z elektrykiem lub na podstawie mocy przyłączeniowej i zabezpieczeń.
  2. Utwórz kolejność odbiorników do redukcji: najpierw bojler, później wallbox, na końcu inne urządzenia.
  3. Przetestuj każdy krok osobno. Kod zatrzymuje wykonanie po wyłączeniu bojlera, aby nie redukować dwóch odbiorników naraz bez potrzeby.
  4. Zbuduj osobną automatykę przywracającą wallbox dopiero po stabilnym spadku importu.
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
Co musisz podmienić w kodzie: wszystkie encje zaczynające się od sensor.deye_, number.deye_, switch.deye_ oraz encje sterowanych odbiorników są nazwami przykładowymi. Skopiuj własne identyfikatory z Narzędzi deweloperskich.
Źródło wzorca: Kellerza Deye/Sunsynk — Load Limit automation. Dokumentacja społeczności rozdziela zachowanie dla odbiorników essential i non-essential. Przykład MarkLabs nie zastępuje Load Limit falownika, lecz redukuje zewnętrzne odbiorniki.
Próg 7000 W jest przykładem: dobierz go do liczby faz, mocy przyłączeniowej i zabezpieczeń.

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.

  • EMHASS wylicza plan.
  • Integracja Deye udostępnia encje wykonawcze.
  • Automatyzacja HA waliduje i ogranicza zapisy.
  • Falownik i BMS pozostają warstwą bezpieczeństwa.
Kiedy wdrażać EMHASS: gdy proste reguły działają już stabilnie. Optymalizacja nie naprawi złego znaku mocy ani niepewnych encji.

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.

  1. Tylko monitoring i świeżość danych.
  2. Ręczna zmiana jednej encji SOC.
  3. Stałe okno taryfowe.
  4. Cel zależny od prognozy PV.
  5. Ręczny tryb awaryjny.
  6. Sterowanie odbiornikiem z eksportu.
  7. Dynamiczne ceny lub EMHASS.

Test awaryjny

  • Wyłącz Internet, pozostawiając LAN.
  • Zrestartuj HA podczas ładowania.
  • Zatrzymaj integrację i sprawdź blokadę zapisów.
  • Przywróć integrację; stare polecenia nie powinny wykonać się hurtem.
  • Wyłącz helper automatyki; lokalny profil Deye powinien nadal działać.

16. Mapa encji do uzupełnienia

Wypełnij mapę własnymi encjami przed kopiowaniem automatyzacji.

SOC
sensor.deye_battery_soc
Twoja encja: __________
Moc sieci
sensor.deye_grid_power
Twoja encja: __________
Minimalny SOC
number.deye_minimum_soc
Twoja encja: __________
Grid Charge
switch.deye_program_1_grid_charge
Twoja encja: __________
SOC programu
number.deye_program_1_soc
Twoja encja: __________
Prognoza jutra
sensor.energy_production_tomorrow
Twoja encja: __________
Odbiornik
switch.bojler_nadwyzka
Twoja encja: __________
Dashboard techniczny: umieść na nim wszystkie encje, sensor świeżości, główny przełącznik i ostatni wpis Logbook.

17. Najważniejsze zasady

Skuteczny system składa się z małych warstw: poprawnych danych, helperów, blokady zapisu, prostych decyzji i lokalnego harmonogramu.

  • Nie steruj z samej mocy PV — używaj importu lub eksportu.
  • Nie zapisuj przy unknown, unavailable ani starych danych.
  • Nie zmieniaj sześciu programów, zanim nie potwierdzisz jednej encji.
  • Nie traktuj prognozy jako pewnika.
  • Nie traktuj HA jako zabezpieczenia elektrycznego.
  • Zachowaj ręczny wyłącznik automatyki.
  • Po zapisie wykonaj ponowny odczyt.
  • Pozostaw falownikowi i BMS ostatnie słowo.

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.

Obowiązkowy test: po podmianie encji zapisz automatyzację i otwórz jej Ślady. Następnie wykonaj jedną małą, odwracalną zmianę i porównaj wynik z ekranem falownika. Kod poprawny składniowo może sterować niewłaściwym ustawieniem, jeśli wskażesz złą encję.

Checklista przed pierwszym prawdziwym zapisem

☐ Falownik jest widoczny w Home Assistant.
☐ SOC i moc sieci zgadzają się z ekranem Deye.
☐ Znasz znak importu i eksportu.
☐ Masz potwierdzoną encję zapisu dla swojego modelu.
☐ Ręczna, niewielka i odwracalna zmiana działa.
☐ Tryb symulacji pokazywał rozsądne decyzje.
☐ Główny przełącznik zatrzymuje automatykę.

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"
Dlaczego profil pomaga: na dashboardzie od razu widać strategię, łatwiej wrócić do trybu ręcznego i prześledzić historię decyzji.

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"
Dopasuj usługi do swoich encji: inne integracje mogą używać select.select_option, time.set_value, MQTT lub własnych usług.

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
Bezpieczny stan zależy od urządzenia: bojler można zwykle wyłączyć, ale pompa ciepła lub system krytyczny mogą wymagać innej reakcji.

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.

Ujemna cena nie zawsze oznacza darmową energię: sprawdź pełny sposób rozliczenia i ograniczenie mocy przyłączeniowej.

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
Bezpieczeństwo elektryczne: Home Assistant nie zastępuje termostatu, zabezpieczenia nadtemperaturowego, stycznika ani poprawnej instalacji.

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.

koszt energii po magazynowaniu ≈ cena ładowania ÷ sprawność cyklu + koszt zużycia baterii

Nie podajemy jednej sprawności ani kosztu cyklu. Zależą od baterii, falownika, temperatury, mocy i sposobu wyceny degradacji.

Dobra praktyka: ustaw minimalną wymaganą różnicę cen i unikaj cyklu, gdy przewidywana oszczędność jest symboliczna.

Dashboard operatora

Jedna karta powinna pokazywać stan systemu i powód decyzji automatyki.

  • Automatyka i tryb testowy.
  • Aktualny profil i powód ostatniej zmiany.
  • SOC, bateria, import, eksport, PV i obciążenie.
  • Świeżość danych i ostatnia poprawna ramka.
  • Docelowy SOC, Grid Charge i aktywny okres TOU.
  • Prognoza, cena i odbiorniki nadwyżkowe.

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.

Źródła i materiały

Społeczność MarkLabs

Dyskutuj na forum

Pytania, doświadczenia i rozwiązania do tego artykułu publikujemy teraz na forum MarkLabs.

Otwórz dyskusję na forum

Wymagane jest bezpłatne konto MarkLabs. Dotychczasowe komentarze bloga nie są przenoszone.

buycoffee.to