šŸ›” Watchman - keeps track of missing entities and actions in your config files

Thanks, yes ideally I’d like a page with a view of all the devices connected to HA and their historic availability. That way I can see if certain devices are having connectivity issues, if there are general networking problems etc. I think you’re right about binary sensors, I’ll take a look into that.

One can e.g. for ESPHome devices configure a connection sensor, which is useful for that purpose.

I have a card to monitor devices like you talk about. I use all of the options mentioned.

Hi thanks for the integration! Would like to possible to watch all entities (not only the ones being used in configuration)? Thanks

An adjusted Mark Down Card with scroll.

type: markdown
entity_id: sensor.watchman_missing_entities
card_size: 6
card_mod:
  style: |
    ha-card.type-markdown {
      max-height: 450px;
      overflow-y: auto;
      padding: 0px;
    }
content: >-
  <h2 style="margin:2px 0;"><img src="https://brands.home-assistant.io/watchman/dark_logo.png" alt="WM Logo" width="32" height="32"> Watchman report</h2>
  <h3 style="margin:2px 0 6px 0;">Missing Entities: {{ states('sensor.watchman_missing_entities') }}</h3>

  {% set items = state_attr('sensor.watchman_missing_entities','entities') | default([], true) %}

  {% for item in items | sort(attribute='id') -%}
  <hr style="margin:6px 0;border:none;border-top:1px solid var(--divider-color,rgba(255,255,255,.2));opacity:.35;">

  {% set raw_occs = item.occurrences | default([], true) %}
  {% set occs = raw_occs if (raw_occs is iterable and not (raw_occs is string)) else [raw_occs] %}
  {% set occ0 = (occs[0] | string) %}
  {% set f0 = occ0.rsplit('/',1)[-1] %}
  {% set fname0 = f0.rsplit(':',1)[0] %}
  {% set line0 = f0.rsplit(':',1) | last %}
  {% set state_txt = item.state | default('unknown') %}

  <span style="display:flex;align-items:center;gap:6px;line-height:1.1;margin:2px 0;">
    <ha-icon style="--mdc-icon-size:18px;vertical-align:middle;"
             icon="{{ 'mdi:cloud-alert' if item.state == 'missing'
                      else 'mdi:cloud-off-outline' if item.state == 'unavail'
                      else 'mdi:cloud-question' }}"></ha-icon>
    <span>{{ item.id }}</span>
  </span>

  <div style="display:flex;align-items:baseline;gap:8px;white-space:nowrap;width:100%;box-sizing:border-box;line-height:1.1;margin:2px 0;">
    <span style="font-family:monospace;flex:0 0 auto;">{% if line0|int(0) > 0 %}Line {{ line0 }} : {% endif %}</span>
    <span style="font-family:monospace;flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;">
      <a title="{{ occ0 }}" style="font-family:inherit;color:inherit;text-decoration:underline;text-underline-offset:2px;">{{ fname0 }} </a>
    </span>
    <strong style="flex:0 0 auto;color:#fff;">[{{ state_txt }}]</strong>
  </div>

  {% for o in occs[1:] -%}
  {% set s = (o|string) %}
  {% set f = s.rsplit('/',1)[-1] %}
  {% set fn = f.rsplit(':',1)[0] %}
  {% set ln = f.rsplit(':',1) | last %}
  <div style="display:flex;align-items:baseline;gap:8px;white-space:nowrap;width:100%;box-sizing:border-box;line-height:1.1;margin:2px 0;">
    <span style="font-family:monospace;flex:0 0 auto;">{% if ln|int(0) > 0 %}Line {{ ln }} : {% endif %}</span>
    <span style="font-family:monospace;flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;">
      <a title="{{ s }}" style="font-family:inherit;color:inherit;text-decoration:underline;text-underline-offset:2px;">{{ fn }} </a>
    </span>
    <span style="flex:0 0 auto;visibility:hidden;">[{{ state_txt }}]</span>
  </div>
  {%- endfor %}
  {%- endfor %}

I’d advise against installing the most recent update to Watchman. I installed the update on my HA Yellow, did the restart as requested, and then HA was unable to fully startup without disconnecting, forcing me to do a cold reboot again and again. I was finally able to get in with SMB during one of the boots and deleted the watchman folder, after which HA started up fine. I deleted the remnants of Watchman and all remains fine. HA 2026.1.3 with OS17 just as a data point. I don’t use Watchman very much, so it’s not a big deal to not have it.

same, deleting watchman fixed it, huge error in logs when starting with it.

2026-01-25 16:01:53.953 WARNING (MainThread) [homeassistant.bootstrap] Setup timed out for stage 2 waiting on {<Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/local/lib/python3.13/asyncio/futures.py:381, <1 more>, Task.task_wakeup()]> cb=[set.remove()]>, <Task pending name='listen state_changed' coro=<add_event_handlers.<locals>.async_on_state_changed() running at /config/custom_components/watchman/__init__.py:188> wait_for=<Future pending

and it just keeps going.

Interestingly I did not see any issues after updating it. Though this is likely because I had already uninstalled the integration (in favour of using Spook) and it was just resident in HACS. I have since removed it from HACS as well. See: Cannot get into my frontend after installing esp and watchmon update? - #7 by tom_l

Same error here. 100% CPU and unable to get into the frontend after rebooting from another update (at the same time)

On CLI was able to do a
docker stop homeassistant which calmed the CPU down
then
core restart --safe-mode

This brought back the frontend and I was able to disable Watchman integration then reboot. Came back fine after that, but if I tried to enable Watchman again… 100% CPU right away.
As I still had the CLI I could disable it again.

The only thing I had in watchman was a bunch of entities to ignore.
There were a fair amount (50 or so) but that’s all.

And yes, I did skim read the update notes before going ahead with the watchman update :smiley: I saw stuff had been re-coded, but nothing in there like ā€œbreaking changesā€, so I cracked on.

Yeah just came here to report the same.

I was on v0.6.5 and updated directly to v0.8.1 and it completely broke HA for me.

downgrading to v0.8.0 allowed HA to start normally.

it was kind of tricky to find since I upgraded 4 different HACS integrations at once.

OMG. i’m not the only one. Running to my HACS to disable watchman

deleted in my docker container (or via smb)
watchman directory from custom_components

then restarted home assistant and deleted the addon in my settings.

So prior to all this info coming to light regarding the Watchman update issues, I had already hit update but not yet restarted HA. After reading about this I’ve now gone into the HA settings and deleted Watchman but again not yet restarted HA since I’m away from home. I wonder if I’ll escape the issue or if it’ll still smash my HA system.

Should I go in and delete the watchman folder as well as what I’ve done so far before I restart HA or is that something that HA is looking to do since I’ve requested it to be deleted from my system (in the settings>devices/integrations page)?

If your UI is still available, and as a data point…

I went to my Settings → Devices & services, and disable Watchman v0.8.1 from there. And that disable thing was good enough for me to restart my HA, even when I still have v0.8.1 codes in my setup.

Core 2025.12.5 / HAOS 16.3

If you still have the UI then you can either use HACS to redownload the latest ā€œstableā€ version (for me it was 0.8.0) or go all the way back to the version that was working for you before (that was 0.6.5 for me)

If you don’t have the UI and you have access to a good backup you can delete the existing watchman folder from your HA custom_components folder and replace it with your good watchman backup folder.

then restart as normal and you should be OK.

EDIT:

I was incorrect that 0.8.0 was working for me. I didn’t notice that the integration got a ā€œfailed to initializeā€ error on that version. It just didn’t completely crash my HA so I didn’t notice.

But it’s all for sure working on 0.6.5 so far.

I don’t know if it’s related, but my upgrade to Watchman 0.8.1 results in an error I’ve never seen:

It doesn’t say which yaml file it doesn’t like.

Other than this error message, I am not seeing any memory issues or other anomalies.

Have you restarted HA after applying the update to 0.8.1?

If not good luck :pray:

I’ve now got something else to report and it’s getting even more strange.

my 0.6.5 version was working fine before. the integrations page indicated that version was working as well. But I noticed that the reported entities service wasn’t working correctly.

I tried to go to check the integration configuration but I got ā€œconfig flow could not be loaded server got itself into troubleā€ error.

I deleted and readded the integration and I’m still getting that same server error when I try to edit the config. As far as I know that all worked before so I’m not sure what just changed if I reverted back.

I need to add a bunch of ignored entities but I can’t get the config to work.

I’ve restarted HA.

Well, I went ahead and restarted HA after I had hit delete integration in the HA settings. It restarted no problem.

Hm…am i the only one where it works fine then (v 0.7.0 beta.1) ? :thinking:
Should i go back now while it’s still working… ?

I couldn’t stop it from GUI so I used ssh to move watchman from custom_integration folder then restart HA.

It works now (without watchman)

i have no problems too…