System nawadniania oparty o esp32 i przekaźniki

Zgadza się: “Czujnik jest wyposażony w higroskopijne pierścienie, które pęcznieją przez nasiąkanie. W ten sposób obwód elektryczny jest rozpinany a system nawadniania do czasu wyschnięcia pierścieni pozostaje nieaktywny. Wiele ustawień wysokości opadu 5 - 20 mm, szybkie i proste ustawianie poprzez obrót pokrętła”.

Znalazłem winowajcę “słabego połączenia” - to nie była wina WiFi - chociaż one też słabe, ale jak dałem w kodzie aktualizację sensorów co 1s, to chyba esp nie wyrabiało z ilością danych do obrobienia i się wysypywało (resetowało), zmieniłem na 3s i teraz pracuje stabilnie - chciałem jedną aby płynnie zmiany pokazywało ale jak widać nie da się.

Nie zauważyłem tego wcześniej w kodzie, jak dla mnie to nawet 3s jest abstrakcją. W żadnym środowisku zmiany temperatury i wilgotności nie zachodzą tak szybko. Moim zdaniem 60s to w zupełności wystarczający interwał.

Temperatura i wilgotność idzie wolno, fajnie też online podglądać czas do końca jak liczy w sekundach ale bez tego da się żyć - natomiast ciśnienie w zbiorniku hydrofobowym już zmienia się szybko, a że byłem zmuszony wprowadzić zmiany w pętlach nawadniania (zastąpić jedna sekcję dwoma sąsiadującymi bo robiąc kostkę uszkodzili jedna rurę idącą od rozdzielacza - niestety uszkodzenie pod kostką) i na podstawie zbyt niskiego ciśnienia pauzować podlewanie i czekać na wzrost ciśnienia - sekcja wylewa więcej wody niż pompa + 100l zbiornik może wydać i dlatego taki zabieg - finalnie taniej niż rozbierać kostkę a się sprawdza.

Czasem zachodzą naprawdę szybko (mam na myśli sytuacje związane z gwałtownymi burzami, niestety przykładu chyba już nie znajdę w gęstych danych), ale bez przesady.
Do potrzeb gęstej wizualizacji wystarczają 4 pomiary na minutę, ale w przypadku rozwiązań DIY koniecznie się trzeba kierować możliwościami użytych czujników (a jest wiele takich które nie mogą raportować aż tak często).

Wybrałem dzień, kiedy był znaczny spadek temperatury, więc może to była burza albo deszcz,4 pomiary na minutę (to akurat czujnik BLE) i wygląda to tak

W sumie jakbym zamiast automatyzacji w HA ukrył w kodzie esphome “naciśnięcie” pauzy przy ciśnieniu niższym niż 2,4bar i wznowienia przy wyższym niż 3,5 - jak spada do 2,1 to chowają się zraszacze, a przy 2,2 zaczyna słabo lecieć (bo w zbiornik już wtedy pusty). to mógłbym rzadziej odczytywać - spróbuje :slight_smile:

W sumie automatyzację możesz zapisywać w samym kodzie ESPHome. Uniezależniasz się wtedy bardziej i omijasz pośrednika.

Właśnie dodałem to do kodu - nie wiem tylko czy jak mam ustawiony update_interval dla zmiennej water pressure na 3s to jak zmienię na np. 10s to ten fragment kogu i tak się wykona prawidłowo bo zmienna water pressure będzie miała wartość aktualizowaną w kodzie esp ale nie publikowaną czy jednak nie - muszę to przetestować ale z racji “testów na produkcji” nie mogę za dużo testować bo już przelałem trawnik :wink:

substitutions:
### Modify only the following 6 lines.
  zone_1_name: 1.Trawnik 1
  zone_2_name: 2.Trawnik 2
  zone_3_name: 3.Trawnik 3
  zone_4_name: 4.Trawnik 4
  zone_5_name: 5.Trawnik 5
  zone_6_name: 6.Trawnik 6
  zone_7_name: 7.Kroplownica
  software_version: V1
  sensor_update_frequency: 5s
  log_level: none # Enable levels logging https://esphome.io/components/logger.html
  # none, error, warn, info, debug (default), verbose, very_verbose
##############################################
#  DO NOT CHANGE ANYTHING BELOW THIS LINE  ###
##############################################
  zone_1_valve_id: valve_0
  zone_2_valve_id: valve_1
  zone_3_valve_id: valve_2
  zone_4_valve_id: valve_3
  zone_5_value_id: value_4
  zone_6_value_id: value_5
  zone_7_value_id: value_6
  esphome_name: podlewanie
  esphome_platform: ESP32
  esphome_board: esp32dev
  esphome_comment: Irrigation Control
  esphome_project_name: dar3k.Irrigation Control
  esphome_project_version: Irrigation Controller, $software_version
  devicename: irrigation_controller
  upper_devicename: "Irrigation Controller"
  uom: Min # this overrides the uom in sprinkler -> run_duration 

#Define Project Deatils and ESP Board Type
esphome:
  name: $esphome_name
  platform: $esphome_platform
  board: $esphome_board
  comment: $esphome_comment
  project:
    name: $esphome_project_name
    version: $esphome_project_version
  on_boot:
    priority: -100
    then:
      # Set default state for Valve Status
      - text_sensor.template.publish:
          id: valve_status
          state: "Idle"
      # Set multiplier to 60, convert seconds to minutes
      - sprinkler.set_multiplier:
          id: $devicename
          multiplier: 60

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

logger:

# Enable Web server.
web_server:
  port: 80

# Sync time with Home Assistant.
time:
  - platform: homeassistant
    id: homeassistant_time
    
api:
  encryption:
    key: "LjHIyJtf6N8iHqE6ev8j6XmUlzsvKt8AGdnyeguckLE="

ota:
  password: "cfaa0c792a4c710253d485add7d61c37"

###############################################
# Text sensors with general information.
###############################################
text_sensor:
  - platform: wifi_info
    ip_address:
      name: "$upper_devicename IP"
      
# Expose Time Remaining as a sensor.
  - platform: template
    id: time_remaining
    name: $upper_devicename Time Remaining
    update_interval: $sensor_update_frequency
    icon: "mdi:timer-sand"
    lambda: |-
      int seconds = round(id($devicename).time_remaining_active_valve().value_or(0));
      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 ? String(days) + "d " : "") + 
          (hours ? String(hours) + "h " : "") +
          (minutes ? String(minutes) + "m " : "") +
          (String(seconds) + "s")).c_str()};


  # Expose Progress Percent as a sensor.
  - platform: template
    id: progress_percent
    name: $upper_devicename Progress %
    update_interval: $sensor_update_frequency
    icon: "mdi:progress-clock"
    lambda: |-
      int progress_percent = round(((id($devicename).valve_run_duration_adjusted(id($devicename).active_valve().value_or(0)) - id($devicename).time_remaining_active_valve().value_or(0)) * 100 / id($devicename).valve_run_duration_adjusted(id($devicename).active_valve().value_or(0))));
      std::string progress_percent_as_string = std::to_string(progress_percent);
      return progress_percent_as_string +"%";

  # Expose Valve Status as a sensor.
  - platform: template
    id: valve_status
    name: $upper_devicename Status
    update_interval: never
    icon: "mdi:information-variant"

sensor:
  # Uptime sensor.
  - platform: uptime
    name: $upper_devicename Uptime
  # WiFi Signal sensor.
  - platform: wifi_signal
    name: $upper_devicename WiFi Signal
    update_interval: 120s
  - platform: dht
    pin: 4
    temperature:
      name: "Temperatura"
      id: temperature_sensor 
    humidity:
      name: "Wilgotnosc"
      id: humidity_sensor
    update_interval: 90s
  - platform: adc
    pin: A6
    attenuation: 11db
    I'd: water_pressure
    name: "Water pressure"
    unit_of_measurement: "bar"
    update_interval: 5s
    filters:
      - multiply: 3.0303
number:
  - platform: template
    id: zone_1_valve_id
    name: $zone_1_name
    min_value: 1
    max_value: 15
    step: 1
    unit_of_measurement: $uom
    icon: "mdi:timer-outline"
    mode: box # Defines how the number should be displayed in the UI
    lambda: "return id($devicename).valve_run_duration(0);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: $devicename
          valve_number: 0
          run_duration: !lambda 'return x;'
  - platform: template
    id: zone_2_valve_id
    name: $zone_2_name
    min_value: 1
    max_value: 15
    step: 1
    unit_of_measurement: $uom
    icon: "mdi:timer-outline"
    mode: box # Defines how the number should be displayed in the UI
    lambda: "return id($devicename).valve_run_duration(1);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: $devicename
          valve_number: 1
          run_duration: !lambda 'return x;'
  - platform: template
    id: zone_3_valve_id
    name: $zone_3_name
    min_value: 1
    max_value: 15
    step: 1
    unit_of_measurement: $uom
    icon: "mdi:timer-outline"
    mode: box # Defines how the number should be displayed in the UI
    lambda: "return id($devicename).valve_run_duration(2);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: $devicename
          valve_number: 2
          run_duration: !lambda 'return x;'
  - platform: template
    id: zone_4_valve_id
    name: $zone_4_name
    min_value: 1
    max_value: 15
    step: 1
    unit_of_measurement: $uom
    icon: "mdi:timer-outline"
    mode: box # Defines how the number should be displayed in the UI
    lambda: "return id($devicename).valve_run_duration(3);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: $devicename
          valve_number: 3
          run_duration: !lambda 'return x;'
  - platform: template
    id: zone_5_valve_id
    name: $zone_5_name
    min_value: 1
    max_value: 15
    step: 1
    unit_of_measurement: $uom
    icon: "mdi:timer-outline"
    mode: box # Defines how the number should be displayed in the UI
    lambda: "return id($devicename).valve_run_duration(4);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: $devicename
          valve_number: 4
          run_duration: !lambda 'return x;'        
  - platform: template
    id: zone_6_valve_id
    name: $zone_6_name
    min_value: 1
    max_value: 15
    step: 1
    unit_of_measurement: $uom
    icon: "mdi:timer-outline"
    mode: box # Defines how the number should be displayed in the UI
    lambda: "return id($devicename).valve_run_duration(5);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: $devicename
          valve_number: 5
          run_duration: !lambda 'return x;'
  - platform: template
    id: zone_7_valve_id
    name: $zone_7_name
    min_value: 1
    max_value: 30
    step: 1
    unit_of_measurement: $uom
    icon: "mdi:timer-outline"
    mode: box # Defines how the number should be displayed in the UI
    lambda: "return id($devicename).valve_run_duration(6);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: $devicename
          valve_number: 6
          run_duration: !lambda 'return x;'
###############################################
# Main Sprinkler Controller
###############################################
sprinkler:
  - id: $devicename
    main_switch:
      name: "Start/Stop/Resume"
      id: main_switch
    auto_advance_switch: "Auto Advance"
    valve_open_delay: 4s
    valves:
      - valve_switch: $zone_1_name
        enable_switch: Enable $zone_1_name
        run_duration: 5s
        valve_switch_id: ${devicename}_1
      - valve_switch: $zone_2_name
        enable_switch: Enable $zone_2_name
        run_duration: 5s
        valve_switch_id: ${devicename}_2
      - valve_switch: $zone_3_name
        enable_switch: Enable $zone_3_name
        run_duration: 6s
        valve_switch_id: ${devicename}_3
      - valve_switch: $zone_4_name
        enable_switch: Enable $zone_4_name
        run_duration: 6s
        valve_switch_id: ${devicename}_4
      - valve_switch: $zone_5_name
        enable_switch: Enable $zone_5_name
        run_duration: 6s
        valve_switch_id: ${devicename}_5  
      - valve_switch: $zone_6_name
        enable_switch: Enable $zone_6_name
        run_duration: 6s
        valve_switch_id: ${devicename}_6
      - valve_switch: $zone_7_name
        enable_switch: Enable $zone_7_name
        run_duration: 12s
        valve_switch_id: ${devicename}_7
button:
  - platform: template
    id: sprinkler_pause
    name: "Pauza"
    icon: "mdi:pause"
    on_press:
      then:
        - text_sensor.template.publish:
            id: valve_status
            state: "Paused"
        - sprinkler.pause: $devicename


####################################################
# Switch Control to restart the irrigation system.   
####################################################
switch:
  - platform: restart
    name: "Restart $devicename"


####################################################
# Hidden I/O  Switches to control irrigation valve relays
####################################################
  - platform: gpio
    name: Relay Board Pin IN1
    restore_mode: RESTORE_DEFAULT_OFF # Prevents GPIO pin from going high during boot
    internal: true # Prevents GPIO switch NAME from showing up in Home Assistant
    id: ${devicename}_1
    on_turn_on:
      - text_sensor.template.publish:
          id: valve_status
          state: "$zone_1_name Active"
    on_turn_off:
      - text_sensor.template.publish:
          id: valve_status
          state: "Idle"
    pin: GPIO32 
    inverted: false
  - platform: gpio
    name: Relay Board Pin IN2
    restore_mode: RESTORE_DEFAULT_OFF # Prevents GPIO pin from going high during boot
    internal: true # Prevents GPIO switch NAME from showing up in Home Assistant
    id: ${devicename}_2
    on_turn_on:
      - text_sensor.template.publish:
          id: valve_status
          state: "$zone_2_name Active"
    on_turn_off:
      - text_sensor.template.publish:
          id: valve_status
          state: "Idle"
    pin: GPIO33
    inverted: false
  - platform: gpio
    name: Relay Board Pin IN3
    restore_mode: RESTORE_DEFAULT_OFF # Prevents GPIO pin from going high during boot
    internal: true # Prevents GPIO switch NAME from showing up in Home Assistant
    id: ${devicename}_3
    on_turn_on:
      - text_sensor.template.publish:
          id: valve_status
          state: "$zone_3_name Active"
    on_turn_off:
      - text_sensor.template.publish:
          id: valve_status
          state: "Idle"
    pin: GPIO25
    inverted: false
  - platform: gpio
    name: Relay Board Pin IN4
    restore_mode: RESTORE_DEFAULT_OFF # Prevents GPIO pin from going high during boot
    internal: true # Prevents GPIO switch NAME from showing up in Home Assistant
    id: ${devicename}_4
    on_turn_on:
      - text_sensor.template.publish:
          id: valve_status
          state: "$zone_4_name Active"
    on_turn_off:
      - text_sensor.template.publish:
          id: valve_status
          state: "Idle"
    pin: GPIO26
    inverted: false
  - platform: gpio
    name: Relay Board Pin IN5
    restore_mode: RESTORE_DEFAULT_OFF # Prevents GPIO pin from going high during boot
    internal: true # Prevents GPIO switch NAME from showing up in Home Assistant
    id: ${devicename}_5
    on_turn_on:
      - text_sensor.template.publish:
          id: valve_status
          state: "$zone_5_name Active"
    on_turn_off:
      - text_sensor.template.publish:
          id: valve_status
          state: "Idle"
    pin: GPIO27
    inverted: false  
  - platform: gpio
    name: Relay Board Pin IN6
    restore_mode: RESTORE_DEFAULT_OFF # Prevents GPIO pin from going high during boot
    internal: true # Prevents GPIO switch NAME from showing up in Home Assistant
    id: ${devicename}_6
    on_turn_on:
      - text_sensor.template.publish:
          id: valve_status
          state: "$zone_6_name Active"
    on_turn_off:
      - text_sensor.template.publish:
          id: valve_status
          state: "Idle"
    pin: GPIO14
    inverted: false
  - platform: gpio
    name: Relay Board Pin IN7
    restore_mode: RESTORE_DEFAULT_OFF # Prevents GPIO pin from going high during boot
    internal: true # Prevents GPIO switch NAME from showing up in Home Assistant
    id: ${devicename}_7
    on_turn_on:
      - text_sensor.template.publish:
          id: valve_status
          state: "$zone_7_name Active"
    on_turn_off:
      - text_sensor.template.publish:
          id: valve_status
          state: "Idle"
    pin: GPIO12
    inverted: false
  - platform: gpio
    pin: GPIO13
    name: Przekaznik
    id: Przekaznik
binary_sensor:
  - platform: gpio
    pin:
      number: GPIO0
      inverted: true
    name: "Przycisk"
    on_press:
      then:
        - switch.toggle: main_switch
  - platform: gpio
    pin:
      number: GPIO15
      mode: 
        input: true
      name: "Czujnik deszczu"
    filters:
      - delayed_on: 50ms
      - delayed_off: 50ms
  - platform: template
    id: water_pressure_low
    name: "Water Pressure Low"
    lambda: |-
      if (id(valve_status).state != "Idle" && id(water_pressure).state < 2.4) {
        return true;
      } else {
        return false;
      }
    filters:
      - delayed_on_off: 500ms
    on_state:
      - if:
          condition:
            binary_sensor.is_on: water_pressure_low
          then:
            - text_sensor.template.publish:
                id: valve_status
                state: "Paused"
            - sprinkler.pause: $devicename
  - platform: template
    id: water_pressure_high
    name: "Water Pressure High"
    lambda: |-
      if (id(valve_status).state != "Idle" && id(water_pressure).state > 3.5) {
        return true;
      } else {
        return false;
      }
    filters:
      - delayed_on_off: 500ms
    on_state:
      - if:
          condition:
            binary_sensor.is_on: water_pressure_high
          then:
            - switch.toggle: main_switch
1 polubienie

Takie wyrwane z kontekstu fragmenty kody nie pomagają innym, trzeba się dodatkowo zastanawiać co autor miał na myśli.

Wystarczy go wkleić na sam koniec kodu wyżej a zwracanie wartości true / false od razu sugeruje że to binary sensor - dlatego nie wkleiłem całości bo po co dwa razy to samo?

Hmm, żeby czytający złapał orient?

1 polubienie