Termostat różnicowy ESPHome

@szopen …pytanie ogólne dotyczące filozofii ESPHome.
Ten projekt.yaml jest potrzebny tylko do kompilacji wsadu czy również do integracji z HA?
Chodzi o to (bo było w którymś wątku) czy posiadając uruchomiony już wcześniej device bez tego .yaml zintegrować i z nim dogadać, czy jest to nierozłączna para ESPHome<>HA ?

YAML jest kodem, na podstawie którego generowany jest typowy kod źródłowy (c++) i finalnie firmware.

Natomiast do Integracji nie potrzeba niczego - tj. zintegruje się urządzenie “wyprodukowane” nawet przez kogoś innego (byleby było skompilowane z dyrektywą api:).
Na tej samej zasadzie możesz użyć gotowe czyjeś wsady binarne, byleby się sprzęt zgadzał ze skompilowaną konfiguracją.

ALE

Nie mając kodu źródłowego, a już w szczególności właśnie źródłowego YAML’a nie jesteś w stanie wykonać aktualizacji firmware (HA się dość radykalnie zmienia, więc ESPHome musi też za tym podążać).

Po to wprowadzono możliwość wkompilowania nagłówków umożliwiających import YAMLa ze zdalnego repozytorium do IDE ESPHome podczas tzw. Adopcji urządzenia do Instalacji (jest to jeden z opcjonalnych elementów integrowania).
W takim stanie po Adopcji masz w dashboardzie ESPHome automatycznie zaimportowany taki “mini YAML” zawierający nagłówek definiujący sprzęt oraz dyrektywę include zdalnego kodu na repo (dzięki temu oryginalny autor może wprowadzać ulepszenia to urządzeń będących już w użyciu, a Ty jako użytkownik możesz wykonać tylko kompilację i Update).

Z tej ostatniej opcji korzystają takie powszechnie używane projekty jak

1 polubienie

Możesz nawet z kilku HA odpytywać to samo jedno urządzenie z ESPHome, musisz tylko znać dane dostępowe do API ESPHome. W ESPHome możesz tworzyć automatyzacje niezależne od HA, w telegraficznym skrócie ESPHome możesz traktować jako niezależny sterownik z własną logiką, taki “mini mini PLC” :wink: a nieograniczone możliwości pojawia się przy integracji/współpracy z HA, i to w obie strony.

1 polubienie

No w tym wypadku jednak nie każde, proste urządzenia tak, ale np. bramka proxy BLE (EBP) już nie.

Zainstalowałem ESPHome w dokerze, wypadałoby choć zobaczyć z czym to się je aby mieć własne zdanie.
Z tego co napisaliście to po zaprogramowaniu modułu rozumiem, że ten doker mogę wyłączyć?

Tak możesz wyłączyć, nie jest do działania potrzebny, na EspHome wchodzisz po IP jeśli taki dostęp skonfigurowałeś i widzisz co tam sobie zaprogramowałeś. Doker potrzebny jest do ewentualnych zmian jak dokładasz nowe czujniki lub coś zmieniasz i na nowo kompilujesz.

1 polubienie

Wracając do tematu, udało mi się rozwiązać problem używając switch template.

 switch:
   platform: template
   name: "Otwórz klape"
   on_turn_on:
  - switch.turn_on: relay1

  lambda: |-

  if ((id(temp_wew).state - id(temp_zew).state) > 1) {
   return true;
   } else {
   return false;
   }
 turn_on_action:
- switch.turn_on: relay1
  turn_off_action:
- switch.turn_off: relay1

W takiej postaci to działa zgodnie z oczekiwaniami.
macek - turn_ on_action z tego co rozumiem z dokumentacji to wywołane żądania przełączenia przekaźnika w tym wypadku relay1 z poziomu interfejsu HA dlatego musiałem dodać on_turn_on: aby to zagrało, bo mimo spełnienia warunku z temperaturami przekaźniki nie reagowały, dopiero po dodaniu on_turn_on:
Na tą chwilę temat uważam za rozwiązany.
Dzięki wszystkim za pomoc i sugestię.
Sorry za pisownie :smile:

1 polubienie

Masz rację, opisane jest to w dokumentacji (Switch Component — ESPHome):

P.S. Znówu wiem więcej o ESPHome :slight_smile:.

Podepnę się do tematu bo też robię nowe sterowanie w kotłowni. A właściwie to na razie próbuję pisać kod na ESP i testuję różne warianty. Założenie jest takie że cała automatyzacja ma być na ESP bez udziału HA czy Nod-Red. W HA tylko wizualizacja stanu, przełączniki i odczyt z czujników. Na razie zrobiłem sterowanie pompą solarną i pompą co. Początkowo termostat różnicowy do pompy solarnej zrobiłem inpirując się powyższym przykładem ale ostatecznie zrobiłem to inaczej. Ponieważ wyzwalaczem jest tutaj temperatura , a dokładnie różnica temperatur to zrobiłem template sensor który wylicza różnicę temperatur solarów i zasobnika CWU i automatyka sterowania pompy jest w sekcji tego sensora. Dodatkowo chciałem różne temperatury włączenia i wyłączenia pompy ustawiane osobno w zdefiniowanych zakresach. To jest zrobione jako dwa template number Histereza on i Histereza off. I tu kombinuję jak stworzyć warunek, żeby uzależnić te dwie dane od siebie, to znaczy żeby nie dało się ustawić temperatury włączenia niższej od temperatury wyłączenia i odwrotnie - temperatury wyłączenia wyższej niż temperatura włączenia oraz różnica pomiędzy nimi wynosiła minimum 1 stopień. Może ktoś bardziej doświadczony w programowaniu pomógłby taki warunek napisać. Najprościej byłoby zrobić różne zakresy temperatur żeby nie zachodziły na siebie ale wtedy ogranicza się znacznie zakres regulacji.
Sterowanie pompy co jest prostsze, bo tam jest tylko włączenie pompy powyżej ustawionej temperatury a wyłączenie poniżej tej temperatury pomniejszonej o 2 stopnie.
Dodatkowo mam zrobiony tryb manualny w którym pompy nie reagują na temperaturę i mogę je wtedy włączyć lub wyłączyć zarówno przyciskiem fizycznym jak i z HA. Do tego jakieś LED do sygnalizacji trybu pracy. Na razie wgrane do testowej płytki i po pierwszych testach wydaje się działać zgodnie z założeniami. Temperatury do testów na razie podbieram z HA, bo mam je zrobione na innym ESP. Nie mam jeszcze czujnika temperatury na kolektorach solarnych więc do testów za czujnik solarów robi czujnik pieca co. Docelowo wszystkie czujniki i całe sterowanie będą w tym nowym ESP.
Wklejam swój kod na razie mocno testowy :grinning:
Wszystkie sugestie mile widziane.

esphome:
  name: solar
  comment: sterowanie solary co i cwu
  platform: ESP8266
  board: nodemcuv2
  esp8266_restore_from_flash: true
preferences:
  flash_write_interval: 10min 

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "JNgPirktslJ/djgwkPiMh4nfd6G71TDLEYorkUz0MpA="

ota:
  password: "5468669933b1163d2f8e2d0eabb0abd4"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: 192.168.100.89
    gateway: 192.168.100.1
    subnet: 255.255.255.0
  power_save_mode: none
  output_power: 15  

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

captive_portal:

web_server:
  port: 80
    
text_sensor:
  - platform: wifi_info
    ip_address:
      name: "solar IP Address"
      id: esp_ip
    ssid:
      name: "solar WIFI SSID"
      id: esp_ssid
    mac_address:
      name: "solar MAC Address"
      id: esp_mac 

binary_sensor: 
  #przycisk manual auto solar
  - platform: gpio
    pin:
      number: GPIO13
      mode:
        input: true
        pullup: true
      inverted: true
    name: "manual solar"
    id: manual_solar
    filters:
      - delayed_on: 10ms
      - delayed_off: 10ms
    on_press:
      then:
        - switch.toggle: manual_auto_solar
  #przycisk manual auto co      
  - platform: gpio
    pin:
      number: GPIO0
      mode:
        input: true
        pullup: true
      inverted: true
    name: "manual co"
    id: manual_co
    filters:
      - delayed_on: 10ms
      - delayed_off: 10ms
    on_press:
      then:
        - if:
            condition:
              switch.is_on: manual_auto_co 
            then:
              - switch.toggle: pompa_co
    on_click:
      - min_length: 1000ms
        max_length: 20000ms
        then:
          - switch.toggle: manual_auto_co          

switch:
  - platform: gpio #przekaznik pompy solar
    pin: 2
    inverted: true
    name: pompa solar
    icon: mdi:pump
    id: solar 
    restore_mode: ALWAYS_OFF

  - platform: gpio #przekaznik pompy co
    pin: 3
    inverted: false
    name: pompa co
    icon: mdi:pump
    id: pompa_co 
    restore_mode: ALWAYS_OFF 

  - platform: template  # wirtual switch tryb manual solar
    id: manual_auto_solar
    name: tryb manual solar
    icon: mdi:gesture-tap
    optimistic: true
    on_turn_on:
      - switch.turn_on: solar
      - light.turn_on:
          id: LED_solar
          effect: flash
    on_turn_off:
      - switch.turn_off: solar  
      - light.turn_off:
          id: LED_solar
  - platform: template  # wirtual switch tryb manual co
    id: manual_auto_co
    name: tryb manual co
    icon: mdi:gesture-tap
    optimistic: true
    on_turn_on:
      - switch.turn_off: pompa_co 
      - light.turn_on:
          id: LED_co
          effect: flash
    on_turn_off:
      - switch.turn_off: pompa_co  
      - light.turn_off:
          id: LED_co       

sensor:
  - platform: homeassistant
    name: "Temperatura piec"
    entity_id: sensor.temp_piec
    icon: "mdi:water-percent"
    device_class: "temperature"
    state_class: "measurement"
    id: T1
    on_value:
      then:
        - if:
            condition:
              switch.is_off: manual_auto_co
            then:                
              - if:
                  condition:
                    lambda: |-
                      return id(T1).state > id(temperatura_co_on).state;
                  then:
                    - switch.turn_on: pompa_co
              - if:
                  condition:
                    lambda: |-
                      return id(T1).state < (id(temperatura_co_on).state-2); 
                  then:    
                    - switch.turn_off: pompa_co


  - platform: homeassistant
    name: "Temperatura CWU"
    entity_id: sensor.czujnik_cwu
    id: T2



  - platform: template
    name: "Delta T1-T2" # różnica T1 - T2
    accuracy_decimals: 2
    update_interval: 60s
    device_class: temperature
    unit_of_measurement: °C
    id: delta
    lambda: |-
      return id(T1).state - id(T2).state;
    on_value:
      then:
        - if:
            condition:
              switch.is_off: manual_auto_solar
            then:
              - if:
                  condition:
                    lambda: |-
                      return id(delta).state > id(histereza_on).state;
                  then:
                    - switch.turn_on: solar
                   
              - if:
                  condition:
                    lambda: |-
                      return id(delta).state < id(histereza_off).state;
                  then:    
                    - switch.turn_off: solar
                    
      
number:
  - platform: template #histereza załączenia pompy solar
    name: "Histereza on"
    icon: mdi:thermometer-chevron-up
    unit_of_measurement: °C
    optimistic: true
    restore_value: true
    min_value: 2
    max_value: 15
    initial_value: 5
    step: 1
    id: histereza_on
   

  - platform: template #histereza wyłączenia pompy solar
    name: "Histereza off"
    icon: mdi:thermometer-chevron-down
    unit_of_measurement: °C
    optimistic: true
    restore_value: true
    min_value: 1
    max_value: 10
    initial_value: 3
    step: 1
    id: histereza_off  

  - platform: template #temperatura włączenia pompy co
    name: Temperatura CO on
    icon: mdi:thermometer-lines
    unit_of_measurement: °C
    optimistic: true
    restore_value: true
    min_value: 30
    max_value: 50
    initial_value: 35
    step: 1
    id: temperatura_co_on

light:
  # LED stanu manual-auto solar
  - platform: monochromatic
    id: LED_solar
    output: d5_light_pwm
    effects:
      - pulse:
          name: flash
          transition_length: 0.5s
          update_interval: 0.5s
   # LED stanu manual-auto co       
  - platform: monochromatic
    id: LED_co
    output: d6_light_pwm
    effects:
      - pulse:
          name: flash
          transition_length: 0.5s
          update_interval: 0.5s        
output:
  - platform: esp8266_pwm
    id: d5_light_pwm
    pin:
      number: D5
      inverted: false  
  - platform: esp8266_pwm
    id: d6_light_pwm
    pin:
      number: D6
      inverted: false             
    

A to co widać w HA

1 polubienie

Witam Wszystkich. Dopiero zaczynam z HA i Esphome. Chciałbym na bazie esp32 zrobić sterowanie podgrzewaniem wody - HIT PIPE. moze ktos podrzucił by działający kod w yamal na termostat różnicowy. Niestety niemam wiedzy, nie jestem programistą i nie ogarnę tego tematu od zera. Dzięki

Cześć
Teraz nie mam możliwości ale jak poczekasz do jutra to podeślę Ci kod jak ja
mam zroniony termostat różnicowy.

Witam
Ja mam zrobiony termostat różnicowy na ESP32 który steruje pompą solarną. Oprócz tego steruje jeszcze 3 innymi pompami - pompą co, cwu i podłogówką. Czujniki temperatury to DS18B20. W kolektorach zostawiłem stary czujnik NTC. Oprócz pomp są jeszcze LED-y sygnalizujące stan pracy pomp i tryby pracy auto i manual i jeszcze kilka innych rzeczy. Cała logika sterowania jest w ESP. Wyświetlanie danych i ustawienia mam zrobione na dodatkowym wyświetlaczu z Raspberry który pobiera dane z HA. Od 3 miesięcy działa bardzo dobrze.
Jak chcesz mogę wrzucić kod to może coś sobie dopasujesz. Ostatecznie jest zrobiony trochę inaczej niż to co zamieszczałem wcześniej.





Karta z grafiką jeszcze nie skończona :wink:
Czujnik temperatury co aktualnie jest chwilowo odpięty dlatego nie pokazuje temperatury.

4 polubienia

Cześć,

Dzięki za odpowiedź. Super to zrobiłeś, widać że mnóstwo czasu włożyłeś w swój projekt. Bardzo chętnie skorzystam z Twojej uprzejmości i materiałów.

Mój projekt na początek zakłada sterowanie pompą obiegową solarów z wykorzystaniem ESP32 i 2 x ds18b20 ( na obecną chwilę steruję nią z wykorzystaniem zwykłego termostatu.

nie wiedziałem wcześniej że do solarów wymagane jest sterowanie termostatem różnicowym )

Tak więc poproszę o kod twojego projektu. Mam nadzieję że mój zapał wystarczy do przerobienia twojej pracy na moje potrzeby, bo niestety wiedzę mam jeszcze za małą.

jeszcze raz dzięki, jestem pod wrażeniem Twojej pracy.

Spróbuję wrzucić wieczorem, bo teraz nie mam dostępu do komputera a z telefonu nie bardzo da radę.

1 polubienie

Jeśli dopiero zaczynasz i chciałbyś na początek mniej rozbudowany termostat to można zrobić na różne sposoby. Wykorzystując binar_sensor template albo sensor_template (zakomentowany fragment kodu). Histereza ustawiona na sztywno, lub zmieniać z poziomu frontendu HA dodając number_template:
Wtedy zamiast stałej histerezy np:" >= 3" wstawiasz " >= id(histereza).state ":

number:
  - platform: template 
    name: "Histereza"
    icon: mdi:thermometer-chevron-up
    unit_of_measurement: °C
    optimistic: true
    restore_value: false
    min_value: 1
    max_value: 10
    initial_value: 5
    step: 0.5
    id: histereza         

Możesz zrobić osobną histerezę dla włączenia i wyłączenia pompy dodając kolejny number_template zmnienijąc oczywiście id.
Możesz dołożyć prosty mały wyświetlacz.

captive_portal:

i2c:
 frequency: 400kHz 

dallas:
  - pin: D3
    id: temp_1
    update_interval: 30s
  - pin: D4
    id: temp_2
    update_interval: 30s

sensor:
  - platform: wifi_signal 
    name: "WiFi Jacuzzi db"
    id: wifi_signal_db
    update_interval: 60s
    entity_category: "diagnostic"

  - platform: dallas
    address: 0x9a6077c50264ff28
    dallas_id: temp_1
    id: temp_solar
    name: "Solar"

  - platform: dallas
    address: 0x938591c50264ff28
    dallas_id: temp_2
    id: temp_jacuzzi
    name: "Jacuzzi"

  #- platform: template
   # name: "Delta" 
    #accuracy_decimals: 2
    #update_interval: 10s
    #device_class: temperature
    #unit_of_measurement: °C
    #id: delta
    #lambda: |-
     # return id(temp_solar).state - id(temp_jacuzzi).state;
    #on_value:
     # then:
      #- if:
       #   condition:
        #    lambda: |-
         #     return id(delta).state >= 3;
          #then:
          #- switch.turn_on: relay1
          #else:
           #- if:
            #  condition:
             #   lambda: |-
              #    return id(delta).state <= 1.5;
              #then:
              #- switch.turn_off: relay1

binary_sensor:
  - platform: template
    name: "Delta on"  
    lambda: |-
      if ((id(temp_solar).state - id(temp_jacuzzi).state) >= 3) {
        return true;
      } else {
        return false;
      } 
    on_press:  
       then:
        - switch.turn_on: relay1 
    
  - platform: template
    name: "Delta off"  
    lambda: |-
      if ((id(temp_solar).state - id(temp_jacuzzi).state) <= 1.5) {
        return true;
      } else {
        return false;
      }
    on_press:
      then:
        - switch.turn_off: relay1 

switch:
  - platform: gpio
    pin: D8
    restore_mode : ALWAYS_OFF
    inverted: false
    id: relay1
    name: "Pompa"
    icon: "mdi:pump"
    
display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    reset_pin: D0
    address: 0x3C
    lambda: |-
      it.print(0, 0, id(font1), "POMPA :");
      if (id(relay1).state) {
        it.printf(80, 0, id(font1), "ON"); 
        } else {
         it.printf(80, 0, id(font1), "OFF"); 
        }
      if (id(temp_solar).has_state()) {
        it.printf(0, 17, id(font2), "Solar: %.1f°C", id(temp_solar).state);
        }
      if (id(temp_jacuzzi).has_state()) {
        it.printf(0, 39, id(font2), "Jacu: %.1f°C", id(temp_jacuzzi).state);
        } 
        
font:
  - file: "fonts/arial.ttf"
    id: font1
    size: 17
  - file: "fonts/comici.ttf"
    id: font2
    size: 19          

Różnica pomiędzy sensor_template a binary_sensor_template jest taka, że we frontendzie HA dla sensor_template bedziesz widział wartość w °C ( czyli wynik odejmowania temp_1- temp_2) natomiast binar_sensor_template zwraca prawdę/fałsz czyli bedzięsz widział czy warunek z if -a został spełniony.
Powodzenia

3 polubienia

@mariohome już sporo wyjaśnił w poprzednim poście odnośnie sposobu jak można taki termostat zrobić.
Ja w swoim wykorzystuję template sensor, który jest różnicą temperatury solarów i cwu.

Jeśli faktycznie dopiero zaczynasz z ESPHome to też polecam zacząć od prostych rzeczy. Miałem wkleić cały kod do ESP ale na początek wkleję tylko część dotyczącą termostatu różnicowego - cały kod ma ponad 900 linijek :laughing: i pewnie nie będziesz wiedział co do czego.

Polecam robić to etapami, bo jak wrzucisz od razu cały kod to zapewne coś nie będzie działało albo się nie skompiluje a Ty nie będziesz wiedział dlaczego coś nie działa. Uruchom najpierw np. czujniki temperatury, potem dodaj przekaźnik a potem dodawaj automatyzację do tego.

Ja mam jeszcze zrobione 3 tryby pracy pompy:

  1. auto - pompa działa zależnie od temperatury
  2. manual - pompa jest sterowana ręcznie i nie reaguje na zmianę temperatury
  3. tryb wakacje - w tym trybie po zachodzie słońca pompa schładza CWU przez solary gdy nie ma nikogo w domu i nie ma poboru ciepłej wody a temperatura CWU jest wysoka.

Mam też osobą histerezę do włączenia i wyłączenia pompy ustawianą w HA. W ESP jest warunek, że nie można ustawić histerezy włączenia mniejszej od histerezy wyłączenia i odwrotnie- histereza wyłączenia nie może być większa od histerezy włączenia a różnica pomiędzy nimi musi wynosić co najmniej jeden stopień. Temperatura do jakiej ma schładzać w trybie wakacje również jest ustawiana.

Kod zawiera komponenty które wykorzystuje logika termostatu solary plus led trybu pracy.

Sensor temperatury solarów zakomentowałem bo jest przykładowy- ja mam czujnik NTC więc kod jest całkiem inny. Ty będziesz miał zapewne DS18B20 więc musisz sobie utworzyć analogicznie do tych podanych oczywiście z adresami swoich czujników.

esphome:

  name: kotlownia

  comment: ESP-32 sterowanie solary co i cwu

    
preferences:

  flash_write_interval: 60min        

esp32:

  board: esp32dev

  framework:

    type: arduino

# Enable logging

logger:

   level: DEBUG

# Enable Home Assistant API

api:

  encryption:

    key: "94aTXlxTwfc4L+pMBFONOwg4FdoPNQR85Og+Dzu5E6A="

ota:

  password: "172f20f73359638583b7b0d95a363039"

wifi:

  ssid: !secret wifi_ssid

  password: !secret wifi_password

  manual_ip:

    static_ip: 192.168.100.148

    gateway: 192.168.100.1

    subnet: 255.255.255.0

  # Enable fallback hotspot (captive portal) in case wifi connection fails

  ap:

    ssid: "Kotlownia Fallback Hotspot"

    password: !secret wifi_password

captive_portal:

web_server:

  port: 80  

   

text_sensor:

 

  - platform: sun

    name: Wschód słońca

    type: sunrise

  - platform: sun

    name: Zachód słońca

    type: sunset

         

sun:

  latitude: 49.888688°

  longitude: 22.280658°

switch:  

  # przekaznik pompy solar

  - platform: gpio

    pin: 4

    inverted: false

    name: pompa solar

    icon: mdi:pump

    id: pompa_solar

    restore_mode: ALWAYS_OFF  

dallas:

  - pin: GPIO13

sensor:

# temperatura bojlera góra

- platform: dallas

    address: 0xd13c3ef648f4ee28

    name: "Temperatura CWU"

    unit_of_measurement: "°C"

    device_class: "temperature"

    accuracy_decimals: 1

    id: Tcwu

    filters:

      - heartbeat: 60s  

# temperatura bojlera dół

  - platform: dallas

    address: 0x503c0bf64831f528

    name: "Temperatura CWU_2"

    unit_of_measurement: "°C"

    device_class: "temperature"

    accuracy_decimals: 1

    id: Tcwu_2

    filters:

      - heartbeat: 60s

#  # temperatura solary    

#   - platform: dallas

#     address: 0x503c0bf64831f528

#     name: "Temperatura solary"

#     unit_of_measurement: "°C"

#     device_class: "temperature"

#     accuracy_decimals: 1

#     id: Tsolar

#     filters:

#       - heartbeat: 60s      

                                          

  # różnica Tsolar - Tcwu_2

  - platform: template

    name: "Delta Tsolar-Tcwu_2"

    accuracy_decimals: 1

    update_interval: 60s

    device_class: temperature

    unit_of_measurement: °C

    filters:

      - heartbeat: 60s

    id: delta

    lambda: |-

      return id(Tsolar).state - id(Tcwu_2).state;

    on_value:

      - if: # automatyzacja pompy solar tryb auto

          condition:

            lambda: |-

              return id(tryb_solar).state == "auto";

          then:

            - if:

                condition:

                  - sun.is_above_horizon:

                then:

                  - if:

                      condition:

                        lambda: |-

                          return (id(delta).state > id(histereza_on).state && id(Tsolar).state > id(Tcwu).state);

                      then:

                        - switch.turn_on: pompa_solar          

                  - if:

                      condition:

                        lambda: |-

                          return id(delta).state < id(histereza_off).state;

                      then:    

                        - switch.turn_off: pompa_solar

         

            - if:

                condition:

                  - sun.is_below_horizon:

                then:

                  - switch.turn_off: pompa_solar                

      - if: # automatyzacja pompy solar tryb wakacje

          condition:

            lambda: |-

              return id(tryb_solar).state == "wakacje";

          then:

            - if:

                condition:

                  - sun.is_above_horizon:

                then:

                  - if:

                      condition:

                        lambda: |-

                          return id(delta).state > id(histereza_on).state;

                      then:

                        - switch.turn_on: pompa_solar          

                  - if:

                      condition:

                        lambda: |-

                          return id(delta).state < id(histereza_off).state;

                      then:    

                        - switch.turn_off: pompa_solar

                else:

                  - if:

                      condition:

                        - sun.is_below_horizon:

                      then:

                        - if:

                            condition:

                              lambda: |-

                                return id(Tcwu).state > id(temp_wakacje).state;

                            then:

                              - switch.turn_on: pompa_solar

                            else:

                              - switch.turn_off: pompa_solar    

number:

  # histereza załączenia pompy solar

  - platform: template

    name: "Histereza on solar"

    icon: mdi:thermometer-chevron-up

    unit_of_measurement: °C

    optimistic: true

    restore_value: true

    initial_value: 10

    mode: auto

    min_value: 2

    max_value: 15

    step: 1

    id: histereza_on

    on_value:

      then:

        - if:

            condition:

              lambda: |-

                return (x - id(histereza_off).state) < 1;

            then:

              - number.set:

                  id: histereza_off

                  value: !lambda |-

                    return x - 1;

  # histereza wyłączenia pompy solar

  - platform: template

    name: "Histereza off solar"

    icon: mdi:thermometer-chevron-down

    unit_of_measurement: °C

    optimistic: true

    restore_value: true

    initial_value: 5

    mode: auto

    min_value: 1

    max_value: 10

    step: 1

    id: histereza_off

    on_value:

      then:

        - if:

            condition:

              lambda: |-

                return (id(histereza_on).state - x) < 1;

            then:

              - number.set:

                  id: histereza_on

                  value: !lambda |-

                    return x + 1;  

 

   # temperatura chłodzenia w trybie wakacje

  - platform: template

    name: Temperatura chłodzenia CWU

    icon: mdi:thermometer-lines

    unit_of_measurement: °C

    optimistic: true

    mode: auto

    restore_value: true

    min_value: 40

    max_value: 60

    initial_value: 50

    step: 5

    id: temp_wakacje

light:

  # LED stanu manual-auto solar

  - platform: monochromatic

    id: LED_solar

    restore_mode: ALWAYS_OFF

    output: solar_ledc

    effects:

      - pulse:

          name: Fast Pulse

          transition_length: 0.3s

          update_interval: 0.3s

         

      - pulse:

          name: Slow Pulse

          transition_length: 1s    

          update_interval: 1s

  

output:

  - platform: ledc

    id: solar_ledc

    pin:

      number: GPIO26

      inverted: true

     

select:

     

   # tryb pompy solar                

  - platform: template

    name: tryb solar

    id: tryb_solar

    optimistic: true

    options:

      - "auto"

      - "manual"

      - "wakacje"

    initial_option: "auto"

    on_value:

      then:

        - if:

            condition:

              lambda: 'return x == "manual";'

            then:

              - light.turn_on:

                  id: LED_solar

                  effect: Fast Pulse

        - if:

            condition:

              lambda: 'return x == "wakacje";'

            then:

              - light.turn_on:

                  id: LED_solar

                  effect: Slow Pulse                

        - if:

            condition:

              lambda: 'return x == "auto";'

            then:

              - light.turn_off:

                  id: LED_solar
3 polubienia

Witam Panowie, Wielkie dzięki za wsparcie. Wykorzystałem kod @mariohome ponieważ jakoś go ogarnąłem - działa bezawaryjnie.
jak moja wiedza będzie większa to napewno skorzystam z kodu kolegi @zaktom . Narazie jestem za cienki w d…e, i nie potrafię go posklejać.
Sypie mi błędami w ESPHome. Bardzo podoba mi się tryb wakacyjny, narazie sprawdziłem ręcznie i faktycznie można w łatwy sposób wychłodzić zasobnik nie zrzucając wody do kanalizacji - nigdy wcześniej nie spotkałem się z takim rozwiązaniem. jak ogarnę co i jak to wrócę do tematu
jeszcze raz dziękuję za pomoc.

Jak będziesz miał pytania odnośnie tego co i jak jest zrobione u mnie to śmiało pisz. Postaram się wyjaśnić na miarę moich możliwości. Ja sam też troszkę czasu nad tym spędziłem, mając do dyspozycji dokumentację ESPHome i jakieś przykłady z internetu. Ale głównie to było pisanie kodu i testowanie jak to działa. Dużo się przez to nauczyłem.

Witam , planuje zmodernizować moje ogrzewanie z 2 stref do 8.
Zwykłe termostaty grzejnikowe wymienię na zawory termoelektryczne.
Termometr w każdej strefie bthome + btproxy.
Sterowniki zaworów 2 sztuki 4 kanałowe najlepiej zigbee.
Pewnie wszystkiego ( harmonogram , termostaty , sterowanie 2 pompami co , cwu i cyrkulacji ) nie uda się załatwić jednym esphome .
Chciałbym uniknąć niestandardowych dodatków które w kolejnych wydaniach HA przestaną działać , ale to co się nie uda w esphome dodam w nodered .
Proszę o sugestię odnośnie kierunku działania.
Uproszczony schemat instalacji jaką posiadam:

Cześć, przy pompie ciepła jest zasada, każdy stopień mniej, większa sprawność i mniejsze żużycie.
Twoja instalacja jest tego przeciwieństwem i jeśli coś przerabiać, to raczej sam sposób sterowania.
Temat dotyczy termostatu, więc nie będę się rowijał, zapytam tylko, po co zawory mieszajace w każdej strefie grzejników ? Zamiast tego lepiej grzać bufor według krzywej grzewczej i wpuszczać w instalację bez obniżania mieszaczami. Oczywiście do tego trzeba zmienić sposób grzania CWU , jak wężownica jest za mała, to można połączyć dwie w szereg i grzać cały zasobnik.