Skip to content

Matter (matterjs-server)

Funkloch reads the WebSocket of matterjs-server, the Matter controller behind Home Assistant's Matter integration (it replaces the Python Matter Server, which was archived in 2026). Set MATTER_SERVER_URL, e.g. ws://localhost:5580/ws.

What it adds:

  • Thread behind any border router. Matter devices report their own neighbor table, so the mesh shows up with an Apple TV, a HomePod, a Google Nest or an Aqara hub as border router, where the OTBR REST API is not available.
  • Wi-Fi devices. Matter devices on Wi-Fi report the RSSI of their access point; they get a network of their own, Wi-Fi, with each access point as the root of its map.
  • Names, makers, battery and reachability of every Matter device.

What it reads

When Command For
at connect start_listening every node with the attributes the server holds; then its events
every event node_added, node_updated, attribute_updated names, roles, battery, reachability; a report is a sign of life
every 15 min read_attribute per awake node Thread: neighbor table (0/53/7) and transmit counters; Wi-Fi: BSSID and RSSI (0/54/0, 0/54/4)
every 15 min get_thread_border_routers the border routers the server found over mDNS: the root of the Thread map

Devices report their neighbor table only when their subscription starts and their Wi-Fi RSSI never by itself, so Funkloch reads them, one node after the other. A sleepy end device and a long idle time device (ICD) are never read: a read would wait for them or cost battery. A value older than two intervals, such as the table a sleeping device sent at its last start, counts for nothing. Change the interval with MATTER_POLL_MINUTES (5 to 1440).

The battery level the server holds for a node is passed on at connect and with every poll, for Thread and Wi-Fi alike and with the OTBR on too, so a device whose level does not change (and so sends no report of it) still shows it. A level from the server's cache is no sign of life: it moves neither the last message nor the reachability.

Funkloch never writes an attribute, invokes a command, commissions or sets credentials.

Attribute Path Used as
BasicInformation NodeLabel, ProductName, VendorName 0/40/5, 0/40/3, 0/40/1 name (the label if the controller set one, else the product), model, maker
NetworkCommissioning FeatureMap 0/49/65532 Thread, Wi-Fi or neither (Ethernet devices are left out)
GeneralDiagnostics NetworkInterfaces 0/51/0 the address: Thread's extended address, as the OTBR reports it, or the Wi-Fi MAC
ThreadNetworkDiagnostics RoutingRole, Rloc16, Channel 0/53/1, 0/53/64, 0/53/0 role, short address, channel
ThreadNetworkDiagnostics NeighborTable 0/53/7 RSSI (average, else last) and link quality 0–3 per neighbor, children
ThreadNetworkDiagnostics TxUnicastCount, TxBroadcastCount, TxErrCcaCount 0/53/23, 0/53/24, 0/53/36 transmit errors, where the device has the counters
WiFiNetworkDiagnostics Bssid, Rssi 0/54/0, 0/54/4 the access point and the signal
NetworkCommissioning Networks 0/49/1 the SSID, to name the access point
PowerSource FeatureMap, BatPercentRemaining */47/65532, */47/12 mains or battery, battery level (in half percent: 200 is 100 %)
ICD Management OperatingMode 0/70/8 long idle time devices, which are not read

Thread

A child is measured by how its parent hears it; where the parent cannot be read (a border router of another maker), by how the child hears its parent. A router is measured by the best of the routers that hear it. Border routers found over mDNS are the root of the map, named after their host name; devices that are no node of this controller (a neighbor's device, a device of another controller) show up through the tables that hear them. Routers get an uplink as with the OTBR, see Repeaters. The score is the Thread score.

Together with the OTBR

With OTBR_URL set as well, the border router measures and maps Thread, as before, and Matter describes the devices: names, makers and models, mains or battery, battery level and reachability come from Matter, role and short address from the border router. Both name one device by its extended address, so it is one device in Funkloch. The map stays the border router's view of the mesh; Wi-Fi comes from Matter either way.

Wi-Fi

A station hangs on the access point (BSSID) it is connected to; the access point is named after the SSID and the end of its BSSID, e.g. Heimnetz · 22:33, since a mesh has one BSSID per radio. The score is the RSSI linear between −90 dBm (0) and −50 dBm (100): with the default thresholds a signal is good from about −66 dBm and weak below −80 dBm.

Reachability

matterjs-server says whether each node is reachable (its subscription is alive). A node it reports unavailable is offline at once; otherwise the usual silence rule applies. When the connection to the server drops, the networks it delivers report their bridge offline, and Funkloch connects again after 5 seconds, then up to once a minute.

Versions

Funkloch needs a server that speaks WebSocket schema 11 or newer; it logs the schema and server version it found at connect (matterjs-server connected).