Home Assistant: Chore Tracking

Home Assistant: Chore Tracking

Inspired by some prior solutions, I wanted to share some modifications (improvements?) that I have made to what I've found.

Source Materials

The article I found first provided a very clear step-by-step instruction on getting started:

Chore Tracking with Point System in Home Assistant - Smart Home Pursuits
Create a Chore Tracker in Home Assistant! Assign tasks, automatically assign points or time, and then reward them once completed.

The general concept is as follows:

  • Create input_boolean helpers which represent the chores.
  • Create a Chore Dashboard to make chore discovery and completion easy.
  • Create Automations which track chore completion and will gamify the results - encouraging completion and rewarding after a regular time-interval.
  • Reset chores at a regular time-interval (generally, daily) to keep up.

I have been looking for fun ways to reward doing "chores" at our house, and this seemed like an easy task to try out. I liked what I read, but I wanted to make some changes to the advertised approach which I will dive into more detail below:

  1. YAML configuration of chores
  2. Naming standardization that has meaning
  3. Simplify reset Automations
  4. Advanced resetting and chore assignments

YAML Configuration

My first modification to the guide was to modify my configuration habits. I was impressed by Carlo Costanzo's Home Assistant Config repository and felt like source control management of my own Home Assistant configuration would be an easy task to pick-up and give me a better backup/restore/maintenance option for my installation over time. I've never had a problem using the user interface for this as the team has made many improvements in the years I've been running Home Assistant. As a tinkerer, I know I can't let things "just work"...

Since I had already installed the Studio Code Server add-on, it was easy for me to dive directly to my /homeassistant folder and see my installation's configuration.

Taking a look at the configuration.yaml file, this can be a concise starting point to how all of your YAML gets loaded into Home Assistant. Instead of keeping any explicit data in this file, it can instead point to broken out files (or folders) to load in assets that you've kept in a neat file structure.

For example, let's review input_boolean (which is equivalent in the UI to creating a "Toggle" Helper in Settings > Devices & services > Helpers > Create):

Line 25 above will include any .yaml files within the input_boolean/ directory that can be seen in the full directory screenshot above. See Home Assistant's documentation on splitting your configuration which will describe the different !include directives you see above. There's a file in there (only one so far) named chore_booleans.yaml which contains named chore input_boolean entities:

After you've made these changes, you can load the entities into Home Assistant through the Settings blade.

Now, if you navigate to the Helpers page, you should see your chores:

You'll see that Helpers created through the UI are editable, but our YAML entities have a "Read-Only" icon on the right. The caveat of using YAML-defined entities means that you'll also need to configure/edit your entities in your files, too.

💡
If you want to configure your entities through the UI, please do so! YAML configuration of these chores is not required! It's just something I wanted to do. If you want to create your chores through the Home Assistant UI, create a new Toggle in this screen.

That's probably all to cover about using YAML instead of the UI to configure the chores for now. While I don't have my installation public in terms of my YAML configuration, I'm not completely ruling that out in the future.

Meaningful Naming Conventions

The previous article specified using Chore entities that are just numbered to simplify referencing chores in Dashboard/lovelace cards (ie input_boolean.chore_1, input_boolean.chore_2, ...). As seen in the previous section, I chose a naming convention that I could group/categorize with:

chore_<task>(_<assignee>)

  • Prefix: chore_ lets me immediately distinguish this entity as a Chore
  • Task: <task> lets me specify a name which will make logical sense if I reference it within an Automation or Dashboard card
  • Assignee: _<assignee> lets me specify a Person that will explicitly own the Chore. Since these Chore Entities are still statically set in YAML, I am locking myself out of rotating assignments based on Entity ID alone. I may consider how to do this later ... but for now, I'm mostly concerned with isolating a child's Chores from parents'. So this works for me at the moment.

To get past the annoyance of remembering the specific Chore entity names, we can use the power of YAML templating in our Dashboard cards! Or, check out what HACS has!

To accomplish this, I used auto-entities from the frontend category.

Then, created a new empty Dashboard named "Chores" (creative!) and added the card (as YAML, of course):

type: custom:auto-entities
card:
  type: entities
  title: Chores
  show_header_toggle: false
  state_color: true
filter:
  include:
    - entity_id: input_boolean.chore_*
  exclude:
    - entity_id: input_boolean.chore_*_elliott

Instead of having to list each Entity ID you want to display, this add-on allows you to use Regex match syntax for your entities. In one tile, I include chore_ and exclude chore_elliott to show only parent chores. In another tile, I include specifically chore_*_elliott to separate them. It can now look like this:

Simplify Reset Automations

Again, instead of manually specifying all of the Entity IDs that we created (which is tedious as they are added/removed over time), we can use templating!

- alias: Reset Chore
  description: 'Reset chores daily'
  trigger:
  - platform: time
    at: 01:00:00
  condition: []
  action:
  - service: homeassistant.turn_off
    target:
      entity_id: '{{ states.input_boolean | map(attribute=''entity_id'') | select(''match'', ''input_boolean.chore_'') | join('','')  }}'
    data: {}
    alias: Turn off input_boolean.chore_*
  mode: single

From the Automation UI, it looks like this:

In the "Then do" section, you'll see it's set to call Home Assistant's core homeassistant.turn_off service on a templated Entity list of input_boolean objects which match an entity_id attribute of input_boolean.chore_ - and that's it!

This is a clean way to reset all Chore entities daily. If you want more refined control over which Chores reset daily (versus weekly/monthly), you could consider refining your Chore naming convention to indicate _daily, _monthly, or otherwise. You may also have a better idea, I may be fixated on this approach too much at this time.

Advanced Resetting and Chore Assignments

As mentioned, the naming convention of Chores determining how often they're reset (or even allowed to be "un-toggled" from the Dashboard) is something I'm considering.

Chore assignment rotation is also something I may consider if we even decide to use this approach. I'm looking forward to scouring the internet in the future as others share their own solutions.