Hunter Hydrawise Sprinkler System Integration

Ok i see. It works in 2023.9.2 because before i dont see status controller and now i see correct status controller.
Better will be implement this integration to GUI to configure from GUI no by yaml.

Love the new GUI integration! Good job guys!

Any idea how to set the manual watering time now? Is it still in the config file? If so, what all needs to be there now that it’s a GUI integration?

New integration by GUI no share sensor with status controller.

the integration documentation has been updated but it refers to the manual time to run as being set by

watering_minutes

I have no idea where that is… not in the Hydrawise app as I have a completely different value there… so it must be somewhere still in HA… mystery… and of course I still get the API limit and sensors becoming unavailable. BUT good to see GUI and thank you for update!

Hi all,

thanks a lot for this integration, works well (at least partly).
My problem: I have to sites with two controllers, but the integration outputs only information of the first controller. The online management tool of Hydrawise (and the app aswell) provide access to both controllers. There is only one API key.
Any ideas? Many thanks!

Anyone know where to find watering_minutes in the standard integration? I am new to HA so go easy…

From integration page:

SWITCH OPERATION

When manual_watering is on the zone will run for the amount of time set by watering_minutes.

Any assistance would be appreciated!

Cheers

Hi all… it looks as good news… yesterday i see that now integration hudrawise show in home assistant status of rain sensor… and it works.

image

@dknowles2 not sure if you check this thread but any way to have this functionality native to the integration? For example, a sensor that shows the currently running zone and the remaining water time left?

You can theoretically have more than one zone running at once, so I’m not sure having a sensor showing the current running zone makes sense.

Each zone already has a sensor showing the remaining watering time.

Interesting, I didn’t realize you could run multiple at once…fair enough.

After the recent updates with the integration I updated the node-red flows and card I posted above.

I noticed the node the above flow relied upon has been replaced with more granular nodes. This updated version now has node create 1 HA entity which contains all the details needed to populate the card (sensor.active_sprinkler).

Node:

[{"id":"05b97b830822e82b","type":"group","z":"af12b1b7fe411454","style":{"stroke":"#999999","stroke-opacity":"1","fill":"none","fill-opacity":"1","label":true,"label-position":"nw","color":"#a4a4a4"},"nodes":["77752996eca24b1e","27e71cf822f789af","b9543dcb5d1aad44","7bfbb22ef5881001"],"x":94,"y":119,"w":692,"h":122},{"id":"77752996eca24b1e","type":"function","z":"af12b1b7fe411454","g":"05b97b830822e82b","name":"Parse Zone","func":"const ha = global.get('homeassistant').homeAssistant.states;\n\n/**\n* @param {string} str\n*/\nfunction trim(str) {\n    return str.substring(12,13)\n}\n\nvar newmsg = {}\n\nif (msg.state > 0)\n{\n    var zone = trim(msg.payload)\n    if (zone == \"s\") {\n        newmsg.payload = \"Blake's Veggies: \" + msg.state + \" Min\" \n        newmsg.state = \"Blakes_Veggies\"\n        newmsg.name = \"Blakes Veggies\"\n    } else {\n        newmsg.payload = \"Zone \" + zone + \": \" + msg.state + \" Min\" \n        newmsg.state = zone\n        newmsg.name = \"Zone \" + zone\n    }\n} else {\n    newmsg.payload = \"None\"\n    newmsg.state = 0\n    newmsg.name = null\n}\n\nreturn newmsg\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":470,"y":200,"wires":[["7bfbb22ef5881001"]]},{"id":"27e71cf822f789af","type":"comment","z":"af12b1b7fe411454","g":"05b97b830822e82b","name":"Publish Zone being Watered to HA","info":"","x":260,"y":160,"wires":[]},{"id":"b9543dcb5d1aad44","type":"server-state-changed","z":"af12b1b7fe411454","g":"05b97b830822e82b","name":"Watering Minutes Changed","server":"e056fc93.5eff4","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"(sensor.zone_[1-7]_watering_time|sensor.blakes_veggies_watering_time)","entityIdType":"regex","outputInitially":false,"stateType":"str","ifState":"0","ifStateType":"num","ifStateOperator":"gt","outputOnlyOnStateChange":true,"for":"","forType":"num","forUnits":"seconds","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"triggerId"},{"property":"state","propertyType":"msg","value":"","valueType":"entityState"}],"x":230,"y":200,"wires":[["77752996eca24b1e"],["77752996eca24b1e"]]},{"id":"7bfbb22ef5881001","type":"ha-sensor","z":"af12b1b7fe411454","g":"05b97b830822e82b","name":"Active Sprinkler","entityConfig":"385ff42753799595","version":0,"state":"payload","stateType":"msg","attributes":[{"property":"friendly","value":"name","valueType":"msg"},{"property":"zone","value":"state","valueType":"msg"}],"inputOverride":"allow","outputProperties":[],"x":680,"y":200,"wires":[[]]},{"id":"e056fc93.5eff4","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30,"areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true},{"id":"385ff42753799595","type":"ha-entity-config","server":"e056fc93.5eff4","deviceConfig":"","name":"Active Sprinkler","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Active Sprinkler"},{"property":"icon","value":"mdi:water"},{"property":"entity_picture","value":""},{"property":"entity_category","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""}],"resend":false,"debugEnabled":false}]
[{"id":"0a4ccef788c6e983","type":"group","z":"af12b1b7fe411454","style":{"stroke":"#999999","stroke-opacity":"1","fill":"none","fill-opacity":"1","label":true,"label-position":"nw","color":"#a4a4a4"},"nodes":["9ef630844a709d38","f382a6f4b1d65a7f","9945227d9eaaad18","6861aa7f77544f5c"],"x":134,"y":299,"w":552,"h":122},{"id":"9ef630844a709d38","type":"function","z":"af12b1b7fe411454","g":"0a4ccef788c6e983","name":"Parse Zone","func":"const ha = global.get('homeassistant').homeAssistant.states;\n\nvar selectedZone = ha[\"input_select.sprinkler_zones\"].state;\n\n\n/**\n* @param {string} str\n*/\nfunction trim(str) {\n    var findZone = str.search(\"[0-9]{1}|Blake's Garden\")\n    return str.substring(findZone,findZone + 1)\n}\n\nvar newmsg = {}\nvar zone = trim(selectedZone)\nif (zone == \"B\") {\n    zone = \"switch.blakes_veggies_manual_watering\"\n} else {\n    zone = \"switch.zone_\"+zone+\"_manual_watering\"\n}\n\nnewmsg.payload = zone\nreturn newmsg\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":410,"y":380,"wires":[["9945227d9eaaad18"]]},{"id":"f382a6f4b1d65a7f","type":"ha-button","z":"af12b1b7fe411454","g":"0a4ccef788c6e983","name":"Start Sprinkler","version":0,"debugenabled":false,"outputs":1,"entityConfig":"dd3a8a3b671d15c4","outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"x":230,"y":380,"wires":[["9ef630844a709d38"]]},{"id":"9945227d9eaaad18","type":"api-call-service","z":"af12b1b7fe411454","g":"0a4ccef788c6e983","name":"Turn on Zone","server":"e056fc93.5eff4","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":[],"data":"{\t    \"entity_id\": msg.payload\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"data"}],"queue":"none","x":590,"y":380,"wires":[[]]},{"id":"6861aa7f77544f5c","type":"comment","z":"af12b1b7fe411454","g":"0a4ccef788c6e983","name":"Start Sprinkler - 10 Min","info":"","x":260,"y":340,"wires":[]},{"id":"dd3a8a3b671d15c4","type":"ha-entity-config","server":"e056fc93.5eff4","deviceConfig":"","name":"Start Sprinkler Zone","version":"6","entityType":"button","haConfig":[{"property":"name","value":"Start Sprinkler Zone"},{"property":"icon","value":"mdi:sprinkler"},{"property":"entity_picture","value":""},{"property":"entity_category","value":""},{"property":"device_class","value":""}],"resend":false,"debugEnabled":false},{"id":"e056fc93.5eff4","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30,"areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true}]

YAML - Be mindful of the custom cards being used

type: custom:expander-card
title: Irrigation
clear: false
expanded: false
cards:
  - type: custom:mushroom-select-card
    entity: input_select.sprinkler_zones
    name: Run Zone
    icon: mdi:sprinkler
    icon_color: deep-orange
    layout: horizontal
    tap_action:
      action: call-service
      service: button.press
      data:
        entity_id: button.start_sprinkler
  - type: custom:mushroom-template-card
    primary: |
      {% if states('sensor.active_sprinkler') == 'None' %}
        
      {% else %}
        {{ state_attr('sensor.active_sprinkler', 'friendly') }}
      {% endif %}
    secondary: |
      {% if states('sensor.active_sprinkler') != 'None' %}
        active
      {% else %}
      All Zones Off
      {% endif %}
    icon: |
      {% set zone = state_attr('sensor.active_sprinkler', 'zone') %}
      {% if zone == 'Blakes_Veggies' %}
        mdi:carrot
      {% elif zone | int > 0 %}
        mdi:numeric-{{ zone | int }}-circle
      {% else %}
      {% endif %}
    icon_color: |
      {% if states('sensor.active_sprinkler') != 'None' %}
        {% if state_attr('sensor.active_sprinkler', 'zone') == 'Blakes_Veggies' %}
          green
        {% else %}
          pink
        {% endif %}
      {% else %}
        gray
      {% endif %}
    tap_action:
      action: none
    fill_container: true
    layout: horizontal
  - type: custom:mushroom-entity-card
    entity: sensor.24_high_acre_daily_active_watering_time
    name: Watering Time
    primary_info: state
    secondary_info: name
    icon: mdi:clock-time-three
    icon_color: blue
    layout: horizontal
    fill_container: true
    card_mod:
      style: |
        ha-card {
          padding-right: 150px !important;
          padding-left: 150px !important;
          padding-bottom: 0 !important;
          padding-top: 0 !important;
        }
  - type: logbook
    entities:
      - binary_sensor.zone_1_watering
      - binary_sensor.zone_2_watering
      - binary_sensor.zone_3_watering
      - binary_sensor.zone_4_watering
      - binary_sensor.zone_5_watering
      - binary_sensor.zone_6_watering
      - binary_sensor.zone_7_watering
      - binary_sensor.blakes_veggies_watering
    hours_to_show: 12
gap: '0'
padding: '0'
content:
  type: custom:vertical-stack-in-card
  cards:
    - type: custom:mushroom-title-card
      title: House Water
      subtitle: Status and Usage
      alignment: center
      card_mod:
        style: |
          ha-card {
            border-radius: 10px;
            box-shadow: 0px 2px 4px rgba(0,0,0,0.1);
            background: linear-gradient(to right, #74ebd5, #ACB6E5);
          }
          mushroom-title-card {
            padding: 12px;
          }
    - type: custom:layout-card
      layout_type: custom:horizontal-layout
      layout:
        width: 100%
      cards:
        - type: custom:mushroom-template-card
          primary: |
            [[[
              var usage = states['sensor.high_acre_shutoff_today_s_water_usage'].state;
              return `${usage} <span class="unit">gal</span>`;
            ]]]
          secondary: Usage Today
          icon: mdi:water
          icon_color: '#0b5394'
          card_mod:
            style: |
              mushroom-template-card {
                box-shadow: inset 0px 0px 6px rgba(0,0,0,0.2);
                background: rgba(255,255,255,0.3);
                border-radius: 10px;
                padding: 12px;
                margin: 6px;
              }
              .unit {
                font-size: 0.8em;
                color: #666;
                margin-left: 2px;
              }
        - type: custom:mushroom-template-card
          primary: |
            [[[ 
              var state = states['switch.high_acre_shutoff_shutoff_valve'].state;
              return `<span class="state-${state}">${state}</span>`;
            ]]]
          secondary: Water Main
          icon: |
            [[[
              var state = states['switch.high_acre_shutoff_shutoff_valve'].state;
              return (state === 'on') ? 'mdi:valve-open' : 'mdi:valve'; 
            ]]]
          icon_color: |
            [[[
              var state = states['switch.high_acre_shutoff_shutoff_valve'].state;
              return (state === 'on') ? '#43A047' : '#E53935';
            ]]]
          tap_action:
            action: more-info
          hold_action:
            action: toggle
          card_mod:
            style: |
              mushroom-template-card {
                box-shadow: inset 0px 0px 6px rgba(0,0,0,0.2);
                background: rgba(255,255,255,0.3);  
                border-radius: 10px;
                padding: 12px;
                margin: 6px;
              }
              .state-on {
                color: #43A047;
                font-weight: bold;
              }
              .state-off {
                color: #E53935;
                font-weight: bold;  
              }
    - type: custom:layout-card
      layout_type: custom:horizontal-layout
      layout:
        width: 100%
      cards:
        - type: custom:mushroom-template-card
          primary: |
            [[[
              var pressure = states['sensor.high_acre_shutoff_water_pressure'].state;
              return `${pressure} <span class="unit">psi</span>`;
            ]]]  
          secondary: Pressure
          icon: mdi:gauge
          icon_color: '#FB8C00'
          card_mod:
            style: |
              mushroom-template-card {
                box-shadow: inset 0px 0px 6px rgba(0,0,0,0.2);
                background: rgba(255,255,255,0.3);
                border-radius: 10px;
                padding: 12px;
                margin: 6px; 
              }
              .unit {
                font-size: 0.8em;
                color: #666;
                margin-left: 2px;
              }
        - type: custom:mushroom-template-card
          primary: |
            [[[
              var flow = states['sensor.high_acre_shutoff_water_flow_rate'].state;
              return `${flow} <span class="unit">gpm</span>`;
            ]]]
          secondary: Flow Rate
          icon: mdi:water-pump
          icon_color: '#039BE5'
          card_mod:
            style: |
              mushroom-template-card {
                box-shadow: inset 0px 0px 6px rgba(0,0,0,0.2);
                background: rgba(255,255,255,0.3);
                border-radius: 10px;
                padding: 12px;
                margin: 6px;
              }
              .unit { 
                font-size: 0.8em;
                color: #666;
                margin-left: 2px;  
              }
child-padding: '0'

1 Like

Hello All,

I’m new very new in HA and saw that the Hydrawise integration was updated with the function of setting the watering time by Manuel.

Can someone help me to understand how I can that this? Maybe someone give me an example so that I can understand it.

Thanks in advance!

Ha all
Is more people’s Hydrawise intergration broken? I’m having problems that I can’t fix or do you guys have any advice ?

logger:%20homeassistant.components.hydrawise%0ABron%3A%20helpers/update_coordinator.py:382%0Aintegratie:%20Hunter%20Hydrawise%20(documentatie,%20problemen)%0AEerst%20voorgekomen:%2006:52:15%20(112%20gebeurtenissen)%0ALaatst%20gelogd:%2009:22:25%0A%0AUnexpected%20error%20fetching%20hydrawise%20data%0ATraceback%20(most%20recent%20call%20last):%0A%20%20File%20%22/usr/local/lib/python3.12/site-packages/gql/transport/aiohttp.py%22,%20line%20319,%20in%20raise_response_error%0A%20%20%20%20resp.raise_for_status()%0A%20%20File%20%22/usr/local/lib/python3.12/site-packages/aiohttp/client_reqrep.py%22,%20line%201158,%20in%20raise_for_status%0A%20%20%20%20raise%20ClientResponseError(%0Aaiohttp.client_exceptions.ClientResponseError:%20429,%20message=‘Too%20Many%20Requests’,%20url=‘https://app.hydrawise.com/api/v2/graph’ The%20above%20exception%20was%20the%20direct%20cause%20of%20the%20following%20exception: Traceback%20(most%20recent%20call%20last): %20%20File%20"/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py",%20line%20382,%20in%20_async_refresh %20%20%20%20self.data%20=%20await%20self._async_update_data() %20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ %20%20File%20"/usr/src/homeassistant/homeassistant/components/hydrawise/coordinator.py",%20line%2062,%20in%20_async_update_data %20%20%20%20data%20=%20HydrawiseData(user=await%20self.api.get_user(fetch_zones=False)) %20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ %20%20File%20"/usr/local/lib/python3.12/site-packages/pydrawise/client.py",%20line%20109,%20in%20get_user %20%20%20%20result%20=%20await%20self._query( %20%20%20%20%20%20%20%20%20%20%20%20%20^^^^^^^^^^^^^^^^^^ %20%20File%20"/usr/local/lib/python3.12/site-packages/pydrawise/client.py",%20line%2088,%20in%20_query %20%20%20%20return%20await%20session.execute(dsl_gql(DSLQuery(selector))) %20%20%20%20%20%20%20%20%20%20%20^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ %20%20File%20"/usr/local/lib/python3.12/site-packages/gql/client.py",%20line%201628,%20in%20execute %20%20%20%20result%20=%20await%20self._execute( %20%20%20%20%20%20%20%20%20%20%20%20%20^^^^^^^^^^^^^^^^^^^^ %20%20File%20"/usr/local/lib/python3.12/site-packages/gql/client.py",%20line%201537,%20in%20_execute %20%20%20%20result%20=%20await%20self.transport.execute( %20%20%20%20%20%20%20%20%20%20%20%20%20^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ %20%20File%20"/usr/local/lib/python3.12/site-packages/gql/transport/aiohttp.py",%20line%20341,%20in%20execute %20%20%20%20await%20raise_response_error(resp,%20"Not%20a%20JSON%20answer") %20%20File%20"/usr/local/lib/python3.12/site-packages/gql/transport/aiohttp.py",%20line%20321,%20in%20raise_response_error %20%20%20%20raise%20TransportServerError(str(e),%20e.status)%20from%20e gql.transport.exceptions.TransportServerError:%20429,%20message=‘Too%20Many%20Requests’,%20url='https://app.hydrawise.com/api/v2/graph’%0A

1 Like

Yes - there is an issue with polling causing 429 HTTP errors; basically Hunter is ratelimiting Home Assistant. There is an active issue in GitHub about it. For now, the best fix is to go to Devices and Services, access Hydrawise, then click the 3 dots beside your main integration, open System options and disable polling for updates.

Wait about a day or so if you’ve received errors, and then from the same 3 dots menu, manually reload the integration to force an update - it should work without error. You can then do this once in a while as needed, or set up an automation to manually reload the integration about once an hour or so (or more if you’re not actively watering at this time of year).

Upcoming updates are going to increase the regular polling interval, but they are also engaging with Hunter to see if the integration can get some official support (and not end up in a MyQ situation).

Follow the GitHub issue for the latest on the issue (no need to comment “me too”): Hydrawise still polls too often and causes HTTP 429 errors · Issue #130131 · home-assistant/core

2 Likes

thank you for reaction

Hi @akeslo,

Thank you very much for your advice and your great maps. I am very new to HA and most importantly I have not used node red before.

I’ve already tried a few things at the weekend. But I just can’t get it to work.

What exactly do I have to adjust in the mode so that it fits my Hydrawise integration? Unfortunately, I don’t really know what’s going on.

My Hydrawise integration is also not reporting any times for the individual zones that I have set up for each zone in the Hydrawise app.

I would be pleased to receive any tips. I have not found a video with an exact description. Unfortunately I have not found a description, does anyone have an idea or is there a video tutorial for the card and the matching flow? Looking forward to reading from you.

Übersetzt mit DeepL (Translate anytime, anywhere with DeepL apps and extensions)

@hhjung if you can wait 3 days and update Home Assistant when 2025.2.0 comes out, that may solve your issue. The API implementation is being updated to a new hybrid authentication as well as changes that reduce expensive Hydrawise API calls that were causing problems before.

1 Like

I try a new round… But it doesn´t work:


Any Ideas?

I’m implementing the lovelace card (thank you for providing so much details), and on my system sensor.backyard_next_cycle always returns unknown (that is the case for all of my zones). Is there something. I have an automated schedule. Is there something extra that I need to do so that this info is available)?

Here is the yaml for this section:

 - type: custom:mushroom-template-card
        primary: >
          {% set friendly = states('input_select.sprinkler_zones') %} {% set
          zone = {
            "Back Yard": "backyard",
            "Backyard Drip": "backyard_drip",
            "Front Yard": "front_yard"
          }[friendly] %} {{ states('sensor.' ~ zone ~ '_next_cycle') }}
        secondary: Next Cycle
        icon: mdi:calendar-clock
        icon_color: teal
        layout: horizontal
        fill_container: true

Edited: added yaml

I have the same behavior if zones are suspended (e.g. due to winter).