Skip to content

Smart Irrigation integration with Irrigation Unlimited not fully functional #203

Description

@null89er

Good day!
First of all, thank you for this amazing integration – it is incredibly powerful and well-structured.

This is not a bug report, but rather a request for guidance or clarification.
I have read through the documentation (especially section 9.2 regarding HAsmartirrigation integration) and tried several approaches, but I can’t seem to get everything working as intended.

The concept

  • Smart Irrigation sensors calculate durations.
  • These durations should be passed to the respective IU zones via adjust_time.
  • If conditions are met (bucket below threshold and duration > 0), adjust_time should update the IU zones.
  • After the scheduled run, the Smart Irrigation bucket should be reset.
  • The scheduled run should appear in the timeline (status: scheduled), not only when manually started.

Problems I’m encountering

  1. adjust_time is executed correctly at 23:15, but IU does not apply the schedule – no next_duration, no scheduled run in the timeline.
  2. load_schedule is called right after, but it has no visible effect. The sequence remains inactive.
  3. manual_run on the sequence (c1_s1) does not start anything, even when durations were adjusted correctly.
  4. The 04:30 automation that checks next_duration and should trigger the run never fires, because no schedule is created.
  5. irrigation_unlimited_finish (used to trigger the bucket reset) has never fired, because the sequence has never completed.
  6. Only the daily reset automation at 12:00 (resetting all zones to "00:00") is confirmed to work reliably.
  7. No errors in logs – but IU stays "empty" despite automation logic working correctly.

I would really appreciate if someone from the community could have a look at my setup and help me figure out if I’m missing something fundamental. Thanks again for this amazing project!

Version of the custom_component

Version: 2025.6.0

Configuration

# ========================================================================
# 🔧 Irrigation Unlimited Konfiguration
# Diese Datei wird in der configuration.yaml referenziert über:
# irrigation_unlimited: !include irrigation_unlimited.yaml
# ========================================================================

# 💡 Die Granularität gibt die kleinste Zeiteinheit für Planberechnung an.
# 60 Sekunden bedeutet: Werte werden auf volle Minuten gerundet.
granularity: 60

# 💡 Wie oft IU den Zeitplan aktualisiert. Zu niedrige Werte erhöhen Systemlast.
# 30 Sekunden ist ein guter Wert für dynamisch gesetzte Zeitpläne.
refresh_interval: 30

# =========================================================================
# 🌿 Controller: eine logische Einheit, die Zonen steuert.
# Du hast hier nur einen Controller für deine RainBird-Ventile.
# =========================================================================
controllers:
  - name: "RainBird Steuerung"     # Anzeigename des Controllers im UI
    enabled: true                  # Muss aktiv sein, damit IU diesen Controller verwendet
    queue_manual: true            # Manuelle Aktionen werden ordentlich eingeordnet (Warteschlange)
    preamble: "00:00:05"          # Vorbereitungszeit vor Start (z. B. Druckaufbau)
    postamble: "00:00:10"         # Nachlaufzeit nach Stopp (z. B. Leitung leerlaufen lassen)

    # 🔧 Globale Voreinstellungen für ALLE Zonen dieses Controllers
    all_zones_config:
      allow_manual: true          # Manueller Start/Stopp über UI erlaubt
      show:
        timeline: true            # Zeige geplante Zeiten in der Timeline-Karte
      user:
        actuator: RainBird-ESP    # Freie Beschreibung (z. B. Modell, Steuerung)

    # =========================================================================
    # 💧 Zonen: Jede Zone ist ein Bereich im Garten mit einem eigenen Ventil
    # =========================================================================
    zones:
      - name: Rasen Groß                       # Beschriftung für das UI
        zone_id: "1"                           # WICHTIG: Muss als String angegeben sein
        entity_id: switch.rasenflache_gros     # Schaltentität in Home Assistant
        enabled: true                          # Zone ist aktiv
        schedules:
          - name: Smart IR Dummy               # Zeitplan-Name (frei wählbar)
            time: "00:00"                      # Uhrzeit – Dummy (niemals aktiv)
            duration: "00:00"                  # Dummy-Dauer, wird durch adjust_time ersetzt
            enabled: true                      # Muss aktiv sein, sonst wird Plan ignoriert
            day: [30]                          # 30. Tag → nicht existent im Februar = nie aktiv
            month: [feb]                       # Kombination macht Plan inaktiv
            schedule_id: smart_ir_z1           # Eindeutige ID für diesen Zeitplan

      - name: Rasen Klein
        zone_id: "2"
        entity_id: switch.rasen_klein
        enabled: true
        schedules:
          - name: Smart IR Dummy
            time: "00:00"
            duration: "00:00"
            enabled: true
            day: [30]
            month: [feb]
            schedule_id: smart_ir_z2

      - name: Beet Eingang + Feige
        zone_id: "3"
        entity_id: switch.hecke_und_beet_eingang
        enabled: true
        schedules:
          - name: Smart IR Dummy
            time: "00:00"
            duration: "00:00"
            enabled: true
            day: [30]
            month: [feb]
            schedule_id: smart_ir_z3

      - name: Kiwi Terrasse
        zone_id: "4"
        entity_id: switch.kiwi_terasse
        enabled: true
        schedules:
          - name: Smart IR Dummy
            time: "00:00"
            duration: "00:00"
            enabled: true
            day: [30]
            month: [feb]
            schedule_id: smart_ir_z4

    # =========================================================================
    # 🔁 Sequenzen: Definieren die Reihenfolge und den Ablauf mehrerer Zonen
    # =========================================================================
    sequences:

      # ✅ Hauptsequenz – wird täglich per adjust_time und load_schedule befüllt
      - name: Smart Irrigation Sequenz         # Anzeigename im UI
        sequence_id: "1"                       # Eindeutige ID (wichtig für load_schedule & manual_run)
        duration: "00:00"                      # Dummy – Laufzeit wird per adjust_time gesetzt
        delay: "00:00:10"                      # Verzögerung zwischen Zonen (z. B. Druckangleich)

        # 🌿 Ablaufreihenfolge der Zonen (wie bewässert wird)
        zones:
          - zone_id: "1"                       # Rasen Groß
            duration: "00:00"                  # Dummy – wird ersetzt
          - zone_id: "2"                       # Rasen Klein
            duration: "00:00"
          - zone_id: "3"                       # Beet Eingang + Feige
            duration: "00:00"
          - zone_id: "4"                       # Kiwi Terrasse
            duration: "00:00"

        # 📅 Dummy-Zeitplan, notwendig damit IU die Sequenz überhaupt akzeptiert
        # Dieser Plan wird NIE ausgelöst, aber ohne ihn funktioniert manual_run nicht.
        schedules:
          - name: Dummy
            time: "01:00"
            day: [30]
            month: [feb]

      # 🧪 Zusätzliche Dummy-Sequenz (optional, z. B. für Testläufe)
      - name: Dummy Sequenz
        sequence_id: "999"                     # Dummy-ID
        duration: "00:00"
        delay: "00:00:10"
        zones:
          - zone_id: "1"
            duration: "00:00"
          - zone_id: "2"
            duration: "00:00"
          - zone_id: "3"
            duration: "00:00"
          - zone_id: "4"
            duration: "00:00"
        schedules:
          - name: Dummy
            time: "02:00"
            day: [30]
            month: [feb]

Automationen 

alias: Smart Irrigation – IU adjust_time täglich 23:15 Uhr (nur bei Bedarf)
description: Übergibt berechnete Laufzeiten nur bei Bedarf und lädt Zeitplan
triggers:
  - at: "23:15:00"
    trigger: time
actions:
  - repeat:
      for_each: "{{ sensor_zonen }}"
      sequence:
        - variables:
            dauer: "{{ states(repeat.item.sensor) | int(0) }}"
            bucket: "{{ state_attr(repeat.item.sensor, 'bucket') | float(0) }}"
        - if:
            - condition: template
              value_template: "{{ dauer > 0 and bucket < repeat.item.bucket_limit }}"
          then:
            - data:
                entity_id: "{{ repeat.item.zone }}"
                zones: "{{ repeat.item.zone_nr }}"
                actual: "{{ dauer | timestamp_custom('%H:%M:%S', false) }}"
              action: irrigation_unlimited.adjust_time
            - variables:
                aktive_zonen: "{{ aktive_zonen + [repeat.item] }}"
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ aktive_zonen | length > 0 }}"
        sequence:
          - data:
              schedule_id: "1"
            action: irrigation_unlimited.load_schedule
          - data:
              message: >
                [IU Planung 23:15] ✅ Folgende Zonen wurden eingeplant:\n {% for
                z in aktive_zonen %} - {{ z.name }} ({{ (states(z.sensor) |
                int(0)) // 60 }} min)\n {% endfor %}
            action: notify.notify
    default:
      - data:
          message: >-
            [IU Planung 23:15] ❌ Keine Bewässerung geplant (alle Zonen Dauer = 0
            min)
        action: notify.notify
variables:
  sensor_zonen:
    - sensor: sensor.smart_irrigation_rasen_gross
      zone: binary_sensor.irrigation_unlimited_c1_z1
      zone_nr: 1
      name: 🌾 Rasen Groß
      bucket_limit: -20
    - sensor: sensor.smart_irrigation_rasen_klein
      zone: binary_sensor.irrigation_unlimited_c1_z2
      zone_nr: 2
      name: 🌱 Rasen Klein
      bucket_limit: -20
    - sensor: sensor.smart_irrigation_efeu_feige_beet
      zone: binary_sensor.irrigation_unlimited_c1_z3
      zone_nr: 3
      name: 🌿 Beet Eingang + Feige
      bucket_limit: -8
    - sensor: sensor.smart_irrigation_kiwi_beet
      zone: binary_sensor.irrigation_unlimited_c1_z4
      zone_nr: 4
      name: 🥝 Kiwi Terrasse
      bucket_limit: -8
  aktive_zonen: []
mode: queued
max: 10

alias: Smart Irrigation – IU Sequenzplan laden (23:16 Uhr)
triggers:
  - at: "23:16:00"
    trigger: time
actions:
  - target:
      entity_id: irrigation_unlimited.c1_s1
    data:
      schedule_id: 1
    action: irrigation_unlimited.load_schedule
  - data:
      message: |
        [IU LoadSchedule 23:16] ✅ Sequenzplan „Smart Irrigation“ wurde geladen.
    action: notify.notify
mode: single

alias: Smart Irrigation – IU Sequenz starten bei Bedarf (04:30 Uhr)
description: Startet IU-Sequenz nur bei Bedarf – manuell und automatisch nutzbar
triggers:
  - at: "04:30:00"
    trigger: time
conditions:
  - condition: template
    value_template: "{{ soll_starten }}"
actions:
  - data:
      message: |
        [IU-Start 04:30] ✅ Geplante Bewässerung wird gestartet
        Laufzeiten:
        {% for z in zonen_info %}
          {{ z }}
        {% endfor %}
        Gesamt: {{ gesamt_dauer }} Minuten
        Ende ca. {{ endzeit }}
    action: notify.notify
  - data:
      entity_id: binary_sensor.irrigation_unlimited_c1_s1
    action: irrigation_unlimited.manual_run
variables:
  zonen:
    - name: 🌾 Rasen Groß
      sensor: binary_sensor.irrigation_unlimited_c1_z1
    - name: 🌱 Rasen Klein
      sensor: binary_sensor.irrigation_unlimited_c1_z2
    - name: 🌿 Beet Eingang & Feige
      sensor: binary_sensor.irrigation_unlimited_c1_z3
    - name: 🥝 Kiwi Terrasse
      sensor: binary_sensor.irrigation_unlimited_c1_z4
  zonen_info: |
    {% set info = [] %} {% for z in zonen %}
      {% set sek = state_attr(z.sensor, 'next_duration') | int(0) %}
      {% if sek > 0 %}
        {% set min = (sek / 60) | round(1) %}
        {% set eintrag = z.name ~ ": " ~ min ~ " min" %}
        {% set info = info + [eintrag] %}
      {% endif %}
    {% endfor %} {{ info }}
  gesamt_dauer: >
    {% set sek = zonen | map(attribute='sensor') | map('state_attr',
    'next_duration') | map('int', 0) | sum %} {{ (sek / 60) | round(1) }}
  endzeit: >
    {% set sek = zonen | map(attribute='sensor') | map('state_attr',
    'next_duration') | map('int', 0) | sum %} {{ (now() +
    timedelta(seconds=sek)).strftime('%H:%M') }}
  soll_starten: >
    {% set sek = zonen | map(attribute='sensor') | map('state_attr',
    'next_duration') | map('int', 0) | sum %} {{ sek > 0 }}
mode: single

alias: Smart Irrigation – Bucket Reset nach Sequenz-Ende
description: >
  Setzt alle Buckets nach erfolgreichem Abschluss der IU-Sequenz zurück und
  sendet eine Übersicht mit Endzeit und Laufzeiten je Zone.
triggers:
  - event_type: irrigation_unlimited_finish
    trigger: event
conditions:
  - condition: template
    value_template: >
      {{ trigger.event.data.entity_id ==
      'binary_sensor.irrigation_unlimited_c1_s1' }}
actions:
  - variables:
      reset_mapping:
        irrigation_unlimited.c1.z1: sensor.smart_irrigation_rasen_gross
        irrigation_unlimited.c1.z2: sensor.smart_irrigation_rasen_klein
        irrigation_unlimited.c1.z3: sensor.smart_irrigation_efeu_feige_beet
        irrigation_unlimited.c1.z4: sensor.smart_irrigation_kiwi_beet
      zone_names:
        irrigation_unlimited.c1.z1: 🌾 Rasen Groß
        irrigation_unlimited.c1.z2: 🌱 Rasen Klein
        irrigation_unlimited.c1.z3: 🌿 Beet Eingang + Feige
        irrigation_unlimited.c1.z4: 🥝 Kiwi Terrasse
      reset_zonen: []
  - repeat:
      for_each: "{{ reset_mapping.items() | list }}"
      sequence:
        - variables:
            zone: "{{ repeat.item[0] }}"
            sensor: "{{ repeat.item[1] }}"
            dauer: "{{ states(sensor) | int(0) }}"
        - condition: template
          value_template: "{{ dauer > 0 }}"
        - data:
            entity_id: "{{ sensor }}"
          action: smart_irrigation.reset_bucket
        - variables:
            reset_zonen: >
              {{ reset_zonen + [ { "name": zone_names[zone], "dauer": dauer } ]
              }}
  - data:
      message: >
        [IU Abschluss] 🌱 Bewässerung beendet um {{ now().strftime('%H:%M') }}
        Uhr


        {% for z in reset_zonen %} ✅ {{ z.name }}: {{ (z.dauer / 60) | round(0)
        }} min {% endfor %}
    action: notify.notify
mode: parallel

alias: AAAAA Smart Irrigation – Reset IU-Zeiten täglich 12:00
triggers:
  - at: "12:00:00"
    trigger: time
actions:
  - data:
      entity_id: binary_sensor.irrigation_unlimited_c1_z1
      actual: "00:00"
    action: irrigation_unlimited.adjust_time
  - data:
      entity_id: binary_sensor.irrigation_unlimited_c1_z2
      actual: "00:00"
    action: irrigation_unlimited.adjust_time
  - data:
      entity_id: binary_sensor.irrigation_unlimited_c1_z3
      actual: "00:00"
    action: irrigation_unlimited.adjust_time
  - data:
      entity_id: binary_sensor.irrigation_unlimited_c1_z4
      actual: "00:00"
    action: irrigation_unlimited.adjust_time
  - delay: "00:00:01"
  - data:
      schedule_id: "1"
    action: irrigation_unlimited.load_schedule
mode: single

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions