[Custom component] Bird Buddy smart bird feeder

I’ve just released v0.0.12, with #1 done. #2 is not done, so it will still only poll the Feed on startup.

I downloaded it and it’s currently reporting correctly for both feeders. I think what you’ve done will improve my experience in the data aggregation. Thanks.

Also, thanks for the clarity on how it works. That helps.

Thanks for the awesome work!

This is how I incorporated it into HA:

Only the collected photos aren’t showing up in the media browser. Any idea why?

When you open the BB app and switch to the middle “Collections” tab, do you see images there?

When you say they don’t appear in the media browser, do you see items as if they are supposed to appear, but only the images aren’t loading? Or you don’t see items at all in the BB folder?

Also what version of the integration do you have? You can find this in the top left corner from HACS > Bird Buddy. Current version is v0.0.12

Yes, I see the pictures in the Collection tab.

I am running 0.0.12

When I open the Media browser I don’t see any items. I have a bird buddy folder and then a folder for my feeder, but no items within that folder. I expected a folder for each bird species within the feeder folder, but it’s empty:

Yes it should show a folder for each species. Can you try enabling debug logging from the integrations screen, then navigate back to the media browser, and then disable debug logging. It should cause the debug logs to download. You can either attach that, private message it to me, or if you can inspect it yourself and find something telling, it might help.

I double checked my own media browser, and I’m still seeing it work, so there might be something unexpected in your response that may be breaking it. If that doesn’t help I may need to increase the logging to include the response data.

Ok, I found the issue. The log showed an empty GraphSQL response. The problem was that I initially set up my account using my Apple ID login and - as necessary for this integration to also login - created a second guest login.

The problem with the guest login is that you need to collect the post cards for each account apparently. I never logged in with the guest login. It was just used by HA.

After logging in with the guest account and recollecting the postcards everything works.

Looks like working as designed by bird buddy although I didn’t expect it to work like that since my wife never told me that she also had to collect things with her guest account. It also seems that publishing to the community is shared by the accounts and not individual. So every account has to collect post cards, but the same picture can only be shared or not across all accounts. Not very consistent, but doesn’t matter to me.

Thanks for your help!

Hi, that bird buddy fence seems like a nice idea! Would you mind sharing a picture of your bird buddy with the fence installed?

2 Likes

I meant to tell you that I printed it but failed to realize that the way I have mounted the feeder with tie straps made this not a great solution for me until I can get back in and cut notches out for the tie wraps to slip through. I appreciate the work that went into making it though and I did get 4 successful prints

hey, I’m about to get one of these Bird Feeder’s because of this HA integration. Nice!

May I ask:

  1. Does this custom component do event loop-blocking in HA?
  2. Does it do web-scrapping or use the API directly?
  3. Also, I presume this is cloud-based. Would it (ever) be possible for a local operation?

thanks

  1. Does this custom component do event loop-blocking in HA?

Meaning what exactly? If you’re talking about performing synchronous (i.e., blocking) io: no, the library is async using coroutines, and the HA component makes use of those async coroutines.

  1. Does it do web-scrapping or use the API directly?

There is no website to scrape. It uses the same API the Android and iOS apps use. See the pybirdbuddy python library.

  1. Also, I presume this is cloud-based. Would it (ever) be possible for a local operation?

This is answered in the manifest. It is cloud-polling, and there is no possibility of local operation.

The feeder unit itself does not expose any interface for local communication or discovery, outside of initial BLE pairing. Without any local communication, it is not possible to do anything local; and if it did have that option, it would be a battery drain. By leveraging the API instead, it’s polling the last known snapshot of the feeder’s state, as last reported from the feeder itself, so that all of the feeder’s battery management is left unaffected (i.e., it can still enter deep sleep, because we aren’t keeping it awake).

1 Like

Thank you very much for answering my questions!

Ok, now I can purchase this :slight_smile: looks like it will be at least 1 month before i get it though…so be happy to get you a coffee once I get it up and running

Cheers

1 Like

Hello. Thanks for this integration. I’m trying to get some cards working, but don’t have a camera.bird_buddy_recent_visitor entity. What do I need to do in order to get that to work?

Also, I got the automation working to download the images (it still seems silly this is necessary since now they’re in two places). What’s the best way to display the latest images or maybe all images from today, etc.?

The integration does not create a camera entity. To add that you’ll use the Generic Camera integration, supplying a template as the image URL that extracts the entity_picture URL from the “Recent Visitor” sensor entity (that is provided by this integration, but might be disabled by default in some versions). Instructions for doing that are in an earlier comment in this thread.

Downloading the image(s) is not necessary for any features of the integration or for what we’re talking about here. If you are downloading the images, it should be only for your own use/purposes. Others have chosen to download the images in order to maintain their own backups, or if you want to use the images to create a slideshow using another integration. But if all you want to show is the most recent postcard image, you can do that without downloading.

Thanks. I got the camera working using that post. Could the camera entity not be automatically added as part of this integration?

What’s a good integration for the slideshow you mentioned? I’d like to be able to cycle through all photos from today, or last 1-n, etc.

That discussion has also happened both here and in a GitHub issue. The reason it’s problematic is actually highlighted by this:

I’d like to be able to cycle through all photos from today, or last 1-n, etc.

In other words, I chose not to impose my opinion of what a “slideshow” from the BB should look like, because as you just said, some people may want just one picture of the most recent visit, some may want a slideshow of all pictures from the most recent visit, some may want one picture from each of the last n visits, some may want one picture from each of the last n unique species, and so on…

So rather than impose one implementation that only works if your opinion aligns with mine, I leave it up to the user to implement what they want, how they want it.

I agree it’s not ideal because it’s not exactly trivial to do some of those ideas. Best idea I can come up with is for me or someone else to document “recipes” for various use cases.

As for why we can’t automatically add the Generic Camera as described in the earlier comment, there are two reasons:

  1. We cannot add a config entry for another integration from the BB integration. We don’t own generic/camera, so we can’t add it. Also if there is a breaking change in the generic component, now BB becomes incompatible.
  2. We could clone the Generic Camera object and make ours work exactly like that one, but without the need to configure it manually. But from a software architecture perspective, code duplication is not ideal. Plus it only implements one of those opinions like mentioned above.

The beauty of HA is that components are single-focus, and provide building blocks that can be reused and mixed/matched in various ways to allow the user to accomplish what they want, without being overly opinionated about it. There are links in this thread to other custom components like slideshows that are able to cycle through photos in a directory or possibly even through images found in the media browser collections, and by using one of those integrations, you can combine those with the BB component and maybe some automations (such as if you want to download all the images from the latest postcard visit), and get exactly what you’re after.

I don’t want to come off as anything but appreciative, so please take this for what it is - curiosity. All I have to base these statements on is other integrations. For example, the Neato Botvac integration uses a “built-in” camera entity to surface the latest cleaning map. Since the recent visitor is already labeled as, well “recent,” it seems that a camera.bird_buddy_recent_visitor (or better yet image.bird_buddy_recent_visitor) entity could also be simply that - good enough for many users who just want to be able to add a quick Bird Buddy card to their dashboard.

I agree that a more customizable slideshow, on the other hand, should not be a part of this (or any other) integration, but I’ll set out to hopefully find a slideshow integration that can reference the images already downloaded to Media.

I happen to read such discussion every now and than. This is open source. Others spend there … probably free … time to create something which they deem helpful.

I leave it up to madcoder at the end, but I would like to offer my point of view.

You have provided your input. If it is acceptable for the owner of the repro … be happy.

If not … and If you dont like what others create … fork and do it by your own. Provide a change request and hope its accepted in the upstream repro. Its that simple. If you cant code … you have to use whats there.

Calm down. I’m just providing feedback and trying to have a discussion (maybe read the first line of my last reply a couple times). My last reply was to clarify that I think we were conflating the two use cases previously and propose a solution to the easier one.