[Custom Component] MiWiFi – XiaoHack Edition (Xiaomi Router Integration)

Hi everyone! :wave:

I’ve revived and extended the original MiWiFi integration which hasn’t been updated since 2023.

This new fork includes bug fixes, improved router support, and active development, including mesh/repeater mode improvements, device tracking, and more!


:link: GitHub Repository:

:point_right: GitHub - JuanManuelRomeroGarcia/hass-miwifi: MiWiFi for Home Assistant

:globe_with_meridians: Compatible with Home Assistant >= 2023.3.0


:sparkles: Features

  • :white_check_mark: Works with most Xiaomi routers

  • :satellite: Mesh & Repeater mode support

  • :repeat: Device tracker with full LAN/WiFi/GUEST split

  • :arrows_counterclockwise: Automatic firmware update detection

  • :bulb: LED light control entity

  • :chart_with_upwards_trend: Wi-Fi signal and bandwidth sensors

  • :wrench: Option to force-load in mesh mode

  • :brain: Automatic device restoration & cleanup


:hammer_and_wrench: Installation via HACS

  1. Go to HACS > Integrations > Custom Repositories

  2. Add this repo:


https://github.com/JuanManuelRomeroGarcia/hass-miwifi

  1. Choose category: Integration

  2. Search for MiWiFi (XiaoHack Edition), install, and restart Home Assistant

  3. Configure via Settings > Devices & Services


:test_tube: Supported Routers

  • Mi Router 4A Gigabit V2 (R4AV2)

  • Xiaomi Router AC1200 (RB02)

  • Xiaomi 5G CPE Pro (CB0401)

  • Plus many other Xiaomi/Mi/Redmi routers


:package: Latest Version – v3.0.3

Check full changelog here:

:point_right: Releases · JuanManuelRomeroGarcia/hass-miwifi · GitHub


:speech_balloon: Feedback & Support

Feel free to open issues or suggest improvements on GitHub!

This is a community-driven effort, and your support helps keep it alive. :blush:


Made with :heart: by [@JuanManuelRomeroGarcia]

3 Likes

:package: v3.0.5 – XiaoHack Edition

This release introduces essential bugfixes and compatibility updates following the major v3.0.4 refresh.

:white_check_mark: Compatibility

Compatible with Home Assistant 2025.4.0 and above.

Fully backward-compatible with previous supported devices.

Add model “RD12” Xiaomi Router AX1500 EU,

Add model " RA80V2" Xiaomi AX3000 (CN).

:blue_book: How to Update

Replace the files in your custom_components/miwifi/ folder.

Restart Home Assistant completely to apply changes.

Check the logs to confirm proper integration loading.

:pushpin: Reminder for Migrators

If you’re migrating from the original dmamontov/hass-miwifi:

:arrow_right: Remove the old integration.

:arrow_right: Add this repo via HACS as a custom repository:

Maintained with :heart: by
@JuanManuelRomeroGarcia

1 Like

:package: v3.0.8 – XiaoHack Edition

This release introduces essential improvements, bugfixes, and new features for better compatibility and performance.


:bug: Fixes & Improvements

  • :white_check_mark: Added WAN IP sensor
    Shows your router’s external IP (wan_ip) in Home Assistant.

  • :white_check_mark: Added WAN Type sensor
    Displays the connection type (pppoe, dhcp, etc.) as reported by your router.

  • :white_check_mark: WAN speeds now in Mb/s (optional)
    Download and upload speeds can now be displayed in Mb/s (megabits per second) instead of raw B/s.
    :heavy_plus_sign: Option available in integration configuration.

  • :white_check_mark: Mode sensor values are now readable
    Shows Default or Mesh instead of numbers (0, 9).

  • :white_check_mark: Optional unit selection in config flow
    You can now choose between Mb/s and B/s when configuring the integration.

  • :repeat: Improved sensor class and update logic
    Updated the MiWifiSensor class to dynamically switch units and refresh values consistently.

  • :test_tube: Updated constants, config flow, and options schema.


:white_check_mark: Compatibility

  • :white_check_mark: Compatible with Home Assistant 2025.4.0 and above.
  • :white_check_mark: Fully backward-compatible with previous supported routers.
  • :white_check_mark: Support for routers in mesh mode.

:blue_book: How to Update

  1. Replace all files inside your custom_components/miwifi/ directory with the contents of this release.
  2. Restart Home Assistant completely.
  3. Verify correct loading in Developer Tools > Logs.
  4. Visit Settings > Devices & Services > MiWiFi > Configure to set new unit options.

:pushpin: Reminder for Migrators

If you’re migrating from the original dmamontov/hass-miwifi:

:arrow_right: Remove the old integration.
:arrow_right: Add this repo via HACS as a custom repository:

https://github.com/JuanManuelRomeroGarcia/hass-miwifi

Maintained with :heart: by @JuanManuelRomeroGarcia

Full Changelog: Comparing v3.0.7...v3.0.8 · JuanManuelRomeroGarcia/hass-miwifi · GitHub

Hi, i have 2 AX3000 with Version 1.4.31 , the main one never ends the configuration process

image

the satellite has all the entities in unavailable status

any ideas?

What version of miwifi do you use?

The latest 3.1.9

You can put the integration in debug mode and pass me the files that are in Config/Miwifi/Logs. If you want you can enter the telegram group and search me @xiaohack_web so you don’t have to expose the files here.

HI,
not sure I did properly

this is what I see

here the log
Infolog

2025-06-10 23:13:38,740 - INFO - [MiWiFi] First installation detected, downloading frontend panel version 1.2.3
2025-06-10 23:13:45,620 - INFO - [MiWiFi] Panel successfully registered with version: 1.2.3
2025-06-10 23:13:52,622 - INFO - [MiWiFi] Compatibility detection finished: {‘mac_filter’: True, ‘mac_filter_info’: True, ‘per_device_qos’: False}
2025-06-10 23:13:52,622 - INFO - [MiWiFi] Capabilities detected: {‘mac_filter’: True, ‘mac_filter_info’: True, ‘per_device_qos’: False}
2025-06-10 23:15:13,193 - INFO - [MiWiFi] :inbox_tray: Servicio ‘select_main_router’ invocado con MAC: XX:XX:XX:XX:XX:XX
2025-06-10 23:15:13,233 - INFO - [MiWiFi] :white_check_mark: MAC Manual saved correctly in /config/.storage/miwifi/miwifi_main_router.json
2025-06-10 23:15:13,234 - INFO - [MiWiFi] :white_check_mark: Manual MAC guardada correctamente: XX:XX:XX:XX:XX:XX
2025-06-10 23:15:13,513 - INFO - [MiWiFi] Main router restored from saved MAC: XX:XX:XX:XX:XX:XX
2025-06-10 23:15:13,627 - INFO - [PanelJS] :computer_mouse: User selected router: XX:XX:XX:XX:XX:XX
2025-06-10 23:15:13,640 - INFO - [PanelJS] :computer_mouse: Manual router XX:XX:XX:XX:XX:XX selected from UI (dialogs.js)
2025-06-10 23:15:47,229 - INFO - [MiWiFi] Main router restored from saved MAC: XX:XX:XX:XX:XX:XX
2025-06-10 23:15:52,056 - INFO - [MiWiFi] :inbox_tray: Servicio ‘select_main_router’ invocado con MAC:
2025-06-10 23:15:52,063 - INFO - [MiWiFi] :wastebasket:Manual MAC file deleted: /config/.storage/miwifi/miwifi_main_router.json
2025-06-10 23:15:52,064 - INFO - [MiWiFi] :broom: Limpieza de selección manual de router principal.
2025-06-10 23:19:07,977 - INFO - [MiWiFi] Compatibility detection finished: {‘mac_filter’: True, ‘mac_filter_info’: True, ‘per_device_qos’: True}
2025-06-10 23:19:07,978 - INFO - [MiWiFi] Capabilities detected: {‘mac_filter’: True, ‘mac_filter_info’: True, ‘per_device_qos’: True}

warninglog

2025-06-10 23:15:53,486 - WARNING - [PanelJS] :x: No main router MAC found – fallback not resolved (status.js)
2025-06-10 23:19:39,595 - WARNING - Error connecting to router (attempt #1 of 10): LuciConnectionError(‘Connection error’)
2025-06-10 23:20:06,651 - WARNING - Error connecting to router (attempt #2 of 10): LuciConnectionError(‘Connection error’)
2025-06-10 23:20:34,466 - WARNING - Error connecting to router (attempt #3 of 10): LuciConnectionError(‘Connection error’)
2025-06-10 23:21:02,939 - WARNING - Error connecting to router (attempt #4 of 10): LuciConnectionError(‘Connection error’)
2025-06-10 23:21:32,265 - WARNING - Error connecting to router (attempt #5 of 10): LuciConnectionError(‘Connection error’)
2025-06-10 23:22:02,950 - WARNING - Error connecting to router (attempt #6 of 10): LuciConnectionError(‘Connection error’)
2025-06-10 23:22:34,383 - WARNING - Error connecting to router (attempt #7 of 10): LuciConnectionError(‘Connection error’)
2025-06-10 23:23:06,364 - WARNING - Error connecting to router (attempt #8 of 10): LuciConnectionError(‘Connection error’)
2025-06-10 23:23:39,549 - WARNING - Error connecting to router (attempt #9 of 10): LuciConnectionError(‘Connection error’)
2025-06-10 23:24:13,634 - WARNING - Error connecting to router (attempt #10 of 10): LuciConnectionError(‘Connection error’)
2025-06-10 23:25:01,364 - WARNING - [MiWiFi] Failed to get topology graph for router at IPADDRESS: Connection error

Found it, getting logs

2025-06-14 13:14:32.141 ERROR (MainThread) [homeassistant.config_entries] Error setting up entry IPADDRESS for miwifi
Traceback (most recent call last):
File “/usr/src/homeassistant/homeassistant/config_entries.py”, line 749, in __async_setup_with_context
result = await component.async_setup_entry(hass, self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/config/custom_components/miwifi/init.py”, line 147, in async_setup_entry
await _updater.async_config_entry_first_refresh()
File “/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py”, line 309, in async_config_entry_first_refresh
await self._async_refresh(
log_failures=False, raise_on_auth_failed=True, raise_on_entry_error=True
)
File “/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py”, line 382, in _async_refresh
self.data = await self._async_update_data()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py”, line 283, in _async_update_data
return await self.update_method()
^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/config/custom_components/miwifi/updater.py”, line 327, in update
return await self.update(retry + 1)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/config/custom_components/miwifi/updater.py”, line 327, in update
return await self.update(retry + 1)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/config/custom_components/miwifi/updater.py”, line 327, in update
return await self.update(retry + 1)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[Previous line repeated 6 more times]
File “/config/custom_components/miwifi/updater.py”, line 282, in update
await self._async_prepare(method, self.data)
File “/config/custom_components/miwifi/updater.py”, line 440, in _async_prepare
await action(data)
File “/config/custom_components/miwifi/updater.py”, line 513, in _async_prepare_status
response: dict = await self.luci.status()
^^^^^^^^^^^^^^^^^^^^^^^^
File “/config/custom_components/miwifi/luci.py”, line 219, in status
return await self.get(“misystem/status”)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/config/custom_components/miwifi/luci.py”, line 166, in get
response: Response = await client.get(_url, timeout=self._timeout)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.13/site-packages/httpx/_client.py”, line 1768, in get
return await self.request(
^^^^^^^^^^^^^^^^^^^
…<9 lines>…
)
^
File “/usr/local/lib/python3.13/site-packages/httpx/_client.py”, line 1540, in request
return await self.send(request, auth=auth, follow_redirects=follow_redirects)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.13/site-packages/httpx/_client.py”, line 1629, in send
response = await self._send_handling_auth(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
…<4 lines>…
)
^
File “/usr/local/lib/python3.13/site-packages/httpx/_client.py”, line 1657, in _send_handling_auth
response = await self._send_handling_redirects(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
…<3 lines>…
)
^
File “/usr/local/lib/python3.13/site-packages/httpx/_client.py”, line 1694, in _send_handling_redirects
response = await self._send_single_request(request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.13/site-packages/httpx/_client.py”, line 1730, in _send_single_request
response = await transport.handle_async_request(request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.13/site-packages/httpx/_transports/default.py”, line 394, in handle_async_request
resp = await self._pool.handle_async_request(req)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.13/site-packages/httpcore/_async/connection_pool.py”, line 256, in handle_async_request
raise exc from None
File “/usr/local/lib/python3.13/site-packages/httpcore/_async/connection_pool.py”, line 236, in handle_async_request
response = await connection.handle_async_request(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pool_request.request
^^^^^^^^^^^^^^^^^^^^
)
^
File “/usr/local/lib/python3.13/site-packages/httpcore/_async/connection.py”, line 103, in handle_async_request
return await self._connection.handle_async_request(request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.13/site-packages/httpcore/_async/http11.py”, line 136, in handle_async_request
raise exc
File “/usr/local/lib/python3.13/site-packages/httpcore/_async/http11.py”, line 106, in handle_async_request
) = await self._receive_response_headers(**kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.13/site-packages/httpcore/_async/http11.py”, line 177, in _receive_response_headers
event = await self._receive_event(timeout=timeout)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.13/site-packages/httpcore/_async/http11.py”, line 217, in _receive_event
data = await self._network_stream.read(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
self.READ_NUM_BYTES, timeout=timeout
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File “/usr/local/lib/python3.13/site-packages/httpcore/_backends/anyio.py”, line 35, in read
return await self._stream.receive(max_bytes=max_bytes)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.13/site-packages/anyio/_backends/_asyncio.py”, line 1254, in receive
await self._protocol.read_event.wait()
File “/usr/local/lib/python3.13/asyncio/locks.py”, line 213, in wait
await fut
asyncio.exceptions.CancelledError: Global task timeout

homeassistant.config_entries.OperationNotAllowed: The config entry ‘IPADDRESS’ (miwifi) with entry_id ‘01JXQ2MH6QXAHTP9REZM3K8F62’ cannot be unloaded because it is in the non recoverable state ConfigEntryState.SETUP_IN_PROGRESS

2025-06-14 13:33:21,470 - DEBUG - Manually updated MiWifi updater data
2025-06-14 13:33:21,518 - DEBUG - Finished fetching MiWifi updater data in 4.108 seconds (success: True)
2025-06-14 13:33:42,819 - DEBUG - [MiWiFi] Topo debug – show=1, mode=2, assoc=None
2025-06-14 13:33:42,820 - DEBUG - [MiWiFi] No manual MAC file found at /config/.storage/miwifi/miwifi_main_router.json
2025-06-14 13:33:42,822 - DEBUG - [MiWiFi] No manual MAC found, removed is_main from graph
2025-06-14 13:33:42,823 - DEBUG - [MiWiFi] Topology graph data received for router at 192.168.1.100: {‘show’: 1, ‘graph’: {‘ssid’: ‘SSID’, ‘color’: 100, ‘ip’: ‘IADDRESS’, ‘locale’: ‘Home’, ‘renumber’: 1, ‘name’: 'Xiaomi_XXXX, ‘channel’: ‘release’, ‘hardware’: ‘RA82’, ‘mode’: 2, ‘leafs’: [{‘ssid’: ‘ZYX’, ‘color’: 100, ‘onlines’: 7, ‘internet’: 0, ‘ip’: ‘192.168.1.104’, ‘locale’: ‘default’, ‘link_type’: ‘wired’, ‘name’: ‘Xiaomi_ZZZZ’, ‘channel’: ‘release’, ‘hardware’: ‘RA82’, ‘mode’: 1, ‘version’: ‘’, ‘signal’: 2}], ‘onlines’: ‘12’}, ‘code’: 0}
2025-06-14 13:33:42,826 - DEBUG - Manually updated MiWifi updater data
2025-06-14 13:33:42,869 - DEBUG - Finished fetching MiWifi updater data in 1.766 seconds (success: True)
2025-06-14 13:33:53,911 - DEBUG - WAN info response: {‘info’: False, ‘code’: 0}
2025-06-14 13:33:53,912 - DEBUG - WAN info[‘info’] is not a dict, got: <class ‘bool’>

You can talk to me on Telegram to verify the failures, @Xiaohack_Web

My home assistant becomes unavailable for a short while (under 1min) when this integration is loaded. Happens when setting up for the first time and also every time home assistant start (when restarting ha, it happens a few seconds after ha has already become available). After disabling the integration ha starts normally again.

Found this in the logs but not sure if it’s related:

Logger: nextcord.gateway
Source: /usr/local/lib/python3.13/site-packages/nextcord/gateway.py:171
First occurred: 14:15:15 (2 occurrences)
Last logged: 14:15:25

Shard ID None heartbeat blocked for more than 10 seconds. Loop thread traceback (most recent call last): File “”, line 198, in _run_module_as_main File “”, line 88, in _run_code File “/usr/src/homeassistant/homeassistant/main.py”, line 227, in sys.exit(main()) File “/usr/src/homeassistant/homeassistant/main.py”, line 213, in main exit_code = runner.run(runtime_conf) File “/usr/src/homeassistant/homeassistant/runner.py”, line 154, in run return loop.run_until_complete(setup_and_run_hass(runtime_config)) File “/usr/local/lib/python3.13/asyncio/base_events.py”, line 706, in run_until_complete self.run_forever() File “/usr/local/lib/python3.13/asyncio/base_events.py”, line 677, in run_forever self._run_once() File “/usr/local/lib/python3.13/asyncio/base_events.py”, line 2034, in _run_once handle._run() File “/usr/local/lib/python3.13/asyncio/events.py”, line 89, in _run self._context.run(self._callback, *self.args) File “/config/custom_components/miwifi/device_tracker.py”, line 205, in lambda: self.hass.async_create_task(self.check_ports()), File “/usr/src/homeassistant/homeassistant/core.py”, line 808, in async_create_task return self.async_create_task_internal(target, name, eager_start) File “/usr/src/homeassistant/homeassistant/core.py”, line 830, in async_create_task_internal task = create_eager_task(target, name=name, loop=self.loop) File "/usr/src/homeassistant/homeassistant/util/async.py", line 45, in create_eager_task return Task(coro, loop=loop, name=name, eager_start=True) File “/config/custom_components/miwifi/device_tracker.py”, line 472, in check_ports result = sock.connect_ex((self.ip_address, port))
Shard ID None heartbeat blocked for more than 20 seconds. Loop thread traceback (most recent call last): File “”, line 198, in _run_module_as_main File “”, line 88, in _run_code File “/usr/src/homeassistant/homeassistant/main.py”, line 227, in sys.exit(main()) File “/usr/src/homeassistant/homeassistant/main.py”, line 213, in main exit_code = runner.run(runtime_conf) File “/usr/src/homeassistant/homeassistant/runner.py”, line 154, in run return loop.run_until_complete(setup_and_run_hass(runtime_config)) File “/usr/local/lib/python3.13/asyncio/base_events.py”, line 706, in run_until_complete self.run_forever() File “/usr/local/lib/python3.13/asyncio/base_events.py”, line 677, in run_forever self._run_once() File “/usr/local/lib/python3.13/asyncio/base_events.py”, line 2034, in _run_once handle._run() File “/usr/local/lib/python3.13/asyncio/events.py”, line 89, in _run self._context.run(self._callback, *self.args) File “/config/custom_components/miwifi/device_tracker.py”, line 205, in lambda: self.hass.async_create_task(self.check_ports()), File “/usr/src/homeassistant/homeassistant/core.py”, line 808, in async_create_task return self.async_create_task_internal(target, name, eager_start) File “/usr/src/homeassistant/homeassistant/core.py”, line 830, in async_create_task_internal task = create_eager_task(target, name=name, loop=self.loop) File "/usr/src/homeassistant/homeassistant/util/async.py", line 45, in create_eager_task return Task(coro, loop=loop, name=name, eager_start=True) File “/config/custom_components/miwifi/device_tracker.py”, line 472, in check_ports result = sock.connect_ex((self.ip_address, port))

Hi! :wave: Thanks for reporting this issue.

This was indeed caused by a blocking call in the check_ports() function during startup, which could freeze Home Assistant for a few seconds. We’ve just fixed this in the latest release v3.2.2 :tada:

:white_check_mark: Changes in v3.2.2:

  • Replaced the blocking socket.connect_ex() with a fully async asyncio.open_connection().
  • This prevents any event loop blocking and improves HA startup stability — especially on first-time setup or reboot.

Please update the integration to v3.2.2 and restart Home Assistant. This should completely eliminate the issue. Let us know if it works for you!

Thanks again for your feedback :raised_hands:


¡Hola! :wave: Gracias por informar del problema.

Este comportamiento se debía a una llamada bloqueante en la función check_ports() durante el arranque, que podía congelar Home Assistant durante unos segundos. Ya está solucionado en la nueva versión v3.2.2 :tada:

:white_check_mark: Cambios en la v3.2.2:

  • Se reemplazó el uso de socket.connect_ex() por asyncio.open_connection(), totalmente asíncrono.
  • Esto evita bloqueos en el bucle principal de HA y mejora la estabilidad al iniciar o configurar la integración por primera vez.

Actualiza la integración a la versión 3.2.2 y reinicia Home Assistant. El problema debería desaparecer por completo. ¡Cuéntanos si te funciona bien!

¡Gracias de nuevo por tu ayuda! :raised_hands:

MiWiFi XiaoHack Edition – v3.2.2

:memo: Changelog — MiWiFi Integration

:package: Version v3.2.2 – 2025-06-24

:rocket: Improvements

  • Startup performance optimization: the check_ports() method was rewritten to use asyncio.open_connection instead of socket.connect_ex, removing blocking calls from Home Assistant’s main event loop.
    • This resolves brief freezes (<1 minute) when starting Home Assistant or loading the integration for the first time.
    • Noticeable improvement in system stability during boot, especially in setups with multiple routers or heavy device tracking.
  • Frontend panel monitor improved: moved the scheduling call for async_track_time_interval out of the internal try block to ensure the periodic version check is always scheduled, even if the first check fails.
  • Self-check diagnostics improved: the self_check.py module now includes:
    • The version of the MiWiFi integration
    • The installed version of the frontend panel (if available)
    • The current version of Home Assistant
    • These versions are included in the issue link for unknown routers to improve debugging and support.
  • Extended compatibility detection: CompatibilityChecker now checks additional router capabilities:
    • Firmware update support (rom_update, flash_permission)
    • LED control support
    • Guest Wi-Fi and direct Wi-Fi configuration
    • Topology map support
    • Device list support (wired + wireless)
    • Results are stored in self.result and can be used to dynamically enable or disable features.
  • Automatic unsupported model reporting: when a known router model fails any compatibility check, the integration will now suggest a GitHub issue with:
    • The failing features
    • Suggested lines for unsupported.py
    • Version info of the integration and Home Assistant
    • A direct link to open the issue
  • Accurate router mode detection: The integration now prioritizes netmode over mode when determining a router’s operating role (e.g., mesh node, repeater, etc.), fixing misclassifications during capability checks.
  • Expanded Mode enum: Added support for additional modes:
    • MESH_NODE (3): mesh-connected child routers (non-main nodes)
    • MESH_LEAF (8): deeper mesh leaf nodes
      These are now automatically ignored in capability checks like rom_update or per_device_qos, avoiding false “unsupported” reports for secondary mesh units.
  • Better fallback handling: If netmode is not present, the integration will safely fall back to mode or “default” without errors.
  • Improved diagnostics context: The detected mode is now included in the GitHub issue suggestion for unsupported routers, helping maintainers triage mesh-specific cases.

:broom: Code Cleanup

  • Removed unused imports: socket, contextlib.closing.
  • Added missing import for MiWiFiPanelUpdate to resolve runtime error.
  • Defined or imported ATTR_TRACKER_TOTAL_USAGE to eliminate warnings.
  • Slight internal cleanup in panel handling and structure logic.
  • Code remains fully backward-compatible with previous integration versions.

:bulb: Tip: Users experiencing brief lock-ups during Home Assistant startup are encouraged to upgrade to this version.

:white_check_mark: Compatibility

  • :white_check_mark: Compatible with Home Assistant 2025.4.0 and above.
  • :white_check_mark: Fully backward-compatible with v3.2.1.
  • :white_check_mark: Safe to install as a drop-in replacement for v3.2.1.

:blue_book: How to Update

  1. Replace all files inside your custom_components/miwifi/ directory with the contents of this release.
  2. Restart Home Assistant completely.
  3. Confirm the integration loads without WAN parsing errors in Developer Tools > Logs.

:pushpin: Reminder for Migrators

If you’re migrating from the original dmamontov/hass-miwifi:

:arrow_right: Remove the old integration.
:arrow_right: Add this repo via HACS as a custom repository:

https://github.com/JuanManuelRomeroGarcia/hass-miwifi

Maintained with :heart: by @JuanManuelRomeroGarcia

:memo: Changelog — MiWiFi Integration

:package: Version v3.2.6 – 2025-07-02

:white_check_mark: Fixes & Stability

  • :shield: Prevented startup failures on routers that don’t support certain endpoints:

    • Wrapped calls to macfilter_info, avaliable_channels, and rom_update in try/except to avoid full integration crashes.
    • Routers that fail to respond now continue loading without blocking the whole update cycle.
  • :no_entry_sign: Removed compatibility detection from early topology fetch:

    • Avoids premature calls to unsupported endpoints during setup.
    • Ensures compatibility checks only run when the router is confirmed to be accessible and stable.
  • :brick: Added support for multiple fallback IPs in discovery:

    • Now attempts 192.168.1.1, 192.168.0.1, and 192.168.31.1 during initial detection.

-:stop_sign: Silenced compatibility warnings for features manually marked as unsupported:

  • Features like wifi_config are no longer executed or shown if already listed in unsupported.py.
  • Prevents repeated false warnings for verified unsupported models (e.g., CR8806).

:gear: Improvements

  • :mag: Compatibility detection (CompatibilityChecker) has been moved to a new method:

    • Now runs at the end of the update process (_async_prepare_compatibility).
    • Prevents false negatives or timeouts during early startup.
    • Better separation of responsibilities and easier future maintenance.
  • :brain: Future-ready: allows skipping or customizing capability checks by model or IP without affecting the rest of the update flow.

  • :art: Enhanced device discovery UI:

    • Detected routers now display their model and IP address in the discovery card (e.g., RC06 (192.168.1.39)).
    • Model is extracted directly from the topo_graph() response if available.

:white_check_mark: Compatibility

  • :white_check_mark: Compatible with Home Assistant 2025.5.0 and above.
  • :white_check_mark: Fully backward-compatible with v3.2.4.
  • :warning: Known issue: routers that only work on v3.1.4 may require legacy mode or a fresh install.

:blue_book: How to Update

  1. Replace all files inside your custom_components/miwifi/ directory with the contents of this release.
  2. Restart Home Assistant completely.
  3. Add your first router manually to trigger automatic mesh discovery for the remaining devices.

:information_source: This release improves detection clarity, reliability, and visual feedback—especially for users with multiple routers.

Maintained with :heart: by @JuanManuelRomeroGarcia

Full Changelog: Comparing v3.2.5...v3.2.6 · JuanManuelRomeroGarcia/hass-miwifi · GitHub

:memo: Changelog — MiWiFi Integration

:package: Version v3.3.1 – 2025-07-14

:white_check_mark: Fixes & Stability

  • :thread: Prevented event loop blocking when loading translations:
    • Replaced direct load_json() calls with await hass.async_add_executor_job(...) when reading translation files from disk. #42
    • This fixes the Home Assistant warning:
      “Detected blocking call to open(…) inside the event loop…”

:gear: Improvements

  • :globe_with_meridians: Automatically fetches the latest frontend panel version on first install:
    • When the local version file (.storage/miwifi/miwifi_panel_version.json) does not exist (fresh install), the integration now fetches the latest available panel version from GitHub using version.json.
    • This replaces the hardcoded DEFAULT_PANEL_VERSION fallback logic.

:white_check_mark: Compatibility

  • :white_check_mark: Compatible with Home Assistant 2025.6.0 and later.
  • :repeat: Fully backward-compatible with previously installed panels (version 1.2.3 and above).

:blue_book: How to Update

  1. Replace all files inside your custom_components/miwifi/ folder with the contents of this release.
  2. Restart Home Assistant.
  3. Check that the MiWiFi panel loads successfully and no blocking call to open warnings appear in the logs.

:information_source: This release improves first-time install behavior and ensures long-term compatibility with upcoming Home Assistant versions.

:sparkling_heart: Support & Donations

If you find this integration useful and want to support continued development, you can make a donation here:

Every contribution helps me dedicate more time to building and improving MiWiFi. Thank you! :raised_hands: