@homebridge-plugins/homebridge-ecovacs 7.0.0

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,952 @@
1
+ {
2
+ "pluginAlias": "Deebot",
3
+ "pluginType": "platform",
4
+ "singular": true,
5
+ "customUi": true,
6
+ "customUiPath": "./lib/homebridge-ui",
7
+ "headerDisplay": "<p align=\"center\"><img width=\"60%\" src=\"https://user-images.githubusercontent.com/43026681/101321841-f0eb5280-385d-11eb-8dd4-f57113f6e078.png\"></p><p align=\"center\">For help and support please visit our <a href=\"https://github.com/homebridge-plugins/homebridge-ecovacs/wiki\">GitHub Wiki</a>. We hope you find this plugin useful!</p>",
8
+ "schema": {
9
+ "type": "object",
10
+ "properties": {
11
+ "name": {
12
+ "title": "Plugin Name",
13
+ "type": "string",
14
+ "default": "Deebot"
15
+ },
16
+ "useYeedi": {
17
+ "title": "Use Yeedi Login",
18
+ "type": "boolean",
19
+ "description": "Enable this for Yeedi login instead of ECOVACS."
20
+ },
21
+ "countryCode": {
22
+ "title": "Country Code",
23
+ "description": "Two-letter country code which you can find <a href=\"https://github.com/homebridge-plugins/homebridge-ecovacs/wiki/Country-Codes\" target=\"_blank\">here</a>.",
24
+ "type": "string",
25
+ "required": true
26
+ },
27
+ "username": {
28
+ "title": "ECOVACS/Yeedi Username",
29
+ "required": true,
30
+ "type": "string",
31
+ "description": "Your username, if your account is based in China you should use your ECOVACS ID."
32
+ },
33
+ "password": {
34
+ "title": "ECOVACS/Yeedi Password",
35
+ "required": true,
36
+ "type": "string",
37
+ "description": "Your password, can also be a base64 encoded version of your password."
38
+ },
39
+ "disableDeviceLogging": {
40
+ "type": "boolean",
41
+ "title": "Disable Device Logging",
42
+ "description": "Global logging setting for accessory status changes. If true then accessory status changes will not be logged."
43
+ },
44
+ "devices": {
45
+ "title": "Device Settings",
46
+ "description": "Optional settings for your devices.",
47
+ "type": "array",
48
+ "items": {
49
+ "type": "object",
50
+ "properties": {
51
+ "label": {
52
+ "title": "Label",
53
+ "type": "string",
54
+ "description": "This setting has no effect except to help identify this device."
55
+ },
56
+ "deviceId": {
57
+ "title": "Device ID",
58
+ "type": "string",
59
+ "description": "ECOVACS Device ID of the device these settings apply to, can be of format E2000000000000000000 or 11111111-aaaa-bbbb-2222-cccccccccccc."
60
+ },
61
+ "ignoreDevice": {
62
+ "type": "boolean",
63
+ "title": "Hide From HomeKit",
64
+ "description": "If true, this accessory will be removed and ignored from HomeKit.",
65
+ "condition": {
66
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0);"
67
+ }
68
+ },
69
+ "pollInterval": {
70
+ "title": "Polling Interval",
71
+ "type": "integer",
72
+ "placeholder": 120,
73
+ "description": "An interval (in seconds) in which this device will refresh with ECOVACS. Set to 0 to disable, otherwise must be 30 or more."
74
+ },
75
+ "hideMotionSensor": {
76
+ "title": "Hide Motion Sensor",
77
+ "type": "boolean",
78
+ "description": "If true, the motion sensor for device alerts will be hidden.",
79
+ "condition": {
80
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice);"
81
+ }
82
+ },
83
+ "motionDuration": {
84
+ "title": "Alert Notification Time",
85
+ "type": "integer",
86
+ "placeholder": 30,
87
+ "minimum": 1,
88
+ "description": "The length of time (in seconds) that the motion detector will be activated if your Deebot sends a message, needs help or has low battery (if enabled below). The message is viewable in the log. Must be 1 or more.",
89
+ "condition": {
90
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.hideMotionSensor && !model?.devices?.[arrayIndices]?.ignoreDevice);"
91
+ }
92
+ },
93
+ "lowBattThreshold": {
94
+ "title": "Low Battery Threshold",
95
+ "type": "integer",
96
+ "placeholder": 15,
97
+ "minimum": 1,
98
+ "description": "The battery percentage at which the plugin should display a low battery status. Leave blank to match the Deebot default of 15%. Must be 1 or more.",
99
+ "condition": {
100
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice);"
101
+ }
102
+ },
103
+ "showMotionLowBatt": {
104
+ "title": "Low Battery Motion Sensor",
105
+ "type": "boolean",
106
+ "description": "If true, the motion sensor will activate when the Deebot's battery reaches the low battery threshold.",
107
+ "condition": {
108
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.hideMotionSensor && !model?.devices?.[arrayIndices]?.ignoreDevice);"
109
+ }
110
+ },
111
+ "showBattHumidity": {
112
+ "title": "Show (Humidity) Battery Sensor",
113
+ "type": "boolean",
114
+ "description": "If true, a humidity sensor showing the battery percentage will be shown.",
115
+ "condition": {
116
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice);"
117
+ }
118
+ },
119
+ "showAirDryingSwitch": {
120
+ "title": "Show Air Drying Switch",
121
+ "type": "string",
122
+ "oneOf": [
123
+ {
124
+ "title": "Presetting",
125
+ "enum": ["presetting"]
126
+ },
127
+ {
128
+ "title": "Yes",
129
+ "enum": ["yes"]
130
+ },
131
+ {
132
+ "title": "No",
133
+ "enum": ["no"]
134
+ }
135
+ ],
136
+ "condition": {
137
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice);"
138
+ }
139
+ },
140
+ "supportTrueDetect": {
141
+ "title": "Support TrueDetect",
142
+ "type": "boolean",
143
+ "condition": {
144
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice);"
145
+ }
146
+ },
147
+ "areaType1": {
148
+ "title": "Area Type",
149
+ "type": "string",
150
+ "oneOf": [
151
+ { "title": "Spot Area", "enum": ["spotArea"] },
152
+ { "title": "Custom Area", "enum": ["customArea"] }
153
+ ]
154
+ },
155
+ "spotAreaIDs1": {
156
+ "title": "Spot Area ID(s)",
157
+ "type": "string",
158
+ "required": true,
159
+ "description": "Enter a spot area ID or multiple IDs separated by a comma.",
160
+ "pattern": "^([0-9]|[1-9][0-9]+|(([0-9],|[1-9][0-9]+,)+([0-9]|[1-9][0-9]+)))$",
161
+ "condition": {
162
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType1 == 'spotArea' );"
163
+ }
164
+ },
165
+ "customAreaCoordinates1": {
166
+ "title": "Custom Area Coordinates",
167
+ "type": "string",
168
+ "required": true,
169
+ "description": "Enter custom area coordinates in the format 'x1,y1,x2,y2' (decimals separated by '.' and without the inverted comma).",
170
+ "pattern": "^((0|-?[1-9][0-9]*)(\\.[0-9]+)?,){3}(0|-?[1-9][0-9]*)(\\.[0-9]+)?$",
171
+ "condition": {
172
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType1 == 'customArea' );"
173
+ }
174
+ },
175
+ "areaNote1": {
176
+ "title": "Note",
177
+ "type": "string",
178
+ "description": "Enter a note for this predefined area.",
179
+ "condition": {
180
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType1);"
181
+ }
182
+ },
183
+ "areaType2": {
184
+ "title": "Area Type",
185
+ "type": "string",
186
+ "oneOf": [
187
+ { "title": "Spot Area", "enum": ["spotArea"] },
188
+ { "title": "Custom Area", "enum": ["customArea"] }
189
+ ]
190
+ },
191
+ "spotAreaIDs2": {
192
+ "title": "Spot Area ID(s)",
193
+ "type": "string",
194
+ "required": true,
195
+ "description": "Enter a spot area ID or multiple IDs separated by a comma.",
196
+ "pattern": "^([0-9]|[1-9][0-9]+|(([0-9],|[1-9][0-9]+,)+([0-9]|[1-9][0-9]+)))$",
197
+ "condition": {
198
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType2 == 'spotArea' );"
199
+ }
200
+ },
201
+ "customAreaCoordinates2": {
202
+ "title": "Custom Area Coordinates",
203
+ "type": "string",
204
+ "required": true,
205
+ "description": "Enter custom area coordinates in the format 'x1,y1,x2,y2' (decimals separated by '.' and without the inverted comma).",
206
+ "pattern": "^((0|-?[1-9][0-9]*)(\\.[0-9]+)?,){3}(0|-?[1-9][0-9]*)(\\.[0-9]+)?$",
207
+ "condition": {
208
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType2 == 'customArea' );"
209
+ }
210
+ },
211
+ "areaNote2": {
212
+ "title": "Note",
213
+ "type": "string",
214
+ "description": "Enter a note for this predefined area.",
215
+ "condition": {
216
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType2);"
217
+ }
218
+ },
219
+ "areaType3": {
220
+ "title": "Area Type",
221
+ "type": "string",
222
+ "oneOf": [
223
+ { "title": "Spot Area", "enum": ["spotArea"] },
224
+ { "title": "Custom Area", "enum": ["customArea"] }
225
+ ]
226
+ },
227
+ "spotAreaIDs3": {
228
+ "title": "Spot Area ID(s)",
229
+ "type": "string",
230
+ "required": true,
231
+ "description": "Enter a spot area ID or multiple IDs separated by a comma.",
232
+ "pattern": "^([0-9]|[1-9][0-9]+|(([0-9],|[1-9][0-9]+,)+([0-9]|[1-9][0-9]+)))$",
233
+ "condition": {
234
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType3 == 'spotArea' );"
235
+ }
236
+ },
237
+ "customAreaCoordinates3": {
238
+ "title": "Custom Area Coordinates",
239
+ "type": "string",
240
+ "required": true,
241
+ "description": "Enter custom area coordinates in the format 'x1,y1,x2,y2' (decimals separated by '.' and without the inverted comma).",
242
+ "pattern": "^((0|-?[1-9][0-9]*)(\\.[0-9]+)?,){3}(0|-?[1-9][0-9]*)(\\.[0-9]+)?$",
243
+ "condition": {
244
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType3 == 'customArea' );"
245
+ }
246
+ },
247
+ "areaNote3": {
248
+ "title": "Note",
249
+ "type": "string",
250
+ "description": "Enter a note for this predefined area.",
251
+ "condition": {
252
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType3);"
253
+ }
254
+ },
255
+ "areaType4": {
256
+ "title": "Area Type",
257
+ "type": "string",
258
+ "oneOf": [
259
+ { "title": "Spot Area", "enum": ["spotArea"] },
260
+ { "title": "Custom Area", "enum": ["customArea"] }
261
+ ]
262
+ },
263
+ "spotAreaIDs4": {
264
+ "title": "Spot Area ID(s)",
265
+ "type": "string",
266
+ "required": true,
267
+ "description": "Enter a spot area ID or multiple IDs separated by a comma.",
268
+ "pattern": "^([0-9]|[1-9][0-9]+|(([0-9],|[1-9][0-9]+,)+([0-9]|[1-9][0-9]+)))$",
269
+ "condition": {
270
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType4 == 'spotArea' );"
271
+ }
272
+ },
273
+ "customAreaCoordinates4": {
274
+ "title": "Custom Area Coordinates",
275
+ "type": "string",
276
+ "required": true,
277
+ "description": "Enter custom area coordinates in the format 'x1,y1,x2,y2' (decimals separated by '.' and without the inverted comma).",
278
+ "pattern": "^((0|-?[1-9][0-9]*)(\\.[0-9]+)?,){3}(0|-?[1-9][0-9]*)(\\.[0-9]+)?$",
279
+ "condition": {
280
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType4 == 'customArea' );"
281
+ }
282
+ },
283
+ "areaNote4": {
284
+ "title": "Note",
285
+ "type": "string",
286
+ "description": "Enter a note for this predefined area.",
287
+ "condition": {
288
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType4);"
289
+ }
290
+ },
291
+ "areaType5": {
292
+ "title": "Area Type",
293
+ "type": "string",
294
+ "oneOf": [
295
+ { "title": "Spot Area", "enum": ["spotArea"] },
296
+ { "title": "Custom Area", "enum": ["customArea"] }
297
+ ]
298
+ },
299
+ "spotAreaIDs5": {
300
+ "title": "Spot Area ID(s)",
301
+ "type": "string",
302
+ "required": true,
303
+ "description": "Enter a spot area ID or multiple IDs separated by a comma.",
304
+ "pattern": "^([0-9]|[1-9][0-9]+|(([0-9],|[1-9][0-9]+,)+([0-9]|[1-9][0-9]+)))$",
305
+ "condition": {
306
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType5 == 'spotArea' );"
307
+ }
308
+ },
309
+ "customAreaCoordinates5": {
310
+ "title": "Custom Area Coordinates",
311
+ "type": "string",
312
+ "required": true,
313
+ "description": "Enter custom area coordinates in the format 'x1,y1,x2,y2' (decimals separated by '.' and without the inverted comma).",
314
+ "pattern": "^((0|-?[1-9][0-9]*)(\\.[0-9]+)?,){3}(0|-?[1-9][0-9]*)(\\.[0-9]+)?$",
315
+ "condition": {
316
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType5 == 'customArea' );"
317
+ }
318
+ },
319
+ "areaNote5": {
320
+ "title": "Note",
321
+ "type": "string",
322
+ "description": "Enter a note for this predefined area.",
323
+ "condition": {
324
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType5);"
325
+ }
326
+ },
327
+ "areaType6": {
328
+ "title": "Area Type",
329
+ "type": "string",
330
+ "oneOf": [
331
+ { "title": "Spot Area", "enum": ["spotArea"] },
332
+ { "title": "Custom Area", "enum": ["customArea"] }
333
+ ]
334
+ },
335
+ "spotAreaIDs6": {
336
+ "title": "Spot Area ID(s)",
337
+ "type": "string",
338
+ "required": true,
339
+ "description": "Enter a spot area ID or multiple IDs separated by a comma.",
340
+ "pattern": "^([0-9]|[1-9][0-9]+|(([0-9],|[1-9][0-9]+,)+([0-9]|[1-9][0-9]+)))$",
341
+ "condition": {
342
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType6 == 'spotArea' );"
343
+ }
344
+ },
345
+ "customAreaCoordinates6": {
346
+ "title": "Custom Area Coordinates",
347
+ "type": "string",
348
+ "required": true,
349
+ "description": "Enter custom area coordinates in the format 'x1,y1,x2,y2' (decimals separated by '.' and without the inverted comma).",
350
+ "pattern": "^((0|-?[1-9][0-9]*)(\\.[0-9]+)?,){3}(0|-?[1-9][0-9]*)(\\.[0-9]+)?$",
351
+ "condition": {
352
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType6 == 'customArea' );"
353
+ }
354
+ },
355
+ "areaNote6": {
356
+ "title": "Note",
357
+ "type": "string",
358
+ "description": "Enter a note for this predefined area.",
359
+ "condition": {
360
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType6);"
361
+ }
362
+ },
363
+ "areaType7": {
364
+ "title": "Area Type",
365
+ "type": "string",
366
+ "oneOf": [
367
+ { "title": "Spot Area", "enum": ["spotArea"] },
368
+ { "title": "Custom Area", "enum": ["customArea"] }
369
+ ]
370
+ },
371
+ "spotAreaIDs7": {
372
+ "title": "Spot Area ID(s)",
373
+ "type": "string",
374
+ "required": true,
375
+ "description": "Enter a spot area ID or multiple IDs separated by a comma.",
376
+ "pattern": "^([0-9]|[1-9][0-9]+|(([0-9],|[1-9][0-9]+,)+([0-9]|[1-9][0-9]+)))$",
377
+ "condition": {
378
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType7 == 'spotArea' );"
379
+ }
380
+ },
381
+ "customAreaCoordinates7": {
382
+ "title": "Custom Area Coordinates",
383
+ "type": "string",
384
+ "required": true,
385
+ "description": "Enter custom area coordinates in the format 'x1,y1,x2,y2' (decimals separated by '.' and without the inverted comma).",
386
+ "pattern": "^((0|-?[1-9][0-9]*)(\\.[0-9]+)?,){3}(0|-?[1-9][0-9]*)(\\.[0-9]+)?$",
387
+ "condition": {
388
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType7 == 'customArea' );"
389
+ }
390
+ },
391
+ "areaNote7": {
392
+ "title": "Note",
393
+ "type": "string",
394
+ "description": "Enter a note for this predefined area.",
395
+ "condition": {
396
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType7);"
397
+ }
398
+ },
399
+ "areaType8": {
400
+ "title": "Area Type",
401
+ "type": "string",
402
+ "oneOf": [
403
+ { "title": "Spot Area", "enum": ["spotArea"] },
404
+ { "title": "Custom Area", "enum": ["customArea"] }
405
+ ]
406
+ },
407
+ "spotAreaIDs8": {
408
+ "title": "Spot Area ID(s)",
409
+ "type": "string",
410
+ "required": true,
411
+ "description": "Enter a spot area ID or multiple IDs separated by a comma.",
412
+ "pattern": "^([0-9]|[1-9][0-9]+|(([0-9],|[1-9][0-9]+,)+([0-9]|[1-9][0-9]+)))$",
413
+ "condition": {
414
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType8 == 'spotArea' );"
415
+ }
416
+ },
417
+ "customAreaCoordinates8": {
418
+ "title": "Custom Area Coordinates",
419
+ "type": "string",
420
+ "required": true,
421
+ "description": "Enter custom area coordinates in the format 'x1,y1,x2,y2' (decimals separated by '.' and without the inverted comma).",
422
+ "pattern": "^((0|-?[1-9][0-9]*)(\\.[0-9]+)?,){3}(0|-?[1-9][0-9]*)(\\.[0-9]+)?$",
423
+ "condition": {
424
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType8 == 'customArea' );"
425
+ }
426
+ },
427
+ "areaNote8": {
428
+ "title": "Note",
429
+ "type": "string",
430
+ "description": "Enter a note for this predefined area.",
431
+ "condition": {
432
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType8);"
433
+ }
434
+ },
435
+ "areaType9": {
436
+ "title": "Area Type",
437
+ "type": "string",
438
+ "oneOf": [
439
+ { "title": "Spot Area", "enum": ["spotArea"] },
440
+ { "title": "Custom Area", "enum": ["customArea"] }
441
+ ]
442
+ },
443
+ "spotAreaIDs9": {
444
+ "title": "Spot Area ID(s)",
445
+ "type": "string",
446
+ "required": true,
447
+ "description": "Enter a spot area ID or multiple IDs separated by a comma.",
448
+ "pattern": "^([0-9]|[1-9][0-9]+|(([0-9],|[1-9][0-9]+,)+([0-9]|[1-9][0-9]+)))$",
449
+ "condition": {
450
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType9 == 'spotArea' );"
451
+ }
452
+ },
453
+ "customAreaCoordinates9": {
454
+ "title": "Custom Area Coordinates",
455
+ "type": "string",
456
+ "required": true,
457
+ "description": "Enter custom area coordinates in the format 'x1,y1,x2,y2' (decimals separated by '.' and without the inverted comma).",
458
+ "pattern": "^((0|-?[1-9][0-9]*)(\\.[0-9]+)?,){3}(0|-?[1-9][0-9]*)(\\.[0-9]+)?$",
459
+ "condition": {
460
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType9 == 'customArea' );"
461
+ }
462
+ },
463
+ "areaNote9": {
464
+ "title": "Note",
465
+ "type": "string",
466
+ "description": "Enter a note for this predefined area.",
467
+ "condition": {
468
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType9);"
469
+ }
470
+ },
471
+ "areaType10": {
472
+ "title": "Area Type",
473
+ "type": "string",
474
+ "oneOf": [
475
+ { "title": "Spot Area", "enum": ["spotArea"] },
476
+ { "title": "Custom Area", "enum": ["customArea"] }
477
+ ]
478
+ },
479
+ "spotAreaIDs10": {
480
+ "title": "Spot Area ID(s)",
481
+ "type": "string",
482
+ "required": true,
483
+ "description": "Enter a spot area ID or multiple IDs separated by a comma.",
484
+ "pattern": "^([0-9]|[1-9][0-9]+|(([0-9],|[1-9][0-9]+,)+([0-9]|[1-9][0-9]+)))$",
485
+ "condition": {
486
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType10 == 'spotArea' );"
487
+ }
488
+ },
489
+ "customAreaCoordinates10": {
490
+ "title": "Custom Area Coordinates",
491
+ "type": "string",
492
+ "required": true,
493
+ "description": "Enter custom area coordinates in the format 'x1,y1,x2,y2' (decimals separated by '.' and without the inverted comma).",
494
+ "pattern": "^((0|-?[1-9][0-9]*)(\\.[0-9]+)?,){3}(0|-?[1-9][0-9]*)(\\.[0-9]+)?$",
495
+ "condition": {
496
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType10 == 'customArea' );"
497
+ }
498
+ },
499
+ "areaNote10": {
500
+ "title": "Note",
501
+ "type": "string",
502
+ "description": "Enter a note for this predefined area.",
503
+ "condition": {
504
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType10);"
505
+ }
506
+ },
507
+ "areaType11": {
508
+ "title": "Area Type",
509
+ "type": "string",
510
+ "oneOf": [
511
+ { "title": "Spot Area", "enum": ["spotArea"] },
512
+ { "title": "Custom Area", "enum": ["customArea"] }
513
+ ]
514
+ },
515
+ "spotAreaIDs11": {
516
+ "title": "Spot Area ID(s)",
517
+ "type": "string",
518
+ "required": true,
519
+ "description": "Enter a spot area ID or multiple IDs separated by a comma.",
520
+ "pattern": "^([0-9]|[1-9][0-9]+|(([0-9],|[1-9][0-9]+,)+([0-9]|[1-9][0-9]+)))$",
521
+ "condition": {
522
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType11 == 'spotArea' );"
523
+ }
524
+ },
525
+ "customAreaCoordinates11": {
526
+ "title": "Custom Area Coordinates",
527
+ "type": "string",
528
+ "required": true,
529
+ "description": "Enter custom area coordinates in the format 'x1,y1,x2,y2' (decimals separated by '.' and without the inverted comma).",
530
+ "pattern": "^((0|-?[1-9][0-9]*)(\\.[0-9]+)?,){3}(0|-?[1-9][0-9]*)(\\.[0-9]+)?$",
531
+ "condition": {
532
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType11 == 'customArea' );"
533
+ }
534
+ },
535
+ "areaNote11": {
536
+ "title": "Note",
537
+ "type": "string",
538
+ "description": "Enter a note for this predefined area.",
539
+ "condition": {
540
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType11);"
541
+ }
542
+ },
543
+ "areaType12": {
544
+ "title": "Area Type",
545
+ "type": "string",
546
+ "oneOf": [
547
+ { "title": "Spot Area", "enum": ["spotArea"] },
548
+ { "title": "Custom Area", "enum": ["customArea"] }
549
+ ]
550
+ },
551
+ "spotAreaIDs12": {
552
+ "title": "Spot Area ID(s)",
553
+ "type": "string",
554
+ "required": true,
555
+ "description": "Enter a spot area ID or multiple IDs separated by a comma.",
556
+ "pattern": "^([0-9]|[1-9][0-9]+|(([0-9],|[1-9][0-9]+,)+([0-9]|[1-9][0-9]+)))$",
557
+ "condition": {
558
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType12 == 'spotArea' );"
559
+ }
560
+ },
561
+ "customAreaCoordinates12": {
562
+ "title": "Custom Area Coordinates",
563
+ "type": "string",
564
+ "required": true,
565
+ "description": "Enter custom area coordinates in the format 'x1,y1,x2,y2' (decimals separated by '.' and without the inverted comma).",
566
+ "pattern": "^((0|-?[1-9][0-9]*)(\\.[0-9]+)?,){3}(0|-?[1-9][0-9]*)(\\.[0-9]+)?$",
567
+ "condition": {
568
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType12 == 'customArea' );"
569
+ }
570
+ },
571
+ "areaNote12": {
572
+ "title": "Note",
573
+ "type": "string",
574
+ "description": "Enter a note for this predefined area.",
575
+ "condition": {
576
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType12);"
577
+ }
578
+ },
579
+ "areaType13": {
580
+ "title": "Area Type",
581
+ "type": "string",
582
+ "oneOf": [
583
+ { "title": "Spot Area", "enum": ["spotArea"] },
584
+ { "title": "Custom Area", "enum": ["customArea"] }
585
+ ]
586
+ },
587
+ "spotAreaIDs13": {
588
+ "title": "Spot Area ID(s)",
589
+ "type": "string",
590
+ "required": true,
591
+ "description": "Enter a spot area ID or multiple IDs separated by a comma.",
592
+ "pattern": "^([0-9]|[1-9][0-9]+|(([0-9],|[1-9][0-9]+,)+([0-9]|[1-9][0-9]+)))$",
593
+ "condition": {
594
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType13 == 'spotArea' );"
595
+ }
596
+ },
597
+ "customAreaCoordinates13": {
598
+ "title": "Custom Area Coordinates",
599
+ "type": "string",
600
+ "required": true,
601
+ "description": "Enter custom area coordinates in the format 'x1,y1,x2,y2' (decimals separated by '.' and without the inverted comma).",
602
+ "pattern": "^((0|-?[1-9][0-9]*)(\\.[0-9]+)?,){3}(0|-?[1-9][0-9]*)(\\.[0-9]+)?$",
603
+ "condition": {
604
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType13 == 'customArea' );"
605
+ }
606
+ },
607
+ "areaNote13": {
608
+ "title": "Note",
609
+ "type": "string",
610
+ "description": "Enter a note for this predefined area.",
611
+ "condition": {
612
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType13);"
613
+ }
614
+ },
615
+ "areaType14": {
616
+ "title": "Area Type",
617
+ "type": "string",
618
+ "oneOf": [
619
+ { "title": "Spot Area", "enum": ["spotArea"] },
620
+ { "title": "Custom Area", "enum": ["customArea"] }
621
+ ]
622
+ },
623
+ "spotAreaIDs14": {
624
+ "title": "Spot Area ID(s)",
625
+ "type": "string",
626
+ "required": true,
627
+ "description": "Enter a spot area ID or multiple IDs separated by a comma.",
628
+ "pattern": "^([0-9]|[1-9][0-9]+|(([0-9],|[1-9][0-9]+,)+([0-9]|[1-9][0-9]+)))$",
629
+ "condition": {
630
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType14 == 'spotArea' );"
631
+ }
632
+ },
633
+ "customAreaCoordinates14": {
634
+ "title": "Custom Area Coordinates",
635
+ "type": "string",
636
+ "required": true,
637
+ "description": "Enter custom area coordinates in the format 'x1,y1,x2,y2' (decimals separated by '.' and without the inverted comma).",
638
+ "pattern": "^((0|-?[1-9][0-9]*)(\\.[0-9]+)?,){3}(0|-?[1-9][0-9]*)(\\.[0-9]+)?$",
639
+ "condition": {
640
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType14 == 'customArea' );"
641
+ }
642
+ },
643
+ "areaNote14": {
644
+ "title": "Note",
645
+ "type": "string",
646
+ "description": "Enter a note for this predefined area.",
647
+ "condition": {
648
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType14);"
649
+ }
650
+ },
651
+ "areaType15": {
652
+ "title": "Area Type",
653
+ "type": "string",
654
+ "oneOf": [
655
+ { "title": "Spot Area", "enum": ["spotArea"] },
656
+ { "title": "Custom Area", "enum": ["customArea"] }
657
+ ]
658
+ },
659
+ "spotAreaIDs15": {
660
+ "title": "Spot Area ID(s)",
661
+ "type": "string",
662
+ "required": true,
663
+ "description": "Enter a spot area ID or multiple IDs separated by a comma.",
664
+ "pattern": "^([0-9]|[1-9][0-9]+|(([0-9],|[1-9][0-9]+,)+([0-9]|[1-9][0-9]+)))$",
665
+ "condition": {
666
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType15 == 'spotArea' );"
667
+ }
668
+ },
669
+ "customAreaCoordinates15": {
670
+ "title": "Custom Area Coordinates",
671
+ "type": "string",
672
+ "required": true,
673
+ "description": "Enter custom area coordinates in the format 'x1,y1,x2,y2' (decimals separated by '.' and without the inverted comma).",
674
+ "pattern": "^((0|-?[1-9][0-9]*)(\\.[0-9]+)?,){3}(0|-?[1-9][0-9]*)(\\.[0-9]+)?$",
675
+ "condition": {
676
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType15 == 'customArea' );"
677
+ }
678
+ },
679
+ "areaNote15": {
680
+ "title": "Note",
681
+ "type": "string",
682
+ "description": "Enter a note for this predefined area.",
683
+ "condition": {
684
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType15);"
685
+ }
686
+ }
687
+ }
688
+ }
689
+ }
690
+ }
691
+ },
692
+ "layout": [
693
+ {
694
+ "type": "fieldset",
695
+ "title": "Required Settings",
696
+ "items": ["useYeedi", "countryCode", "username", "password"]
697
+ },
698
+ {
699
+ "type": "fieldset",
700
+ "title": "Optional Settings",
701
+ "expandable": true,
702
+ "items": ["disableDeviceLogging", "refreshTime"]
703
+ },
704
+ {
705
+ "key": "devices",
706
+ "title": "Device Settings",
707
+ "description": "Optional settings for your devices.",
708
+ "expandable": true,
709
+ "add": "Add Another Device",
710
+ "type": "array",
711
+ "items": [
712
+ {
713
+ "type": "fieldset",
714
+ "items": [
715
+ "devices[].label",
716
+ "devices[].deviceId",
717
+ "devices[].ignoreDevice",
718
+ "devices[].pollInterval",
719
+ "devices[].hideMotionSensor",
720
+ "devices[].motionDuration",
721
+ "devices[].lowBattThreshold",
722
+ "devices[].showMotionLowBatt",
723
+ "devices[].showBattHumidity",
724
+ "devices[].showAirDryingSwitch",
725
+ "devices[].supportTrueDetect",
726
+ {
727
+ "expandable": true,
728
+ "title": "Predefined Areas",
729
+ "type": "fieldset",
730
+ "condition": {
731
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice);"
732
+ },
733
+ "description": "Create Eve app buttons for cleaning predefined 'Spot Areas' or 'Custom Areas'. <a href=\"https://github.com/homebridge-plugins/homebridge-ecovacs/wiki/Predefined-Areas\" target=\"_blank\">Read more →</a>",
734
+ "items": [
735
+ {
736
+ "expandable": false,
737
+ "title": "Area 1",
738
+ "type": "fieldset",
739
+ "condition": {
740
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice);"
741
+ },
742
+ "items": [
743
+ "devices[].areaType1",
744
+ "devices[].spotAreaIDs1",
745
+ "devices[].customAreaCoordinates1",
746
+ "devices[].areaNote1"
747
+ ]
748
+ },
749
+ {
750
+ "expandable": false,
751
+ "title": "Area 2",
752
+ "type": "fieldset",
753
+ "condition": {
754
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType1);"
755
+ },
756
+ "items": [
757
+ "devices[].areaType2",
758
+ "devices[].spotAreaIDs2",
759
+ "devices[].customAreaCoordinates2",
760
+ "devices[].areaNote2"
761
+ ]
762
+ },
763
+ {
764
+ "expandable": false,
765
+ "title": "Area 3",
766
+ "type": "fieldset",
767
+ "condition": {
768
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType2);"
769
+ },
770
+ "items": [
771
+ "devices[].areaType3",
772
+ "devices[].spotAreaIDs3",
773
+ "devices[].customAreaCoordinates3",
774
+ "devices[].areaNote3"
775
+ ]
776
+ },
777
+ {
778
+ "expandable": false,
779
+ "title": "Area 4",
780
+ "type": "fieldset",
781
+ "condition": {
782
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType3);"
783
+ },
784
+ "items": [
785
+ "devices[].areaType4",
786
+ "devices[].spotAreaIDs4",
787
+ "devices[].customAreaCoordinates4",
788
+ "devices[].areaNote4"
789
+ ]
790
+ },
791
+ {
792
+ "expandable": false,
793
+ "title": "Area 5",
794
+ "type": "fieldset",
795
+ "condition": {
796
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType4);"
797
+ },
798
+ "items": [
799
+ "devices[].areaType5",
800
+ "devices[].spotAreaIDs5",
801
+ "devices[].customAreaCoordinates5",
802
+ "devices[].areaNote5"
803
+ ]
804
+ },
805
+ {
806
+ "expandable": false,
807
+ "title": "Area 6",
808
+ "type": "fieldset",
809
+ "condition": {
810
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType5);"
811
+ },
812
+ "items": [
813
+ "devices[].areaType6",
814
+ "devices[].spotAreaIDs6",
815
+ "devices[].customAreaCoordinates6",
816
+ "devices[].areaNote6"
817
+ ]
818
+ },
819
+ {
820
+ "expandable": false,
821
+ "title": "Area 7",
822
+ "type": "fieldset",
823
+ "condition": {
824
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType6);"
825
+ },
826
+ "items": [
827
+ "devices[].areaType7",
828
+ "devices[].spotAreaIDs7",
829
+ "devices[].customAreaCoordinates7",
830
+ "devices[].areaNote7"
831
+ ]
832
+ },
833
+ {
834
+ "expandable": false,
835
+ "title": "Area 8",
836
+ "type": "fieldset",
837
+ "condition": {
838
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType7);"
839
+ },
840
+ "items": [
841
+ "devices[].areaType8",
842
+ "devices[].spotAreaIDs8",
843
+ "devices[].customAreaCoordinates8",
844
+ "devices[].areaNote8"
845
+ ]
846
+ },
847
+ {
848
+ "expandable": false,
849
+ "title": "Area 9",
850
+ "type": "fieldset",
851
+ "condition": {
852
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType8);"
853
+ },
854
+ "items": [
855
+ "devices[].areaType9",
856
+ "devices[].spotAreaIDs9",
857
+ "devices[].customAreaCoordinates9",
858
+ "devices[].areaNote9"
859
+ ]
860
+ },
861
+ {
862
+ "expandable": false,
863
+ "title": "Area 10",
864
+ "type": "fieldset",
865
+ "condition": {
866
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType9);"
867
+ },
868
+ "items": [
869
+ "devices[].areaType10",
870
+ "devices[].spotAreaIDs10",
871
+ "devices[].customAreaCoordinates10",
872
+ "devices[].areaNote10"
873
+ ]
874
+ },
875
+ {
876
+ "expandable": false,
877
+ "title": "Area 11",
878
+ "type": "fieldset",
879
+ "condition": {
880
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType10);"
881
+ },
882
+ "items": [
883
+ "devices[].areaType11",
884
+ "devices[].spotAreaIDs11",
885
+ "devices[].customAreaCoordinates11",
886
+ "devices[].areaNote11"
887
+ ]
888
+ },
889
+ {
890
+ "expandable": false,
891
+ "title": "Area 12",
892
+ "type": "fieldset",
893
+ "condition": {
894
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType11);"
895
+ },
896
+ "items": [
897
+ "devices[].areaType12",
898
+ "devices[].spotAreaIDs12",
899
+ "devices[].customAreaCoordinates12",
900
+ "devices[].areaNote12"
901
+ ]
902
+ },
903
+ {
904
+ "expandable": false,
905
+ "title": "Area 13",
906
+ "type": "fieldset",
907
+ "condition": {
908
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType12);"
909
+ },
910
+ "items": [
911
+ "devices[].areaType13",
912
+ "devices[].spotAreaIDs13",
913
+ "devices[].customAreaCoordinates13",
914
+ "devices[].areaNote13"
915
+ ]
916
+ },
917
+ {
918
+ "expandable": false,
919
+ "title": "Area 14",
920
+ "type": "fieldset",
921
+ "condition": {
922
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType13);"
923
+ },
924
+ "items": [
925
+ "devices[].areaType14",
926
+ "devices[].spotAreaIDs14",
927
+ "devices[].customAreaCoordinates14",
928
+ "devices[].areaNote14"
929
+ ]
930
+ },
931
+ {
932
+ "expandable": false,
933
+ "title": "Area 15",
934
+ "type": "fieldset",
935
+ "condition": {
936
+ "functionBody": "return (model?.devices?.[arrayIndices]?.deviceId?.length > 0 && !model?.devices?.[arrayIndices]?.ignoreDevice && model?.devices?.[arrayIndices]?.areaType14);"
937
+ },
938
+ "items": [
939
+ "devices[].areaType15",
940
+ "devices[].spotAreaIDs15",
941
+ "devices[].customAreaCoordinates15",
942
+ "devices[].areaNote15"
943
+ ]
944
+ }
945
+ ]
946
+ }
947
+ ]
948
+ }
949
+ ]
950
+ }
951
+ ]
952
+ }