Created a "Chore Tracker" with points system in Home Assistant

image

Full guide here (recommended reading from here - better formatting and includes all my latest updates and improvements): https://smarthomepursuits.com/chore-tracking-with-point-system-in-home-assistant/

In this guide, I’m going to show you how to create your own chore or task tracker within Home Assistant, using only default Home Assistant features – no third-party products or additional addons/integrations are needed. You can optionally assign a point value to each chore, allowing your kids to earn “points” for completing their tasks. I consider this setup to be similar to a sticker chart or reward system.

This setup has several moving parts, but I will document each step in detail so you can recreate it yourself. We will be creating Home Assistant Scripts, Helpers, Automations, and using Counters for this.

By the end of the guide, you will have created:

  • Toggleable chores in a lovelace card
  • Incrementing points after a task is complete
  • Grid card with buttons to add, remove, or reset the counter
  • Automations to reset daily chores & reset points counter weekly
  • Automation to send notification once daily chores are complete
  • Automation to send notification when point threshold is reached, earning your child their allowance

I also wanted to give credit where credit is due, so thanks /u/brandroidian for the inspiration. I first stumbled upon this Reddit thread a few months ago and loved the idea. He didn’t have a points system for it, so I wanted to expand on his idea a little.

Step 1: Create “Input Booleans” for Chores

The first thing we need to do is create a few chores. To do this, we are using input booleans, which are basically going to be dummy entities that can be triggered from a script later on.

Navigate to Configuration > Helpers. Click Add Helper.

Choose the Toggle helper and give it name. I already have chore_1 – 7 created, so for this example I’m using chore_8.

I recommend naming them chore_1, chore_2, chore_3, etc, as this is what the Entity ID will be named. If you name the entity something like Sweep_Kitchen at this step, your entity will end up being input_boolean.sweep_kitchen. This isn’t necessarily a problem, but when it comes to adding chores to the Lovelace card, it will be easier to search for and add chores 1-5 to the entities card, rather than trying to remember the exact entity name.

You can choose an icon if you’d like, but this can be customized later on so I wouldn’t worry about it here. You can now see the Entity ID it created.

Click the entity so you can name it something useful, like “Sweep Kitchen” and click Update.

Now, you have a easy to remember chore name but the entity ID is short and easy to find later on.

To start, I recommend creating 3-5 chores. You can always add more later.

Step 2: Create an entities card

Optional: If you will be using this for your kids, I recommend creating a new view for each child.

Click Add Card > Entities.

Name it something like “Morning Chores”, uncheck Show Header Toggle, toggle Color Icons by State, and then add your chore_8 entity. Add the rest of your chore entities.

Step 3: Create a Chore Counter for Points/Reward System

Navigate to Configuration > Helpers. Click Add Helper, and choose “Counter“.

Name it Chore Counter, set initial value to 0, and Step Size to 1 (This will add 1 point each time a chore is completed).

Step 4: Create Add, Remove, and Reset Counter Scripts

Next, we need to create a few scripts. This is so we can trigger adding points from button clicks and automations.

Navigate to Configuration > Scripts > Add Script.

Add 1 Point Script

Name: Add 1 Point

Icon: hass-plus-thick

Under Sequence, choose call service and counter.increment.

Remove 1 Point Script

Name: Remove 1 Point

Icon: hass:minus-thick

Under Sequence, choose call service and counter.decrement.

Reset Points Script

Name: Reset Points

Icon: hass:backup-restore

Under Sequence, choose call service and counter.reset.

Step 5: Create Lovelace Grid card to Add, Remove, or Reset Counter

Navigate to your child’s view again. Click Add Card > Grid. This will add a grid of helpful cards to allow you or your child to add, remove, or reset points. For box 4, we can set instructions and for box 5, you show the number of points your child has earned.

Set Columns to 3. Click the + button to add 5 cards to the grid.

Boxes 1-3 are button cards.
Box 4 is a markdown card.
Box 5 is an entity.

Here are the 5 grid cards I created.

Go ahead and test out your buttons. It should now add, remove, and reset your counter correctly and the points will be visible in box 5.

Step 6: Create Automations

Automation#1: Increment counter once chore is completed

It’s great that we can now add add points from Lovelace, but I want to avoid having my kids need to toggle the chore as complete, and then click a button. So let’s automate that.

Configuration > Automations > Create Automation.

Name it something like “If task complete, then add 1 point”

For triggers, choose State and the entity of your chore. Add “On” to the To field. If you have 5 chores, you will add 5 triggers.

For Actions, choose call service and use the script you just created called script.add_one_point.

Here is the full yaml if you’d prefer to just copy and paste this into the automation

alias: If Task Complete Then Add 1 Point
description: ''
trigger:
  - platform: state
    entity_id: input_boolean.chore_1
    to: 'on'
  - platform: state
    entity_id: input_boolean.chore_2
    to: 'on'
  - platform: state
    entity_id: input_boolean.chore_3
    to: 'on'
  - platform: state
    entity_id: input_boolean.chore_4
    to: 'on'
  - platform: state
    entity_id: input_boolean.chore_5
    to: 'on'
  - platform: state
    entity_id: input_boolean.chore_6
    to: 'on'
  - platform: state
    entity_id: input_boolean.chore_7
    to: 'on'
condition: []
action:
  - service: script.add_one_point
mode: single
max: 10

To test, go back to your child’s view and toggle a chore on and off. It should successfully add a point to your counter. Toggling off with do nothing – it won’t add or remove points.

Automation #2: Reset chores at 1am

This one was a fun automation to create. You can either hardcode a time to reset the entity state to off in the automation, or, if you’d like to be able to change the time from lovelace, you can create a date/time helper.

I’ll show you how to create the helper in this example. For this automation, you can set the time from Lovelace to reset the state of the chores to Off at 1am. Here’s what a date/time helper looks like in Lovelace:

Configurations > Helpers > Add Helper > Date and/or time

Name it Chore Date Helper and choose time only.

Then, add this as an entity to your existing “Morning Chores” entities card.

Now, create a new automation. Name it “Reset Chores“, give it a Trigger Type of value of a date/time helper, and choose the input_datetime.chore_date_helper

Conditions: Time Fixed Time, Fixed Time and toggle Monday-Sunday.

Actions: call service using service anem “input_boolean.turn_off”

Targets: Pick entity (Chore 1-5)

And here is the full yaml for this automation:

alias: 'Reset Chores'
description: ''
trigger:
  - platform: time
    at: input_datetime.chore_points_date_helper
condition:
  - condition: time
    weekday:
      - mon
      - tue
      - wed
      - thu
      - fri
      - sat
      - sun
action:
  - service: input_boolean.turn_off
    data: {}
    entity_id: input_boolean.chore_1
  - service: input_boolean.turn_off
    data: {}
    entity_id: input_boolean.chore_2
  - service: input_boolean.turn_off
    data: {}
    entity_id: input_boolean.chore_3
  - service: input_boolean.turn_off
    data: {}
    entity_id: input_boolean.chore_4
  - service: input_boolean.turn_off
    data: {}
    entity_id: input_boolean.chore_5
  - service: input_boolean.turn_off
    data: {}
    entity_id: input_boolean.chore_6
  - service: input_boolean.turn_off
    data: {}
    entity_id: input_boolean.chore_7
mode: single

To test this out, go back to Lovelace, toggle on your chores, and then set the value of the date/time helper to 1 minute ahead of what time it is now. Once the automation triggers, it should turn off the chores. You will eventually want this time to something overnight so the chore tracker resets before they wake up the next day.

Automation #3: Reset Points Weekly

This is similar to automation #2, except we are resetting points once per week instead of daily. We can still use the date/time helper which is great, we will just tell it to only run on Mondays at 1am.

Create a new automation and name it Reset Chore Counter.

Under Conditions, toggle Monday only.

Under Actions, call service and choose counter.reset. Choose Pick entity and select chore counter.

Full yaml:

alias: 'Reset Chore Counter'
description: ''
trigger:
  - platform: time
    at: input_datetime.chore_points_date_helper
condition:
  - condition: time
    weekday:
      - mon
action:
  - service: counter.reset
    target:
      entity_id: counter.chore_counter
mode: single

Automation #4: If points threshold is reached, send me a notification

This automation will let you know once your kid has reached your arbitrary “number” of points needed to earn their allowance (or whatever reward system you choose). Again, very similar to rewarding a child for filling up a sticker chart. If they have 5 chores a day to complete, they earned 5 points. 5 points x 7 days a week = 35 points.

Give it a name. Under Triggers, choose Numeric State and set to 34 (or one less than your arbitrary number). This is so you the automation triggers once it hits 35 points.

Under Actions, send a notification:

Fully yaml:

alias: Chore Points Threshold Reached
description: ''
trigger:
  - platform: numeric_state
    entity_id: counter.chore_counter
    above: '34'
condition: []
action:
  - device_id: b9ae47b5fe201965b76b088888888
    domain: mobile_app
    type: notify
    title: Daughter has completed her weekly chores!
    message: Reminder to take daughter out for ice cream!
mode: single

Wrapping Up

This was an incredibly fun project to work on. Prior to this, I had never used helpers, scripts, or counters. It was a great learning experience, and I hope you guys find it useful as well!

As I created this, I realized this can definitely be expanded upon for things other than just your kids chores. For example, create tasks for mowing the lawn, taking medicine, or washing the car. I use the app TickTick for my own personal checklist, but having a few repetitive things directly in Home Assistant is pretty awesome.

Good luck! Let me know if you have any questions or run into any issues along the way.

20 Likes

Update: A nested grid layout works best on mobile/tablets for this. Also makes it easier for kids as they don’t need to scroll down as far.

For kids who see their parents/step parents, they obviously wouldn’t be able to hit their “goal” number of points. My solution to this is using a simple gauge card to show progress on weeks they are at home vs weeks they are gone a few days.

3 Likes

This is great. Will have a play for sure! I have 2 lazy kids :wink:

2 Likes

At the moment, if you toggle (undo) a chore it doesn’t reduce the counter. Then when you toggle (complete) it again it adds another counter. I made the automation reduce the counter when it’s turned off, but then the nightly reset removes all the counters.

Do you know a workaround for this?

I think I understand what you mean. Because you created an automation to reduce a point when toggled off, whenever the “nightly reset” automation runs, it reduces the counter by the # of chores you have toggled on. So if you have 5 chores toggled on, and it resets at 1am, then you lose 5 points.

Am I understanding that correctly?

That’s it, the initial implementation didn’t take kids toggling their chores (or false/accidental check offs) into consideration, so this isn’t an issue until you add the an automation for removing chores using script.minus_1_point.

Got it, I understand fully now. I think the easiest way to handle this would be to create a “Time” condition under the “Remove 1 Point” automation. It could remove points from 12:01am-11pm.

Then, your nightly reset automation would run sometime between 11-11:59pm. It would then toggle the input booleans off, but because the time condition doesn’t allow it to reset points, the automation wouldn’t run.

1 Like

Implemented and working well! Final piece of the puzzle.

I am using this chore tracker for the kid to gain screen time. So she accumulates her night chores, morning chores for screen time that afternoon. The tracker resets during the day when she’s at school. I have the script to send my phone a notification when it resets letting me know how many minutes she has that day.

How would I store the counter value before I reset it so I can build a history of how many minutes she accumulated in the past?

It looks like its storing the values … I just haven’t been using it properly while setting it up. Instead of the 5, 10, 15, 20 min accumulation I am using, can you WRITE a final value to a sensor?

Awesome! I’m glad to see it’s working well for you too.

The only way I know how to do this (I don’t have this setup yet) is if you configure things into a Grafana/influxdb database/dashboard. Then, you can could show previous stats using a Grafana historical sensor.

You might also be able to use a history_stats sensor: History Stats - Home Assistant

1 Like

Actually - this “history graph” card works. It doesn’t explicitly tell you the number, but it might point you in the right direction:

type: history-graph
entities:
  - counter.chore_counter
title: Chore History
hours_to_show: 48

Thanks Danny. This really is a great implementation :smiley:

You’re welcome. Sorry for so many replies, but now you got my wheels turning, I think I’d like to be able to see history as well.

Here’s another example I created using mini-graph-card:

entities:
  - counter.chore_counter
icon: hass:broom
hour24: false
hours_to_show: 36
name: Chore Counter History
show:
  extrema: true
  graph: bar
  icon: true
  name: true
  name_adaptive_color: true
  icon_adaptive_color: true
type: custom:mini-graph-card

image

1 Like

A bar graph looks much better

Perhaps the proposed new ‘task’ domain added to Home Assistant’s architecture could simplify this?

https://github.com/home-assistant/architecture/issues/149

Hi,

I loved the idea as soon as I saw this project. I have been doing this with my kid and has been working great.

I just took a slightly different approach to the idea. The points (Faros, which is like we were calling a currency) are cumulative and might be used/exchanged for goodies (TV time, toys, etc…).

My dash looks like this right now:

These are the automations that I built for:

Add Points when tasks were completed

alias: '[FAROS][MARTIM] Add Faros Once Tasks Completed'
trigger:
  - platform: state
    entity_id: input_boolean.faros_chore01
    to: 'on'
  - platform: state
    entity_id: input_boolean.faros_chore02
    to: 'on'
  - platform: state
    entity_id: input_boolean.faros_chore03
    to: 'on'
  - platform: state
    entity_id: input_boolean.faros_chore04
    to: 'on'
  - platform: state
    entity_id: input_boolean.faros_chore05
    to: 'on'
  - platform: state
    entity_id: input_boolean.faros_chore06
    to: 'on'
  - platform: state
    entity_id: input_boolean.faros_chore07
    to: 'on'
action:
  - service: script.faros_martim_add_1_point
mode: single

If tasks were marked as completed, but for some reason this needs to change

alias: '[FAROS][MARTIM] Remove Faros If Tasks Uncompleted'
trigger:
  - platform: state
    entity_id: input_boolean.faros_chore01
    to: 'off'
  - platform: state
    entity_id: input_boolean.faros_chore02
    to: 'off'
  - platform: state
    entity_id: input_boolean.faros_chore03
    to: 'off'
  - platform: state
    entity_id: input_boolean.faros_chore04
    to: 'off'
  - platform: state
    entity_id: input_boolean.faros_chore05
    to: 'off'
  - platform: state
    entity_id: input_boolean.faros_chore06
    to: 'off'
  - platform: state
    entity_id: input_boolean.faros_chore07
    to: 'off'
condition:
  - condition: time
    after: '07:00:00'
    before: '23:00:00'
action:
  - service: script.faros_martim_remove_1_point
mode: single

Reset Tasks at 1am

alias: '[FAROS][MARTIM] Reset Tasks'
trigger:
  - platform: time
    at: '01:00:00'
action:
  - service: input_boolean.turn_off
    target:
      entity_id:
        - input_boolean.faros_chore01
        - input_boolean.faros_chore02
        - input_boolean.faros_chore03
        - input_boolean.faros_chore04
        - input_boolean.faros_chore05
        - input_boolean.faros_chore06
        - input_boolean.faros_chore07
mode: single

For Scripts I used these ones:

Add 1 Point

alias: Faros - Martim - Add 1 Point
sequence:
  - service: counter.increment
    target:
      entity_id: counter.faros_counter_martim
mode: single
icon: mdi:plus-circle-outline

Add 5 Points

alias: Faros - Martim - Add 5 Points
sequence:
  - service: counter.increment
    target:
      entity_id: counter.faros_counter_martim
  - service: counter.increment
    target:
      entity_id: counter.faros_counter_martim
  - service: counter.increment
    target:
      entity_id: counter.faros_counter_martim
  - service: counter.increment
    target:
      entity_id: counter.faros_counter_martim
  - service: counter.increment
    target:
      entity_id: counter.faros_counter_martim
mode: single
icon: mdi:plus-circle-multiple-outline

Remove 1 Point

alias: Faros - Martim - Remove 1 Point
sequence:
  - service: counter.decrement
    target:
      entity_id: counter.faros_counter_martim
mode: single
icon: mdi:minus-circle-outline

Remove 5 Points

alias: Faros - Martim - Remove 5 Points
sequence:
  - service: counter.decrement
    target:
      entity_id: counter.faros_counter_martim
  - service: counter.decrement
    target:
      entity_id: counter.faros_counter_martim
  - service: counter.decrement
    target:
      entity_id: counter.faros_counter_martim
  - service: counter.decrement
    target:
      entity_id: counter.faros_counter_martim
  - service: counter.decrement
    target:
      entity_id: counter.faros_counter_martim
mode: single
icon: mdi:minus-circle-multiple-outline

Note: Maybe the 5 +/- code is not the best way to do it, but was the easiest that I had to make it work

Hope this also helps someone.

1 Like

A few weeks late seeing your comment, but great job! I’m glad my guide inspired you to create your own chore tracker for your kiddo. I really like your layout.

Quick update since my guide is popular on Reddit again - I recommend reading the guide from my blog for the most up-to-date changes I’ve made my to my chore tracker. I’ve taken feedback from the comments section here and updated my guide.

Everything will still 100% work by reading the text and comments above, I’ve just added some things such as chore history, restricting access, and creating a gauge card to view progress to it to save you some time.

3 Likes

This is an awesome write up, thank you for taking the time to write this all out for beginners, fyi the link to your blog page just loads a blank white page

Do you have other beginner friendly write ups? I’ve been trying to figure out how to have an icon that lists how many lights are on in my house, or something neat to do with a common area dashboard (kind of like DAK board but all in HA)

would you mind showing an example of how you added the restriction to the +/- 1 point cards please?

yeah me to or the restriction that the toggle gets locked in on state so they cannot mutiply the task :wink:

1 Like