Node-red to the rescue (controll sprinkler and HVAC systems)

Hello internet,

I used node red to setup my sprinkler system automatons and control my HVAC system and Evaporative cooler. The sprinkler system works as advertised. the Hvac/evap system seems to work correctly but I’m only checking debug messages in no-red right now. I plan to buy two sonoff ch4 pro r2’s in a week and see what happens. the HVAC and evap system’s should work together so only one will run at a time when in link mode. all the other modes force the other one to tun off if you select it Here are some screen shots of what home-assistnat and node red look like:

HVAC/EVAP SYSTEM


SPRINKLER SYSTEM


I am super happy that I was able to figure this out and it was mainly due to node-red and being able to see how the system should work.

Edit: If you want to know more I can get that information. But if no one cares then that’s ok too. :slightly_smiling_face:

5 Likes

Literally just purchased a sonoff 4ch r2 for a sprinkler project I want to do this week. If you don’t mind posting/linking xml for nodered and config for homeassistant, that would be super useful!

1 Like

Here are the parts for home assistant. I just adapted rovl’s design. I would not have been able to do this with out his initial work so credit should really go to him.

The date_time sensor is used for comparison to get the sprinkler to start.

sensor:

  - platform: template
    sensors:

#### Irrigation start compare sensor####  

      date_time:
        friendly_name: 'date/time'
        icon_template: mdi:clock
        value_template: '{{ now().strftime("%a, %d-%m-%Y at %H:%M") }}' 

#### zone 1 sensors ####

      next_run_zone_1:
         friendly_name: 'Next Run'
         icon_template: mdi:calendar-clock
         value_template: >
            {# runDay set to 9 = Not Set #}
            {% set runDay = 9 |int %}
            {# Set todays day #}
            {% set currentDay = now().weekday() |int %}
            {# calculate starttime #}
            {%- macro starttime() -%}
                {%- if states.input_number.zone_1_hour.state|length < 4-%}
                    {{0}}
                {%- endif -%}
                {{states.input_number.zone_1_hour.state | int  }}{{':'}}
                {%- if states.input_number.zone_1_minutes.state|length < 4 -%}
                   {{0}}
                {%- endif -%}
                {{ states.input_number.zone_1_minutes.state | int }}
            {%- endmacro -%}
            {% set StartTime = starttime() %}
            {%- macro tuethusat() -%}
                {%- if currentDay <= 1 -%}
                    {{1}}  
                {%- elif  currentDay <= 3 -%}
                    {{3}}
                {%- elif  currentDay <= 5 -%}
                    {{5}}
                {%- elif  currentDay <= 6 -%}
                    {{1}}
                {%- endif -%}
            {%- endmacro -%}
            {%- macro monwedfrisun() -%}
                {%- if currentDay == 0 -%}
                    {{0}}  
                {%- elif  currentDay <= 2 -%}
                    {{2}}
                {%- elif  currentDay <= 4 -%}
                    {{4}}
                {%- elif  currentDay <= 6 -%}
                    {{6}}	
                {%- endif -%}
            {%- endmacro -%}
            {# set configured runDay from input_select #}
            {% if states.input_select.zone_1_schedule.state == "Monday" %}
                {% set runDay = 0 |int %}
            {% elif states.input_select.zone_1_schedule.state == "Tuesday" %}
                {% set runDay = 1 |int %}
            {% elif states.input_select.zone_1_schedule.state == "Wednesday" %}
                {% set runDay = 2 |int %}
            {% elif states.input_select.zone_1_schedule.state == "Thursday" %}
                {% set runDay = 3 |int %}
                {% elif states.input_select.zone_1_schedule.state == "Friday" %}
                {% set runDay = 4 |int %}
            {% elif states.input_select.zone_1_schedule.state == "Saturday" %}
                {% set runDay = 5 |int %}
            {% elif states.input_select.zone_1_schedule.state == "Sunday" %}
                {% set runDay = 6 |int %}
            {% elif states.input_select.zone_1_schedule.state == "Tue/Thu/Sat" %}
                {% set runDay = tuethusat() |int -%}
            {% elif states.input_select.zone_1_schedule.state == "Mon/Wed/Fri/Sun" %}
                {% set runDay = monwedfrisun() |int %}  
            {% elif states.input_select.zone_1_schedule.state == "Every Day" %}
                {% set runDay = currentDay |int %}     
            {% endif %} 
            {# determine the next runday #}
            {% if runDay == 9 %}
                {# schedule not active #}
                {% set runDate = "Not set" %}
            {% else %}
                {# schedule is active so determine next run #}
                {# first check if runDay = today #}
                {% if currentDay == runDay %}
                    {# are we passed the scheduled time? #}
                    {% if starttime() < now().time().strftime("%H:%M") %}
                        {# than we need to fake tomorrow #}
                        {% set currentDay = (currentDay + 1) |int %}
                        {# and calculate new runDay in case we have a list of multiple run days in in a week #}
                        {% if states.input_select.zone_1_schedule.state == "Tue/Thu/Sat" %}
                            {% set runDay = tuethusat() |int -%}
                        {% elif states.input_select.zone_1_schedule.state == "Mon/Wed/Fri/Sun" %}
                            {% set runDay = monwedfrisun() |int %} 
                        {% elif states.input_select.zone_1_schedule.state == "Every Day" %}
                            {% set runDay = currentDay |int %} 
                        {% endif %}
                    {% endif %}
                {% endif %}
                {# Now we can determine next runDate base on now().weekday() and not currentDay as that can be set to fake tomorrow #}	
                {% if currentDay <= runDay %}
                    {% set Days = runDay - now().weekday() |int %}
                {% else %}
                    {% set Days = runDay + 7 - now().weekday() |int %}
                {% endif %}
                {% set runDate = ((as_timestamp(now()) + (86400 * Days)) | timestamp_local) %}
                {# we also want to show the weekday of the next date #}
                {% set weekdayList = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] %}
                {% if now().weekday()+ Days < 7 %}
                    {% set weekday = weekdayList[(now().weekday()+ Days)] %}
                {% else %}
                    {% set weekday = weekdayList[(now().weekday()+ Days)- 7] %}
                {% endif %} 
            {% endif %}
            {# all done #}
            {# set states.sensor.next_run_date_zone_1.state = runDate #}
            {% if runDay == 9 %}
                {# schedule not active #}
                {{runDate}}
            {% else %}
                {{weekday}}, {{runDate[8:10]}}-{{runDate[5:7]}}-{{runDate[0:4]}} at {{starttime()}}
            {% endif %}

#### zone 2 sensors ####

      next_run_zone_2:
         friendly_name: 'Next Run'
         icon_template: mdi:calendar-clock
         value_template: >
            {# runDay set to 9 = Not Set #}
            {% set runDay = 9 |int %}
            {# Set todays day #}
            {% set currentDay = now().weekday() |int %}
            {# calculate starttime #}
            {%- macro starttime() -%}
                {%- if states.input_number.zone_2_hour.state|length < 4-%}
                    {{0}}
                {%- endif -%}
                {{states.input_number.zone_2_hour.state | int  }}{{':'}}
                {%- if states.input_number.zone_2_minutes.state|length < 4 -%}
                   {{0}}
                {%- endif -%}
                {{ states.input_number.zone_2_minutes.state | int }}
            {%- endmacro -%}
            {% set StartTime = starttime() %}
            {%- macro tuethusat() -%}
                {%- if currentDay <= 1 -%}
                    {{1}}  
                {%- elif  currentDay <= 3 -%}
                    {{3}}
                {%- elif  currentDay <= 5 -%}
                    {{5}}
                {%- elif  currentDay <= 6 -%}
                    {{1}}
                {%- endif -%}
            {%- endmacro -%}
            {%- macro monwedfrisun() -%}
                {%- if currentDay == 0 -%}
                    {{0}}  
                {%- elif  currentDay <= 2 -%}
                    {{2}}
                {%- elif  currentDay <= 4 -%}
                    {{4}}
                {%- elif  currentDay <= 6 -%}
                    {{6}}	
                {%- endif -%}
            {%- endmacro -%}
            {# set configured runDay from input_select #}
            {% if states.input_select.zone_2_schedule.state == "Monday" %}
                {% set runDay = 0 |int %}
            {% elif states.input_select.zone_2_schedule.state == "Tuesday" %}
                {% set runDay = 1 |int %}
            {% elif states.input_select.zone_2_schedule.state == "Wednesday" %}
                {% set runDay = 2 |int %}
            {% elif states.input_select.zone_2_schedule.state == "Thursday" %}
                {% set runDay = 3 |int %}
                {% elif states.input_select.zone_2_schedule.state == "Friday" %}
                {% set runDay = 4 |int %}
            {% elif states.input_select.zone_2_schedule.state == "Saturday" %}
                {% set runDay = 5 |int %}
            {% elif states.input_select.zone_2_schedule.state == "Sunday" %}
                {% set runDay = 6 |int %}
            {% elif states.input_select.zone_2_schedule.state == "Tue/Thu/Sat" %}
                {% set runDay = tuethusat() |int -%}
            {% elif states.input_select.zone_2_schedule.state == "Mon/Wed/Fri/Sun" %}
                {% set runDay = monwedfrisun() |int %}  
            {% elif states.input_select.zone_2_schedule.state == "Every Day" %}
                {% set runDay = currentDay |int %}     
            {% endif %} 
            {# determine the next runday #}
            {% if runDay == 9 %}
                {# schedule not active #}
                {% set runDate = "Not set" %}
            {% else %}
                {# schedule is active so determine next run #}
                {# first check if runDay = today #}
                {% if currentDay == runDay %}
                    {# are we passed the scheduled time? #}
                    {% if starttime() < now().time().strftime("%H:%M") %}
                        {# than we need to fake tomorrow #}
                        {% set currentDay = (currentDay + 1) |int %}
                        {# and calculate new runDay in case we have a list of multiple run days in in a week #}
                        {% if states.input_select.zone_2_schedule.state == "Tue/Thu/Sat" %}
                            {% set runDay = tuethusat() |int -%}
                        {% elif states.input_select.zone_2_schedule.state == "Mon/Wed/Fri/Sun" %}
                            {% set runDay = monwedfrisun() |int %} 
                        {% elif states.input_select.zone_2_schedule.state == "Every Day" %}
                            {% set runDay = currentDay |int %} 
                        {% endif %}
                    {% endif %}
                {% endif %}
                {# Now we can determine next runDate base on now().weekday() and not currentDay as that can be set to fake tomorrow #}	
                {% if currentDay <= runDay %}
                    {% set Days = runDay - now().weekday() |int %}
                {% else %}
                    {% set Days = runDay + 7 - now().weekday() |int %}
                {% endif %}
                {% set runDate = ((as_timestamp(now()) + (86400 * Days)) | timestamp_local) %}
                {# we also want to show the weekday of the next date #}
                {% set weekdayList = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] %}
                {% if now().weekday()+ Days < 7 %}
                    {% set weekday = weekdayList[(now().weekday()+ Days)] %}
                {% else %}
                    {% set weekday = weekdayList[(now().weekday()+ Days)- 7] %}
                {% endif %} 
            {% endif %}
            {# all done #}
            {# set states.sensor.next_run_date_zone_2.state = runDate #}
            {% if runDay == 9 %}
                {# schedule not active #}
                {{runDate}}
            {% else %}  
                {{weekday}}, {{runDate[8:10]}}-{{runDate[5:7]}}-{{runDate[0:4]}} at {{starttime()}}
            {% endif %}

#### zone 3 sensors ####

      next_run_zone_3:
         friendly_name: 'Next Run'
         icon_template: mdi:calendar-clock
         value_template: >
            {# runDay set to 9 = Not Set #}
            {% set runDay = 9 |int %}
            {# Set todays day #}
            {% set currentDay = now().weekday() |int %}
            {# calculate starttime #}
            {%- macro starttime() -%}
                {%- if states.input_number.zone_3_hour.state|length < 4-%}
                    {{0}}
                {%- endif -%}
                {{states.input_number.zone_3_hour.state | int  }}{{':'}}
                {%- if states.input_number.zone_3_minutes.state|length < 4 -%}
                   {{0}}
                {%- endif -%}
                {{ states.input_number.zone_3_minutes.state | int }}
            {%- endmacro -%}
            {% set StartTime = starttime() %}
            {%- macro tuethusat() -%}
                {%- if currentDay <= 1 -%}
                    {{1}}  
                {%- elif  currentDay <= 3 -%}
                    {{3}}
                {%- elif  currentDay <= 5 -%}
                    {{5}}
                {%- elif  currentDay <= 6 -%}
                    {{1}}
                {%- endif -%}
            {%- endmacro -%}
            {%- macro monwedfrisun() -%}
                {%- if currentDay == 0 -%}
                    {{0}}  
                {%- elif  currentDay <= 2 -%}
                    {{2}}
                {%- elif  currentDay <= 4 -%}
                    {{4}}
                {%- elif  currentDay <= 6 -%}
                    {{6}}	
                {%- endif -%}
            {%- endmacro -%}
            {# set configured runDay from input_select #}
            {% if states.input_select.zone_3_schedule.state == "Monday" %}
                {% set runDay = 0 |int %}
            {% elif states.input_select.zone_3_schedule.state == "Tuesday" %}
                {% set runDay = 1 |int %}
            {% elif states.input_select.zone_3_schedule.state == "Wednesday" %}
                {% set runDay = 2 |int %}
            {% elif states.input_select.zone_3_schedule.state == "Thursday" %}
                {% set runDay = 3 |int %}
                {% elif states.input_select.zone_3_schedule.state == "Friday" %}
                {% set runDay = 4 |int %}
            {% elif states.input_select.zone_3_schedule.state == "Saturday" %}
                {% set runDay = 5 |int %}
            {% elif states.input_select.zone_3_schedule.state == "Sunday" %}
                {% set runDay = 6 |int %}
            {% elif states.input_select.zone_3_schedule.state == "Tue/Thu/Sat" %}
                {% set runDay = tuethusat() |int -%}
            {% elif states.input_select.zone_3_schedule.state == "Mon/Wed/Fri/Sun" %}
                {% set runDay = monwedfrisun() |int %}  
            {% elif states.input_select.zone_3_schedule.state == "Every Day" %}
                {% set runDay = currentDay |int %}     
            {% endif %} 
            {# determine the next runday #}
            {% if runDay == 9 %}
                {# schedule not active #}
                {% set runDate = "Not set" %}
            {% else %}
                {# schedule is active so determine next run #}
                {# first check if runDay = today #}
                {% if currentDay == runDay %}
                    {# are we passed the scheduled time? #}
                    {% if starttime() < now().time().strftime("%H:%M") %}
                        {# than we need to fake tomorrow #}
                        {% set currentDay = (currentDay + 1) |int %}
                        {# and calculate new runDay in case we have a list of multiple run days in in a week #}
                        {% if states.input_select.zone_3_schedule.state == "Tue/Thu/Sat" %}
                            {% set runDay = tuethusat() |int -%}
                        {% elif states.input_select.zone_3_schedule.state == "Mon/Wed/Fri/Sun" %}
                            {% set runDay = monwedfrisun() |int %} 
                        {% elif states.input_select.zone_3_schedule.state == "Every Day" %}
                            {% set runDay = currentDay |int %} 
                        {% endif %}
                    {% endif %}
                {% endif %}
                {# Now we can determine next runDate base on now().weekday() and not currentDay as that can be set to fake tomorrow #}	
                {% if currentDay <= runDay %}
                    {% set Days = runDay - now().weekday() |int %}
                {% else %}
                    {% set Days = runDay + 7 - now().weekday() |int %}
                {% endif %}
                {% set runDate = ((as_timestamp(now()) + (86400 * Days)) | timestamp_local) %}
                {# we also want to show the weekday of the next date #}
                {% set weekdayList = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] %}
                {% if now().weekday()+ Days < 7 %}
                    {% set weekday = weekdayList[(now().weekday()+ Days)] %}
                {% else %}
                    {% set weekday = weekdayList[(now().weekday()+ Days)- 7] %}
                {% endif %} 
            {% endif %}
            {# all done #}
            {# set states.sensor.next_run_date_zone_3.state = runDate #}
            {% if runDay == 9 %}
                {# schedule not active #}
                {{runDate}}
            {% else %}  
                {{weekday}}, {{runDate[8:10]}}-{{runDate[5:7]}}-{{runDate[0:4]}} at {{starttime()}}
            {% endif %}

#### zone 4 next run ####

      next_run_zone_4:
         friendly_name: 'Next Run'
         icon_template: mdi:calendar-clock
         value_template: >
            {# runDay set to 9 = Not Set #}
            {% set runDay = 9 |int %}
            {# Set todays day #}
            {% set currentDay = now().weekday() |int %}
            {# calculate starttime #}
            {%- macro starttime() -%}
                {%- if states.input_number.zone_4_hour.state|length < 4-%}
                    {{0}}
                {%- endif -%}
                {{states.input_number.zone_4_hour.state | int  }}{{':'}}
                {%- if states.input_number.zone_4_minutes.state|length < 4 -%}
                   {{0}}
                {%- endif -%}
                {{ states.input_number.zone_4_minutes.state | int }}
            {%- endmacro -%}
            {% set StartTime = starttime() %}
            {%- macro tuethusat() -%}
                {%- if currentDay <= 1 -%}
                    {{1}}  
                {%- elif  currentDay <= 3 -%}
                    {{3}}
                {%- elif  currentDay <= 5 -%}
                    {{5}}
                {%- elif  currentDay <= 6 -%}
                    {{1}}
                {%- endif -%}
            {%- endmacro -%}
            {%- macro monwedfrisun() -%}
                {%- if currentDay == 0 -%}
                    {{0}}  
                {%- elif  currentDay <= 2 -%}
                    {{2}}
                {%- elif  currentDay <= 4 -%}
                    {{4}}
                {%- elif  currentDay <= 6 -%}
                    {{6}}	
                {%- endif -%}
            {%- endmacro -%}
            {# set configured runDay from input_select #}
            {% if states.input_select.zone_4_schedule.state == "Monday" %}
                {% set runDay = 0 |int %}
            {% elif states.input_select.zone_4_schedule.state == "Tuesday" %}
                {% set runDay = 1 |int %}
            {% elif states.input_select.zone_4_schedule.state == "Wednesday" %}
                {% set runDay = 2 |int %}
            {% elif states.input_select.zone_4_schedule.state == "Thursday" %}
                {% set runDay = 3 |int %}
                {% elif states.input_select.zone_4_schedule.state == "Friday" %}
                {% set runDay = 4 |int %}
            {% elif states.input_select.zone_4_schedule.state == "Saturday" %}
                {% set runDay = 5 |int %}
            {% elif states.input_select.zone_4_schedule.state == "Sunday" %}
                {% set runDay = 6 |int %}
            {% elif states.input_select.zone_4_schedule.state == "Tue/Thu/Sat" %}
                {% set runDay = tuethusat() |int -%}
            {% elif states.input_select.zone_4_schedule.state == "Mon/Wed/Fri/Sun" %}
                {% set runDay = monwedfrisun() |int %}  
            {% elif states.input_select.zone_4_schedule.state == "Every Day" %}
                {% set runDay = currentDay |int %}     
            {% endif %} 
            {# determine the next runday #}
            {% if runDay == 9 %}
                {# schedule not active #}
                {% set runDate = "Not set" %}
            {% else %}
                {# schedule is active so determine next run #}
                {# first check if runDay = today #}
                {% if currentDay == runDay %}
                    {# are we passed the scheduled time? #}
                    {% if starttime() < now().time().strftime("%H:%M") %}
                        {# than we need to fake tomorrow #}
                        {% set currentDay = (currentDay + 1) |int %}
                        {# and calculate new runDay in case we have a list of multiple run days in in a week #}
                        {% if states.input_select.zone_4_schedule.state == "Tue/Thu/Sat" %}
                            {% set runDay = tuethusat() |int -%}
                        {% elif states.input_select.zone_4_schedule.state == "Mon/Wed/Fri/Sun" %}
                            {% set runDay = monwedfrisun() |int %} 
                        {% elif states.input_select.zone_4_schedule.state == "Every Day" %}
                            {% set runDay = currentDay |int %} 
                        {% endif %}
                    {% endif %}
                {% endif %}
                {# Now we can determine next runDate base on now().weekday() and not currentDay as that can be set to fake tomorrow #}	
                {% if currentDay <= runDay %}
                    {% set Days = runDay - now().weekday() |int %}
                {% else %}
                    {% set Days = runDay + 7 - now().weekday() |int %}
                {% endif %}
                {% set runDate = ((as_timestamp(now()) + (86400 * Days)) | timestamp_local) %}
                {# we also want to show the weekday of the next date #}
                {% set weekdayList = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] %}
                {% if now().weekday()+ Days < 7 %}
                    {% set weekday = weekdayList[(now().weekday()+ Days)] %}
                {% else %}
                    {% set weekday = weekdayList[(now().weekday()+ Days)- 7] %}
                {% endif %} 
            {% endif %}
            {# all done #}
            {# set states.sensor.next_run_date_zone_4.state = runDate #}
            {% if runDay == 9 %}
                {# schedule not active #}
                {{runDate}}
            {% else %}  
                {{weekday}}, {{runDate[8:10]}}-{{runDate[5:7]}}-{{runDate[0:4]}} at {{starttime()}}
            {% endif %}

switch:

#### Sonoff Irrigation (ch4 pro R2) ####

  - platform: mqtt
    name: "Zone 1"
    command_topic: "cmnd/irrigation/power1"
    state_topic: "stat/irrigation/POWER1"
    qos: 1
    payload_on: "ON"
    payload_off: "OFF"
    retain: true

  - platform: mqtt
    name: "Zone 2"
    command_topic: "cmnd/irrigation/power2"
    state_topic: "stat/irrigation/POWER2"
    qos: 1
    payload_on: "ON"
    payload_off: "OFF"
    retain: true

  - platform: mqtt
    name: "Zone 3"
    command_topic: "cmnd/irrigation/power3"
    state_topic: "stat/irrigation/POWER3"
    qos: 1
    payload_on: "ON"
    payload_off: "OFF"
    retain: true

  - platform: mqtt
    name: "Zone 4"
    command_topic: "cmnd/irrigation/power4"
    state_topic: "stat/irrigation/POWER4"
    qos: 1
    payload_on: "ON"
    payload_off: "OFF"
    retain: true

input_number:

#### Irrigation ####
  
  zone_1_hour:
    name: Start Hour
    icon: mdi:clock
    initial: 4.00
    min: 0
    max: 23
    step: 1
  zone_1_minutes:
    name: Start Minutes
    icon: mdi:clock
    initial: 30.00
    min: 0
    max: 55
    step: 5
  zone_1_duration:
    name: Duration
    icon: mdi:timer-sand
    initial: 30.00
    min: 0
    max: 55
    step: 5 

  zone_2_hour:
    name: Start Hour
    icon: mdi:clock
    initial: 4.00
    min: 0
    max: 23
    step: 1
  zone_2_minutes:
    name: Start Minutes
    icon: mdi:clock
    initial: 30.00
    min: 0
    max: 55
    step: 5
  zone_2_duration:
    name: Duration
    icon: mdi:timer-sand
    initial: 30.00
    min: 0
    max: 55
    step: 5
    
  zone_3_hour:
    name: Start Hour
    icon: mdi:clock
    initial: 5.00
    min: 0
    max: 23
    step: 1
  zone_3_minutes:
    name: Start Minutes
    icon: mdi:clock
    initial: 30.00
    min: 0
    max: 55
    step: 5
  zone_3_duration:
    name: Duration
    icon: mdi:timer-sand
    initial: 30.00
    min: 0
    max: 55
    step: 5
    
  zone_4_hour:
    name: Start Hour
    icon: mdi:clock
    initial: 5.00
    min: 0
    max: 23
    step: 1
  zone_4_minutes:
    name: Start Minutes
    icon: mdi:clock
    initial: 30.00
    min: 0
    max: 55
    step: 5
  zone_4_duration:
    name: Duration
    icon: mdi:timer-sand
    initial: 30.00
    min: 0
    max: 55
    step: 5 

input_select:

#### Irrigation ####

  zone_1_schedule:
    name: Schedule
    options:
      - Zone Off
      - Every Day
      - Tue/Thu/Sat
      - Mon/Wed/Fri/Sun
      - Monday
      - Tuesday
      - Wednesday
      - Thursday
      - Friday
      - Saturday
      - Sunday
    initial: Tue/Thu/Sat
    icon: mdi:calendar  

  zone_2_schedule:
    name: Schedule
    options:
      - Zone Off
      - Tue/Thu/Sat
      - Mon/Wed/Fri/Sun
      - Every Day
      - Monday
      - Tuesday
      - Wednesday
      - Thursday
      - Friday
      - Saturday
      - Sunday
    initial: Tue/Thu/Sat
    icon: mdi:calendar
    
  zone_3_schedule:
    name: Schedule
    options:
      - Zone Off
      - Tue/Thu/Sat
      - Mon/Wed/Fri/Sun
      - Every Day
      - Monday
      - Tuesday
      - Wednesday
      - Thursday
      - Friday
      - Saturday
      - Sunday
    initial: Tue/Thu/Sat
    icon: mdi:calendar
    
  zone_4_schedule:
    name: Schedule
    options:
      - Zone Off
      - Tue/Thu/Sat
      - Mon/Wed/Fri/Sun
      - Every Day
      - Monday
      - Tuesday
      - Wednesday
      - Thursday
      - Friday
      - Saturday
      - Sunday
    initial: Tue/Thu/Sat
    icon: mdi:calendar

groups.yaml

#### irrigation ####
irrigation:
  view: yes
  name: Irrigation
  icon: mdi:water-pump
  entities:
  - group.zone_1
  - group.zone_2 
  - group.zone_3
  - group.zone_4

zone_1_valve:
  name: Zone 1
  control: hidden
  entities:
  - switch.zone_1
    
Zone_1:
  name: Zone 1
  control: hidden
  entities:
  - sensor.next_run_zone_1
  - input_select.zone_1_schedule
  - input_number.zone_1_hour
  - input_number.zone_1_minutes
  - input_number.zone_1_duration
  - group.zone_1_valve

zone_2_valve:
  name: Zone 2
  control: hidden
  entities:
  - switch.zone_2

Zone_2:
  name: Zone 2
  control: hidden
  entities:
  - sensor.next_run_zone_2
  - input_select.zone_2_schedule
  - input_number.zone_2_hour
  - input_number.zone_2_minutes
  - input_number.zone_2_duration
  - group.zone_2_valve

zone_3_valve:
  name: Zone 3
  control: hidden
  entities:
  - switch.zone_3

Zone_3:
  name: Zone 3
  control: hidden
  entities:
  - sensor.next_run_zone_3
  - input_select.zone_3_schedule
  - input_number.zone_3_hour
  - input_number.zone_3_minutes
  - input_number.zone_3_duration
  - group.zone_3_valve

zone_4_valve:
  name: Zone 4
  control: hidden
  entities:
  - switch.zone_4

Zone_4:
  name: Zone 4
  control: hidden
  entities:
  - sensor.next_run_zone_4
  - input_select.zone_4_schedule
  - input_number.zone_4_hour
  - input_number.zone_4_minutes
  - input_number.zone_4_duration
  - group.zone_4_valve
4 Likes

Node-red xml (I’m not sure if i did this correctly). It was too long to put it in the first post.

[{"id":"b5b4a7b.da98f58","type":"tab","label":"Sprinker","disabled":false,"info":""},{"id":"9562a11f.2a4a7","type":"delay","z":"b5b4a7b.da98f58","name":"","pauseType":"delayv","timeout":"1","timeoutUnits":"hours","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1300,"y":680,"wires":[["43c68a19.2de0d4"]]},{"id":"289df454.03776c","type":"api-current-state","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","halt_if":"","override_topic":false,"override_payload":false,"entity_id":"input_number.zone_1_duration","x":650,"y":680,"wires":[["29ab2e3b.ecb8b2"]],"outputLabels":["msg.delay"]},{"id":"ee3dd1f1.c68d68","type":"change","z":"b5b4a7b.da98f58","name":"","rules":[{"t":"move","p":"payload","pt":"msg","to":"delay","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1120,"y":680,"wires":[["9562a11f.2a4a7"]]},{"id":"29ab2e3b.ecb8b2","type":"function","z":"b5b4a7b.da98f58","name":"convert time","func":"msg.payload = parseFloat(msg.payload) * 60000;\nreturn msg;","outputs":1,"noerr":0,"x":930,"y":680,"wires":[["ee3dd1f1.c68d68"]]},{"id":"5a19889d.e0a81","type":"delay","z":"b5b4a7b.da98f58","name":"","pauseType":"delayv","timeout":"5","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1300,"y":800,"wires":[["f5a2de91.249458"]]},{"id":"7deffa20.c4968c","type":"api-current-state","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","halt_if":"","override_topic":false,"override_payload":false,"entity_id":"input_number.zone_2_duration","x":650,"y":800,"wires":[["83a74d3e.ae794"]],"outputLabels":["msg.delay"]},{"id":"d425dfca.c4a5e8","type":"change","z":"b5b4a7b.da98f58","name":"","rules":[{"t":"move","p":"payload","pt":"msg","to":"delay","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1120,"y":800,"wires":[["5a19889d.e0a81"]]},{"id":"d1c21fa1.eaed8","type":"delay","z":"b5b4a7b.da98f58","name":"","pauseType":"delayv","timeout":"5","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1300,"y":920,"wires":[["796ab715.5c41a"]]},{"id":"eaf6e554.f57a68","type":"api-current-state","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","halt_if":"","override_topic":false,"override_payload":false,"entity_id":"input_number.zone_3_duration","x":650,"y":920,"wires":[["25f0d0bd.dcc"]],"outputLabels":["msg.delay"]},{"id":"96b3e6c.ef0d818","type":"change","z":"b5b4a7b.da98f58","name":"","rules":[{"t":"move","p":"payload","pt":"msg","to":"delay","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1120,"y":920,"wires":[["d1c21fa1.eaed8"]]},{"id":"1ca174ad.8bfa1b","type":"delay","z":"b5b4a7b.da98f58","name":"","pauseType":"delayv","timeout":"5","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1300,"y":1040,"wires":[["d3648e94.d9bb18"]]},{"id":"8beb01cd.f477a8","type":"api-current-state","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","halt_if":"","override_topic":false,"override_payload":false,"entity_id":"input_number.zone_4_duration","x":650,"y":1040,"wires":[["75b6dd0d.0468ec"]],"outputLabels":["msg.delay"]},{"id":"627ce21.c87981c","type":"change","z":"b5b4a7b.da98f58","name":"","rules":[{"t":"move","p":"payload","pt":"msg","to":"delay","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1120,"y":1040,"wires":[["1ca174ad.8bfa1b"]]},{"id":"43c68a19.2de0d4","type":"api-call-service","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","service_domain":"switch","service":"turn_off","data":"{\"entity_id\": \"switch.zone_1\"}","mergecontext":"","x":1480,"y":680,"wires":[[]]},{"id":"f5a2de91.249458","type":"api-call-service","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","service_domain":"switch","service":"turn_off","data":"{\"entity_id\": \"switch.zone_2\"}","mergecontext":"","x":1480,"y":800,"wires":[[]]},{"id":"796ab715.5c41a","type":"api-call-service","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","service_domain":"switch","service":"turn_off","data":"{\"entity_id\": \"switch.zone_3\"}","mergecontext":"","x":1480,"y":920,"wires":[[]]},{"id":"d3648e94.d9bb18","type":"api-call-service","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","service_domain":"switch","service":"turn_off","data":"{\"entity_id\": \"switch.zone_4\"}","mergecontext":"","x":1480,"y":1040,"wires":[[]]},{"id":"83a74d3e.ae794","type":"function","z":"b5b4a7b.da98f58","name":"convert time","func":"msg.payload = parseFloat(msg.payload) * 60000;\nreturn msg;","outputs":1,"noerr":0,"x":930,"y":800,"wires":[["d425dfca.c4a5e8"]]},{"id":"25f0d0bd.dcc","type":"function","z":"b5b4a7b.da98f58","name":"convert time","func":"msg.payload = parseFloat(msg.payload) * 60000;\nreturn msg;","outputs":1,"noerr":0,"x":930,"y":920,"wires":[["96b3e6c.ef0d818"]]},{"id":"75b6dd0d.0468ec","type":"function","z":"b5b4a7b.da98f58","name":"convert time","func":"msg.payload = parseFloat(msg.payload) * 60000;\nreturn msg;","outputs":1,"noerr":0,"x":930,"y":1040,"wires":[["627ce21.c87981c"]]},{"id":"74ca2230.80f044","type":"api-call-service","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","service_domain":"switch","service":"turn_on","data":"{\"entity_id\": \"switch.zone_1\"}","mergecontext":"","x":750,"y":220,"wires":[[]]},{"id":"e5e7b83c.ab3238","type":"api-call-service","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","service_domain":"switch","service":"turn_on","data":"{\"entity_id\": \"switch.zone_2\"}","mergecontext":"","x":750,"y":340,"wires":[[]]},{"id":"af901642.e4d3","type":"api-call-service","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","service_domain":"switch","service":"turn_on","data":"{\"entity_id\": \"switch.zone_3\"}","mergecontext":"","x":750,"y":460,"wires":[[]]},{"id":"ad9245ca.175148","type":"api-call-service","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","service_domain":"switch","service":"turn_on","data":"{\"entity_id\": \"switch.zone_4\"}","mergecontext":"","x":750,"y":580,"wires":[[]]},{"id":"60f273e4.3832ac","type":"api-render-template","z":"b5b4a7b.da98f58","name":"Zone 1","server":"918ecac2.724538","template":"    {% if states.sensor.date_time.state == states.sensor.next_run_zone_1.state %}on\n    {%-else %} off {% endif %}","x":410,"y":220,"wires":[["f18244cf.db65"]]},{"id":"76a2873c.422e5","type":"server-state-changed","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","entityidfilter":"sensor.time","entityidfiltertype":"substring","haltifstate":"","x":160,"y":400,"wires":[["60f273e4.3832ac","55637876.45e898","8dd78296.7d7208","70f02fff.8687e"]]},{"id":"55637876.45e898","type":"api-render-template","z":"b5b4a7b.da98f58","name":"Zone 2","server":"918ecac2.724538","template":"        {% if states.sensor.date_time.state == states.sensor.next_run_zone_2.state %}on\n        {%-else %} off {% endif %}","x":410,"y":340,"wires":[["dc03350f.f1bac8"]]},{"id":"8dd78296.7d7208","type":"api-render-template","z":"b5b4a7b.da98f58","name":"Zone 3","server":"918ecac2.724538","template":"        {% if states.sensor.date_time.state == states.sensor.next_run_zone_3.state %}on\n        {%-else %} off {% endif %}","x":410,"y":460,"wires":[["5563681c.5e0a38"]]},{"id":"70f02fff.8687e","type":"api-render-template","z":"b5b4a7b.da98f58","name":"Zone 4","server":"918ecac2.724538","template":"        {% if states.sensor.date_time.state == states.sensor.next_run_zone_4.state %}on\n        {%-else %} off {% endif %}","x":410,"y":580,"wires":[["1584545.a83e22c"]]},{"id":"f18244cf.db65","type":"switch","z":"b5b4a7b.da98f58","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":570,"y":220,"wires":[["74ca2230.80f044"]]},{"id":"dc03350f.f1bac8","type":"switch","z":"b5b4a7b.da98f58","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":570,"y":340,"wires":[["e5e7b83c.ab3238"]]},{"id":"5563681c.5e0a38","type":"switch","z":"b5b4a7b.da98f58","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":570,"y":460,"wires":[["af901642.e4d3"]]},{"id":"1584545.a83e22c","type":"switch","z":"b5b4a7b.da98f58","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":570,"y":580,"wires":[["ad9245ca.175148"]]},{"id":"935fb0db.903fe","type":"server-state-changed","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","entityidfilter":"switch.zone_1","entityidfiltertype":"substring","haltifstate":"","x":160,"y":680,"wires":[["14fc992c.84954f"]]},{"id":"ddaf5000.bf8eb8","type":"server-state-changed","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","entityidfilter":"switch.zone_2","entityidfiltertype":"substring","haltifstate":"","x":160,"y":800,"wires":[["f83166ce.89ebb8"]]},{"id":"76dc9da7.66332c","type":"server-state-changed","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","entityidfilter":"switch.zone_3","entityidfiltertype":"substring","haltifstate":"","x":160,"y":920,"wires":[["3b1449d8.68e546"]]},{"id":"b6293596.bb02d","type":"server-state-changed","z":"b5b4a7b.da98f58","name":"","server":"918ecac2.724538","entityidfilter":"switch.zone_4","entityidfiltertype":"substring","haltifstate":"","x":160,"y":1040,"wires":[["c9001360.e175a8"]]},{"id":"14fc992c.84954f","type":"switch","z":"b5b4a7b.da98f58","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":390,"y":680,"wires":[["289df454.03776c"]]},{"id":"f83166ce.89ebb8","type":"switch","z":"b5b4a7b.da98f58","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":390,"y":800,"wires":[["7deffa20.c4968c"]]},{"id":"3b1449d8.68e546","type":"switch","z":"b5b4a7b.da98f58","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":390,"y":920,"wires":[["eaf6e554.f57a68"]]},{"id":"c9001360.e175a8","type":"switch","z":"b5b4a7b.da98f58","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":390,"y":1040,"wires":[["8beb01cd.f477a8"]]},{"id":"918ecac2.724538","type":"server","z":"","name":"Home Assistant","url":"http://localhost:8123","pass":""}]
2 Likes

Really nice project @enosrevlah

I’m wondering how to make some more control.

I’d like to check, when starting a zone, if there is another one active, and in this case don’t proceed and send an alert message.
Do you think is easy to do? I’m a novice in Node-Red and it would be great if you have some suggestions…

Thanks

There is a node that will get the state that home assistant has for a device. When the sprinkler system gets the on message you can send that to the get current state node, and it will send a payload of ‘on’ or ‘off’. You can filter that with a switch node that will send the message forward if any of the payloads are == ‘on’. I’m not sure what kind of message you want to send and to where/what so your kind of on your own there.

If you want something more elegant you can use the get template node which is the templating that home assistant uses. But I liked node red because you dont have to deal with that in many cases. I would not go through that hassle if you want a simple message that tells you more than one zone is on. If you want the message to tell you which zone turned on and the other zones that are on, and only send it if two zones are on at the same time. Your kind of on your own. But it’s definitely possible.

Oh and the debug and inject node are going to be your best friend. The picture below shows what I would do without a template. The section in the box would get the information for you. and the switch will only send it forward if any of the payloads are ‘on’. you can put that after the switch_on node if you wanted and that should work.

Edit: Spelling / Blurry picture

Thanks @enosrevlah

Another question

I’m using a Nodemcu with ESPEasy on board.

I have unknown as status using mqtt.

my mqtt config is:

 - platform: mqtt
    name: "Zone 1"
    command_topic: "esp01/gpio/4"
    state_topic: "esp01/relay1/State"
    qos: 1
    payload_on: 1
    payload_off: 0
    retain: true

but I get “unknown”.
If go on MQTT Lens to see this topic

and publish 1 or 0 to irriga/gpio/4 I get the correct answer (I think).

What can be wrong?

Thanks

Node red gives you unknown? Can you control it in Hass?

No, not in node-red, in Hass

16

And this is how is defined into ESPEasy

It might be that your using 1 and 0 for off and on that’s why it might be unknown. But I’m just guessing what does the state say for that in the states menu.

I wrote the following before thinking about the states thing.

Without seeing your config it could be this. In the groups.yaml you will have four of these

  zone_1_valve:
  name: Zone 1
  control: hidden
  entities:
  - switch.zone_1

These are then nested in

Zone_1:
  name: Zone 1
  control: hidden
  entities:
  - sensor.next_run_zone_1
  - input_select.zone_1_schedule
  - input_number.zone_1_hour
  - input_number.zone_1_minutes
  - input_number.zone_1_duration
  - group.zone_1_valve<-----------------------

This lets you see the state but not the button. I did this to prevent turning it on, on accident. if you click it it should open a card with the button.

switch.zone_1 is the name of the switch I used for the first relay. Here is the config for that switch/relay on the sonoff.

  - platform: mqtt
    name: "Zone 1"
    command_topic: "cmnd/irrigation/power1"
    state_topic: "stat/irrigation/POWER1"
    qos: 1
    payload_on: "ON"
    payload_off: "OFF"
    retain: true

This is it in the states menu.

If the entity in zone_1_valve doesn’t match the entity for that relay then that might be the issue.

If everything works you could just remove the group that has the single switch and put switch.zone_# in the the appropriate zone_# group.

If everything seems correct then I’m not sure to be honest.

Thanks @enosrevlah
Probably I found my issue, were the name of the switches.
I changed to Zona instead of Zone and still used switch.zone_x to refer to them.
That’s why was “Unknown” instead of “Unavailable”.

Now all is working fine!

thanks for your awesome sprinkler sys. i know that is a long time since you post , but i need help in make automation with yaml or over node red in detail, i’m newly with node red

Thanks again

This has changed I did it all in node red, My sprinkler ran for three hours because my WiFi went out after one of the zones had started. This new version sends a command to Tasmota to set the timer function. The only thing I use home assistant for is to check if the sprinkler ran using the history component.

Node Red Flow

[{"id":"e43c108b.0b9ea","type":"tab","label":"Sprinker System","disabled":false,"info":""},{"id":"2b2eb164.1a7a1e","type":"mqtt out","z":"e43c108b.0b9ea","name":"","topic":"cmnd/irrigation1/backlog","qos":"","retain":"","broker":"35f4689a.adc1c8","x":1630,"y":400,"wires":[]},{"id":"823a78e9.5fad7","type":"function","z":"e43c108b.0b9ea","name":"Start","func":"msg.payload = \"power1 1\"\nreturn msg;","outputs":1,"noerr":0,"x":1430,"y":400,"wires":[["2b2eb164.1a7a1e"]]},{"id":"a6062837.9d9d38","type":"function","z":"e43c108b.0b9ea","name":"Start","func":"msg.payload = \"power2 1\"\nreturn msg;","outputs":1,"noerr":0,"x":1430,"y":480,"wires":[["b39e22ac.5bdb58"]]},{"id":"9707137e.87c568","type":"function","z":"e43c108b.0b9ea","name":"Start","func":"msg.payload = \"power3 1\"\nreturn msg;","outputs":1,"noerr":0,"x":1430,"y":560,"wires":[["fe27acb6.a603d"]]},{"id":"89c4016.31bc68","type":"function","z":"e43c108b.0b9ea","name":"Start","func":"msg.payload = \"power4 1\"\nreturn msg;","outputs":1,"noerr":0,"x":1430,"y":640,"wires":[["e29d45f8.2f5668"]]},{"id":"b39e22ac.5bdb58","type":"mqtt out","z":"e43c108b.0b9ea","name":"","topic":"cmnd/irrigation1/backlog","qos":"","retain":"","broker":"35f4689a.adc1c8","x":1630,"y":480,"wires":[]},{"id":"fe27acb6.a603d","type":"mqtt out","z":"e43c108b.0b9ea","name":"","topic":"cmnd/irrigation1/backlog","qos":"","retain":"","broker":"35f4689a.adc1c8","x":1630,"y":560,"wires":[]},{"id":"e29d45f8.2f5668","type":"mqtt out","z":"e43c108b.0b9ea","name":"","topic":"cmnd/irrigation1/backlog","qos":"","retain":"","broker":"35f4689a.adc1c8","x":1630,"y":640,"wires":[]},{"id":"543dea7c.b26274","type":"function","z":"e43c108b.0b9ea","name":"Start","func":"msg.payload = \"power1 1\"\nreturn msg;","outputs":1,"noerr":0,"x":1430,"y":720,"wires":[["e777e016.eed618"]]},{"id":"7ea0d77d.6076e","type":"function","z":"e43c108b.0b9ea","name":"Start","func":"msg.payload = \"power2 1\"\nreturn msg;","outputs":1,"noerr":0,"x":1430,"y":800,"wires":[["a9e6d6ac.a52a4"]]},{"id":"e777e016.eed618","type":"mqtt out","z":"e43c108b.0b9ea","name":"","topic":"cmnd/irrigation2/backlog","qos":"","retain":"","broker":"35f4689a.adc1c8","x":1630,"y":720,"wires":[]},{"id":"a9e6d6ac.a52a4","type":"mqtt out","z":"e43c108b.0b9ea","name":"","topic":"cmnd/irrigation2/backlog","qos":"","retain":"","broker":"35f4689a.adc1c8","x":1630,"y":800,"wires":[]},{"id":"df750753.9b1388","type":"function","z":"e43c108b.0b9ea","name":"Set Delay","func":"msg.delay = parseFloat(msg.payload)*60000\nreturn msg;","outputs":1,"noerr":0,"x":530,"y":480,"wires":[["f8049113.ce2be8"]]},{"id":"e99321ac.f465c","type":"comment","z":"e43c108b.0b9ea","name":"Adjusting \"Season\" and start time (INFO)","info":"[On time] \n\nSet time to start sprinkler automation.\n\n[days] \n\nTick days of the week you want it to run\nfor that season.\n\n[months] \n\nSelect the months for that season.\n\nDO NOT OVERLAP MONTHS BETWEEN SEASONS\n\n[suspend Schedule] \n\nStops the Spinkler system from starting that season.\n\nDO NOT ADJUST ANYTHING ELSE\nUNLESS YOU KNOW WHAT YOU ARE DOING.","x":330,"y":240,"wires":[]},{"id":"92dc4df3.4472f8","type":"bigtimer","z":"e43c108b.0b9ea","outtopic":"","outpayload1":"winter","outpayload2":"off","name":"Winter","lat":"35.5532","lon":"-117.6765","starttime":"120","endtime":"10001","startoff":"0","endoff":"0","offs":0,"outtext1":"","outtext2":"","timeout":1440,"sun":false,"mon":false,"tue":true,"wed":false,"thu":true,"fri":false,"sat":true,"jan":true,"feb":true,"mar":false,"apr":false,"may":false,"jun":false,"jul":false,"aug":false,"sep":false,"oct":false,"nov":false,"dec":true,"day1":0,"month1":0,"day2":0,"month2":0,"day3":0,"month3":0,"day4":0,"month4":0,"day5":0,"month5":0,"day6":"","month6":"","d1":0,"w1":0,"d2":0,"w2":0,"d3":0,"w3":0,"d4":0,"w4":0,"d5":0,"w5":0,"d6":"","w6":"","xday1":"","xmonth1":"","xday2":"","xmonth2":"","xday3":"","xmonth3":"","xday4":"","xmonth4":"","xday5":"","xmonth5":"","xday6":"","xmonth6":"","xd1":"","xw1":"","xd2":"","xw2":"","xd3":"","xw3":"","xd4":"","xw4":"","xd5":"","xw5":"","xd6":"","xw6":"","suspend":false,"random":false,"repeat":false,"atstart":true,"odd":false,"even":false,"x":310,"y":480,"wires":[["e5f0a817.dbb2e8"],[],[]]},{"id":"93536237.a3cb38","type":"bigtimer","z":"e43c108b.0b9ea","outtopic":"","outpayload1":"fall","outpayload2":"off","name":"Fall","lat":"35.5532","lon":"-117.6765","starttime":"120","endtime":"10001","startoff":"0","endoff":"0","offs":0,"outtext1":"","outtext2":"","timeout":1440,"sun":false,"mon":false,"tue":true,"wed":false,"thu":true,"fri":false,"sat":true,"jan":false,"feb":false,"mar":false,"apr":false,"may":false,"jun":false,"jul":false,"aug":false,"sep":true,"oct":true,"nov":true,"dec":false,"day1":0,"month1":0,"day2":0,"month2":0,"day3":0,"month3":0,"day4":0,"month4":0,"day5":0,"month5":0,"day6":"","month6":"","d1":0,"w1":0,"d2":0,"w2":0,"d3":0,"w3":0,"d4":0,"w4":0,"d5":0,"w5":0,"d6":"","w6":"","xday1":"","xmonth1":"","xday2":"","xmonth2":"","xday3":"","xmonth3":"","xday4":"","xmonth4":"","xday5":"","xmonth5":"","xday6":"","xmonth6":"","xd1":"","xw1":"","xd2":"","xw2":"","xd3":"","xw3":"","xd4":"","xw4":"","xd5":"","xw5":"","xd6":"","xw6":"","suspend":false,"random":false,"repeat":true,"atstart":false,"odd":false,"even":false,"x":310,"y":420,"wires":[["e5f0a817.dbb2e8"],[],[]]},{"id":"b14653d.b392b3","type":"bigtimer","z":"e43c108b.0b9ea","outtopic":"","outpayload1":"spring","outpayload2":"off","name":"Spring","comment":"","lat":"35.5532","lon":"-117.6765","starttime":"120","endtime":"10001","startoff":"0","endoff":"0","offs":0,"outtext1":"","outtext2":"","timeout":1440,"sun":false,"mon":false,"tue":true,"wed":false,"thu":true,"fri":false,"sat":true,"jan":false,"feb":false,"mar":true,"apr":true,"may":true,"jun":false,"jul":false,"aug":false,"sep":false,"oct":false,"nov":false,"dec":false,"day1":0,"month1":0,"day2":0,"month2":0,"day3":0,"month3":0,"day4":0,"month4":0,"day5":0,"month5":0,"day6":"","month6":"","d1":0,"w1":0,"d2":0,"w2":0,"d3":0,"w3":0,"d4":0,"w4":0,"d5":0,"w5":0,"d6":"","w6":"","xday1":"","xmonth1":"","xday2":"","xmonth2":"","xday3":"","xmonth3":"","xday4":"","xmonth4":"","xday5":"","xmonth5":"","xday6":"","xmonth6":"","xd1":"","xw1":"","xd2":"","xw2":"","xd3":"","xw3":"","xd4":"","xw4":"","xd5":"","xw5":"","xd6":"","xw6":"","suspend":false,"random":false,"repeat":false,"atstart":false,"odd":false,"even":false,"x":300,"y":300,"wires":[["e5f0a817.dbb2e8"],[],[]]},{"id":"5d145cd7.0e8b5c","type":"bigtimer","z":"e43c108b.0b9ea","outtopic":"","outpayload1":"summer","outpayload2":"off","name":"Summer","comment":"","lat":"35.5532","lon":"-117.6765","starttime":"120","endtime":"10001","startoff":"0","endoff":"0","offs":0,"outtext1":"","outtext2":"","timeout":1440,"sun":false,"mon":false,"tue":true,"wed":false,"thu":true,"fri":false,"sat":true,"jan":false,"feb":false,"mar":false,"apr":false,"may":false,"jun":true,"jul":true,"aug":true,"sep":false,"oct":false,"nov":false,"dec":false,"day1":0,"month1":0,"day2":0,"month2":0,"day3":0,"month3":0,"day4":0,"month4":0,"day5":0,"month5":0,"day6":"","month6":"","d1":0,"w1":0,"d2":0,"w2":0,"d3":0,"w3":0,"d4":0,"w4":0,"d5":0,"w5":0,"d6":"","w6":"","xday1":"","xmonth1":"","xday2":"","xmonth2":"","xday3":"","xmonth3":"","xday4":"","xmonth4":"","xday5":"","xmonth5":"","xday6":"","xmonth6":"","xd1":"","xw1":"","xd2":"","xw2":"","xd3":"","xw3":"","xd4":"","xw4":"","xd5":"","xw5":"","xd6":"","xw6":"","suspend":false,"random":false,"repeat":false,"atstart":false,"odd":false,"even":false,"x":300,"y":360,"wires":[["e5f0a817.dbb2e8"],[],[]]},{"id":"b300353c.c5b8","type":"comment","z":"e43c108b.0b9ea","name":"Garage Door","info":"","x":950,"y":1920,"wires":[]},{"id":"d181062c.b285c","type":"change","z":"e43c108b.0b9ea","name":"Zone 2 Times","rules":[{"t":"change","p":"payload","pt":"msg","from":"summer","fromt":"str","to":"30","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"fall","fromt":"str","to":"15","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"winter","fromt":"str","to":"10","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"spring","fromt":"str","to":"15","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":1080,"y":480,"wires":[["1fb2564b.5356f2","63e02425.b5996c","ca27208a.0598"]]},{"id":"7eac7bfb.ce52f4","type":"change","z":"e43c108b.0b9ea","name":"Zone 3 Times","rules":[{"t":"change","p":"payload","pt":"msg","from":"summer","fromt":"str","to":"30","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"fall","fromt":"str","to":"15","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"winter","fromt":"str","to":"10","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"spring","fromt":"str","to":"15","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":1080,"y":560,"wires":[["9b685b0b.9b1608","96cea465.757268","84197c18.9e7ab8"]]},{"id":"9532845d.a79bd","type":"change","z":"e43c108b.0b9ea","name":"Zone 4 Times","rules":[{"t":"change","p":"payload","pt":"msg","from":"summer","fromt":"str","to":"30","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"fall","fromt":"str","to":"15","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"winter","fromt":"str","to":"10","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"spring","fromt":"str","to":"15","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":1080,"y":640,"wires":[["a39ad0bb.5b8e98","aa4d9ac2.820418","70e61390.a88f74"]]},{"id":"15b6bcb4.04992b","type":"change","z":"e43c108b.0b9ea","name":"Zone 5 Times","rules":[{"t":"change","p":"payload","pt":"msg","from":"summer","fromt":"str","to":"30","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"fall","fromt":"str","to":"15","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"winter","fromt":"str","to":"10","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"spring","fromt":"str","to":"15","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":1080,"y":720,"wires":[["7c4737ef.dc6a2","64f62e1b.ee444","2d79bc4.5e649c4"]]},{"id":"8f060cf7.e8d588","type":"change","z":"e43c108b.0b9ea","name":"Zone 6 Times","rules":[{"t":"change","p":"payload","pt":"msg","from":"summer","fromt":"str","to":"30","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"fall","fromt":"str","to":"15","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"winter","fromt":"str","to":"10","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"spring","fromt":"str","to":"15","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":1080,"y":800,"wires":[["c90c6cf0.c8e5d","ee4e6837.e5da28"]]},{"id":"c3b2c84b.6e0188","type":"change","z":"e43c108b.0b9ea","name":"Zone 1 Times","rules":[{"t":"change","p":"payload","pt":"msg","from":"summer","fromt":"str","to":"30","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"fall","fromt":"str","to":"15","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"winter","fromt":"str","to":"10","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"spring","fromt":"str","to":"15","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":1080,"y":400,"wires":[["df750753.9b1388","e80b270e.4af0c","41b075eb.a4ac4c"]]},{"id":"72f01458.faca54","type":"delay","z":"e43c108b.0b9ea","name":"Start Delay","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":710,"y":720,"wires":[["f9044a0b.9ff3f8"]]},{"id":"5331e111.87d848","type":"delay","z":"e43c108b.0b9ea","name":"Start Delay","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":710,"y":800,"wires":[["7714f81b.3f197"]]},{"id":"9f5055ae.7aa98","type":"change","z":"e43c108b.0b9ea","name":"Store season","rules":[{"t":"move","p":"payload","pt":"msg","to":"season","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":720,"y":360,"wires":[[]]},{"id":"efa2b3b.ec3f95","type":"delay","z":"e43c108b.0b9ea","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":700,"y":400,"wires":[["a459b2fe.6bca1"]]},{"id":"a459b2fe.6bca1","type":"change","z":"e43c108b.0b9ea","name":"Set season","rules":[{"t":"set","p":"payload","pt":"msg","to":"season","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":890,"y":400,"wires":[["c3b2c84b.6e0188"]]},{"id":"42f50f91.245d4","type":"change","z":"e43c108b.0b9ea","name":"Set season","rules":[{"t":"set","p":"payload","pt":"msg","to":"season","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":890,"y":480,"wires":[["d181062c.b285c"]]},{"id":"2089c809.105dc","type":"change","z":"e43c108b.0b9ea","name":"Set season","rules":[{"t":"set","p":"payload","pt":"msg","to":"season","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":890,"y":560,"wires":[["7eac7bfb.ce52f4"]]},{"id":"140e16db.a85b61","type":"change","z":"e43c108b.0b9ea","name":"Set season","rules":[{"t":"set","p":"payload","pt":"msg","to":"season","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":890,"y":640,"wires":[["9532845d.a79bd"]]},{"id":"f9044a0b.9ff3f8","type":"change","z":"e43c108b.0b9ea","name":"Set season","rules":[{"t":"set","p":"payload","pt":"msg","to":"season","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":890,"y":720,"wires":[["15b6bcb4.04992b"]]},{"id":"7714f81b.3f197","type":"change","z":"e43c108b.0b9ea","name":"Set season","rules":[{"t":"set","p":"payload","pt":"msg","to":"season","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":890,"y":800,"wires":[["8f060cf7.e8d588"]]},{"id":"760a146c.3d265c","type":"comment","z":"e43c108b.0b9ea","name":"Zone # Times (INFO)","info":"[Replace with]\n\nSet this to the number of minutes you \nwant that zone to run for, for each season. \n\nMUST BE GREATER THAN 2. ONLY USE WHOLE NUMBERS (e.g. 23 or 5 NOT 23.1 or 5.6)\n\nDO NOT ADJUST ANYTHING ELSE UNLESS YOU KNOW WHAT YOU ARE DOING.","x":1080,"y":320,"wires":[]},{"id":"8d5b9fa9.2f869","type":"delay","z":"e43c108b.0b9ea","name":"Start Delay","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":710,"y":640,"wires":[["140e16db.a85b61"]]},{"id":"e5f0a817.dbb2e8","type":"switch","z":"e43c108b.0b9ea","name":"","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"off","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":510,"y":400,"wires":[["9f5055ae.7aa98","efa2b3b.ec3f95"]]},{"id":"815f21be.d9f6c8","type":"delay","z":"e43c108b.0b9ea","name":"Start Delay","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":710,"y":560,"wires":[["2089c809.105dc"]]},{"id":"1fb2564b.5356f2","type":"function","z":"e43c108b.0b9ea","name":"Set Delay","func":"msg.delay = parseFloat(msg.payload)*60000\nreturn msg;","outputs":1,"noerr":0,"x":530,"y":560,"wires":[["815f21be.d9f6c8"]]},{"id":"9b685b0b.9b1608","type":"function","z":"e43c108b.0b9ea","name":"Set Delay","func":"msg.delay = parseFloat(msg.payload)*60000\nreturn msg;","outputs":1,"noerr":0,"x":530,"y":640,"wires":[["8d5b9fa9.2f869"]]},{"id":"a39ad0bb.5b8e98","type":"function","z":"e43c108b.0b9ea","name":"Set Delay","func":"msg.delay = parseFloat(msg.payload)*60000\nreturn msg;","outputs":1,"noerr":0,"x":530,"y":720,"wires":[["72f01458.faca54"]]},{"id":"7c4737ef.dc6a2","type":"function","z":"e43c108b.0b9ea","name":"Set Delay","func":"msg.delay = parseFloat(msg.payload)*60000\nreturn msg;","outputs":1,"noerr":0,"x":530,"y":800,"wires":[["5331e111.87d848"]]},{"id":"f8049113.ce2be8","type":"delay","z":"e43c108b.0b9ea","name":"Start Delay","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":710,"y":480,"wires":[["42f50f91.245d4"]]},{"id":"4ad3ad81.7d7a1c","type":"function","z":"e43c108b.0b9ea","name":"Set run time","func":"msg.payload = \"pulsetime1 \" + (parseFloat(msg.payload)*60+100)\nreturn msg;","outputs":1,"noerr":0,"x":1410,"y":360,"wires":[["2b2eb164.1a7a1e"]]},{"id":"10fea25f.ddae06","type":"function","z":"e43c108b.0b9ea","name":"Set run time","func":"msg.payload = \"pulsetime2 \" + (parseFloat(msg.payload)*60+100)\nreturn msg;","outputs":1,"noerr":0,"x":1410,"y":440,"wires":[["b39e22ac.5bdb58"]]},{"id":"6c8a0aa5.ae5084","type":"function","z":"e43c108b.0b9ea","name":"Set run time","func":"msg.payload = \"pulsetime3 \" + (parseFloat(msg.payload)*60+100)\nreturn msg;","outputs":1,"noerr":0,"x":1410,"y":520,"wires":[["fe27acb6.a603d"]]},{"id":"5ccf096e.19c4b8","type":"function","z":"e43c108b.0b9ea","name":"Set run time","func":"msg.payload = \"pulsetime4 \" + (parseFloat(msg.payload)*60+100)\nreturn msg;","outputs":1,"noerr":0,"x":1410,"y":600,"wires":[["e29d45f8.2f5668"]]},{"id":"1f088aba.3973ed","type":"function","z":"e43c108b.0b9ea","name":"Set run time","func":"msg.payload = \"pulsetime1 \" + (parseFloat(msg.payload)*60+100)\nreturn msg;","outputs":1,"noerr":0,"x":1410,"y":680,"wires":[["e777e016.eed618"]]},{"id":"4eae099f.b2ad2","type":"function","z":"e43c108b.0b9ea","name":"Set run time","func":"msg.payload = \"pulsetime2 \" + (parseFloat(msg.payload)*60+100)\nreturn msg;","outputs":1,"noerr":0,"x":1410,"y":760,"wires":[["a9e6d6ac.a52a4"]]},{"id":"e80b270e.4af0c","type":"rbe","z":"e43c108b.0b9ea","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":1250,"y":360,"wires":[["4ad3ad81.7d7a1c"]]},{"id":"63e02425.b5996c","type":"rbe","z":"e43c108b.0b9ea","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":1250,"y":440,"wires":[["10fea25f.ddae06"]]},{"id":"96cea465.757268","type":"rbe","z":"e43c108b.0b9ea","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":1250,"y":520,"wires":[["6c8a0aa5.ae5084"]]},{"id":"aa4d9ac2.820418","type":"rbe","z":"e43c108b.0b9ea","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":1250,"y":600,"wires":[["5ccf096e.19c4b8"]]},{"id":"64f62e1b.ee444","type":"rbe","z":"e43c108b.0b9ea","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":1250,"y":680,"wires":[["1f088aba.3973ed"]]},{"id":"41b075eb.a4ac4c","type":"delay","z":"e43c108b.0b9ea","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1260,"y":400,"wires":[["823a78e9.5fad7"]]},{"id":"ca27208a.0598","type":"delay","z":"e43c108b.0b9ea","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1260,"y":480,"wires":[["a6062837.9d9d38"]]},{"id":"84197c18.9e7ab8","type":"delay","z":"e43c108b.0b9ea","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1260,"y":560,"wires":[["9707137e.87c568"]]},{"id":"70e61390.a88f74","type":"delay","z":"e43c108b.0b9ea","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1260,"y":640,"wires":[["89c4016.31bc68"]]},{"id":"2d79bc4.5e649c4","type":"delay","z":"e43c108b.0b9ea","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1260,"y":720,"wires":[["543dea7c.b26274"]]},{"id":"c90c6cf0.c8e5d","type":"delay","z":"e43c108b.0b9ea","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1260,"y":800,"wires":[["7ea0d77d.6076e"]]},{"id":"ee4e6837.e5da28","type":"rbe","z":"e43c108b.0b9ea","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":1250,"y":760,"wires":[["4eae099f.b2ad2"]]},{"id":"35f4689a.adc1c8","type":"mqtt-broker","z":"","name":"","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]

Home Assistnat config

 history_graph:
   irrigation:
     hours_to_show: 48
     name: Irrigation
     entities:
       - switch.zone_1
       - switch.zone_2
       - switch.zone_3
       - switch.zone_4
       - switch.zone_5
       - switch.zone_6

Lovelace Config

  - cards:
  - columns: 6
    entities:
      - entity: switch.zone_1
        hold_action:
          action: toggle
        tap_actions:
          action: more_info
      - entity: switch.zone_2
        hold_action:
          action: toggle
        tap_actions:
          action: more_info
      - entity: switch.zone_3
        hold_action:
          action: toggle
        tap_actions:
          action: more_info
      - entity: switch.zone_4
        hold_action:
          action: toggle
        tap_actions:
          action: more_info
      - entity: switch.zone_5
        hold_action:
          action: toggle
        tap_actions:
          action: more_info
      - entity: switch.zone_6
        hold_action:
          action: toggle
        tap_actions:
          action: more_info
    show_name: true
    show_state: false
    title: Irrigation
    type: glance
  - entities:
      - switch.zone_1
      - switch.zone_2
      - switch.zone_3
      - switch.zone_4
      - switch.zone_5
      - switch.zone_6
    hours_to_show: 48
    refresh_interval: 0
    title: Irrigation
    type: history-graph
icon: 'mdi:water-pump'
title: Irrigation

Hello, I tried to activate the code for home assistant and the red-node flow, but the one available in the discussion does not correspond to that of the third image. to have a working home-assistant code I had to make some small changes, but the system does not start at the scheduled times.
In the node-red flow, however, I noticed that the final drive takes place on the gpio pins of the raspberry and not with mqtt towards a 4ch sonoff as the yaml code is instead. Could you have an indication of how to deflect the command on the sonoff?
Thanks

Hey this is great! I am also looking into controlling my sprinkler system with a sonoff 4ch pro r2. Did you end up using HA or OpenSprinkler? Would love to hear your experiences. Thanks

Hi, have a question about the service calls. The service call has an Output Properties section and if I don’t delete the value in there, I can an error in deploying. Is that part necessary for something?

image

Update: I tried to debug this a little bit further and it seems like it is failing at the convert time function. Can someone please help?

msg.payload = parseFloat(msg.payload) * 60000;
return msg;