[APP][Pro] Device Watchdog - Battery, connectivity & staleness monitoring for all your devices

:waving_hand: Hi all,
Device Watchdog keeps an eye on all your Homey devices, so you don’t have to.

:link: Install Test version

:magnifying_glass_tilted_left: What is this app?
It monitors every device on your Homey for three kinds of problems:

  • Low battery (percentage or battery alarm)
  • Not reporting - hasn’t sent any new data within a configurable time window
  • Unavailable - Homey itself lost the connection, tracked in realtime

Every device is monitored by default - no manual setup required. You can exclude individual devices, or a whole zone in one click.
:gear: What can it do?

  • Per-device overrides for battery threshold and reporting window (hours or days) - with a one-click option to apply the same settings to every other device of the same type (e.g. all your Aqara motion sensors) , with the option to exclude specific ones, instead of repeating it per device
  • Optional setting to also count Homey’s own “last seen” as a sign of life for “not reporting” - useful for devices (like Zigbee routers) that rarely send a new value but are still clearly connected
  • Configurable grace period before “unavailable” counts as a real problem (seconds or minutes, global or per device) - avoids false alarms from brief disconnects, e.g. another app updating or Homey itself restarting
  • Manual “Test” button to re-check whether a controllable device (on/off, dimmer) is actually reachable right now
  • Built-in history log of every detected problem and test result
  • Optional Homey Timeline entries when a device newly becomes a problem (no repeat spam)
  • A virtual “Watchdog status” device exposing device counts as capabilities, so they show up in Homey Insights and on your dashboard
  • :bar_chart: A dashboard widget showing those same counts at a glance, plus - unlike a plain capability tile - exactly which devices are currently affected, since when, and a relevant detail (battery %, last update, last seen), with a manual “Scan now” button right in the widget
  • A “reset to factory settings” button if you ever want a clean slate

:wrench: Flow Cards
When:

  • A specific device’s battery gets low / stops reporting / becomes unavailable (device picker)
  • Devices with low battery / not reporting / unavailable are newly found (summary, fires once with a count + device list)

And:

  • A specific device is unavailable / isn’t reporting / has low battery

Then:

  • Run a device scan now

:clipboard: Setup

  • Requires the homey:manager:api permission (to read device status and, for the Test button, briefly re-set a device’s own current value)
  • All processing happens locally, on your Homey - no data leaves it

:link: About this app
This app started life as a personal Homey Script I’d written and used for a while (“Device Monitor & Battery Checker”). With Claude’s help, I turned that script into a full Homey app, with a proper settings UI, Flow cards, and Insights integration.

Feedback welcome! :folded_hands:

:open_book: Device Watchdog - Settings Guide
This is a rundown of every setting, what it does, and where the underlying value actually comes from.

:stopwatch: Automatic scan

  • Automatic interval active - turns background scanning on/off. Off = no periodic scan, but “Run device scan now” (Settings button or Flow action) still always works.
  • Scan interval (minutes) - how often the automatic scan runs.

:level_slider: Default thresholds (apply to every device unless overridden per-device under “Details”)

  • Hours without update until “offline” - a device is flagged “not reporting” once this many hours pass without a capability value changing. Source: the newest lastUpdated timestamp across all of a device’s capabilities, as reported by Homey.
  • Count Homey’s “last seen” toward “not reporting” (off by default) - when enabled, Homey’s own connectivity confirmation also counts as a sign of life, not just capability changes. Useful for devices (Zigbee routers, pure event sensors) that rarely change a value but are still clearly connected. Source: lastSeenAt, Homey’s own last-communication timestamp for the device - independent of any specific capability.
  • Battery warning at (%) - flags a device once its battery percentage drops to/below this. Source: measure_battery capability value, or alarm_battery (any true value always flags, regardless of %).
  • Delay before “unavailable” counts - grace period before a device going unreachable is treated as a confirmed problem (default 0 = instant). Useful for brief disconnects, e.g. another app updating, or Homey itself restarting. Source: available flag from Homey, tracked in realtime; the delay only affects when it’s confirmed, not the underlying signal.

:bell: Notifications

  • Timeline entry on new problems - writes a Homey Timeline entry the moment a device newly becomes a problem. Once per state change, no repeat spam while it persists.

:dog: Virtual device alarm

  • Three toggles controlling which categories (unavailable / not reporting / low battery) trip the virtual Watchdog device’s alarm_generic capability. The three count capabilities always show the real numbers regardless - this only filters the combined alarm.

:artist_palette: Display

  • Increase text contrast (dark mode) - lightens muted/secondary text (hints, timestamps) further for bright ambient light.

:broom: Reset

  • Reset to factory settings - button at the bottom of Settings that resets all default thresholds and every per-device rule back to defaults in one go. History log and last scan are left untouched (there’s a separate “Clear log” for that).

:mobile_phone: Per-device overrides (via “Details” on any device)

  • Hours until “offline” - per-device override of the global threshold.
  • Ignore unavailable - excludes this device from the summary trigger, timeline, and log for the unavailable category specifically. Its own per-device Flow trigger still fires. Good for a flaky device you don’t want spamming the aggregate notifications.
  • Delay before “unavailable” counts - per-device override of the global grace period.
  • Count “last seen” toward “not reporting” - per-device override of the global setting (Default / Yes / No). Lets you enable it for specific chronically-quiet devices without loosening detection everywhere.
  • Battery threshold % - per-device override.
  • Only check battery - skips the “not reporting” check entirely for this device (battery-only monitoring).
  • Ignore battery - excludes this device from battery checks entirely.
  • Apply to same-type devices - once a device has any override set, a button appears to copy those settings onto every other device of the same type (same app + same Homey driver, e.g. all your Aqara motion sensors) in one go - shows a preview of exactly which devices before you confirm.
  • Reset - clears all overrides for this device back to defaults.
  • Monitoring toggle (switch next to the device) - removes the device from monitoring entirely. Good for virtual devices, mains-powered devices, or anything you just don’t want watched.
  • Test button (only shown for devices with onoff/dim) - re-sends the device’s current value to itself, a non-intrusive way to check it’s actually reachable right now.

:magnifying_glass_tilted_right: Devices tab

  • Search - filters by name.
  • Sort - “Status first” (problems on top), “Name (A-Z)”, or “Zone + Name (A-Z)” (groups alphabetically by zone instead of Homey’s own zone order).
  • Stat tiles (Total / Offline / Low battery / Not monitored / Custom rules) - click any to filter the list.
  • Zone group bulk buttons - “Ignore zone” / “Monitor zone” toggles every device in that zone at once.

What the three statuses actually mean

  • :green_circle: ok - reporting recently, battery fine.
  • :orange_circle: not reporting - Homey still shows it connected, but no new data recently (see the setting above for what counts as “new data”).
  • :red_circle: unavailable - Homey itself has lost the connection (available: false), tracked in realtime.

:red_question_mark: Device Watchdog - FAQ

Q: Why is a device marked “not reporting“ even though it seems fine?

A: “Not reporting” tracks the time since a capability last changed value - not whether Homey can still reach the device (that’s “unavailable”). Event-driven devices (contact sensors, some Zigbee routers) only send data when something actually changes, so long gaps are normal for them. If you don’t want it flagged, either raise its threshold above its normal reporting gap, or enable “Count Homey’s ‘last seen’ toward ‘not reporting’” in Settings (globally, or just for that one device).

Q: What's the difference between “not reporting“ and “unavailable“?

A: “Unavailable” = Homey’s own connection to the device is down right now. “Not reporting” = Homey still shows it connected, but its data has gone stale. A device can be one, both, or neither.

Q: A device flickered to “unavailable“ for a few seconds and I got a notification - can I avoid that?

A: Yes - set “Delay before ‘unavailable’ counts” (global or per device) to a few seconds/minutes. Only a device still down after that grace period gets flagged/notified. Recovery is always instant, never delayed.

Q: Can I exclude a device entirely?

A: Yes, flip the toggle switch next to it in the Devices tab. Useful for virtual devices, mains-powered devices, or anything you just don’t need watched.

Q: I have a flaky device that keeps going unavailable - can I stop it from spamming me without ignoring it completely?

A: Use “Ignore unavailable” under its Details. It stays out of the summary trigger, timeline, and log, but its own per-device Flow trigger still works if you’ve built something around it specifically.

Q: Does the app replace Homey's own presence/connectivity detection?

A: No, it reads Homey’s own device status (available, capability data) and turns it into thresholds, Flow cards, a history log, Timeline entries, and a virtual device for Insights - it doesn’t replace or duplicate any core Homey functionality.

Q: Where does “last seen“ actually come from - can I see it in Homey itself?

A: It’s Homey’s own internal lastSeenAt field via the API, not something shown as a labeled field anywhere in Homey’s standard UI as far as I know.

Q: Does this app send any data outside my Homey?

A: No, everything runs locally on the Homey itself.

Q: I updated another app and a bunch of devices flagged unavailable - is that expected?

A: Yes, that can briefly happen while a driver restarts. Configuring a delay (see above) is the way to absorb that without a false alert.

Q: Can I get a Flow trigger for a specific device, not just the aggregate?

A: Yes - each category (battery low / not reporting / unavailable) has both a per-device trigger (with a device picker) and a summary trigger that fires once for a whole batch with a count + name list.

Q: I have several identical devices (e.g. 10 of the same motion sensor) - do I have to configure each one individually?

A: No - configure one of them under “Details”, then use the “Apply to same-type devices” button that appears. It only matches devices from the same app AND the same Homey driver (so it won’t lump, say, all your Shelly products together if they’re actually different models), and shows you exactly which devices will be affected before you confirm.

Q: I want to undo all my configuration and start over - is there a quick way?

A: Yes - “Reset to factory settings” at the bottom of the Settings tab resets every threshold and per-device rule back to default in one click (with a confirmation first). Your history log and last scan results are left alone.

Nice initiative!

It seems to function well.
Two observations:

The timeline messages are still in German, Homey is set to English.

One device reports every minute (global scan interval is set to 59 min). Once a day is more than enough for me :blush:
This concerns a local Tuya device, which is polled or disconnects every 30s continuously

Whoops, I should report @ Github

Thanks a lot for testing and for the detailed feedback! :folded_hands:

1. Good catch - the Timeline notifications (and a couple of internal error messages) were hardcoded in German regardless of Homey’s language setting. Fixed, see 1.2.1

2. That’s actually a scenario I hadn’t fully accounted for - a device that flaps/reconnects constantly (like your Tuya device) would spam the summary notification and Timeline every time it happens. I’ve added a new per-device setting, “Ignore unavailable”, that excludes a specific device from the summary trigger, Timeline, and history log - while its own dedicated Flow trigger card still works if you want to build something around it directly. That’ll already there.

No worries about posting here instead of GitHub - either works for me, happy to take feedback wherever it’s easiest for you. Thanks again!

Thanks for this app!

How does the battery monitoring function relate to Homey’s own battery monitoring?

Homey notifies me on the timeline in case a device’s battery is low (I believe it uses a 20% threshold) and when the battery level is restored again. I don’t think I can switch off Homey’s mechanism.

I assume your app’s monitoring and notifications are separate from the default ones from Homey?

Thanks for the question, good one to clarify!

Yes, Device Watchdog’s battery monitoring is completely separate from Homey’s own built-in low-battery notifications - two independent systems running in parallel. Homey’s own mechanism lets you exclude a device from its battery monitoring in the device’s own settings (though I’m honestly not sure whether that also silences the Timeline notification specifically, or just the monitoring itself) - either way, it doesn’t let you set your own custom threshold.

The main things Device Watchdog adds on top:

  • Configurable threshold - both a global default (30% by default, you can change the global %) and, if you want, a different threshold per individual device
  • Flow cards (trigger + condition) so you can build automations around low battery, not just get a Timeline notification
  • A history log of when each device was flagged
  • A virtual device exposing the count of low-battery devices as a capability, so it shows up in Homey Insights/dashboards over time

Since the two systems are independent, you may see both notifications for the same device if it crosses both thresholds - if that’s not useful for a specific device, you can set “Ignore battery” for just that device in Device Watchdog’s per-device settings, and it’ll only be handled by Homey’s own mechanism from then on.

Edit:

you can disable the timeline information regarding battery (homey’s internal function) in the app → settings → timeline → energy => disable timeline

also in the app:

-> devices → battery (the tile above) → settings (top right corner) → enable/disable devices

This app is completly separate, but much more customizable :slight_smile: i have almost 300 devices and many virtual ones. i also needed quick reactions (e.g. the solar device is offline) to react. that’s why i had a script first - and an app now :slight_smile:

Thanks for clarifying! And I see that your app is much more versatile in that regard indeed :grinning_face:.

All out of desperation (or too many devices) :grin:

Joke aside, I have many battery devices and some didn’t send an empty battery.. (e.g. Thermostat) that’s why I needed something better

Haha yes I understand :sweat_smile:.

Another question: the ‘general alarm’ in the Device Watchdog-device is that trigged by any of the three displayed capabilities or by a specific one:

In my setup I have several battery-powered devices that the app labels as ‘not reporting’, like Zigbee remote buttons/scene switches. Since they will likely remain in that state, would the general alarm be always on?

it’s triggered by either one of them. in my setup i disabled the watchdog for those devices (or just check the setting “only battery”). so they are not calculated in the VD and not for the alarm. let me know if you want a seperate checkbox e.g. ignore for VD :slight_smile:

Edit

Ore a setting / dropdown which capability to alert

new settings (with toggle) for the generic alarm → v1.3.0

Thanks for adding those toggles, that was quick :grinning_face:!

Device Watchdog v1.4.0 is out! (still Testversion)

This update adds a grace period for “unavailable” detection, aimed at cutting down false alarms from brief disconnects.

What’s new:

A device going unavailable no longer counts immediately — you can now set a delay (in seconds or minutes) before it’s treated as a confirmed problem. This is configurable globally in Settings, and can be overridden per device just like the other thresholds.

Why this matters: if another app updates and briefly drops its devices, or Homey itself restarts, devices can flicker to “unavailable” for a few seconds before reconnecting on their own. Previously this could trigger a false Flow trigger, timeline notice, or log entry for something that resolved itself moments later. With a delay configured, only devices that are still unavailable once the grace period has passed get flagged.

This delay applies consistently across the app: the per-device Flow trigger, the summary trigger, timeline notifications, the history log, and the virtual Watchdog device’s counter/alarm all respect it. The only things that stay instant are the live status shown in the Settings UI and the condition cards, plus recovery — a device coming back online is always reported immediately, no delay there.

It also applies across app/Homey restarts: if a device is already unavailable when Device Watchdog starts up, it now goes through the same grace period instead of being counted right away — so a restart with devices still reconnecting won’t cause a spurious alarm.

Default is 0 (instant), so nothing changes unless you configure a delay yourself.

As always, feedback and bug reports welcome here!

going to apply for a testversion eod

Great improvements again, Rick!

Sorting

Can you elaborate on how the zones are sorted?
It kind of follows my manually sorted zones, but not consistently.
It looks like the subzones ended up on the end of the listing.
Maybe it’s the easiest, if it’s possible, to add a “Sort by zone and name (A-Z)” to the dropdown?

Readability

The (tiny) gray on black text is unreadable outdoors > For an older guy like me that is (App is always in dark mode)
Is it possible to change gray to lightblue or something like that?

Great tool! It’s another “why does Homey not provide for such a monitoring tool”!

Hi Peter,

Thanks for the detailed report, both are fixed in the new update.

Sorting - Zone grouping was always following Homey’s own zone tree order, which turned out to not always be reliable (depends on whether Homey’s order field is actually set for a zone). Added your suggested “Sort by zone and name” as a third option in the sort dropdown - it groups zones alphabetically instead, with devices sorted A-Z within each zone. Should give you a predictable, consistent order regardless of what Homey’s zone tree reports.

Readability - You were right, the muted/gray text color was never adjusted for dark mode, so it stayed the same shade meant for a white background. Bumped it up for dark mode by default. Also added an optional “Increase text contrast” toggle in Settings if you want it even brighter - good for bright outdoor light.

Works like a charm. Much appreciated! Thank you.

I have some questions.
Why are all my aqara router marked as not responding?
Why are some of my aqara enddevices marked as not responding though all of them have a last seen timestamp not older than 60 something (~7) minutes?
The so far only exeption is a Nous PIR that only says hello every ~3 hours.


Oh, is there a chance to ignore virtual device by excluding the app? Am refering to the „Advanced virtual devices“ app and others.

I add the info about the nous pir too:

Here info about „Wall Plug 4“. By the way perfectly okay.


Oh, have an idea. Homey uses UTC. The app seems to think it uses local time. Just send a test command to plug 4 at 11:05 and the app displays 10:05 as timestamp.

Quick follow-up on this - v1.6.0 is out and addresses both points:

New optional setting: “Count Homey’s ‘last seen’ toward ‘not reporting’” (Settings → default thresholds, off by default). When enabled, a device is no longer flagged just because a capability value hasn’t changed - if Homey’s own last-seen/keep-alive is more recent than the threshold, that counts as a sign of life too. This should fix the false positives you saw on your Aqara routers and end devices, since those are confirmed connected far more often than they send new data. It’s opt-in rather than the new default, since it does make the check less sensitive to a device that’s connected but whose sensor data is genuinely stuck - if that’s not a concern for your setup, go ahead and enable it.

The virtual “Watchdog status” device no longer monitors itself - fixed as well, it’s now excluded everywhere (device list, scans, counts, Flow card device pickers).

For other virtual devices (or any mains-powered device where staleness/battery just isn’t relevant, e.g. from Advanced Virtual Device) - you don’t need a bulk option for that: just flip the toggle switch next to the device in the “Geräte” tab. That removes it from monitoring entirely, individually, right now.

Let me know if the last-seen setting clears things up for your setup!

EDIT:

This setting is now also available per individual device settings (v1.6.1)

New: detailed informations & FAQ: [APP][Pro] Device Watchdog - Battery, connectivity & staleness monitoring for all your devices - #2 by Rick_D