System nawadniania oparty o esp32 i przekaźniki

Trafiłem na wszystkim znanym chińskim portalu aukcyjnym na płytkę z 8 przekaźnikami opartą na esp, kosztowała ok 75zł, daje się na nią wgrać esphome, przekaźniki działają błyskawicznie - praktycznie bez zwłoki sterowane z HA, to pomyślałem aby wykonać na tym system nawadniania, który obecnie działa u mnie na sterowniku Rainbird, niestety niezintegrowanym z HA ze względu na koszty (moduł wifi do niego kosztuje 500zł)
Płytka wygląda tak:


Ma może ktoś system nawadniania wykonany na esphome? Nie wiem jak się do tego zabrać tzn. czy próbować wykonać system “autonomiczny”, który działa pomimo utraty połączenia z HA, a z HA zadawać mu jedynie parametry, o której dana sekcja ma startować i jak długo, czy zostawić w esphome jedynie przekaźniki jako switch, które są sterowane w pełni automatyzacją z HA?
Widziałem na HACS GitHub - jeroenterheerdt/HAsmartirrigation: Smart Irrigation custom component for Home Assistant co wydaje się bardzo fajnym rozwiązaniem, oszczędzającym wodę (wprawdzie mam swoją studnię ale po co lać jak nie jest to potrzebne), próbował ktoś tej integracji jak to się sprawdza?

PS: Znalazł ktoś sensowny czujnik ciśnienia wody działający z esphome (z dobrym stosunkiem cena/jakość)?

1 polubienie

Przypomniałeś mi o temacie i wszystkie pasujące wątki, które pamiętam wrzuciłem pod taga nawadnianie jeśli jakiś nieotagowany znajdziesz na forum to wrzuć tu linki to je potaguję.

Bardzo fajny moduł, mam na nim system nawadniania oparty na Sprinkler Controller — ESPHome
Polecam

2 polubienia

Zrobiłem na podstawie tego kod w esphome (niestety dopiero się tego uczę bo na esphome aktualnie mam tylko odczyt wodomierza.
Kod mam taki:

esphome:
  name: "nawadnianie"
  friendly_name: "nawadnianie"
  platform: esp32
  board: esp32dev
web_server:
  port: 80

time:
  - platform: sntp
    id: sntp_time
    timezone: "Europe/Warsaw"
# Status LED
light:
  - platform: status_led
    name: "RelayBoard Led"
    restore_mode: ALWAYS_ON
    pin:
      number: GPIO23
      inverted: false

sprinkler:
  - id: lawn_sprinkler_ctrlr
    main_switch: "Sprinklers"
    auto_advance_switch: "Sprinklers Auto Advance"
    reverse_switch: "Sprinklers Reverse"
    multiplier_number: "Sprinkler Multiplier"
    repeat_number: "Sprinkler Repeat"
    valve_open_delay: 5s
    valves:
      - valve_switch: "Sekcja 1"
        enable_switch: "Załącz sekcja 1"
        run_duration_number:
          id: sekcja_1_run_duration
          name: "Sekcja 1 Run Duration"
          initial_value: 5
          max_value: 12
          min_value: 1
          unit_of_measurement: min
        valve_switch_id: Sekcja1
      - valve_switch: "Sekcja 2"
        enable_switch: "Załącz sekcja 2"
        run_duration_number:
          id: sekcja_2_run_duration
          name: "Sekcja 2 Run Duration"
          initial_value: 5
          max_value: 12
          min_value: 1
          unit_of_measurement: min
        valve_switch_id: Sekcja2
      - valve_switch: "Sekcja 3"
        enable_switch: "Załącz sekcja 3"
        run_duration_number:
          id: sekcja_3_run_duration
          name: "Sekcja 3 Run Duration"
          initial_value: 5
          max_value: 12
          min_value: 1
          unit_of_measurement: min
        valve_switch_id: Sekcja3
      - valve_switch: "Sekcja 4"
        enable_switch: "Załącz sekcja 4"
        run_duration_number:
          id: sekcja_4_run_duration
          name: "Sekcja 4 Run Duration"
          initial_value: 5
          max_value: 12
          min_value: 1
          unit_of_measurement: min
        valve_switch_id: Sekcja4
      - valve_switch: "Sekcja 5"
        enable_switch: "Załącz sekcja 5"
        run_duration_number:
          id: sekcja_5_run_duration
          name: "Sekcja 5 Run Duration"
          initial_value: 5
          max_value: 12
          min_value: 1
          unit_of_measurement: min
        valve_switch_id: Sekcja5
      - valve_switch: "Sekcja 6"
        enable_switch: "Załącz sekcja 6"
        run_duration_number:
          id: sekcja_6_run_duration
          name: "Sekcja 6 Run Duration"
          initial_value: 5
          max_value: 12
          min_value: 1
          unit_of_measurement: min
        valve_switch_id: Sekcja6
      - valve_switch: "Sekcja 7"
        enable_switch: "Załącz sekcja 7"
        run_duration_number:
          id: sekcja_7_run_duration
          name: "Sekcja 7 Run Duration"
          initial_value: 5
          max_value: 25
          min_value: 1
          unit_of_measurement: min
        valve_switch_id: Sekcja7
switch:
  - platform: gpio
    pin: GPIO32
    name: Sekcja 1
    id: Sekcja1
  - platform: gpio
    pin: GPIO33
    name: Sekcja 2
    id: Sekcja2
  - platform: gpio
    pin: GPIO25
    name: Sekcja 3
    id: Sekcja3
  - platform: gpio
    pin: GPIO26
    name: Sekcja 4
    id: Sekcja4
  - platform: gpio
    pin: GPIO27
    name: Sekcja 5
    id: Sekcja5
  - platform: gpio
    pin: GPIO14
    name: Sekcja 6
    id: Sekcja6
  - platform: gpio
    pin: GPIO12
    name: Sekcja 7
    id: Sekcja7
  - platform: gpio
    pin: GPIO13
    name: Przekaznik
    id: Przekaznik
sensor:
  - platform: uptime
    name: "Uptime"
  - platform: internal_temperature
    name: "Internal Temperature"      
# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "LjHIyJtf6N8iHqE6ev8j6XmUlzsvKt8AGdnyeguckLE="

ota:
  password: "cfaa0c792a4c710253d485add7d61c37"

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

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

captive_portal:
    

Wydaje się, że działa, chociaż nie do końca rozumiem sekcję związaną z akcjami: Sprinkler Controller — ESPHome
Wiem, że da się np. wywołać akcje przez wejście GPIO tak aby “ręcznie” odpalić kolejkę ale nie do końca wiem jak tą sekcję dodać do kodu niby jest przykład ale jak go chce wkleić to mam błąd - pewnie wklejam w złe miejsce. Mógłbyś podzielić się swoim kodem?

Poczytaj np. Sprinkler automation with ESPHome, a complete project - Share your Projects! - Home Assistant Community , podobnych tematów jest dużo, trzeba tylko poszukać.

A to trochę nowość bo z Twoich postów zapamiętałem, że dużo własnych modułów masz na Tasmota a tu ESPHome i w dodatku z timerami, chyba, że tym sterownikiem steruje HA.

Nie widzę problemu, musisz tylko wywalić trochę kodu dotyczącego czujnika LD2410 i DS18B20 .

# Establish Substitutions
substitutions:
### Modify only the following 6 lines.
  zone_1_name: Trawnik 1
  zone_2_name: Trawnik 2
  zone_3_name: Trawnik 3
  zone_4_name: Trawnik 4
  zone_5_name: Jagody
  zone_6_name: Szklarnia
  software_version: 2023 06 00 V1
  sensor_update_frequency: 10s
  log_level: debug # 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
  esphome_name: podlewanie
  esphome_platform: ESP32
  esphome_board: esp32dev
  esphome_comment: Four Valve Irrigation Control
  esphome_project_name: JAYA.Four Valve 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
  manual_ip:
    static_ip: 192.168.x.xx
    gateway: 192.168.x.x    
	subnet: 255.255.255.0
    dns1: 8.8.8.8
    dns2: 8.8.4.4
# Enable fallback hotspot (captive portal) in case wifi connection fails
#ap:
 # ssid: "Podlewanie Hotspot"
 # password: 22221266
  
logger:
  baud_rate: 0
  logs:
    text_sensor: WARN
  
ota:
  password: "111111266"

# Enable Web server.
web_server:
  port: 80
  auth:
    username: !secret web_server_username
    password: !secret web_server_password

# Sync time with Home Assistant.
time:
  - platform: homeassistant
    id: homeassistant_time
    
###############################################
# Enable Home Assistant API
###############################################
api:
  encryption:
    key: "QdsEkIkjxupRP7nnnn2tNin6kj7i4u7jug+rLFfU="
 
  reboot_timeout: 0s

uart:
  tx_pin: TX
  rx_pin: RX
  baud_rate: 256000
  parity: NONE
  stop_bits: 1

ld2410:
  
###############################################
# Binary Sensor.
###############################################
binary_sensor:
  - platform: ld2410
    has_target:
      name: Presence
    has_moving_target:
      name: Moving Target
    has_still_target:
      name: Still Target    
###############################################
# Text sensors with general information.
###############################################
text_sensor:
  - platform: version # Expose ESPHome version as sensor.
    name: $esphome_name ESPHome Version
    hide_timestamp: false
  - platform: wifi_info
    ip_address:
      name: "$esphome_name 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"

  - platform: template # Expose the board type as a sensor
    id: espboard_type
    icon: "mdi:developer-board"
    name: $esphome_name ESPBoard
    lambda: |-
      return to_string("${esphome_board}");

# https://esphome.io/devices/nodemcu_esp8266.html
# Enable On-Board Status LED.
dallas:
  - pin: 21

sensor:
  # Uptime sensor.
  - platform: uptime
    name: $upper_devicename Uptime

  # WiFi Signal sensor.
  - platform: wifi_signal
    name: $upper_devicename WiFi Signal
    update_interval: 60s

  # temperature sensor DS18B20
  - platform: dallas
    address: 0xfc3c01d075d40d28
    name: "Temp Biuro"
  # czujnik odległości
  - 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
###############################################
# Configuration to set multiplier via number 
############################################### 
number:
  - 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
  - platform: template
    id: zone_1_valve_id
    name: $zone_1_name
    min_value: 1
    max_value: 60
    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: 60
    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: 60
    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: 60
    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: 60
    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: 60
    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;'
###############################################
# Main Sprinkler Controller
###############################################
sprinkler:
  - id: $devicename
    main_switch:
      name: "Start/Stop/Resume"
      id: main_switch
    auto_advance_switch: "Auto Advance"
    valve_open_delay: 2s
    valves:
      - valve_switch: $zone_1_name
        enable_switch: Enable $zone_1_name
        run_duration: 20s
        valve_switch_id: ${devicename}_1
      - valve_switch: $zone_2_name
        enable_switch: Enable $zone_2_name
        run_duration: 20s
        valve_switch_id: ${devicename}_2
      - valve_switch: $zone_3_name
        enable_switch: Enable $zone_3_name
        run_duration: 20s
        valve_switch_id: ${devicename}_3
      - valve_switch: $zone_4_name
        enable_switch: Enable $zone_4_name
        run_duration: 20s
        valve_switch_id: ${devicename}_4
      - valve_switch: $zone_5_name
        enable_switch: Enable $zone_5_name
        run_duration: 30s
        valve_switch_id: ${devicename}_5  
      - valve_switch: $zone_6_name
        enable_switch: Enable $zone_6_name
        run_duration: 30s
        valve_switch_id: ${devicename}_6
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  

@macek wszystko się zgadza, a proporcje jak na razie tak jak widać

Przyszła wiosna więc zabawy z podlewaniem nadszedł czas :wink:

Dzięki @isom1266 udało mi się to zrobić, a z efektu finalnego jestem zadowolony, jedynie zasięg wifi jest strasznie słaby z tego ESP na płytce - mimo, że mam na dworze Ubiquiti UAP-AC-M co super pokrywa całe podwórko - a nawet i pół osiedla, to zasięg wifi z esp jest słaby - chyba przelutuje to esp32 na płytce na wersję z gniazdem do anteny zewnętrznej - między płytką, a AP jest ok 20m w linii prostej i jedyną przeszkodą po drodze jest drewniany domek w którym ta płytka jest,a zrywa połączenie, wg. esp sygnał wifi jest na poziomie -63dBi +/-5, a wg. unifi -88dBm ale TX Retries 42%.

Jakby ktoś zainteresowany był to mój kod do esphome wygląda tak, dodałem czujnik DHT22 do pomiaru wilgotności i temperatury oraz czujnik ciśnienia wody - kupiony na aliexpress 31.81zł 25% OFF|Nadajnik czujnika ciśnienia do wody oleju paliwa gazu powietrza G1/4 5V czujnik ceramiczny ze stali nierdzewnej 0.5Mpa 1.2Mpa przetwornik| | - AliExpress z racji, że czujnik na 5V to podłączony przez dzielnik 51kOhm i 100kOhm, czujnik ma zakres pracy 0-5V, i 0-10bar, ja mam max 4,3bara gdy zbiornik nabity - użyłem większego zakresu napięcia na wejściu, stąd attenuation: 11db (domyślnie jest 0 i wejście analogowe pracuje jako 0-1V).

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: 1s
  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
    name: "Water pressure"
    unit_of_measurement: "bar"
    update_interval: 1s
    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
Zrobione

Pozostało do zrobienia - podłączyć czujnik deszczu - musi on być podłączony jako bezpotencjałowy - tak aby dawał zwarcie / rozwarcie. Dorobię przy czasie - bo tam chyba też trzeba z rezystorami coś kombinować aby poprawnie wykrywało.

1 polubienie

Możliwe, że pomoże zajrzenie w konfigurację ustawień Twojego AP. Miałem podobne objawy ponieważ domyślne ustawienie dla radia opcji “Minimum RSSI” jest włączone. Wycina urządzenia, które mają słabsze sygnały. Nie pamiętam ale być może jeszcze coś należało w tej kwestii poprawić.

1 polubienie

Dla tego AP mam ustawione ręcznie minimalną wartość jaką można ustawić. (-90dBm)

Zobacz jeszcze ustawienie dla “Minimum Data Rate Control”.

1 polubienie

Też to mam ustawione na minimum. Po prostu ta wbudowana antena od esp słaba jest.
image

1 polubienie

Znalazłem, że da się zmodyfikować wbudowaną antenę na esp i podlutować zewnętrzną:


Antenka już zamówiona na aliexpress jak tylko przyjdzie to ją dolutuje - miejmy nadzieję, że 3dBi dużo zmieni w tym wypadku.

Dodałem czujnik deszczu (rain bird - daje zwarcie jak jest zezwolenie do podlewania i zwiera jak padało) - dodałem na końcu kodu tutaj: System nawadniania oparty o esp32 i przekaźniki - #7 przez dar3k

1 polubienie

Warto przy takich wypowiedziach dołączać linki do urządzeń aby było widomo “co i jak”.

Jest chyba tylko jeden Rain Bird’a więc szukając zawsze się znajdzie https://www.rainbird.com/pl/products/czujnik-deszczu-serii-rsd

Na jakiej zasadzie działa ten czujnik deszczu? Mierzy przewodność? Jak patrzę na jego ilustracje, to nie wizę żadnej miseczki zbierającej krople wody. To w ogóle ma prawo działać?

@angler miałem to w ręku, tam jest taki “pływak”, więc po deszczu też musi upłynąć jakiś czas aby mogło się ponownie włączyć podlewania. Na moje oko to nie jest zwykły czujnik opadów - uwzględnia to że po deszczy nie ma sensu podlewać

Nie wiem co to jest za materiał w środku ale jest coś w co wsiąka woda i pęcznieje gdy nasiąknięte.

…krok po kroku i dojdziemy jak to działa :slight_smile:

Tego rodzaju czujnik ma wewnątrz pochłaniające wodę tarcze higroskopijne, dzięki temu nie wymaga specjalnej automatyzacji, ponieważ czas “wysychania” jest proporcjonalny do nasiąkania. Mam taki od kilku lat, wstępnie przerywał masę zasilania elektrozaworów, ale to w pewnym stopniu mnie ograniczało, więc podłączyłem pod GPIO jako switch, nad którym mam jakąś kontrolę

1 polubienie

Zastanawia mnie tylko jak dochodzi do kontaktu z wodą? Myślałem, że krople muszą trafiać w mały otwór u góry czujnika i wydaje mi się to nielogiczne ale może wystarcza sama wilgoć z powietrza? To by miało sens.