New Integration: Home Maintenance – Track Recurring Tasks in Home Assistant

Love this. Is there a way to make is show how many Days left before the Task is actually Due to be done.

Just installed the integration and love it.
One feature request: I’d be awesome to be able to attach a (or multiple) user to a task. This would allow create an automation that sends a notification to the user which is attached to the task to inform him/her about the due task. What do you think about this?

2 Likes

Here’s a quick Jinja template for getting days until it’s due:

{% set due_date = as_datetime(state_attr('binary_sensor.replace_air_filter', 'next_due')) %}
{% set today = now().replace(hour=0, minute=0, second=0, microsecond=0) %}
{% set days_remaining = (due_date - today).days %}
{{ days_remaining }} day{{ 's' if days_remaining != 1 else '' }} remaining
1 Like

This can be done with labels on the binary_sensor entity that’s created.
I’m working on an update that will allow adding/managing labels from the Tasks screen itself.

Sweet Thanks!!!

I see. Do you think it would be a possibility to create a selector for the actual users. This way it would not be necessary to create a label per user

Latest version 1.5.0 is releases which has label capabilities as well as an updated UI for easier task sorting and filtering.

1 Like

I’m new to the whole custom integration thing and I know that there are some HA elements that are not available to custom panels like this one, but I can definitely take a look to see if it can be added.

1 Like

I’m new to the whole custom integration thing and I know that there are some HA elements that are not available to custom panels like this one, but I can definitely take a look to see if it can be added.

I see, that’d be wonderful!


I installed the version 1.5.0 which seem to have some bugs in the frontend. All the entities are created correctly. However, the UI does not show any tasks. In the console I can see a flood of error messages

main.js:3 Uncaught RangeError: Invalid time value
    at F1 (main.js:3:8246)
    at Object.template (main.js:161:31)
    at ha-data-table.ts:605:26
    at Array.map (<anonymous>)
    at k._renderRow (ha-data-table.ts:572:35)
    at ha-data-table.ts:371:12
    at e._renderItem (virtualize.ts:113:41)
    at o.dt (repeat.ts:57:23)
    at o.update (repeat.ts:93:53)
    at o._$AS (directive.ts:135:17)
reactive-element.ts:1369 Uncaught (in promise) RangeError: Invalid time value
    at F1 (main.js:3:8246)
    at Object.template (main.js:161:31)
    at ha-data-table.ts:605:26
    at Array.map (<anonymous>)
    at k._renderRow (ha-data-table.ts:572:35)
    at ha-data-table.ts:371:12
    at e._renderItem (virtualize.ts:113:41)
    at o.dt (repeat.ts:57:23)
    at o.update (repeat.ts:93:53)
    at o._$AS (directive.ts:135:17)

These exceptions appear in an endless loop

Can you check the attributes of the sensors for the tasks? The time format on mine are like this and I don’t see that error. If you could send me what yours look like I can try to fix the bug.

last_performed: "2025-06-15T00:00:00-06:00"
interval_value: 1
interval_type: weeks
next_due: "2025-06-22T00:00:00-06:00"
icon: mdi:pool
friendly_name: Check Pool Chems

I got two tasks. Here are the states of both of them

last_performed: 2025-06-29T00:00:00+02:00
interval_value: 14
interval_type: days
next_due: 2025-07-13T00:00:00+02:00
icon: mdi:robot-vacuum-alert
friendly_name: Staubsauger reinigen

and

last_performed: 2025-06-29T00:00:00+02:00
interval_value: 14
interval_type: days
next_due: 2025-07-13T00:00:00+02:00
icon: mdi:sprout
friendly_name: Pflanzen gießen

The only difference I can see is that my last_performed and next_due are not quoted.


Edit: I clicked on reactive-element.ts in the console log and it seems that HA is not able to find this file:

Could not load content for https://<HOST>/unknown/src/reactive-element.ts (HTTP error: status code 404, net::ERR_HTTP_RESPONSE_CODE_FAILURE)

I see this unknown in multiple requests to HA (virtualise.ts, repeats.ts and directive.ts). However, I dont know if these files belong to the integation.

Love this integration! One question (or feature request)? For situations that require maintenance on usage, how would we go about tracking that in our list? Example: my LG washer tracks the number of cycles between a cleaning cycle (30).

Is there a way to automate an existing task to reset the date to have it show up as past due? Or conversely, it would be cool to have a service to allow you to create or update a task based on another sensor (binary, state, or count).

Thanks

1 Like

I don’t know how I could work the “by usage” into the logic since the “next_due” and the binary sensor value are calculated based on the value of last_performed and the interval values, but you could use a template that could determine the “last_performed” date needed in order to set the due date to today and call to the reset service using that calculated date.
Currently the service only accepts an actual date and not a template so it would need some work if you want to submit a feature request detailing what you’re looking for I can add that.

For reference, this template will calculate the last_performed date needed in order to make the due date of today:

{% set interval_value = state_attr('binary_sensor.replace_air_filter', 'interval_value') %}
{% set interval_type = state_attr('binary_sensor.replace_air_filter', 'interval_type') %}
{% set today = now().date() %}

{% if interval_type == 'days' %}
  {{ (today - timedelta(days=interval_value)).isoformat() }}
{% elif interval_type == 'weeks' %}
  {{ (today - timedelta(weeks=interval_value)).isoformat() }}
{%- elif interval_type == 'months' -%}
  {# Manual month subtraction #}
  {% set current_year = today.year %}
  {% set current_month = today.month %}
  {% set current_day = today.day %}
  {% set total_months = (current_year * 12 + current_month - 1) %}
  {% set result_months = total_months - interval_value %}
  {% set result_year = result_months // 12 %}
  {% set result_month = result_months % 12 + 1 %}
  {# Handle leap year #}
  {% set days_in_month = [31,
    29 if result_year % 4 == 0 and (result_year % 100 != 0 or result_year % 400 == 0) else 28,
    31, 30, 31, 30, 31, 31, 30, 31, 30, 31] %}
  {% set max_day = days_in_month[result_month - 1] %}
  {% set safe_day = [current_day, max_day] | min %}
  {{ '{}-{:02d}-{:02d}'.format(result_year, result_month, safe_day) }}
{% elif interval_type == 'years' %}
  {{ (today - timedelta(days=interval_value * 365)).isoformat() }}
{% else %}
  {{ today }}
{% endif %}

Thanks for this - however an issue I see, a task that is due on Friday, with today being Wednesday, shows due in 1 day? :slight_smile:

I think this is cool but I want to have more detail and a log for events that happened.
Replaced window sealant used this brand at this date and here is the receat. Or called a chimney sweep on date pick of before and after and the bill company and contacts for next time.

1 Like

That sounds totally reasonable and I would find that useful myself.
I have to add though, that Home Assistant integrations are typically in charge of the present and scheduled future events. The history of things is centrally managed by the recorder and e.g. fed into additional systems like InfluxDB+Grafana.

I personally would build a query and panel in Grafana to show all past events. Sadly the power of Grafana is not well integrated with HA. That is not quite the satisfactory answer in response to your request but that is my interpretation of the current state. Maybe someone else has a more positive opinion.

I was thinking of something like service journal for cars but integrated with ha for homes.
I though of using lubelogger (no it’s not didies accountant name it’s self hosted car maintence journal). It has integration with ha but dose not really fit what I needed. I will try to look into the alternatives then the weather gets worse.
I remember seeing ‘asset management’ systems for corpo land landlords but those seamed like major overkil.

Hallo,

Super integration. Good work, but when opening the three-dot menu for editing an entry, the menu closes immediately.

Love the idea of this integration. Thanks for creating it as it’s exactly what I’m looking for!

Question for ya. I want to use an NFC tag as a way to mark a maintenance item complete, and reset it’s clock. When I set up the task itself inside of the Home Maintenance area, I specified an NFC tag for each of the maintenance items. I had hoped that that alone would automatically mark the tasks complete when scanned, but it did not. So I’m not sure why there’s an NFC tag section there. What does specifying the tag there do?

It’s not a big deal as I just created an automation to reset the clock when the NFC tag is scanned, and that works fine. Side note, the “current tasks” window does not automatically update like most other screens inside of Home Assistant. So when a tag is scanned and the clock reset, I’ve found I have to refresh the page to get it to show. Not a big deal, but through me off for a minute because I assumed it was real time.

Again, THANKS for the work in creating this as I love what it provides!

Do you also got plans for translations aswell? Would love dutch :smiley: