matterbridge-valetudo 1.0.2

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.
@@ -0,0 +1,279 @@
1
+ {
2
+ "title": "Matterbridge Valetudo Plugin Configuration",
3
+ "description": "Multi-vacuum support for Valetudo-enabled robot vacuums with automatic mDNS discovery",
4
+ "type": "object",
5
+ "required": ["name", "type"],
6
+ "properties": {
7
+ "name": {
8
+ "title": "Plugin Name",
9
+ "description": "Plugin identifier (read-only)",
10
+ "type": "string",
11
+ "readOnly": true
12
+ },
13
+ "type": {
14
+ "title": "Plugin Type",
15
+ "description": "Platform type (read-only)",
16
+ "type": "string",
17
+ "readOnly": true
18
+ },
19
+ "discovery": {
20
+ "title": "Auto-Discovery",
21
+ "description": "Automatic mDNS discovery of Valetudo vacuums on your network",
22
+ "type": "object",
23
+ "properties": {
24
+ "enabled": {
25
+ "title": "Enable Auto-Discovery",
26
+ "description": "Automatically find and add Valetudo vacuums on your network",
27
+ "type": "boolean",
28
+ "default": true
29
+ },
30
+ "timeout": {
31
+ "title": "Discovery Timeout (ms)",
32
+ "description": "How long to wait for mDNS responses (1000-30000ms)",
33
+ "type": "number",
34
+ "default": 5000,
35
+ "minimum": 1000,
36
+ "maximum": 30000
37
+ },
38
+ "scanIntervalSeconds": {
39
+ "title": "Periodic Scan Interval (seconds)",
40
+ "description": "Re-scan interval: 0 = scan once at startup, >0 = periodic scanning (useful for detecting new vacuums or IP changes)",
41
+ "type": "number",
42
+ "default": 300,
43
+ "minimum": 0,
44
+ "maximum": 86400
45
+ }
46
+ }
47
+ },
48
+ "vacuums": {
49
+ "title": "Manual Vacuum Configuration",
50
+ "description": "Manually add vacuums by IP address (works alongside auto-discovery)",
51
+ "type": "array",
52
+ "items": {
53
+ "type": "object",
54
+ "required": ["ip"],
55
+ "properties": {
56
+ "ip": {
57
+ "title": "IP Address",
58
+ "description": "Static IP address or hostname of the Valetudo vacuum",
59
+ "type": "string",
60
+ "pattern": "^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}$|^[a-zA-Z0-9][a-zA-Z0-9-_.]*[a-zA-Z0-9]$"
61
+ },
62
+ "name": {
63
+ "title": "Custom Name",
64
+ "description": "Optional friendly name (defaults to manufacturer + model from vacuum)",
65
+ "type": "string"
66
+ },
67
+ "enabled": {
68
+ "title": "Enabled",
69
+ "description": "Enable or disable this vacuum",
70
+ "type": "boolean",
71
+ "default": true
72
+ }
73
+ }
74
+ },
75
+ "default": []
76
+ },
77
+ "pollingInterval": {
78
+ "title": "Polling Interval (ms)",
79
+ "description": "How often to check vacuum status (5000-60000ms, applies to all vacuums)",
80
+ "type": "number",
81
+ "default": 30000,
82
+ "minimum": 5000,
83
+ "maximum": 60000
84
+ },
85
+ "enableServerMode": {
86
+ "title": "Apple Home Server Mode",
87
+ "description": "Enable server mode (required for Apple Home support, creates separate QR code for each vacuum)",
88
+ "type": "boolean",
89
+ "default": false
90
+ },
91
+ "positionTracking": {
92
+ "title": "Position Tracking",
93
+ "description": "Track which room/area the vacuum is currently cleaning",
94
+ "type": "object",
95
+ "properties": {
96
+ "enabled": {
97
+ "title": "Enable Position Tracking",
98
+ "description": "Show current room/area during cleaning",
99
+ "type": "boolean",
100
+ "default": true
101
+ }
102
+ }
103
+ },
104
+ "consumables": {
105
+ "title": "Consumables Tracking",
106
+ "description": "Monitor brush, filter, and sensor lifetime (applies to all vacuums)",
107
+ "type": "object",
108
+ "properties": {
109
+ "enabled": {
110
+ "title": "Enable Consumable Tracking",
111
+ "description": "Track and log consumable status",
112
+ "type": "boolean",
113
+ "default": true
114
+ },
115
+ "warningThreshold": {
116
+ "title": "Warning Threshold (%)",
117
+ "description": "Trigger warning when lifetime falls below this percentage (0-100)",
118
+ "type": "number",
119
+ "default": 10,
120
+ "minimum": 0,
121
+ "maximum": 100
122
+ },
123
+ "exposeAsContactSensors": {
124
+ "title": "Expose as Contact Sensors",
125
+ "description": "Create contact sensors for each consumable (open = needs replacement, closed = OK)",
126
+ "type": "boolean",
127
+ "default": false
128
+ },
129
+ "maxLifetimes": {
130
+ "title": "Maximum Lifetimes (minutes)",
131
+ "description": "Expected lifetime for each consumable type",
132
+ "type": "object",
133
+ "properties": {
134
+ "mainBrush": {
135
+ "title": "Main Brush",
136
+ "description": "Default: 18,000 minutes (300 hours)",
137
+ "type": "number",
138
+ "default": 18000,
139
+ "minimum": 60
140
+ },
141
+ "sideBrush": {
142
+ "title": "Side Brush",
143
+ "description": "Default: 12,000 minutes (200 hours)",
144
+ "type": "number",
145
+ "default": 12000,
146
+ "minimum": 60
147
+ },
148
+ "dustFilter": {
149
+ "title": "Dust Filter",
150
+ "description": "Default: 9,000 minutes (150 hours)",
151
+ "type": "number",
152
+ "default": 9000,
153
+ "minimum": 60
154
+ },
155
+ "sensor": {
156
+ "title": "Sensor Cleaning",
157
+ "description": "Default: 1,800 minutes (30 hours)",
158
+ "type": "number",
159
+ "default": 1800,
160
+ "minimum": 60
161
+ }
162
+ }
163
+ }
164
+ }
165
+ },
166
+ "intensityPresets": {
167
+ "title": "Intensity Presets (Advanced)",
168
+ "description": "Override default fan speed and water usage for each intensity level",
169
+ "type": "object",
170
+ "properties": {
171
+ "auto": {
172
+ "title": "Auto Intensity",
173
+ "type": "object",
174
+ "properties": {
175
+ "fanSpeed": {
176
+ "title": "Fan Speed",
177
+ "description": "e.g., 'low', 'medium', 'high', 'max'",
178
+ "type": "string",
179
+ "default": "medium"
180
+ },
181
+ "waterUsage": {
182
+ "title": "Water Usage",
183
+ "description": "For mop modes: 'min', 'low', 'medium', 'high', 'max'",
184
+ "type": "string",
185
+ "default": "medium"
186
+ }
187
+ }
188
+ },
189
+ "quiet": {
190
+ "title": "Quiet Intensity",
191
+ "type": "object",
192
+ "properties": {
193
+ "fanSpeed": {
194
+ "title": "Fan Speed",
195
+ "type": "string",
196
+ "default": "low"
197
+ },
198
+ "waterUsage": {
199
+ "title": "Water Usage",
200
+ "type": "string",
201
+ "default": "low"
202
+ }
203
+ }
204
+ },
205
+ "quick": {
206
+ "title": "Quick Intensity",
207
+ "type": "object",
208
+ "properties": {
209
+ "fanSpeed": {
210
+ "title": "Fan Speed",
211
+ "type": "string",
212
+ "default": "high"
213
+ },
214
+ "waterUsage": {
215
+ "title": "Water Usage",
216
+ "type": "string",
217
+ "default": "high"
218
+ }
219
+ }
220
+ },
221
+ "max": {
222
+ "title": "Max Intensity",
223
+ "type": "object",
224
+ "properties": {
225
+ "fanSpeed": {
226
+ "title": "Fan Speed",
227
+ "type": "string",
228
+ "default": "max"
229
+ },
230
+ "waterUsage": {
231
+ "title": "Water Usage",
232
+ "type": "string",
233
+ "default": "high"
234
+ }
235
+ }
236
+ }
237
+ }
238
+ },
239
+ "mapCache": {
240
+ "title": "Map Cache (Advanced)",
241
+ "description": "Cache configuration for efficient position tracking",
242
+ "type": "object",
243
+ "properties": {
244
+ "enabled": {
245
+ "title": "Enable Map Caching",
246
+ "description": "Reduce processing overhead during position tracking",
247
+ "type": "boolean",
248
+ "default": true
249
+ },
250
+ "refreshIntervalHours": {
251
+ "title": "Refresh Interval (hours)",
252
+ "description": "Hours between automatic cache refreshes (0.1-24)",
253
+ "type": "number",
254
+ "default": 1,
255
+ "minimum": 0.1,
256
+ "maximum": 24
257
+ },
258
+ "refreshOnError": {
259
+ "title": "Refresh on Error",
260
+ "description": "Auto-refresh cache when position tracking errors occur",
261
+ "type": "boolean",
262
+ "default": true
263
+ }
264
+ }
265
+ },
266
+ "debug": {
267
+ "title": "Debug Mode (Development)",
268
+ "description": "Enable verbose debug logging",
269
+ "type": "boolean",
270
+ "default": false
271
+ },
272
+ "unregisterOnShutdown": {
273
+ "title": "Unregister on Shutdown (Development)",
274
+ "description": "Remove all devices when plugin stops (development only)",
275
+ "type": "boolean",
276
+ "default": false
277
+ }
278
+ }
279
+ }
@@ -0,0 +1,50 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 296.2 296.2">
2
+ <defs>
3
+ <linearGradient id="lg1" x1="16.6" y1="16.6" x2="279.6" y2="279.6" gradientUnits="userSpaceOnUse">
4
+ <stop offset="0" stop-color="#00b48d" />
5
+ <stop offset=".1" stop-color="#3faa77" />
6
+ <stop offset=".3" stop-color="#234148" />
7
+ <stop offset=".7" stop-color="#203b44" />
8
+ <stop offset=".9" stop-color="#ad2e6e" />
9
+ <stop offset="1" stop-color="#c81b74" />
10
+ </linearGradient>
11
+ <linearGradient id="lg2" x1="31.1" y1="31.1" x2="265.1" y2="265.1" gradientUnits="userSpaceOnUse">
12
+ <stop offset="0" stop-color="#00b48d" />
13
+ <stop offset=".2" stop-color="#285251" />
14
+ <stop offset=".4" stop-color="#234148" />
15
+ <stop offset=".8" stop-color="#203b44" />
16
+ <stop offset=".9" stop-color="#a8316c" />
17
+ <stop offset="1" stop-color="#c81b74" />
18
+ </linearGradient>
19
+ <linearGradient id="lg3" x1="116.2" y1="143.9" x2="139.8" y2="143.9"
20
+ gradientUnits="userSpaceOnUse">
21
+ <stop offset="0" stop-color="#8bc751" />
22
+ <stop offset="1" stop-color="#0db14b" />
23
+ </linearGradient>
24
+ <linearGradient id="lg4" x1="136.1" y1="100.8" x2="159.6" y2="100.8"
25
+ xlink:href="#lg3" />
26
+ <linearGradient id="lg5" x1="155.3" y1="143.9" x2="178.9" y2="143.9"
27
+ xlink:href="#lg3" />
28
+ <linearGradient id="lg6" x1="46.8" y1="25.7" x2="89.6" y2="74.8" gradientUnits="userSpaceOnUse">
29
+ <stop offset="0" stop-color="#b1d34a" />
30
+ <stop offset="1" stop-color="#50b848" />
31
+ </linearGradient>
32
+ </defs>
33
+ <rect width="296.2" height="296.2" rx="56.7" ry="56.7" style="fill:url(#lg1)" />
34
+ <rect x="16.3" y="16.3" width="263.6" height="263.6" rx="50.5" ry="50.5" style="fill:url(#lg2)" />
35
+ <circle cx="128" cy="143.9" r="11.8" style="fill:url(#lg3)" />
36
+ <circle cx="147.8" cy="100.8" r="11.8" style="fill:url(#lg4)" />
37
+ <path
38
+ d="m244.6 114.5.4-.5L160 33a17 17 0 0 0-24.7-.5l-86.4 83.3a15 15 0 0 0 9.2 26.9h19.3v-4.7l-13.7-12.7v-.1l83.7-80.8 84.2 81-13.9 12.8v4.5h19.5a15 15 0 0 0 7.4-28.1Z"
39
+ style="fill:url(#lg3)" />
40
+ <circle cx="167.1" cy="143.9" r="11.8" style="fill:url(#lg5)" />
41
+ <path fill="#fff" d="M219 89.3V35.5a10.5 10.5 0 1 0-21 0v33.7l21 20Z" />
42
+ <path
43
+ d="M91.4 73.3H83a37 37 0 0 0-14.5-28.4L65 50.2c.1 0 12.6 9 11.7 25.4-5.3-.4-11.2-1.9-16.3-5.3-11.8-7.8-16-23.7-11.9-46 8.7 1.5 34 7 43 22.8 4.1 7.3 4.1 16.1 0 26.2Z"
44
+ style="fill:url(#lg6)" />
45
+ <path
46
+ d="M65.9 80a49.6 49.6 0 0 0 17.8 2.2l16.6-16c1.6-8.3.5-15.7-3.3-22.4C84.6 22 47.8 17.5 46.2 17.4l-3-.4-.6 3c-3.8 18.4-5.9 50.6 23.2 60ZM48.4 24.4c8.7 1.5 34 7 43 22.8 4.1 7.3 4.1 16.1 0 26.2H83a37 37 0 0 0-14.5-28.4l-3.7 5.3c.1 0 12.6 9 11.7 25.4-5.3-.4-11.2-1.9-16.3-5.3-11.9-7.8-16-23.7-11.9-46Z"
47
+ fill="#1e5857" />
48
+ <path fill="#fff"
49
+ d="M250.5 90.5a17.4 17.4 0 1 1 0-34.8 17.4 17.4 0 0 1 0 34.8Zm0-22.7a5.4 5.4 0 0 0 0 10.7 5.3 5.3 0 0 0 0-10.7ZM258.8 148.2a15.9 15.9 0 0 0-9.6 28.5c-.8 4.2-5.4 4.6-5.4 4.6h-26v-43l13.6-13-1.8-2-82.2-79-81.2 78.3-2.5 2.6 13.7 13v42.9H53a21.5 21.5 0 1 0 11.7 15h12.6v18.8c0 7.8 6.4 14.1 14.1 14.1h29.3v14.8H64a10.6 10.6 0 0 0-17.7 8 10.6 10.6 0 0 0 17.6 8h157.6a16.3 16.3 0 1 0 0-16h-84.8V229h66.8c7.8 0 14.2-6.3 14.2-14.1v-19.2h27.6c14.3 0 17.8-12.8 18.5-16.6a15.9 15.9 0 0 0-5-30.9ZM43.7 210.8a10.3 10.3 0 1 1 0-20.6 10.3 10.3 0 0 1 0 20.6Zm192 36a5 5 0 1 1 0 10 5 5 0 0 1 0-10Zm-77-34.8h-22v-34h22v34Zm8.4-79.8c2.7 0 5.2 1 7.2 2.5v-10.4L188 137s2.6 1.3 4.6 1.3h6.7v68c0 3.2-2.6 5.7-5.7 5.7h-19v-34h1.4a7.5 7.5 0 0 0 0-15H120a7.5 7.5 0 0 0 0 15h.7v34h-19.3a5.7 5.7 0 0 1-5.7-5.6v-68.1h6.7c2 0 4.6-1.3 4.6-1.3l13.7-12.7v10.4a11.7 11.7 0 0 1 16 1.6v-13a14.9 14.9 0 0 0-25-10.8s-.1.2-.1.2l-.5.5-6.9 7H92.5l55-53.2 55.1 53.2h-11.8l-7-7c0-.2-.2-.3-.4-.5l-.2-.2a14.8 14.8 0 0 0-25 10.9v12.9c2.2-2.5 5.3-4.1 8.9-4.1Zm91.7 36.7a4.9 4.9 0 1 1 0-9.7 4.9 4.9 0 0 1 0 9.7Z" />
50
+ </svg>
@@ -0,0 +1,127 @@
1
+ {
2
+ "name": "matterbridge-valetudo",
3
+ "version": "1.0.2",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "matterbridge-valetudo",
9
+ "version": "1.0.2",
10
+ "license": "Apache-2.0",
11
+ "dependencies": {
12
+ "multicast-dns": "^7.2.5",
13
+ "node-ansi-logger": "3.1.1",
14
+ "node-persist-manager": "2.0.0"
15
+ },
16
+ "engines": {
17
+ "node": ">=20.0.0 <21.0.0 || >=22.0.0 <23.0.0 || >=24.0.0 <25.0.0"
18
+ }
19
+ },
20
+ "node_modules/@leichtgewicht/ip-codec": {
21
+ "version": "2.0.5",
22
+ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
23
+ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
24
+ "license": "MIT"
25
+ },
26
+ "node_modules/dns-packet": {
27
+ "version": "5.6.1",
28
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
29
+ "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
30
+ "license": "MIT",
31
+ "dependencies": {
32
+ "@leichtgewicht/ip-codec": "^2.0.1"
33
+ },
34
+ "engines": {
35
+ "node": ">=6"
36
+ }
37
+ },
38
+ "node_modules/multicast-dns": {
39
+ "version": "7.2.5",
40
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
41
+ "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
42
+ "license": "MIT",
43
+ "dependencies": {
44
+ "dns-packet": "^5.2.2",
45
+ "thunky": "^1.0.2"
46
+ },
47
+ "bin": {
48
+ "multicast-dns": "cli.js"
49
+ }
50
+ },
51
+ "node_modules/node-ansi-logger": {
52
+ "version": "3.1.1",
53
+ "resolved": "https://registry.npmjs.org/node-ansi-logger/-/node-ansi-logger-3.1.1.tgz",
54
+ "integrity": "sha512-tFeCSxwiRg5XaNda5nC27alzraZP76nLtUk1JDZqb9byhW4WYaSGL7/lmxFHEI16gypQDMEYljuF+wcG+cPPHw==",
55
+ "hasShrinkwrap": true,
56
+ "license": "Apache-2.0",
57
+ "engines": {
58
+ "node": ">=18.0.0 <19.0.0 || >=20.0.0 <21.0.0 || >=22.0.0 <23.0.0 || >=24.0.0 <25.0.0"
59
+ },
60
+ "funding": {
61
+ "type": "buymeacoffee",
62
+ "url": "https://www.buymeacoffee.com/luligugithub"
63
+ }
64
+ },
65
+ "node_modules/node-persist": {
66
+ "version": "4.0.4",
67
+ "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-4.0.4.tgz",
68
+ "integrity": "sha512-8sPAz/7tw1mCCc8xBG4f0wi+flHkSSgQeX998iQ75Pu27evA6UUWCjSE7xnrYTg2q33oU5leJ061EKPDv6BocQ==",
69
+ "license": "MIT",
70
+ "dependencies": {
71
+ "p-limit": "^3.1.0"
72
+ },
73
+ "engines": {
74
+ "node": ">=10.12.0"
75
+ }
76
+ },
77
+ "node_modules/node-persist-manager": {
78
+ "version": "2.0.0",
79
+ "resolved": "https://registry.npmjs.org/node-persist-manager/-/node-persist-manager-2.0.0.tgz",
80
+ "integrity": "sha512-jpgOqCCn4ZEnIr4WcvqkyyGmmLJarV6aUyBlDQdG1G84X9UUmOmI1W2OZtc9K0z375CYWhjtGEXaY7GXNiEOfA==",
81
+ "license": "MIT",
82
+ "dependencies": {
83
+ "node-persist": "4.0.4"
84
+ },
85
+ "engines": {
86
+ "node": ">=18.0.0 <19.0.0 || >=20.0.0 <21.0.0 || >=22.0.0 <23.0.0 || >=24.0.0 <25.0.0"
87
+ },
88
+ "funding": {
89
+ "type": "buymeacoffee",
90
+ "url": "https://www.buymeacoffee.com/luligugithub"
91
+ }
92
+ },
93
+ "node_modules/p-limit": {
94
+ "version": "3.1.0",
95
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
96
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
97
+ "license": "MIT",
98
+ "dependencies": {
99
+ "yocto-queue": "^0.1.0"
100
+ },
101
+ "engines": {
102
+ "node": ">=10"
103
+ },
104
+ "funding": {
105
+ "url": "https://github.com/sponsors/sindresorhus"
106
+ }
107
+ },
108
+ "node_modules/thunky": {
109
+ "version": "1.1.0",
110
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
111
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
112
+ "license": "MIT"
113
+ },
114
+ "node_modules/yocto-queue": {
115
+ "version": "0.1.0",
116
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
117
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
118
+ "license": "MIT",
119
+ "engines": {
120
+ "node": ">=10"
121
+ },
122
+ "funding": {
123
+ "url": "https://github.com/sponsors/sindresorhus"
124
+ }
125
+ }
126
+ }
127
+ }
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "matterbridge-valetudo",
3
+ "version": "1.0.2",
4
+ "description": "Matterbridge plugin for Valetudo-enabled robot vacuums",
5
+ "author": "JGtHb",
6
+ "license": "Apache-2.0",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/JGtHb/matterbridge-valetudo.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/JGtHb/matterbridge-valetudo/issues"
13
+ },
14
+ "homepage": "https://github.com/JGtHb/matterbridge-valetudo",
15
+ "type": "module",
16
+ "main": "dist/module.js",
17
+ "engines": {
18
+ "node": ">=20.0.0 <21.0.0 || >=22.0.0 <23.0.0 || >=24.0.0 <25.0.0"
19
+ },
20
+ "keywords": [
21
+ "matterbridge",
22
+ "plugin",
23
+ "valetudo",
24
+ "robot-vacuum",
25
+ "vacuum-cleaner",
26
+ "matter.js",
27
+ "matter-node.js",
28
+ "matter",
29
+ "matterprotocol",
30
+ "iot",
31
+ "smarthome",
32
+ "connectedthings",
33
+ "hap",
34
+ "homekit",
35
+ "siri",
36
+ "google-home",
37
+ "alexa",
38
+ "homeassistant",
39
+ "smartthings"
40
+ ],
41
+ "dependencies": {
42
+ "multicast-dns": "^7.2.5",
43
+ "node-ansi-logger": "3.1.1",
44
+ "node-persist-manager": "2.0.0"
45
+ }
46
+ }