zwave-js-ui 9.3.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.
Files changed (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +48 -0
  3. package/dev-dist/registerSW.js +5 -0
  4. package/dist/apple-touch-icon-180x180.png +0 -0
  5. package/dist/assets/AssociationGroups-474358b5.js +1 -0
  6. package/dist/assets/BgRssiChart-3e7d7555.css +1 -0
  7. package/dist/assets/BgRssiChart-554c89ef.js +3 -0
  8. package/dist/assets/BlinkIcon-5407e2e0.js +1 -0
  9. package/dist/assets/ColumnFilter-378ec338.js +1 -0
  10. package/dist/assets/ColumnFilterBoolean-e0ff8ce6.js +1 -0
  11. package/dist/assets/ColumnFilterDate-b17871ea.js +1 -0
  12. package/dist/assets/ColumnFilterNumber-c07930a6.js +1 -0
  13. package/dist/assets/ColumnFilterString-079ac562.js +1 -0
  14. package/dist/assets/ControlPanel-3c3168d8.js +7 -0
  15. package/dist/assets/ControllerChart-f2fbb771.js +1 -0
  16. package/dist/assets/Debug-ea34e06e.js +98 -0
  17. package/dist/assets/DialogAdvanced-5f8c36c7.js +1 -0
  18. package/dist/assets/DialogAdvanced-eaabda04.css +1 -0
  19. package/dist/assets/DialogAssociation-6da4cd66.js +1 -0
  20. package/dist/assets/DialogGatewayValue-501b7bbe.js +1 -0
  21. package/dist/assets/DialogGatewayValue-911dd212.css +1 -0
  22. package/dist/assets/DialogHealthCheck-2228ed6c.css +1 -0
  23. package/dist/assets/DialogHealthCheck-9e90523a.js +1 -0
  24. package/dist/assets/DialogSceneValue-ff3081b9.js +1 -0
  25. package/dist/assets/ErrorPage-a4f837c6.js +1 -0
  26. package/dist/assets/ExpandedNode-9f727a42.css +1 -0
  27. package/dist/assets/ExpandedNode-a0bff765.js +3 -0
  28. package/dist/assets/HomeAssistant-974143e2.js +1 -0
  29. package/dist/assets/ListInput-d8c678f2.js +1 -0
  30. package/dist/assets/Login-1826b0a1.css +1 -0
  31. package/dist/assets/Login-5424b4df.js +1 -0
  32. package/dist/assets/MaterialIcons-Regular-11ec382a.woff +0 -0
  33. package/dist/assets/MaterialIcons-Regular-29c11fa5.ttf +0 -0
  34. package/dist/assets/MaterialIcons-Regular-5743ed3d.woff2 +0 -0
  35. package/dist/assets/MaterialIcons-Regular-e69d687a.eot +0 -0
  36. package/dist/assets/Mesh-1b8d31eb.css +1 -0
  37. package/dist/assets/Mesh-25b19dfe.js +1 -0
  38. package/dist/assets/NodeDetails-da00c417.css +1 -0
  39. package/dist/assets/NodeDetails-e9d8d566.js +5 -0
  40. package/dist/assets/NodePanel-3639f227.css +1 -0
  41. package/dist/assets/NodePanel-5cdb1b4a.js +1 -0
  42. package/dist/assets/NodeScheduler-e91e411b.js +1 -0
  43. package/dist/assets/OTAUpdates-066cbfed.js +7 -0
  44. package/dist/assets/QrReader-00dee3fb.css +1 -0
  45. package/dist/assets/QrReader-c320584c.js +1 -0
  46. package/dist/assets/ReinterviewBadge-a40fb19f.js +1 -0
  47. package/dist/assets/RichValue-3ea76a33.css +1 -0
  48. package/dist/assets/RichValue-3f78fa98.js +1 -0
  49. package/dist/assets/Scenes-4aea74b8.js +1 -0
  50. package/dist/assets/Settings-ac079344.css +1 -0
  51. package/dist/assets/Settings-d8e203ed.js +44 -0
  52. package/dist/assets/SmartStart-63c21be6.js +2 -0
  53. package/dist/assets/SmartView-f9259d20.js +1 -0
  54. package/dist/assets/StatisticsArrows-40c56587.js +1 -0
  55. package/dist/assets/StatisticsCard-a91596c0.js +1 -0
  56. package/dist/assets/Store-701d51c8.js +1 -0
  57. package/dist/assets/Store-a58f7130.css +1 -0
  58. package/dist/assets/UserCodeTable-c397703b.js +1 -0
  59. package/dist/assets/ValueId-b8e1e4a2.js +1 -0
  60. package/dist/assets/ValueId-ea679e64.css +1 -0
  61. package/dist/assets/ZwaveGraph-4fa851e3.js +98 -0
  62. package/dist/assets/ZwaveGraph-fe07d4ee.css +1 -0
  63. package/dist/assets/file-input-064e7979.js +1 -0
  64. package/dist/assets/index-058391ec.js +17 -0
  65. package/dist/assets/index-3c63af0b.js +112 -0
  66. package/dist/assets/index-468a52af.js +2 -0
  67. package/dist/assets/index-be785cef.css +9 -0
  68. package/dist/assets/index-d98f5afd.css +1 -0
  69. package/dist/assets/items-45b4c1f5.js +1 -0
  70. package/dist/assets/mdi-4fe99e39.js +1 -0
  71. package/dist/assets/prismeditor.esm-3002a813.js +7 -0
  72. package/dist/assets/qr-scanner-worker.min-5f44a019.js +98 -0
  73. package/dist/assets/vuedraggable.umd-441070b9.js +8 -0
  74. package/dist/favicon.ico +0 -0
  75. package/dist/index.html +47 -0
  76. package/dist/logo.png +0 -0
  77. package/dist/logo.svg +32 -0
  78. package/dist/manifest.webmanifest +1 -0
  79. package/dist/maskable-icon-512x512.png +0 -0
  80. package/dist/pwa-192x192.png +0 -0
  81. package/dist/pwa-512x512.png +0 -0
  82. package/dist/pwa-64x64.png +0 -0
  83. package/dist/registerSW.js +1 -0
  84. package/dist/star.svg +3 -0
  85. package/dist/sw.js +1232 -0
  86. package/package.json +217 -0
  87. package/public/apple-touch-icon-180x180.png +0 -0
  88. package/public/favicon.ico +0 -0
  89. package/public/logo.png +0 -0
  90. package/public/logo.svg +32 -0
  91. package/public/maskable-icon-512x512.png +0 -0
  92. package/public/pwa-192x192.png +0 -0
  93. package/public/pwa-512x512.png +0 -0
  94. package/public/pwa-64x64.png +0 -0
  95. package/public/star.svg +3 -0
  96. package/server/app.js +1201 -0
  97. package/server/bin/www.js +70 -0
  98. package/server/config/app.js +22 -0
  99. package/server/config/store.js +19 -0
  100. package/server/hass/configurations.js +195 -0
  101. package/server/hass/devices.js +397 -0
  102. package/server/lib/BackupManager.js +134 -0
  103. package/server/lib/Constants.js +705 -0
  104. package/server/lib/CustomPlugin.js +9 -0
  105. package/server/lib/EventEmitter.js +14 -0
  106. package/server/lib/Gateway.js +1986 -0
  107. package/server/lib/MqttClient.js +418 -0
  108. package/server/lib/SocketEvents.js +34 -0
  109. package/server/lib/SocketManager.js +71 -0
  110. package/server/lib/ZwaveClient.js +4261 -0
  111. package/server/lib/jsonStore.js +139 -0
  112. package/server/lib/logger.js +169 -0
  113. package/server/lib/utils.js +283 -0
  114. package/snippets/access-store-dir.js +12 -0
  115. package/snippets/clone-config.js +17 -0
  116. package/snippets/pingNodes.js +14 -0
  117. package/snippets/reinterview-nodes.js +64 -0
@@ -0,0 +1,397 @@
1
+ "use strict";
2
+ // Place here repeated patterns
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const FAN_DIMMER = {
5
+ type: 'fan',
6
+ object_id: 'dimmer',
7
+ values: ['38-0-currentValue', '38-0-targetValue'],
8
+ discovery_payload: {
9
+ command_topic: '38-0-targetValue',
10
+ speed_command_topic: '38-0-targetValue',
11
+ speed_state_topic: '38-0-currentValue',
12
+ state_topic: '38-0-currentValue',
13
+ speeds: ['off', 'low', 'medium', 'high'],
14
+ payload_low_speed: 24,
15
+ payload_medium_speed: 50,
16
+ payload_high_speed: 99,
17
+ payload_off: 0,
18
+ payload_on: 255,
19
+ state_value_template: '{% if (value_json.value | int) == 0 %} 0 {% else %} 255 {% endif %}',
20
+ speed_value_template: '{% if (value_json.value | int) == 0 %} 0 {% elif (value_json.value | int) <= 32 %} 24 {% elif (value_json.value | int) <= 66 %} 50 {% elif (value_json.value | int) <= 99 %} 99 {% endif %}',
21
+ },
22
+ };
23
+ const THERMOSTAT_DANFOSS = {
24
+ type: 'climate',
25
+ object_id: 'thermostat',
26
+ values: ['67-0-setpoint-1', '67-0-setpoint-2', '67-0-setpoint-10'],
27
+ setpoint_topic: {
28
+ 1: '67-0-setpoint-1',
29
+ 2: '67-0-setpoint-2',
30
+ 10: '67-0-setpoint-10',
31
+ },
32
+ default_setpoint: '67-0-setpoint-1',
33
+ discovery_payload: {
34
+ max_temp: 40,
35
+ min_temp: 0,
36
+ temp_step: 0.1,
37
+ temperature_state_template: '{{ value_json.value }}',
38
+ temperature_state_topic: '67-0-setpoint-1',
39
+ temperature_unit: 'C',
40
+ temperature_command_topic: true,
41
+ },
42
+ };
43
+ // Radio Thermostat / 2GIG CT32, CT100 and CT101
44
+ const THERMOSTAT_2GIG = {
45
+ type: 'climate',
46
+ object_id: 'thermostat',
47
+ values: [
48
+ '49-1-Air temperature',
49
+ '64-1-mode',
50
+ '66-1-state',
51
+ '67-1-setpoint-1',
52
+ '67-1-setpoint-2',
53
+ '68-1-mode',
54
+ ],
55
+ action_map: {
56
+ 0: 'idle',
57
+ 1: 'heating',
58
+ 2: 'cooling',
59
+ 3: 'fan',
60
+ },
61
+ mode_map: {
62
+ off: 0,
63
+ heat: 1,
64
+ cool: 2,
65
+ },
66
+ fan_mode_map: {
67
+ auto: 0,
68
+ on: 1,
69
+ },
70
+ setpoint_topic: {
71
+ 1: '67-1-setpoint-1',
72
+ 2: '67-1-setpoint-2',
73
+ },
74
+ default_setpoint: '67-1-setpoint-1',
75
+ discovery_payload: {
76
+ min_temp: 50,
77
+ max_temp: 85,
78
+ modes: ['off', 'heat', 'cool'],
79
+ fan_modes: ['auto', 'on'],
80
+ action_topic: '66-1-state',
81
+ current_temperature_topic: '49-1-Air temperature',
82
+ current_temperature_template: '{{ value_json.value }}',
83
+ fan_mode_state_topic: '68-1-mode',
84
+ fan_mode_command_topic: true,
85
+ mode_state_topic: '64-1-mode',
86
+ mode_command_topic: true,
87
+ temperature_state_template: '{{ value_json.value }}',
88
+ temperature_command_topic: true,
89
+ },
90
+ };
91
+ // Eurotronic Stella Z-Wave Thermostat
92
+ // https://products.z-wavealliance.org/products/826
93
+ const STELLA_ZWAVE = {
94
+ type: 'climate',
95
+ object_id: 'thermostat',
96
+ values: [
97
+ '64-0-mode',
98
+ '49-0-Air temperature',
99
+ '67-0-setpoint-1',
100
+ '67-0-setpoint-11',
101
+ ],
102
+ mode_map: { off: 0, heat: 1, cool: 11 },
103
+ setpoint_topic: {
104
+ 1: '67-0-setpoint-1',
105
+ 11: '67-0-setpoint-11',
106
+ },
107
+ default_setpoint: '67-0-setpoint-1',
108
+ discovery_payload: {
109
+ min_temp: 0,
110
+ max_temp: 50,
111
+ modes: ['off', 'heat', 'cool'],
112
+ mode_state_topic: '64-0-mode',
113
+ mode_command_topic: true,
114
+ current_temperature_topic: '49-0-Air temperature',
115
+ temp_step: 0.5,
116
+ current_temperature_template: '{{ value_json.value }}',
117
+ temperature_state_template: '{{ value_json.value }}',
118
+ temperature_command_topic: true,
119
+ },
120
+ };
121
+ // Eurotronic Spirit Z-Wave Plus Thermostat
122
+ const SPIRIT_ZWAVE_PLUS = {
123
+ type: 'climate',
124
+ object_id: 'thermostat',
125
+ values: [
126
+ '64-0-mode',
127
+ '49-0-Air temperature',
128
+ '67-0-setpoint-1',
129
+ '67-0-setpoint-11',
130
+ ],
131
+ mode_map: { off: 0, heat: 1, cool: 11 },
132
+ setpoint_topic: {
133
+ 1: '67-0-setpoint-1',
134
+ 11: '67-0-setpoint-11',
135
+ },
136
+ default_setpoint: '67-0-setpoint-1',
137
+ discovery_payload: {
138
+ min_temp: 8,
139
+ max_temp: 28,
140
+ modes: ['off', 'heat', 'cool'],
141
+ mode_state_topic: '64-0-mode',
142
+ mode_command_topic: true,
143
+ current_temperature_topic: '49-0-Air temperature',
144
+ temp_step: 0.5,
145
+ current_temperature_template: '{{ value_json.value }}',
146
+ temperature_state_template: '{{ value_json.value }}',
147
+ temperature_command_topic: true,
148
+ },
149
+ };
150
+ const COVER = {
151
+ type: 'cover',
152
+ object_id: 'position',
153
+ values: ['38-0-currentValue', '38-0-targetValue'],
154
+ discovery_payload: {
155
+ command_topic: '38-0-targetValue',
156
+ position_topic: '38-0-currentValue',
157
+ set_position_topic: '38-0-targetValue',
158
+ position_template: '{{ (value_json.value / 99 * 100) | round(0) }}',
159
+ position_open: 99,
160
+ position_closed: 0,
161
+ payload_open: '99',
162
+ payload_close: '0',
163
+ },
164
+ };
165
+ const AEROPAC = {
166
+ type: 'fan',
167
+ object_id: 'dimmer',
168
+ values: ['38-0-currentValue', '38-0-targetValue'],
169
+ discovery_payload: {
170
+ command_topic: '38-0-targetValue',
171
+ state_topic: '38-0-currentValue',
172
+ preset_mode_command_topic: '38-0-targetValue',
173
+ preset_mode_state_topic: '38-0-currentValue',
174
+ percentage_command_topic: '38-0-targetValue',
175
+ percentage_state_topic: '38-0-currentValue',
176
+ preset_modes: [
177
+ 'off',
178
+ 'silent',
179
+ 'very low',
180
+ 'low',
181
+ 'medium',
182
+ 'high',
183
+ 'very high',
184
+ 'turbo',
185
+ ],
186
+ speed_range_min: 1,
187
+ speed_range_max: 7,
188
+ percentage_value_template: '{{ {0:0, 16: 1, 32: 2, 48: 3, 64: 4, 80: 5, 96: 6, 99: 7}[value_json.value] }}',
189
+ percentage_command_template: '{{ {0:0, 1: 16, 2: 32, 3: 48, 4: 64, 5: 80, 6: 96, 7: 99}[value] }}',
190
+ state_value_template: '{{ OFF if value_json.value == 0 else ON }}',
191
+ preset_mode_command_template: "{{ {'off': 0, 'silent': 16, 'very low': 32, 'low':48, 'medium': 64, 'high': 80, 'very high': 96, 'turbo': 99}[value] }}",
192
+ preset_mode_value_template: "{{ {0:'off', 16: 'silent', 32: 'very low', 48: 'low', 64: 'medium', 80: 'high', 96: 'very high', 99: 'turbo'}[value_json.value] }}",
193
+ },
194
+ };
195
+ const devices = {
196
+ '89-3-1': [
197
+ {
198
+ type: 'climate',
199
+ object_id: 'HRT4-ZW',
200
+ values: ['49-0-Air temperature', '67-0-setpoint-1'],
201
+ mode_map: {
202
+ off: 0,
203
+ heat: 1,
204
+ },
205
+ setpoint_topic: { 1: '67-0-setpoint-1' },
206
+ default_setpoint: '67-0-setpoint-1',
207
+ discovery_payload: {
208
+ min_temp: 5,
209
+ max_temp: 30,
210
+ modes: ['off', 'heat'],
211
+ current_temperature_topic: '49-0-Air temperature',
212
+ current_temperature_template: '{{ value_json.value }}',
213
+ temperature_state_template: '{{ value_json.value }}',
214
+ temperature_command_topic: true,
215
+ },
216
+ },
217
+ ],
218
+ '411-1-1': [
219
+ // Heatit Thermostat TF 021 (ThermoFloor AS)
220
+ {
221
+ type: 'climate',
222
+ object_id: 'thermostat',
223
+ values: [
224
+ '64-0-mode',
225
+ '49-0-Air temperature',
226
+ '67-0-setpoint-1',
227
+ '67-0-setpoint-2',
228
+ ],
229
+ mode_map: { off: 0, heat: 1, cool: 2 },
230
+ setpoint_topic: {
231
+ 1: '67-0-setpoint-1',
232
+ 2: '67-0-setpoint-2',
233
+ },
234
+ default_setpoint: '67-0-setpoint-1',
235
+ discovery_payload: {
236
+ min_temp: 15,
237
+ max_temp: 30,
238
+ modes: ['off', 'heat', 'cool'],
239
+ mode_state_topic: '64-0-mode',
240
+ mode_command_topic: true,
241
+ current_temperature_topic: '49-0-Air temperature',
242
+ current_temperature_template: '{{ value_json.value }}',
243
+ temperature_state_template: '{{ value_json.value }}',
244
+ temperature_command_topic: true,
245
+ },
246
+ },
247
+ ],
248
+ '798-1-5': [
249
+ // Inovelli LZW42 Multi-Color Bulb
250
+ {
251
+ type: 'light',
252
+ object_id: 'rgbw_bulb',
253
+ values: [
254
+ '38-0-currentValue',
255
+ '38-0-targetValue',
256
+ '51-0-currentColor',
257
+ '51-0-targetColor',
258
+ ],
259
+ discovery_payload: {
260
+ state_topic: '38-0-currentValue',
261
+ command_topic: '38-0-targetValue',
262
+ on_command_type: 'brightness',
263
+ brightness_state_topic: '38-0-currentValue',
264
+ brightness_command_topic: '38-0-targetValue',
265
+ state_value_template: '{{ "on" if value_json.value|int > 0 else "0" }}',
266
+ brightness_value_template: '{{ (value_json.value|int) | round(0) }}',
267
+ brightness_scale: '99',
268
+ color_temp_state_topic: '51-0-currentColor',
269
+ color_temp_command_template: "{{ {'warmWhite': ((0.7349 * (value - 153))|round(0)), 'coldWhite': (255 - (0.7349 * (value - 153))|round(0)), 'red': 255, 'green': 255, 'blue': 255}|to_json }}",
270
+ color_temp_command_topic: '51-0-targetColor',
271
+ color_temp_value_template: "{{ '%03d%03d' | format((value_json.value.warmWhite), (value_json.value.coldWhite)) }}",
272
+ rgb_command_template: "{{ {'warmWhite': 0, 'coldWhite': 0, 'red': red, 'green': green, 'blue': blue}|to_json }}",
273
+ rgb_command_topic: '51-0-targetColor',
274
+ rgb_state_topic: '51-0-currentColor',
275
+ rgb_value_template: '{{ value_json.value.red }},{{ value_json.value.green }},{{ value_json.value.blue }}',
276
+ min_mireds: 153,
277
+ max_mireds: 500,
278
+ payload_on: 'on',
279
+ payload_off: '0',
280
+ },
281
+ },
282
+ ],
283
+ '5-1619-20549': [
284
+ // Intermatic PE653 MultiWave Receiver
285
+ {
286
+ type: 'climate',
287
+ object_id: 'pool_thermostat',
288
+ values: ['49-0-Air temperature', '67-0-setpoint-1'],
289
+ default_setpoint: '67-0-setpoint-1',
290
+ discovery_payload: {
291
+ min_temp: 40,
292
+ max_temp: 104,
293
+ modes: ['heat'],
294
+ temperature_unit: 'F',
295
+ current_temperature_topic: '49-0-Air temperature',
296
+ current_temperature_template: '{{ value_json.value }}',
297
+ temperature_command_topic: true,
298
+ temperature_state_template: '{{ value_json.value }}',
299
+ },
300
+ },
301
+ {
302
+ type: 'climate',
303
+ object_id: 'spa_thermostat',
304
+ values: ['49-0-Air temperature', '67-0-Furnace'],
305
+ default_setpoint: '67-0-Furnace',
306
+ discovery_payload: {
307
+ min_temp: 40,
308
+ max_temp: 104,
309
+ modes: ['heat'],
310
+ temperature_unit: 'F',
311
+ current_temperature_topic: '49-0-Air temperature',
312
+ current_temperature_template: '{{ value_json.value }}',
313
+ temperature_command_topic: true,
314
+ temperature_state_template: '{{ value_json.value }}',
315
+ },
316
+ },
317
+ {
318
+ type: 'switch',
319
+ object_id: 'circuit_1',
320
+ values: ['37-1-currentValue', '37-1-targetValue'],
321
+ discovery_payload: {
322
+ payload_off: false,
323
+ payload_on: true,
324
+ state_topic: '37-1-currentValue',
325
+ command_topic: '37-1-targetValue',
326
+ value_template: '{{ value_json.value }}',
327
+ },
328
+ },
329
+ {
330
+ type: 'switch',
331
+ object_id: 'circuit_2',
332
+ values: ['37-2-currentValue', '37-2-targetValue'],
333
+ discovery_payload: {
334
+ payload_off: false,
335
+ payload_on: true,
336
+ state_topic: '37-2-currentValue',
337
+ command_topic: '37-2-targetValue',
338
+ value_template: '{{ value_json.value }}',
339
+ },
340
+ },
341
+ {
342
+ type: 'switch',
343
+ object_id: 'circuit_3',
344
+ values: ['37-3-currentValue', '37-3-targetValue'],
345
+ discovery_payload: {
346
+ payload_off: false,
347
+ payload_on: true,
348
+ state_topic: '37-3-currentValue',
349
+ command_topic: '37-3-targetValue',
350
+ value_template: '{{ value_json.value }}',
351
+ },
352
+ },
353
+ {
354
+ type: 'switch',
355
+ object_id: 'circuit_4',
356
+ values: ['37-4-currentValue', '37-4-targetValue'],
357
+ discovery_payload: {
358
+ payload_off: false,
359
+ payload_on: true,
360
+ state_topic: '37-1-currentValue',
361
+ command_topic: '37-4-targetValue',
362
+ value_template: '{{ value_json.value }}',
363
+ },
364
+ },
365
+ {
366
+ type: 'switch',
367
+ object_id: 'circuit_5',
368
+ values: ['37-5-currentValue', '37-5-targetValue'],
369
+ discovery_payload: {
370
+ payload_off: false,
371
+ payload_on: true,
372
+ state_topic: '37-5-currentValue',
373
+ command_topic: '37-5-targetValue',
374
+ value_template: '{{ value_json.value }}',
375
+ },
376
+ },
377
+ ],
378
+ '57-12593-18756': [FAN_DIMMER],
379
+ '99-12340-18756': [FAN_DIMMER],
380
+ '99-12593-18756': [FAN_DIMMER],
381
+ '99-12600-18756': [FAN_DIMMER],
382
+ '99-12850-18756': [FAN_DIMMER],
383
+ '152-12-25857': [THERMOSTAT_2GIG],
384
+ '152-263-25601': [THERMOSTAT_2GIG],
385
+ '152-256-8194': [THERMOSTAT_2GIG],
386
+ '271-4096-770': [COVER],
387
+ '328-1-1': [STELLA_ZWAVE],
388
+ '328-1-3': [SPIRIT_ZWAVE_PLUS],
389
+ '328-2-3': [SPIRIT_ZWAVE_PLUS],
390
+ '328-3-3': [SPIRIT_ZWAVE_PLUS],
391
+ '345-82-3': [COVER],
392
+ '622-23089-17235': [COVER],
393
+ '881-21-2': [SPIRIT_ZWAVE_PLUS],
394
+ '129-1-20': [AEROPAC],
395
+ '2-32784-3': [THERMOSTAT_DANFOSS], // Danfoss Room Thermostat (MT2649 / DRS21) https://products.z-wavealliance.org/products/1062
396
+ };
397
+ exports.default = devices;
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.NVM_BACKUP_PREFIX = void 0;
30
+ const store_1 = __importDefault(require("../config/store"));
31
+ const logger_1 = require("./logger");
32
+ const jsonStore_1 = __importStar(require("./jsonStore"));
33
+ const croner_1 = __importDefault(require("croner"));
34
+ const promises_1 = require("fs/promises");
35
+ const app_1 = require("../config/app");
36
+ const utils_1 = require("./utils");
37
+ exports.NVM_BACKUP_PREFIX = 'NVM_';
38
+ const logger = (0, logger_1.module)('Backup');
39
+ class BackupManager {
40
+ config;
41
+ storeJob;
42
+ nvmJob;
43
+ zwaveClient;
44
+ get default() {
45
+ return {
46
+ storeBackup: false,
47
+ storeCron: '0 0 * * *',
48
+ storeKeep: 7,
49
+ nvmBackup: false,
50
+ nvmBackupOnEvent: false,
51
+ nvmCron: '0 0 * * *',
52
+ nvmKeep: 7,
53
+ };
54
+ }
55
+ get backupOnEvent() {
56
+ return this.config.nvmBackupOnEvent;
57
+ }
58
+ nextRun(job) {
59
+ if (job?.nextRun()) {
60
+ return job.nextRun().toLocaleString();
61
+ }
62
+ return 'UNKNOWN';
63
+ }
64
+ init(zwaveClient) {
65
+ this.config = {
66
+ ...this.default,
67
+ ...jsonStore_1.default.get(store_1.default.settings).backup,
68
+ };
69
+ this.zwaveClient = zwaveClient;
70
+ if (this.storeJob) {
71
+ this.storeJob.stop();
72
+ }
73
+ if (!this.config.storeBackup) {
74
+ logger.warn('Store backup is disabled');
75
+ }
76
+ else {
77
+ this.storeJob = new croner_1.default(this.config.storeCron, this.backupStore.bind(this));
78
+ logger.info(`Backup job started with cron: ${this.config.storeCron}. Next run: ${this.nextRun(this.storeJob)}`);
79
+ }
80
+ if (this.nvmJob) {
81
+ this.nvmJob.stop();
82
+ }
83
+ if (!this.config.nvmBackup) {
84
+ logger.warn('Nvm backup is disabled');
85
+ }
86
+ else {
87
+ this.nvmJob = new croner_1.default(this.config.nvmCron, this.backupNvm.bind(this));
88
+ logger.info(`Backup job started with cron: ${this.config.nvmCron}. Next run: ${this.nextRun(this.nvmJob)}`);
89
+ }
90
+ }
91
+ async backupNvm() {
92
+ logger.info('Backup NVM started');
93
+ try {
94
+ const { fileName } = await this.zwaveClient.backupNVMRaw();
95
+ logger.info(`Backup NVM created: ${fileName}`);
96
+ if (this.nvmJob) {
97
+ logger.info(`Next NVM backup: ${this.nextRun(this.nvmJob)}`);
98
+ }
99
+ // cleanup backups dir, keep last backup files
100
+ const backups = (await (0, promises_1.readdir)(app_1.nvmBackupsDir)).filter((f) => f.startsWith(exports.NVM_BACKUP_PREFIX));
101
+ // keep last `keep` backups
102
+ if (backups.length > this.config.nvmKeep) {
103
+ const toDelete = backups.slice(0, backups.length - this.config.nvmKeep);
104
+ await Promise.all(toDelete.map(async (file) => (0, promises_1.unlink)((0, utils_1.joinPath)(app_1.nvmBackupsDir, file))));
105
+ logger.info(`Deleted ${toDelete.length} old NVM backups`);
106
+ }
107
+ }
108
+ catch (err) {
109
+ logger.error('Backup NVM failed', err);
110
+ }
111
+ }
112
+ async backupStore() {
113
+ logger.info('Backup STORE started');
114
+ try {
115
+ const backupFile = await jsonStore_1.default.backup();
116
+ logger.info(`Backup STORE created: ${backupFile}`);
117
+ if (this.storeJob) {
118
+ logger.info(`Next STORE backup: ${this.nextRun(this.storeJob)}`);
119
+ }
120
+ // cleanup backups dir, keep last backup files
121
+ const backups = (await (0, promises_1.readdir)(app_1.storeBackupsDir)).filter((f) => f.startsWith(jsonStore_1.STORE_BACKUP_PREFIX));
122
+ // keep last `keep` backups
123
+ if (backups.length > this.config.storeKeep) {
124
+ const toDelete = backups.slice(0, backups.length - this.config.storeKeep);
125
+ await Promise.all(toDelete.map(async (file) => (0, promises_1.unlink)((0, utils_1.joinPath)(app_1.storeBackupsDir, file))));
126
+ logger.info(`Deleted ${toDelete.length} old STORE backups`);
127
+ }
128
+ }
129
+ catch (err) {
130
+ logger.error('Backup STORE failed', err);
131
+ }
132
+ }
133
+ }
134
+ exports.default = new BackupManager();