Custom integration for Bird Buddy.
This component makes use of the pybirdbuddy library for API calls, also available on PyPI.
- Home Assistant 2026.7.1 or newer (Python 3.14).
- A Bird Buddy account. You will need its
emailandpassword.
Note
If your Bird Buddy account was created using SSO (Google, Facebook, etc), those methods will not work currently. To work around that, you can sign up a new account using email and password, and then invite that new account as a member of your main/owner account. Be aware that certain information or functionality may not be available to member accounts (for example, "off-grid" settings and firmware version).
Alternatively, you may reset the Bird Buddy unit and re-pair it with a new account that was created with a password. See Bird Buddy support for more information.
- Open HACS Settings and add this repository (https://github.com/jhansche/ha-birdbuddy/) as a Custom Repository (use Integration as the category).
- The
Bird Buddypage should automatically load (or find it in the HACS Store) - Click
Install - Continue to Setup
Alternatively, click on the button below to add the repository:
Copy the birdbuddy directory from custom_components in this
repository, and place inside your Home Assistant Core installation's
custom_components directory.
- Install this integration.
- Navigate to the Home Assistant Integrations page (Settings --> Devices & Services)
- Click the
+ Add Integrationbutton in the bottom-right - Search for
Bird Buddy
Alternatively, click on the button below to add the integration:
A device is created for each Bird Buddy feeder associated with the account. See below for the entities available.
| Entity | Entity Type | Notes |
|---|---|---|
Audio |
switch |
Whether recorded visitor videos will include audio. |
Battery |
sensor |
Current Bird Buddy battery percentage |
Charging |
binary_sensor |
Whether the Bird Buddy is currently charging |
Off-Grid |
switch |
Present and toggle Off-Grid status (owners only) |
Power Profile |
select |
Choose between the Power Profile settings the feeder reports. |
Recent Visitor |
sensor |
State represents the most recent visitor's bird species name, and the entity_picture points to the first image on that postcard. |
State |
sensor |
Current state (ready, offline, etc) |
Signal |
sensor |
Current wifi signal (RSSI) |
Update |
update |
Show and install Firmware updates (owners only) |
Some entities are disabled or hidden by default, if they represent an advanced use case (for example, the "Signal" and "Recent Visitor" entities). There are also some entities that are disabled by default because the support is not yet enabled by the Bird Buddy API (for example, the Temperature and Food Level sensors are not yet enabled by Bird Buddy).
More entities may be added in the future.
Bird species and sightings that have already been collected from postcards can be viewed in the Home Assistant Media Browser. To collect a postcard you will need to use the mobile app to open the postcards as they arrive. Only opened postcards can be viewed in the Media Browser (same as the Collections tab in the Bird Buddy app).
This event is fired when a new postcard is detected in the feed and Bird Buddy has identified its species.
| Field | Description |
|---|---|
postcard_id |
Id of the postcard. Pass this to the birdbuddy.collect_postcard service to collect the postcard. |
feeder_id |
Id of the feeder that captured the postcard, or null. Can be used to filter/target automations. |
species |
List of recognized species (each an { "id", "name" } object). Empty when nothing was recognized. |
media |
The first image on the postcard ({ "contentUrl", "thumbnailUrl", ... }), or null. |
media.contentUrl and media.thumbnailUrl are time-sensitive URLs that
can be used to download the postcard image. The event carries the media
object as Bird Buddy returns it, so these keys keep the API's spelling.
Every media item has a thumbnailUrl; contentUrl accompanies the ones
that carry full-size content.
This event can also be handled with the "A new postcard is ready" Device Trigger, which automatically filters to the matching feeder:
triggers:
- trigger: device
domain: birdbuddy
type: new_postcard
device_id: <ha device id>Collects a postcard into your Collections, adding its media to the associated species and making them available in the Media Browser. This is the same effect as opening and saving the postcard in the Bird Buddy app.
Note
This service is meant to be used with the
birdbuddy_new_postcardevent, Device Trigger, or Blueprint, which supply thepostcard_id.
| Service data | Optional | Description |
|---|---|---|
postcard_id |
No | Id of the postcard to collect, from the birdbuddy_new_postcard event. |
feeder_id |
Yes | Feeder id, used to pick the account when more than one Bird Buddy account is configured. |
share |
Yes | Whether the collected media is also shared with the Bird Buddy community (default: false). |
Bird Buddy now identifies species server-side, so the integration no
longer chooses a species client-side (and there is no longer a strategy
or best_guess_confidence option): the postcard is collected exactly as
the Bird Buddy app would collect it.
triggers:
- trigger: event
event_type: birdbuddy_new_postcard
# OR a device trigger:
- trigger: device
domain: birdbuddy
type: new_postcard
# $ids...
actions:
- action: birdbuddy.collect_postcard
data:
postcard_id: "{{ trigger.event.data.postcard_id }}"
feeder_id: "{{ trigger.event.data.feeder_id }}"
share: falseTo simplify the combination of the trigger and the action of collecting the postcard, you can import a predefined Blueprint.
To add the Blueprint, use the button below:
or go to Settings > Automations & Scenes > Blueprints, click the Import Blueprint button, and enter this URL:
https://github.com/jhansche/ha-birdbuddy/blob/main/custom_components/birdbuddy/blueprints/collect_postcard.yaml
After the Blueprint has been imported, you still need to create an automation from that Blueprint. Also note that if we update the Blueprint here, your imported Blueprint will not automatically receive the update, and you may need to re-import it to get the update.
Adopting pybirdbuddy v0.1.0 moves the integration to Bird Buddy's
server-side postcardCollect flow. Entities keep their IDs and history,
and automations built on the "A new postcard is ready" Device Trigger carry
over untouched, since the trigger resolves the event internally. Automations
that reference the event or the service directly need updating:
birdbuddy_new_postcard_sighting— renamed tobirdbuddy_new_postcard. The payload carriespostcard_id,feeder_id,species, andmediain place of thepostcardandsightingreport objects.birdbuddy.collect_postcard— takespostcard_id, plus optionalfeeder_idandshare, in place of thepostcardandsightingobjects. Bird Buddy identifies species server-side, so the schema now rejectsstrategyandbest_guess_confidence;share_mediabecomesshare.- The bundled Blueprint — re-import it and re-create any automation built from it, since it now uses the renamed event and the new service inputs.
Re-importing the Blueprint covers everything if you use it without customizing the payload.
Home Assistant raises a Repairs notice while an automation or script still
triggers on birdbuddy_new_postcard_sighting. Editing that trigger clears
the notice on a following update poll.
make deps # create venv (Python 3.14.4) + install dev/test tooling
make check # ruff + ruff format --check + markdownlint + pyright + pytest
make format # auto-fix ruff issuesThe pinned pytest-homeassistant-custom-component selects the exact Home
Assistant version tested against (see requirements-dev.txt).
Released under the MIT No Attribution License.