Automatyzacja kotłowni na bazie ESPHome

//mod-edit: watek powstał z wydzielenia tej ciekawej dyskusji z innego wątku


W starym kotle węglowym monitorowałem w ten sposób na ESPHome zbyt wysoką temperaturę zasilania CO, działało idealnie przez dwa sezony grzewcze, potem wymienił ale piec na inne paliwo :slight_smile:. Teraz ten sam czujnik Dallas jest podłączony do THR320D, na którym ESPHome steruje pompą CWU, również zero problemów. Osobiście wszędzie używam ESPHome, kupuję gotowe urządzenia i od razu wgrywam ESPHome, jak jest “trudno” wgrać zamawiam z wgranym ESPHome albo z Tasmotą a potem przez Tasmota wgrywam ESPHome.

1 polubienie

Właśnie też mam zamiar sterować pompami CO i CWU. Musi to być jednak w miarę stabilne i bezpieczne [i tak dołożę zwykły włącznik bimetalowy]. Urządzenia sterujące nimi muszą działać “same”, bez łączenia np. z automatyzacjami HA w razie zaniku jakiejś sieci radiowej, czy samego serwera z HA. Spróbuję pokombinować z płytkami ESP. Może uda mi się je zaprogramować do włączenia przekaźnika pompy na podstawie odczytu z czujnika temperatury bez automatyzacji HA.
A THR320D, bardzo dobra podpowiedź. Dziękuję. Mam coś podobnego do sterowania grzałką w zasobniku CWU. Działa to sobie już jakiś czas. Oczywiście sterowanie przez Tuyę. Ale bez internetu sterownik, też “wie co ma robić”. I oto chodzi.

To wszystko możesz zrealizować w ESPHome, u siebie mogę wyłączyć HA “na zawsze” i to co ma działać nadal będzie działać pod kontrolą samego ESPHome :slight_smile: .

Żadnej TuYa nie mam w domu i nie będę mieć, dla mnie to “zło” :wink: .

1 polubienie

Ja mam właśnie tak zrealizowany sterownik na Esp32. Steruję 4 pompami CO, CWU, PODŁOGÓWKA I SOLARY. Czujniki temperatury Dallas
Cała automatyzacja jest w ESPHOME. HA używam tylko do wizualizacji danych. Działa bez problemu już drugi rok.
Tu jest opisany mój projekt Termostat różnicowy ESPHome - #32 przez zaktom

Pięknie to zrobiłeś. Jestem pod wrażeniem. Chętnie skorzystam [jeśli pozwolisz] z Twoich “kodów” może mi się uda. Generalnie na początek do ESP dopnę dallasa i przekaźnik sterujący pompą CO. Tam myślę, że można trochę się pouczyć na śladach w automatyzacjach z HA.

Jeżeli chodzi o automatyzacje w ESPHOME to nie będziesz miał śladów tych automatyzacji w HA, bo cała automatyzacja wykonuje się w ESP. W HA są tylko dane z czujników.
Jeżeli Ci to pomoże to zamieszczam kod ESPHOME

esphome:
  name: kotlownia
  compile_process_limit: 2
  comment: ESP-32 sterowanie solary co i cwu
  on_boot:
     then:
      #  odczyt czasu RTC przy starcie
       ds1307.read_time:
        id: ds1307_time
    # - lambda: |-
        # id(my_ota).set_auth_password("");  
preferences:
  flash_write_interval: 60min        

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:
   level: DEBUG
   baud_rate: 0


# Enable Home Assistant API
api:
  encryption:
    key: "94aTXlxTwfc4L+pMBFONOwg4FdoPNQR85Og+Dzu5E6A="

ota:
  - platform: esphome
    id: my_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:

external_components:
    - source: github://nrandell/dallasng

web_server:
  port: 80  

uart:
  tx_pin: 1
  rx_pin: 3
  baud_rate: 256000
  parity: NONE
  stop_bits: 1  

ld2410:
  # timeout: 10s
  # max_move_distance : 2.25m
  # max_still_distance: 2.25m
  # g0_move_threshold: 50
  # g0_still_threshold: 10
  # g1_move_threshold: 50
  # g1_still_threshold: 20
  # g2_move_threshold: 40
  # g2_still_threshold: 40
  # g3_move_threshold: 100
  # g3_still_threshold: 100
  # g4_move_threshold: 100
  # g4_still_threshold: 100
  # g5_move_threshold: 100
  # g5_still_threshold: 100
  # g6_move_threshold: 100
  # g6_still_threshold: 100
  # g7_move_threshold: 100
  # g7_still_threshold: 100
  # g8_move_threshold: 100
  # g8_still_threshold: 100



button:
  - platform: shutdown
    name: "kotłownia Shutdown"
  - platform: restart
    name: "kotłownia restart"  
  - platform: safe_mode
    name: "kotłownia restart  (Safe Mode)" 
  - platform: factory_reset
    name: "Restart do  ustawień fabrycznych"

  - platform: ld2410
    factory_reset:
      name: "factory reset"
    restart:
      name: "restart"
    query_params:
      name: query params       
    
text_sensor:
  - platform: wifi_info
    ip_address:
      name: "kotlownia IP Address"
      id: esp_ip
    ssid:
      name: "kotlownia WIFI SSID"
      id: esp_ssid
    mac_address:
      name: "kotlownia MAC Address"
      id: esp_mac
  - platform: sun
    name: Wschód słońca
    type: sunrise
  - platform: sun
    name: Zachód słońca
    type: sunset
  - platform: template
    name: Kotłownia Uptime
    id: uptime_human
    icon: mdi:clock-start         
i2c:
  sda: 21
  scl: 22
  scan: true
  id: bus_a  
  
time:
  - platform: ds1307
    id: ds1307_time
    update_interval: never
    on_time:
      - seconds: 0
        minutes: 0
        hours: 21
        days_of_week: SUN
        then:
          - switch.turn_on: pompa_co
          - switch.turn_on: pompa_cwu
          - switch.turn_on: pompa_solar
          - switch.turn_on: pompa_podl
          - delay: 60s
          - switch.turn_off: pompa_co
          - switch.turn_off: pompa_cwu
          - switch.turn_off: pompa_solar
          - switch.turn_off: pompa_podl
    


# synchronizcja czasu RTC
  - platform: homeassistant
    on_time_sync:
      then:
        ds1307.write_time:
          id: ds1307_time  


sun:
  latitude: 49.494949°
  longitude: 22.222222°

switch:
  # przekaznik pompy co
  - platform: gpio 
    pin: 16
    inverted: false
    name: pompa co
    icon: mdi:pump
    id: pompa_co 
    restore_mode: ALWAYS_OFF 
     
  # przekaznik pompy solar
  - platform: gpio 
    pin: 4
    inverted: false
    name: pompa solar
    icon: mdi:pump
    id: pompa_solar 
    restore_mode: ALWAYS_OFF  

  # przekaznik pompy cwu
  - platform: gpio 
    pin: 17
    inverted: false
    name: pompa cwu
    icon: mdi:pump
    id: pompa_cwu
    restore_mode: ALWAYS_OFF 

  # przekaznik pompy podłogówki
  - platform: gpio 
    pin: 2
    inverted: false
    name: pompa podl
    icon: mdi:pump
    id: pompa_podl 
    restore_mode: ALWAYS_OFF 
  # switch buzzer
  - platform: gpio 
    pin: 12
    inverted: false
    name: buzzer
    icon: mdi:pump
    id: buzzer
    restore_mode: ALWAYS_OFF 
  # switch fan
  - platform: gpio 
    pin: 23
    inverted: false
    name: fan
    icon: mdi:pump
    id: fan
    restore_mode: ALWAYS_OFF      

dallasng:
  - pin: GPIO13

sensor:
  - platform: wifi_signal
    name: Kotlownia WiFi Signal 
    update_interval: 300s 

  
  # - platform: ld2410
  #   moving_distance:
  #     name : Moving Distance
  #   still_distance:
  #     name: Still Distance
  #   moving_energy:
  #     name: Move Energy
  #   still_energy:
  #     name: Still Energy
  #   detection_distance:
  #     name: Detection Distance  
 

  - platform: adc
    id: cisnienie_solar
    pin: 32
    attenuation: auto
    name: ciśnienie solary
    unit_of_measurement: "bar"
    device_class: "pressure"
    accuracy_decimals: 2
    filters:
      - calibrate_linear:
          - 0.45 -> 0.0
          - 1.9 -> 1.75
          - 2.25 -> 2
          - 2.63 -> 2.5
          - 3 -> 3
          - 3.16 -> 3.15
      - lambda: if (x > 0.45) return x; else return {};

             
  - platform: adc
    id: source_sensor
    pin: 36
    attenuation: auto
      
  - platform: resistance 
    id: resistance_sensor
    sensor: source_sensor
    configuration: DOWNSTREAM
    resistor: 5.6kOhm
    reference_voltage: 3.3V

  - platform: ntc
    sensor: resistance_sensor
    calibration:
      b_constant: 3390
      reference_temperature: 25°C
      reference_resistance: 10kOhm
    name: Temperatura solar
    id: Tsolar 
    filters:
      # - lambda: return x - 3.0;
      - heartbeat: 60s 
   
  - platform: dallasng
    address: 0x8d3c89f648a4c028
    name: "Temperatura LCD"
    unit_of_measurement: "°C"
    device_class: "temperature"
    accuracy_decimals: 1
    id: temp_LCD
    filters:
      - heartbeat: 60s
      
    on_value:
      - if:
          condition:
            sensor.in_range:
              id: temp_LCD
              above: 55.0
          then:
            - switch.turn_on: fan 
          else:
            - switch.turn_off: fan         


  - platform: dallasng
    address: 0x053cfdf64892b728
    name: "Temperatura podłogówka" 
    unit_of_measurement: "°C"
    device_class: "temperature"
    accuracy_decimals: 1
    id: Tpodlogowka
    filters:
      - heartbeat: 60s
      # - filter_out: nan

# temperatura bojlera dół
  - platform: dallasng
    address: 0x503c0bf64831f528
    name: "Temperatura CWU_2" 
    unit_of_measurement: "°C"
    device_class: "temperature"
    accuracy_decimals: 1
    id: Tcwu_2
    filters:
      - heartbeat: 60s
      # - filter_out: nan   
      
# temperatura bojlera góra
  - platform: dallasng
    address: 0xd13c3ef648f4ee28
    name: "Temperatura CWU"
    unit_of_measurement: "°C"
    device_class: "temperature"
    accuracy_decimals: 1
    id: Tcwu 
    filters:
      - heartbeat: 60s 
      # - filter_out: nan 

  - platform: dallasng
    address: 0xdd3c1bf64878cc28
    name: "Temperatura piec"
    unit_of_measurement: "°C"
    icon: "mdi:water-percent"
    device_class: "temperature"
    accuracy_decimals: 1
    id: Tpiec
    filters:
      - heartbeat: 60s
      # - filter_out: nan
    on_value:         
      - if: # automatyzacja pompy co tryb priorytet cwu
          condition:
            lambda: |-
              return id(tryb_co).state == "priorytet cwu";
          then:
            - if:
                condition:                
                  lambda: |- 
                    return ( x > 45 && x < 70 && id(Tcwu).state < id(temperatura_cwu).state);  
                then:    
                  - switch.turn_off: pompa_co  
                else:                                       
                  - if:
                      condition:                
                        lambda: |- 
                          return x > id(temperatura_co_on).state;
                      then:                            
                        - switch.turn_on: pompa_co  
        
            - if:
                condition:
                  lambda: |-
                    return x < (id(temperatura_co_on).state - 1); 
                then:    
                  - switch.turn_off: pompa_co                            
            
      - if: # automatyzacja pompy co tryb auto
          condition:
            lambda: |-
              return id(tryb_co).state == "auto";
          then:               
            - if:
                condition:
                  lambda: |-
                    return id(Tpiec).state > id(temperatura_co_on).state;
                then:
                  - switch.turn_on: pompa_co
                  
            - if:
                condition:
                  lambda: |-
                    return id(Tpiec).state < (id(temperatura_co_on).state-1); 
                then:    
                  - switch.turn_off: pompa_co 
      # - if: #tryb manual 
      #     condition: 
      #       lambda: |-
      #         return id(tryb_co).state == "manual";   
      #     then:
      #       - if:
      #           condition:
      #             sensor.in_range:
      #               id: Tpiec
      #               above: 80.0
      #           then:
      #             - switch.turn_on: pompa_co    

      - if: # automatyzacja pompy podl tryb auto
          condition:
            lambda: |-
              return id(tryb_podl).state == "auto";
          then:               
            - if:
                condition:
                  lambda: |-
                    return id(Tpiec).state > id(temperatura_podl_on).state;
                then:
                  - switch.turn_on: pompa_podl
                  
            - if:
                condition:
                  lambda: |-
                    return id(Tpiec).state < (id(temperatura_podl_on).state-1); 
                then:    
                  - switch.turn_off: pompa_podl
      - if: # automatyzacja pompy cwu tryb auto
          condition:
            lambda: |-
              return id(tryb_cwu).state == "auto";
          then:               
            - if:
                condition:
                  lambda: |-
                    return (id(Tpiec).state > id(temperatura_cwu_on).state && id(Tpiec).state > id(Tcwu).state+2);
                then:
                  - switch.turn_on: pompa_cwu
                else:   
                  # - if:
                  #     condition:
                  #       lambda: |-
                  #         return id(Tpiec).state < (id(temperatura_cwu_on).state-1); 
                  #     then:
                  - switch.turn_off: pompa_cwu  
       
                                 
  # 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
      # - filter_out: nan
    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 && 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 
                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    





  - platform: uptime
    id: uptime_sensor
    internal: True
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: uptime_human
            state: !lambda |-
              int seconds = round(id(uptime_sensor).raw_state);
              int days = seconds / (24 * 3600);
              seconds = seconds % (24 * 3600);
              int hours = seconds / 3600;
              seconds = seconds % 3600;
              int minutes = seconds /  60;
              seconds = seconds % 60;
              return (
                (days ? to_string(days) + "d " : "") +
                (hours ? to_string(hours) + "h " : "") +
                (minutes ? to_string(minutes) + "m " : "") +
                (to_string(seconds) + "s")
              ).c_str();             
                                    

binary_sensor:
  
  - platform: status
    name: "Kotlownia Status"
    id: esp32_status 

  - platform: ld2410
    has_target:
      name: Presence
    has_moving_target:
      name: Moving Target
    has_still_target:
      name: Still Target  
  #przycisk manual auto solar
  - platform: gpio
    pin:
      number: GPIO35
      inverted: true
      mode:
        input: true    
    name: "przycisk solar"
    id: przycisk_solar
    filters:
      - delayed_on: 10ms
      - delayed_off: 10ms
    on_press:
        then:
          - if:
              condition:
                lambda: |-
                  return id(tryb_solar).state == "manual";
              then:
                - switch.toggle: pompa_solar              
    on_click:
      - min_length: 1000ms
        max_length: 20000ms
        then:
          - select.next: tryb_solar  
  #przycisk manual auto co      
  - platform: gpio
    pin:
      number: GPIO39
      mode:
        input: true
      inverted: true
    name: "przycisk co"
    id: przycisk_co
    filters:
      - delayed_on: 10ms
      - delayed_off: 10ms
    on_press:
      then:
        - if:
            condition:
              lambda: |-
                return id(tryb_co).state == "manual";
            then:
              - switch.toggle: pompa_co              
    on_click:
      - min_length: 1000ms
        max_length: 20000ms
        then:
          - select.next: tryb_co         
               
   #przycisk manual auto cwu      
  - platform: gpio
    pin:
      number: GPIO34
      mode:
        input: true
      inverted: true
    name: "przycisk cwu"
    id: przycisk_cwu
    filters:
      - delayed_on: 10ms
      - delayed_off: 10ms
    on_press:
      then:
        - if:
            condition:
              lambda: |-
                return id(tryb_cwu).state == "manual";
            then:
              - switch.toggle: pompa_cwu              
    on_click:
      - min_length: 1000ms
        max_length: 20000ms
        then:
          - select.next: tryb_cwu 

   #przycisk manual auto podłogówka      
  - platform: gpio
    pin:
      number: GPIO19
      mode:
        input: true
        pullup: true
      inverted: true
    name: "przycisk podl"
    id: przycisk_podl
    filters:
      - delayed_on: 10ms
      - delayed_off: 10ms
    on_press:
      then:    
        - if:
            condition:
              lambda: |-
                return id(tryb_podl).state == "manual";
            then:
              - switch.toggle: pompa_podl             
    on_click:
      - min_length: 1000ms
        max_length: 20000ms
        then:
          - select.next: tryb_podl 

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 włączenia pompy co
  - platform: template 
    name: Temperatura CO on
    icon: mdi:thermometer-lines
    unit_of_measurement: °C
    optimistic: true
    mode: auto
    restore_value: true
    min_value: 25
    max_value: 42
    initial_value: 35
    step: 1
    id: temperatura_co_on
  # temperatura włączenia pompy cwu
  - platform: template 
    name: Temperatura CWU on
    icon: mdi:thermometer-lines
    unit_of_measurement: °C
    optimistic: true
    mode: auto
    restore_value: true
    min_value: 30
    max_value: 40
    initial_value: 33
    step: 1
    id: temperatura_cwu_on 
  # temperatura włączenia pompy podl
  - platform: template 
    name: Temperatura PODL on
    icon: mdi:thermometer-lines
    unit_of_measurement: °C
    optimistic: true
    mode: auto
    restore_value: true
    min_value: 28
    max_value: 40
    initial_value: 32
    step: 1
    id: temperatura_podl_on  

  # temperatura zadana cwu
  - platform: template 
    name: Temperatura zadana CWU
    icon: mdi:thermometer-lines
    unit_of_measurement: °C
    optimistic: true
    mode: auto
    restore_value: true
    min_value: 32
    max_value: 48
    initial_value: 35
    step: 1
    id: temperatura_cwu
   # 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 


  - platform: ld2410
    timeout:
      name: timeout
    light_threshold:
      name: light threshold
    max_move_distance_gate:
      name: max move distance gate
    max_still_distance_gate:
      name: max still distance gate
    g0:
      move_threshold:
        name: g0 move threshold
      still_threshold:
        name: g0 still threshold
    g1:
      move_threshold:
        name: g1 move threshold
      still_threshold:
        name: g1 still threshold
    g2:
      move_threshold:
        name: g2 move threshold
      still_threshold:
        name: g2 still threshold
    g3:
      move_threshold:
        name: g3 move threshold
      still_threshold:
        name: g3 still threshold
    g4:
      move_threshold:
        name: g4 move threshold
      still_threshold:
        name: g4 still threshold
    g5:
      move_threshold:
        name: g5 move threshold
      still_threshold:
        name: g5 still threshold
    g6:
      move_threshold:
        name: g6 move threshold
      still_threshold:
        name: g6 still threshold
    g7:
      move_threshold:
        name: g7 move threshold
      still_threshold:
        name: g7 still threshold
    g8:
      move_threshold:
        name: g8 move threshold
      still_threshold:
        name: g8 still threshold  


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
  # LED stanu manual-auto co       
  - platform: monochromatic
    id: LED_co
    restore_mode: ALWAYS_OFF
    output: co_ledc
    effects:
      - pulse:
          name: Fast Pulse
          transition_length: 0.3s
          update_interval: 0.3s
          
      - pulse:
          name: Slow Pulse
          transition_length: 1s    
          update_interval: 1s
  # LED stanu manual-auto cwu
  - platform: monochromatic
    id: LED_cwu
    restore_mode: ALWAYS_OFF
    output: cwu_ledc
    effects:
      - pulse:
          name: flash
          transition_length: 0.3s
          update_interval: 0.3s        
   # LED stanu manual-auto podl
  - platform: monochromatic
    id: LED_podl
    restore_mode: ALWAYS_OFF
    output: podl_ledc
    effects:
      - pulse:
          name: flash
          transition_length: 0.3s
          update_interval: 0.3s   
output:
  - platform: ledc
    id: solar_ledc
    pin:
      number: GPIO26
      inverted: true 
  - platform: ledc
    id: co_ledc
    pin:
      number: GPIO33
      inverted: true
  - platform: ledc
    id: cwu_ledc
    pin:
      number: GPIO25
      inverted: true 
  - platform: ledc
    id: podl_ledc
    pin:
      number: GPIO27
      inverted: true     

select:
  # tryb pompy co
  - platform: template
    name: tryb co
    id: tryb_co
    optimistic: true
    options:
      - "auto"
      - "manual"
      - "priorytet cwu"
    initial_option: "auto"
    on_value:
      then:
        - if:
            condition:
              lambda: 'return x == "manual";'
            then:
              - light.turn_on: 
                  id: LED_co
                  effect: Fast Pulse
        - if:
            condition:
              lambda: 'return x == "priorytet cwu";'
            then:
              - light.turn_on: 
                  id: LED_co
                  effect: Slow Pulse
        
        - if:
            condition:
              lambda: 'return x == "auto";'
            then:
              - light.turn_off: 
                  id: LED_co

   # 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 

   # tryb pompy cwu               
  - platform: template
    name: tryb cwu
    id: tryb_cwu
    optimistic: true
    options:
      - "auto"
      - "manual"
    initial_option: "auto"
    on_value:
      then:
        - if:
            condition:
              lambda: 'return x == "manual";'
            then:
              - light.turn_on: 
                  id: LED_cwu
                  effect: flash       
        - if:
            condition:
              lambda: 'return x == "auto";'
            then:
              - light.turn_off: 
                  id: LED_cwu   

   # tryb pompy podl               
  - platform: template
    name: tryb podl
    id: tryb_podl
    optimistic: true
    options:
      - "auto"
      - "manual"
    initial_option: "auto"
    on_value:
      then:
        - if:
            condition:
              lambda: 'return x == "manual";'
            then:
              - light.turn_on: 
                  id: LED_podl
                  effect: flash       
        - if:
            condition:
              lambda: 'return x == "auto";'
            then:
              - light.turn_off: 
                  id: LED_podl  


Całość jest dość obszerna ale możesz sobie zobaczyć jak mniej więcej to wygląda.
Na początek jeżeli chcesz podłączyć jeden czujnik temperatury i jeden przekaźnik do pompy to skup się na tych wpisach

switch:
  # przekaznik pompy co
  - platform: gpio 
    pin: 16
    inverted: false
    name: pompa co
    icon: mdi:pump
    id: pompa_co 
    restore_mode: ALWAYS_OFF 
- platform: dallasng
    address: 0xdd3c1bf64878cc28
    name: "Temperatura piec"
    unit_of_measurement: "°C"
    icon: "mdi:water-percent"
    device_class: "temperature"
    accuracy_decimals: 1
    id: Tpiec
    filters:
      - heartbeat: 60s
      # - filter_out: nan
    on_value:         
      - if: # automatyzacja pompy co tryb priorytet cwu
          condition:
            lambda: |-
              return id(tryb_co).state == "priorytet cwu";
          then:
            - if:
                condition:                
                  lambda: |- 
                    return ( x > 45 && x < 70 && id(Tcwu).state < id(temperatura_cwu).state);  
                then:    
                  - switch.turn_off: pompa_co  
                else:                                       
                  - if:
                      condition:                
                        lambda: |- 
                          return x > id(temperatura_co_on).state;
                      then:                            
                        - switch.turn_on: pompa_co  
        
            - if:
                condition:
                  lambda: |-
                    return x < (id(temperatura_co_on).state - 1); 
                then:    
                  - switch.turn_off: pompa_co                            
            
      - if: # automatyzacja pompy co tryb auto
          condition:
            lambda: |-
              return id(tryb_co).state == "auto";
          then:               
            - if:
                condition:
                  lambda: |-
                    return id(Tpiec).state > id(temperatura_co_on).state;
                then:
                  - switch.turn_on: pompa_co
                  
            - if:
                condition:
                  lambda: |-
                    return id(Tpiec).state < (id(temperatura_co_on).state-1); 
                then:    
                  - switch.turn_off: pompa_co 
      # - if: #tryb manual 
      #     condition: 
      #       lambda: |-
      #         return id(tryb_co).state == "manual";   
      #     then:
      #       - if:
      #           condition:
      #             sensor.in_range:
      #               id: Tpiec
      #               above: 80.0
      #           then:
      #             - switch.turn_on: pompa_co    

Ja mam zrobione jeszcze różne tryby pracy pompy: manual, auto, priorytet CWU oraz ustawienie temperatury przy której ma się załączyć pompa.

3 polubienia

Tak mi się w oczy rzuciło wykorzystanie niestandardowego komponentu do obsługi DS18x20

external_components:
    - source: github://nrandell/dallasng
[…]
  - platform: dallasng

Czy miałeś problemy z nową platformą one_wire (już po jej poprawieniu)?

W standardowej platformie co jakiś czas któryś z czujników miał wartość nieznany. Początkowo myślałem że to problem zakłóceń na magistrali one_wire. Próbowałem ekranować ale niewiele to zmieniło.Po wykorzystaniu tego niestandardowego komponentu dallasng problem zniknął i jak dotąd nie mam żadnych problemów z tym komponentem .
PS. Szczerze mówiąc nie sprawdzałem już potem po poprawie tej platformy Dallas jak to działa. Może z ciekawości sprawdzę.

1 polubienie

Podzielę się swoimi projektami Automatyzacji kotłowni.
1 Solar CWU
Projekt ten powstał w celu wspomagania pracy ciśnieniowego kolektora słonecznego instalacją fotowoltaiczną.

captive_portal:

switch:
  - platform: gpio
    pin: D6
    name: "SolarPV"
    id: SolarPV
  - platform: restart
    name: "Solar restart"

        
binary_sensor:
  - platform: gpio
    pin:
      number: D7
      mode: INPUT_PULLUP
    name: "Czujnik ciśnienia"
    id: inputd7
    filters:
      - delayed_on: 500ms
      - invert: 
    on_release:
      then:
        - switch.turn_off: SolarPV
        - logger.log: "Czujnik ciśniena wyłączony"           
# Example configuration entry

interval:
  - interval: 1s
    then:
      - if:
          condition:
            binary_sensor.is_off: inputd7
          then:
            - switch.turn_off: SolarPV

one_wire:
  - platform: gpio
    pin: GPIO2
# Individual sensors
sensor:
  - platform: dallas_temp
    address: 0x953c17e3812e6b28
    name: "Solar 1" 
    on_value_range:
      - below: 83.0
        then:
          - switch.turn_on: SolarPV
          - logger.log: "Temperatura CWU<83'C"
      - above: 85.0      
        then:
          - switch.turn_off: SolarPV
          - logger.log: "Temperatura CWU>85'C"

2 Termet CWU
Jest to projekt który powstał ze względu na to gdyż chciałem stworzyć automatyzację która zmodyfikowała pracę pieca gazowego gazowego Termet Gold .

  • Krótkotrwałe odkręcenie wody poniżej 15sekund nie powoduje włączenia grzania wody.
  • Gdy temperatura wody Solar CWU przekracza ustalony próg w HA grzanie wody piecu gazowym się nie uruchamia.
captive_portal:

switch:
  - platform: gpio
    pin: D1
    name: "CWU przekaźnik"
    id: switchCWUp
    inverted: True
    on_turn_on:
      - if:
          condition:
           binary_sensor.is_off: sp_CWU
          then:
           - delay: 
               5ms
           - switch.turn_off: switchCWUp           
  - platform: gpio
    inverted: True
    pin: D2
    name: "Termet Krzywa grzewcza/stała temp"
    id: krzywa_stala


binary_sensor:
  - platform: gpio
    pin:
      number: D6
      mode: INPUT_PULLUP
      inverted: true
    name: "Sensor przepływu CWU"
    id: sp_CWU
    filters:   
      - delayed_on: 15s
    on_press:
      if:
        condition:
          binary_sensor.is_off: tempsolcwu
        then: 
         - switch.turn_on: switchCWUp
    on_release:
      then:
         - switch.turn_off: switchCWUp
  - platform: homeassistant
    id: tempsolcwu
    entity_id: input_boolean.tempsolarcwu
3 polubienia

Jak na razie to nie mogę dodać czujnika Dallas do ESP32 przez ESPHome. Robiłem to wielokrotnie w ESP 8266, a tu nie mogę.

one_wire:
  - platform: gpio
    pin: GPIO13
    id: temperatura_kotla

Przekaźniki mam w HA, ale encji temperatury nie dam rady wyciągnąć. Chyba się poddam i wrócę do ESP 8266.


switch:
  - platform: gpio
    pin: GPIO12
    restore_mode : ALWAYS_OFF
    inverted: false
    id: relay1
    name: "pompa_CO"
   
  - platform: gpio  
    pin: GPIO14
    restore_mode : ALWAYS_OFF
    inverted: false
    id: relay2
    name: "pompa_CWU"
    
one_wire:
  - platform: gpio
    pin: GPIO13
    id: temperatura_kotla

Do zrobienia masz 2 rzeczy

  1. Właściwe formatowanie postów, popraw posta powyżej, bo chciałem pomóc i go edytowałem, ale już go zmieniłeś… a nie jeszcze gorzej piszesz “posta pod postem” gdy nie pojawiła się żadna odpowiedź…
    https://forum.arturhome.pl/t/jak-prawidlowo-zamieszczac-yaml-inny-kod-lub-logi-w-postach-na-forum/11455/

  2. Czytanie dokumentacji

    W standardowej platformie 1-wire trzeba zdefiniować 2 rzeczy

hub

one_wire:
  - platform: gpio
    pin: GPIO13

sensor - po zdefiniowaniu huba po kompilacji i uruchomieniu połączonego układu czytasz logi - tam zobaczysz wykryte sensory na magistrali, więc w drugim kroku dorzucasz do YAMLa coś w tym guście (tylko z adresem pasującym do egzemplarza Dallasa)

sensor:
  - platform: dallas_temp
    address: 0x1234567812345628
    id: temperatura_kotla
    name: "temperatura kotła"
    update_interval: 120s

To zdanie się kupy nie trzyma…
Firmware ESPHome możesz odpalić na różnych MCU - obojętnie czy ESP8266, ESP32 czy czymś innym na czym działa, ale co używałeś dotychczas to się zgadnąć nie da, ale o ESPHome to chyba nie masz pojęcia, więc nie wiem co używałeś…

Zapomniałem się z tym wklejaniem. Sorka. Ale dzięki Tobie się obudziłem. Potrenuję to wklejanie. Tymczasem już leci wgrywanie.

Jestem tylko leciwym elektrykiem, więc nie za bardzo znam się na tych terminach (nazwach}
Konfiguruję sobie płytki poprzez ESPHome (jak na razie z powodzeniem ESP8266). Robię to też przez esptool’a, czy inne podobne fleszerki.
Podłączam czujnik Dallas, wilgotności przekaźniki. W tym życiu już na pewno nie zbliżę się do Twojego poziomu. Ale dzięki Twojej uprzejmości czegoś się nauczę, za co bardzo Ci dziękuję.

Być może robiłeś to dawno (czytaj: przynajmniej kilka miesięcy wstecz) - akurat platforma dallas już nie istnieje - wreszcie po wielu latach od powstania projektu ESPHome została zaimplementowana w miarę “prawdziwa” platforma 1-wire tj. taka nie ograniczona do tylko jednego modelu sensora, a uniwersalna (w tej chwili jest gotowa na obsługę zaledwie kilku modeli rożnych urządzeń 1-wire, ale jest to krok naprzód) więc musiała zostać dostosowana działaniem do innych platform obsługujących jakiekolwiek magistrale - stąd konieczność konfigurowania “huba” (dawne rozwiązanie nie było elastyczne - nie dałoby się na magistrali podpiąć żadnego innego czujnika niż DS18x20).

Jeśli znasz adres swojego DS18B20 to możesz go użyć od ręki.

Przekopałem dużo stron i nie znalazłem odpowiedzi. Czy jest możliwe podłączenie włącznika bistabilnego do ESP32, aby np. sterował przekaźnikiem? Chciałem wykorzystać styki w termostacie pokojowym, aby reszta rodziny mogła sterować w prosty sposób temperaturą w domu.
Wszędzie są opisy włączników monostabilnych (np. dzwonkowych)

Tak - dla GPIO nie ma znaczenia jakiego łącznika używasz i jak długo go “trzymasz”. Ważne jest jaki na tym GPIO jest sygnał, wysoki czy niski oraz jego poziom dostosowany do elektroniki wewnątrz ESP. Zapewne jest to tak oczywiste, że nikt nie opisał tego w dokumentacji. Natomiast użycie przycisków daje nowe możliwości programowego wykorzystania np. dwukliku itp. dlatego siłą rzeczy musi być dobrze opisane.

Dziękuję za informację. Wkleję kod który po zwarciu 3,3V z pinem D15 załącza przekaźnik pompy. Teraz muszę się nauczyć dostosować pracę pompy w zależności od temperatury kotła.

  name: sterownik-kotla
  friendly_name: sterownik-kotla

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "XTCMCg455/h8JU2K6x9YwiAzIpnQUr8aGXS3z9IwWYc="

ota:
  - platform: esphome
    password: "a6da52861469afb9d584d124254d4723"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Sterownik-Kotla Fallback Hotspot"
    password: "488Awp9vjt8Y"

# przekaźnik pompy CO
switch:
  - platform: gpio
    pin: GPIO14
    restore_mode : ALWAYS_OFF
    inverted: true
    id: relay1
    name: "pompa_CO"

# przekaźnik pompy CWU  
  - platform: gpio  
    pin: GPIO27
    restore_mode : ALWAYS_OFF
    inverted: true
    id: relay2
    name: "pompa_CWU"
# przekaźnik pompy podłogowej w kuchni
  - platform: gpio
    pin: GPIO26
    restore_mode : ALWAYS_OFF
    inverted: true
    id: relay3
    name: "pompa_podloga_kuchnia"

# styk bistabilny termostatu pokojowego
binary_sensor:
  - platform: gpio
    pin: GPIO15
    name: "styk_termostatu"
    on_press:
      then:
       - switch.turn_on: relay1
    on_release:
      then: 
       - switch.turn_off: relay1

      
# czujnik temperatury w kotle CO     
one_wire:
  - platform: gpio
    pin: GPIO13
    id: temperatura_kotla
sensor:
  - platform: dallas_temp
    address: 0xab00000084f90128
    name: "temperatura_kotla"
    update_interval: 3s

# czujnik temperatury w kuchni
    id: temperatura_podloga
  - platform: dallas_temp
    address: 0
    name: "temperatura_podloga"
    update_interval: 120s

# czujnik temperatury zasobnika CWU
    id: temperatura_zasobnik_CWU
  - platform: dallas_temp
    address: 0
    name: "temperatura_zasobnik_CWU"
    update_interval: 30s    
     

captive_portal:
    ```

Po pierwsze, należy trzymać się jednego nazewnictwa, bo często D15 będzie czymś innym niż GPIO15. Płytki z ESP są często opisywane w/g własnej logiki i nie odpowiada to numeracji GPIO.
Po drugie sugeruję użycie pullup i zwieranie do masy GND.

Dziękuję za odpowiedź.
Podłączyłem rezystor 10k między 3,3V i GPIO15. Po zwarciu GPIO15 z masą, przekaźnik załącza się poprawnie. Po rozwarciu GPIO15 od masy niestety przekaźnik dalej “trzyma”. Gdzie jest problem?

A jakiś aktualny kod?