Local integration for Tenda Mesh routers (EX3, EX6, MX3, MX6 and compatible variants).
It communicates directly with the router via local HTTP — no cloud, no Tenda account required.
| Entity | Type | Description |
|---|---|---|
| WAN Status | sensor |
WAN connection status (connected / disconnected) |
| WAN IP | sensor |
Public WAN IP address |
| Total Clients | sensor |
Total number of devices connected to the mesh |
| SSID 2.4 GHz | sensor |
2.4 GHz Wi-Fi network name |
| SSID 5 GHz | sensor |
5 GHz Wi-Fi network name |
| SSID 6 GHz | sensor |
6 GHz Wi-Fi network name (if supported) |
| Node Online | binary_sensor |
Mesh node reachable (connectivity) |
| Node Clients | sensor |
Clients connected to the single node |
| Node Link Rate | sensor |
Link rate to the master (Mbps) |
| Node Hop Count | sensor |
Number of hops from the root |
| Node Role | sensor |
master or satellite |
| Node IP | sensor |
Node IP address |
- Copy the
custom_components/tenda_mesh/folder into theconfig/custom_components/directory of your Home Assistant installation. - Restart Home Assistant.
- Go to Settings → Devices & Services → + Add Integration.
- Search for Tenda Mesh and follow the setup wizard.
- In HACS, add this repository as a Custom Repository (category: Integration).
- Install Tenda Mesh.
- Restart Home Assistant.
- Configure the integration as described above.
During the setup wizard, the following are required:
| Field | Description | Default |
|---|---|---|
| IP Address | Local IP of the Tenda master router | — |
| Username | Local panel user | admin |
| Password | Local panel password (plain text) | — |
The password is hashed with MD5-uppercase before being sent to the router (native Tenda scheme) and is never transmitted in plain text to the API.
- Home Assistant 2026.1.0 or higher
- Python library:
pycryptodome>=3.19.0(automatically installed by HA) - The Tenda router must be reachable on the same local network
config_flow ──▶ ConfigEntry
│
▼
TendaMeshCoordinator (polling every N sec)
│
▼
TendaLocalClient (aiohttp, AES encrypt/decrypt)
│
▼
Tenda Mesh Router (local HTTP)
The integration reuses the session token (stok) and encryption key (sign). A full login sequence is performed only on startup or when the session expires:
GET /goform/loginInfo(pre-login)POST /login/Auth(authentication)GET /goform/stokCfg(stok + sign retrieval)
Standard updates then only call:
4. GET /;stok=.../goform/getModules with modules: meshTopo, wanStatus, deviceListNotNeedRate, wifiBasicCfg, ledCfg, apModeStatus, workMode
Individual devices connected to a node (phones, PCs, etc.) are not created as separate device_tracker entities to avoid flooding Home Assistant with unnecessary entities. Instead, the full list of devices is exposed as an attribute of the Connected Clients sensor.
To easily view the table of connected devices on your Lovelace dashboard, you can use the built-in Home Assistant Markdown Card.
Add a new manual card to your dashboard and paste this code (make sure to replace sensor.tenda_node_xxxxxx_connected_clients with the actual ID of your sensor, which you can find in the integration's entity list):
type: markdown
content: |
### Devices on {{ state_attr('sensor.tenda_node_xxxxxx_connected_clients', 'friendly_name') | replace(' Connected Clients', '') }}
| Device Name | IP Address | MAC Address | Connection Type |
| :--- | :--- | :--- | :--- |
{% for device in state_attr('sensor.tenda_node_xxxxxx_connected_clients', 'connected_devices') -%}
| {{ device.name }} | {{ device.ip }} | {{ device.mac }} | {{ device.connection }} |
{% endfor %}This will generate a dynamic table that automatically updates showing the name, IP, MAC, and type (e.g., 2.4G, 5G, wire) of each device connected to that specific node.
This is an active open-source project. We are always open to people who want to use the code or contribute to it.
We have set up a separate document containing our contribution guidelines.
Thank you for being involved! 😍
Please, if You want support this kind of projects:
Many Thanks,
Fabio Mauro
Fabio Mauro Bigmoby
