From c470e9c8b4e7e05e4df7eba569215b43145afa0b Mon Sep 17 00:00:00 2001 From: Luligu Date: Sun, 26 Jan 2025 20:14:49 +0100 Subject: [PATCH 01/13] Release 2.4.4 --- CHANGELOG.md | 11 ++ package-lock.json | 209 ++++++++++++++-------------- package.json | 12 +- src/entity.ts | 314 +++++++++++++++++++------------------------ src/index.test.ts | 13 +- src/platform.test.ts | 13 +- src/platform.ts | 10 +- 7 files changed, 273 insertions(+), 309 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7425ce..23e303b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,17 @@ If you like this project and find it useful, please consider giving it a star on All notable changes to this project will be documented in this file. +## [2.4.4] - 2025-02-01 + +### Fixed + +- [plugin]: Requires Matterbridge 2.1.0. +- [package]: Updated dependencies. + + + Buy me a coffee + + ## [2.4.3] - 2025-01-20 ### Fixed diff --git a/package-lock.json b/package-lock.json index a8d57b3..cf3accd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "matterbridge-zigbee2mqtt", - "version": "2.4.3", + "version": "2.4.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "matterbridge-zigbee2mqtt", - "version": "2.4.3", + "version": "2.4.4", "license": "Apache-2.0", "dependencies": { "moment": "2.30.1", @@ -15,11 +15,11 @@ "node-persist-manager": "1.0.8" }, "devDependencies": { - "@eslint/js": "9.18.0", + "@eslint/js": "9.19.0", "@types/eslint__js": "8.42.3", "@types/jest": "29.5.14", - "@types/node": "22.10.7", - "eslint": "9.18.0", + "@types/node": "22.10.10", + "eslint": "9.19.0", "eslint-config-prettier": "10.0.1", "eslint-plugin-jest": "28.11.0", "eslint-plugin-prettier": "5.2.3", @@ -27,7 +27,7 @@ "prettier": "3.4.2", "ts-jest": "29.2.5", "typescript": "5.7.3", - "typescript-eslint": "8.20.0" + "typescript-eslint": "8.21.0" }, "engines": { "node": ">=18.0.0 <19.0.0 || >=20.0.0 <21.0.0 || >=22.0.0 <23.0.0" @@ -77,22 +77,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", + "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -234,27 +234,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", - "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.5" + "@babel/types": "^7.26.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -503,9 +503,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", + "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -530,17 +530,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", - "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.5", + "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.5", + "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -559,9 +559,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", - "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", "dev": true, "license": "MIT", "dependencies": { @@ -674,9 +674,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.18.0.tgz", - "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==", + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz", + "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==", "dev": true, "license": "MIT", "engines": { @@ -1442,9 +1442,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "version": "22.10.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.10.tgz", + "integrity": "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==", "license": "MIT", "dependencies": { "undici-types": "~6.20.0" @@ -1468,9 +1468,9 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz", + "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -1494,17 +1494,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.20.0.tgz", - "integrity": "sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz", + "integrity": "sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.20.0", - "@typescript-eslint/type-utils": "8.20.0", - "@typescript-eslint/utils": "8.20.0", - "@typescript-eslint/visitor-keys": "8.20.0", + "@typescript-eslint/scope-manager": "8.21.0", + "@typescript-eslint/type-utils": "8.21.0", + "@typescript-eslint/utils": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -1524,16 +1524,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.20.0.tgz", - "integrity": "sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.21.0.tgz", + "integrity": "sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.20.0", - "@typescript-eslint/types": "8.20.0", - "@typescript-eslint/typescript-estree": "8.20.0", - "@typescript-eslint/visitor-keys": "8.20.0", + "@typescript-eslint/scope-manager": "8.21.0", + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/typescript-estree": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", "debug": "^4.3.4" }, "engines": { @@ -1549,14 +1549,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.20.0.tgz", - "integrity": "sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", + "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.20.0", - "@typescript-eslint/visitor-keys": "8.20.0" + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1567,14 +1567,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.20.0.tgz", - "integrity": "sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz", + "integrity": "sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.20.0", - "@typescript-eslint/utils": "8.20.0", + "@typescript-eslint/typescript-estree": "8.21.0", + "@typescript-eslint/utils": "8.21.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.0" }, @@ -1591,9 +1591,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.20.0.tgz", - "integrity": "sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", + "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", "dev": true, "license": "MIT", "engines": { @@ -1605,14 +1605,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.20.0.tgz", - "integrity": "sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", + "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.20.0", - "@typescript-eslint/visitor-keys": "8.20.0", + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1658,16 +1658,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.20.0.tgz", - "integrity": "sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", + "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.20.0", - "@typescript-eslint/types": "8.20.0", - "@typescript-eslint/typescript-estree": "8.20.0" + "@typescript-eslint/scope-manager": "8.21.0", + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/typescript-estree": "8.21.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1682,13 +1682,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.20.0.tgz", - "integrity": "sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", + "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/types": "8.21.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -2412,9 +2412,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.83", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.83.tgz", - "integrity": "sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==", + "version": "1.5.88", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.88.tgz", + "integrity": "sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw==", "dev": true, "license": "ISC" }, @@ -2472,9 +2472,9 @@ } }, "node_modules/eslint": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz", - "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==", + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz", + "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==", "dev": true, "license": "MIT", "dependencies": { @@ -2483,7 +2483,7 @@ "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.10.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.18.0", + "@eslint/js": "9.19.0", "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -4375,10 +4375,13 @@ "license": "MIT" }, "node_modules/node-persist": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-4.0.3.tgz", - "integrity": "sha512-0gDy86TNShzfbpUKFbH8KJFjoovuUgVh/FqL4jrJWYz0cET76Uohl118utG/Ft6wl4sHOPXdRSY7eXH5kVY06w==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-4.0.4.tgz", + "integrity": "sha512-8sPAz/7tw1mCCc8xBG4f0wi+flHkSSgQeX998iQ75Pu27evA6UUWCjSE7xnrYTg2q33oU5leJ061EKPDv6BocQ==", "license": "MIT", + "dependencies": { + "p-limit": "^3.1.0" + }, "engines": { "node": ">=10.12.0" } @@ -4487,7 +4490,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -5420,15 +5422,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.20.0.tgz", - "integrity": "sha512-Kxz2QRFsgbWj6Xcftlw3Dd154b3cEPFqQC+qMZrMypSijPd4UanKKvoKDrJ4o8AIfZFKAF+7sMaEIR8mTElozA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.21.0.tgz", + "integrity": "sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.20.0", - "@typescript-eslint/parser": "8.20.0", - "@typescript-eslint/utils": "8.20.0" + "@typescript-eslint/eslint-plugin": "8.21.0", + "@typescript-eslint/parser": "8.21.0", + "@typescript-eslint/utils": "8.21.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5690,7 +5692,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" diff --git a/package.json b/package.json index e22c360..0fd0848 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matterbridge-zigbee2mqtt", - "version": "2.4.3", + "version": "2.4.4", "description": "Matterbridge zigbee2mqtt plugin", "author": "https://github.com/Luligu", "license": "Apache-2.0", @@ -61,7 +61,7 @@ "deepCleanBuild": "npm run deepClean && npm install && npm link matterbridge && npm run build", "checkDependencies": "npx npm-check-updates", "updateDependencies": "npx npm-check-updates -u && npm install && npm link matterbridge && npm run build", - "prepublishOnly": "npm pkg delete devDependencies && npm pkg delete scripts && npm install --omit=dev && npm shrinkwrap", + "prepublishOnly": "npm run buildProduction && npm pkg delete devDependencies && npm pkg delete scripts && npm pkg delete types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap", "npmPack": "copy package.json package.log && npm run buildProduction && npm pkg delete devDependencies && npm pkg delete scripts && npm pkg delete types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap && npm pack && copy package.log package.json && npm run deepCleanBuild", "buildProduction": "npm run clean && tsc --project tsconfig.production.json", "npmPublishTagDev": "copy package.json package.log && npm run buildProduction && npm pkg delete devDependencies && npm pkg delete scripts && npm pkg delete types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap && npm publish --tag dev && copy package.log package.json && npm run deepCleanBuild", @@ -86,11 +86,11 @@ "node-persist-manager": "1.0.8" }, "devDependencies": { - "@eslint/js": "9.18.0", + "@eslint/js": "9.19.0", "@types/eslint__js": "8.42.3", "@types/jest": "29.5.14", - "@types/node": "22.10.7", - "eslint": "9.18.0", + "@types/node": "22.10.10", + "eslint": "9.19.0", "eslint-config-prettier": "10.0.1", "eslint-plugin-jest": "28.11.0", "eslint-plugin-prettier": "5.2.3", @@ -98,6 +98,6 @@ "prettier": "3.4.2", "ts-jest": "29.2.5", "typescript": "5.7.3", - "typescript-eslint": "8.20.0" + "typescript-eslint": "8.21.0" } } diff --git a/src/entity.ts b/src/entity.ts index 78215cb..bc8c22c 100644 --- a/src/entity.ts +++ b/src/entity.ts @@ -23,7 +23,6 @@ import { DeviceTypeDefinition, - MatterbridgeDevice, airQualitySensor, colorTemperatureSwitch, dimmableSwitch, @@ -63,15 +62,12 @@ import { dimmableLight, colorTemperatureLight, onOffOutlet, - EndpointOptions, SwitchesTag, NumberTag, VendorId, coverDevice, thermostatDevice, MatterbridgeEndpoint, - ClusterServerObj, - ClusterClientObj, dimmableOutlet, doorLockDevice, occupancySensor, @@ -90,6 +86,7 @@ import { } from 'matterbridge'; import { AnsiLogger, TimestampFormat, gn, dn, ign, idn, rs, db, debugStringify, hk, zb, or, nf, LogLevel, CYAN, er, YELLOW } from 'matterbridge/logger'; import { deepCopy, deepEqual, isValidNumber } from 'matterbridge/utils'; +import { Behavior, PowerSourceBehavior } from 'matterbridge/matter'; import * as color from 'matterbridge/utils'; import EventEmitter from 'events'; @@ -99,6 +96,15 @@ import { ZigbeePlatform } from './platform.js'; import { BridgeDevice, BridgeGroup } from './zigbee2mqttTypes.js'; import { Payload, PayloadValue } from './payloadTypes.js'; +interface BehaviorOptions { + clusterId: ClusterId; + options: Record; +} + +function require(type: T, options: Behavior.Options) { + return { clusterId: ClusterId(1), options }; +} + /** * Represents a Zigbee entity: a group or a device. * @@ -117,7 +123,7 @@ export class ZigbeeEntity extends EventEmitter { public actions: string[] = []; protected en = ''; protected ien = ''; - public bridgedDevice: MatterbridgeDevice | undefined; + public bridgedDevice: MatterbridgeEndpoint | undefined; public eidn = `${or}`; private lastPayload: Payload = {}; private lastSeen = 0; @@ -128,7 +134,7 @@ export class ZigbeeEntity extends EventEmitter { // We save the tag list and device types and cluster servers and clients to avoid multiple lookups protected readonly mutableDevice = new Map< string, - { tagList: Semtag[]; deviceTypes: DeviceTypeDefinition[]; clusterServersIds: ClusterId[]; clusterServersObjs: ClusterServerObj[]; clusterClientsIds: ClusterId[]; clusterClientsObjs: ClusterClientObj[] } + { tagList: Semtag[]; deviceTypes: DeviceTypeDefinition[]; clusterServersIds: ClusterId[]; clusterServersOptions: BehaviorOptions[]; clusterClientsIds: ClusterId[]; clusterClientsOptions: BehaviorOptions[] } >(); colorTimeout: NodeJS.Timeout | undefined = undefined; @@ -232,7 +238,7 @@ export class ZigbeeEntity extends EventEmitter { if (propertyMap) { // this.log.debug(`Payload entry ${CYAN}${value}${db} => name: ${CYAN}${propertyMap.name}${db} endpoint: ${CYAN}${propertyMap.endpoint}${db} action: ${CYAN}${propertyMap.action}${db}`); const child = this.bridgedDevice.getChildEndpointByName(propertyMap.endpoint); - if (child && child.number) this.bridgedDevice.triggerSwitchEvent(propertyMap.action as 'Single' | 'Double' | 'Long', this.log, child); + if (child && child.number) child.triggerSwitchEvent(propertyMap.action as 'Single' | 'Double' | 'Long', this.log); } else this.log.debug(`*Payload entry ${CYAN}${('action_' + value) as string}${db} not found in propertyMap`); } @@ -321,32 +327,7 @@ export class ZigbeeEntity extends EventEmitter { this.thermostatTimeout = undefined; } - /** - * Creates a mutable device with the specified definition and includes the specified server list. - * - * @param {DeviceTypeDefinition | AtLeastOne} definition - The device type definition. - * @param {ClusterId[]} [includeServerList=[]] - The list of server clusters to include. - * @param {EndpointOptions} [options] - Optional endpoint options. - * @param {boolean} [debug] - Optional debug flag. - * @returns {MatterbridgeDevice} The created mutable device. - * - * @remarks - * This method creates a mutable device based on the provided definition. It adds the specified server clusters - * to the device and configures the device with basic information and power source clusters. If the device is a - * coordinator, it sets up the basic information cluster with coordinator-specific details. If the device is a - * group, it sets up the basic information cluster with group-specific details. The method also configures the - * power source cluster based on the device's power source. - */ - protected async createMutableDevice(definition: DeviceTypeDefinition | AtLeastOne, options?: EndpointOptions, debug?: boolean): Promise { - if (this.platform.matterbridge.edge === true) { - this.bridgedDevice = (await MatterbridgeEndpoint.loadInstance(definition, options, debug)) as unknown as MatterbridgeDevice; - } else { - this.bridgedDevice = await MatterbridgeDevice.loadInstance(definition, undefined, debug); - } - return this.bridgedDevice; - } - - protected getBridgedDeviceBasicInformation() { + protected addBridgedDeviceBasicInformation(): MatterbridgeEndpoint { if (!this.bridgedDevice) throw new Error('No bridged device'); // Add BridgedDeviceBasicInformation cluster and device type const softwareVersion = parseInt(this.platform.z2mBridgeInfo?.version || '1'); @@ -354,9 +335,10 @@ export class ZigbeeEntity extends EventEmitter { const hardwareVersion = parseInt(this.platform.matterbridge.matterbridgeVersion || '1'); const hardwareVersionString = this.platform.matterbridge.matterbridgeVersion || 'unknown'; if (this.isDevice && this.device && this.device.friendly_name === 'Coordinator') { - return this.bridgedDevice.getDefaultBridgedDeviceBasicInformationClusterServer(this.device.friendly_name, this.serial, 0xfff1, 'zigbee2MQTT', 'Coordinator', softwareVersion, softwareVersionString, hardwareVersion, hardwareVersionString); + this.bridgedDevice.createDefaultBridgedDeviceBasicInformationClusterServer(this.device.friendly_name, this.serial, 0xfff1, 'zigbee2MQTT', 'Coordinator', softwareVersion, softwareVersionString, hardwareVersion, hardwareVersionString); + return this.bridgedDevice; } else if (this.isDevice && this.device) { - return this.bridgedDevice.getDefaultBridgedDeviceBasicInformationClusterServer( + this.bridgedDevice.createDefaultBridgedDeviceBasicInformationClusterServer( this.device.friendly_name, this.serial, 0xfff1, @@ -367,43 +349,33 @@ export class ZigbeeEntity extends EventEmitter { hardwareVersion, hardwareVersionString, ); + return this.bridgedDevice; } if (!this.group) throw new Error('No group found'); - return this.bridgedDevice.getDefaultBridgedDeviceBasicInformationClusterServer(this.group.friendly_name, this.serial, 0xfff1, 'zigbee2MQTT', 'Group', softwareVersion, softwareVersionString, hardwareVersion, hardwareVersionString); - } - - protected addBridgedDeviceBasicInformation(): MatterbridgeDevice { - if (!this.bridgedDevice) throw new Error('No bridged device'); - // Add BridgedDeviceBasicInformation cluster and device type - this.bridgedDevice.addDeviceType(bridgedNode); - this.bridgedDevice.addClusterServer(this.getBridgedDeviceBasicInformation()); + this.bridgedDevice.createDefaultBridgedDeviceBasicInformationClusterServer(this.group.friendly_name, this.serial, 0xfff1, 'zigbee2MQTT', 'Group', softwareVersion, softwareVersionString, hardwareVersion, hardwareVersionString); return this.bridgedDevice; } - protected getPowerSource() { + protected addPowerSource(): MatterbridgeEndpoint { if (!this.bridgedDevice) throw new Error('No bridged device'); + // Add PowerSource device type and cluster if (this.isDevice) { if (this.device?.power_source === 'Battery') { - return this.bridgedDevice.getDefaultPowerSourceReplaceableBatteryClusterServer(100, PowerSource.BatChargeLevel.Ok); + this.bridgedDevice.createDefaultPowerSourceReplaceableBatteryClusterServer(100, PowerSource.BatChargeLevel.Ok); } else { - return this.bridgedDevice?.getDefaultPowerSourceWiredClusterServer(); + this.bridgedDevice.createDefaultPowerSourceWiredClusterServer(); } } - return this.bridgedDevice?.getDefaultPowerSourceWiredClusterServer(); - } - - protected addPowerSource(): MatterbridgeDevice { - if (!this.bridgedDevice) throw new Error('No bridged device'); - // Add PowerSource device type and cluster - this.bridgedDevice.addDeviceType(powerSource); - this.bridgedDevice.addClusterServer(this.getPowerSource() as unknown as ClusterServerObj); + if (this.isGroup) { + this.bridgedDevice.createDefaultPowerSourceWiredClusterServer(); + } return this.bridgedDevice; } /** * Verifies that all required server clusters are present on the main endpoint and child endpoints. * - * @param {MatterbridgeDevice} endpoint - The device endpoint to verify. + * @param {MatterbridgeEndpoint} endpoint - The device endpoint to verify. * @returns {boolean} True if all required server clusters are present, false otherwise. * * @remarks @@ -411,14 +383,14 @@ export class ZigbeeEntity extends EventEmitter { * It logs an error message if any required server cluster is missing and returns false. If all required server * clusters are present, it returns true. */ - protected verifyMutableDevice(endpoint: MatterbridgeDevice): boolean { + protected verifyMutableDevice(endpoint: MatterbridgeEndpoint): boolean { if (!endpoint) return false; // Verify that all required server clusters are present in the main endpoint and in the child endpoints for (const deviceType of endpoint.getDeviceTypes()) { for (const clusterId of deviceType.requiredServerClusters) { - if (!endpoint.getClusterServerById(clusterId)) { - endpoint.addClusterServerFromList(endpoint, [clusterId]); + if (!endpoint.hasClusterServer(clusterId)) { + endpoint.addClusterServers([clusterId]); this.log.warn(`Endpoint with device type ${deviceType.name} (0x${deviceType.code.toString(16)}) requires cluster server ${getClusterNameById(clusterId)} (0x${clusterId.toString(16)}) but it is not present on endpoint`); } } @@ -428,8 +400,8 @@ export class ZigbeeEntity extends EventEmitter { for (const childEndpoint of endpoint.getChildEndpoints()) { for (const deviceType of childEndpoint.getDeviceTypes()) { for (const clusterId of deviceType.requiredServerClusters) { - if (!childEndpoint.getClusterServerById(clusterId)) { - endpoint.addClusterServerFromList(childEndpoint, [clusterId]); + if (!childEndpoint.hasClusterServer(clusterId)) { + childEndpoint.addClusterServers([clusterId]); this.log.warn(`Child endpoint with device type ${deviceType.name} (0x${deviceType.code.toString(16)}) requires cluster server ${getClusterNameById(clusterId)} (0x${clusterId.toString(16)}) but it is not present on child endpoint`); } } @@ -450,11 +422,11 @@ export class ZigbeeEntity extends EventEmitter { * operation event based on the current state. */ async configure(): Promise { - if (this.bridgedDevice?.getClusterServerById(WindowCovering.Cluster.id)) { + if (this.bridgedDevice?.hasClusterServer(WindowCovering.Cluster.id)) { this.log.info(`Configuring ${this.bridgedDevice?.deviceName} WindowCovering cluster`); await this.bridgedDevice?.setWindowCoveringTargetAsCurrentAndStopped(); } - if (this.bridgedDevice?.getClusterServerById(DoorLock.Cluster.id)) { + if (this.bridgedDevice?.hasClusterServer(DoorLock.Cluster.id)) { this.log.info(`Configuring ${this.bridgedDevice?.deviceName} DoorLock cluster`); const state = this.bridgedDevice?.getAttribute(DoorLock.Cluster.id, 'lockState', this.log); if (this.bridgedDevice.maybeNumber) { @@ -496,14 +468,14 @@ export class ZigbeeEntity extends EventEmitter { if (childEndpointName && childEndpointName !== '') { deviceEndpoint = this.bridgedDevice?.getChildEndpointByName(childEndpointName) ?? deviceEndpoint; } - const cluster = deviceEndpoint.getClusterServerById(ClusterId(clusterId)); - if (cluster === undefined) { + // const cluster = deviceEndpoint.getClusterServerById(ClusterId(clusterId)); + if (!deviceEndpoint.hasClusterServer(ClusterId(clusterId))) { this.log.debug( `Update endpoint ${this.eidn}${deviceEndpoint.name}:${deviceEndpoint.number}${db}${childEndpointName ? ' (' + zb + childEndpointName + db + ')' : ''} cluster ${hk}${clusterId}${db}-${hk}${getClusterNameById(ClusterId(clusterId))}${db} not found: is z2m converter exposing all features?`, ); return; } - if (!cluster.isAttributeSupportedByName(attributeName)) { + if (!deviceEndpoint.hasAttributeServer(ClusterId(clusterId), attributeName)) { this.log.debug( `Update endpoint ${this.eidn}${deviceEndpoint.name}:${deviceEndpoint.number}${db}${childEndpointName ? ' (' + zb + childEndpointName + db + ')' : ''} error attribute ${hk}${clusterId}${db}-${hk}${getClusterNameById(ClusterId(clusterId))}${db}.${hk}${attributeName}${db} not found`, ); @@ -520,7 +492,7 @@ export class ZigbeeEntity extends EventEmitter { return; } } - const localValue = this.bridgedDevice?.getAttribute(ClusterId(clusterId), attributeName, undefined, deviceEndpoint); + const localValue = deviceEndpoint.getAttribute(ClusterId(clusterId), attributeName, undefined); if (typeof value === 'object' ? deepEqual(value, localValue) : value === localValue) { this.log.debug( `Skip update endpoint ${deviceEndpoint.name}:${deviceEndpoint.number}${childEndpointName ? ' (' + childEndpointName + ')' : ''} ` + @@ -533,7 +505,7 @@ export class ZigbeeEntity extends EventEmitter { `attribute ${hk}${getClusterNameById(ClusterId(clusterId))}${db}.${hk}${attributeName}${db} from ${YELLOW}${typeof localValue === 'object' ? debugStringify(localValue) : localValue}${db} to ${YELLOW}${typeof value === 'object' ? debugStringify(value) : value}${db}`, ); try { - this.bridgedDevice?.setAttribute(ClusterId(clusterId), attributeName, value, undefined, deviceEndpoint); + deviceEndpoint.setAttribute(ClusterId(clusterId), attributeName, value, undefined); } catch (error) { this.log.error(`Error setting attribute ${hk}${getClusterNameById(ClusterId(clusterId))}${er}.${hk}${attributeName}${er} to ${value}: ${error}`); } @@ -636,13 +608,12 @@ export class ZigbeeGroup extends ZigbeeEntity { if (group.members.length === 0) { // Create a virtual device for the empty group to use in automations zigbeeGroup.log.debug(`Group: ${gn}${group.friendly_name}${rs}${db} is a ${CYAN}virtual${db} group`); - zigbeeGroup.bridgedDevice = await zigbeeGroup.createMutableDevice([onOffSwitch], { uniqueStorageKey: group.friendly_name }, zigbeeGroup.log.logLevel === LogLevel.DEBUG); + zigbeeGroup.bridgedDevice = new MatterbridgeEndpoint([onOffSwitch, bridgedNode, powerSource], { uniqueStorageKey: group.friendly_name }, zigbeeGroup.log.logLevel === LogLevel.DEBUG); isSwitch = true; zigbeeGroup.propertyMap.set('state', { name: 'state', type: 'switch', endpoint: '' }); } else { // Create a switch or light or outlet device for the group group.members.forEach((member) => { - // const device = zigbeeGroup.platform.z2m.getDevice(member.ieee_address); const device = zigbeeGroup.platform.z2mBridgeDevices?.find((device) => device.ieee_address === member.ieee_address); if (!device) return; zigbeeGroup.log.debug(`Group ${gn}${group.friendly_name}${db}: member device ${dn}${device.friendly_name}${db}`); @@ -717,12 +688,12 @@ export class ZigbeeGroup extends ZigbeeEntity { zigbeeGroup.propertyMap.set('system_mode', { name: 'system_mode', type: 'climate', endpoint: '' }); } if (!deviceType) return zigbeeGroup; - zigbeeGroup.bridgedDevice = await zigbeeGroup.createMutableDevice([deviceType], { uniqueStorageKey: group.friendly_name }, zigbeeGroup.log.logLevel === LogLevel.DEBUG); + zigbeeGroup.bridgedDevice = new MatterbridgeEndpoint([deviceType, bridgedNode, powerSource], { uniqueStorageKey: group.friendly_name }, zigbeeGroup.log.logLevel === LogLevel.DEBUG); } zigbeeGroup.addBridgedDeviceBasicInformation(); zigbeeGroup.addPowerSource(); - zigbeeGroup.bridgedDevice.addRequiredClusterServers(zigbeeGroup.bridgedDevice); + zigbeeGroup.bridgedDevice.addRequiredClusterServers(); // Verify the device if (!zigbeeGroup.bridgedDevice || !zigbeeGroup.verifyMutableDevice(zigbeeGroup.bridgedDevice)) return zigbeeGroup; @@ -996,10 +967,10 @@ export class ZigbeeDevice extends ZigbeeEntity { if (device.friendly_name === 'Coordinator' || (device.model_id === 'ti.router' && device.manufacturer === 'TexasInstruments') || (device.model_id.startsWith('SLZB-') && device.manufacturer === 'SMLIGHT')) { zigbeeDevice.isRouter = true; - zigbeeDevice.bridgedDevice = await zigbeeDevice.createMutableDevice([doorLockDevice], { uniqueStorageKey: device.friendly_name }, zigbeeDevice.log.logLevel === LogLevel.DEBUG); + zigbeeDevice.bridgedDevice = new MatterbridgeEndpoint([doorLockDevice], { uniqueStorageKey: device.friendly_name }, zigbeeDevice.log.logLevel === LogLevel.DEBUG); zigbeeDevice.addBridgedDeviceBasicInformation(); zigbeeDevice.addPowerSource(); - zigbeeDevice.bridgedDevice.addRequiredClusterServers(zigbeeDevice.bridgedDevice); + zigbeeDevice.bridgedDevice.addRequiredClusterServers(); await zigbeeDevice.bridgedDevice.addFixedLabel('type', 'lock'); zigbeeDevice.verifyMutableDevice(zigbeeDevice.bridgedDevice); @@ -1157,7 +1128,7 @@ export class ZigbeeDevice extends ZigbeeEntity { zigbeeDevice.propertyMap.set(property, { name, type, endpoint, category, description, label, unit, value_min, value_max, values: value }); if (endpoint === '') { /* prettier-ignore */ - if (!zigbeeDevice.mutableDevice.has(endpoint)) { zigbeeDevice.mutableDevice.set(endpoint, { tagList: [], deviceTypes: [z2m.deviceType], clusterServersIds: [...z2m.deviceType.requiredServerClusters, ClusterId(z2m.cluster)], clusterServersObjs: [], clusterClientsIds: [], clusterClientsObjs: [] }); + if (!zigbeeDevice.mutableDevice.has(endpoint)) { zigbeeDevice.mutableDevice.set(endpoint, { tagList: [], deviceTypes: [z2m.deviceType], clusterServersIds: [...z2m.deviceType.requiredServerClusters, ClusterId(z2m.cluster)], clusterServersOptions: [], clusterClientsIds: [], clusterClientsOptions: [] }); } else { zigbeeDevice.mutableDevice.get(endpoint)?.deviceTypes.push(z2m.deviceType); zigbeeDevice.mutableDevice.get(endpoint)?.clusterServersIds.push(...z2m.deviceType.requiredServerClusters, ClusterId(z2m.cluster)); @@ -1172,7 +1143,7 @@ export class ZigbeeDevice extends ZigbeeEntity { if (endpoint === 'l6') tagList.push({ mfgCode: null, namespaceId: NumberTag.Six.namespaceId, tag: NumberTag.Six.tag, label: 'endpoint ' + endpoint }); tagList.push({ mfgCode: null, namespaceId: SwitchesTag.Custom.namespaceId, tag: SwitchesTag.Custom.tag, label: 'endpoint ' + endpoint }); /* prettier-ignore */ - if (!zigbeeDevice.mutableDevice.has(endpoint)) { zigbeeDevice.mutableDevice.set(endpoint, { tagList, deviceTypes: [z2m.deviceType], clusterServersIds: [...z2m.deviceType.requiredServerClusters, ClusterId(z2m.cluster)], clusterServersObjs: [], clusterClientsIds: [], clusterClientsObjs: [] }); + if (!zigbeeDevice.mutableDevice.has(endpoint)) { zigbeeDevice.mutableDevice.set(endpoint, { tagList, deviceTypes: [z2m.deviceType], clusterServersIds: [...z2m.deviceType.requiredServerClusters, ClusterId(z2m.cluster)], clusterServersOptions: [], clusterClientsIds: [], clusterClientsOptions: [] }); } else { zigbeeDevice.mutableDevice.get(endpoint)?.deviceTypes.push(z2m.deviceType); zigbeeDevice.mutableDevice.get(endpoint)?.clusterServersIds.push(...z2m.deviceType.requiredServerClusters, ClusterId(z2m.cluster)); @@ -1188,7 +1159,7 @@ export class ZigbeeDevice extends ZigbeeEntity { if (name === 'action' && zigbeeDevice.actions.length) { zigbeeDevice.log.info(`Device ${zigbeeDevice.ien}${device.friendly_name}${rs}${nf} has actions mapped to these switches on sub endpoints:`); zigbeeDevice.log.info(' controller events <=> zigbee2mqtt actions'); - if (!zigbeeDevice.bridgedDevice) zigbeeDevice.bridgedDevice = await zigbeeDevice.createMutableDevice([bridgedNode], { uniqueStorageKey: device.friendly_name }, zigbeeDevice.log.logLevel === LogLevel.DEBUG); + if (!zigbeeDevice.bridgedDevice) zigbeeDevice.bridgedDevice = new MatterbridgeEndpoint([bridgedNode], { uniqueStorageKey: device.friendly_name }, zigbeeDevice.log.logLevel === LogLevel.DEBUG); zigbeeDevice.hasEndpoints = true; // Mapping actions const switchMap = ['Single Press', 'Double Press', 'Long Press ']; @@ -1203,7 +1174,7 @@ export class ZigbeeDevice extends ZigbeeEntity { } const tagList: { mfgCode: VendorId | null; namespaceId: number; tag: number; label?: string | null }[] = []; tagList.push({ mfgCode: null, namespaceId: SwitchesTag.Custom.namespaceId, tag: SwitchesTag.Custom.tag, label: 'switch_' + count }); - zigbeeDevice.mutableDevice.set('switch_' + count, { tagList, deviceTypes: [genericSwitch], clusterServersIds: [...genericSwitch.requiredServerClusters], clusterServersObjs: [], clusterClientsIds: [], clusterClientsObjs: [] }); + zigbeeDevice.mutableDevice.set('switch_' + count, { tagList, deviceTypes: [genericSwitch], clusterServersIds: [...genericSwitch.requiredServerClusters], clusterServersOptions: [], clusterClientsIds: [], clusterClientsOptions: [] }); } else { for (let i = 0; i < zigbeeDevice.actions.length; i += 3) { const actionsMap: string[] = []; @@ -1214,7 +1185,7 @@ export class ZigbeeDevice extends ZigbeeEntity { } const tagList: { mfgCode: VendorId | null; namespaceId: number; tag: number; label?: string | null }[] = []; tagList.push({ mfgCode: null, namespaceId: SwitchesTag.Custom.namespaceId, tag: SwitchesTag.Custom.tag, label: 'switch_' + count }); - zigbeeDevice.mutableDevice.set('switch_' + count, { tagList, deviceTypes: [genericSwitch], clusterServersIds: [...genericSwitch.requiredServerClusters], clusterServersObjs: [], clusterClientsIds: [], clusterClientsObjs: [] }); + zigbeeDevice.mutableDevice.set('switch_' + count, { tagList, deviceTypes: [genericSwitch], clusterServersIds: [...genericSwitch.requiredServerClusters], clusterServersOptions: [], clusterClientsIds: [], clusterClientsOptions: [] }); count++; } } @@ -1230,7 +1201,7 @@ export class ZigbeeDevice extends ZigbeeEntity { } // Handle when the device has only child endpoints - if (!zigbeeDevice.mutableDevice.has('')) zigbeeDevice.mutableDevice.set('', { tagList: [], deviceTypes: [bridgedNode, powerSource], clusterServersIds: [], clusterServersObjs: [], clusterClientsIds: [], clusterClientsObjs: [] }); + if (!zigbeeDevice.mutableDevice.has('')) zigbeeDevice.mutableDevice.set('', { tagList: [], deviceTypes: [bridgedNode, powerSource], clusterServersIds: [], clusterServersOptions: [], clusterClientsIds: [], clusterClientsOptions: [] }); const mainEndpoint = zigbeeDevice.mutableDevice.get(''); if (!mainEndpoint) return zigbeeDevice; @@ -1245,23 +1216,35 @@ export class ZigbeeDevice extends ZigbeeEntity { if (deviceTypesMap.has(onOffOutlet.code) && deviceTypesMap.has(dimmableOutlet.code)) deviceTypesMap.delete(onOffOutlet.code); if (deviceTypesMap.has(onOffLight.code) && deviceTypesMap.has(dimmableLight.code)) deviceTypesMap.delete(onOffLight.code); if (deviceTypesMap.has(dimmableLight.code) && deviceTypesMap.has(colorTemperatureLight.code)) deviceTypesMap.delete(dimmableLight.code); + deviceTypesMap.delete(powerSource.code); device.deviceTypes = Array.from(deviceTypesMap.values()); /* .sort((a, b) => b.code - a.code);*/ } // Create the mutable device for the main endpoint - zigbeeDevice.bridgedDevice = await zigbeeDevice.createMutableDevice(mainEndpoint.deviceTypes as AtLeastOne, { uniqueStorageKey: device.friendly_name }, zigbeeDevice.log.logLevel === LogLevel.DEBUG); - - // Configure BridgedDeviceBasicInformation cluster - mainEndpoint.clusterServersObjs.push(zigbeeDevice.getBridgedDeviceBasicInformation() as unknown as ClusterServerObj); - - // Configure PowerSource cluster - mainEndpoint.clusterServersObjs.push(zigbeeDevice.getPowerSource() as unknown as ClusterServerObj); + zigbeeDevice.bridgedDevice = new MatterbridgeEndpoint([...(mainEndpoint.deviceTypes as AtLeastOne), bridgedNode, powerSource], { uniqueStorageKey: device.friendly_name }, zigbeeDevice.log.logLevel === LogLevel.DEBUG); + + // Add BridgedDeviceBasicInformation cluster + zigbeeDevice.addBridgedDeviceBasicInformation(); + + // Add PowerSource cluster + zigbeeDevice.addPowerSource(); + mainEndpoint.clusterServersIds.splice(mainEndpoint.clusterServersIds.indexOf(PowerSource.Cluster.id), 1); + // ClusterBehavior.for(PowerSource.Cluster); + const options = require(PowerSourceBehavior.with(PowerSource.Feature.Wired), { + wiredCurrentType: PowerSource.WiredCurrentType.Ac, + description: 'AC Power', + status: PowerSource.PowerSourceStatus.Active, + order: 0, + endpointList: [], + }); + mainEndpoint.clusterServersOptions.push(options); // Configure ColorControlCluster if (mainEndpoint.clusterServersIds.includes(ColorControl.Cluster.id)) { zigbeeDevice.log.debug(`Configuring device ${zigbeeDevice.ien}${device.friendly_name}${rs}${db} ColorControlCluster cluster with HS: ${names.includes('color_hs')} XY: ${names.includes('color_xy')} CT: ${names.includes('color_temp')}`); if (!names.includes('color_hs') && !names.includes('color_xy')) { - mainEndpoint.clusterServersObjs.push(zigbeeDevice.bridgedDevice.getCtColorControlClusterServer() as unknown as ClusterServerObj); + zigbeeDevice.bridgedDevice.createCtColorControlClusterServer(); + mainEndpoint.clusterServersIds.splice(mainEndpoint.clusterServersIds.indexOf(ColorControl.Cluster.id), 1); } } @@ -1279,42 +1262,45 @@ export class ZigbeeDevice extends ZigbeeEntity { ); if (heat && !cool) { zigbeeDevice.propertyMap.delete('running_state'); // Remove running_state if only heating is supported cause it's not supported by the cluster without AutoMode - mainEndpoint.clusterServersObjs.push(zigbeeDevice.bridgedDevice.getDefaultHeatingThermostatClusterServer(undefined, undefined, minHeating, maxHeating) as unknown as ClusterServerObj); + zigbeeDevice.bridgedDevice.createDefaultHeatingThermostatClusterServer(undefined, undefined, minHeating, maxHeating); + mainEndpoint.clusterServersIds.splice(mainEndpoint.clusterServersIds.indexOf(Thermostat.Cluster.id), 1); } else if (!heat && cool) { zigbeeDevice.propertyMap.delete('running_state'); // Remove running_state if only cooling is supported cause it's not supported by the cluster without AutoMode - mainEndpoint.clusterServersObjs.push(zigbeeDevice.bridgedDevice.getDefaultCoolingThermostatClusterServer(undefined, undefined, minCooling, maxCooling) as unknown as ClusterServerObj); + zigbeeDevice.bridgedDevice.createDefaultCoolingThermostatClusterServer(undefined, undefined, minCooling, maxCooling); + mainEndpoint.clusterServersIds.splice(mainEndpoint.clusterServersIds.indexOf(Thermostat.Cluster.id), 1); } else if (heat && cool) { - mainEndpoint.clusterServersObjs.push(zigbeeDevice.bridgedDevice.getDefaultThermostatClusterServer(undefined, undefined, undefined, undefined, minHeating, maxHeating, minCooling, maxCooling) as unknown as ClusterServerObj); + zigbeeDevice.bridgedDevice.createDefaultThermostatClusterServer(undefined, undefined, undefined, undefined, minHeating, maxHeating, minCooling, maxCooling); + mainEndpoint.clusterServersIds.splice(mainEndpoint.clusterServersIds.indexOf(Thermostat.Cluster.id), 1); } } // Filter out duplicate clusters and clusters objects for (const [endpoint, device] of zigbeeDevice.mutableDevice) { // Filter out duplicate server clusters and server clusters objects. Remove the cluster server id when a cluster server object is present. - const deviceClusterServersMap = new Map(); + const deviceClusterServersIdMap = new Map(); device.clusterServersIds.forEach((clusterServer) => { - deviceClusterServersMap.set(clusterServer, clusterServer); + deviceClusterServersIdMap.set(clusterServer, clusterServer); }); - const deviceClusterServersObjMap = new Map(); - device.clusterServersObjs.forEach((clusterServerObj) => { - deviceClusterServersMap.delete(clusterServerObj.id); - deviceClusterServersObjMap.set(clusterServerObj.id, clusterServerObj); + const deviceClusterServersObjMap = new Map(); + device.clusterServersOptions.forEach((clusterServer) => { + deviceClusterServersIdMap.delete(clusterServer.clusterId); + deviceClusterServersObjMap.set(clusterServer.clusterId, clusterServer); }); - device.clusterServersIds = Array.from(deviceClusterServersMap.values()); - device.clusterServersObjs = Array.from(deviceClusterServersObjMap.values()); + device.clusterServersIds = Array.from(deviceClusterServersIdMap.values()); + device.clusterServersOptions = Array.from(deviceClusterServersObjMap.values()); // Filter out duplicate client clusters and client clusters objects. Remove the cluster client id when a cluster client object is present. - const deviceClusterClientsMap = new Map(); + const deviceClusterClientsIdMap = new Map(); device.clusterClientsIds.forEach((clusterClient) => { - deviceClusterClientsMap.set(clusterClient, clusterClient); + deviceClusterClientsIdMap.set(clusterClient, clusterClient); }); - const deviceClusterClientsObjMap = new Map(); - device.clusterClientsObjs.forEach((clusterClientObj) => { - deviceClusterClientsMap.delete(clusterClientObj.id); - deviceClusterClientsObjMap.set(clusterClientObj.id, clusterClientObj); + const deviceClusterClientsObjMap = new Map(); + device.clusterClientsOptions.forEach((clusterClient) => { + deviceClusterClientsIdMap.delete(clusterClient.clusterId); + deviceClusterClientsObjMap.set(clusterClient.clusterId, clusterClient); }); - device.clusterClientsIds = Array.from(deviceClusterClientsMap.values()); - device.clusterClientsObjs = Array.from(deviceClusterClientsObjMap.values()); + device.clusterClientsIds = Array.from(deviceClusterClientsIdMap.values()); + device.clusterClientsOptions = Array.from(deviceClusterClientsObjMap.values()); zigbeeDevice.log.debug( `Device ${zigbeeDevice.ien}${zigbeeDevice.device?.friendly_name}${rs}${db} endpoint: ${ign}${endpoint === '' ? 'main' : endpoint}${rs}${db} => ` + @@ -1322,29 +1308,16 @@ export class ZigbeeDevice extends ZigbeeEntity { ); } - // Add the cluster objects to the main endpoint - mainEndpoint.clusterServersObjs.forEach((clusterServerObj) => { - zigbeeDevice.bridgedDevice?.addClusterServer(clusterServerObj); - }); // Add the cluster ids to the main endpoint - zigbeeDevice.bridgedDevice.addClusterServerFromList(zigbeeDevice.bridgedDevice, mainEndpoint.clusterServersIds); - zigbeeDevice.bridgedDevice.addRequiredClusterServers(zigbeeDevice.bridgedDevice); + zigbeeDevice.bridgedDevice.addClusterServers(mainEndpoint.clusterServersIds); + zigbeeDevice.bridgedDevice.addRequiredClusterServers(); // Add the Fixed Label cluster to the main endpoint if (zigbeeDevice.composedType !== '') await zigbeeDevice.bridgedDevice.addFixedLabel('composed', zigbeeDevice.composedType); // Create the child endpoints for (const [endpoint, device] of zigbeeDevice.mutableDevice) { if (endpoint === '') continue; - const child = zigbeeDevice.bridgedDevice?.addChildDeviceTypeWithClusterServer( - endpoint, - device.deviceTypes as AtLeastOne, - device.clusterServersIds, - { tagList: device.tagList }, - zigbeeDevice.log.logLevel === LogLevel.DEBUG, - ); - device.clusterServersObjs.forEach((clusterServerObj) => { - child.addClusterServer(clusterServerObj); - }); + zigbeeDevice.bridgedDevice?.addChildDeviceTypeWithClusterServer(endpoint, device.deviceTypes as AtLeastOne, device.clusterServersIds, { tagList: device.tagList }, zigbeeDevice.log.logLevel === LogLevel.DEBUG); } // Verify the device @@ -1359,11 +1332,11 @@ export class ZigbeeDevice extends ZigbeeEntity { // Add command handlers zigbeeDevice.bridgedDevice.addCommandHandler('identify', async (data) => { zigbeeDevice.log.debug(`Command identify called for ${zigbeeDevice.ien}${device.friendly_name}${rs}${db} endpoint: ${data.endpoint.number} request identifyTime:${data.request.identifyTime} `); - // logEndpoint(zigbeeDevice.bridgedDevice!); + // logEndpoint(zigbeeDevice.bridgedDevice); }); - if (zigbeeDevice.bridgedDevice.getClusterServerById(OnOffCluster.id) || zigbeeDevice.hasEndpoints) { - for (const child of zigbeeDevice.bridgedDevice.getChildEndpoints() as MatterbridgeDevice[]) { - if (zigbeeDevice.platform.matterbridge.edge && child.hasClusterServer(OnOffCluster)) { + if (zigbeeDevice.bridgedDevice.hasClusterServer(OnOffCluster.id) || zigbeeDevice.hasEndpoints) { + for (const child of zigbeeDevice.bridgedDevice.getChildEndpoints() as MatterbridgeEndpoint[]) { + if (child.hasClusterServer(OnOffCluster)) { child.addCommandHandler('on', async (data) => { zigbeeDevice.log.debug(`Command on called for ${zigbeeDevice.ien}${device.friendly_name}${rs}${db} endpoint: ${data.endpoint.number}`); const payload: Payload = {}; @@ -1409,9 +1382,9 @@ export class ZigbeeDevice extends ZigbeeEntity { zigbeeDevice.publishCommand('toggle', device.friendly_name, payload); }); } - if (zigbeeDevice.bridgedDevice.getClusterServerById(LevelControlCluster.id) || zigbeeDevice.hasEndpoints) { - for (const child of zigbeeDevice.bridgedDevice.getChildEndpoints() as MatterbridgeDevice[]) { - if (zigbeeDevice.platform.matterbridge.edge && child.hasClusterServer(LevelControlCluster)) { + if (zigbeeDevice.bridgedDevice.hasClusterServer(LevelControlCluster.id) || zigbeeDevice.hasEndpoints) { + for (const child of zigbeeDevice.bridgedDevice.getChildEndpoints() as MatterbridgeEndpoint[]) { + if (child.hasClusterServer(LevelControlCluster)) { child.addCommandHandler('moveToLevel', async (data) => { zigbeeDevice.log.debug(`Command moveToLevel called for ${zigbeeDevice.ien}${device.friendly_name}${rs}${db} endpoint: ${data.endpoint.number} request: ${data.request.level} transition: ${data.request.transitionTime}`); const payload: Payload = {}; @@ -1447,7 +1420,7 @@ export class ZigbeeDevice extends ZigbeeEntity { zigbeeDevice.publishCommand('moveToLevelWithOnOff', device.friendly_name, payload); }); } - if (zigbeeDevice.bridgedDevice.getClusterServerById(ColorControlCluster.id) && zigbeeDevice.bridgedDevice.getClusterServer(ColorControlCluster)?.isAttributeSupportedByName('colorTemperatureMireds')) { + if (zigbeeDevice.bridgedDevice.hasAttributeServer(ColorControlCluster.id, 'colorTemperatureMireds')) { zigbeeDevice.bridgedDevice.addCommandHandler('moveToColorTemperature', async ({ request }) => { zigbeeDevice.log.debug(`Command moveToColorTemperature called for ${zigbeeDevice.ien}${device.friendly_name}${rs}${db} request: ${request.colorTemperatureMireds}`); await zigbeeDevice.bridgedDevice?.setAttribute(ColorControlCluster.id, 'colorMode', ColorControl.ColorMode.ColorTemperatureMireds, zigbeeDevice.log); @@ -1456,7 +1429,7 @@ export class ZigbeeDevice extends ZigbeeEntity { zigbeeDevice.publishCommand('moveToColorTemperature', device.friendly_name, payload); }); } - if (zigbeeDevice.bridgedDevice.getClusterServerById(ColorControlCluster.id) && zigbeeDevice.bridgedDevice.getClusterServer(ColorControlCluster)?.isAttributeSupportedByName('currentX')) { + if (zigbeeDevice.bridgedDevice.hasAttributeServer(ColorControlCluster.id, 'currentX')) { zigbeeDevice.bridgedDevice.addCommandHandler('moveToColor', async ({ request }) => { zigbeeDevice.log.debug(`Command moveToColor called for ${zigbeeDevice.ien}${device.friendly_name}${rs}${db} request: X: ${request.colorX} Y: ${request.colorY}`); await zigbeeDevice.bridgedDevice?.setAttribute(ColorControlCluster.id, 'colorMode', ColorControl.ColorMode.CurrentXAndCurrentY, zigbeeDevice.log); @@ -1465,7 +1438,7 @@ export class ZigbeeDevice extends ZigbeeEntity { zigbeeDevice.publishCommand('moveToColor', device.friendly_name, payload); }); } - if (zigbeeDevice.bridgedDevice.getClusterServerById(ColorControlCluster.id) && zigbeeDevice.bridgedDevice.getClusterServer(ColorControlCluster)?.isAttributeSupportedByName('currentHue')) { + if (zigbeeDevice.bridgedDevice.hasAttributeServer(ColorControlCluster.id, 'currentHue')) { let lastRequestedHue = 0; let lastRequestedSaturation = 0; zigbeeDevice.bridgedDevice.addCommandHandler('moveToHue', async ({ request }) => { @@ -1501,7 +1474,7 @@ export class ZigbeeDevice extends ZigbeeEntity { zigbeeDevice.publishCommand('moveToHueAndSaturation', device.friendly_name, payload); }); } - if (zigbeeDevice.bridgedDevice.getClusterServerById(WindowCoveringCluster.id)) { + if (zigbeeDevice.bridgedDevice.hasClusterServer(WindowCoveringCluster.id)) { zigbeeDevice.bridgedDevice.addCommandHandler('upOrOpen', async () => { zigbeeDevice.log.debug(`Command upOrOpen called for ${zigbeeDevice.ien}${device.friendly_name}${rs}${db}`); if (zigbeeDevice.isDevice && zigbeeDevice.propertyMap.has('position')) zigbeeDevice.bridgedDevice?.setAttribute(WindowCoveringCluster.id, 'targetPositionLiftPercent100ths', 0, zigbeeDevice.log); @@ -1526,7 +1499,7 @@ export class ZigbeeDevice extends ZigbeeEntity { zigbeeDevice.publishCommand('goToLiftPercentage', device.friendly_name, { position: liftPercent100thsValue / 100 }); }); } - if (zigbeeDevice.bridgedDevice.getClusterServerById(DoorLockCluster.id)) { + if (zigbeeDevice.bridgedDevice.hasClusterServer(DoorLockCluster.id)) { zigbeeDevice.bridgedDevice.addCommandHandler('lockDoor', async ({ request: request }) => { zigbeeDevice.log.debug(`Command lockDoor called for ${zigbeeDevice.ien}${device.friendly_name}${rs}${db}`, request); await zigbeeDevice.bridgedDevice?.setAttribute(DoorLockCluster.id, 'lockState', DoorLock.LockState.Locked, zigbeeDevice.log); @@ -1538,7 +1511,7 @@ export class ZigbeeDevice extends ZigbeeEntity { zigbeeDevice.publishCommand('unlockDoor', device.friendly_name, { state: 'UNLOCK' }); }); } - if (zigbeeDevice.bridgedDevice.getClusterServerById(ThermostatCluster.id)) { + if (zigbeeDevice.bridgedDevice.hasClusterServer(ThermostatCluster.id)) { zigbeeDevice.bridgedDevice.addCommandHandler('setpointRaiseLower', async ({ request: request }) => { zigbeeDevice.log.debug(`Command setpointRaiseLower called for ${zigbeeDevice.ien}${device.friendly_name}${rs}${db} request:`, request); if (request.mode === Thermostat.SetpointRaiseLowerMode.Heat || request.mode === Thermostat.SetpointRaiseLowerMode.Both) { @@ -1564,15 +1537,43 @@ export class ZigbeeDevice extends ZigbeeEntity { } } }); - const thermostat = zigbeeDevice.bridgedDevice.getClusterServerById(ThermostatCluster.id); - if (thermostat) { + zigbeeDevice.bridgedDevice.subscribeAttribute( + ThermostatCluster.id, + 'systemMode', + async (value) => { + zigbeeDevice.log.debug(`Subscribe systemMode called for ${zigbeeDevice.ien}${device.friendly_name}${rs}${db} with:`, value); + const system_mode = value === Thermostat.SystemMode.Off ? 'off' : value === Thermostat.SystemMode.Heat ? 'heat' : 'cool'; + zigbeeDevice.publishCommand('SystemMode', device.friendly_name, { system_mode }); + zigbeeDevice.noUpdate = true; + zigbeeDevice.thermostatTimeout = setTimeout(() => { + zigbeeDevice.noUpdate = false; + }, 5 * 1000); + }, + zigbeeDevice.log, + ); + if (zigbeeDevice.bridgedDevice.hasAttributeServer(ThermostatCluster.id, 'occupiedHeatingSetpoint')) zigbeeDevice.bridgedDevice.subscribeAttribute( ThermostatCluster.id, - 'systemMode', + 'occupiedHeatingSetpoint', async (value) => { - zigbeeDevice.log.debug(`Subscribe systemMode called for ${zigbeeDevice.ien}${device.friendly_name}${rs}${db} with:`, value); - const system_mode = value === Thermostat.SystemMode.Off ? 'off' : value === Thermostat.SystemMode.Heat ? 'heat' : 'cool'; - zigbeeDevice.publishCommand('SystemMode', device.friendly_name, { system_mode }); + zigbeeDevice.log.debug(`Subscribe occupiedHeatingSetpoint called for ${zigbeeDevice.ien}${device.friendly_name}${rs}${db} with:`, value); + if (zigbeeDevice.propertyMap.has('current_heating_setpoint')) zigbeeDevice.publishCommand('OccupiedHeatingSetpoint', device.friendly_name, { current_heating_setpoint: Math.round(value / 100) }); + else if (zigbeeDevice.propertyMap.has('occupied_heating_setpoint')) zigbeeDevice.publishCommand('OccupiedHeatingSetpoint', device.friendly_name, { occupied_heating_setpoint: Math.round(value / 100) }); + zigbeeDevice.noUpdate = true; + zigbeeDevice.thermostatTimeout = setTimeout(() => { + zigbeeDevice.noUpdate = false; + }, 5 * 1000); + }, + zigbeeDevice.log, + ); + if (zigbeeDevice.bridgedDevice.hasAttributeServer(ThermostatCluster.id, 'occupiedCoolingSetpoint')) + zigbeeDevice.bridgedDevice.subscribeAttribute( + ThermostatCluster.id, + 'occupiedCoolingSetpoint', + async (value) => { + zigbeeDevice.log.debug(`Subscribe occupiedCoolingSetpoint called for ${zigbeeDevice.ien}${device.friendly_name}${rs}${db} with:`, value); + if (zigbeeDevice.propertyMap.has('current_cooling_setpoint')) zigbeeDevice.publishCommand('OccupiedCoolingSetpoint', device.friendly_name, { current_cooling_setpoint: Math.round(value / 100) }); + else if (zigbeeDevice.propertyMap.has('occupied_cooling_setpoint')) zigbeeDevice.publishCommand('OccupiedCoolingSetpoint', device.friendly_name, { occupied_cooling_setpoint: Math.round(value / 100) }); zigbeeDevice.noUpdate = true; zigbeeDevice.thermostatTimeout = setTimeout(() => { zigbeeDevice.noUpdate = false; @@ -1580,37 +1581,6 @@ export class ZigbeeDevice extends ZigbeeEntity { }, zigbeeDevice.log, ); - if (thermostat.attributes.occupiedHeatingSetpoint) - zigbeeDevice.bridgedDevice.subscribeAttribute( - ThermostatCluster.id, - 'occupiedHeatingSetpoint', - async (value) => { - zigbeeDevice.log.debug(`Subscribe occupiedHeatingSetpoint called for ${zigbeeDevice.ien}${device.friendly_name}${rs}${db} with:`, value); - if (zigbeeDevice.propertyMap.has('current_heating_setpoint')) zigbeeDevice.publishCommand('OccupiedHeatingSetpoint', device.friendly_name, { current_heating_setpoint: Math.round(value / 100) }); - else if (zigbeeDevice.propertyMap.has('occupied_heating_setpoint')) zigbeeDevice.publishCommand('OccupiedHeatingSetpoint', device.friendly_name, { occupied_heating_setpoint: Math.round(value / 100) }); - zigbeeDevice.noUpdate = true; - zigbeeDevice.thermostatTimeout = setTimeout(() => { - zigbeeDevice.noUpdate = false; - }, 5 * 1000); - }, - zigbeeDevice.log, - ); - if (thermostat.attributes.occupiedCoolingSetpoint) - zigbeeDevice.bridgedDevice.subscribeAttribute( - ThermostatCluster.id, - 'occupiedCoolingSetpoint', - async (value) => { - zigbeeDevice.log.debug(`Subscribe occupiedCoolingSetpoint called for ${zigbeeDevice.ien}${device.friendly_name}${rs}${db} with:`, value); - if (zigbeeDevice.propertyMap.has('current_cooling_setpoint')) zigbeeDevice.publishCommand('OccupiedCoolingSetpoint', device.friendly_name, { current_cooling_setpoint: Math.round(value / 100) }); - else if (zigbeeDevice.propertyMap.has('occupied_cooling_setpoint')) zigbeeDevice.publishCommand('OccupiedCoolingSetpoint', device.friendly_name, { occupied_cooling_setpoint: Math.round(value / 100) }); - zigbeeDevice.noUpdate = true; - zigbeeDevice.thermostatTimeout = setTimeout(() => { - zigbeeDevice.noUpdate = false; - }, 5 * 1000); - }, - zigbeeDevice.log, - ); - } } return zigbeeDevice; } diff --git a/src/index.test.ts b/src/index.test.ts index c502f64..1eb03d2 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -1,7 +1,7 @@ /* eslint-disable no-console */ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { Matterbridge, MatterbridgeDevice, MatterbridgeEndpoint, PlatformConfig } from 'matterbridge'; +import { Matterbridge, MatterbridgeEndpoint, PlatformConfig } from 'matterbridge'; import { AnsiLogger, LogLevel } from 'matterbridge/logger'; import { ZigbeePlatform } from './platform.js'; import initializePlugin from './index'; @@ -26,7 +26,7 @@ describe('initializePlugin', () => { matterbridgeDirectory: './jest/matterbridge', matterbridgePluginDirectory: './jest/plugins', systemInformation: { ipv4Address: undefined }, - matterbridgeVersion: '1.7.3', + matterbridgeVersion: '2.1.0', getDevices: jest.fn(() => { // console.log('getDevices called'); return []; @@ -35,22 +35,13 @@ describe('initializePlugin', () => { // console.log('getDevices called'); return []; }), - addBridgedDevice: jest.fn(async (pluginName: string, device: MatterbridgeDevice) => { - // console.log('addBridgedDevice called'); - }), addBridgedEndpoint: jest.fn(async (pluginName: string, device: MatterbridgeEndpoint) => { // console.log('addBridgedEndpoint called'); // await aggregator.add(device); }), - removeBridgedDevice: jest.fn(async (pluginName: string, device: MatterbridgeDevice) => { - // console.log('removeBridgedDevice called'); - }), removeBridgedEndpoint: jest.fn(async (pluginName: string, device: MatterbridgeEndpoint) => { // console.log('removeBridgedEndpoint called'); }), - removeAllBridgedDevices: jest.fn(async (pluginName: string) => { - // console.log('removeAllBridgedDevices called'); - }), removeAllBridgedEndpoints: jest.fn(async (pluginName: string) => { // console.log('removeAllBridgedEndpoints called'); }), diff --git a/src/platform.test.ts b/src/platform.test.ts index 48868f4..e826cc0 100644 --- a/src/platform.test.ts +++ b/src/platform.test.ts @@ -5,7 +5,7 @@ import { jest } from '@jest/globals'; -import { Matterbridge, MatterbridgeDevice, MatterbridgeEndpoint, PlatformConfig } from 'matterbridge'; +import { Matterbridge, MatterbridgeEndpoint, PlatformConfig } from 'matterbridge'; import { AnsiLogger, db, idn, ign, LogLevel, rs, TimestampFormat, wr, debugStringify, or, hk, zb, YELLOW } from 'matterbridge/logger'; import { wait } from 'matterbridge/utils'; @@ -35,7 +35,7 @@ describe('TestPlatform', () => { matterbridgeDirectory: './jest/matterbridge', matterbridgePluginDirectory: './jest/plugins', systemInformation: { ipv4Address: undefined }, - matterbridgeVersion: '1.7.3', + matterbridgeVersion: '2.1.0', getDevices: jest.fn(() => { // console.log('getDevices called'); return []; @@ -44,22 +44,13 @@ describe('TestPlatform', () => { // console.log('getDevices called'); return []; }), - addBridgedDevice: jest.fn(async (pluginName: string, device: MatterbridgeDevice) => { - // console.log('addBridgedDevice called'); - }), addBridgedEndpoint: jest.fn(async (pluginName: string, device: MatterbridgeEndpoint) => { // console.log('addBridgedEndpoint called'); // await aggregator.add(device); }), - removeBridgedDevice: jest.fn(async (pluginName: string, device: MatterbridgeDevice) => { - // console.log('removeBridgedDevice called'); - }), removeBridgedEndpoint: jest.fn(async (pluginName: string, device: MatterbridgeEndpoint) => { // console.log('removeBridgedEndpoint called'); }), - removeAllBridgedDevices: jest.fn(async (pluginName: string) => { - // console.log('removeAllBridgedDevices called'); - }), removeAllBridgedEndpoints: jest.fn(async (pluginName: string) => { // console.log('removeAllBridgedEndpoints called'); }), diff --git a/src/platform.ts b/src/platform.ts index edc21a6..4f3c1bb 100644 --- a/src/platform.ts +++ b/src/platform.ts @@ -21,7 +21,7 @@ * limitations under the License. * */ -import { BridgedDeviceBasicInformation, DoorLock, DoorLockCluster, Matterbridge, MatterbridgeDevice, MatterbridgeDynamicPlatform, PlatformConfig } from 'matterbridge'; +import { BridgedDeviceBasicInformation, DoorLock, DoorLockCluster, Matterbridge, MatterbridgeDynamicPlatform, MatterbridgeEndpoint, PlatformConfig } from 'matterbridge'; import { AnsiLogger, dn, gn, db, wr, zb, payloadStringify, rs, debugStringify, CYAN, er, nf } from 'matterbridge/logger'; import { isValidNumber, isValidString, waiter } from 'matterbridge/utils'; @@ -40,7 +40,7 @@ export class ZigbeePlatform extends MatterbridgeDynamicPlatform { private permitJoinCallBack: ((entityName: string, permit: boolean) => Promise) | undefined = undefined; // platform - public bridgedDevices: MatterbridgeDevice[] = []; + public bridgedDevices: MatterbridgeEndpoint[] = []; public zigbeeEntities: ZigbeeEntity[] = []; private injectTimer: NodeJS.Timeout | undefined; @@ -76,8 +76,8 @@ export class ZigbeePlatform extends MatterbridgeDynamicPlatform { super(matterbridge, log, config); // Verify that Matterbridge is the correct version - if (this.verifyMatterbridgeVersion === undefined || typeof this.verifyMatterbridgeVersion !== 'function' || !this.verifyMatterbridgeVersion('1.7.3')) { - throw new Error(`This plugin requires Matterbridge version >= "1.7.3". Please update Matterbridge from ${this.matterbridge.matterbridgeVersion} to the latest version in the frontend."`); + if (this.verifyMatterbridgeVersion === undefined || typeof this.verifyMatterbridgeVersion !== 'function' || !this.verifyMatterbridgeVersion('2.1.0')) { + throw new Error(`This plugin requires Matterbridge version >= "2.1.0". Please update Matterbridge from ${this.matterbridge.matterbridgeVersion} to the latest version in the frontend."`); } // this.log.debug(`Config:')}${rs}`, config); @@ -558,7 +558,7 @@ export class ZigbeePlatform extends MatterbridgeDynamicPlatform { const entity = this.zigbeeEntities.find((entity) => entity.entityName === friendly_name); if (entity) { this.log.info(`Removing device: ${friendly_name}`); - await this.unregisterDevice(entity.bridgedDevice as MatterbridgeDevice); + await this.unregisterDevice(entity.bridgedDevice as MatterbridgeEndpoint); this.zigbeeEntities = this.zigbeeEntities.filter((entity) => entity.entityName !== friendly_name); this.bridgedDevices = this.bridgedDevices.filter((device) => device.deviceName !== friendly_name); } From b399f988dc28d8d19a2f3a49b600ecf9e7ee63e6 Mon Sep 17 00:00:00 2001 From: Luligu Date: Sun, 26 Jan 2025 22:26:11 +0100 Subject: [PATCH 02/13] Dev 2.4.4-dev.1 --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23e303b..f24352c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ If you like this project and find it useful, please consider giving it a star on All notable changes to this project will be documented in this file. -## [2.4.4] - 2025-02-01 +## [2.4.4-dev.1] - 2025-02-01 ### Fixed diff --git a/package-lock.json b/package-lock.json index cf3accd..172e423 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "matterbridge-zigbee2mqtt", - "version": "2.4.4", + "version": "2.4.4-dev.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "matterbridge-zigbee2mqtt", - "version": "2.4.4", + "version": "2.4.4-dev.1", "license": "Apache-2.0", "dependencies": { "moment": "2.30.1", diff --git a/package.json b/package.json index 0fd0848..cbec7e8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matterbridge-zigbee2mqtt", - "version": "2.4.4", + "version": "2.4.4-dev.1", "description": "Matterbridge zigbee2mqtt plugin", "author": "https://github.com/Luligu", "license": "Apache-2.0", @@ -100,4 +100,4 @@ "typescript": "5.7.3", "typescript-eslint": "8.21.0" } -} +} \ No newline at end of file From b6a49f4481a9ce4d3d91e8e9e32baaf8f792e49e Mon Sep 17 00:00:00 2001 From: Luligu Date: Thu, 30 Jan 2025 14:22:03 +0100 Subject: [PATCH 03/13] Dev 2.4.4-dev.2 --- CHANGELOG.md | 2 +- package-lock.json | 534 +++++++++++++++++++++++++++++++++++++++++++--- package.json | 2 +- src/entity.ts | 79 +++---- src/index.test.ts | 2 +- src/platform.ts | 16 +- 6 files changed, 560 insertions(+), 75 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f24352c..4a39e90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ If you like this project and find it useful, please consider giving it a star on All notable changes to this project will be documented in this file. -## [2.4.4-dev.1] - 2025-02-01 +## [2.4.4-dev.2] - 2025-02-01 ### Fixed diff --git a/package-lock.json b/package-lock.json index 172e423..5e50895 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1523,6 +1523,133 @@ "typescript": ">=4.8.4 <5.8.0" } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", + "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", + "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", + "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", + "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.21.0", + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/typescript-estree": "8.21.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", + "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/parser": { "version": "8.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.21.0.tgz", @@ -1548,7 +1675,7 @@ "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { "version": "8.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", @@ -1566,6 +1693,109 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", + "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", + "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", + "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz", + "integrity": "sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/type-utils": { "version": "8.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz", @@ -1590,7 +1820,25 @@ "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", + "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { "version": "8.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", @@ -1604,7 +1852,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { "version": "8.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", @@ -1631,6 +1879,115 @@ "typescript": ">=4.8.4 <5.8.0" } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", + "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.21.0", + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/typescript-estree": "8.21.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", + "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.22.0.tgz", + "integrity": "sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz", + "integrity": "sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -1658,16 +2015,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", - "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.22.0.tgz", + "integrity": "sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/typescript-estree": "8.21.0" + "@typescript-eslint/scope-manager": "8.22.0", + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/typescript-estree": "8.22.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1682,13 +2039,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", - "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz", + "integrity": "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/types": "8.22.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -1975,9 +2332,9 @@ "license": "MIT" }, "node_modules/bl": { - "version": "6.0.18", - "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.18.tgz", - "integrity": "sha512-2k76XmWCuvu9HTvu3tFOl5HDdCH0wLZ/jHYva/LBVJmc9oX8yUtNQjxrFmbTdXsCSmIxwVTANZPNDfMQrvHFUw==", + "version": "6.0.19", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.19.tgz", + "integrity": "sha512-4Ay3A3oDfGg3GGirhl4s62ebtnk0pJZA5mLp672MPKOQXsWvXjEF4dqdXySjJIs7b9OVr/O8aOo0Lm+xdjo2JA==", "license": "MIT", "dependencies": { "@types/readable-stream": "^4.0.0", @@ -2117,9 +2474,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001695", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", - "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", + "version": "1.0.30001696", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz", + "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==", "dev": true, "funding": [ { @@ -2412,9 +2769,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.88", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.88.tgz", - "integrity": "sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw==", + "version": "1.5.90", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz", + "integrity": "sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==", "dev": true, "license": "ISC" }, @@ -4996,9 +5353,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==", "dev": true, "license": "ISC", "bin": { @@ -5444,6 +5801,133 @@ "typescript": ">=4.8.4 <5.8.0" } }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", + "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", + "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", + "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", + "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.21.0", + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/typescript-estree": "8.21.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", + "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", diff --git a/package.json b/package.json index cbec7e8..7878adb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matterbridge-zigbee2mqtt", - "version": "2.4.4-dev.1", + "version": "2.4.4-dev.2", "description": "Matterbridge zigbee2mqtt plugin", "author": "https://github.com/Luligu", "license": "Apache-2.0", diff --git a/src/entity.ts b/src/entity.ts index bc8c22c..dfc37b7 100644 --- a/src/entity.ts +++ b/src/entity.ts @@ -27,44 +27,13 @@ import { colorTemperatureSwitch, dimmableSwitch, onOffSwitch, - OnOff, - LevelControl, - ColorControl, - ColorControlCluster, - TemperatureMeasurement, - BooleanState, - RelativeHumidityMeasurement, - PressureMeasurement, - OccupancySensing, - IlluminanceMeasurement, - PowerSource, - ClusterId, - WindowCovering, - DoorLock, - BridgedDeviceBasicInformation, - ThermostatCluster, - Thermostat, - getClusterNameById, powerSource, bridgedNode, - AirQuality, - TotalVolatileOrganicCompoundsConcentrationMeasurement, - CarbonDioxideConcentrationMeasurement, - CarbonMonoxideConcentrationMeasurement, - FormaldehydeConcentrationMeasurement, - Pm1ConcentrationMeasurement, - Pm25ConcentrationMeasurement, - Pm10ConcentrationMeasurement, electricalSensor, - ElectricalEnergyMeasurement, - ElectricalPowerMeasurement, onOffLight, dimmableLight, colorTemperatureLight, onOffOutlet, - SwitchesTag, - NumberTag, - VendorId, coverDevice, thermostatDevice, MatterbridgeEndpoint, @@ -77,17 +46,48 @@ import { humiditySensor, pressureSensor, genericSwitch, - OnOffCluster, - LevelControlCluster, - WindowCoveringCluster, - DoorLockCluster, - Semtag, - AtLeastOne, } from 'matterbridge'; import { AnsiLogger, TimestampFormat, gn, dn, ign, idn, rs, db, debugStringify, hk, zb, or, nf, LogLevel, CYAN, er, YELLOW } from 'matterbridge/logger'; import { deepCopy, deepEqual, isValidNumber } from 'matterbridge/utils'; -import { Behavior, PowerSourceBehavior } from 'matterbridge/matter'; import * as color from 'matterbridge/utils'; +import { AtLeastOne, SwitchesTag, NumberTag } from 'matterbridge/matter'; +import { getClusterNameById, ClusterId, VendorId, Semtag } from 'matterbridge/matter/types'; +import { + ElectricalEnergyMeasurement, + ElectricalPowerMeasurement, + OnOffCluster, + LevelControlCluster, + WindowCoveringCluster, + DoorLockCluster, + BridgedDeviceBasicInformation, + OnOff, + LevelControl, + ColorControl, + ColorControlCluster, + TemperatureMeasurement, + BooleanState, + RelativeHumidityMeasurement, + PressureMeasurement, + OccupancySensing, + IlluminanceMeasurement, + PowerSource, + WindowCovering, + DoorLock, + ThermostatCluster, + Thermostat, + AirQuality, + TotalVolatileOrganicCompoundsConcentrationMeasurement, + CarbonDioxideConcentrationMeasurement, + CarbonMonoxideConcentrationMeasurement, + FormaldehydeConcentrationMeasurement, + Pm1ConcentrationMeasurement, + Pm25ConcentrationMeasurement, + Pm10ConcentrationMeasurement, +} from 'matterbridge/matter/clusters'; + +// @matter +import { Behavior } from 'matterbridge/matter'; +import { PowerSourceBehavior } from 'matterbridge/matter/behaviors'; import EventEmitter from 'events'; import { hostname } from 'os'; @@ -465,6 +465,7 @@ export class ZigbeeEntity extends EventEmitter { * errors that occur during the update. */ protected updateAttributeIfChanged(deviceEndpoint: MatterbridgeEndpoint, childEndpointName: string | undefined, clusterId: number, attributeName: string, value: PayloadValue, lookup?: string[]): void { + if (value === undefined) return; if (childEndpointName && childEndpointName !== '') { deviceEndpoint = this.bridgedDevice?.getChildEndpointByName(childEndpointName) ?? deviceEndpoint; } @@ -505,7 +506,7 @@ export class ZigbeeEntity extends EventEmitter { `attribute ${hk}${getClusterNameById(ClusterId(clusterId))}${db}.${hk}${attributeName}${db} from ${YELLOW}${typeof localValue === 'object' ? debugStringify(localValue) : localValue}${db} to ${YELLOW}${typeof value === 'object' ? debugStringify(value) : value}${db}`, ); try { - deviceEndpoint.setAttribute(ClusterId(clusterId), attributeName, value, undefined); + deviceEndpoint.setAttribute(ClusterId(clusterId), attributeName, value); } catch (error) { this.log.error(`Error setting attribute ${hk}${getClusterNameById(ClusterId(clusterId))}${er}.${hk}${attributeName}${er} to ${value}: ${error}`); } diff --git a/src/index.test.ts b/src/index.test.ts index 1eb03d2..2004e07 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -115,7 +115,7 @@ describe('initializePlugin', () => { it('should return an instance of TestPlatform', () => { const result = initializePlugin(mockMatterbridge, mockLog, mockConfig); - expect(result).toBeInstanceOf(ZigbeePlatform); + result.onShutdown(); }); }); diff --git a/src/platform.ts b/src/platform.ts index 4f3c1bb..48f20aa 100644 --- a/src/platform.ts +++ b/src/platform.ts @@ -21,10 +21,10 @@ * limitations under the License. * */ -import { BridgedDeviceBasicInformation, DoorLock, DoorLockCluster, Matterbridge, MatterbridgeDynamicPlatform, MatterbridgeEndpoint, PlatformConfig } from 'matterbridge'; +import { Matterbridge, MatterbridgeDynamicPlatform, MatterbridgeEndpoint, PlatformConfig } from 'matterbridge'; import { AnsiLogger, dn, gn, db, wr, zb, payloadStringify, rs, debugStringify, CYAN, er, nf } from 'matterbridge/logger'; import { isValidNumber, isValidString, waiter } from 'matterbridge/utils'; - +import { BridgedDeviceBasicInformation, DoorLock } from 'matterbridge/matter/clusters'; import path from 'path'; import { ZigbeeDevice, ZigbeeEntity, ZigbeeGroup /* , BridgedBaseDevice*/ } from './entity.js'; @@ -237,7 +237,7 @@ export class ZigbeePlatform extends MatterbridgeDynamicPlatform { // Coordinator or dedicated routers this.log.info(`*- ${zigbeeEntity.bridgedDevice?.deviceName} ${zigbeeEntity.bridgedDevice?.number} (${zigbeeEntity.bridgedDevice?.name})`); if (zigbeeEntity.device && status) { - zigbeeEntity.bridgedDevice?.setAttribute(DoorLockCluster.id, 'lockState', DoorLock.LockState.Unlocked, this.log); + zigbeeEntity.bridgedDevice?.setAttribute(DoorLock.Cluster.id, 'lockState', DoorLock.LockState.Unlocked, this.log); zigbeeEntity.bridgedDevice?.triggerEvent( DoorLock.Cluster.id, 'lockOperation', @@ -247,7 +247,7 @@ export class ZigbeePlatform extends MatterbridgeDynamicPlatform { this.log.info(`Device ${zigbeeEntity.entityName} unlocked`); } if (zigbeeEntity.device && !status) { - zigbeeEntity.bridgedDevice?.setAttribute(DoorLockCluster.id, 'lockState', DoorLock.LockState.Locked, this.log); + zigbeeEntity.bridgedDevice?.setAttribute(DoorLock.Cluster.id, 'lockState', DoorLock.LockState.Locked, this.log); zigbeeEntity.bridgedDevice?.triggerEvent( DoorLock.Cluster.id, 'lockOperation', @@ -389,19 +389,19 @@ export class ZigbeePlatform extends MatterbridgeDynamicPlatform { if (bridgedEntity.isRouter && bridgedEntity.bridgedDevice) { this.log.info(`Configuring router ${bridgedEntity.bridgedDevice?.deviceName}.`); if (this.z2mBridgeInfo?.permit_join) { - bridgedEntity.bridgedDevice?.setAttribute(DoorLockCluster.id, 'lockState', DoorLock.LockState.Unlocked, this.log); + bridgedEntity.bridgedDevice?.setAttribute(DoorLock.Cluster.id, 'lockState', DoorLock.LockState.Unlocked, this.log); if (bridgedEntity.bridgedDevice.number) bridgedEntity.bridgedDevice?.triggerEvent( - DoorLockCluster.id, + DoorLock.Cluster.id, 'lockOperation', { lockOperationType: DoorLock.LockOperationType.Unlock, operationSource: DoorLock.OperationSource.Manual, userIndex: null, fabricIndex: null, sourceNode: null }, this.log, ); } else { - bridgedEntity.bridgedDevice?.setAttribute(DoorLockCluster.id, 'lockState', DoorLock.LockState.Locked, this.log); + bridgedEntity.bridgedDevice?.setAttribute(DoorLock.Cluster.id, 'lockState', DoorLock.LockState.Locked, this.log); if (bridgedEntity.bridgedDevice.number) bridgedEntity.bridgedDevice?.triggerEvent( - DoorLockCluster.id, + DoorLock.Cluster.id, 'lockOperation', { lockOperationType: DoorLock.LockOperationType.Lock, operationSource: DoorLock.OperationSource.Manual, userIndex: null, fabricIndex: null, sourceNode: null }, this.log, From b315fa1f9f824b744c2bc89433d4966e810a402d Mon Sep 17 00:00:00 2001 From: Luligu Date: Thu, 30 Jan 2025 14:23:18 +0100 Subject: [PATCH 04/13] Dev 2.4.4-dev.2 --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e50895..14b1891 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "matterbridge-zigbee2mqtt", - "version": "2.4.4-dev.1", + "version": "2.4.4-dev.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "matterbridge-zigbee2mqtt", - "version": "2.4.4-dev.1", + "version": "2.4.4-dev.2", "license": "Apache-2.0", "dependencies": { "moment": "2.30.1", From 72741b6467fde4f8e8336d7e8f6106764a4c00c1 Mon Sep 17 00:00:00 2001 From: Luligu Date: Thu, 30 Jan 2025 14:25:15 +0100 Subject: [PATCH 05/13] Dev 2.4.4-dev.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7878adb..0222bd8 100644 --- a/package.json +++ b/package.json @@ -100,4 +100,4 @@ "typescript": "5.7.3", "typescript-eslint": "8.21.0" } -} \ No newline at end of file +} From b077f5f01ff6fd91ad8c4117d581935fcff3c8dc Mon Sep 17 00:00:00 2001 From: Luligu Date: Thu, 30 Jan 2025 20:14:54 +0100 Subject: [PATCH 06/13] Dev 2.4.4-dev.2 --- package-lock.json | 12 ++++++------ src/entity.ts | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 14b1891..00dbaab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2538,9 +2538,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.2.tgz", + "integrity": "sha512-7gdnIlr/WqvlQaX6yMvhHbiEVZ07qCV22rb/brgyFGKgo76ckIsrtDp4w2NIOitmKDNgiUm+pfVSE4VMwnkXwQ==", "dev": true, "license": "MIT" }, @@ -3206,9 +3206,9 @@ } }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, "license": "ISC", "dependencies": { diff --git a/src/entity.ts b/src/entity.ts index dfc37b7..3e35685 100644 --- a/src/entity.ts +++ b/src/entity.ts @@ -591,7 +591,7 @@ export class ZigbeeGroup extends ZigbeeEntity { } // Set the device entity select - zigbeeGroup.log.warn(`***Group ${zigbeeGroup.en}${group.friendly_name}${db} adds select device ${group.id} (${group.friendly_name})`); + // zigbeeGroup.log.warn(`***Group ${zigbeeGroup.en}${group.friendly_name}${db} adds select device ${group.id} (${group.friendly_name})`); if (!platform.selectDevice.get(`group-${group.id}`)) { platform.selectDevice.set(`group-${group.id}`, { serial: `group-${group.id}`, name: group.friendly_name, icon: 'wifi', entities: [] }); } From fa89dd4408ee2f12114b503b919cf7630aee9dcf Mon Sep 17 00:00:00 2001 From: Luligu Date: Thu, 30 Jan 2025 22:16:25 +0100 Subject: [PATCH 07/13] Automator: update package --- package.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 0222bd8..d840b31 100644 --- a/package.json +++ b/package.json @@ -61,11 +61,11 @@ "deepCleanBuild": "npm run deepClean && npm install && npm link matterbridge && npm run build", "checkDependencies": "npx npm-check-updates", "updateDependencies": "npx npm-check-updates -u && npm install && npm link matterbridge && npm run build", - "prepublishOnly": "npm run buildProduction && npm pkg delete devDependencies && npm pkg delete scripts && npm pkg delete types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap", - "npmPack": "copy package.json package.log && npm run buildProduction && npm pkg delete devDependencies && npm pkg delete scripts && npm pkg delete types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap && npm pack && copy package.log package.json && npm run deepCleanBuild", - "buildProduction": "npm run clean && tsc --project tsconfig.production.json", - "npmPublishTagDev": "copy package.json package.log && npm run buildProduction && npm pkg delete devDependencies && npm pkg delete scripts && npm pkg delete types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap && npm publish --tag dev && copy package.log package.json && npm run deepCleanBuild", - "npmPublishTagLatest": "copy package.json package.log && npm run buildProduction && npm pkg delete devDependencies && npm pkg delete scripts && npm pkg delete types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap && npm publish --tag latest && copy package.log package.json && npm run deepCleanBuild", + "prepublishOnly": "npm run buildProduction && npm pkg delete devDependencies scripts types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap", + "npmPack": "copy package.json package.log && npm run cleanBuildProduction && npm pkg delete devDependencies scripts types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap && npm pack && copy package.log package.json && npm run deepCleanBuild", + "buildProduction": "tsc --project tsconfig.production.json", + "npmPublishTagDev": "copy package.json package.log && npm run cleanBuildProduction && npm pkg delete devDependencies scripts types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap && npm publish --tag dev && copy package.log package.json && npm run deepCleanBuild", + "npmPublishTagLatest": "copy package.json package.log && npm run cleanBuildProduction && npm pkg delete devDependencies scripts types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap && npm publish --tag latest && copy package.log package.json && npm run deepCleanBuild", "matterbridge:add": "matterbridge -add .\\", "matterbridge:remove": "matterbridge -remove .\\", "matterbridge:enable": "matterbridge -enable .\\", @@ -77,7 +77,8 @@ "install:typescript": "npm install --save-dev typescript @types/node && npm run install && npm run build", "install:eslint": "npm install --save-dev eslint @eslint/js @types/eslint__js typescript typescript-eslint", "install:prettier": "npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier", - "install:jest": "npm install --save-dev jest ts-jest @types/jest eslint-plugin-jest" + "install:jest": "npm install --save-dev jest ts-jest @types/jest eslint-plugin-jest", + "cleanBuildProduction": "npm run clean && tsc --project tsconfig.production.json" }, "dependencies": { "moment": "2.30.1", From 1a9de6007ff40d33823d568766c373f199ba74ed Mon Sep 17 00:00:00 2001 From: Luligu Date: Fri, 31 Jan 2025 07:47:28 +0100 Subject: [PATCH 08/13] Automator: update package --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d840b31..62b11a7 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "deepCleanBuild": "npm run deepClean && npm install && npm link matterbridge && npm run build", "checkDependencies": "npx npm-check-updates", "updateDependencies": "npx npm-check-updates -u && npm install && npm link matterbridge && npm run build", - "prepublishOnly": "npm run buildProduction && npm pkg delete devDependencies scripts types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap", + "prepublishOnly": "npm run cleanBuildProduction && npm pkg delete devDependencies scripts types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap", "npmPack": "copy package.json package.log && npm run cleanBuildProduction && npm pkg delete devDependencies scripts types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap && npm pack && copy package.log package.json && npm run deepCleanBuild", "buildProduction": "tsc --project tsconfig.production.json", "npmPublishTagDev": "copy package.json package.log && npm run cleanBuildProduction && npm pkg delete devDependencies scripts types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap && npm publish --tag dev && copy package.log package.json && npm run deepCleanBuild", @@ -78,7 +78,7 @@ "install:eslint": "npm install --save-dev eslint @eslint/js @types/eslint__js typescript typescript-eslint", "install:prettier": "npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier", "install:jest": "npm install --save-dev jest ts-jest @types/jest eslint-plugin-jest", - "cleanBuildProduction": "npm run clean && tsc --project tsconfig.production.json" + "cleanBuildProduction": "npm run clean && npm run buildProduction" }, "dependencies": { "moment": "2.30.1", From 7866392442ff3a71ab3f461cd24d626e6341fe3c Mon Sep 17 00:00:00 2001 From: Luligu Date: Fri, 31 Jan 2025 08:47:15 +0100 Subject: [PATCH 09/13] Automator: update package --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 00dbaab..37e1f8d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2538,9 +2538,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.2.tgz", - "integrity": "sha512-7gdnIlr/WqvlQaX6yMvhHbiEVZ07qCV22rb/brgyFGKgo76ckIsrtDp4w2NIOitmKDNgiUm+pfVSE4VMwnkXwQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true, "license": "MIT" }, From a3f9f7a5f67d5bd2c1972c67ebd7c3778b8b7f72 Mon Sep 17 00:00:00 2001 From: Luligu Date: Fri, 31 Jan 2025 12:39:50 +0100 Subject: [PATCH 10/13] Automator: update package --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 62b11a7..c1bfe9b 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,css,md}\"", "format:check": "prettier --check \"**/*.{js,jsx,ts,tsx,json,css,md}\"", "clean": "npx rimraf tsconfig.tsbuildinfo ./dist", - "cleanBuild": "npm run clean && tsc", + "cleanBuild": "npm run clean && npm run build", "deepClean": "npx rimraf tsconfig.tsbuildinfo package-lock.json npm-shrinkwrap.json ./dist ./node_modules", "deepCleanBuild": "npm run deepClean && npm install && npm link matterbridge && npm run build", "checkDependencies": "npx npm-check-updates", From 00437a6f1f589dc5ff3a3a36a6aa170955ca1c6d Mon Sep 17 00:00:00 2001 From: Luligu Date: Fri, 31 Jan 2025 13:01:25 +0100 Subject: [PATCH 11/13] Automator: update package --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index c1bfe9b..77ba39a 100644 --- a/package.json +++ b/package.json @@ -62,10 +62,10 @@ "checkDependencies": "npx npm-check-updates", "updateDependencies": "npx npm-check-updates -u && npm install && npm link matterbridge && npm run build", "prepublishOnly": "npm run cleanBuildProduction && npm pkg delete devDependencies scripts types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap", - "npmPack": "copy package.json package.log && npm run cleanBuildProduction && npm pkg delete devDependencies scripts types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap && npm pack && copy package.log package.json && npm run deepCleanBuild", + "npmPack": "copy package.json package.log && npm run prepublishOnly && npm pack && copy package.log package.json && npm run deepCleanBuild", "buildProduction": "tsc --project tsconfig.production.json", - "npmPublishTagDev": "copy package.json package.log && npm run cleanBuildProduction && npm pkg delete devDependencies scripts types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap && npm publish --tag dev && copy package.log package.json && npm run deepCleanBuild", - "npmPublishTagLatest": "copy package.json package.log && npm run cleanBuildProduction && npm pkg delete devDependencies scripts types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap && npm publish --tag latest && copy package.log package.json && npm run deepCleanBuild", + "npmPublishTagDev": "copy package.json package.log && npm run prepublishOnly && npm publish --tag dev && copy package.log package.json && npm run deepCleanBuild", + "npmPublishTagLatest": "copy package.json package.log && npm run prepublishOnly && npm publish --tag latest && copy package.log package.json && npm run deepCleanBuild", "matterbridge:add": "matterbridge -add .\\", "matterbridge:remove": "matterbridge -remove .\\", "matterbridge:enable": "matterbridge -enable .\\", From e93135c2e009939e9798425edc47394494c9a3e8 Mon Sep 17 00:00:00 2001 From: Luligu Date: Sun, 2 Feb 2025 07:38:04 +0100 Subject: [PATCH 12/13] Release 2.4.4 --- CHANGELOG.md | 7 ++++--- package-lock.json | 24 ++++++++++++------------ package.json | 4 ++-- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a39e90..4ed35ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,12 @@ If you like this project and find it useful, please consider giving it a star on All notable changes to this project will be documented in this file. -## [2.4.4-dev.2] - 2025-02-01 +## [2.4.4] - 2025-02-02 -### Fixed +### Changed - [plugin]: Requires Matterbridge 2.1.0. +- [package]: Updated package. - [package]: Updated dependencies. @@ -17,7 +18,7 @@ All notable changes to this project will be documented in this file. ## [2.4.3] - 2025-01-20 -### Fixed +### Changed - [plugin]: Requires Matterbridge 1.7.3. - [package]: Updated dependencies. diff --git a/package-lock.json b/package-lock.json index 37e1f8d..99cbcf6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "matterbridge-zigbee2mqtt", - "version": "2.4.4-dev.2", + "version": "2.4.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "matterbridge-zigbee2mqtt", - "version": "2.4.4-dev.2", + "version": "2.4.4", "license": "Apache-2.0", "dependencies": { "moment": "2.30.1", @@ -622,13 +622,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", - "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.5", + "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -684,9 +684,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", - "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5655,9 +5655,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", - "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 77ba39a..57e7386 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matterbridge-zigbee2mqtt", - "version": "2.4.4-dev.2", + "version": "2.4.4", "description": "Matterbridge zigbee2mqtt plugin", "author": "https://github.com/Luligu", "license": "Apache-2.0", @@ -101,4 +101,4 @@ "typescript": "5.7.3", "typescript-eslint": "8.21.0" } -} +} \ No newline at end of file From 54449db2f360dcc8fb4b083eb58d3dd743931054 Mon Sep 17 00:00:00 2001 From: Luligu Date: Sun, 2 Feb 2025 07:40:43 +0100 Subject: [PATCH 13/13] Release 2.4.4 --- package-lock.json | 544 +++------------------------------------------- package.json | 12 +- 2 files changed, 36 insertions(+), 520 deletions(-) diff --git a/package-lock.json b/package-lock.json index 99cbcf6..8565b2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@eslint/js": "9.19.0", "@types/eslint__js": "8.42.3", "@types/jest": "29.5.14", - "@types/node": "22.10.10", + "@types/node": "22.13.0", "eslint": "9.19.0", "eslint-config-prettier": "10.0.1", "eslint-plugin-jest": "28.11.0", @@ -27,7 +27,7 @@ "prettier": "3.4.2", "ts-jest": "29.2.5", "typescript": "5.7.3", - "typescript-eslint": "8.21.0" + "typescript-eslint": "8.22.0" }, "engines": { "node": ">=18.0.0 <19.0.0 || >=20.0.0 <21.0.0 || >=22.0.0 <23.0.0" @@ -1442,9 +1442,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.10.tgz", - "integrity": "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==", + "version": "22.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.0.tgz", + "integrity": "sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==", "license": "MIT", "dependencies": { "undici-types": "~6.20.0" @@ -1494,17 +1494,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz", - "integrity": "sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==", + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.22.0.tgz", + "integrity": "sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/type-utils": "8.21.0", - "@typescript-eslint/utils": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", + "@typescript-eslint/scope-manager": "8.22.0", + "@typescript-eslint/type-utils": "8.22.0", + "@typescript-eslint/utils": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -1523,144 +1523,17 @@ "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", - "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", - "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", - "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", - "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/typescript-estree": "8.21.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", - "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.21.0.tgz", - "integrity": "sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==", + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.22.0.tgz", + "integrity": "sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/typescript-estree": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", + "@typescript-eslint/scope-manager": "8.22.0", + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/typescript-estree": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0", "debug": "^4.3.4" }, "engines": { @@ -1675,109 +1548,6 @@ "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", - "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", - "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", - "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", - "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.22.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz", @@ -1797,75 +1567,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz", - "integrity": "sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.21.0", - "@typescript-eslint/utils": "8.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", - "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", - "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", - "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.22.0.tgz", + "integrity": "sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", + "@typescript-eslint/typescript-estree": "8.22.0", + "@typescript-eslint/utils": "8.22.0", "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", "ts-api-utils": "^2.0.0" }, "engines": { @@ -1875,78 +1585,11 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", - "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/typescript-estree": "8.21.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", - "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/types": { "version": "8.22.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.22.0.tgz", @@ -5779,98 +5422,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.21.0.tgz", - "integrity": "sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.21.0", - "@typescript-eslint/parser": "8.21.0", - "@typescript-eslint/utils": "8.21.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", - "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", - "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", - "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", - "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.22.0.tgz", + "integrity": "sha512-Y2rj210FW1Wb6TWXzQc5+P+EWI9/zdS57hLEc0gnyuvdzWo8+Y8brKlbj0muejonhMI/xAZCnZZwjbIfv1CkOw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/typescript-estree": "8.21.0" + "@typescript-eslint/eslint-plugin": "8.22.0", + "@typescript-eslint/parser": "8.22.0", + "@typescript-eslint/utils": "8.22.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5884,50 +5444,6 @@ "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", - "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typescript-eslint/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", diff --git a/package.json b/package.json index 57e7386..aaa9767 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ }, "scripts": { "build": "tsc", + "buildProduction": "tsc --project tsconfig.production.json", "watch": "tsc --watch", "start": "matterbridge", "start:bridge": "matterbridge -bridge", @@ -57,13 +58,13 @@ "format:check": "prettier --check \"**/*.{js,jsx,ts,tsx,json,css,md}\"", "clean": "npx rimraf tsconfig.tsbuildinfo ./dist", "cleanBuild": "npm run clean && npm run build", + "cleanBuildProduction": "npm run clean && npm run buildProduction", "deepClean": "npx rimraf tsconfig.tsbuildinfo package-lock.json npm-shrinkwrap.json ./dist ./node_modules", "deepCleanBuild": "npm run deepClean && npm install && npm link matterbridge && npm run build", "checkDependencies": "npx npm-check-updates", - "updateDependencies": "npx npm-check-updates -u && npm install && npm link matterbridge && npm run build", + "updateDependencies": "npx npm-check-updates -u && npm run deepCleanBuild", "prepublishOnly": "npm run cleanBuildProduction && npm pkg delete devDependencies scripts types && npx rimraf ./node_modules && npm install --omit=dev && npm shrinkwrap", "npmPack": "copy package.json package.log && npm run prepublishOnly && npm pack && copy package.log package.json && npm run deepCleanBuild", - "buildProduction": "tsc --project tsconfig.production.json", "npmPublishTagDev": "copy package.json package.log && npm run prepublishOnly && npm publish --tag dev && copy package.log package.json && npm run deepCleanBuild", "npmPublishTagLatest": "copy package.json package.log && npm run prepublishOnly && npm publish --tag latest && copy package.log package.json && npm run deepCleanBuild", "matterbridge:add": "matterbridge -add .\\", @@ -77,8 +78,7 @@ "install:typescript": "npm install --save-dev typescript @types/node && npm run install && npm run build", "install:eslint": "npm install --save-dev eslint @eslint/js @types/eslint__js typescript typescript-eslint", "install:prettier": "npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier", - "install:jest": "npm install --save-dev jest ts-jest @types/jest eslint-plugin-jest", - "cleanBuildProduction": "npm run clean && npm run buildProduction" + "install:jest": "npm install --save-dev jest ts-jest @types/jest eslint-plugin-jest" }, "dependencies": { "moment": "2.30.1", @@ -90,7 +90,7 @@ "@eslint/js": "9.19.0", "@types/eslint__js": "8.42.3", "@types/jest": "29.5.14", - "@types/node": "22.10.10", + "@types/node": "22.13.0", "eslint": "9.19.0", "eslint-config-prettier": "10.0.1", "eslint-plugin-jest": "28.11.0", @@ -99,6 +99,6 @@ "prettier": "3.4.2", "ts-jest": "29.2.5", "typescript": "5.7.3", - "typescript-eslint": "8.21.0" + "typescript-eslint": "8.22.0" } } \ No newline at end of file