Ustatnia modyfikacja 1 stycznia 2024 przez Anita

Tak jak to było w przypadku budowy nagrzewnicy powietrza i przy tym projekcie moim podstawowym celem było wykorzystanie nadmiaru wyprodukowanej energii elektrycznej z fotowoltaiki. Obecnie do podgrzania CWU (ciepłej wody użytkowej) wykorzystywany jest piec gazowy. Zmiana ta będzie korzystna przede wszystkim w okresie letnim, kiedy ogrzewanie jest wyłączone a piec gazowy pracuje jedynie w celu ogrzania wody użytkowej. Zmiana ta pozwoli zupełnie wyłączyć piec gazowy a wodę użytkową podgrzewać za pomocą grzałki elektrycznej tak aby korzystała z energii uzyskiwanej bezpośrednio z paneli słonecznych. Aby dokonać tej zmiany wystarczyłaby zwykła grzałka wstawiona do zasobnika, problem w tym, że mój zasobnik nie posiadał takiej możliwości. Nie znalazłem też innego zasobnika, który wymiarami i sposobem podłączenia mogłby zastąpić obecny zasobnik. Można by oczywiście zastosować inny zasobnik natomiast wiązałoby się to z przeorganizowaniem urządzeń w kotłowni. Nie bez znaczenia jest też fakt, iż zakup nowego zasobnika oraz jego podłączenie i zmodernizowanie instalacji wiąże się z kosztami, które cały projekt czyniłyby praktycznie nieopłacalnym. I tu pojawiło się moje autorskie rozwiązanie aby zamiast grzałki wewnątrz zasobnika zastosować grzałkę na zewnątrz (w specjalnym wymienniku) i podłączyć ją z zasobnikiem małym zamkniętym obiegiem.

Tutaj jednak pojawił sie problem bo trudno było znaleźć tak mały i kompletny wymiennik. Dostępne są tylko “gołe” części zamienne do przepływowych podgrzewaczy natomiast wymagają one dorobienia obudowy i kilku dodatkowych elementów. Dlatego zdecydowałem się na wykorzystanie kompletnego nowego podgrzewacza przepływowego. Do mojego projektu zakupiłem podgrzewacz POW Multi 11/13,5/15 o mocy od 9kW do 15kW1 firmy Wijas, polskiego producenta tego typu urządzeń.

Instalacja hydrauliczna polegała na zmodyfikowaniu obecnego podłączenia według zademonstrowanego schematu.

Woda z zasobnika poprzez dolne ujęcie (oryginalnie spust wody) za pomocą pompy jest przepuszczana przez podgrzewacz i po ogrzaniu wraca z powrotem do zasobnika wejściem cyrkulacyjnym. Oprócz pompy zamontowałem kilka ręcznych zaworów (nie przedstawionych na schemacie), dwa przepływomierze i zawory zwrotne oraz zamontowałem dodatkowy czujnik temperatury.

Montaż wykonałem sam metodą zgrzewania (przydatna umiejętność) na bazie rur i kształtek PP.

Sterowanie odbywa się praktycznie jedynie poprzez włączenie pompy obiegu podgrzewacza. Podgrzewacz sam rozpoznaje uruchomiony obieg i utrzymuję odpowiednio nastawioną temperaturę na wyjściu, w moim przypadku jest to 50°C. W tym rozwiązaniu nie ma konieczności zajmowaniavsię sterowaniem grzałek, wbudowana elektronika podgrzewacza sama to reguluje. Obecnie ten mechanizm jest dla mnie w zupełności wystarczający, ale w przyszłości żeby mieć pełną kontrolę nad mocą grzałek i ustawianiem temperatury wykonam swój własny sterownik.

Natomiast konieczny był mechanizm do włączania i wyłączania pompy obiegowej. Jak zwykle posłużył mi do tego prosty układ na bazie ESP32 z modułem przekaźników. Oprócz podstawowej funkcji włącznika posiada również odczyt temperatury z zasobnika – do tego celu użyłem prostego cyfrowego termometru DS18B20. Dodatkowo układ odczytuje również dane z dwóch zamontowanych w instalacji przepływomierzy impulsowych.

Wykonany sterownik przejął również kontrolę nad pompą cyrkulacyjną i steruje nią w bardziej inteligentny sposób niż piec gazowy (wyłączony w okresie letnim). Oryginalnie są po prostu określone przedziały czasowe w których to cyrkulacja była załączona na stałe. Nie jest to optymalne rozwiązanie bo niepotrzebny obieg cyrkulacyjny mocno wychładza wodę w zasobniku. Dlatego zaimplementowałem własny mechanizm do załączania cyrkulacji na żądanie. Wystarczy na chwilę włączyć (puścić) ciepłą wodę tak aby przepływomierz to wykrył i załączył docelowy obieg cyrkulacji. Potem należy chwilę odczekać (około pół minuty) aby cyrkulacja doprowadziła ciepłą wodę do kranu i korzystać już z niej w pełni. Oczywiście cyrkulacja po określonym czasie automatycznie się wyłącza. I tak do następnego razu. Jeżeli dla kogoś ten mechanizm nie jest optymalny to bez problemu można zaimplementować stary wariant z przedziałami czasowymi.

Co ważne mając zasobnik wody możemy regulować kiedy i jak szybko chcemy w nim uzupełniać ciepło. Mając informacje nad całą infrastrukturą wykorzystywania energii w domu możemy to zorganizować tak, żeby odbywało się to jak najkorzystniej. Czyli włączyć tą funkcję w jak najbardziej energetycznie optymalnym momencie. W moim przypadku jest to moment, kiedy fotowoltaika wytwarza więcej energii niż jest w danej chwili wykorzystywane i nadwyżka zostaje przekazywana do sieci. I to moim zdaniem na tym właśnie polega istota instalacji “inteligentnego domu”.

Sterownik oprogramowałem znanym narzędziem do HA czyli ESPHome2.

Kod konfiguracji poniżej.

esphome:
  name: cwu
  friendly_name: cwu
  on_boot:
    priority: 500
    then:
    - pulse_meter.set_total_pulses:
        id: pulse_meter_ciepla_woda
        value: !lambda "return id(total_pulse_meter_ciepla_woda);"
    - pulse_meter.set_total_pulses:
        id: pulse_meter_woda_cyrkulacja
        value: !lambda "return id(total_pulse_meter_woda_cyrkulacja);"
#    - lambda: "id(auto_cyrkulacja).publish_state(id(g_auto_cyrkulacja))"



esp32:
  board: esp32dev
  framework:
    type: arduino
  

# Enable logging
logger:
  level: INFO

# Enable Home Assistant API
api:
  encryption:
    key: "xxx"

ota:
  password: "xxx"


wifi:
  networks:
  - ssid: !secret wifi_ssidK
    password: !secret wifi_passwordK
  - ssid: !secret wifi_ssidN
    password: !secret wifi_passwordN
  - ssid: !secret wifi_ssidA
    password: !secret wifi_passwordA

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Cwu Fallback Hotspot"
    password: "xxx"

  manual_ip:
    static_ip: 192.168.x.x
    gateway: 192.168.x.x
    subnet: 255.255.255.0  
    dns1: 192.168.x.x  
      
web_server:
  port: 80

captive_portal:

globals:
  - id: total_pulse_meter_ciepla_woda
    type: int
    restore_value: yes
  - id: total_pulse_meter_woda_cyrkulacja
    type: int
    restore_value: yes
  - id: g_auto_cyrkulacja
    type: bool
    restore_value: yes




# https://esphome.io/components/sensor/dallas.html
dallas:
  - pin: GPIO23
    update_interval: 10s


switch:
  - platform: gpio
    id: pompa_grzanie
    name: "Pompa grzenie"
    pin: GPIO16
    inverted: yes
    restore_mode: RESTORE_DEFAULT_OFF
  - platform: gpio
    id: pompa_cyrkulacja
    name: "Pompa cyrkulacja"
    pin: GPIO17
    inverted: yes
    restore_mode: RESTORE_DEFAULT_OFF
  - platform: template
    name: "Automat cyrkulacji"
    id: auto_cyrkulacja
    optimistic : true
    lambda: "return id(g_auto_cyrkulacja);"
    on_turn_on:
    - lambda: "id(g_auto_cyrkulacja) = true;"
    on_turn_off:
    - lambda: "id(g_auto_cyrkulacja) = false;"

#https://esphome.io/components/sensor/pulse_meter.html
sensor:
  # (6.6 * Q) Q = L/Min ± 3%
  - platform: pulse_meter
    pin: 13
    unit_of_measurement: 'l/min'
    name: 'Woda cyrkulacja przepływ'
    id: pulse_meter_woda_cyrkulacja
    #internal_filter: 100ms
    timeout: 1s
    accuracy_decimals: 2
    filters:
      #- multiply: 0.004
      - lambda: return (x / 400.0);  #400 = 6.6*60 -> F=(6.68Q)±5%  Q=L/min
    total:
      name: "Woda cyrkulacja licznik"
      unit_of_measurement: "m3"
      accuracy_decimals: 3
      filters:
        #- multiply: 0.004        
        #- lambda: return (x / 400000.0);
        - lambda: |-
             id(total_pulse_meter_woda_cyrkulacja) = x;
             return (x / 400000.0);
  
  - platform: dallas
    address: 0x9380000026286c28 
    name: "Temeratura w zasobniku"



  - platform: pulse_meter
    pin: 12
    unit_of_measurement: 'l/min'
    name: 'Ciepła woda przepływ'
    id: pulse_meter_ciepla_woda
    timeout: 1s
    accuracy_decimals: 2
    filters:
      #- multiply: 0.004
      - lambda: return x / 360;  #360 = 6*60 -> f=(6*Q)±3% - Q=L/Min
    on_value_range:
      - above : 0.3    
        then:
          if:
            condition:
              switch.is_on: auto_cyrkulacja
            then:
              if:
                condition:
                  not:
                    script.is_running: wlacz_cyrkulacje
                then:
                    - script.execute: wlacz_cyrkulacje
    total:
      name: "Ciepła woda licznik"
      unit_of_measurement: "m3"
      accuracy_decimals: 3
      filters:
        #- multiply: 0.004        
        #- lambda: return (x / 360000.0);
        - lambda: |-
             id(total_pulse_meter_ciepla_woda) = x;
             return (x / 360000.0);
#    on_value:
#      then:
#        if:
#          condition:
#            switch.is_on: auto_cyrkulacja
#          then:
#            if:
#              condition:
#                not:
#                  script.is_running: wlacz_cyrkulacje
#              then:
#                  - script.execute: wlacz_cyrkulacje

# https://esphome.io/components/sensor/adc.html
  # - platform: adc
  #   pin: 32
  #   id: adc_cosnienie_cepla_woda
  #   name: "Cisnienie CWU"
  #   update_interval: 1s
  #   unit_of_measurement: ''
  #   raw: true
  #   filters:
  #     #- multiply: 0.00026862 # 1.1/4095, for attenuation 0db
  #     #- multiply: 0.00036630 # 1.5/4095, for attenuation 2.5db
  #     #- multiply: 0.00053724 # 2.2/4095, for attenuation 6db
  #     - multiply: 0.00095238 # 3.9/4095, for attenuation 11db

  #   #attenuation: 11dB
  #   #filters:
  #   #  - calibrate_linear:
  #   #    - 0.0 -> 0.0
  #   #    - 40.0 -> 45.0
  #   #    - 3.11 -> 7

# https://forum.arturhome.pl/t/czujnik-ntc-10k-w-esphome/7068
# https://esphome.io/components/sensor/ntc.html
# https://community.home-assistant.io/t/measuring-vcc-and-a0-for-ntc/258541

  # - platform: ntc
  #   sensor: resistance_sensor
  #   name:  NTC Temperature
  #   calibration:
  #    b_constant: 3950
  #    reference_temperature: 25°C
  #    reference_resistance: 50kOhm  

  # -  platform:  resistance
  #    id:  resistance_sensor
  #    sensor:  source_sensor
  #    configuration:  DOWNSTREAM
  #    resistor:  22kOhm
  #    reference_voltage:  3.3V
  #    name:  Resistance Sensor
     
  # -  platform:  adc
  #    id:  source_sensor
  #    name: ADC Value
  #   # filters:
  #   #   -  offset:  -0.042
  #   #   -  multiply: 3.3
  #    pin:  33
  #    update_interval:  10s


script:
  - id: wlacz_cyrkulacje
    then:
      - logger.log: 
          format: START skrypt wlacz_cyrkulacje         
          level: INFO
      - switch.turn_on: pompa_cyrkulacja
      - delay: 50s
      - switch.turn_off: pompa_cyrkulacja     
      - delay: 10s
      - logger.log: 
          format: STOP skrypt wlacz_cyrkulacje         
          level: INFO


#                                                       +---------------+| 
#                                                       |   |  |  |  |   |
#                                              [  EN  ] |o              o| [GPIO23] [VSPI MOSI]
#           [RTC_GPIOO] [Sensor VP] [ADC1 CH0] [GPIO36] |o              o| [GPIO22] [ I2C SCL ]
#           [RTC_GPIO3] [Sensor VN] [ADC1 CH3] [GPIO39] |o ESP-WROOM-32 o| [GPIO1 ] [UART O TX]
#                       [RTC_GPIO4] [ADC1 CH6] [GPIO34] |o              o| [GPIO3 ] [UART O RX]
#                       [RTC_GPIO5] [ADC1 CH7] [GPIO35] |o              o| [GPIO21] [ 12C SDA ]
#           [RTC_GPIO9] [ TOUCH9  ] [ADC1 CH4] [GPIO32] |o              o| [GPIO19] [VSPI MISO]
#           [RTC_GPIO8] [ TOUCH8  ] [ADC1 CH5] [GPIO33] |o    PIN 30    o| [GPIO18] [VSPI CLK ] 
#            [RTC_GPIO6] [  DAC1  ] [ADC2 CH8] [GPIO25] |o              o| [GPIO5 ] [VSPI CSO ]
#            [RTC_GPI07] [  DAC2  ] [ADC2 CH9] [GPIO26] |o  DEVKIT V1   o| [GPIO17] [UART 2 TX]
#           [RTC_GPIO17] [ TOUCH7 ] [ADC2 CH7] [GPIO27] |o              o| [GPIO16] [UART 2 RX]
#[RTC_GPIO16] [HSPI CLK] [ TOUCH6 ] [ADC2 CH6] [GPIO14] |o              o| [GPIO4 ] [ADC2 CHO ] [TOUCHO] [RTC_GPIO10] 
#[RTC_GPIO15] [HSPI MISO] [TOUCHS ] [ADC2 CH5] [GPIO12] |o              o| [GPIO2 ] [ADC2 CH2 ] [TOUCH2] [RTC_GPIO12]
#[RTC_GPIO14] [HSPI MOSI] [TOUCH4 ] [ADC2 CH4] [GPIO13] |o              o| [GPIO15] [ADC2 CH3 ] [TOUCH3] [HSPI CSO] [RTC_GPIO13]
#                                              [ GND  ] |o              o| [ GND  ]
#                                              [ VIN  ] |o              o| [ 3V3  ]
#                                                       |                |
#                                                       |     |usb|      |
#       


#                                         +---------------+| 
#                                         |   |  |  |  |   |
#                                [  EN  ] |o              o| [GPIO23] dallas DS18B20 <= 4,7k => 3.3V
#                                [GPIO36] |o              o| [GPIO22] 
#                                [GPIO39] |o ESP-WROOM-32 o| [GPIO1 ] 
#                                [GPIO34] |o              o| [GPIO3 ] 
#                                [GPIO35] |o              o| [GPIO21] 
#  adc_cosnienie_cepla_woda      [GPIO32] |o              o| [GPIO19] 
#  resistance_sensor             [GPIO33] |o    PIN 30    o| [GPIO18] 
#                                [GPIO25] |o              o| [GPIO5 ] 
#                                [GPIO26] |o  DEVKIT V1   o| [GPIO17] pompa_cyrkulacja
#                                [GPIO27] |o              o| [GPIO16] pompa_grzanie
#                                [GPIO14] |o              o| [GPIO4 ] 
#  pulse_meter_ciepla_woda       [GPIO12] |o              o| [GPIO2 ]  
#  pulse_meter_woda_cyrkulacja   [GPIO13] |o              o| [GPIO15]  
#                                [ GND  ] |o              o| [ GND  ]
#                                [ VIN  ] |o              o| [ 3V3  ]
#                                         |                |
#                                         |     |usb|      |
#       

  1. http://wijas.com.pl/pow-lcd-i-lcd-multi-400v/ ↩︎
  2. https://esphome.io/ ↩︎

Dodaj komentarz