Termostat różnicowy ESPHome

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