{"_id":"@airnexus/node-red-contrib-matter-airnexus","name":"@airnexus/node-red-contrib-matter-airnexus","dist-tags":{"latest":"0.2.4-airnexus.1"},"versions":{"0.2.4-airnexus.1":{"name":"@airnexus/node-red-contrib-matter-airnexus","version":"0.2.4-airnexus.1","description":"AirNexus Matter bridge + dynamic devices + pairing management for Node-RED","main":"matter-bridge.js","keywords":["node-red","node-red-contrib","airnexus","matter","matter-js","iot","smart-home","homekit","google-home","alexa","dynamic","bridge","pairing","commissioning"],"author":{"name":"AirNexus"},"license":"MIT","dependencies":{"@matter/main":"^0.13.0","qrcode":"^1.5.4"},"engines":{"node":">=18.0.0"},"node-red":{"version":">=3.0.0","nodes":{"matter-dynamic-bridge":"matter-bridge.js","matter-device":"matter-device.js","matter-pairing":"matter-pairing.js"}},"_id":"@airnexus/node-red-contrib-matter-airnexus@0.2.4-airnexus.1","_nodeVersion":"20.2.0","_npmVersion":"9.7.1","dist":{"integrity":"sha512-bIiwel/yW7ZWhb5yexV2ukEtyKvr6WawXlLMEdEaVn6hOm2Yxtq/jfqo3IKYHHpQmC5w+FZL8vW5fZtOZQBQlQ==","shasum":"eb0b2c7328efed6204e5eb24c6425c981aebd4ea","tarball":"https://registry.npmjs.org/@airnexus/node-red-contrib-matter-airnexus/-/node-red-contrib-matter-airnexus-0.2.4-airnexus.1.tgz","fileCount":12,"unpackedSize":95090,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFl48PLpTh5n5Ou9wJh/VVYQUAUDoy0ERxiWGZvMJgwnAiBQPo5Pdy5cLwqYYumizhNCH0K9tyiCA3lEXpzjoQe8GA=="}]},"_npmUser":{"name":"airnexustech","email":"info@airnexus.io"},"directories":{},"maintainers":[{"name":"airnexustech","email":"info@airnexus.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/node-red-contrib-matter-airnexus_0.2.4-airnexus.1_1769382055644_0.03876075061480666"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-25T23:00:55.544Z","0.2.4-airnexus.1":"2026-01-25T23:00:55.781Z","modified":"2026-01-25T23:00:56.051Z"},"maintainers":[{"name":"airnexustech","email":"info@airnexus.io"}],"description":"AirNexus Matter bridge + dynamic devices + pairing management for Node-RED","keywords":["node-red","node-red-contrib","airnexus","matter","matter-js","iot","smart-home","homekit","google-home","alexa","dynamic","bridge","pairing","commissioning"],"author":{"name":"AirNexus"},"license":"MIT","readme":"AirNexus Node-RED Matter Dynamic\n\nDynamic Matter bridge + dynamic devices for Node-RED. Create any Matter device by specifying the device type in JSON configuration — no need for device-specific nodes.\n\nThis AirNexus fork adds:\n\nMatter Pairing node (get QR/manual codes, reopen pairing, factory reset commissioning)\n\nMatter Device “hidden until enabled” mode (devices don’t appear in Alexa/HomeKit until you enable them by payload)\n\nDynamic rename by payload\n\nThermostat-friendly event handling (captures attribute writes even when controllers don’t send explicit commands)\n\nInstallation\nnpm install @airnexus/node-red-contrib-matter-airnexus\n\nRequirements\n\nNode.js >= 18.0.0\n\nNode-RED >= 3.0.0\n\nNodes Included\n1) Matter Dynamic Bridge (matter-dynamic-bridge)\n\nCreates a Matter bridge and hosts all devices.\n\n2) Matter Device (matter-device)\n\nCreates a dynamic Matter endpoint from JSON config.\n\nAirNexus behavior (Option 2 – hidden until enabled):\n\nDevice is created locally, but NOT registered into the bridge/aggregator until enabled\n\nOnce enabled, the device becomes visible in Alexa/HomeKit/Google\n\nDisable sets reachable=false and suppresses outputs (device may remain listed in the controller until you remove it there)\n\n3) Matter Pairing (matter-pairing)\n\nProvides commissioning info (QR/manual) and supports “reset pairing” flows.\n\nQuick Start\n1) Create a Bridge\n\nAdd Matter Dynamic Bridge\n\nConfigure name/port/interface (default port 5540)\n\nDeploy\n\n2) Get Pairing Codes (recommended: use Matter Pairing node)\n\nAdd Matter Pairing\n\nSelect your bridge\n\nDeploy\n\nInject get to output pairing info (QR code string + manual code)\n\n3) Add Devices\n\nAdd Matter Device\n\nSelect the same bridge\n\nSet your JSON device config (examples below)\n\nDeploy\n\n4) Enable a Device (AirNexus Option 2)\n\nDevices will not show up in Alexa until you enable them:\n\nInject to the device:\n\ntopic: enable\n\npayload can include a name\n\nExample:\n\n{\n  \"topic\": \"enable\",\n  \"payload\": { \"name\": \"Lounge Thermostat\" }\n}\n\nMatter Pairing Node\nInputs (commands)\n\nSend an Inject into the Matter Pairing node:\n\nCommand\tHow to send\tWhat it does\nget\tmsg.topic=\"get\"\tOutputs current pairing info (if commissioned → state=commissioned)\npair\tmsg.topic=\"pair\"\tEnsures bridge is online and ready to commission (best effort)\nreset\tmsg.topic=\"reset\"\tFactory reset commissioning (wipes bridge commissioning storage, regenerates codes)\nunpair / delete\tmsg.topic=\"unpair\"\tSame as reset\ndisable\tmsg.topic=\"disable\"\tBest-effort stop advertising (takes server offline)\n\nOptional payload:\n\n{ \"timeoutMins\": 15, \"includeSvg\": true, \"forceReset\": true }\n\nOutput payload (example)\n{\n  \"bridgeId\": \"5318704ab571aeeb\",\n  \"pairingEnabled\": true,\n  \"pairingUntil\": \"2026-01-25T02:30:00.000Z\",\n  \"state\": \"ready\",\n  \"commissioned\": false,\n  \"qrPairingCode\": \"MT:....\",\n  \"manualPairingCode\": \"123-45-678\",\n  \"qrSvg\": \"<svg>...</svg>\"\n}\n\nMatter Device Node (AirNexus Option 2: hidden until enabled)\nEnable / Disable / Rename (by payload)\n\nEnable\n\nmsg.topic = \"enable\";\nmsg.payload = { name: \"Zone 1 Thermostat\" }; // optional\nreturn msg;\n\n\nDisable\n\nmsg.topic = \"disable\";\nreturn msg;\n\n\nRename\n\nmsg.topic = \"name\";\nmsg.payload = \"New Name Here\";\nreturn msg;\n\n\nConfig combined\n\nmsg.topic = \"config\";\nmsg.payload = { enabled: true, name: \"Zone 2 Thermostat\" };\nreturn msg;\n\nState query\nmsg.topic = \"state\";\nreturn msg;\n\nInputs / Outputs (Matter Device)\n\nThe Matter Device node has 3 outputs:\n\nOutput 1 – Events / State\n\n$Changed attribute events (when Matter.js emits them)\n\nThermostat writes often appear as interactionEnd snapshot diffs (even when no explicit commands are used)\n\nOutput 2 – Commands\n\nReal Matter cluster commands (e.g. OnOff.on, LevelControl.moveToLevel)\n\nSome controllers do attribute writes instead of commands (especially thermostats)\n\nOutput 3 – Debug / Diagnostics\n\nsubscription logs, init status, bridgeReset, write retries, sanitization info, etc.\n\nExample Output 2 (command)\n{\n  \"command\": \"on\",\n  \"cluster\": \"OnOff\",\n  \"data\": {}\n}\n\nExample Output 1 (thermostat diff from Alexa)\n{\n  \"thermostat\": {\n    \"systemMode\": 3,\n    \"occupiedCoolingSetpoint\": 2000,\n    \"occupiedHeatingSetpoint\": 2000\n  }\n}\n\nCommand vs Attribute Writes (Thermostats)\n\nMany Matter thermostats are controlled via attribute writes rather than explicit commands.\n\nTypical behavior:\n\nChanging setpoint in Alexa/HomeKit → Output 1 (state diff)\n\nUsing something like setpointRaiseLower (if controller uses it) → Output 2 (command)\n\nAlways monitor Output 1 for thermostat changes.\n\nConfiguration Examples\nSimple On/Off Light\n{\n  \"deviceType\": \"OnOffLightDevice\"\n}\n\nThermostat (Heating + Cooling + Auto)\n{\n  \"deviceType\": \"ThermostatDevice\",\n  \"behaviorFeatures\": {\n    \"Thermostat\": [\"Heating\", \"Cooling\", \"AutoMode\"]\n  },\n  \"initialState\": {\n    \"thermostat\": {\n      \"controlSequenceOfOperation\": 4,\n      \"systemMode\": 1,\n      \"localTemperature\": 2500,\n      \"minSetpointDeadBand\": 100,\n      \"occupiedHeatingSetpoint\": 2000,\n      \"occupiedCoolingSetpoint\": 2600,\n      \"minHeatSetpointLimit\": 500,\n      \"maxHeatSetpointLimit\": 3500,\n      \"minCoolSetpointLimit\": 500,\n      \"maxCoolSetpointLimit\": 3500\n    }\n  }\n}\n\nTroubleshooting\nDevice doesn’t appear in Alexa/HomeKit\n\nIf you’re using AirNexus Option 2:\n\nYou must enable the Matter Device node:\n\nmsg.topic=\"enable\"\n\noptionally set name\n\nPairing issues / want to re-pair\n\nUse Matter Pairing node:\n\nreset to wipe commissioning + generate new QR/manual\n\nCommands not appearing in Output 2\n\nExpected for devices controlled by attribute writes (thermostats). Use Output 1 diffs.\n\nLicense\n\nMIT\n\nAcknowledgments\n\nInspired by and based on patterns from node-red-matter-bridge and Matter.js.\n\n## Support\n\n\n- Node-RED Forum: [Get help from the community](https://discourse.nodered.org)\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## License\n\nMIT\n\n## Acknowledgments\n\nThis project was heavily inspired by and based on the excellent work done in [node-red-matter-bridge](https://github.com/sammachin/node-red-matter-bridge) by Sam Machin. The architecture and implementation patterns from that project served as a fundamental guide for developing this dynamic Matter bridge implementation.\n\nBuilt on top of the excellent [Matter.js](https://github.com/project-chip/matter.js) library.","readmeFilename":"README.md","_rev":"1-c9ed28ac9775c23efb22310547349e28"}