ESPHome - Sterownik...
 
Powiadomienia
Wyczyść wszystko

ESPHome - Sterownik nawodnienia

3 Wpisów
2 Użytkownicy
2 Likes
1,279 Wyświetleń
(@mig41)
Wpisów: 615
Ekspert
Autor tematu
 

Zbliża się czas uruchomienia zraszaczy.

Ponieważ mam ich w sumie 12szt (zawory sterowane napięciem AC 24V ) ,nie było takiego gotowego sterownika , który by tyle obsłużył.

Postanowiłem złożyć coś na ESP8266 z ekspanderem GPIO na MCP23017 i płytką z 16 przekaźnikami. 

Ostatni przekaźnik służy do załączania pompy w studni , i jest sterowany pozostałymi zaworami/przekaźnikami. Czyli jeśli jakiś zawór jest włączony to również pompa , a jak wszystkie są zamknięte ,to pompa również ma się wyłączyć.

Dodatkowo każdy włączany zawór ma swój czas wyłączenia ( żeby przy jakimś zaniku połączenia z HA/Nodered nie wypompował całej wody ze studni).

Harmonogram ( a w zasadzie załączanie poszczególnych zaworów  , by wyłączą się same po określonym czasie) realizowany w Nodered.

Dodatkowo w HA da się załączyć poszczególne zawory z palca ( pompa startuje sama wraz z zaworem , jak wyżej).

Poniżej kod dla ESPHome:

 

esphome:
  name: zraszacze
  platform: ESP8266
  board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  password: "esphome"

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

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

captive_portal:


i2c:
  sda: GPIO0
  scl: GPIO2
  scan: True
  id: bus_a


#status_led:
#  pin: GPIO2
  
mcp23017:
  - id: 'mcp23017_hub'
    address: 0x20

sensor:
  - platform: wifi_signal
    name: "Sprinkler Wifi Signal"
    update_interval: 60s
    icon: mdi:wifi


switch:

# Z1 Nie używać ! Pod wiatą z panelami
  - platform: gpio
    name: "Sprinkler Z1 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 0
      mode: OUTPUT
      inverted: True
    id: z1
    on_turn_on:
      - switch.turn_off: z1
    
#Z2 Gardena wychylne
  - platform: gpio
    name: "Sprinkler Z2 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 8
      mode: OUTPUT
      inverted: True
    id: z2
    on_turn_on:
      - logger.log: "Turning on Z2 for 8 min"
      - switch.turn_on: z16
      - delay: 8min
      - logger.log: "Turning off Z2 after 8 min"
      - switch.turn_off: z2
    on_turn_off:
      if:
        condition:
          or:
            - lambda: 'return id(z3).state;'
            - lambda: 'return id(z4).state;'
            - lambda: 'return id(z6).state;'
            - lambda: 'return id(z7).state;'
            - lambda: 'return id(z8).state;'
            - lambda: 'return id(z9).state;'
            - lambda: 'return id(z10).state;'
            - lambda: 'return id(z11).state;'
          
        then:
          - logger.log: "Others then Z2 are on , leaving Z16"
        else:
          - logger.log: "Others then Z2 are off ,Switching off Z16"
          - switch.turn_off: z16
          

# Z3 Pod domem
  - platform: gpio
    name: "Sprinkler Z3 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 1
      mode: OUTPUT
      inverted: True
    id: z3
    on_turn_on:
      - logger.log: "Turning on Z3 for 10 min"
      - switch.turn_on: z16
      - delay: 10min
      - logger.log: "Turning off Z3 after 10 min"
      - switch.turn_off: z3
    on_turn_off:
      if:
        condition:
          or:
            - lambda: 'return id(z2).state;'
            - lambda: 'return id(z4).state;'
            - lambda: 'return id(z6).state;'
            - lambda: 'return id(z7).state;'
            - lambda: 'return id(z8).state;'
            - lambda: 'return id(z9).state;'
            - lambda: 'return id(z10).state;'
            - lambda: 'return id(z11).state;'
          
        then:
          - logger.log: "Others then Z3 are on , leaving Z16"
        else:
          - logger.log: "Others then Z3 are off ,Switching off Z16"
          - switch.turn_off: z16


#Z4 Linia kroplujaca
  - platform: gpio
    name: "Sprinkler Z4 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 9
      mode: OUTPUT
      inverted: True
    id: z4
    on_turn_on:
      - logger.log: "Turning on Z4 for 25 min"
      - switch.turn_on: z16
      - delay: 25min
      - logger.log: "Turning off Z4 after 25 min"
      - switch.turn_off: z4
    on_turn_off:
      if:
        condition:
          or:
            - lambda: 'return id(z2).state;'
            - lambda: 'return id(z3).state;'
            - lambda: 'return id(z6).state;'
            - lambda: 'return id(z7).state;'
            - lambda: 'return id(z8).state;'
            - lambda: 'return id(z9).state;'
            - lambda: 'return id(z10).state;'
            - lambda: 'return id(z11).state;'
          
        then:
          - logger.log: "Others then Z4 are on , leaving Z16"
        else:
          - logger.log: "Others then Z4 are off ,Switching off Z16"
          - switch.turn_off: z16

#Z5 Nie używać ! Nibieska rura rabatka. 
  - platform: gpio
    name: "Sprinkler Z5 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 2
      mode: OUTPUT
      inverted: True
    id: z5
    on_turn_on:
      - switch.turn_off: z5

#Z6 Pod płotem małe
  - platform: gpio
    name: "Sprinkler Z6 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 10
      mode: OUTPUT
      inverted: True
    id: z6
    on_turn_on:
      - logger.log: "Turning on Z6 for 7 min"
      - switch.turn_on: z16
      - delay: 7min
      - logger.log: "Turning off Z6 after 7 min"
      - switch.turn_off: z6
    on_turn_off:
      if:
        condition:
          or:
            - lambda: 'return id(z2).state;'
            - lambda: 'return id(z3).state;'
            - lambda: 'return id(z4).state;'
            - lambda: 'return id(z7).state;'
            - lambda: 'return id(z8).state;'
            - lambda: 'return id(z9).state;'
            - lambda: 'return id(z10).state;'
            - lambda: 'return id(z11).state;'
          
        then:
          - logger.log: "Others then Z6 are on , leaving Z16"
        else:
          - logger.log: "Others then Z6 are off ,Switching off Z16"
          - switch.turn_off: z16

#Z7 Za trasem małe
  - platform: gpio
    name: "Sprinkler Z7 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 3
      mode: OUTPUT
      inverted: True
    id: z7
    on_turn_on:
      - logger.log: "Turning on Z7 for 7 min"
      - switch.turn_on: z16
      - delay: 7min
      - logger.log: "Turning off Z7 after 7 min"
      - switch.turn_off: z7
    on_turn_off:
      if:
        condition:
          or:
            - lambda: 'return id(z2).state;'
            - lambda: 'return id(z3).state;'
            - lambda: 'return id(z4).state;'
            - lambda: 'return id(z6).state;'
            - lambda: 'return id(z8).state;'
            - lambda: 'return id(z9).state;'
            - lambda: 'return id(z10).state;'
            - lambda: 'return id(z11).state;'
          
        then:
          - logger.log: "Others then Z7 are on , leaving Z16"
        else:
          - logger.log: "Others then Z7 are off ,Switching off Z16"
          - switch.turn_off: z16

#Z8 Za garażem
  - platform: gpio
    name: "Sprinkler Z8 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 11
      mode: OUTPUT
      inverted: True
    id: z8
    on_turn_on:
      - logger.log: "Turning on Z8 for 7 min"
      - switch.turn_on: z16
      - delay: 7min
      - logger.log: "Turning off Z8 after 7 min"
      - switch.turn_off: z8
    on_turn_off:
      if:
        condition:
          or:
            - lambda: 'return id(z2).state;'
            - lambda: 'return id(z3).state;'
            - lambda: 'return id(z4).state;'
            - lambda: 'return id(z6).state;'
            - lambda: 'return id(z7).state;'
            - lambda: 'return id(z9).state;'
            - lambda: 'return id(z10).state;'
            - lambda: 'return id(z11).state;'
          
        then:
          - logger.log: "Others then Z8 are on , leaving Z16"
        else:
          - logger.log: "Others then Z8 are off ,Switching off Z16"
          - switch.turn_off: z16

#Z9 Na zachodzie obrotowe
  - platform: gpio
    name: "Sprinkler Z9 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 4
      mode: OUTPUT
      inverted: True
    id: z9
    on_turn_on:
      - logger.log: "Turning on Z9 for 10 min"
      - switch.turn_on: z16
      - delay: 10min
      - logger.log: "Turning off Z9 after 10 min"
      - switch.turn_off: z9
    on_turn_off:
      if:
        condition:
          or:
            - lambda: 'return id(z2).state;'
            - lambda: 'return id(z3).state;'
            - lambda: 'return id(z4).state;'
            - lambda: 'return id(z6).state;'
            - lambda: 'return id(z7).state;'
            - lambda: 'return id(z8).state;'
            - lambda: 'return id(z10).state;'
            - lambda: 'return id(z11).state;'
          
        then:
          - logger.log: "Others then Z9 are on , leaving Z16"
        else:
          - logger.log: "Others then Z9 are off ,Switching off Z16"
          - switch.turn_off: z16

#Z10 Na zachodzie małe
  - platform: gpio
    name: "Sprinkler Z10 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 12
      mode: OUTPUT
      inverted: True
    id: z10
    on_turn_on:
      - logger.log: "Turning on Z10 for 8 min"
      - switch.turn_on: z16
      - delay: 8min
      - logger.log: "Turning off Z10 after 8 min"
      - switch.turn_off: z10
    on_turn_off:
      if:
        condition:
          or:
            - lambda: 'return id(z2).state;'
            - lambda: 'return id(z3).state;'
            - lambda: 'return id(z4).state;'
            - lambda: 'return id(z6).state;'
            - lambda: 'return id(z7).state;'
            - lambda: 'return id(z8).state;'
            - lambda: 'return id(z9).state;'
            - lambda: 'return id(z11).state;'
          
        then:
          - logger.log: "Others then Z10 are on , leaving Z16"
        else:
          - logger.log: "Others then Z10 are off ,Switching off Z16"
          - switch.turn_off: z16


#Z11 Pod płotem obrotowe
  - platform: gpio
    name: "Sprinkler Z11 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 5
      mode: OUTPUT
      inverted: True
    id: z11
    on_turn_on:
      - logger.log: "Turning on Z11 for 20 min"
      - switch.turn_on: z16
      - delay: 20min
      - logger.log: "Turning off Z2 after 20 min"
      - switch.turn_off: z11
    on_turn_off:
      if:
        condition:
          or:
            - lambda: 'return id(z2).state;'
            - lambda: 'return id(z3).state;'
            - lambda: 'return id(z4).state;'
            - lambda: 'return id(z6).state;'
            - lambda: 'return id(z7).state;'
            - lambda: 'return id(z8).state;'
            - lambda: 'return id(z9).state;'
            - lambda: 'return id(z10).state;'
          
        then:
          - logger.log: "Others then Z11 are on , leaving Z16"
        else:
          - logger.log: "Others then Z11 are off ,Switching off Z16"
          - switch.turn_off: z16

      
#Z12 Nie podłączone
  - platform: gpio
    name: "Sprinkler Z12 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 13
      mode: OUTPUT
      inverted: True
    id: z12
    on_turn_on:
      - switch.turn_off: z12

#Z13 Nie podłączone
  - platform: gpio
    name: "Sprinkler Z13 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 6
      mode: OUTPUT
      inverted: True
    id: z13
    on_turn_on:
      - switch.turn_off: z13
      
#Z14 Nie podłączone
  - platform: gpio
    name: "Sprinkler Z14 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 14
      mode: OUTPUT
      inverted: True
    id: z14
    on_turn_on:
      - switch.turn_off: z14

#Z15 Nie podłączone
  - platform: gpio
    name: "Sprinkler Z15 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 7
      mode: OUTPUT
      inverted: True
    id: z15
    on_turn_on:
      - switch.turn_off: z15

#Z16 Pompa
  - platform: gpio
    name: "Sprinkler Z16 Switch"
    pin:
      mcp23xxx: mcp23017_hub
      number: 15
      mode: OUTPUT
      inverted: True
    id: z16


     

 

 

A tak to wygląda w HA:

image
 
Dodane : 19/04/2023 8:11 pm
isom and pawell32 reacted
isom
 isom
(@isom)
Wpisów: 5084
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

Szkoda że na sztywno ustawiasz czasy załaczenia, ja w podobnym rozwiazaniu tyle że z tasmotą dla każdej sekcji ustalam czas przy użyciu zmiennej, którą mogę modyfikować za pomocą input_number. Pozwala to ustawić dłuższe lub krótsze cykle w zależności od aktualnej pogody. Na dłuższe okresy upałów warto wydłużyć cykle, natomiast chcąc oszczędzać wodę warto je skracać gdy jest taka możliwość.

 
Dodane : 20/04/2023 8:35 am
(@mig41)
Wpisów: 615
Ekspert
Autor tematu
 

@isom Możesz to traktować jako maksymalny/absolutny czas  po którym sekcja musi się wyłączyć ( bo prąd , bo woda ) i traktować ten czas jako kolejny/ostateczny bezpiecznik ( bo w miedzyczasie nastąpi brak komunikacji , sygnału na wyłącz z harmonogramu nie będzie bo np Nodered się wykrzaczył ,i akurat nie wyłączył )   , natomiast w Harmonogramie /Nodered wyłączać sekcję odpowiednio wcześnie i tam zmieniać/skracać/wydłużać czasy.

 

Nic nie stoi na przeszkodzie ,żeby sekcję wyłączyć wcześniej z palca  , czy z harmonogramu.

 

EDIT: Natomiast jest jeden haczyk, jeśli wyłaczenie nastąpiło wcześniej , to ten czas i tak jest odliczany dalej , i wtedy i tak po tym czasie wyłączy nam sekcję jeszcze raz ( gdyby wcześniej coś ją drugi raz włączyło). Wszystko przez użycie prostego delay...

 
Dodane : 20/04/2023 8:56 am
Udostępnij: