matterbridge-computherm 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +116 -0
- package/dist/module.js +89 -0
- package/dist/thermostat.js +93 -0
- package/matterbridge-computherm.config.json +7 -0
- package/matterbridge-computherm.schema.json +57 -0
- package/npm-shrinkwrap.json +547 -0
- package/package.json +52 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
|
|
2
|
+
Apache License
|
|
3
|
+
Version 2.0, January 2004
|
|
4
|
+
http://www.apache.org/licenses/
|
|
5
|
+
|
|
6
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
7
|
+
|
|
8
|
+
1. Definitions.
|
|
9
|
+
|
|
10
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
11
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
12
|
+
|
|
13
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
14
|
+
the copyright owner that is granting the License.
|
|
15
|
+
|
|
16
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
17
|
+
other entities that control, are controlled by, or are under common
|
|
18
|
+
control with that entity. For the purposes of this definition,
|
|
19
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
20
|
+
direction or management of such entity, whether by contract or
|
|
21
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
22
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
23
|
+
|
|
24
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
25
|
+
exercising permissions granted by this License.
|
|
26
|
+
|
|
27
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
28
|
+
including but not limited to software source code, documentation
|
|
29
|
+
source, and configuration files.
|
|
30
|
+
|
|
31
|
+
"Object" form shall mean any form resulting from mechanical
|
|
32
|
+
transformation or translation of a Source form, including but
|
|
33
|
+
not limited to compiled object code, generated documentation,
|
|
34
|
+
and conversions to other media types.
|
|
35
|
+
|
|
36
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
37
|
+
Object form, made available under the License, as indicated by a
|
|
38
|
+
copyright notice that is included in or attached to the work
|
|
39
|
+
(an example is provided in the Appendix below).
|
|
40
|
+
|
|
41
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
42
|
+
form, that is based on (or derived from) the Work and for which the
|
|
43
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
44
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
45
|
+
of this License, Derivative Works shall not include works that remain
|
|
46
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
47
|
+
the Work and Derivative Works thereof.
|
|
48
|
+
|
|
49
|
+
"Contribution" shall mean any work of authorship, including
|
|
50
|
+
the original version of the Work and any modifications or additions
|
|
51
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
52
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
53
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
54
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
55
|
+
means any form of electronic, verbal, or written communication sent
|
|
56
|
+
to the Licensor or its representatives, including but not limited to
|
|
57
|
+
communication on electronic mailing lists, source code control systems,
|
|
58
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
59
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
60
|
+
excluding communication that is conspicuously marked or otherwise
|
|
61
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
62
|
+
|
|
63
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
64
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
65
|
+
subsequently incorporated within the Work.
|
|
66
|
+
|
|
67
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
68
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
69
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
70
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
71
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
72
|
+
Work and such Derivative Works in Source or Object form.
|
|
73
|
+
|
|
74
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
75
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
76
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
77
|
+
(except as stated in this section) patent license to make, have made,
|
|
78
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
79
|
+
where such license applies only to those patent claims licensable
|
|
80
|
+
by such Contributor that are necessarily infringed by their
|
|
81
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
82
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
83
|
+
institute patent litigation against any entity (including a
|
|
84
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
85
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
86
|
+
or contributory patent infringement, then any patent licenses
|
|
87
|
+
granted to You under this License for that Work shall terminate
|
|
88
|
+
as of the date such litigation is filed.
|
|
89
|
+
|
|
90
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
91
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
92
|
+
modifications, and in Source or Object form, provided that You
|
|
93
|
+
meet the following conditions:
|
|
94
|
+
|
|
95
|
+
(a) You must give any other recipients of the Work or
|
|
96
|
+
Derivative Works a copy of this License; and
|
|
97
|
+
|
|
98
|
+
(b) You must cause any modified files to carry prominent notices
|
|
99
|
+
stating that You changed the files; and
|
|
100
|
+
|
|
101
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
102
|
+
that You distribute, all copyright, patent, trademark, and
|
|
103
|
+
attribution notices from the Source form of the Work,
|
|
104
|
+
excluding those notices that do not pertain to any part of
|
|
105
|
+
the Derivative Works; and
|
|
106
|
+
|
|
107
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
108
|
+
distribution, then any Derivative Works that You distribute must
|
|
109
|
+
include a readable copy of the attribution notices contained
|
|
110
|
+
within such NOTICE file, excluding those notices that do not
|
|
111
|
+
pertain to any part of the Derivative Works, in at least one
|
|
112
|
+
of the following places: within a NOTICE text file distributed
|
|
113
|
+
as part of the Derivative Works; within the Source form or
|
|
114
|
+
documentation, if provided along with the Derivative Works; or,
|
|
115
|
+
within a display generated by the Derivative Works, if and
|
|
116
|
+
wherever such third-party notices normally appear. The contents
|
|
117
|
+
of the NOTICE file are for informational purposes only and
|
|
118
|
+
do not modify the License. You may add Your own attribution
|
|
119
|
+
notices within Derivative Works that You distribute, alongside
|
|
120
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
121
|
+
that such additional attribution notices cannot be construed
|
|
122
|
+
as modifying the License.
|
|
123
|
+
|
|
124
|
+
You may add Your own copyright statement to Your modifications and
|
|
125
|
+
may provide additional or different license terms and conditions
|
|
126
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
127
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
128
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
129
|
+
the conditions stated in this License.
|
|
130
|
+
|
|
131
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
132
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
133
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
134
|
+
this License, without any additional terms or conditions.
|
|
135
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
136
|
+
the terms of any separate license agreement you may have executed
|
|
137
|
+
with Licensor regarding such Contributions.
|
|
138
|
+
|
|
139
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
140
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
141
|
+
except as required for reasonable and customary use in describing the
|
|
142
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
143
|
+
|
|
144
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
145
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
146
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
147
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
148
|
+
implied, including, without limitation, any warranties or conditions
|
|
149
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
150
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
151
|
+
appropriateness of using or redistributing the Work and assume any
|
|
152
|
+
risks associated with Your exercise of permissions under this License.
|
|
153
|
+
|
|
154
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
155
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
156
|
+
unless required by applicable law (such as deliberate and grossly
|
|
157
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
158
|
+
liable to You for damages, including any direct, indirect, special,
|
|
159
|
+
incidental, or consequential damages of any character arising as a
|
|
160
|
+
result of this License or out of the use or inability to use the
|
|
161
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
162
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
163
|
+
other commercial damages or losses), even if such Contributor
|
|
164
|
+
has been advised of the possibility of such damages.
|
|
165
|
+
|
|
166
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
167
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
168
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
169
|
+
or other liability obligations and/or rights consistent with this
|
|
170
|
+
License. However, in accepting such obligations, You may act only
|
|
171
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
172
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
173
|
+
defend, and hold each Contributor harmless for any liability
|
|
174
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
175
|
+
of your accepting any such warranty or additional liability.
|
|
176
|
+
|
|
177
|
+
END OF TERMS AND CONDITIONS
|
|
178
|
+
|
|
179
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
180
|
+
|
|
181
|
+
To apply the Apache License to your work, attach the following
|
|
182
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
183
|
+
replaced with your own identifying information. (Don't include
|
|
184
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
185
|
+
comment syntax for the file format. We also recommend that a
|
|
186
|
+
file or class name and description of purpose be included on the
|
|
187
|
+
same "printed page" as the copyright notice for easier
|
|
188
|
+
identification within third-party archives.
|
|
189
|
+
|
|
190
|
+
Copyright [yyyy] [name of copyright owner]
|
|
191
|
+
|
|
192
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
193
|
+
you may not use this file except in compliance with the License.
|
|
194
|
+
You may obtain a copy of the License at
|
|
195
|
+
|
|
196
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
197
|
+
|
|
198
|
+
Unless required by applicable law or agreed to in writing, software
|
|
199
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
200
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
201
|
+
See the License for the specific language governing permissions and
|
|
202
|
+
limitations under the License.
|
package/README.md
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
<!-- markdownlint-disable MD033 -->
|
|
2
|
+
|
|
3
|
+
# <img src="https://matterbridge.io/assets/matterbridge.svg" alt="Matterbridge Logo" width="64px" height="64px"> Matterbridge dynamic platform example plugin
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/matterbridge-example-dynamic-platform)
|
|
6
|
+
[](https://www.npmjs.com/package/matterbridge-example-dynamic-platform)
|
|
7
|
+
[](https://hub.docker.com/r/luligu/matterbridge)
|
|
8
|
+
[](https://hub.docker.com/r/luligu/matterbridge)
|
|
9
|
+

|
|
10
|
+

|
|
11
|
+
[](https://codecov.io/gh/Luligu/matterbridge-example-dynamic-platform)
|
|
12
|
+
[](https://github.com/prettier/prettier)
|
|
13
|
+
[](https://github.com/eslint/eslint)
|
|
14
|
+
[](https://www.typescriptlang.org/)
|
|
15
|
+
[](https://nodejs.org/api/esm.html)
|
|
16
|
+
[](https://matterbridge.io)
|
|
17
|
+
|
|
18
|
+
[](https://www.npmjs.com/package/matterbridge)
|
|
19
|
+
[](https://www.npmjs.com/package/matter-history)
|
|
20
|
+
[](https://www.npmjs.com/package/node-ansi-logger)
|
|
21
|
+
[](https://www.npmjs.com/package/node-persist-manager)
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
Matterbridge dynamic platform example plugin is a template to develop your own plugin using the dynamic platform.
|
|
26
|
+
|
|
27
|
+
It exposes 70 virtual devices:
|
|
28
|
+
|
|
29
|
+
- a door contact sensor
|
|
30
|
+
- a motion sensor
|
|
31
|
+
- an illuminance sensor
|
|
32
|
+
- a temperature sensor
|
|
33
|
+
- a humidity sensor
|
|
34
|
+
- a pressure sensor
|
|
35
|
+
- a flow sensor
|
|
36
|
+
- a climate sensor with temperature, humidity and pressure
|
|
37
|
+
- a mode select device
|
|
38
|
+
- a switch with onOff cluster
|
|
39
|
+
- a light with onOff
|
|
40
|
+
- a light with onOff and levelControl (dimmer)
|
|
41
|
+
- a light with onOff, levelControl and colorControl (with XY, HS and CT) clusters
|
|
42
|
+
- a light with onOff, levelControl and colorControl (with HS and CT) clusters
|
|
43
|
+
- a light with onOff, levelControl and colorControl (with XY and CT) clusters
|
|
44
|
+
- a light with onOff, levelControl and colorControl (with CT only) clusters
|
|
45
|
+
- an outlet (plug) with onOff cluster
|
|
46
|
+
- an outlet (plug) with onOff cluster, energy measurements and power measurements
|
|
47
|
+
- an outlet (plug) with onOff cluster, apparent energy measurements and power measurements
|
|
48
|
+
- a smart outlet with an energy meter and four individually controllable sockets (with tagList 1, 2, 3 and 4)
|
|
49
|
+
- a bridged outlet with four individually controllable plugs that expose their names
|
|
50
|
+
- a cover with windowCovering cluster and lift feature
|
|
51
|
+
- a cover with windowCovering cluster and both lift and tilt features
|
|
52
|
+
- a lock with doorLock cluster
|
|
53
|
+
- a thermostat auto mode (i.e. with Auto Heat and Cool features) with thermostat cluster and 3 sub endpoints with flowMeasurement cluster, temperatureMeasurement cluster
|
|
54
|
+
and relativeHumidityMeasurement cluster (to show how to create a composed device with sub endpoints)
|
|
55
|
+
- a thermostat with auto mode (i.e. with Auto Heat and Cool features), occupancy and outdoorTemperature
|
|
56
|
+
- a thermostat auto mode with presets (Home, Away, Sleep, Wake, Vacation and GoingToSleep modes) including 3 sub endpoints with flow, temperature and humidity sensors
|
|
57
|
+
- a thermostat heat only with two external temperature sensors (tagged like Indoor and Outdoor)
|
|
58
|
+
- a thermostat cool only
|
|
59
|
+
- a fan with Off High presets
|
|
60
|
+
- a fan with Off Low Med High presets
|
|
61
|
+
- a fan with Off Low Med High Auto presets and step
|
|
62
|
+
- a fan with all the features MultiSpeed, Auto, Step, Rock, Wind and AirflowDirection and mode Off Low Med High Auto.
|
|
63
|
+
- a rain sensor device
|
|
64
|
+
- a water freeze detector device
|
|
65
|
+
- a water leak detector device
|
|
66
|
+
- a smokeCoAlarm (with smoke and co features) sensor (supported by Apple Home)
|
|
67
|
+
- a smokeCoAlarm (with smoke only feature) sensor (supported by Apple Home)
|
|
68
|
+
- a smokeCoAlarm (with co only feature) sensor (supported by Apple Home)
|
|
69
|
+
- an airConditioner device
|
|
70
|
+
- an airPurifier device with temperature and humidity sensor (supported by Apple Home)
|
|
71
|
+
- a pump device
|
|
72
|
+
- a waterValve device
|
|
73
|
+
- an airQuality device with all concentration measurements clusters (supported by Apple Home with the concentration measurements from version 18.5)
|
|
74
|
+
- a momentary switch composed by three switches with Single Double Long (tagged with One Two Three and Top Middle Bottom) and three switches with Single only.
|
|
75
|
+
- a latching switch
|
|
76
|
+
- a Robot Vacuum Cleaner device (supported by SmartThings, Alexa, Home Assistant and partially by Apple Home). Read also <https://github.com/Luligu/matterbridge/discussions/264>.
|
|
77
|
+
- an onOff Mounted Switch device (supported by SmartThings, Alexa, Home Assistant)
|
|
78
|
+
- a onOff Mounted Switch legacy device (supported by all controllers)
|
|
79
|
+
- a dimmer Mounted Switch device (supported by SmartThings, Alexa, Home Assistant)
|
|
80
|
+
- a dimmer Mounted Switch legacy device (supported by all controllers)
|
|
81
|
+
- a laundry Washer device (supported by SmartThings, Alexa and Home Assistant)
|
|
82
|
+
- a laundry Dryer device (supported by SmartThings, Alexa and Home Assistant)
|
|
83
|
+
- a dishwasher device (supported by SmartThings, Alexa and Home Assistant)
|
|
84
|
+
- a refrigerator device (supported by SmartThings, Alexa and Home Assistant)
|
|
85
|
+
- an oven device (supported by SmartThings, Alexa and Home Assistant)
|
|
86
|
+
- a microwave Oven device (supported by SmartThings, Alexa and Home Assistant)
|
|
87
|
+
- an extractor Hood device (supported by SmartThings, Alexa and Home Assistant)
|
|
88
|
+
- a cooktop device (supported by SmartThings, Alexa and Home Assistant)
|
|
89
|
+
- a water heater device (supported by SmartThings and Home Assistant)
|
|
90
|
+
- a car charger device (supported by Home Assistant)
|
|
91
|
+
- a solar power device
|
|
92
|
+
- a battery storage device
|
|
93
|
+
- a heat pump device
|
|
94
|
+
- a basic video player (supported by SmartThings)
|
|
95
|
+
- a speaker device (supported by SmartThings)
|
|
96
|
+
- a soil sensor (Matter 1.5.0)
|
|
97
|
+
- an irrigation system (Matter 1.5.0)
|
|
98
|
+
- an irrigation system with four zones (Matter 1.5.0)
|
|
99
|
+
|
|
100
|
+
All these devices continuously change their state and position. The plugin also shows how to use all the command handlers (so you can control all the devices), how to subscribe to attributes, and how to trigger events.
|
|
101
|
+
|
|
102
|
+
If you want to write your own plugin, the easiest way to get started is to clone the [Matterbridge Plugin Template](https://github.com/Luligu/matterbridge-plugin-template). It has **Dev Container support for an instant development environment**, with all tools and extensions (like Node.js, npm, TypeScript, ESLint, Prettier, Jest, and Vitest) already loaded and configured.
|
|
103
|
+
|
|
104
|
+
If you like this project and find it useful, please consider giving it a star on [GitHub](https://github.com/Luligu/matterbridge-example-dynamic-platform) and sponsoring it.
|
|
105
|
+
|
|
106
|
+
<a href="https://www.buymeacoffee.com/luligugithub"><img src="https://matterbridge.io/assets/bmc-button.svg" alt="Buy me a coffee" width="120"></a>
|
|
107
|
+
|
|
108
|
+
## Prerequisites
|
|
109
|
+
|
|
110
|
+
### Matterbridge
|
|
111
|
+
|
|
112
|
+
See the guidelines on [Matterbridge](https://github.com/Luligu/matterbridge/blob/main/README.md) for more information.
|
|
113
|
+
|
|
114
|
+
## Style guide
|
|
115
|
+
|
|
116
|
+
See also the [Style Guide](./STYLEGUIDE.md) for JSDoc, naming, and logging conventions used in this repository.
|
package/dist/module.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { bridgedNode, MatterbridgeDynamicPlatform } from 'matterbridge';
|
|
2
|
+
import { UINT16_MAX, UINT32_MAX } from 'matterbridge/matter';
|
|
3
|
+
import { BridgedDeviceBasicInformation, Descriptor } from 'matterbridge/matter/clusters';
|
|
4
|
+
import { isValidNumber, isValidString } from 'matterbridge/utils';
|
|
5
|
+
import * as broadlink from 'node-broadlink';
|
|
6
|
+
import { ComputhermThermostat } from './thermostat.js';
|
|
7
|
+
export default function initializePlugin(matterbridge, log, config) {
|
|
8
|
+
return new ComputhermMatterbridgePlatform(matterbridge, log, config);
|
|
9
|
+
}
|
|
10
|
+
export class ComputhermMatterbridgePlatform extends MatterbridgeDynamicPlatform {
|
|
11
|
+
config;
|
|
12
|
+
devices = [];
|
|
13
|
+
constructor(matterbridge, log, config) {
|
|
14
|
+
super(matterbridge, log, config);
|
|
15
|
+
this.config = config;
|
|
16
|
+
if (this.verifyMatterbridgeVersion === undefined || typeof this.verifyMatterbridgeVersion !== 'function' || !this.verifyMatterbridgeVersion('3.7.2')) {
|
|
17
|
+
throw new Error(`This plugin requires Matterbridge version >= "3.7.2". Please update Matterbridge from ${this.matterbridge.matterbridgeVersion} to the latest version in the frontend.`);
|
|
18
|
+
}
|
|
19
|
+
this.log.info('Initializing platform:', this.config.name);
|
|
20
|
+
}
|
|
21
|
+
async onStart(reason) {
|
|
22
|
+
this.log.info('onStart called with reason:', reason ?? 'none');
|
|
23
|
+
await this.ready;
|
|
24
|
+
await this.clearSelect();
|
|
25
|
+
const discoveredDevices = await broadlink.discover();
|
|
26
|
+
for (const device of discoveredDevices) {
|
|
27
|
+
this.log.info(`Found device ${device.manufacturer} ${device.model} on IP ${device.host.address}`);
|
|
28
|
+
const hysenDevice = device;
|
|
29
|
+
const thermostat = new ComputhermThermostat(this, hysenDevice);
|
|
30
|
+
await thermostat.create();
|
|
31
|
+
if (thermostat.Endpoint)
|
|
32
|
+
this.devices.push(thermostat);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async onConfigure() {
|
|
36
|
+
await super.onConfigure();
|
|
37
|
+
this.log.info('onConfigure called');
|
|
38
|
+
for (const device of this.devices) {
|
|
39
|
+
await device.startUpdates();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async onShutdown(reason) {
|
|
43
|
+
await super.onShutdown(reason);
|
|
44
|
+
this.log.info('onShutdown called with reason:', reason ?? 'none');
|
|
45
|
+
if (this.config.unregisterOnShutdown === true)
|
|
46
|
+
await this.unregisterAllDevices(500);
|
|
47
|
+
for (const device of this.devices) {
|
|
48
|
+
await device.stopUpdates();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async addDevice(device) {
|
|
52
|
+
if (!device.serialNumber || !device.deviceName)
|
|
53
|
+
return;
|
|
54
|
+
this.setSelectDevice(device.serialNumber, device.deviceName, undefined, 'hub');
|
|
55
|
+
if (this.validateDevice(device.serialNumber)) {
|
|
56
|
+
device.softwareVersion = parseInt(this.version.replace(/\D/g, ''));
|
|
57
|
+
device.softwareVersionString = this.version === '' ? 'Unknown' : this.version;
|
|
58
|
+
device.hardwareVersion = parseInt(this.matterbridge.matterbridgeVersion.replace(/\D/g, ''));
|
|
59
|
+
device.hardwareVersionString = this.matterbridge.matterbridgeVersion;
|
|
60
|
+
device.softwareVersion = isValidNumber(device.softwareVersion, 0, UINT32_MAX) ? device.softwareVersion : undefined;
|
|
61
|
+
device.softwareVersionString = isValidString(device.softwareVersionString) ? device.softwareVersionString.slice(0, 64) : undefined;
|
|
62
|
+
device.hardwareVersion = isValidNumber(device.hardwareVersion, 0, UINT16_MAX) ? device.hardwareVersion : undefined;
|
|
63
|
+
device.hardwareVersionString = isValidString(device.hardwareVersionString) ? device.hardwareVersionString.slice(0, 64) : undefined;
|
|
64
|
+
const options = device.getClusterServerOptions(BridgedDeviceBasicInformation.Cluster.id);
|
|
65
|
+
if (options) {
|
|
66
|
+
options.softwareVersion = device.softwareVersion || 1;
|
|
67
|
+
options.softwareVersionString = device.softwareVersionString || '1.0.0';
|
|
68
|
+
options.hardwareVersion = device.hardwareVersion || 1;
|
|
69
|
+
options.hardwareVersionString = device.hardwareVersionString || '1.0.0';
|
|
70
|
+
}
|
|
71
|
+
if (device.mode === undefined && !device.deviceTypes.has(bridgedNode.code)) {
|
|
72
|
+
device.deviceTypes.set(bridgedNode.code, bridgedNode);
|
|
73
|
+
const options = device.getClusterServerOptions(Descriptor.Cluster.id);
|
|
74
|
+
if (options) {
|
|
75
|
+
const deviceTypeList = options.deviceTypeList;
|
|
76
|
+
if (!deviceTypeList.find((dt) => dt.deviceType === bridgedNode.code)) {
|
|
77
|
+
deviceTypeList.push({ deviceType: bridgedNode.code, revision: bridgedNode.revision });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
device.createDefaultBridgedDeviceBasicInformationClusterServer(device.deviceName, device.serialNumber, device.vendorId, device.vendorName, device.productName, device.softwareVersion, device.softwareVersionString, device.hardwareVersion, device.hardwareVersionString);
|
|
81
|
+
}
|
|
82
|
+
await this.registerDevice(device);
|
|
83
|
+
return device;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { bridgedNode, MatterbridgeEndpoint, powerSource, thermostatDevice } from 'matterbridge';
|
|
2
|
+
import { PowerSource, Thermostat } from 'matterbridge/matter/clusters';
|
|
3
|
+
class ComputhermThermostat {
|
|
4
|
+
platform;
|
|
5
|
+
hysenDevice;
|
|
6
|
+
Endpoint;
|
|
7
|
+
updateTimer;
|
|
8
|
+
macaddress;
|
|
9
|
+
macStringHuman;
|
|
10
|
+
macLastThree;
|
|
11
|
+
name;
|
|
12
|
+
constructor(platform, hysenDevice) {
|
|
13
|
+
this.platform = platform;
|
|
14
|
+
this.hysenDevice = hysenDevice;
|
|
15
|
+
this.macaddress = Buffer.from(this.hysenDevice.mac).toString('hex').toLowerCase();
|
|
16
|
+
this.macStringHuman =
|
|
17
|
+
this.macaddress
|
|
18
|
+
.match(/.{1,2}/g)
|
|
19
|
+
?.join(':')
|
|
20
|
+
.toUpperCase() ?? this.macaddress;
|
|
21
|
+
this.macLastThree = this.macaddress.slice(-6);
|
|
22
|
+
this.name = `Computherm ${this.hysenDevice.model} ${this.macLastThree}`;
|
|
23
|
+
}
|
|
24
|
+
async create() {
|
|
25
|
+
await this.hysenDevice.auth();
|
|
26
|
+
const status = await this.hysenDevice.getFullStatus();
|
|
27
|
+
this.Endpoint?.log.info('Hysen device status:', status);
|
|
28
|
+
const localTemperature = status.roomTemp;
|
|
29
|
+
const setPoint = status.thermostatTemp;
|
|
30
|
+
this.Endpoint = new MatterbridgeEndpoint([thermostatDevice, bridgedNode, powerSource], { id: `ct_${this.macaddress}` }, this.platform.config.debug)
|
|
31
|
+
.createDefaultIdentifyClusterServer()
|
|
32
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer(this.name, this.macStringHuman, 0xfff1, this.hysenDevice.manufacturer, this.hysenDevice.model)
|
|
33
|
+
.createDefaultHeatingThermostatClusterServer(localTemperature, setPoint, 5, 35)
|
|
34
|
+
.createDefaultPowerSourceWiredClusterServer(PowerSource.WiredCurrentType.Dc)
|
|
35
|
+
.addRequiredClusterServers();
|
|
36
|
+
this.Endpoint = await this.platform.addDevice(this.Endpoint);
|
|
37
|
+
this.Endpoint?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
|
|
38
|
+
this.Endpoint?.log.info(`Command identify called identifyTime ${identifyTime}`);
|
|
39
|
+
});
|
|
40
|
+
this.Endpoint?.addCommandHandler('triggerEffect', async ({ request: { effectIdentifier, effectVariant } }) => {
|
|
41
|
+
this.Endpoint?.log.info(`Command identify called effectIdentifier ${effectIdentifier} effectVariant ${effectVariant}`);
|
|
42
|
+
});
|
|
43
|
+
await this.Endpoint?.subscribeAttribute(Thermostat.Cluster.with(Thermostat.Feature.Heating), 'systemMode', async (value) => {
|
|
44
|
+
await this.handleSystemModeChange(value);
|
|
45
|
+
}, this.Endpoint.log);
|
|
46
|
+
await this.Endpoint?.subscribeAttribute(Thermostat.Cluster.with(Thermostat.Feature.Heating), 'occupiedHeatingSetpoint', async (value) => {
|
|
47
|
+
await this.handleOccupiedHeatingSetpointChange(value);
|
|
48
|
+
}, this.Endpoint.log);
|
|
49
|
+
}
|
|
50
|
+
async handleSystemModeChange(value) {
|
|
51
|
+
const lookupSystemMode = ['Off', 'Auto', '', 'Cool', 'Heat', 'EmergencyHeat', 'Precooling', 'FanOnly', 'Dry', 'Sleep'];
|
|
52
|
+
this.Endpoint?.log.info('Subscribe systemMode called with:', lookupSystemMode[value]);
|
|
53
|
+
this.Endpoint?.log.info('Setting power to:', value === Thermostat.SystemMode.Heat ? 'Heat' : 'Off');
|
|
54
|
+
this.hysenDevice.setPower(value === Thermostat.SystemMode.Heat ? 1 : 0);
|
|
55
|
+
}
|
|
56
|
+
async handleOccupiedHeatingSetpointChange(value) {
|
|
57
|
+
this.Endpoint?.log.info('Subscribe occupiedHeatingSetpoint called with:', value / 100);
|
|
58
|
+
this.Endpoint?.log.info('Setting setpoint to:', value / 100);
|
|
59
|
+
await this.hysenDevice.setTemp(value / 100);
|
|
60
|
+
}
|
|
61
|
+
async updateStatus() {
|
|
62
|
+
const status = await this.hysenDevice.getFullStatus();
|
|
63
|
+
const mode = status.power === 1 ? Thermostat.SystemMode.Heat : Thermostat.SystemMode.Off;
|
|
64
|
+
this.Endpoint?.log.debug(`Updating thermostat status mode: ${mode}, occupiedHeatingSetpoint: ${status.thermostatTemp}`);
|
|
65
|
+
await this.Endpoint?.updateAttribute(Thermostat.Cluster.id, 'systemMode', mode);
|
|
66
|
+
await this.Endpoint?.updateAttribute(Thermostat.Cluster.id, 'occupiedHeatingSetpoint', status.thermostatTemp * 100);
|
|
67
|
+
}
|
|
68
|
+
async startUpdates(intervalMs = this.platform.config.pollInterval * 1000) {
|
|
69
|
+
await this.stopUpdates();
|
|
70
|
+
await this.updateStatus();
|
|
71
|
+
const scheduleNext = () => {
|
|
72
|
+
this.updateTimer = setTimeout(async () => {
|
|
73
|
+
try {
|
|
74
|
+
await this.updateStatus();
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
this.Endpoint?.log.error('Error updating thermostat status:', error);
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
scheduleNext();
|
|
81
|
+
}
|
|
82
|
+
}, intervalMs);
|
|
83
|
+
};
|
|
84
|
+
scheduleNext();
|
|
85
|
+
}
|
|
86
|
+
async stopUpdates() {
|
|
87
|
+
if (this.updateTimer) {
|
|
88
|
+
clearTimeout(this.updateTimer);
|
|
89
|
+
this.updateTimer = undefined;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export { ComputhermThermostat };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Matterbridge Computherm plugin",
|
|
3
|
+
"description": "matterbridge-computherm matterbridge plugin",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"required": [],
|
|
6
|
+
"properties": {
|
|
7
|
+
"name": {
|
|
8
|
+
"description": "Plugin Name",
|
|
9
|
+
"type": "string",
|
|
10
|
+
"readOnly": true,
|
|
11
|
+
"ui:widget": "hidden"
|
|
12
|
+
},
|
|
13
|
+
"type": {
|
|
14
|
+
"description": "Plugin Type",
|
|
15
|
+
"type": "string",
|
|
16
|
+
"readOnly": true,
|
|
17
|
+
"ui:widget": "hidden"
|
|
18
|
+
},
|
|
19
|
+
"whiteList": {
|
|
20
|
+
"title": "White List",
|
|
21
|
+
"description": "Only the devices in the list will be exposed. If the list is empty, all the devices will be exposed.",
|
|
22
|
+
"type": "array",
|
|
23
|
+
"items": {
|
|
24
|
+
"type": "string"
|
|
25
|
+
},
|
|
26
|
+
"uniqueItems": true,
|
|
27
|
+
"selectFrom": "serial"
|
|
28
|
+
},
|
|
29
|
+
"blackList": {
|
|
30
|
+
"title": "Black List",
|
|
31
|
+
"description": "The devices in the list will not be exposed. If the list is empty, no devices will be excluded.",
|
|
32
|
+
"type": "array",
|
|
33
|
+
"items": {
|
|
34
|
+
"type": "string"
|
|
35
|
+
},
|
|
36
|
+
"uniqueItems": true,
|
|
37
|
+
"selectFrom": "serial"
|
|
38
|
+
},
|
|
39
|
+
"pollInterval": {
|
|
40
|
+
"description": "Poll interval in seconds",
|
|
41
|
+
"type": "number",
|
|
42
|
+
"default": 60
|
|
43
|
+
},
|
|
44
|
+
"debug": {
|
|
45
|
+
"title": "Enable Debug",
|
|
46
|
+
"description": "Enable the debug for the plugin (development only)",
|
|
47
|
+
"type": "boolean",
|
|
48
|
+
"default": false
|
|
49
|
+
},
|
|
50
|
+
"unregisterOnShutdown": {
|
|
51
|
+
"title": "Unregister On Shutdown",
|
|
52
|
+
"description": "Unregister all devices on shutdown (development only)",
|
|
53
|
+
"type": "boolean",
|
|
54
|
+
"default": false
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "matterbridge-computherm",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"lockfileVersion": 3,
|
|
5
|
+
"requires": true,
|
|
6
|
+
"packages": {
|
|
7
|
+
"": {
|
|
8
|
+
"name": "matterbridge-computherm",
|
|
9
|
+
"version": "0.0.1",
|
|
10
|
+
"license": "Apache-2.0",
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"node-ansi-logger": "3.2.0",
|
|
13
|
+
"node-broadlink": "2.4.1",
|
|
14
|
+
"node-persist-manager": "2.0.1"
|
|
15
|
+
},
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=20.19.0 <21.0.0 || >=22.13.0 <23.0.0 || >=24.0.0 <25.0.0"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"node_modules/@aksel/structjs": {
|
|
21
|
+
"version": "1.0.0",
|
|
22
|
+
"resolved": "https://registry.npmjs.org/@aksel/structjs/-/structjs-1.0.0.tgz",
|
|
23
|
+
"integrity": "sha512-7BuOlCj7bS09Gr/uJFrKJVWaZqTSOoK2eUuqUebAZq5cALZP6eNz5K5cbprYNX6KBFGMnR+CeSmZk/DjVo3ecg==",
|
|
24
|
+
"license": "ISC",
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"npm-name": "^5.0.1"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"node_modules/@sindresorhus/is": {
|
|
30
|
+
"version": "0.14.0",
|
|
31
|
+
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
|
|
32
|
+
"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=6"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"node_modules/@szmarczak/http-timer": {
|
|
39
|
+
"version": "1.1.2",
|
|
40
|
+
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
|
|
41
|
+
"integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"defer-to-connect": "^1.0.1"
|
|
45
|
+
},
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=6"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"node_modules/builtins": {
|
|
51
|
+
"version": "1.0.3",
|
|
52
|
+
"resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
|
|
53
|
+
"integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==",
|
|
54
|
+
"license": "MIT"
|
|
55
|
+
},
|
|
56
|
+
"node_modules/cacheable-request": {
|
|
57
|
+
"version": "6.1.0",
|
|
58
|
+
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
|
|
59
|
+
"integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
|
|
60
|
+
"license": "MIT",
|
|
61
|
+
"dependencies": {
|
|
62
|
+
"clone-response": "^1.0.2",
|
|
63
|
+
"get-stream": "^5.1.0",
|
|
64
|
+
"http-cache-semantics": "^4.0.0",
|
|
65
|
+
"keyv": "^3.0.0",
|
|
66
|
+
"lowercase-keys": "^2.0.0",
|
|
67
|
+
"normalize-url": "^4.1.0",
|
|
68
|
+
"responselike": "^1.0.2"
|
|
69
|
+
},
|
|
70
|
+
"engines": {
|
|
71
|
+
"node": ">=8"
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
"node_modules/cacheable-request/node_modules/get-stream": {
|
|
75
|
+
"version": "5.2.0",
|
|
76
|
+
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
|
|
77
|
+
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
|
|
78
|
+
"license": "MIT",
|
|
79
|
+
"dependencies": {
|
|
80
|
+
"pump": "^3.0.0"
|
|
81
|
+
},
|
|
82
|
+
"engines": {
|
|
83
|
+
"node": ">=8"
|
|
84
|
+
},
|
|
85
|
+
"funding": {
|
|
86
|
+
"url": "https://github.com/sponsors/sindresorhus"
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"node_modules/cacheable-request/node_modules/lowercase-keys": {
|
|
90
|
+
"version": "2.0.0",
|
|
91
|
+
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
|
|
92
|
+
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
|
|
93
|
+
"license": "MIT",
|
|
94
|
+
"engines": {
|
|
95
|
+
"node": ">=8"
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"node_modules/clone-response": {
|
|
99
|
+
"version": "1.0.3",
|
|
100
|
+
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
|
|
101
|
+
"integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
|
|
102
|
+
"license": "MIT",
|
|
103
|
+
"dependencies": {
|
|
104
|
+
"mimic-response": "^1.0.0"
|
|
105
|
+
},
|
|
106
|
+
"funding": {
|
|
107
|
+
"url": "https://github.com/sponsors/sindresorhus"
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
"node_modules/decompress-response": {
|
|
111
|
+
"version": "3.3.0",
|
|
112
|
+
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
|
|
113
|
+
"integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==",
|
|
114
|
+
"license": "MIT",
|
|
115
|
+
"dependencies": {
|
|
116
|
+
"mimic-response": "^1.0.0"
|
|
117
|
+
},
|
|
118
|
+
"engines": {
|
|
119
|
+
"node": ">=4"
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
"node_modules/deep-extend": {
|
|
123
|
+
"version": "0.6.0",
|
|
124
|
+
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
|
|
125
|
+
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
|
|
126
|
+
"license": "MIT",
|
|
127
|
+
"engines": {
|
|
128
|
+
"node": ">=4.0.0"
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
"node_modules/defer-to-connect": {
|
|
132
|
+
"version": "1.1.3",
|
|
133
|
+
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
|
|
134
|
+
"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
|
|
135
|
+
"license": "MIT"
|
|
136
|
+
},
|
|
137
|
+
"node_modules/duplexer3": {
|
|
138
|
+
"version": "0.1.5",
|
|
139
|
+
"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz",
|
|
140
|
+
"integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==",
|
|
141
|
+
"license": "BSD-3-Clause"
|
|
142
|
+
},
|
|
143
|
+
"node_modules/end-of-stream": {
|
|
144
|
+
"version": "1.4.5",
|
|
145
|
+
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
|
|
146
|
+
"integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
|
|
147
|
+
"license": "MIT",
|
|
148
|
+
"dependencies": {
|
|
149
|
+
"once": "^1.4.0"
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
"node_modules/get-stream": {
|
|
153
|
+
"version": "4.1.0",
|
|
154
|
+
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
|
|
155
|
+
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
|
|
156
|
+
"license": "MIT",
|
|
157
|
+
"dependencies": {
|
|
158
|
+
"pump": "^3.0.0"
|
|
159
|
+
},
|
|
160
|
+
"engines": {
|
|
161
|
+
"node": ">=6"
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
"node_modules/got": {
|
|
165
|
+
"version": "9.6.0",
|
|
166
|
+
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
|
|
167
|
+
"integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
|
|
168
|
+
"license": "MIT",
|
|
169
|
+
"dependencies": {
|
|
170
|
+
"@sindresorhus/is": "^0.14.0",
|
|
171
|
+
"@szmarczak/http-timer": "^1.1.2",
|
|
172
|
+
"cacheable-request": "^6.0.0",
|
|
173
|
+
"decompress-response": "^3.3.0",
|
|
174
|
+
"duplexer3": "^0.1.4",
|
|
175
|
+
"get-stream": "^4.1.0",
|
|
176
|
+
"lowercase-keys": "^1.0.1",
|
|
177
|
+
"mimic-response": "^1.0.1",
|
|
178
|
+
"p-cancelable": "^1.0.0",
|
|
179
|
+
"to-readable-stream": "^1.0.0",
|
|
180
|
+
"url-parse-lax": "^3.0.0"
|
|
181
|
+
},
|
|
182
|
+
"engines": {
|
|
183
|
+
"node": ">=8.6"
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
"node_modules/http-cache-semantics": {
|
|
187
|
+
"version": "4.2.0",
|
|
188
|
+
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
|
|
189
|
+
"integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
|
|
190
|
+
"license": "BSD-2-Clause"
|
|
191
|
+
},
|
|
192
|
+
"node_modules/ini": {
|
|
193
|
+
"version": "1.3.8",
|
|
194
|
+
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
|
|
195
|
+
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
|
|
196
|
+
"license": "ISC"
|
|
197
|
+
},
|
|
198
|
+
"node_modules/ip-regex": {
|
|
199
|
+
"version": "4.3.0",
|
|
200
|
+
"resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz",
|
|
201
|
+
"integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==",
|
|
202
|
+
"license": "MIT",
|
|
203
|
+
"engines": {
|
|
204
|
+
"node": ">=8"
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
"node_modules/is-scoped": {
|
|
208
|
+
"version": "2.1.0",
|
|
209
|
+
"resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-2.1.0.tgz",
|
|
210
|
+
"integrity": "sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==",
|
|
211
|
+
"license": "MIT",
|
|
212
|
+
"dependencies": {
|
|
213
|
+
"scoped-regex": "^2.0.0"
|
|
214
|
+
},
|
|
215
|
+
"engines": {
|
|
216
|
+
"node": ">=8"
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
"node_modules/is-url-superb": {
|
|
220
|
+
"version": "3.0.0",
|
|
221
|
+
"resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-3.0.0.tgz",
|
|
222
|
+
"integrity": "sha512-3faQP+wHCGDQT1qReM5zCPx2mxoal6DzbzquFlCYJLWyy4WPTved33ea2xFbX37z4NoriEwZGIYhFtx8RUB5wQ==",
|
|
223
|
+
"license": "MIT",
|
|
224
|
+
"dependencies": {
|
|
225
|
+
"url-regex": "^5.0.0"
|
|
226
|
+
},
|
|
227
|
+
"engines": {
|
|
228
|
+
"node": ">=8"
|
|
229
|
+
}
|
|
230
|
+
},
|
|
231
|
+
"node_modules/json-buffer": {
|
|
232
|
+
"version": "3.0.0",
|
|
233
|
+
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
|
|
234
|
+
"integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==",
|
|
235
|
+
"license": "MIT"
|
|
236
|
+
},
|
|
237
|
+
"node_modules/keyv": {
|
|
238
|
+
"version": "3.1.0",
|
|
239
|
+
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
|
|
240
|
+
"integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
|
|
241
|
+
"license": "MIT",
|
|
242
|
+
"dependencies": {
|
|
243
|
+
"json-buffer": "3.0.0"
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
"node_modules/lodash.zip": {
|
|
247
|
+
"version": "4.2.0",
|
|
248
|
+
"resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz",
|
|
249
|
+
"integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==",
|
|
250
|
+
"license": "MIT"
|
|
251
|
+
},
|
|
252
|
+
"node_modules/lowercase-keys": {
|
|
253
|
+
"version": "1.0.1",
|
|
254
|
+
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
|
|
255
|
+
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
|
|
256
|
+
"license": "MIT",
|
|
257
|
+
"engines": {
|
|
258
|
+
"node": ">=0.10.0"
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
"node_modules/mimic-response": {
|
|
262
|
+
"version": "1.0.1",
|
|
263
|
+
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
|
|
264
|
+
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
|
|
265
|
+
"license": "MIT",
|
|
266
|
+
"engines": {
|
|
267
|
+
"node": ">=4"
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
"node_modules/minimist": {
|
|
271
|
+
"version": "1.2.8",
|
|
272
|
+
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
|
|
273
|
+
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
|
|
274
|
+
"license": "MIT",
|
|
275
|
+
"funding": {
|
|
276
|
+
"url": "https://github.com/sponsors/ljharb"
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
"node_modules/node-ansi-logger": {
|
|
280
|
+
"version": "3.2.0",
|
|
281
|
+
"resolved": "https://registry.npmjs.org/node-ansi-logger/-/node-ansi-logger-3.2.0.tgz",
|
|
282
|
+
"integrity": "sha512-HvKsTZpMSrEkO2x2egSvTpjgWkVpYO0xsXNxmCG+7vi0Ohs5yy9EdTKbTPYbNwzXY70g7nqsE10yE+Tsw5MA8w==",
|
|
283
|
+
"hasShrinkwrap": true,
|
|
284
|
+
"license": "Apache-2.0",
|
|
285
|
+
"engines": {
|
|
286
|
+
"node": ">=20.0.0 <21.0.0 || >=22.0.0 <23.0.0 || >=24.0.0 <25.0.0"
|
|
287
|
+
},
|
|
288
|
+
"funding": {
|
|
289
|
+
"type": "buymeacoffee",
|
|
290
|
+
"url": "https://www.buymeacoffee.com/luligugithub"
|
|
291
|
+
}
|
|
292
|
+
},
|
|
293
|
+
"node_modules/node-broadlink": {
|
|
294
|
+
"version": "2.4.1",
|
|
295
|
+
"resolved": "https://registry.npmjs.org/node-broadlink/-/node-broadlink-2.4.1.tgz",
|
|
296
|
+
"integrity": "sha512-tP1tDyW/zZxj5u+PtKsh+0egaK55cBXN4OIA+slOZKhCmREeYGyOPcjlEkuXthuwmHQF7xuhepsSuh1x2bcctA==",
|
|
297
|
+
"license": "MIT",
|
|
298
|
+
"dependencies": {
|
|
299
|
+
"@aksel/structjs": "^1.0.0"
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
"node_modules/node-persist-manager": {
|
|
303
|
+
"version": "2.0.1",
|
|
304
|
+
"resolved": "https://registry.npmjs.org/node-persist-manager/-/node-persist-manager-2.0.1.tgz",
|
|
305
|
+
"integrity": "sha512-uCnZd8YZSaaYkxhFdOtzC4Q0uix+z5Cfnq5RbL43OKKFvU/6Ms/kZtXWF4CrlhIX9CBKAPUtV7pIUQy85nYc8g==",
|
|
306
|
+
"hasShrinkwrap": true,
|
|
307
|
+
"license": "Apache-2.0",
|
|
308
|
+
"dependencies": {
|
|
309
|
+
"node-persist": "4.0.4"
|
|
310
|
+
},
|
|
311
|
+
"engines": {
|
|
312
|
+
"node": ">=20.0.0 <21.0.0 || >=22.0.0 <23.0.0 || >=24.0.0 <25.0.0"
|
|
313
|
+
},
|
|
314
|
+
"funding": {
|
|
315
|
+
"type": "buymeacoffee",
|
|
316
|
+
"url": "https://www.buymeacoffee.com/luligugithub"
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
"node_modules/node-persist-manager/node_modules/node-persist": {
|
|
320
|
+
"version": "4.0.4",
|
|
321
|
+
"resolved": "https://registry.npmjs.org/node-persist/-/node-persist-4.0.4.tgz",
|
|
322
|
+
"integrity": "sha512-8sPAz/7tw1mCCc8xBG4f0wi+flHkSSgQeX998iQ75Pu27evA6UUWCjSE7xnrYTg2q33oU5leJ061EKPDv6BocQ==",
|
|
323
|
+
"license": "MIT",
|
|
324
|
+
"dependencies": {
|
|
325
|
+
"p-limit": "^3.1.0"
|
|
326
|
+
},
|
|
327
|
+
"engines": {
|
|
328
|
+
"node": ">=10.12.0"
|
|
329
|
+
}
|
|
330
|
+
},
|
|
331
|
+
"node_modules/node-persist-manager/node_modules/p-limit": {
|
|
332
|
+
"version": "3.1.0",
|
|
333
|
+
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
|
|
334
|
+
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
|
|
335
|
+
"license": "MIT",
|
|
336
|
+
"dependencies": {
|
|
337
|
+
"yocto-queue": "^0.1.0"
|
|
338
|
+
},
|
|
339
|
+
"engines": {
|
|
340
|
+
"node": ">=10"
|
|
341
|
+
},
|
|
342
|
+
"funding": {
|
|
343
|
+
"url": "https://github.com/sponsors/sindresorhus"
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
"node_modules/node-persist-manager/node_modules/yocto-queue": {
|
|
347
|
+
"version": "0.1.0",
|
|
348
|
+
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
|
|
349
|
+
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
|
|
350
|
+
"license": "MIT",
|
|
351
|
+
"engines": {
|
|
352
|
+
"node": ">=10"
|
|
353
|
+
},
|
|
354
|
+
"funding": {
|
|
355
|
+
"url": "https://github.com/sponsors/sindresorhus"
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
"node_modules/normalize-url": {
|
|
359
|
+
"version": "4.5.1",
|
|
360
|
+
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
|
|
361
|
+
"integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
|
|
362
|
+
"license": "MIT",
|
|
363
|
+
"engines": {
|
|
364
|
+
"node": ">=8"
|
|
365
|
+
}
|
|
366
|
+
},
|
|
367
|
+
"node_modules/npm-name": {
|
|
368
|
+
"version": "5.5.0",
|
|
369
|
+
"resolved": "https://registry.npmjs.org/npm-name/-/npm-name-5.5.0.tgz",
|
|
370
|
+
"integrity": "sha512-l7/uyVfEi2e3ho+ovaJZC0xlbwzXNUz3RxkxpfcnLuoGKAuYoo9YoJ/uy18PsTD8IziugGHks4t/mGmBJEZ4Qg==",
|
|
371
|
+
"license": "MIT",
|
|
372
|
+
"dependencies": {
|
|
373
|
+
"got": "^9.6.0",
|
|
374
|
+
"is-scoped": "^2.1.0",
|
|
375
|
+
"is-url-superb": "^3.0.0",
|
|
376
|
+
"lodash.zip": "^4.2.0",
|
|
377
|
+
"registry-auth-token": "^4.0.0",
|
|
378
|
+
"registry-url": "^5.1.0",
|
|
379
|
+
"validate-npm-package-name": "^3.0.0"
|
|
380
|
+
},
|
|
381
|
+
"engines": {
|
|
382
|
+
"node": ">=8"
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
"node_modules/once": {
|
|
386
|
+
"version": "1.4.0",
|
|
387
|
+
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
|
388
|
+
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
|
389
|
+
"license": "ISC",
|
|
390
|
+
"dependencies": {
|
|
391
|
+
"wrappy": "1"
|
|
392
|
+
}
|
|
393
|
+
},
|
|
394
|
+
"node_modules/p-cancelable": {
|
|
395
|
+
"version": "1.1.0",
|
|
396
|
+
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
|
|
397
|
+
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
|
|
398
|
+
"license": "MIT",
|
|
399
|
+
"engines": {
|
|
400
|
+
"node": ">=6"
|
|
401
|
+
}
|
|
402
|
+
},
|
|
403
|
+
"node_modules/prepend-http": {
|
|
404
|
+
"version": "2.0.0",
|
|
405
|
+
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
|
|
406
|
+
"integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==",
|
|
407
|
+
"license": "MIT",
|
|
408
|
+
"engines": {
|
|
409
|
+
"node": ">=4"
|
|
410
|
+
}
|
|
411
|
+
},
|
|
412
|
+
"node_modules/pump": {
|
|
413
|
+
"version": "3.0.4",
|
|
414
|
+
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
|
|
415
|
+
"integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
|
|
416
|
+
"license": "MIT",
|
|
417
|
+
"dependencies": {
|
|
418
|
+
"end-of-stream": "^1.1.0",
|
|
419
|
+
"once": "^1.3.1"
|
|
420
|
+
}
|
|
421
|
+
},
|
|
422
|
+
"node_modules/rc": {
|
|
423
|
+
"version": "1.2.8",
|
|
424
|
+
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
|
|
425
|
+
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
|
|
426
|
+
"license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
|
|
427
|
+
"dependencies": {
|
|
428
|
+
"deep-extend": "^0.6.0",
|
|
429
|
+
"ini": "~1.3.0",
|
|
430
|
+
"minimist": "^1.2.0",
|
|
431
|
+
"strip-json-comments": "~2.0.1"
|
|
432
|
+
},
|
|
433
|
+
"bin": {
|
|
434
|
+
"rc": "cli.js"
|
|
435
|
+
}
|
|
436
|
+
},
|
|
437
|
+
"node_modules/registry-auth-token": {
|
|
438
|
+
"version": "4.2.2",
|
|
439
|
+
"resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz",
|
|
440
|
+
"integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==",
|
|
441
|
+
"license": "MIT",
|
|
442
|
+
"dependencies": {
|
|
443
|
+
"rc": "1.2.8"
|
|
444
|
+
},
|
|
445
|
+
"engines": {
|
|
446
|
+
"node": ">=6.0.0"
|
|
447
|
+
}
|
|
448
|
+
},
|
|
449
|
+
"node_modules/registry-url": {
|
|
450
|
+
"version": "5.1.0",
|
|
451
|
+
"resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
|
|
452
|
+
"integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
|
|
453
|
+
"license": "MIT",
|
|
454
|
+
"dependencies": {
|
|
455
|
+
"rc": "^1.2.8"
|
|
456
|
+
},
|
|
457
|
+
"engines": {
|
|
458
|
+
"node": ">=8"
|
|
459
|
+
}
|
|
460
|
+
},
|
|
461
|
+
"node_modules/responselike": {
|
|
462
|
+
"version": "1.0.2",
|
|
463
|
+
"resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
|
|
464
|
+
"integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==",
|
|
465
|
+
"license": "MIT",
|
|
466
|
+
"dependencies": {
|
|
467
|
+
"lowercase-keys": "^1.0.0"
|
|
468
|
+
}
|
|
469
|
+
},
|
|
470
|
+
"node_modules/scoped-regex": {
|
|
471
|
+
"version": "2.1.0",
|
|
472
|
+
"resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-2.1.0.tgz",
|
|
473
|
+
"integrity": "sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==",
|
|
474
|
+
"license": "MIT",
|
|
475
|
+
"engines": {
|
|
476
|
+
"node": ">=8"
|
|
477
|
+
}
|
|
478
|
+
},
|
|
479
|
+
"node_modules/strip-json-comments": {
|
|
480
|
+
"version": "2.0.1",
|
|
481
|
+
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
|
|
482
|
+
"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
|
|
483
|
+
"license": "MIT",
|
|
484
|
+
"engines": {
|
|
485
|
+
"node": ">=0.10.0"
|
|
486
|
+
}
|
|
487
|
+
},
|
|
488
|
+
"node_modules/tlds": {
|
|
489
|
+
"version": "1.261.0",
|
|
490
|
+
"resolved": "https://registry.npmjs.org/tlds/-/tlds-1.261.0.tgz",
|
|
491
|
+
"integrity": "sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==",
|
|
492
|
+
"license": "MIT",
|
|
493
|
+
"bin": {
|
|
494
|
+
"tlds": "bin.js"
|
|
495
|
+
}
|
|
496
|
+
},
|
|
497
|
+
"node_modules/to-readable-stream": {
|
|
498
|
+
"version": "1.0.0",
|
|
499
|
+
"resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
|
|
500
|
+
"integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
|
|
501
|
+
"license": "MIT",
|
|
502
|
+
"engines": {
|
|
503
|
+
"node": ">=6"
|
|
504
|
+
}
|
|
505
|
+
},
|
|
506
|
+
"node_modules/url-parse-lax": {
|
|
507
|
+
"version": "3.0.0",
|
|
508
|
+
"resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
|
|
509
|
+
"integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==",
|
|
510
|
+
"license": "MIT",
|
|
511
|
+
"dependencies": {
|
|
512
|
+
"prepend-http": "^2.0.0"
|
|
513
|
+
},
|
|
514
|
+
"engines": {
|
|
515
|
+
"node": ">=4"
|
|
516
|
+
}
|
|
517
|
+
},
|
|
518
|
+
"node_modules/url-regex": {
|
|
519
|
+
"version": "5.0.0",
|
|
520
|
+
"resolved": "https://registry.npmjs.org/url-regex/-/url-regex-5.0.0.tgz",
|
|
521
|
+
"integrity": "sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g==",
|
|
522
|
+
"license": "MIT",
|
|
523
|
+
"dependencies": {
|
|
524
|
+
"ip-regex": "^4.1.0",
|
|
525
|
+
"tlds": "^1.203.0"
|
|
526
|
+
},
|
|
527
|
+
"engines": {
|
|
528
|
+
"node": ">=8"
|
|
529
|
+
}
|
|
530
|
+
},
|
|
531
|
+
"node_modules/validate-npm-package-name": {
|
|
532
|
+
"version": "3.0.0",
|
|
533
|
+
"resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
|
|
534
|
+
"integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==",
|
|
535
|
+
"license": "ISC",
|
|
536
|
+
"dependencies": {
|
|
537
|
+
"builtins": "^1.0.3"
|
|
538
|
+
}
|
|
539
|
+
},
|
|
540
|
+
"node_modules/wrappy": {
|
|
541
|
+
"version": "1.0.2",
|
|
542
|
+
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
|
543
|
+
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
|
544
|
+
"license": "ISC"
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "matterbridge-computherm",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Matterbridge Computherm plugin",
|
|
5
|
+
"author": "https://github.com/andrasg",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"homepage": "https://www.npmjs.com/package/matterbridge-computherm",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"main": "dist/module.js",
|
|
10
|
+
"types": "dist/module.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/module.js",
|
|
14
|
+
"types": "./dist/module.d.ts"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/andrasg/matterbridge-computherm.git"
|
|
20
|
+
},
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/andrasg/matterbridge-computherm/issues"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"matterbridge",
|
|
26
|
+
"homebridge",
|
|
27
|
+
"matter",
|
|
28
|
+
"matter.js",
|
|
29
|
+
"computherm",
|
|
30
|
+
"plugin"
|
|
31
|
+
],
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=20.19.0 <21.0.0 || >=22.13.0 <23.0.0 || >=24.0.0 <25.0.0"
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"bin",
|
|
37
|
+
"dist",
|
|
38
|
+
"npm-shrinkwrap.json",
|
|
39
|
+
"*.config.json",
|
|
40
|
+
"*.schema.json"
|
|
41
|
+
],
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"node-ansi-logger": "3.2.0",
|
|
44
|
+
"node-broadlink": "2.4.1",
|
|
45
|
+
"node-persist-manager": "2.0.1"
|
|
46
|
+
},
|
|
47
|
+
"overrides": {
|
|
48
|
+
"typescript": "6.0.2",
|
|
49
|
+
"eslint": "10.1.0",
|
|
50
|
+
"@eslint/js": "10.0.1"
|
|
51
|
+
}
|
|
52
|
+
}
|