Sterowanie grzałkami z PV (EspHome)

Cześć
Wymyśliłem sobie sterowanie grzałkami zamontowanymi w bojlerze i buforze kiedy mam nadmiar produkcji PV.
Instalacja Off-Grid
Włączanie grzałek ma być zrealizowane na podstawie odczytu z czujnika światła (BH1750) i temperatury w zbiornikach czyli żadnego grzania kiedy nie ma słońca lub temperatury są osiągnięte.
To jest pierwsza część gdyż dojdzie jeszcze opcja że grzanie ma być włączone tylko przy nadmiarze produkcji z PV czyli w sytuacji kiedy akumulator jest naładowany i odbiór jest niewielki.
Podpowiedzcie czy idę słuszną drogą:

  1. Template switch żeby w ogóle włączyć grzanie
  2. Załączenie i wyłączenie przekaźników przy dostatecznym nasłonecznieniu
  3. Priorytet grzania CWU a po osiągnięciu zadanej temperatury grzanie bufora.
  4. Automatyzacja ma być w samym esphome w razie awarii HA

Czujniki temperatur są na innym urządzeniu, dlatego odczyt wartości musi się odbyć z HA
Poniżej fragment kodu jeszcze nie sprawdzony w rzeczywistości:

sensor:
  - platform: bh1750
    name: "Nasłonecznienie"
    id: slonce
    address: 0x23
    update_interval: 1s
    on_value_range:
        - above: 50000.0
          then:
            - if:
                condition:
                  switch.is_on: grzalki
                then:
                  - if:
                      condition:
                        lambda: |-
                          return id(temp_cwu).state < 62;
                      then:
                        - switch.turn_on: grzalka_cwu_1
                      else:
                        - switch.turn_on: grzalka_bufor_1  
        - below: 40000
          then:
            - switch.turn_off: grzalka_bufor_1
            - delay: 2s
            - switch.turn_off: grzalka_cwu_1

  - platform: homeassistant
    id: temp_cwu
    entity_id: sensor.kotlownia_cwu_hi

switch:
  - platform: template
    name: Grzałki
    id: grzalki
    optimistic: true
  - platform: gpio
    name: "Grzałka CWU 1"
    id: grzalka_cwu_1
    pin:
      pcf8574: pcf_1
      number: 0
      mode:
        output: true
      inverted: true
  - platform: gpio
    name: "Grzałka Bufora 1"
    id: grzalka_bufor_1
    pin:
      pcf8574: pcf_1
      number: 2
      mode:
        output: true
      inverted: true

W kodzie nie ma jeszcze czujnika w buforze ale chodzi mi bardziej o ogólny sens takiego rozwiązania.

Sens ma ale nie wiem czy dobrze kombinujesz z tym że chcesz pominąć HA. W kodzie masz odwołanie do temp_cwu który ma być odczytywany z HA czy źle zrozumiałem? Ja bym wolał odczytywać faktyczna produkcję z licznika żeby odpalić grzałki bo nie ufał bym czujnikowi natężenia światła. Chyba żeby do ESP połączyć płytkę modbus RS485 żeby odczyt zamykał się w obrębie samego ESP.
Taka integracja dopiero przede mną więc mogę się mylić :wink:

Możesz dorzucić dodatkowe czujniki DS18B20 do ESP i będziesz miał pominięty sensor temp_cwu

Tak właśnie jest (Rs232) ale z falownika można odczytać tylko aktualnie pobieraną moc a nie moc jaką może jeszcze dostarczyć i dlatego pomysł z czujnikiem światła.
Ogólnie ma to wyglądać tak że skoro natężenie światła ok 90tys luxów może dać moc z falownika 3200W bez wspomagania akumulatorem a aktualne obciążenie wynosi 600W to pozostaje mi do dyspozycji ok 2600W i wtedy ma się włączyć grzałka

Oczywiście że mogę tylko po co skoro już są tylko na innym ESP. Próbowałem bezpośredniego odczytu po HTTP ale wyrzuca mi błąd niewystarczającej ilości pamięci (kod samego falownika sporo zabiera).

Jak dla mnie dziwne bo request http z ESPHome do ESPHome nie zajmuje “więcej” niż to samo zapytanie ESPHome do HA o ten czujnik, coś mi tu nie pasuje :thinking:.

1 polubienie

Miałem jakiś błąd w stylu za mało pamięci JSON czy coś takiego.
Tym problemem zajmę się później
Dzisiaj uruchomiłem instalację z poniższym kodem i nawet całkiem fajnie to działa ale są problemy.

  1. Automatyka nie rusza natychmiast po włączeniu switcha “Grzałki” nawet jeśli jest wystarczające nasłonecznienie. Jeśli spadnie poniżej progu załączenia i dalej rośnie to wszystko jest ok.
  2. W momencie kiedy zostanie temperatura na CWU osiągnie wartość zadaną to grzałki nie przełączają się na bufor. Pewnie ma to związek z tym, że w kodzie jest znak > a w rzeczywistości jest =
  3. Zmiana w locie temperatury zadanej daje identyczny efekt.

Może kod automatyki powinienem umieścić gdzieś indziej? Pod template switchem? Tylko jak wtedy ustawić progi?


i2c:
  sda: 23
  scl: 22
  scan: true
  id: bus_a   

pcf8574:
  - id: 'pcf_1'
    address: 0x20
    pcf8575: false

button:
  - platform: restart
    name: "Restart"

number:
  - platform: template
    name: Nastawa CWU
    icon: mdi:thermometer-lines
    unit_of_measurement: °C
    optimistic: true
    restore_value: true
    min_value: 40
    max_value: 70
    initial_value: 62
    step: 1
    id: t_cwu
  - platform: template
    name: Sun start
    optimistic: true
    restore_value: true
    min_value: 20000
    max_value: 100000
    initial_value: 30000
    step: 2000
    id: sstart
  - platform: template
    name: Sun stop
    optimistic: true
    restore_value: true
    min_value: 10000
    max_value: 50000
    initial_value: 28000
    step: 2000
    id: sstop

sensor:
  - platform: bh1750
    name: "Nasłonecznienie"
    id: slonce
    address: 0x23
    update_interval: 10s
    on_value_range:
        - above: !lambda return id(sstart).state;
          then:
            - if:
                condition:
                  switch.is_on: grzalki
                then:
                  - if:
                      condition: 
                        lambda: |-
                          return id(temp_cwu).state < id(t_cwu).state;
                      then:
                        - switch.turn_on: grzalka_cwu_1
                        - switch.turn_off: grzalka_bufor_1
                  - if:
                      condition:
                        lambda: |-
                          return id(temp_cwu).state > id(t_cwu).state;
                      then:
                        - switch.turn_off: grzalka_cwu_1
                        - switch.turn_on: grzalka_bufor_1
        - above: !lambda return (id(sstart).state + 40000);
          then:
            - if:
                condition:
                  switch.is_on: grzalki
                then:
                  - if:
                      condition:
                        lambda: |-
                          return id(temp_cwu).state < id(t_cwu).state;
                      then:
                        - switch.turn_on: grzalka_cwu_2
                        - switch.turn_off: grzalka_bufor_2
                  - if:
                      condition:
                        lambda: |-
                          return id(temp_cwu).state > id(t_cwu).state;
                      then:
                        - switch.turn_off: grzalka_cwu_2
                        - switch.turn_on: grzalka_bufor_2
        - below: !lambda return (id(sstop).state + 40000);
          then:
            - switch.turn_off: grzalka_bufor_2
            - switch.turn_off: grzalka_cwu_2
                        
        - below: !lambda return id(sstop).state;
          then:
            - switch.turn_off: grzalka_bufor_1
            - switch.turn_off: grzalka_cwu_1

  - platform: homeassistant
    id: temp_cwu
    entity_id: sensor.kotlownia_cwu_hi
 
switch:
  - platform: template
    name: Grzałki
    id: grzalki
    optimistic: true
    on_turn_off:
        then:
          - switch.turn_off: grzalka_cwu_1
          - switch.turn_off: grzalka_cwu_2
          - switch.turn_off: grzalka_bufor_1
          - switch.turn_off: grzalka_bufor_2
 
  - platform: gpio
    name: "Grzałka CWU 1"
    id: grzalka_cwu_1
    pin:
      pcf8574: pcf_1
      number: 0
      mode:
        output: true
      inverted: true
  - platform: gpio
    name: "Grzałka CWU 2"
    id: grzalka_cwu_2
    pin:
      pcf8574: pcf_1
      number: 1
      mode:
        output: true
      inverted: true

  - platform: gpio
    name: "Grzałka Bufora 1"
    id: grzalka_bufor_1
    pin:
      pcf8574: pcf_1
      number: 2
      mode:
        output: true
      inverted: true
  - platform: gpio
    name: "Grzałka Bufora 2"
    id: grzalka_bufor_2
    pin:
      pcf8574: pcf_1
      number: 3
      mode:
        output: true
      inverted: true

output:
  - platform: ac_dimmer
    id: pwm1
    min_power: 0.01
    gate_pin: GPIO26
    zero_cross_pin:
      number: GPIO25
      mode:
        input: true
      inverted: yes
fan:
  - platform: speed
    output: pwm1
    name: Sterownik grzałek
1 polubienie

@Marcin.Szczepaniak czy udało Ci się dokończyć projekt? Coś takiego szukam dla siebie.

Nie wiadomo od kogo oczekujesz odpowiedzi, jeżeli chcesz kogoś wprost wywołać zaczynasz pisać od @ a potem forum podpowiada użytkowników. Takie wywołanie powoduje także powiadomienie u danego użytkownika.

coś takiego już jest na node red np mam sterowanie grzałkkami w zależności od produkcji/przewoltowania z zabezpeiczeniem fizycznym na wypadek zagotowania wody itp

1 polubienie

@mrlordziemniak można się gdzieś zapoznać z całym projektem?

to mój zmodyfikowany projekt na podstawie tego tutaj na forum. jak chcesz to mogę podesłać flow z omówieniem

2 polubienia

Cześć
Mój projekt wielokrotnie ewoluował i nadal ewoluuje ale na chwilę obecną mam sprawdzoną i działającą wersję.
Założenia/warunki:

  1. System działający w off-gridzie pozwalający na maksymalne wykorzystanie energii słonecznej
  2. Płynna regulacja mocą 4 grzałek 1400W każda po 2szt w bojlerze 300L i buforze 1000L
  3. Zabezpieczenia przed przeciążeniem falowników, przekroczeniem temperatury, rozładowaniem magazynu energii i jeszcze kilka innych.
  4. Praca autonomiczna. HA służy w zasadzie tylko do odczytów i wprowadzania nastaw a cała automatyzacja opiera się o Esphome.
  5. System rozproszony łatwy do serwisowania/modyfikacji.
    Zanim opiszę jak to działa to kilka słów o moim systemie.
    Całość składa się z 3 stringów panel skierowanych na wschód, zachód oraz na południe. Spowodowane jest to z jednej strony ograniczonym miejscem a z drugiej chęcią wykorzystania energii słonecznej w maksymalnie długim czasie.
    Wschód 6x 540Wp połączone 3s2p do ładowarki MPPT Easun 80A.
    Południe 8x 565wp szeregowo do falownika Anenji 4kW
    Zachód 7x 540wp szeregowo do drugiego falownika Anenji 4kW
    Całość połączona z magazynem LFP 21 kWh
    W domu instalacja 1 fazowa podzielona na 2 wyspy do każdego z falowników. Dodatkowo przetwornica 24/230 3kW do zasilania 2 grzałek.
    Zapytacie po co przetwornica? Po pierwsze kupiona kiedyś za grosze, ma sinus modyfikowany więc użyteczność ograniczona, po drugie pracuje stabilnie przy pełnym obciążeniu po kilka godzin dziennie a po 3 pozwala na “wyciągnięcie” z falowników dodatkowej mocy o czym napiszę dalej. Pozostałe 2 grzałki podłączone po 1 do każdego z falowników.
    Każda z grzałek ma osobny regulator 0-10V sterowany z Esp32 który jest sercem systemu.
    Największym wyzwaniem było wykombinowanie skąd wiedzieć i jak wyciągnąć z paneli maksymalną moc. Same czujniki światła przy stringach w 3 kierunkach były trudne do ogarnięcia. Najprostszym sposobem był pomiar prądu ładowania magazynu ale co kiedy magazyn jest pełny?
    Podszedłem do problemu w następujący sposób: w idealnych (ale niemożliwych) warunkach, maksymalny prąd ładowania u mnie to 280A (2x100 z falowników i 80 z ładowarki) czyli mimo że niemożliwy do osiągnięcia to całkowicie bezpieczny dla magazynu bo składa się z 3 banków 24V 280Ah każdy, więc prąd ładowania ustawiłem w falownikach i ładowarce na max.
    Pierwszy z 2 trybów działania automatyki grzałek steruje nimi w ten sposób że mam ustawiony minimalny i masymalny prąd ładowania gdzie przekroczenie max powoduje zwiększenie mocy grzałek a poniżej min zmniejszenie mocy. Progi ustawiane są ręcznie ale bez problemu można to zautomatyzować przez odczyt SOC magazynu. Grzałki sterowane są sekwencyjnie czyli kiedy pierwsza osiągnie 100% to załącza się druga itd.
    Odrzuciłem tutaj całkowicie założenie, że grzałki mają być załączane gdy magazyn jest pełny z 2 prostych powodów: ładowanie magazynu mniejszym prądem może znacząco wydłużyć jego działanie chociażby dlatego że balansery mają więcej czasu na działanie a naładowanie całego magazynu od 70% (tyle mam minimalnie po nocy) do max prądem ok 30A nie zajmuje więcej niż 3-4 godziny za to nagrzanie 300L wody w bojlerze grzałkami 2800W już trochę czasu potrzebuje. Kolejna sprawa to skoki prądu kiedy chmurki latają po niebie też nie są zdrowe dla magazynu pomijając już zwykłe zużycie prądu w domu. Tak czy inaczej magazyn prędzej czy później się naładuje i tutaj pojawiła się zagadka jak to ugryźć.
    Kłania się tutaj drugi tryb działania regulatora który załącza się kiedy napięcie magazynu energii przekroczy 27,7V (można oczywiście to zmienić).
    W tym trybie pawie całkowicie ignorowany jest prąd płynący do lub z magazynu a sterowanie odbywa się napięciowo. Tak jak wcześniej ustawiamy zakres min i max (w moim przypadku odpowiednio 27.5 i 28.0) i reszta w zasadzie działa tak samo.
    Oba tryby mają jeszcze zabezpieczenia np. które mocno zwiększają moc grzałek po przekroczeniu 100Aczy takie które nie pozwalają na załączenie grzałek podłączonych do falowników kiedy ich obciążenie przekroczy zadane progi.
    Całość uzupełnia możliwość sterowania manualnego.
    Techniczne żeby to zrealizować musimy znać kilka wartości
    a. Napięcie i prąd magazynu (u mnie odczyt z zewnętrznego bocznika z racji ładowania z 3 źródeł 3 magazynów)
    b. Obciążenie falownika/falowników do zabezpieczeń
    Komunikacja w moim przypadku odbywa się pomiędzy urządzeniami nie przez HA a przez UDP czyli poszczególne esp komunikują się między sobą.
    AHA jeszcze słowo o przetwornicy, każdy z falowników ma określoną moc ale to jest moc obciążenia. W rzeczywistości mając odpowiednio dobraną ilość paneli można obciążyć falownik “z dwóch stron” czyli standardowo po AC i po DC właśnie przez przetwornicę. Sprawdzone w praktyce. W praktyce też wolę zostawić falowniki nie do końca obciążone po AC bo nigdy nie wiem czy moja Pani nie wpadnie na pomysł odpalenia jednocześnie piekarnika, pralki i żelazka co już niejednokrotnie się zdarzyło i spowodowało również że zdecydowałem się na 2 mniejsze falowniki i 2 obwody wyspowe.
    Mogę zamieścić tutaj swój kod ale ma on wiele zależności i może być nieczytelny dla nie znających całego systemu, dlatego napiszcie jeśli jesteście zainteresowani jakimś fragmentem i go tutaj zamieszczę z opisem.
3 polubienia