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...


