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:
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ść.
@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...