Summary
Add Matter (smart-home standard) support to the device-simulator so the tool can emulate common Matter devices and have them paired into real ecosystems (Home Assistant, Apple Home, Google).
Implementation uses matter.js (@matter/main v0.16.x, Matter 1.4.2 spec) — the canonical, most complete Matter implementation. matter.js is Node.js/TypeScript, while this app is pure-Go single-binary, so the core work is a Go↔Node bridge that drives real, commissionable matter.js devices while conforming to the existing DeviceServer/Automatable abstraction.
Device types (all in this work)
- Thermostat
- Heat pump
- EVSE charger
- Smart plug / socket with electrical energy reporting
- Dishwasher
- Laundry washer (washing machine)
- Temperature sensor
- Light sensor
Design decisions
- Node runtime: host-provided. Detect
node on PATH (require v18+, prefer v20+). If present, Go spawns and supervises a Node child; if absent, Matter is gracefully disabled with an "install Node.js" message — never a crash. No Node bundled into the binary or Docker image.
- Fully commissionable. Each device is a real matter.js
ServerNode exposing a pairing code + QR, joinable into real fabrics. Pairing info surfaced in the UI.
- One shared Node process hosting all Matter devices, owned by a singleton bridge manager; per-device
matter.Server adapters delegate by nodeId. Auto-restart + replay on crash; persisted per-device storage so commissioning survives restarts.
- Control channel: newline-delimited JSON over the child's stdin/stdout (mirrors the OCPP request-correlation pattern). stdout = machine frames; stderr = logs.
- Bridge (
internal/matter/bridge/) is go:embed-ed with vendored node_modules, extracted to a per-user cache dir at first run.
Integration points
New internal/matter/ Go package (manager, rpc, client, server, devicetypes, detect, storage, embed) + internal/matter/bridge/ Node program. Wiring into internal/device/device.go, internal/ports/allocator.go, cmd/simulator/main.go & app.go, profiles, frontend (stores.js, index.html), and docs-sync (openapi.json, internal/mcp/server.go, docs.html).
Testing
- Default
go test ./... stays Node-free (table tests against an in-process fake bridge; physics unit-tested in Go).
- Real-commissioning integration tests gated behind
//go:build matter_integration + skip-if-no-node.
- Manual: pair a thermostat + smart plug into Home Assistant / Apple Home; confirm external control reflects in the simulator and survives restart.
Notes
- Matter commissioning needs LAN multicast — works in desktop / host-network mode; Docker bridge networking will surface a warning (like the existing mDNS path).
Summary
Add Matter (smart-home standard) support to the device-simulator so the tool can emulate common Matter devices and have them paired into real ecosystems (Home Assistant, Apple Home, Google).
Implementation uses matter.js (
@matter/mainv0.16.x, Matter 1.4.2 spec) — the canonical, most complete Matter implementation. matter.js is Node.js/TypeScript, while this app is pure-Go single-binary, so the core work is a Go↔Node bridge that drives real, commissionable matter.js devices while conforming to the existingDeviceServer/Automatableabstraction.Device types (all in this work)
Design decisions
nodeon PATH (require v18+, prefer v20+). If present, Go spawns and supervises a Node child; if absent, Matter is gracefully disabled with an "install Node.js" message — never a crash. No Node bundled into the binary or Docker image.ServerNodeexposing a pairing code + QR, joinable into real fabrics. Pairing info surfaced in the UI.matter.Serveradapters delegate bynodeId. Auto-restart + replay on crash; persisted per-device storage so commissioning survives restarts.internal/matter/bridge/) isgo:embed-ed with vendorednode_modules, extracted to a per-user cache dir at first run.Integration points
New
internal/matter/Go package (manager, rpc, client, server, devicetypes, detect, storage, embed) +internal/matter/bridge/Node program. Wiring intointernal/device/device.go,internal/ports/allocator.go,cmd/simulator/main.go&app.go, profiles, frontend (stores.js,index.html), and docs-sync (openapi.json,internal/mcp/server.go,docs.html).Testing
go test ./...stays Node-free (table tests against an in-process fake bridge; physics unit-tested in Go).//go:build matter_integration+ skip-if-no-node.Notes