Integration with Orbit B-Hyve Irrigation System

Very interesting. If I could do without an Orbit controller, that would be awesome. What model of ecowitt weather station do you have?

The actual station is the Ambient Weather WS-1551-IP Smart Wireless Weather Station. It has been rock solid for 5 years.
The hub (or signal receiver) that came with it is called IPObserver. Home Assistant did not have an integration for it without having to depend on the cloud, so after some research, I purchased an Ecowitt GW1200 Wi-Fi gateway, which is integrated directly with HA.
The soil probes are ECOWITT WH51 Soil Moisture Sensors. It all integrates beautifully with HA and allows me to track, temperature, humidity, rain, wind, UV, solar radiation, soil moisture, etc.
If all you want is soil probes to manage your irrigation, you could start with Ecowitt GW1200 (~$29 USD) and Ecowitt WH51 probes (~$19).
Available from Amazon or Aliexpress at lower price.
I would say that it all paid for itself in less than a year, given the high cost of municipal water in my area. My vegetable garden, plants and landscaping only get water when they absolutely need it.

How are you doing your HA-to-valve connections?

I have an Ecowitt as well with a couple of freezer sensors, so lots of room to add others…but how do you connect to your Orbits (and which valves are you using…I have 24634 - 4 valve and 24632 - 2 valve AND an Orbit hub). AFAIK the only way to manage them is via Orbit’s sw and their hub.

Thank you for this card, this is quite nice . I was able to get it set up to what i believe to be correct, my card looks mostly like your example. One thing that is different is that my roman numerals do not toggle from white to blue like your example…any idea on why that could be? My Friday roman numeral does toggle and today is friday, so i think that has something to do with it… At this point I’m not sure if i have it set up correctly or i just don’t understand how it works.

Could you provide a general synapse of of how each entity works/interacts?
The b-hyve app is really confusing and i basically just want to be able to turn the hose on for a period of time and have it automatically shut off (I believe the duration entity will do this, but please confirm) …but the scheduling would be nice too, i just need to better understand how it works.
Here is what my card looks like as compared to your example.
2024-05-03 22_16_05-Andrew Overview Dashboard – Home Assistant - Vivaldi

my card code:

entities:
  - entity: switch.zone_3
    name: Front House Hose Box zone
    secondary_info: last-changed
  - entity: binary_sensor.zone_3_day_active
    icon: mdi:sprinkler-variant
  - type: divider
  - entities:
      - input_number.zone_3_runtime
    entity: sensor.zone_3_time_remaining
    icon: mdi:clock
    name: Duration
    secondary_info: last-changed
    state_color: true
    state_header: Remaining
    type: custom:multiple-entity-row
  - entities:
      - entity: input_datetime.zone_3_am_on_time
        name: On Time
      - entity: automation.bhyve_zone_3_am_sprinkler_activate
        name: Active
    entity: automation.bhyve_zone_3_am_sprinkler_activate
    name: AM
    state_color: true
    toggle: true
    type: custom:multiple-entity-row
  - entities:
      - entity: input_datetime.zone_3_pm_on_time
        name: On Time
      - entity: automation.b_hyve_zone_3_pm_sprinkler_activate
        name: Active
    entity: automation.b_hyve_zone_3_pm_sprinkler_activate
    name: PM
    state_color: true
    toggle: true
    type: custom:multiple-entity-row
  - entities:
      - color: var(--primary-color)
        color_type: icon
        entity: input_boolean.zone_3_mon
        icon: mdi:roman-numeral-1
        name: Mon
        tap_action:
          action: toggle
        type: custom:button-card
      - color: var(--primary-color)
        color_type: icon
        entity: input_boolean.zone_3_tues
        icon: mdi:roman-numeral-2
        name: Tue
        state:
          - spin: false
            value: 'on'
            width: 35px
        tap_action:
          action: toggle
        type: custom:button-card
      - color: var(--primary-color)
        color_type: icon
        entity: input_boolean.zone_3_wed
        icon: mdi:roman-numeral-3
        name: Wed
        tap_action:
          action: toggle
        type: custom:button-card
      - color: var(--primary-color)
        color_type: icon
        entity: input_boolean.zone_3_thurs
        icon: mdi:roman-numeral-4
        name: Thu
        tap_action:
          action: toggle
        type: custom:button-card
      - color: var(--primary-color)
        color_type: icon
        entity: input_boolean.zone_3_fri
        icon: mdi:roman-numeral-5
        name: Fri
        tap_action:
          action: toggle
        type: custom:button-card
      - color: var(--primary-color)
        color_type: icon
        entity: input_boolean.zone_3_sat
        icon: mdi:roman-numeral-6
        name: Sat
        tap_action:
          action: toggle
        type: custom:button-card
      - color: var(--primary-color)
        color_type: icon
        entity: input_boolean.zone_3_sun
        icon: mdi:roman-numeral-7
        name: Sun
        tap_action:
          action: toggle
        type: custom:button-card
    entity: binary_sensor.zone_3_day_active
    icon: mdi:calendar-week
    name: Days
    state_header: Active
    type: custom:multiple-entity-row
show_header_toggle: false
style: |
  ha-card {
    border: solid 2px var(--primary-color);
    border-radius: 70px;
    box-shadow: none;

  }
title: Zone 3
type: entities

I would appreciate some help getting this B-Hyve Gen 2 Sprinkler Timer (with WiFi hub) doing what I want. I think this is possible, but it’s not playing well for me: I would like this valve to solely turn off if it uses more than, say 100-gallons in a 60-minute window otherwise keep running when turned on with the physical button.

I have it all running properly in HA, but I could use some help writing the HA script. I am also fighting the Android app which implements a 4-hour time limit in manual water mode or only 10-minutes if I activate it with the button on the physical device. Is this something I can configure as part of the script or there a way to override these defaults in the b-hyve app?

My use case: I have a bicycle mister arch (pic below) set up that uses ~2.5-gallons per hour (GPH), and I would like to set up a program to shut it off if it springs a leak; e.g. if it uses more than, say, 50-gallons within an hour. Otherwise I would like it to run continuously for potentially 7-hours or more. I am only interested in activating it via the physical button on the valve at this point.

Thank you!

1 Like

Hi.

I’m currently running:

  • Core: 2024.7.1
  • Supervisor: 2024.06.2
  • Operating System12.4
  • Frontend: 20240705.0

And I cant seem to install the integration. I dont see it in the add-ons nor the integrations. I tried going through adding the repo but it said it wasnt valid.

How do I go about installing it?

Thank you.

It is an integration installed through HACS. Is that where you are trying to add the repo?

1 Like

I just installed HACS but its not showing up on the side panel.

Click on HACS from the side panel, Select “Integrations”, on the lower right select “Explore & Download Repositories”, in the search box type “Orbit”, Select “Orbit BHyve”. read the instructions, in the lower right select “Download”, Restart HomeAssistant, then Settings, “Devices & Services”, Select “+ Add Integration”, Search for Orbit B-hyve, Enter your BHYVE login info.

Unfortunately after I installed HACS I do not see it in the side panel. I have restarted HA services and even rebooted.

OK I figured it out. Once I ran the script to install HACS I needed to go back into integrations and add it. I thought by running the script and restarting that it would show up on the side panel. So I have successfully installed HACS and B-Hyve.

Thanks! :slight_smile:

1 Like

Not sure if anyone answered any of your questions, but I had some similar issues and can share what I did to overcome them, some of which overlap with your issues:

As far as turning off after a specific amount of water usage, I have found that the consumption does not update in real time, or even a few minutes after use. So I kind of abandoned that part and don’t have much to offer here. One thing you could do is to use the calibration procedure you ran in the B-Hyve app for your sprinkler to determine your normal flow rate, and then calculate your expected water use based on runtime. The test is 30 seconds, and the app outputs the flow it saw over that time. You could use that to determine your system’s flow in volume/min and then calculate your usage based on runtime.

Regarding the manual limit imposed by the b-hyve app when you try to run it in HA, there is a way to overcome this. If you go into developer tools and search for the entity you want to control, you will see there is an attribute in there called “manual_preset_runtime”. This is the override for the time limit. Here is mine as an example:

device_name: Sprinkler - Backyard LeftFront
device_id: my_device_id
zone_name: Sprinkler - Backyard LeftFront
station: 1
smart_watering_enabled: false
manual_preset_runtime: 600
device_class: switch
icon: mdi:water-pump
friendly_name: Sprinkler - Backyard LeftFront zone

You could theoretically include changing this attribute in your script to whatever preset run-time you want. If you change this preset runtime to a really high limit, and then use a script in HA to turn them on and off based on a delay, you can achieve whatever delay you want. I have 5 gen 2’s that water my yard, and made a script to overlap the runtime of sprinklers that are connected to the same spigot to reduce water hammer effect (PSA: Get a water hammer arrestor as well! These things hit hard when they close!).

alias: Watering Sequence New
sequence:
  - service: input_boolean.turn_off
    target:
      entity_id: input_boolean.inp_sprinkler_off_error
    data: {}
  - service: switch.turn_on
    target:
      entity_id: switch.sprinkler_front_yard_zone
    data: {}
  - delay:
      hours: 0
      minutes: 5
      seconds: 30
      milliseconds: 0
  - service: switch.turn_on
    target:
      entity_id: switch.sprinkler_backyard_right_zone
    data: {}
  - delay:
      hours: 0
      minutes: 0
      seconds: 15
      milliseconds: 0
  - service: switch.turn_off
    target:
      entity_id: switch.sprinkler_front_yard_zone
    data: {}
  - repeat:
      count: 15
      sequence:
        - delay: 1
        - condition: template
          value_template: "{{ is_state('switch.sprinkler_front_yard_zone', 'off') }}"
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ not is_state('switch.sprinkler_front_yard_zone', 'off') }}"
        sequence:
          - service: input_boolean.turn_on
            target:
              entity_id: input_boolean.inp_sprinkler_off_error
            data: {}
  - delay:
      hours: 0
      minutes: 5
      seconds: 5
      milliseconds: 0
  - service: switch.turn_on
    target:
      entity_id: switch.sprinkler_backyard_left_zone
    data: {}
  - delay:
      hours: 0
      minutes: 0
      seconds: 15
      milliseconds: 0
  - service: switch.turn_off
    target:
      entity_id: switch.sprinkler_backyard_right_zone
    data: {}
  - repeat:
      count: 15
      sequence:
        - delay: 1
        - condition: template
          value_template: "{{ is_state('switch.sprinkler_backyard_right_zone', 'off') }}"
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ not is_state('switch.sprinkler_backyard_right_zone', 'off') }}"
        sequence:
          - service: input_boolean.turn_on
            target:
              entity_id: input_boolean.inp_sprinkler_off_error
            data: {}
  - delay:
      hours: 0
      minutes: 5
      seconds: 5
      milliseconds: 0
  - service: switch.turn_on
    target:
      entity_id: switch.sprinkler_backyard_leftrear_zone
    data: {}
  - delay:
      hours: 0
      minutes: 0
      seconds: 15
      milliseconds: 0
  - service: switch.turn_off
    target:
      entity_id: switch.sprinkler_backyard_left_zone
    data: {}
  - repeat:
      count: 15
      sequence:
        - delay: 1
        - condition: template
          value_template: "{{ is_state('switch.sprinkler_backyard_left_zone', 'off') }}"
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ not is_state('switch.sprinkler_backyard_left_zone', 'off') }}"
        sequence:
          - service: input_boolean.turn_on
            target:
              entity_id: input_boolean.inp_sprinkler_off_error
            data: {}
  - delay:
      hours: 0
      minutes: 5
      seconds: 5
      milliseconds: 0
  - service: switch.turn_on
    target:
      entity_id: switch.sprinkler_backyard_main_zone
    data: {}
  - delay:
      hours: 0
      minutes: 0
      seconds: 15
      milliseconds: 0
  - service: switch.turn_off
    target:
      entity_id: switch.sprinkler_backyard_leftrear_zone
    data: {}
  - repeat:
      count: 15
      sequence:
        - delay: 1
        - condition: template
          value_template: "{{ is_state('switch.sprinkler_backyard_leftrear_zone', 'off') }}"
  - choose:
      - conditions:
          - condition: template
            value_template: >-
              {{ not is_state('switch.sprinkler_backyard_leftrear_zone', 'off')
              }}
        sequence:
          - service: input_boolean.turn_on
            target:
              entity_id: input_boolean.inp_sprinkler_off_error
            data: {}
  - delay:
      hours: 0
      minutes: 10
      seconds: 5
      milliseconds: 0
  - service: switch.turn_off
    target:
      entity_id: switch.sprinkler_backyard_main_zone
    data: {}
  - repeat:
      count: 15
      sequence:
        - delay: 1
        - condition: template
          value_template: "{{ is_state('switch.sprinkler_backyard_main_zone', 'off') }}"
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ not is_state('switch.sprinkler_backyard_main_zone', 'off') }}"
        sequence:
          - service: input_boolean.turn_on
            target:
              entity_id: input_boolean.inp_sprinkler_off_error
            data: {}
mode: single
icon: mdi:water
description: ""

In this script I do the overlap like I mentioned above, but I also check for the sprinkler I just turned off to ensure it actually did turn off. One time I used the script without a sprinkler state check, and one sprinkler didn’t turn off and I didn’t know. Fortunately the manual limit did turn it off, but it spooked me about too much water use so I created a notification driven by the input_boolean.inp_sprinkler_off_error so HA would let me know if something went wrong with them.

I tied all of my stuff to a button that I fire manually when I want to water my property. Lovelace code for that below:

type: custom:button-card
entity: script.watering_sequence_new
name: Water Entire Property
show_state: true
show_name: true
show_entity_picture: true
entity_picture: |
  [[[
  if (states['script.watering_sequence_new'].state == 'on') 
  return "/local/droplet_animation.svg";
  else return "/local/mdi--water.svg";
  ]]]
size: 17%
state_display: |
  [[[
    return entity.state === 'on' ? 'In Process' : 'Click to Start';
  ]]]
styles:
  card:
    - width: 335px
    - height: 100px
    - background: |
        [[[
          return entity.state === 'on' ? 'purple' : 'white';
        ]]]
  name:
    - font-size: 17px
    - color: |
        [[[
          return entity.state === 'on' ? 'lightgreen' : 'black';
        ]]]
    - position: absolute
    - top: 5px
    - left: 50%
    - transform: translateX(-50%)
  state:
    - font-size: 17px
    - color: |
        [[[
          return entity.state === 'on' ? 'lightgreen' : 'black';
        ]]]
    - position: absolute
    - top: 40px
    - left: 83%
    - transform: translateX(-50%)
  custom_fields:
    consumption_label:
      - font-size: 17px
      - color: |
          [[[
            return entity.state === 'on' ? 'lightgreen' : 'black';
          ]]]
      - position: absolute
      - top: 72px
      - left: 25%
      - transform: translateX(-50%)
    consumption:
      - font-size: 17px
      - color: |
          [[[
            return entity.state === 'on' ? 'lightgreen' : 'black';
          ]]]
      - position: absolute
      - top: 73px
      - left: 84%
      - transform: translateX(-50%)
    sprinkler_icon:
      - position: absolute
      - top: 30px
      - left: 65px
      - width: 35px
      - height: 35px
      - color: green
      - animation: |
          [[[
            return states['input_boolean.inp_sprinkler_off_error'].state === 'on'
              ? 'blink 1s infinite'
              : 'none';
          ]]]
custom_fields:
  consumption_label: |
    [[[
      return 'Total Consumption';
    ]]]
  consumption: |
    [[[
      return `${states['input_number.sprinklers_total_consumption'].state} liters`
    ]]]
  sprinkler_icon: |
    [[[
      return `<ha-icon icon="mdi:sprinkler" style="color: ${states['input_boolean.inp_sprinkler_off_error'].state === 'on' ? 'red; animation: blink 1s infinite;' : 'green;'}"></ha-icon>`;
    ]]]
style: |
  @keyframes blink {
    0% { color: red; }
    50% { color: yellow; }
    100% { color: red; }
  }

And it looks like this:
image

The little sprinkler icon turns red if one of the sprinklers fails the “off state” check. I also run separate automations that totalize the consumption, but I had to set up ways to offset the old values and only look at newer values to totalize flow. And like I mentioned before, consumption doesn’t update sometimes for hours, so my automations run every hour and look at value changes to make the total work properly. There are also animations I made on the card to show the water droplet running. All of it works well but this took a while to set it all up and debug everything.

In your use case, you could set up an automation to monitor the state of your sprinkler, so if it was activated using the manual button, you could use some of the above things I mentioned to monitor the on state and then turn it off after a period of time that correlated to your usage or time limits.

I hope this helps you!

2 Likes

I bought the product Orbit 21004 B-hyve Smart Hose Watering Timer with Wi-Fi Hub

Can he pass locally? Or only with the help of the internet?

Internet only.

I created a custom lovelace card to go with this integration. See this thread for more information on that card: Lovelace: Orbit B-Hyve card

I just wanted to thank you. I am now setup with b-Hyve valves and ecowitt sensors and it’s working just fine. I learned a ton of stuff about my garden plants. Like the soil humidity curve from the cucumbers is totlly different from the one from the tomatoes. So, when I had my cucumbers on the same line as the tomatoes, the cucumbers were struggling. Now they have their own line and they’re really happy.