Irrigation Unlimited Integration

Hi!

I’ve been using IU for a while now, and it’s been working out great.

My ongoing fear, though, has been that something doesn’t work (and things don’t get watered, or get watered too much) and I never find out about it. This could be an IU issue, or “switch” issue (in my case I’m using a Sonoff relay box flashed with ESPHome), or a combination of the two. Luckily I have a Moen Flo water monitor hooked up.

So I’ve created an AppDaemon app which listens for IU to be finished and then:
a) Confirms that the underlying valve switch has turned off
b) Uses my Flo usage sensor to confirm that an sensible amount of water was used during the irrigation event

I also plan to have it confirm that the valve switch is turned off when HA starts up (to mitigate risk of an HA restart in the middle of an irrigation event).

This is still very much in WIP / development mode, and it almost certainly won’t work out of the box for anybody else, but I’m open to taking PRs or generalizing it a bit.

Hi!

I’ve just started using Home Assistant and came across this Custom Integration - thanks for making it!

I have what I see as a very simple setup at the moment

# Run for 30 minutes each zones and finish 10 minutes before sunrise

irrigation_unlimited:
  controllers:
    zones:
      - name: "Impact Sprinkler"
        entity_id: "switch.impact_sprinkler_valve"
      - name: "Oscillating Sprinkler"
        entity_id: "switch.oscillating_sprinkler_valve"
    sequences:
      - name: "Lawn Watering"
        duration: "00:30"
        delay: "00:01"
        schedules:
          - name: "Before dawn"
            time:
              sun: "sunrise"
              before: "00:10"
            anchor: finish
            weekday: [mon, wed, sat]
        zones:
          - zone_id: 1
          - zone_id: 2

This has appeared to work (I’ve only had a chance for it to go through once).

However when I try to access the Irrigation Unlimited Custom Card, I get an error on the bottom of the screen and only the very first row of icons is shown at the top:
The action requires responses and must be called with return_response=True

Occasionally after restarting Home Assistant and going back to the custom card, everything does appear to show - but it’s random and quickly falls back into showing this error.

This is what I mean:

Any thoughts?

Thanks!

It’s most likely a conflict with another integration which is using an older version of home-assistant-js-websocket. This raised it head late last year with the honey-comb-menu. See issue 22 for details on how it was traced and fixed.

1 Like

Thanks! Wasn’t the honeycomb card but another one that I installed to try and get another integration working :grimacing:

Thanks again!

I’m still unable to cancel running sequences. I can pause a sequence, but can’t cancel. I can disable the sequence but it starts back up when enabled. Is anyone else seeing this? Same with disabling and enabling the controller.

Not being able to cancel a running sequence seems like a problem.

This action:

action: irrigation_unlimited.cancel
data:
  entity_id: binary_sensor.irrigation_unlimited_c1_m
  sequence_id: 2

Generates this log:

2025-10-24 18:20:32] service: cancel, controller: 1, zone: 0, sequence: 0, data: {"entity_id": ["binary_sensor.irrigation_unlimited_c1_m"], "sequence_id": [2]}

But, nothing changes in the dashboard. The sequence is still paused. (I also cannot cancel if the sequence is running.)

You can see Established Drips is sequence 2:

I set a big negative adjust and even turned off every valve and it’s still just running along:

How does one cancel the running sequence? Reloading the config doesn’t reset it either.

Yes I’m having the same problem, sometimes only. That is what pops up at bottom of the screen.

Failed to perform the action irrigation_unlimited/cancel. unsupported operand type(s) for -: ‘NoneType’ and ‘datetime.datetime’

I believe it has to do with a negative time value "delay: “-00:00:03"” but haven’t tested it to confirm.

EDIT:
I think that error only happens when I manually switch a valve on or off while a sequence is running. I need to edit my dashboard so I cannot accidently switch any valve on/off while a controller is running.


Any idea why the running time is not shown correctly?

The card has a local count down timer. If something goes wrong on the backend it will just keep counting down. It would most likely be due to the Failed to perform the action irrigation_unlimited/cancel. unsupported operand type(s) for -: ‘NoneType’ and ‘datetime.datetime’ message.

I suggest opening an issue. Please include the configuration and especially the log which will be key to solving the problem.

I haven’t seen it happening again since I finalised my setup. For testing I had multiple controllers with overlapping running times but in my final yaml version there is only one controller. I’ll open an issue if I see it happening again.

Do I understand that correctly that start times of sequences are not automatically delayed when the previous sequence has not finished yet.

I have two sequences A+B:
Sequence A runs on Mo+WE+FR start at 8.30am, total runtime 45min.
Sequence B only on odd days, start at 9.00am.

That means that on some days A is still running when B starts.

My old Rainbird controller had no issue with that, it just delayed the B starttime.
Can Irrigation Unlimited do that to or can this be solved with automations?

Sequences are completely independent of each other and may overlap. Try anchoring the schedule of sequence A to finish at a particular time and sequence B to start at the same time. You can still adjust the times of each sequence and they won’t overlap.

1 Like

Okay I feel like I must be missing something very basic.

I’ve got the integration installed and it seems to be loaded up, but not matter what I do I can’t seem to get a schedule for the first zone listed in the config recognised. I’ve stripped it back to the most basic config to get it working but no matter won’t it won’t turn on a switch. I’ve even gone back to turning on a pre-existing light switch in the house in case it was something weird about the tap switch I newly acquired.

I also thought that maybe it was that schedules were required for some reason, so also tried the most rudimentary of schedule configs, and that revealed to me that the second zone will work, but not the first? The history and recorder things seem to be loading, as does integration_unlimited itself, just no zone 1 switches ever activate.

Various configs and logs follow. Help?

Very basic config (no work, as only one zone?)

irrigation_unlimited:
  controllers:
    zones:
      entity_id: "switch.breakfast_bar_switch_0"
      schedules:
        - time: "17:11"
          duration: "00:20"

Most basic sequences config I could find (zone 2 will turn on, but never zone 1. This is reflected in the dashboard widgets.

irrigation_unlimited:
  controllers:
    - name: "Main House"
      zones:
        - name: "Zone 1"
          entity_id: "switch.breakfast_bar_switch_0"
          enabled: true
        - name: "Zone 2"
          entity_id: "switch.shellyplus1pm_xxxxxx_switch_0"
          enabled: true

      sequences:
        - name: "Zone Sequence"
          enabled: true
          delay: "00:01"  # Optional delay between zones, here set to 1 minute
          schedules:
            - time: "17:45"  # Start time for the sequence (both zones)
          zones:
            - zone_id: 1
              duration: "00:10"  # 10-minute duration for Zone 1
            - zone_id: 2
              duration: "00:05"  # 5-minute duration for Zone 2

A sample of recent logs:

2025-12-24 19:27:55.522 DEBUG (MainThread) [custom_components.irrigation_unlimited] LOAD
2025-12-24 19:27:55.527 DEBUG (MainThread) [custom_components.irrigation_unlimited] STOP [2025-12-24 19:27:55]
2025-12-24 19:27:55.528 DEBUG (MainThread) [custom_components.irrigation_unlimited] START [2025-12-24 19:27:55]
2025-12-24 19:30:33.355 DEBUG (MainThread) [custom_components.irrigation_unlimited] LOAD
2025-12-24 19:30:33.361 DEBUG (MainThread) [custom_components.irrigation_unlimited] STOP [2025-12-24 19:30:33]
2025-12-24 19:30:33.361 DEBUG (MainThread) [custom_components.irrigation_unlimited] START [2025-12-24 19:30:33]
2025-12-24 19:31:01.056 DEBUG (MainThread) [custom_components.irrigation_unlimited] LOAD
2025-12-24 19:31:01.063 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:31:01] controller: 1, zone: 0, state: 1
2025-12-24 19:31:01.082 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:31:01] controller: 1, zone: 2, state: 1, data: 2.1.1.2.1
2025-12-24 19:31:01.084 DEBUG (MainThread) [custom_components.irrigation_unlimited] STOP [2025-12-24 19:31:01]
2025-12-24 19:31:01.087 DEBUG (MainThread) [custom_components.irrigation_unlimited] START [2025-12-24 19:31:01]
2025-12-24 19:34:00.006 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:34:00] controller: 1, zone: 2, state: 0
2025-12-24 19:34:00.008 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:34:00] controller: 1, zone: 0, state: 0
2025-12-24 19:36:58.438 DEBUG (MainThread) [custom_components.irrigation_unlimited] LOAD
2025-12-24 19:36:58.438 WARNING (MainThread) [custom_components.irrigation_unlimited] ORPHAN_ID Invalid reference ID: controller: 1, sequence: 1, sequence_zone: 1, zone_id: 0
2025-12-24 19:36:58.445 DEBUG (MainThread) [custom_components.irrigation_unlimited] STOP [2025-12-24 19:36:58]
2025-12-24 19:36:58.445 DEBUG (MainThread) [custom_components.irrigation_unlimited] START [2025-12-24 19:36:58]
2025-12-24 19:37:00.002 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:37:00] controller: 1, zone: 0, state: 1
2025-12-24 19:37:00.004 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:37:00] controller: 1, zone: 2, state: 1, data: 2.1.1.2.1
2025-12-24 19:37:42.420 DEBUG (MainThread) [custom_components.irrigation_unlimited] LOAD
2025-12-24 19:37:42.426 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:37:42] controller: 1, zone: 2, state: 0
2025-12-24 19:37:42.427 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:37:42] controller: 1, zone: 0, state: 0
2025-12-24 19:37:42.427 DEBUG (MainThread) [custom_components.irrigation_unlimited] STOP [2025-12-24 19:37:42]
2025-12-24 19:37:42.428 DEBUG (MainThread) [custom_components.irrigation_unlimited] START [2025-12-24 19:37:42]
2025-12-24 19:38:00.002 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:38:00] controller: 1, zone: 0, state: 1
2025-12-24 19:38:00.004 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:38:00] controller: 1, zone: 2, state: 1, data: 2.1.1.2.1
2025-12-24 19:38:30.001 WARNING (MainThread) [custom_components.irrigation_unlimited] SYNCHRONISATION [2025-12-24 19:38:30] Switch does not match current state: expected: on, found: off, switch: switch.shellyplus1pm_xxxxxx_switch_0
2025-12-24 19:40:28.338 DEBUG (MainThread) [custom_components.irrigation_unlimited] LOAD
2025-12-24 19:40:28.350 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:40:28] controller: 1, zone: 2, state: 0
2025-12-24 19:40:28.352 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:40:28] controller: 1, zone: 0, state: 0
2025-12-24 19:40:28.355 DEBUG (MainThread) [custom_components.irrigation_unlimited] STOP [2025-12-24 19:40:28]
2025-12-24 19:40:28.355 DEBUG (MainThread) [custom_components.irrigation_unlimited] START [2025-12-24 19:40:28]
2025-12-24 19:41:00.003 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:41:00] controller: 1, zone: 0, state: 1
2025-12-24 19:41:00.005 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:41:00] controller: 1, zone: 2, state: 1, data: 2.1.1.2.1
2025-12-24 19:41:23.304 DEBUG (MainThread) [custom_components.irrigation_unlimited] LOAD
2025-12-24 19:41:23.310 WARNING (MainThread) [custom_components.irrigation_unlimited] SYNCHRONISATION [2025-12-24 19:41:23] Switch does not match current state: expected: off, found: on, switch: switch.shellyplus1pm_xxxxxxxx_switch_0
2025-12-24 19:41:23.314 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:41:23] controller: 1, zone: 2, state: 0
2025-12-24 19:41:23.316 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:41:23] controller: 1, zone: 0, state: 0
2025-12-24 19:41:23.319 DEBUG (MainThread) [custom_components.irrigation_unlimited] STOP [2025-12-24 19:41:23]
2025-12-24 19:41:23.320 DEBUG (MainThread) [custom_components.irrigation_unlimited] START [2025-12-24 19:41:23]
2025-12-24 19:42:00.003 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:42:00] controller: 1, zone: 0, state: 1
2025-12-24 19:42:00.005 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:42:00] controller: 1, zone: 2, state: 1, data: 2.1.1.1.1
2025-12-24 19:45:00.005 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:45:00] controller: 1, zone: 2, state: 0
2025-12-24 19:45:00.006 INFO (MainThread) [custom_components.irrigation_unlimited] EVENT [2025-12-24 19:45:00] controller: 1, zone: 0, state: 0
2025-12-24 19:47:00.252 INFO (MainThread) [custom_components.irrigation_unlimited] CALL [2025-12-24 19:47:00] service: toggle, controller: 1, zone: 1, sequence: 0, data: {"entity_id": ["binary_sensor.irrigation_unlimited_c1_z1"]}
2025-12-24 19:47:03.479 INFO (MainThread) [custom_components.irrigation_unlimited] CALL [2025-12-24 19:47:03] service: toggle, controller: 1, zone: 1, sequence: 0, data: {"entity_id": ["binary_sensor.irrigation_unlimited_c1_z1"]}

I even tried reordering, or naming the zone_ids, but it doesn’t seem to change anything. Essentially whichever zone is first in the yaml never gets a schedule. Like this:

irrigation_unlimited:
  controllers:
    - name: "Main House"
      all_zones_config:
        show:
          timeline: true
      zones:
        - name: "Kitchen Ceiling"
          zone_id: "kitchen_ceiling"
          entity_id: "light.kitchen_ceiling"
          show:
            timeline: true
          enabled: true
        - name: "Cooktop"
          zone_id: "cooktop"
          entity_id: "switch.shellyplus1pm_xxxxxxxx_switch_0"
          show:
            timeline: true
          enabled: true

      sequences:
        - name: "Zone Sequence"
          enabled: true
          # delay: "00:01"  # Optional delay between zones, here set to 1 minute
          schedules:
            - time: "19:42" # Start time for the sequence (both zones)
          zones:
            - zone_id: "cooktop"
              duration: "00:03" 
            - zone_id: "kitchen_ceiling"
              duration: "00:02" 

So curious :slight_smile:

Quite possibly there is a zero adjustment in play on zone 1 - I can’t see this unless the log is from boot up. Zone 2 started straight away after the controller went on, it never attempted to start zone 1.

Reset all the adjustments, the easiest way to this is to reset on the controller level. This is a magic reset that will reset all adjustments on zones, sequences and sequence zones.

Magic reset did it. I suspect it’s because when I first had a crack at setting it up, I included the esp32 sample block, which before I’d understood it properly had already “erased” my first round of watering. Then I couldn’t get it back because the amendment persisted somehow? Even through a reinstall?

Anyway, thanks for the extension and the great community support. :potted_plant:

Hi All, I’ve been ignoring a non-working integration for a while now and have just started looking into it again. My issue is that the zones and controllers do not seem to appear on the UI.

I’m playing with a cut down config for testing . . .

irrigation_unlimited:
granularity: 10
refresh_interval: 10

controllers:
- name: Controller 1
enabled: false

  all_zones_config:
    allow_manual: true
    duration: '00:05'

  zones:
    - zone_id: '1'
      name: 'Front Garden'
      entity_id: 
        - switch.irrigation_solenoid_1
    

    - name: 'Annual - Group 2'
      schedules:
        - name: 'Summer'
          month: [dec, jan, feb]
          weekday: [mon, wed, fri, sun]
          time: '07:45'

      zones:
        - zone_id: '1'
          duration: "00:05"

And my main config has debug logging enabled, I’d be expecting to see something at least.

logger:
default: warning
logs:
pymodbus.logging: error
custom_components.solaredge_modbus_multi: error
custom_components.irrigation_unlimited: debug

Any advice would be helpful. Yes, indentation is correct, it just isn’t reflecting here.

Regards,
Paul