Welcome to the final post in my series on building my bindicator: the software. If you haven’t already read about the hardware I put together then that’s probably worth a read before you go too much futher.
The primary goal of the bindicator is fairly simple: on the evening when the garbage needs to go out, the bindicator should light up in the relevant colours. For the way I plan to use it, I have some additional requirements: I want the people in my household to have a way to dismiss the indication once it’s been dealt with, and I want the notification to time out after a certain amount of time even if nobody has dismissed it. I’d also love for the notification not to fire at all if we’re on vacation.
There’s probably any number of different ways we could go about achieving this with a combination of hardware and software, but in our house we already have Home Assistant installed and hooked in to any number of household devices and functions, running automations to control them and get them working together. As a result, my approach will be to keep all the logic in home assistant and make the bindicator device itself fairly dumb – all I want it to do is show up in home assistant as a light (actually three lights) that home assistant can control.
Enter ESPHome!
ESPHome is a sister project to home assistant intended to be installed on devices with a microcontroller (either commercial or home-made devices) to control the hardware. As you’d imagine, it integrates with home assistant really nicely and I believe there are a few different ways of doing that integration. I use MQTT.
You use a YAML configuration to specify what hardware components your device has and how they’re connected to the microcontroller. It then generates the firmware, and you upload it to the device. Simple!
I published my configuration in my git repository. It defines three lights – one that represents the entire bindicator (both halves), and one each that’s specific to the top and bottom segment of the bindicator. For each of those it adds a custom lighting effect that pulses the light on and off periodically, and then it makes the whole thing available to home assistant over the MQTT and provides some additional options that let me do things like OTA firmware updates.
On the home assistant side, I’m using a couple of key integrations. Recollect Waste and the HomeAssistant mobile app. I then built an automation that runs every day at 6pm and checks if there’s a garbage collection scheduled for the following morning. If there is it additionally checks if there’s one type of garabge being collected or two, and lights up either the whole bindicator in a single colour or each of the two segments independently as appropriate.
It also sends a notification to each of our phones telling us there’s garbage to go out, and watches for one of those notifications to be dismissed with a four hour timeout. When one of us dismisses a notification it then removes the notification for everyone else and turns the bindicator off.
Home assistant uses a nice friendly GUI to create and edit automations and they’re saved in YAML format behind the scenes. I’ve published my automation in YAML format.
What’s Next?
I don’t have many plans to evolve what I’ve built because it’s working pretty well. We already use a “home mode” selector in Home Assistant to change some of our home’s settings if we have houseguests or are on vacation, so the automation I’ve linked above already leverages that and skips taking any action if we’re not home to deal with it.
I have an idea of using our security cameras and computer vision (probaly leveraging frigate) to detect when we put the garbage out and react appropriately so we don’t need to manually acknowledge that it’s done (and also alert us if we accidentally put the wrong colour cart out, or perhaps even alert us once they’ve been emptied and we can take them back in).
Watch this space to see if I actually do any of that!