One of the reasons that I’m “still” using the Python matter server is because the matter.js server is still alpha/beta and hence it is going to have problems (pretty much by definition).
I am absolutely sure that the matter.js server will be an improvement over the Python server when it is released but since you can essentially get a new version every time you reboot the matter server there is too much “churn” for me.
Here is an example that I turned up this morning where a device that was not connected (I pulled the power to it) was still shown as available in HA after 15+ mins. I’ve posted this on Discord as well (as you recommended) however this is what I found.
It appears to be that HA Core is not getting a message that it “understands” to mark a device as “Unavailable”. This is an example.
At 10:55 I pulled the power to a switch. The logs (just filtered for that device) were as follows.
2026-04-06 10:50:36.272 INFO WebSocketC~erHandler [0] Node @1:12 availability changed to true
2026-04-06 10:51:58.368 INFO ClientInteraction Invoke » @1:12•ce23⇵11ca 0x1.OnOff:0x6.off:0x0 with (no payload)
2026-04-06 10:51:58.426 INFO ClientInteraction Invoke « @1:12•ce23⇵11ca 0x1.OnOff:0x6.off:0x0 status: Success (0)
2026-04-06 10:51:59.796 INFO ClientInteraction Invoke » @1:12•ce23⇵11cb 0x1.OnOff:0x6.on:0x1 with (no payload)
2026-04-06 10:51:59.854 INFO ClientInteraction Invoke « @1:12•ce23⇵11cb 0x1.OnOff:0x6.on:0x1 status: Success (0)
2026-04-06 10:52:04.503 INFO ClientEventEmitter Received event switch.initialPress on server-2-134b.@1:12.ep1.ep4 newPosition: 1
2026-04-06 10:52:05.537 INFO ClientEventEmitter Received event switch.shortRelease on server-2-134b.@1:12.ep1.ep4 previousPosition: 1
2026-04-06 10:52:05.549 INFO ClientEventEmitter Received event switch.multiPressComplete on server-2-134b.@1:12.ep1.ep4 previousPosition: 0 totalNumberOfPressesCounted: 1
2026-04-06 10:53:03.947 INFO ClientInteraction Invoke » @1:12•ce23⇵11cf 0x1.OnOff:0x6.on:0x1 with (no payload)
2026-04-06 10:53:04.007 INFO ClientInteraction Invoke « @1:12•ce23⇵11cf 0x1.OnOff:0x6.on:0x1 status: Success (0)
2026-04-06 10:53:53.584 INFO ClientEventEmitter Received event switch.initialPress on server-2-134b.@1:12.ep1.ep5 newPosition: 1
2026-04-06 10:53:54.599 INFO ClientEventEmitter Received event switch.shortRelease on server-2-134b.@1:12.ep1.ep5 previousPosition: 1
2026-04-06 10:53:54.610 INFO ClientEventEmitter Received event switch.multiPressComplete on server-2-134b.@1:12.ep1.ep5 previousPosition: 0 totalNumberOfPressesCounted: 1
2026-04-06 10:56:35.605 INFO ClientSubscription Subscription c9e931e2 to peer @1:12 timed out after 1m 40s
2026-04-06 10:56:35.607 ERROR ClientSubscription Replacing subscription to @1:12 due to timeout
2026-04-06 10:56:53.476 INFO ClientInteraction Read » @1:12•ce23⇵11d1 attributes: 0x0/OperationalCredentials(0x3e)/Fabrics(0x1) fabricFiltered: false
2026-04-06 10:56:53.577 INFO ClientInteraction Read » @1:12•ce23⇵11d2 attributes: 0x0/OperationalCredentials(0x3e)/Fabrics(0x1) fabricFiltered: false
2026-04-06 10:57:18.212 INFO ClientNode server-2-134b.@1:12 is offline
2026-04-06 10:57:18.214 INFO Session @1:12•ce23 Session ended
2026-04-06 10:57:18.216 ERROR ClientSubscription Failed to probe reachability of peer @1:12, resubscribe with new session
2026-04-06 10:57:18.216 INFO IpServiceStatus @1:12 Resolving (address is unreachable)
2026-04-06 10:57:18.226 INFO PeerConnection @1:12•unsecured#1e437612421808c⇵11d3 udp://[fd7f:289c:9914:0:e2f9:911f:fd0f:610b]:5540 Connecting addr #: 1 attempt #: 1 connect time: 10ms addr time: 10ms thread:25:connect
Within a few minutes the Node has been declared “offline” however HA still shows the device as available. I let this run for 15 mins no change, the device is unplugged, matter.js sees it as offline but HA sees it as online.
If we look at the Python server same routine, pull the power and wait we get this:
2026-04-06 11:16:49.503 (Dummy-2) CHIP_ERROR [chip.native.DMG] Subscription Liveness timeout with SubscriptionID = 0xb2fee7ad, Peer = 01:0000000000000012
2026-04-06 11:16:49.508 (MainThread) INFO [matter_server.server.device_controller] <Node:18> Subscription failed with CHIP Error 0x00000032: Timeout, resubscription attempt 0
2026-04-06 11:17:13.558 (Dummy-2) CHIP_ERROR [chip.native.EM] <<5 [E:4402i with Node: <0000000000000000, 0> S:0 M:58331174] (U) Msg Retransmission to 0:0000000000000000 failure (max retries:4)
2026-04-06 11:17:24.125 (Dummy-2) CHIP_ERROR [chip.native.SC] CASESession timed out while waiting for a response from peer <0000000000000012, 1>. Current state was 4
2026-04-06 11:17:24.126 (Dummy-2) CHIP_ERROR [chip.native.DMG] Failed to establish CASE for re-subscription with error 'src/protocols/secure_channel/CASESession.cpp:594: CHIP Error 0x00000032: Timeout'
2026-04-06 11:17:24.128 (MainThread) INFO [matter_server.server.device_controller] <Node:18> Subscription failed with CHIP Error 0x00000032: Timeout, resubscription attempt 1
2026-04-06 11:17:55.461 (Dummy-2) CHIP_ERROR [chip.native.EM] <<5 [E:4403i with Node: <0000000000000000, 0> S:0 M:58331175] (U) Msg Retransmission to 0:0000000000000000 failure (max retries:4)
2026-04-06 11:18:06.066 (Dummy-2) CHIP_ERROR [chip.native.SC] CASESession timed out while waiting for a response from peer <0000000000000012, 1>. Current state was 4
2026-04-06 11:18:06.067 (Dummy-2) CHIP_ERROR [chip.native.DMG] Failed to establish CASE for re-subscription with error 'src/protocols/secure_channel/CASESession.cpp:594: CHIP Error 0x00000032: Timeout'
2026-04-06 11:18:06.068 (MainThread) INFO [matter_server.server.device_controller] <Node:18> Subscription failed with CHIP Error 0x00000032: Timeout, resubscription attempt 2
2026-04-06 11:18:06.069 (MainThread) INFO [matter_server.server.device_controller] <Node:18> Marked node as unavailable
As soon as the “Marked node as unavailable” event turns up the device shows as unavailable in HA. My guess (note guess) is that HA is looking for something similar to “Node @1:12 availability changed to false” from matter.js which it never sees and hence the device appears to be still online in the frontend when it is not.
Thoughts appreciated!