NOTE: c’è un aggiornamento a questa guida -> qui
Possiamo automatizzare l’irrigazione del giardino con Home Assistant, per fare questo abbiamo bisogno di un controller ESP8285 (anche un NodeMCU va bene) ed un modulo relè a 4 canali da 5Volt che abbia i fotoaccoppiatori e l’alimentazione dei relè separabile.
il controller ESP e la scheda 4 relè puo essere alimentata da un carica batterie per cellulari direttamente dalla porta USB presente sul modulo.
Colleghiamo le due schede.
Bisogna fare attenzione all’alimentazione, in quanto il controller con i GPIO lavorano 3,3V mentre i relè lavorano a 5V, questo è molto importante per non danneggiare il chip ESP.
Separiamo l’alimentazione dei relè dai foto-accoppiatori aprendo il jumper JD-VCC.
Collegamenti:
1 2 3 4 5 6 7 8 9 |
ESP <-> 4ReleBoard ---------------------- 3,3V <-> VCC GPIO 2 <-> Relè1 GPIO 4 <-> Relè2 GPIO 5 <-> Relè3 GPIO 15 <-> Relè4 GND <-> GND Vin <-> JD-VCC |
dal pin Vin del controller ESP escono 5V prelevati direttamente dalla USB che utilizzeremo per alimentare i relè, mentre dal pin 3,3V prenderemo l’alimentazione per i fotoaccoppiatori cosi avremo separato i 5V con i 3,3V.
Di seguito i collegamenti delle schede:
E qui i collegamenti tra elettrovalvole e alimentazione a 24V AC (corrente alternata)
Per prima cosa se non li abbiamo, scarichiamo ed installiamo i driver del chip USB to Serial presente sul controller utilizzando il seguente link https://sparks.gogo.co.nz/ch340.html
Carichiamo il firmware Tasmota sull’ESP con ATOM più PlatfomIO utilizzando la porta USB, nessuna scheda programmatore serve in questo caso perchè l’ESP ha gia il chip ch340 che fa da usb a seriale.
Una volta partito, configuriamo il Tasmota come al solito (Wi-Fi, nome, friendly name, IP statico e quant’altro) di seguito alcuni screenshot di configurazione tipo.
ora andiamo a configurare i GPIO come da immagine sotto e testiamo se i relè si attivano e disattivano con i tasti toggle
Integrazione in Home-Assistant:
Per l’integrazione in Home Assistant dovremmo aver prima configurato MQTT vedi questo articolo
Poi dovremmo creare alcuni componenti, automazioni e script nel file configuration.yaml
Creiamo degli inputboolean per i giorni della settimana.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
input_boolean: # irrigazione Giorni della settimana monday: name: Lun tuesday: name: Mar wednesday: name: Mer thursday: name: Gio friday: name: Ven saturday: name: Sab sunday: name: Dom |
Ora servono degli input number slider per definire i tempi delle zone:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
################################################ # input Number - Slider per durata irrigazione # ################################################ input_number: # Tempo zona 1 slider_zona_1: name: "Zona 1" icon: mdi:clock-end min: 1 max: 30 step: 1 # Tempo zona 2 slider_zona_2: name: "Zona 2" icon: mdi:clock-end min: 1 max: 30 step: 1 # Tempo zona 3 slider_zona_3: name: "Zona 3" icon: mdi:clock-end min: 1 max: 30 step: 1 # Tempo zona 4 slider_zona_4: name: "Zona 4" icon: mdi:clock-end min: 1 max: 30 step: 1 |
Creaiamo due input time per 2 partenze giornaliere che se messi allo stesso valore avremo una perteza giornaliera soltanto:
1 2 3 4 5 6 7 8 9 10 11 12 |
input_datetime: # Orario partenza irrigazione A time_start_irrigazione: name: Orario Irrigazione has_date: false has_time: true # Orario partenza irrigazione B time_start_irrigazione2: name: Orario Irrigazione 2 has_date: false has_time: true |
A questo punto mancano le automazioni per i giorni della settimana ed uno script per i tempi delle zone e per la partenza manuale.
di seguito le automations, una per ogni giorno della settimana queste non fanno altro che far partire la zona 1 se le condizioni di orario e giorno della settimana sono valide.
L’ultima automazione intercetta se la zona 1 è accesa e fa partire lo script che per i tempi delle zone, vedi script sotto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
######################## # Irrigazione Giardino # ######################## # Automazione Irrigazione Lunedi - id : 'irrigazione_lun' alias: 'Irrigazione Lunedi' trigger: - platform: template value_template: "{{ states('sensor.time') == (states.input_datetime.time_start_irrigazione.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}" - platform: template value_template: "{{ states('sensor.time') == (states.input_datetime.time_start_irrigazione2.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}" condition: - condition: state entity_id: input_boolean.monday state: 'on' - condition: time weekday: mon action: - service: homeassistant.turn_on data: entity_id: switch.zona_1 # Automazione Irrigazione Martedi - id : 'irrigazione_mar' alias: 'Irrigazione Martedi' trigger: - platform: template value_template: "{{ states('sensor.time') == (states.input_datetime.time_start_irrigazione.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}" - platform: template value_template: "{{ states('sensor.time') == (states.input_datetime.time_start_irrigazione2.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}" condition: - condition: state entity_id: input_boolean.tuesday state: 'on' - condition: time weekday: tue action: - service: homeassistant.turn_on data: entity_id: switch.zona_1 # Automazione Irrigazione Mercoledi - id : 'irrigazione_mer' alias: 'Irrigazione Mercoledi' trigger: - platform: template value_template: "{{ states('sensor.time') == (states.input_datetime.time_start_irrigazione.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}" - platform: template value_template: "{{ states('sensor.time') == (states.input_datetime.time_start_irrigazione2.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}" condition: - condition: state entity_id: input_boolean.wednesday state: 'on' - condition: time weekday: wed action: - service: homeassistant.turn_on data: entity_id: switch.zona_1 # Automazione Irrigazione Giovedi - id : 'irrigazione_gio' alias: 'Irrigazione Giovedi' trigger: - platform: template value_template: "{{ states('sensor.time') == (states.input_datetime.time_start_irrigazione.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}" - platform: template value_template: "{{ states('sensor.time') == (states.input_datetime.time_start_irrigazione2.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}" condition: - condition: state entity_id: input_boolean.thruesday state: 'on' - condition: time weekday: thu action: - service: homeassistant.turn_on data: entity_id: switch.zona_1 # Automazione Irrigazione Venerdi - id : 'irrigazione_ven' alias: 'Irrigazione Venerdi' trigger: - platform: template value_template: "{{ states('sensor.time') == (states.input_datetime.time_start_irrigazione.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}" - platform: template value_template: "{{ states('sensor.time') == (states.input_datetime.time_start_irrigazione2.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}" condition: - condition: state entity_id: input_boolean.friday state: 'on' - condition: time weekday: fri action: - service: homeassistant.turn_on data: entity_id: switch.zona_1 # Automazione Irrigazione Sabato - id : 'irrigazione_sab' alias: 'Irrigazione Sabato' trigger: - platform: template value_template: "{{ states('sensor.time') == (states.input_datetime.time_start_irrigazione.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}" - platform: template value_template: "{{ states('sensor.time') == (states.input_datetime.time_start_irrigazione2.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}" condition: - condition: state entity_id: input_boolean.saturday state: 'on' - condition: time weekday: sat action: - service: homeassistant.turn_on data: entity_id: switch.zona_1 # Automazione Irrigazione Domenica - id : 'irrigazione_dom' alias: 'Irrigazione Domenica' trigger: - platform: template value_template: "{{ states('sensor.time') == (states.input_datetime.time_start_irrigazione.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}" - platform: template value_template: "{{ states('sensor.time') == (states.input_datetime.time_start_irrigazione2.attributes.timestamp | int | timestamp_custom('%H:%M', False)) }}" condition: - condition: state entity_id: input_boolean.sunday state: 'on' - condition: time weekday: sun action: - service: homeassistant.turn_on data: entity_id: switch.zona_1 # Intercetto la partenza dell'irrigazione e lancio lo script sequenziale. - id: 'timer_off_zona' alias: Timer off Irrigazione trigger: - entity_id: switch.zona_1 platform: state to: 'on' action: service: homeassistant.turn_on entity_id: script.timed_zone |
Qui lo script che resetta se stesso alla partenza per azzerare eventuali conteggi e poi in sequenza spenge e accende in successione le varie zone secondo i tempi impostati sugli input number slider:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
###################### # Script Irrigazione # ###################### timed_zone: alias: "Set Garden Timer" sequence: # Cancel ev. old timers - service: script.turn_off data: entity_id: script.timer_off # Set new timer - service: script.turn_on data: entity_id: script.timer_off timer_off: alias: "Turn Off Irrigazione" sequence: - delay: '00:{{ states.input_number.slider_zona_1.state | int }}:00' - service: homeassistant.turn_off entity_id: switch.zona_1 - service: homeassistant.turn_on entity_id: switch.zona_2 - delay: '00:{{ states.input_number.slider_zona_2.state | int }}:00' - service: homeassistant.turn_off entity_id: switch.zona_2 - service: homeassistant.turn_on entity_id: switch.zona_3 - delay: '00:{{ states.input_number.slider_zona_3.state | int }}:00' - service: homeassistant.turn_off entity_id: switch.zona_3 - service: homeassistant.turn_on entity_id: switch.zona_4 - delay: '00:{{ states.input_number.slider_zona_4.state | int }}:00' - service: homeassistant.turn_off entity_id: switch.zona_4 |
Il seguente script serve per interrompere, a bisogno, l’irrigazione in corso, magari per una partenza fatta partire manualmente per errore, in ogni caso una volta attivato, va ad interrompere l’esecuzione dello script “timer_off” che gestisce la sequenza delle zone descritto precedentemente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
stop_irrigazione: alias: "Ferma Irrigazione" sequence: - service: script.turn_off data: entity_id: script.timer_off - service: homeassistant.turn_off entity_id: switch.zona_1 - service: homeassistant.turn_off entity_id: switch.zona_2 - service: homeassistant.turn_off entity_id: switch.zona_3 - service: homeassistant.turn_off entity_id: switch.zona_4 |
Ora che abbiamo tutto possiamo creare un pannello Lovelace dedicato, di seguito un esempio:
Salve..
Volevo chiedere se si può aggiungere altre zone?
Sicuramente ci vorranno altri relè, ma sul ESP8285 fino a quante zone posso controllare??
Credo che almeno 8 zone si può fare usando tutti i gpio disponibili, compresi rx tx per la programmazione, ricordati se usi anche quelli, di disabilitare il serial logging
Ciao
sto utilizzando i tuoi consigli per ricreare un sistema di irrigazione attraverso Home Assistant ma avrei bisogno di avviare ogni zona con il suo timer. cosa devo modificare?
grazie
Claudio
Purtroppo questa configurazione è scritta per fare partire le zone in sequenza, per quello che vuoi fare tu, andrebbe riscritto quasi da capo.
Ciao, mi sto impratichendo con i comandi di Hassio. Ho uno switch sonoff che ho denominato ‘Zona 1’ ed ho provato la tua config, ma non riesco a far partire lautomazione . dove sbaglio? grazie per i suggerimenti
questo è il package che ho copiato ed adattato…
Ciao, con i termini sembra scritta correttamente, purtroppo sul post non vengono bene gli spazi e l’indentazione dello yaml, non saprei ricontrolla bene gli spazi e sopratutto i template tra le parantesi graffe, se non parte il problema potrebbe essere dentro la parte automation.
Se fai partire lo script timed_off, dopo il tempo zona 1, la sequenza continua?
Se accendi a mano la zona 1, lo script poi fa la sequenza?
é molto articolato come sistema, cerca di isolare dove sta il problema, utilizzando i vari pezzi a mano.
puoi anche provare a triggerare l’automazione dei vari giorni a mano e ricorda che gli input_boolean dei giorni devo essere accesi altrimenti non parte.
Ciao, ti ringrazio e ti faccio sapere.. aggiungo altre switch zone e provo.. Grazie ancora
Trovato! Semplicemente non avevo dichiarato in configuration.yaml il sensor date_time
– platform: time_date
display_options:
– ‘time’
– ‘date’
– ‘date_time’
– ‘time_date’
grazie! e’ stata una bella palestra… alla prossima e buona domenica
ottimo, ed è corretto, non ti dava errore perchè quel sensore poi è utilizzato dentro i template quindi non vengono verificati dal controllo di configurazione.
Salve, è possibile abilitare i relé in modalità inching? Le elettrovalvole che devo comandare sono bistabili da 9v.
Puoi farlo devi usare la modalità impulso o con il tasmota regolando il pulse time, oppure con HA facendoti uno script ad ok, solo penso che ti perdi lo stato, perché la tua elettro valvola non ha un filo di ritorno sul quale puoi leggere lo stato, non saprei, io cambierei le valvole, non vorrei che se qualcosa va storto ti ritrovi con l’acqua aperta per ore allagando tutto il giardino.
Buongiorno Peppe, ti ringrazio per la guida! Era proprio quello che stavo cercando, grazie!
Proverò a metterla in atto sicuramente, ma ti chiedo cortesemete qualche consiglio. Sto usando un sonoff 4CH tasmotato che collegherò alle mie tre elettrovalvole (sono elettovalvole a 24V). Il Tasmota l’ho configurato con interlock ma non con il pulsetime, perchè tanto sarà il tuo slider a dargli il tempo di apertura, vero?
Inoltre, io vorrei dargli altri due automatismi: fare partire l’irrigazione sempre all’alba ed associare la partenza ad un servizio meteo o ad un sensore pioggia che mi vada a vedere se nelle 24 ore precedenti ha piovuto o meno.
Secondo te come posso fare?
Immagino che per farlo partire all’alba io non debba considerare questo, vero?
Ottima l’idea di farlo partire all’alba o magari 30 minuti prima dell’alba, ci lavoro su e posterò un articolo aggiornato, in ogni caso questa è la condition per lavorare con il sole:
Grande!
Sono contento che ti piaccia l’idea.
Ma quindi, a livello operativo, secondo te posso tralasciare di impostare i due input time e deco inserire la condition direttamente nell’automazione dell’irrigazione?
Certo con le automazioni puoi fare molto, il mio intento era quello di creare un pannello dove poi potevo modificare i tempi di intervento a piacere, visto che non sempre il giardino ha sempre bisogno della stessa acqua, magari nelle giornate piu calde ce ne vuole di più in quelle piu fredde abbasso i tempi e risparmio.
Comunque ho modificato di molto le automazioni, per questo ti rimando al nuovo articolo che ho appena messo http://www.byte4geek.com/irrigazione-giardino-con-home-assistant-e-tasmota-esp8285-modulo-4-rele-mqtt-v2/
Innanzitutto complimenti,tra tutti i progetti per irrigazione provati questo rimane il migliore. Avrei bisogno di un aiuto nel senso che vorrei poter programmare le partenze in giorni separati. Mi spiego meglio ho la necessità di irrigare sulla linea A Es. nei gg di lun-mer-dom mentre vorrei irrigare sulla linea B anche tutti i giorni. Come potrei fare?
Grazie mille