System nawadniania oparty o esp32 i przekaźniki

tak tak.
trzeba usunąć:
valve_open_delay:

bo dodatek sprawdza stan zaworów i głupieje.

Co do “dawkowania” i implementacji do ESP do jednego drugiego nie wyklucza :slight_smile: a jak zgłębiłem temat z tym dodatkiem do dawkowania wody, to trochę przerost formy w tym podlewaniu, chyba ze każdy tryskacz pod osobny zawór, wtedy miałby to większy sens. a przy działce porosnietej z jednej strony drzewami, z innej północ, z innej południe… to lepiej na własnym doswiadczeniu dobrac czas nawodnienia.

To nie jest żaden dodatek, to jest integracja dodawana do rdzenia Home Assistant poprzez instalację w nim oprogramowania w postaci custom components.

Pomożecie?
Poniżej część mojego yaml. płytka kc868-A6. przez to ze mam 7 stref, zastosowałem zewnętrzny switch na ukladzie xl9535.
Po uruchomieniu płytki wszystko działa. “zone” 1-6 można włączać i wyłączać. Ale dla “zone” 7 mogę włączyć i mogę ją wyłączyć a następnie już switch fizycznie nie reaguje, inne jak najbardziej wszystko ok. Dopiero restart urządzenia znowu pozwala włączyć i wyłączyć “zone” 7. Nie mam zielonego pojęcia o co chodzi… chatgpt wywala się chyba przez $ i jakieś głupoty pisze, których ja nawet w tym kodzie nie posiadam.

number:
  - 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_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;'

...

  - platform: template
    id: $zone_7_valve_id
    name: $zone_7_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(6);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: $devicename
          valve_number: 6
          run_duration: !lambda 'return x;'


  - platform: template
    id: sprinkler_ctrlr_repeat_cycles
    name: "Sprinkler Repeat Cycles"
    min_value: 0
    max_value: 4
    step: 1
    mode: box
    icon: "mdi:water-sync"
    lambda: "return id($devicename).repeat();"
    set_action:
      - sprinkler.set_repeat:
          id: $devicename
          repeat: !lambda 'return x;'

###############################################
# Main Sprinkler Controller
###############################################
sprinkler:
  - id: $devicename
    main_switch:
      name: "Start/Stop/Resume"
      id: main_switch
    auto_advance_switch: "Auto Advance"
    #valve_overlap: 1s
    repeat_number: "Repeat"
    valves:
      - valve_switch: $zone_1_name
        enable_switch: Enable $zone_1_name
        run_duration: 25s
        valve_switch_id: ${devicename}_1
      
...

      - valve_switch: $zone_6_name
        enable_switch: Enable $zone_6_name
        run_duration: 90s
        valve_switch_id: ${devicename}_6
      - valve_switch: $zone_7_name
        enable_switch: Enable $zone_7_name
        run_duration: 45s
        valve_switch_id: ${devicename}_7
button:
  - platform: template
    id: sprinkler_pause
    name: "Pause"
    icon: "mdi:pause"
    on_press:
      then:
        - text_sensor.template.publish:
            id: valve_status
            state: "Paused"
        - sprinkler.pause: $devicename


# I2C bus definition

i2c:
  sda: 4
  scl: 15
  scan: true
  id: bus_a

# I2C I/O expander config
pcf8574:
  - id: 'pcf8574_output_hub'
    address: 0x24
    pcf8575: false
  - id: 'pcf8574_input_hub'
    address: 0x22
xl9535:
  - id: 'xl9535_hub'
    address: 0x20

####################################################
# 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:
      pcf8574: pcf8574_output_hub
      # Use pin number 0
      number: 0
      # One of INPUT or OUTPUT
      mode:
        output: true
      inverted: true
 
....

  - 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:
      pcf8574: pcf8574_output_hub
      # Use pin number 0
      number: 5
      # One of INPUT or OUTPUT
      mode:
        output: true
      inverted: true

  - 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:
      xl9535: xl9535_hub
      number: 0
      mode:
        output: true
      inverted: false

Nie chce mi się poprawiać po AI, ale z bloku gdzie masz piny sterowane z xl9535 wywaliłbym to (bo nie jestem przekonany czy ten komponent to obsługuje)

    restore_mode: RESTORE_DEFAULT_OFF # Prevents GPIO pin from going high during boot

z tych sterowanych z tego drugiego ekspandera chyba też (chociaż nie wiem czy to konieczne) - w sumie sprzęt masz i możesz to sprawdzić organoleptycznie, a mi się nie chce kopać po dokumentacji.

hint poza konkurencją - zwiększ sobie poziom logowania do verbose lub very verbose i analizuj logi.

tyle ze na pcf8574 wszystko śmiga.
teraz deepsek mówi mi abym:

X

L9535 może wymagać jawnego ustawienia stanu początkowego (w przeciwieństwie do PCF8574). Dodaj sekcję initialize w konfiguracji xl9535:

xl9535:
  - id: 'xl9535_hub'
    address: 0x20
    initialize:
      - pin: 0          # Numer pinu Warzywniaka (0 w Twoim przypadku)
        mode: OUTPUT    # Tryb wyjściowy
        level: LOW      # Domyślnie wyłączony

Edit: ok, wywalam

    restore_mode: RESTORE_DEFAULT_OFF

zobaczymy co zdziała

niestety usunięcie
restore_mode: RESTORE_DEFAULT_OFF
nic nie zmienia.
a to co podpowiada deepseek tj " Dodaj sekcję initialize" wywala “[initialize] is an invalid option for [xl9535].”

To zajrzyj do dokumentacji, ESPHome teoretycznie domyślnie inicjalizuje każdy ekspander (ale inaczej niż Ty chciałeś lub chciało AI). Może jest coś zwalone w tym komponencie przekopałeś wszelkie issue, również zamknięte, na temat tego komponentu?

przy włączeniu układ sam inicjalizuje sobie wszystkie GPIO do stanu hi-Z (jako wejścia, ze słabym pullupem), a ESPHome standardowo w ekspanderach inicjalizuje wyjścia jako stan wyłączony.
Dokumentacja tego komponentu jest wybitnie uboga, ale zasadniczo się zakłada, że GPIO powinno obsługiwać wszystkie funkcje standardowe, chyba, że sprzęt na to nie pozwala.

A wykorzystałeś możliwości samej płyty ? Pakowanie dodatkowego expandera żeby dorobić jeden przekaźnik, gdy do dyspozycji jest kilka wolnych GPIO ma dla mnie średni sens.
Jeśli nie wykorzystujesz dodatkowego portu serial


to masz gotowca na dwa OUT, GPIO12 i 13.

2 polubienia

skoro miałem płytkę i miałem ekspander to chcę wykorzystać to co mam pod ręką.

O jakiej płytce piszesz ? Jak to gotowy chiński moduł z tym ekspanderem, to wymaga on zasilania 5V , magistrala I2C w A6 jest na 3,3V , więc zasilanie z niej tego przekaźnika odpada. Pokaż co masz i jak zasilasz , bo może to nie problem kodu, a samego zasilania.

Pisałem w pierwszym poście: płytka kc868-A6
moduł xl9535-k1v5: XL9535-K1V5 1 2 4-kanałowy moduł przekaźnika rozszerzeń 5 V Zasilacz IIC I2C Komunikacja Optocoupler Płytka izolacyjna - AliExpress 502
kc868 zasilana 12V 1,5A.
moduł xl9535-k1v5 podpięty pod i2c (gnd, 3v3, sda, scl)
Według GitHub - mcauser/micropython-xl9535-kxv5-relay: A MicroPython library for jxl XL9535-KxV5 I2C relay boards pracuje z 3.3V. I faktycznie, po uruchomieniu kc868, i2c wykrywa, mogę włączyć przekaźnik, mogę wyłączyć i tyle. drugi raz juz go nie włączę do ponownego rebootu.

Przekaźniki na tej płytce mają cewki 5V , jest tam też zworka J1 , która pozwala na niezależne zasilanie magistrali i reszty układu.


Więc to co zrobiłeś nie będzie działać prawidłowo.

Jumper daje zasilanie na przekaźniki. Po rebocie mogę włączyć przekaźnik i go wyłączyć więc zakładam że działa.
ja mam ten moduł:

On nie ma zasilania osobnego na przekaźniki…

Ma osobne zasilanie :slight_smile: I w Twoim przypadku jest wymagane, zrób test a się przekonasz. Podłącz do A6 do gniazda z VIN, zdejmij zworę a na dowolne gniazdo gdzie jest 5V i GND podaj 5V z ładowarki do telefonu lub dowolnego zasilacza 5V

2 polubienia

Dobra, będę sprawdzał, tylko czemu z pierwszym razem bangla a później juz nie

Dlatego że stabilizator LM1117 nie wydala prądowo :slight_smile:
Jak masz lutownicę i trochę umiejętności, to 5V możesz ukraść z płyty A6.
Na ten jeden przekaźnik da radę

1 polubienie

Tak, z lutowaniem spoko podołam, gorzej z innymi rzeczami. Np GND mogę dać wspolne z i2c?

Możesz, jak 5V będzie z płyty , to łączysz wszystko tak jak wcześniej narysowałem tylko minus nie jest potrzebny , bo jest wspólny na wszystkich gniazdach.

Faktycznie, na schemacie narysowane jest GND. czyli podepnę się z 5v do D9 na płycie kc i powinno ruszyć. Dam znać, ale pewnie za parę h bo nie ma mnie fizycznie przy sprzęcie. Dziękuję za naprowadzenie.

Pokłony! działa! czyli jednak nie wyrabiało prądowo. a to psikus.
Dziękuję!

1 polubienie