Zigbee Map - Visualize your mesh network

Found a way to keep everything off GitHub while still making it installable through HACS. Hopefully I didn’t break anything important in the process, but if I did… let’s pretend it was a feature.

I updated the original post with installation instructions. Enjoy!

2 Likes

Maybe tips from this page will help you: Improve network range and stability | Zigbee2MQTT

From your screenshot, it looks like you have two clusters of routers that communicate well within their own group, but only show red links between the two clusters. It almost resembles a setup where devices are split across two floors or even two separate buildings with some distance between them.

My personal Zigbee hygiene (from one of my posts above)
1 Like

Thanks a lot! Removed the gpm install and opted for hacs: works as expected!

1 Like

Can you share the repository directly for people who don’t use the My Home Assistant integration?

Edit: never mind. Worked it out from the button URL.

1 Like

Released version 2.6.0 with the following changes:

Added

  • Add “Link visibility threshold” option for fading low or high LQI links - @ant0mes

Fixed

  • Fix hassfest warnings
  • Fix options dialog not opening from the config entry


Click here if version 2.6.0 doesn't appear in the 'About' tab after updating.
  1. Go to Zigbee Map and select the About tab
  2. Clear browser or companion app cache:
    • Firefox browser:
      Press Ctrl + F5 (Linux/Windows) or Cmd + Shift + R (Mac).
    • Chrome browser:
      Press F12 (Linux/Windows) or Cmd + Option + I (Mac) to open Developer Tools. Right‑click the Reload button (the circular arrow next to the address bar). Select Empty Cache and Hard Reload.
    • Companion app:
      On your mobile device, go to SettingsCompanion appTroubleshootingReset frontend cache. Restart the app.

Have fun!

2 Likes

Could you please add the URL that needs to be added to HACS as a custom repository to the HACS installation instructions?
Not everyone can or wants to use the My Home Assistant integration.
Thank you.

1 Like

Updated the first post, thanks for the heads up.

1 Like

Got my installation moved over from the configuration.yaml to the HACS one now :+1:

The map works fine, but in the log I’m missing the per-device entries on the left hand side:

Any hints how to address this?
I already tried the force reload in Edge and Chrome - no success :frowning:

1 Like

Ohh… I was just thinking about submitting a feature request to change the colors of the LQI links, but the fade is a fantastic idea, too. Nice one! Thanks @dandanache

1 Like

Released version 2.6.1 with the following quick fix:

Fixed

Have fun!

1 Like

It’s not you, I derped :slight_smile:
Patched it up in 2.6.1!
Thanks for catching it, and sorry for the hiccup. Promise to keep the gremlins in check next time.

This is really handy for spotting devices with only low LQI links. Thank you.

Also: Yay! I have no devices like that.

1 Like

Thanks - worked fine after just downloading the new version via HACS.

Is there a real need for restarting HA after the download or is that just a standard HACS feature?

I believe it is just HACS doing its thing. GPM does the same thing after an update.

1 Like

I’m looking into whether it’s possible to generate a network map for ZHA devices as well, but I don’t currently have a working development environment to test with. I could really use help from someone who does have ZHA running.

If you want to help, here’s what to do:

  • Open the Home Assistant UI on any page
  • Press F12 to open the browser’s Developer Tools
  • Switch to the Console tab
  • Run the following command (your browser may warn you about pasting code):
    await document.querySelector("home-assistant").hass.callWS({type: "zha/devices"})
  • What does the returned data structure look like?
  • For each device entry, is there a “neighbors” field? If so, what format does it use?

For reference, here’s a screenshot of the “config_entries/get” output on my system. Unfortunately “zha/devices” fails for me, so I can’t inspect it myself.

Thanks in advance :slight_smile:

2 Likes

Hope this is helpful …

1 Like

And this screenshot too:

1 Like

This is perfect! Thank you so much.

Looks like we have all the bits needed to build the map for ZHA. Nice :slight_smile:

2 Likes

Hope this is the info you’re after from ZHA

await document.querySelector("home-assistant").hass.callWS({type: "zha/devices"})
(18) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
0: {ieee: 'e4:56:ac:ff:fe:6c:ca:6a', nwk: 0, manufacturer: 'Nabu Casa', model: 'Home Assistant Connect ZBT-2', name: 'Home Assistant Connect ZBT-2', …}
   active_coordinator: true
   area_id: "living_room"
   available: true
   device_reg_id: "8003d52e2dd8baf4f4fa1bda9506d8af"
   device_type: "Coordinator"
   endpoint_names: (2) [{…}, {…}]
   entities: []
   exposes_features: []
   ieee: "e4:56:ac:ff:fe:6c:ca:6a"
   last_seen: "2026-01-20T17:43:17"
   lqi: 255
   manufacturer: "Nabu Casa"
   manufacturer_code: 43981
   model: "Home Assistant Connect ZBT-2"
   name: "Home Assistant Connect ZBT-2"
   neighbors: Array(9)
      0: {device_type: 'Router', rx_on_when_idle: 'On', relationship: 'Sibling', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: '34:25:b4:ff:fe:ec:3e:9d', …}
      1: {device_type: 'Router', rx_on_when_idle: 'On', relationship: 'Sibling', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: '34:25:b4:ff:fe:bd:e3:f5', …}
      2: 
         depth: "15"
         device_type: "Router"
         extended_pan_id: "20:95:3f:99:12:1a:c0:14"
         ieee: "f0:74:bf:ff:fe:e0:b6:c9"
         lqi: "171"
         nwk: "0x3531"
         permit_joining: "Unknown"
         relationship: "Sibling"
         rx_on_when_idle: "On"
         [[Prototype]]: Object
      3: {device_type: 'Router', rx_on_when_idle: 'On', relationship: 'Sibling', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: 'f0:82:c0:ff:fe:fe:b6:7a', …}
      4: {device_type: 'Router', rx_on_when_idle: 'On', relationship: 'Sibling', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: 'bc:8d:7e:ff:fe:21:cb:81', …}
      5: {device_type: 'Router', rx_on_when_idle: 'On', relationship: 'Sibling', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: '00:12:4b:00:24:c2:76:4b', …}
      6: {device_type: 'Router', rx_on_when_idle: 'On', relationship: 'Sibling', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: 'bc:8d:7e:ff:fe:30:8e:77', …}
      7: {device_type: 'Router', rx_on_when_idle: 'On', relationship: 'Sibling', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: '34:25:b4:ff:fe:d0:83:d0', …}
      8: {device_type: 'Router', rx_on_when_idle: 'On', relationship: 'Sibling', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: '00:12:4b:00:23:43:74:12', …}
      length: 9
      [[Prototype]]: Array(0)
   nwk: 0
   power_source: "Mains"
   quirk_applied: false
   quirk_class: "zigpy.device.Device"
   routes: Array(7)
      0: {dest_nwk: '0x3531', route_status: 'Active', memory_constrained: false, many_to_one: false, route_record_required: false, …}
      1: {dest_nwk: '0x4F16', route_status: 'Active', memory_constrained: false, many_to_one: false, route_record_required: false, …}
      2: {dest_nwk: '0xC787', route_status: 'Active', memory_constrained: false, many_to_one: false, route_record_required: false, …}
      3: {dest_nwk: '0xE0FD', route_status: 'Active', memory_constrained: false, many_to_one: false, route_record_required: false, …}
      4: {dest_nwk: '0x8F56', route_status: 'Active', memory_constrained: false, many_to_one: false, route_record_required: false, …}
      5: {dest_nwk: '0xA237', route_status: 'Active', memory_constrained: false, many_to_one: false, route_record_required: false, …}
      6: {dest_nwk: '0x6487', route_status: 'Active', memory_constrained: false, many_to_one: false, route_record_required: false, …}
      length: 7
      [[Prototype]]: Array(0)
   rssi: 0
  signature: {node_descriptor: {…}, endpoints: {…}, manufacturer: 'Nabu Casa', model: 'Home Assistant Connect ZBT-2'}
   user_given_name: "HA Connect ZBT-2"
   [[Prototype]]: Object
1: 
   active_coordinator: falsearea_id: "living_room"available: true
   device_reg_id: "54e730a8f7a22ac09ab37e1d1e492857"
   device_type: "Router"
   endpoint_names: (2) [{…}, {…}]
   entities: (6) [{…}, {…}, {…}, {…}, {…}, {…}]
   exposes_features: []
   ieee: "34:25:b4:ff:fe:ec:3e:9d"
   last_seen: "2026-01-20T20:49:11"
   lqi: 192
   manufacturer: "IKEA of Sweden"
   manufacturer_code: 4476
   model: "TRADFRI control outlet"
   name: "IKEA of Sweden TRADFRI control outlet"
   neighbors: Array(9)
      0: {device_type: 'Coordinator', rx_on_when_idle: 'On', relationship: 'Parent', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: 'e4:56:ac:ff:fe:6c:ca:6a', …}
      1: {device_type: 'Router', rx_on_when_idle: 'On', relationship: 'Sibling', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: '34:25:b4:ff:fe:bd:e3:f5', …}
      2: {device_type: 'Router', rx_on_when_idle: 'On', relationship: 'Sibling', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: 'f0:74:bf:ff:fe:e0:b6:c9', …}
      3: 
         depth: "15"
         device_type: "Router"
         extended_pan_id: "20:95:3f:99:12:1a:c0:14"
         ieee: "f0:82:c0:ff:fe:fe:b6:7a"
         lqi: "117"
         nwk: "0x4335"
         permit_joining: "Unknown"
         relationship: "Sibling"
         rx_on_when_idle: "On"
         [[Prototype]]: Object
      4: {device_type: 'Router', rx_on_when_idle: 'On', relationship: 'Sibling', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: 'bc:8d:7e:ff:fe:21:cb:81', …}
      5: {device_type: 'Router', rx_on_when_idle: 'On', relationship: 'Sibling', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: '00:12:4b:00:24:c2:76:4b', …}
      6: {device_type: 'Router', rx_on_when_idle: 'On', relationship: 'Sibling', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: 'bc:8d:7e:ff:fe:30:8e:77', …}
      7: {device_type: 'Router', rx_on_when_idle: 'On', relationship: 'Sibling', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: '34:25:b4:ff:fe:d0:83:d0', …}
      8: {device_type: 'Router', rx_on_when_idle: 'On', relationship: 'Sibling', extended_pan_id: '20:95:3f:99:12:1a:c0:14', ieee: '00:12:4b:00:23:43:74:12', …}length: 9
      [[Prototype]]: Array(0)
   nwk: 1077
   power_source: "Mains"
   quirk_applied: true
   quirk_class: "zigpy.quirks.v2.CustomDeviceV2"
   routes: (3) [{…}, {…}, {…}]
   rssi: -52
   signature: {node_descriptor: {…}, endpoints: {…}, manufacturer: 'IKEA of Sweden', model: 'TRADFRI control outlet'}
   user_given_name: "TRADFRI plug"
   [[Prototype]]: Object

2: {ieee: '34:25:b4:ff:fe:d0:83:d0', nwk: 55967, manufacturer: 'IKEA of Sweden', model: 'TRADFRI Signal Repeater', name: 'IKEA of Sweden TRADFRI Signal Repeater', …}
3: {ieee: '34:25:b4:ff:fe:bd:e3:f5', nwk: 2548, manufacturer: 'IKEA of Sweden', model: 'TRADFRI Signal Repeater', name: 'IKEA of Sweden TRADFRI Signal Repeater', …}
4: {ieee: 'bc:8d:7e:ff:fe:30:8e:77', nwk: 51079, manufacturer: 'IKEA of Sweden', model: 'INSPELNING Smart plug', name: 'IKEA of Sweden INSPELNING Smart plug', …}
5: {ieee: 'bc:8d:7e:ff:fe:21:cb:81', nwk: 20246, manufacturer: 'IKEA of Sweden', model: 'INSPELNING Smart plug', name: 'IKEA of Sweden INSPELNING Smart plug', …}
6: {ieee: '00:12:4b:00:23:43:74:12', nwk: 57597, manufacturer: 'SONOFF', model: 'BASICZBR3', name: 'SONOFF BASICZBR3', …}
7: {ieee: '00:12:4b:00:24:c2:76:4b', nwk: 41527, manufacturer: 'TexasInstruments', model: 'ti.router', name: 'TexasInstruments ti.router', …}
8: {ieee: 'f0:74:bf:ff:fe:e0:b6:c9', nwk: 13617, manufacturer: 'IKEA of Sweden', model: 'INSPELNING Smart plug', name: 'IKEA of Sweden INSPELNING Smart plug', …}
9: {ieee: 'f0:82:c0:ff:fe:fe:b6:7a', nwk: 17205, manufacturer: 'IKEA of Sweden', model: 'TRADFRI Signal Repeater', name: 'IKEA of Sweden TRADFRI Signal Repeater', …}
10: {ieee: '04:e3:e5:ff:fe:ba:3f:53', nwk: 36694, manufacturer: '_TZE200_icka1clh', model: 'TS0601', name: '_TZE200_icka1clh TS0601', …}
11: {ieee: '04:e3:e5:ff:fe:ba:43:3b', nwk: 25735, manufacturer: '_TZE200_icka1clh', model: 'TS0601', name: '_TZE200_icka1clh TS0601', …}
12: {ieee: '00:15:8d:00:06:43:de:bf', nwk: 54329, manufacturer: 'LUMI', model: 'lumi.sensor_switch', name: 'LUMI lumi.sensor_switch', …}
13: {ieee: '00:12:4b:00:25:11:8e:34', nwk: 40336, manufacturer: 'eWeLink', model: 'TH01', name: 'eWeLink TH01', …}
14: {ieee: '00:12:4b:00:24:45:7e:1f', nwk: 48704, manufacturer: 'eWeLink', model: 'MS01', name: 'eWeLink MS01', …}
15: {ieee: '88:1a:14:ff:fe:e7:5e:5e', nwk: 16335, manufacturer: 'IKEA of Sweden', model: 'Remote Control N2', name: 'IKEA of Sweden Remote Control N2', …}
16: {ieee: '6c:5c:b1:ff:fe:14:8d:d3', nwk: 30484, manufacturer: 'IKEA of Sweden', model: 'RODRET Dimmer', name: 'IKEA of Sweden RODRET Dimmer', …}
17: {ieee: '38:5c:fb:ff:fe:06:24:e7', nwk: 38732, manufacturer: 'IKEA of Sweden', model: 'TRADFRIbulbE27WSglobeopal1055lm', name: 'IKEA of Sweden TRADFRIbulbE27WSglobeopal1055lm', …}length: 18[[Prototype]]: Array(0)
1 Like

Released version 2.7.0 with the following change:

Added

  • Add support for mapping ZHA devices

Notes:

  • Zigbee Map should auto-detect Z2M / ZHA
  • Zigbee Log does not work with ZHA (yet?)

Have fun!

2 Likes