# Read-only access to the Z-Wave network topology for apps?

**URL:** <https://community.homey.app/t/read-only-access-to-the-z-wave-network-topology-for-apps/160355>\
**Category:** Developers\
**Tags:** z-wave\
**Created:** [October 4, 2026, 1:09pm UTC](https://community.homey.app/t/read-only-access-to-the-z-wave-network-topology-for-apps/160355 "2026-10-04T13:09:05Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Arve\_Bjornerud](https://sea1.discourse-cdn.com/flex025/user_avatar/community.homey.app/arve_bjornerud/32/178375_2.png) [@Arve\_Bjornerud](https://community.homey.app/u/Arve_Bjornerud)\
**Post date:** [October 4, 2026, 1:09pm UTC](https://community.homey.app/t/read-only-access-to-the-z-wave-network-topology-for-apps/160355/1 "2026-10-04T13:09:05Z")

</div>

Hi all,

I develop Network Visualizer (`no.arvebjoe.network-visualizer`), an app that draws the Homey’s Zigbee, Thread & Matter and Z-Wave networks as a map: each device’s route back to Homey and the quality of every link.

Zigbee and Thread work well, but for Z-Wave an app can’t read the mesh. `ManagerZwave.getState()` gives every node and its TX counters, but no neighbours and no routes. Homey’s own developer tools get those from `ManagerZwave.runCommand` with `getNetworkTopology` and `getFailedNodes`, but `runCommand` requires the `homey.system` scope. An app with `homey:manager:api` only gets `homey.system.readonly`, so both calls fail with `Missing Scopes`.

Opening `runCommand` to apps would be a bad idea, since it also reaches `factoryReset` and `removeNode`. What I’m asking for is a read-only way to get the same data, like `ManagerThread.getNetworkTopology()` already gives for Thread.

I’ve filed it here, with the details and a code sample that reproduces it:

> <https://github.com/athombv/homey-web-api-issues/issues/73>
>
> \*\*Summary\*\*
> 
> Apps with the \`homey:manager:api\` permission can read the Thread to…pology (\`ManagerThread.getNetworkTopology\`) and the full Zigbee state, but they can't read the Z-Wave topology. The only way to get it is \`ManagerZwave.runCommand\`, which requires the \`homey.system\` scope. Apps only get \`homey.system.readonly\`, so the call fails with \`Missing Scopes\`.
> 
> \*\*What works\*\*
> 
> \`ManagerZwave.getState()\` returns every node with its device classes and TX counters, but no neighbours and no routes.
> 
> \*\*What's missing\*\*
> 
> Homey's own developer tools get the Z-Wave mesh from \`ManagerZwave.runCommand\`:
> 
> \- \`getNetworkTopology\`: each node's neighbours and its last working route
> \- \`getFailedNodes\`: the nodes the controller has marked as failed
> 
> From an app, both calls fail:
> 
> \`\`\`js
> const api = await HomeyAPI.createAppAPI({ homey: this.homey });
> await api.zwave.runCommand({ command: 'getNetworkTopology' });
> // Error: Missing Scopes
> \`\`\`
> 
> In the Web API specification (\`HomeyAPIV3Local.json\` in \`homey-api\`), \`ManagerZwave.runCommand\` (\`POST /command\`) requires \`homey.system\`, while \`getState\` requires \`homey.system.readonly\`. An app with \`homey:manager:api\` only gets \`homey.system.readonly\`.
> 
> \*\*Request\*\*
> 
> I understand why \`runCommand\` isn't open to apps: it also reaches commands like \`factoryReset\` and \`removeNode\`. So the request is a read-only way to get the same data, for example \`ManagerZwave.getNetworkTopology()\` and \`ManagerZwave.getFailedNodes()\` under a read-only scope, the same way \`ManagerThread.getNetworkTopology()\` (\`GET /topology\`, scope \`homey.device.readonly\`) already works for Thread.
> 
> \*\*Why it matters\*\*
> 
> I develop Network Visualizer (\`no.arvebjoe.network-visualizer\`), an app that draws the Homey's Zigbee, Thread & Matter and Z-Wave networks as a map: each device's route back to Homey and the quality of every link. Zigbee and Thread work well. Z-Wave can only be drawn as a star, with every device joined straight to Homey, so the map can't show routes, repeaters or weak links. Those are exactly what users look for when their Z-Wave network misbehaves.
> 
> \*\*Environment\*\*
> 
> \- Homey Pro, firmware 13.5.0
> \- 16 Z-Wave nodes
> \- App SDK 3, \`homey-api\` 3.20.0 via \`HomeyAPI.createAppAPI\`, permission \`homey:manager:api\`
> 
> I'm happy to test anything on my own Homey.

This is where the app gives up on the mesh and draws Z-Wave as a star, every device joined straight to Homey:

> <https://github.com/arvebjoe/no.arvebjoe.network-visualizer/blob/8cd9d7060b957579a6ff9394193d3b30b9270c79/lib/zwave-graph.ts#L3-L17>

Two questions:

1. To Athom’s developers: is a read-only Z-Wave topology call something you would consider? I’m happy to test anything on my own Homey with 16 Z-Wave nodes.

2. Has anyone found another way for an app to read Z-Wave neighbours or routes that I’ve missed?

Thanks,  
Arve
