node-red-contrib-alarm-ultimate 0.1.1 → 0.1.3

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,834 @@
1
+ [
2
+ {
3
+ "id": "c0a4b6d3e5f70819",
4
+ "type": "tab",
5
+ "label": "Alarm Ultimate - Dashboard V2 (FlowFuse)",
6
+ "disabled": false,
7
+ "info": ""
8
+ },
9
+ {
10
+ "id": "d1b5c7e4f608192a",
11
+ "type": "comment",
12
+ "z": "c0a4b6d3e5f70819",
13
+ "name": "Requires @flowfuse/node-red-dashboard",
14
+ "info": "Install `@flowfuse/node-red-dashboard` (Dashboard 2.0), then import this flow.\n\nDashboard V2 URLs (default):\n- Panel: http://<node-red-host>:1880/dashboard/panel\n- Controls: http://<node-red-host>:1880/dashboard/controls\n- Sensors: http://<node-red-host>:1880/dashboard/sensors\n- Zones: http://<node-red-host>:1880/dashboard/zones\n- Log: http://<node-red-host>:1880/dashboard/log\n- Status: http://<node-red-host>:1880/dashboard/status\n\nNotes:\n- If you changed the Dashboard path in the `ui-base` config, adjust `/dashboard` accordingly.\n- The embedded Alarm Panel is served from Node-RED *admin* endpoints (`/alarm-ultimate/alarm-panel`).",
15
+ "x": 290,
16
+ "y": 60,
17
+ "wires": []
18
+ },
19
+ {
20
+ "id": "a2b3c4d5e6f70819",
21
+ "type": "AlarmSystemUltimate",
22
+ "z": "c0a4b6d3e5f70819",
23
+ "name": "Home Alarm",
24
+ "controlTopic": "alarm",
25
+ "payloadPropName": "payload",
26
+ "persistState": true,
27
+ "requireCodeForArm": false,
28
+ "requireCodeForDisarm": false,
29
+ "armCode": "",
30
+ "duressCode": "",
31
+ "blockArmOnViolations": true,
32
+ "exitDelaySeconds": 10,
33
+ "entryDelaySeconds": 30,
34
+ "emitOpenZonesDuringArming": false,
35
+ "openZonesArmingIntervalSeconds": 1,
36
+ "openZonesRequestTopic": "alarm/listOpenZones",
37
+ "openZonesRequestIntervalSeconds": 0,
38
+ "sirenDurationSeconds": 180,
39
+ "sirenLatchUntilDisarm": false,
40
+ "sirenTopic": "alarm/siren",
41
+ "sirenOnPayload": true,
42
+ "sirenOnPayloadType": "bool",
43
+ "sirenOffPayload": false,
44
+ "sirenOffPayloadType": "bool",
45
+ "emitRestoreEvents": false,
46
+ "maxLogEntries": 50,
47
+ "zones": "[\n {\n \"id\": \"front_door\",\n \"name\": \"Front door\",\n \"topic\": \"sensor/frontdoor\",\n \"type\": \"perimeter\",\n \"entry\": true,\n \"bypassable\": true,\n \"chime\": true\n },\n {\n \"id\": \"living_pir\",\n \"name\": \"Living PIR\",\n \"topic\": \"sensor/living_pir\",\n \"type\": \"motion\",\n \"entry\": false,\n \"bypassable\": true,\n \"cooldownSeconds\": 10\n }\n]",
48
+ "x": 220,
49
+ "y": 200,
50
+ "wires": [
51
+ [],
52
+ [],
53
+ [],
54
+ [],
55
+ [],
56
+ [],
57
+ [],
58
+ [],
59
+ []
60
+ ]
61
+ },
62
+ {
63
+ "id": "e6f708192a3b4c5e",
64
+ "type": "ui-template",
65
+ "z": "c0a4b6d3e5f70819",
66
+ "group": "08192a3b4c5d6e7f",
67
+ "name": "Alarm Panel (embed)",
68
+ "order": 1,
69
+ "width": 12,
70
+ "height": 18,
71
+ "head": "",
72
+ "format": "<template>\n <iframe :src=\"panelUrl\" style=\"width:100%; height:720px; border:0; border-radius:10px;\"></iframe>\n</template>\n\n<script>\nexport default {\n data () {\n return {\n panelUrl: ''\n }\n },\n mounted () {\n const alarmNodeId = 'a2b3c4d5e6f70819'\n const setupUrl = new URL('../_setup', window.location.href)\n\n fetch(setupUrl)\n .then(r => r.json())\n .then(setup => {\n const httpAdminRoot = setup?.RED?.httpAdminRoot ?? '/'\n const root = httpAdminRoot.endsWith('/') ? httpAdminRoot : `${httpAdminRoot}/`\n this.panelUrl = `${root}alarm-ultimate/alarm-panel?embed=1&view=keypad&id=${encodeURIComponent(alarmNodeId)}`\n })\n .catch(() => {\n const relative = `../alarm-ultimate/alarm-panel?embed=1&view=keypad&id=${encodeURIComponent(alarmNodeId)}`\n this.panelUrl = new URL(relative, window.location.href).toString()\n })\n }\n}\n</script>\n",
73
+ "storeOutMessages": true,
74
+ "passthru": true,
75
+ "resendOnRefresh": true,
76
+ "templateScope": "local",
77
+ "className": "",
78
+ "x": 520,
79
+ "y": 200
80
+ },
81
+ {
82
+ "id": "1c2d3e4f50617283",
83
+ "type": "ui-template",
84
+ "z": "c0a4b6d3e5f70819",
85
+ "group": "4b5c6d7e8f901a2b",
86
+ "name": "Zones (embed)",
87
+ "order": 1,
88
+ "width": 12,
89
+ "height": 18,
90
+ "head": "",
91
+ "format": "<template>\n <iframe :src=\"panelUrl\" style=\"width:100%; height:720px; border:0; border-radius:10px;\"></iframe>\n</template>\n\n<script>\nexport default {\n data () {\n return {\n panelUrl: ''\n }\n },\n mounted () {\n const alarmNodeId = 'a2b3c4d5e6f70819'\n const setupUrl = new URL('../_setup', window.location.href)\n\n fetch(setupUrl)\n .then(r => r.json())\n .then(setup => {\n const httpAdminRoot = setup?.RED?.httpAdminRoot ?? '/'\n const root = httpAdminRoot.endsWith('/') ? httpAdminRoot : `${httpAdminRoot}/`\n this.panelUrl = `${root}alarm-ultimate/alarm-panel?embed=1&view=zones&id=${encodeURIComponent(alarmNodeId)}`\n })\n .catch(() => {\n const relative = `../alarm-ultimate/alarm-panel?embed=1&view=zones&id=${encodeURIComponent(alarmNodeId)}`\n this.panelUrl = new URL(relative, window.location.href).toString()\n })\n }\n}\n</script>\n",
92
+ "storeOutMessages": true,
93
+ "passthru": true,
94
+ "resendOnRefresh": true,
95
+ "templateScope": "local",
96
+ "className": "",
97
+ "x": 820,
98
+ "y": 200,
99
+ "wires": [
100
+ []
101
+ ]
102
+ },
103
+ {
104
+ "id": "2d3e4f5061728394",
105
+ "type": "ui-template",
106
+ "z": "c0a4b6d3e5f70819",
107
+ "group": "5c6d7e8f901a2b3c",
108
+ "name": "Log (embed)",
109
+ "order": 1,
110
+ "width": 12,
111
+ "height": 14,
112
+ "head": "",
113
+ "format": "<template>\n <iframe :src=\"panelUrl\" style=\"width:100%; height:560px; border:0; border-radius:10px;\"></iframe>\n</template>\n\n<script>\nexport default {\n data () {\n return {\n panelUrl: ''\n }\n },\n mounted () {\n const alarmNodeId = 'a2b3c4d5e6f70819'\n const setupUrl = new URL('../_setup', window.location.href)\n\n fetch(setupUrl)\n .then(r => r.json())\n .then(setup => {\n const httpAdminRoot = setup?.RED?.httpAdminRoot ?? '/'\n const root = httpAdminRoot.endsWith('/') ? httpAdminRoot : `${httpAdminRoot}/`\n this.panelUrl = `${root}alarm-ultimate/alarm-panel?embed=1&view=log&id=${encodeURIComponent(alarmNodeId)}`\n })\n .catch(() => {\n const relative = `../alarm-ultimate/alarm-panel?embed=1&view=log&id=${encodeURIComponent(alarmNodeId)}`\n this.panelUrl = new URL(relative, window.location.href).toString()\n })\n }\n}\n</script>\n",
114
+ "storeOutMessages": true,
115
+ "passthru": true,
116
+ "resendOnRefresh": true,
117
+ "templateScope": "local",
118
+ "className": "",
119
+ "x": 1090,
120
+ "y": 200,
121
+ "wires": [
122
+ []
123
+ ]
124
+ },
125
+ {
126
+ "id": "b4c5d6e7f8091a2b",
127
+ "type": "function",
128
+ "z": "c0a4b6d3e5f70819",
129
+ "name": "Build control msg",
130
+ "func": "const payload = msg.payload;\n\nmsg.topic = \"alarm\";\n\nif (payload && typeof payload === \"object\") {\n if (typeof payload.command === \"string\") msg.command = payload.command;\n if (payload.zone != null) msg.zone = payload.zone;\n if (payload.code != null) msg.code = payload.code;\n} else if (typeof payload === \"string\") {\n msg.command = payload;\n}\n\nreturn msg;",
131
+ "outputs": 1,
132
+ "noerr": 0,
133
+ "initialize": "",
134
+ "finalize": "",
135
+ "libs": [],
136
+ "x": 520,
137
+ "y": 380,
138
+ "wires": [
139
+ [
140
+ "a2b3c4d5e6f70819"
141
+ ]
142
+ ]
143
+ },
144
+ {
145
+ "id": "c5d6e7f8091a2b3c",
146
+ "type": "ui-button",
147
+ "z": "c0a4b6d3e5f70819",
148
+ "group": "f708192a3b4c5d6e",
149
+ "name": "Arm",
150
+ "label": "Arm",
151
+ "order": 1,
152
+ "width": 4,
153
+ "height": 1,
154
+ "emulateClick": false,
155
+ "tooltip": "",
156
+ "color": "white",
157
+ "bgcolor": "#ff375f",
158
+ "className": "",
159
+ "icon": "fa-lock",
160
+ "iconPosition": "left",
161
+ "payload": "arm",
162
+ "payloadType": "str",
163
+ "topic": "",
164
+ "topicType": "str",
165
+ "buttonColor": "",
166
+ "textColor": "",
167
+ "iconColor": "",
168
+ "enableClick": true,
169
+ "enablePointerdown": false,
170
+ "pointerdownPayload": "",
171
+ "pointerdownPayloadType": "str",
172
+ "enablePointerup": false,
173
+ "pointerupPayload": "",
174
+ "pointerupPayloadType": "str",
175
+ "x": 220,
176
+ "y": 340,
177
+ "wires": [
178
+ [
179
+ "b4c5d6e7f8091a2b"
180
+ ]
181
+ ]
182
+ },
183
+ {
184
+ "id": "d6e7f8091a2b3c4d",
185
+ "type": "ui-button",
186
+ "z": "c0a4b6d3e5f70819",
187
+ "group": "f708192a3b4c5d6e",
188
+ "name": "Disarm",
189
+ "label": "Disarm",
190
+ "order": 2,
191
+ "width": 4,
192
+ "height": 1,
193
+ "emulateClick": false,
194
+ "tooltip": "",
195
+ "color": "white",
196
+ "bgcolor": "#1f6feb",
197
+ "className": "",
198
+ "icon": "fa-unlock",
199
+ "iconPosition": "left",
200
+ "payload": "disarm",
201
+ "payloadType": "str",
202
+ "topic": "",
203
+ "topicType": "str",
204
+ "buttonColor": "",
205
+ "textColor": "",
206
+ "iconColor": "",
207
+ "enableClick": true,
208
+ "enablePointerdown": false,
209
+ "pointerdownPayload": "",
210
+ "pointerdownPayloadType": "str",
211
+ "enablePointerup": false,
212
+ "pointerupPayload": "",
213
+ "pointerupPayloadType": "str",
214
+ "x": 220,
215
+ "y": 380,
216
+ "wires": [
217
+ [
218
+ "b4c5d6e7f8091a2b"
219
+ ]
220
+ ]
221
+ },
222
+ {
223
+ "id": "e7f8091a2b3c4d5e",
224
+ "type": "ui-button",
225
+ "z": "c0a4b6d3e5f70819",
226
+ "group": "f708192a3b4c5d6e",
227
+ "name": "Status snapshot",
228
+ "label": "Status",
229
+ "order": 3,
230
+ "width": 4,
231
+ "height": 1,
232
+ "emulateClick": false,
233
+ "tooltip": "Emits a full snapshot on output 1",
234
+ "color": "white",
235
+ "bgcolor": "#6e7681",
236
+ "className": "",
237
+ "icon": "fa-info-circle",
238
+ "iconPosition": "left",
239
+ "payload": "status",
240
+ "payloadType": "str",
241
+ "topic": "",
242
+ "topicType": "str",
243
+ "buttonColor": "",
244
+ "textColor": "",
245
+ "iconColor": "",
246
+ "enableClick": true,
247
+ "enablePointerdown": false,
248
+ "pointerdownPayload": "",
249
+ "pointerdownPayloadType": "str",
250
+ "enablePointerup": false,
251
+ "pointerupPayload": "",
252
+ "pointerupPayloadType": "str",
253
+ "x": 220,
254
+ "y": 420,
255
+ "wires": [
256
+ [
257
+ "b4c5d6e7f8091a2b"
258
+ ]
259
+ ]
260
+ },
261
+ {
262
+ "id": "f8091a2b3c4d5e6f",
263
+ "type": "ui-button",
264
+ "z": "c0a4b6d3e5f70819",
265
+ "group": "e6f708192a3b4c5d",
266
+ "name": "Front door OPEN",
267
+ "label": "Front door: OPEN",
268
+ "order": 1,
269
+ "width": 6,
270
+ "height": 1,
271
+ "emulateClick": false,
272
+ "tooltip": "Sends topic sensor/frontdoor payload true",
273
+ "color": "white",
274
+ "bgcolor": "#d1242f",
275
+ "className": "",
276
+ "icon": "fa-door-open",
277
+ "iconPosition": "left",
278
+ "payload": "true",
279
+ "payloadType": "bool",
280
+ "topic": "sensor/frontdoor",
281
+ "topicType": "str",
282
+ "buttonColor": "",
283
+ "textColor": "",
284
+ "iconColor": "",
285
+ "enableClick": true,
286
+ "enablePointerdown": false,
287
+ "pointerdownPayload": "",
288
+ "pointerdownPayloadType": "str",
289
+ "enablePointerup": false,
290
+ "pointerupPayload": "",
291
+ "pointerupPayloadType": "str",
292
+ "x": 230,
293
+ "y": 520,
294
+ "wires": [
295
+ [
296
+ "a2b3c4d5e6f70819"
297
+ ]
298
+ ]
299
+ },
300
+ {
301
+ "id": "091a2b3c4d5e6f70",
302
+ "type": "ui-button",
303
+ "z": "c0a4b6d3e5f70819",
304
+ "group": "e6f708192a3b4c5d",
305
+ "name": "Front door CLOSED",
306
+ "label": "Front door: CLOSED",
307
+ "order": 2,
308
+ "width": 6,
309
+ "height": 1,
310
+ "emulateClick": false,
311
+ "tooltip": "Sends topic sensor/frontdoor payload false",
312
+ "color": "white",
313
+ "bgcolor": "#2ea043",
314
+ "className": "",
315
+ "icon": "fa-door-closed",
316
+ "iconPosition": "left",
317
+ "payload": "false",
318
+ "payloadType": "bool",
319
+ "topic": "sensor/frontdoor",
320
+ "topicType": "str",
321
+ "buttonColor": "",
322
+ "textColor": "",
323
+ "iconColor": "",
324
+ "enableClick": true,
325
+ "enablePointerdown": false,
326
+ "pointerdownPayload": "",
327
+ "pointerdownPayloadType": "str",
328
+ "enablePointerup": false,
329
+ "pointerupPayload": "",
330
+ "pointerupPayloadType": "str",
331
+ "x": 230,
332
+ "y": 560,
333
+ "wires": [
334
+ [
335
+ "a2b3c4d5e6f70819"
336
+ ]
337
+ ]
338
+ },
339
+ {
340
+ "id": "1a2b3c4d5e6f7081",
341
+ "type": "ui-button",
342
+ "z": "c0a4b6d3e5f70819",
343
+ "group": "e6f708192a3b4c5d",
344
+ "name": "Living PIR MOTION",
345
+ "label": "Living PIR: MOTION",
346
+ "order": 3,
347
+ "width": 6,
348
+ "height": 1,
349
+ "emulateClick": false,
350
+ "tooltip": "Sends topic sensor/living_pir payload true",
351
+ "color": "white",
352
+ "bgcolor": "#ff9f0a",
353
+ "className": "",
354
+ "icon": "fa-walking",
355
+ "iconPosition": "left",
356
+ "payload": "true",
357
+ "payloadType": "bool",
358
+ "topic": "sensor/living_pir",
359
+ "topicType": "str",
360
+ "buttonColor": "",
361
+ "textColor": "",
362
+ "iconColor": "",
363
+ "enableClick": true,
364
+ "enablePointerdown": false,
365
+ "pointerdownPayload": "",
366
+ "pointerdownPayloadType": "str",
367
+ "enablePointerup": false,
368
+ "pointerupPayload": "",
369
+ "pointerupPayloadType": "str",
370
+ "x": 230,
371
+ "y": 600,
372
+ "wires": [
373
+ [
374
+ "a2b3c4d5e6f70819"
375
+ ]
376
+ ]
377
+ },
378
+ {
379
+ "id": "2b3c4d5e6f708192",
380
+ "type": "ui-button",
381
+ "z": "c0a4b6d3e5f70819",
382
+ "group": "e6f708192a3b4c5d",
383
+ "name": "Living PIR CLEAR",
384
+ "label": "Living PIR: CLEAR",
385
+ "order": 4,
386
+ "width": 6,
387
+ "height": 1,
388
+ "emulateClick": false,
389
+ "tooltip": "Sends topic sensor/living_pir payload false",
390
+ "color": "white",
391
+ "bgcolor": "#6e7681",
392
+ "className": "",
393
+ "icon": "fa-pause",
394
+ "iconPosition": "left",
395
+ "payload": "false",
396
+ "payloadType": "bool",
397
+ "topic": "sensor/living_pir",
398
+ "topicType": "str",
399
+ "buttonColor": "",
400
+ "textColor": "",
401
+ "iconColor": "",
402
+ "enableClick": true,
403
+ "enablePointerdown": false,
404
+ "pointerdownPayload": "",
405
+ "pointerdownPayloadType": "str",
406
+ "enablePointerup": false,
407
+ "pointerupPayload": "",
408
+ "pointerupPayloadType": "str",
409
+ "x": 230,
410
+ "y": 640,
411
+ "wires": [
412
+ [
413
+ "a2b3c4d5e6f70819"
414
+ ]
415
+ ]
416
+ },
417
+ {
418
+ "id": "3c4d5e6f708192a3",
419
+ "type": "AlarmUltimateState",
420
+ "z": "c0a4b6d3e5f70819",
421
+ "name": "Alarm State",
422
+ "alarmId": "a2b3c4d5e6f70819",
423
+ "topic": "",
424
+ "outputInitialState": true,
425
+ "x": 220,
426
+ "y": 720,
427
+ "wires": [
428
+ [
429
+ "4d5e6f708192a3b4"
430
+ ]
431
+ ]
432
+ },
433
+ {
434
+ "id": "5e6f708192a3b4c5",
435
+ "type": "AlarmUltimateSiren",
436
+ "z": "c0a4b6d3e5f70819",
437
+ "name": "Siren",
438
+ "alarmId": "a2b3c4d5e6f70819",
439
+ "topic": "",
440
+ "outputInitialState": true,
441
+ "x": 220,
442
+ "y": 760,
443
+ "wires": [
444
+ [
445
+ "6f708192a3b4c5d6"
446
+ ]
447
+ ]
448
+ },
449
+ {
450
+ "id": "4d5e6f708192a3b4",
451
+ "type": "ui-text",
452
+ "z": "c0a4b6d3e5f70819",
453
+ "group": "192a3b4c5d6e7f80",
454
+ "order": 1,
455
+ "width": 6,
456
+ "height": 1,
457
+ "name": "",
458
+ "label": "Alarm state",
459
+ "format": "{{msg.payload}}",
460
+ "layout": "row-spread",
461
+ "style": false,
462
+ "font": "Helvetica",
463
+ "fontSize": 16,
464
+ "color": "#717171",
465
+ "wrapText": false,
466
+ "className": "",
467
+ "value": "payload",
468
+ "valueType": "msg",
469
+ "x": 520,
470
+ "y": 720
471
+ },
472
+ {
473
+ "id": "6f708192a3b4c5d6",
474
+ "type": "ui-text",
475
+ "z": "c0a4b6d3e5f70819",
476
+ "group": "192a3b4c5d6e7f80",
477
+ "order": 2,
478
+ "width": 6,
479
+ "height": 1,
480
+ "name": "",
481
+ "label": "Siren",
482
+ "format": "{{msg.payload}}",
483
+ "layout": "row-spread",
484
+ "style": false,
485
+ "font": "Helvetica",
486
+ "fontSize": 16,
487
+ "color": "#717171",
488
+ "wrapText": false,
489
+ "className": "",
490
+ "value": "payload",
491
+ "valueType": "msg",
492
+ "x": 520,
493
+ "y": 760
494
+ },
495
+ {
496
+ "id": "c4d5e6f708192a3b",
497
+ "type": "ui-base",
498
+ "name": "Dashboard",
499
+ "path": "/dashboard",
500
+ "appIcon": "",
501
+ "includeClientData": true,
502
+ "acceptsClientConfig": [
503
+ "ui-notification",
504
+ "ui-control"
505
+ ],
506
+ "showPathInSidebar": false,
507
+ "headerContent": "page",
508
+ "navigationStyle": "fixed",
509
+ "titleBarStyle": "default",
510
+ "showReconnectNotification": true,
511
+ "notificationDisplayTime": 5,
512
+ "showDisconnectNotification": true,
513
+ "allowInstall": false
514
+ },
515
+ {
516
+ "id": "b3c4d5e6f708192a",
517
+ "type": "ui-theme",
518
+ "name": "Default",
519
+ "colors": {
520
+ "surface": "#ffffff",
521
+ "primary": "#0094CE",
522
+ "bgPage": "#eeeeee",
523
+ "groupBg": "#ffffff",
524
+ "groupOutline": "#cccccc"
525
+ },
526
+ "sizes": {
527
+ "density": "default",
528
+ "pagePadding": "12px",
529
+ "groupGap": "12px",
530
+ "groupBorderRadius": "4px",
531
+ "widgetGap": "12px"
532
+ }
533
+ },
534
+ {
535
+ "id": "d5e6f708192a3b4c",
536
+ "type": "ui-page",
537
+ "name": "Panel",
538
+ "ui": "c4d5e6f708192a3b",
539
+ "path": "/panel",
540
+ "icon": "shield-home",
541
+ "layout": "grid",
542
+ "theme": "b3c4d5e6f708192a",
543
+ "breakpoints": [
544
+ {
545
+ "name": "Default",
546
+ "px": 0,
547
+ "cols": 12
548
+ },
549
+ {
550
+ "name": "Tablet",
551
+ "px": 576,
552
+ "cols": 12
553
+ },
554
+ {
555
+ "name": "Small Desktop",
556
+ "px": 768,
557
+ "cols": 12
558
+ },
559
+ {
560
+ "name": "Desktop",
561
+ "px": 1024,
562
+ "cols": 12
563
+ }
564
+ ],
565
+ "order": 1,
566
+ "className": "",
567
+ "visible": true,
568
+ "disabled": false
569
+ },
570
+ {
571
+ "id": "b1c2d3e4f5060718",
572
+ "type": "ui-page",
573
+ "name": "Controls",
574
+ "ui": "c4d5e6f708192a3b",
575
+ "path": "/controls",
576
+ "icon": "remote",
577
+ "layout": "grid",
578
+ "theme": "b3c4d5e6f708192a",
579
+ "breakpoints": [
580
+ {
581
+ "name": "Default",
582
+ "px": 0,
583
+ "cols": 12
584
+ },
585
+ {
586
+ "name": "Tablet",
587
+ "px": 576,
588
+ "cols": 12
589
+ },
590
+ {
591
+ "name": "Small Desktop",
592
+ "px": 768,
593
+ "cols": 12
594
+ },
595
+ {
596
+ "name": "Desktop",
597
+ "px": 1024,
598
+ "cols": 12
599
+ }
600
+ ],
601
+ "order": 2,
602
+ "className": "",
603
+ "visible": true,
604
+ "disabled": false
605
+ },
606
+ {
607
+ "id": "c2d3e4f506071829",
608
+ "type": "ui-page",
609
+ "name": "Sensors",
610
+ "ui": "c4d5e6f708192a3b",
611
+ "path": "/sensors",
612
+ "icon": "motion-sensor",
613
+ "layout": "grid",
614
+ "theme": "b3c4d5e6f708192a",
615
+ "breakpoints": [
616
+ {
617
+ "name": "Default",
618
+ "px": 0,
619
+ "cols": 12
620
+ },
621
+ {
622
+ "name": "Tablet",
623
+ "px": 576,
624
+ "cols": 12
625
+ },
626
+ {
627
+ "name": "Small Desktop",
628
+ "px": 768,
629
+ "cols": 12
630
+ },
631
+ {
632
+ "name": "Desktop",
633
+ "px": 1024,
634
+ "cols": 12
635
+ }
636
+ ],
637
+ "order": 3,
638
+ "className": "",
639
+ "visible": true,
640
+ "disabled": false
641
+ },
642
+ {
643
+ "id": "e4f5060718293b4c",
644
+ "type": "ui-page",
645
+ "name": "Zones",
646
+ "ui": "c4d5e6f708192a3b",
647
+ "path": "/zones",
648
+ "icon": "format-list-bulleted",
649
+ "layout": "grid",
650
+ "theme": "b3c4d5e6f708192a",
651
+ "breakpoints": [
652
+ {
653
+ "name": "Default",
654
+ "px": 0,
655
+ "cols": 12
656
+ },
657
+ {
658
+ "name": "Tablet",
659
+ "px": 576,
660
+ "cols": 12
661
+ },
662
+ {
663
+ "name": "Small Desktop",
664
+ "px": 768,
665
+ "cols": 12
666
+ },
667
+ {
668
+ "name": "Desktop",
669
+ "px": 1024,
670
+ "cols": 12
671
+ }
672
+ ],
673
+ "order": 4,
674
+ "className": "",
675
+ "visible": true,
676
+ "disabled": false
677
+ },
678
+ {
679
+ "id": "f5060718293b4c5d",
680
+ "type": "ui-page",
681
+ "name": "Log",
682
+ "ui": "c4d5e6f708192a3b",
683
+ "path": "/log",
684
+ "icon": "format-list-text",
685
+ "layout": "grid",
686
+ "theme": "b3c4d5e6f708192a",
687
+ "breakpoints": [
688
+ {
689
+ "name": "Default",
690
+ "px": 0,
691
+ "cols": 12
692
+ },
693
+ {
694
+ "name": "Tablet",
695
+ "px": 576,
696
+ "cols": 12
697
+ },
698
+ {
699
+ "name": "Small Desktop",
700
+ "px": 768,
701
+ "cols": 12
702
+ },
703
+ {
704
+ "name": "Desktop",
705
+ "px": 1024,
706
+ "cols": 12
707
+ }
708
+ ],
709
+ "order": 5,
710
+ "className": "",
711
+ "visible": true,
712
+ "disabled": false
713
+ },
714
+ {
715
+ "id": "d3e4f5060718293a",
716
+ "type": "ui-page",
717
+ "name": "Status",
718
+ "ui": "c4d5e6f708192a3b",
719
+ "path": "/status",
720
+ "icon": "information-outline",
721
+ "layout": "grid",
722
+ "theme": "b3c4d5e6f708192a",
723
+ "breakpoints": [
724
+ {
725
+ "name": "Default",
726
+ "px": 0,
727
+ "cols": 12
728
+ },
729
+ {
730
+ "name": "Tablet",
731
+ "px": 576,
732
+ "cols": 12
733
+ },
734
+ {
735
+ "name": "Small Desktop",
736
+ "px": 768,
737
+ "cols": 12
738
+ },
739
+ {
740
+ "name": "Desktop",
741
+ "px": 1024,
742
+ "cols": 12
743
+ }
744
+ ],
745
+ "order": 6,
746
+ "className": "",
747
+ "visible": true,
748
+ "disabled": false
749
+ },
750
+ {
751
+ "id": "08192a3b4c5d6e7f",
752
+ "type": "ui-group",
753
+ "name": "Panel",
754
+ "page": "d5e6f708192a3b4c",
755
+ "width": 12,
756
+ "height": 1,
757
+ "order": 1,
758
+ "showTitle": true,
759
+ "className": "",
760
+ "visible": true,
761
+ "disabled": false,
762
+ "groupType": "default"
763
+ },
764
+ {
765
+ "id": "f708192a3b4c5d6e",
766
+ "type": "ui-group",
767
+ "name": "Controls",
768
+ "page": "b1c2d3e4f5060718",
769
+ "width": 12,
770
+ "height": 1,
771
+ "order": 1,
772
+ "showTitle": true,
773
+ "className": "",
774
+ "visible": true,
775
+ "disabled": false,
776
+ "groupType": "default"
777
+ },
778
+ {
779
+ "id": "e6f708192a3b4c5d",
780
+ "type": "ui-group",
781
+ "name": "Sensor simulator",
782
+ "page": "c2d3e4f506071829",
783
+ "width": 12,
784
+ "height": 1,
785
+ "order": 1,
786
+ "showTitle": true,
787
+ "className": "",
788
+ "visible": true,
789
+ "disabled": false,
790
+ "groupType": "default"
791
+ },
792
+ {
793
+ "id": "192a3b4c5d6e7f80",
794
+ "type": "ui-group",
795
+ "name": "Status",
796
+ "page": "d3e4f5060718293a",
797
+ "width": 12,
798
+ "height": 1,
799
+ "order": 1,
800
+ "showTitle": true,
801
+ "className": "",
802
+ "visible": true,
803
+ "disabled": false,
804
+ "groupType": "default"
805
+ },
806
+ {
807
+ "id": "4b5c6d7e8f901a2b",
808
+ "type": "ui-group",
809
+ "name": "Zones",
810
+ "page": "e4f5060718293b4c",
811
+ "width": 12,
812
+ "height": 1,
813
+ "order": 1,
814
+ "showTitle": true,
815
+ "className": "",
816
+ "visible": true,
817
+ "disabled": false,
818
+ "groupType": "default"
819
+ },
820
+ {
821
+ "id": "5c6d7e8f901a2b3c",
822
+ "type": "ui-group",
823
+ "name": "Log",
824
+ "page": "f5060718293b4c5d",
825
+ "width": 12,
826
+ "height": 1,
827
+ "order": 1,
828
+ "showTitle": true,
829
+ "className": "",
830
+ "visible": true,
831
+ "disabled": false,
832
+ "groupType": "default"
833
+ }
834
+ ]