homebridge-easy-mqtt 1.4.0-beta.2 → 1.4.0-beta.21

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 (125) hide show
  1. package/CHANGELOG.md +21 -3
  2. package/README.md +271 -24
  3. package/config.schema.json +2309 -342
  4. package/dist/accessory/abstract/base.js +5 -5
  5. package/dist/accessory/abstract/base.js.map +1 -1
  6. package/dist/accessory/abstract/common.d.ts +42 -0
  7. package/dist/accessory/abstract/common.js +169 -0
  8. package/dist/accessory/abstract/common.js.map +1 -0
  9. package/dist/accessory/abstract/helper.d.ts +1 -0
  10. package/dist/accessory/abstract/helper.js +25 -0
  11. package/dist/accessory/abstract/helper.js.map +1 -1
  12. package/dist/accessory/abstract/mqtt.d.ts +15 -26
  13. package/dist/accessory/abstract/mqtt.js +29 -148
  14. package/dist/accessory/abstract/mqtt.js.map +1 -1
  15. package/dist/accessory/addons/addon.d.ts +24 -0
  16. package/dist/accessory/addons/addon.js +52 -0
  17. package/dist/accessory/addons/addon.js.map +1 -0
  18. package/dist/accessory/addons/filter.d.ts +11 -0
  19. package/dist/accessory/addons/filter.js +37 -0
  20. package/dist/accessory/addons/filter.js.map +1 -0
  21. package/dist/accessory/climate/active.d.ts +11 -0
  22. package/dist/accessory/climate/active.js +44 -0
  23. package/dist/accessory/climate/active.js.map +1 -0
  24. package/dist/accessory/climate/fan2.d.ts +20 -0
  25. package/dist/accessory/climate/fan2.js +122 -0
  26. package/dist/accessory/climate/fan2.js.map +1 -0
  27. package/dist/accessory/climate/heaterCooler.d.ts +2 -6
  28. package/dist/accessory/climate/heaterCooler.js +7 -39
  29. package/dist/accessory/climate/heaterCooler.js.map +1 -1
  30. package/dist/accessory/climate/purifier.d.ts +19 -0
  31. package/dist/accessory/climate/purifier.js +114 -0
  32. package/dist/accessory/climate/purifier.js.map +1 -0
  33. package/dist/accessory/climate/{climate.d.ts → temperatureControl.d.ts} +4 -3
  34. package/dist/accessory/climate/temperatureControl.js +35 -0
  35. package/dist/accessory/climate/temperatureControl.js.map +1 -0
  36. package/dist/accessory/climate/thermostat.d.ts +2 -2
  37. package/dist/accessory/climate/thermostat.js +11 -10
  38. package/dist/accessory/climate/thermostat.js.map +1 -1
  39. package/dist/accessory/garage.d.ts +17 -0
  40. package/dist/accessory/garage.js +110 -0
  41. package/dist/accessory/garage.js.map +1 -0
  42. package/dist/accessory/lock.d.ts +2 -2
  43. package/dist/accessory/lock.js +3 -3
  44. package/dist/accessory/lock.js.map +1 -1
  45. package/dist/accessory/onoff/lightbulb.js +4 -4
  46. package/dist/accessory/onoff/lightbulb.js.map +1 -1
  47. package/dist/accessory/onoff/onoff.js +1 -1
  48. package/dist/accessory/onoff/onoff.js.map +1 -1
  49. package/dist/accessory/onoff/outlet.js +1 -1
  50. package/dist/accessory/onoff/outlet.js.map +1 -1
  51. package/dist/accessory/position/blind.d.ts +10 -0
  52. package/dist/accessory/position/blind.js +22 -0
  53. package/dist/accessory/position/blind.js.map +1 -0
  54. package/dist/accessory/position/position.d.ts +14 -0
  55. package/dist/accessory/position/position.js +80 -0
  56. package/dist/accessory/position/position.js.map +1 -0
  57. package/dist/accessory/security.js +4 -4
  58. package/dist/accessory/security.js.map +1 -1
  59. package/dist/accessory/sensor/air.d.ts +14 -0
  60. package/dist/accessory/sensor/air.js +96 -0
  61. package/dist/accessory/sensor/air.js.map +1 -0
  62. package/dist/accessory/sensor/carbonDioxide.js +3 -3
  63. package/dist/accessory/sensor/carbonDioxide.js.map +1 -1
  64. package/dist/accessory/sensor/carbonMonoxide.js +3 -3
  65. package/dist/accessory/sensor/carbonMonoxide.js.map +1 -1
  66. package/dist/accessory/sensor/contact.js +1 -1
  67. package/dist/accessory/sensor/contact.js.map +1 -1
  68. package/dist/accessory/sensor/humidity.js +1 -1
  69. package/dist/accessory/sensor/humidity.js.map +1 -1
  70. package/dist/accessory/sensor/leak.js +1 -1
  71. package/dist/accessory/sensor/leak.js.map +1 -1
  72. package/dist/accessory/sensor/light.d.ts +9 -0
  73. package/dist/accessory/sensor/light.js +13 -0
  74. package/dist/accessory/sensor/light.js.map +1 -0
  75. package/dist/accessory/sensor/motion.js +1 -1
  76. package/dist/accessory/sensor/motion.js.map +1 -1
  77. package/dist/accessory/sensor/occupancy.js +1 -1
  78. package/dist/accessory/sensor/occupancy.js.map +1 -1
  79. package/dist/accessory/sensor/sensor.js +4 -4
  80. package/dist/accessory/sensor/sensor.js.map +1 -1
  81. package/dist/accessory/sensor/smoke.js +1 -1
  82. package/dist/accessory/sensor/smoke.js.map +1 -1
  83. package/dist/accessory/sensor/temperature.js +1 -1
  84. package/dist/accessory/sensor/temperature.js.map +1 -1
  85. package/dist/accessory/valve.d.ts +14 -0
  86. package/dist/accessory/valve.js +71 -0
  87. package/dist/accessory/valve.js.map +1 -0
  88. package/dist/homebridge/platform.js +5 -3
  89. package/dist/homebridge/platform.js.map +1 -1
  90. package/dist/homebridge-ui/public/index.html +1 -1
  91. package/dist/homebridge-ui/public/ui.js +1 -1
  92. package/dist/i18n/en.d.ts +203 -0
  93. package/dist/i18n/en.js +226 -23
  94. package/dist/i18n/en.js.map +1 -1
  95. package/dist/i18n/fr.d.ts +468 -0
  96. package/dist/i18n/fr.js +265 -0
  97. package/dist/i18n/fr.js.map +1 -1
  98. package/dist/i18n/i18n.d.ts +206 -1
  99. package/dist/i18n/i18n.js +12 -0
  100. package/dist/i18n/i18n.js.map +1 -1
  101. package/dist/i18n/ro.d.ts +889 -0
  102. package/dist/i18n/ro.js +381 -0
  103. package/dist/i18n/ro.js.map +1 -0
  104. package/dist/i18n/template.d.ts +205 -2
  105. package/dist/i18n/template.js +3 -3
  106. package/dist/i18n/template.js.map +1 -1
  107. package/dist/i18n/vi.d.ts +1034 -0
  108. package/dist/i18n/vi.js +526 -0
  109. package/dist/i18n/vi.js.map +1 -0
  110. package/dist/model/enums.d.ts +49 -5
  111. package/dist/model/enums.js +50 -5
  112. package/dist/model/enums.js.map +1 -1
  113. package/dist/model/mqtt.d.ts +5 -4
  114. package/dist/model/mqtt.js +41 -25
  115. package/dist/model/mqtt.js.map +1 -1
  116. package/dist/model/types.d.ts +141 -24
  117. package/dist/tools/properties.d.ts +11 -0
  118. package/dist/tools/properties.js +73 -0
  119. package/dist/tools/properties.js.map +1 -0
  120. package/dist/tools/temperature.d.ts +7 -3
  121. package/dist/tools/temperature.js +20 -9
  122. package/dist/tools/temperature.js.map +1 -1
  123. package/package.json +1 -1
  124. package/dist/accessory/climate/climate.js +0 -31
  125. package/dist/accessory/climate/climate.js.map +0 -1
@@ -21,8 +21,8 @@
21
21
  "type": {
22
22
  "type": "string",
23
23
  "title": "${config.title.type}",
24
- "enum": [ "CarbonMonoxideSensor", "CarbonDioxideSensor", "ContactSensor", "HeaterCooler", "HumiditySensor", "LeakSensor", "Lightbulb", "LockMechanism", "MotionSensor", "OccupancySensor", "Outlet", "SecuritySystem", "SmokeSensor", "Switch", "TemperatureSensor", "Thermostat"],
25
- "enumNames": ["${config.enumNames.carbonMonoxideSensor}", "${config.enumNames.carbonDioxideSensor}", "${config.enumNames.contactSensor}", "${config.enumNames.heaterCooler}", "${config.enumNames.humiditySensor}", "${config.enumNames.leakSensor}", "${config.enumNames.lightbulb}", "${config.enumNames.lockMechanism}", "${config.enumNames.motionSensor}", "${config.enumNames.occupancySensor}", "${config.enumNames.outlet}", "${config.enumNames.securitySystem}", "${config.enumNames.smokeSensor}", "${config.enumNames.switch}", "${config.enumNames.temperatureSensor}", "${config.enumNames.thermostat}"],
24
+ "enum": [ "AirPurifier", "AirQualitySensor", "CarbonMonoxideSensor", "CarbonDioxideSensor", "ContactSensor", "Fanv2", "GarageDoorOpener", "HeaterCooler", "HumiditySensor", "LeakSensor", "Lightbulb", "LightSensor", "LockMechanism", "MotionSensor", "OccupancySensor", "Outlet", "SecuritySystem", "SmokeSensor", "Switch", "TemperatureSensor", "Thermostat", "Valve", "WindowCovering"],
25
+ "enumNames": ["${config.enumNames.airPurifier}", "${config.enumNames.airQualitySensor}", "${config.enumNames.carbonMonoxideSensor}", "${config.enumNames.carbonDioxideSensor}", "${config.enumNames.contactSensor}", "${config.enumNames.fanv2}", "${config.enumNames.garageDoorOpener}", "${config.enumNames.heaterCooler}", "${config.enumNames.humiditySensor}", "${config.enumNames.leakSensor}", "${config.enumNames.lightbulb}", "${config.enumNames.lightSensor}", "${config.enumNames.lockMechanism}", "${config.enumNames.motionSensor}", "${config.enumNames.occupancySensor}", "${config.enumNames.outlet}", "${config.enumNames.securitySystem}", "${config.enumNames.smokeSensor}", "${config.enumNames.switch}", "${config.enumNames.temperatureSensor}", "${config.enumNames.thermostat}", "${config.enumNames.valve}", "${config.enumNames.windowCovering}"],
26
26
  "required": true
27
27
  },
28
28
  "group": {
@@ -53,8 +53,9 @@
53
53
  "broker": {
54
54
  "type": "string",
55
55
  "title": "${config.title.broker}",
56
+ "description": "${config.description.broker}",
56
57
  "placeholder": "mqtts://192.168.0.1:1883",
57
- "required": true
58
+ "pattern": "^(https?|mqtts?|wss?|ftp):\\/\\/([\\w.-]+)(:\\d+)?(\\/.*)?$"
58
59
  },
59
60
  "username": {
60
61
  "type": "string",
@@ -68,7 +69,22 @@
68
69
  "type": "string",
69
70
  "title": "${config.title.options}",
70
71
  "description": "${config.description.options}",
71
- "placeholder": "{ \"protocolVersion\": \"4\", \"clientId\": \"my-client-id\", \"rejectUnauthorized\": true }"
72
+ "placeholder": "{ \"protocolVersion\": \"4\", \"clientId\": \"my-client-id\", \"rejectUnauthorized\": true }",
73
+ "pattern": "^\\{\\s*(?:\"[^\"\\\\\\r\\n]*\"\\s*:\\s*(?:\"[^\"\\\\\\r\\n]*\"|[0-9.+-eE]+|true|false|null)\\s*,\\s*)*(?:\"[^\"\\\\\\r\\n]*\"\\s*:\\s*(?:\"[^\"\\\\\\r\\n]*\"|[0-9.+-eE]+|true|false|null)\\s*)?\\}$"
74
+ },
75
+ "onConnect": {
76
+ "type": "array",
77
+ "items": {
78
+ "type": "object",
79
+ "properties": {
80
+ "topic": {
81
+ "type": "string"
82
+ },
83
+ "message": {
84
+ "type": "string"
85
+ }
86
+ }
87
+ }
72
88
  }
73
89
  }
74
90
  },
@@ -108,9 +124,16 @@
108
124
  },
109
125
  "temperatureUnits": {
110
126
  "type": "string",
127
+ "title": "${config.title.sourceUnits}",
111
128
  "enum": ["C", "F"],
112
129
  "enumNames": ["${config.enumNames.celsius}", "${config.enumNames.fahrenheit}"]
113
130
  },
131
+ "valveType": {
132
+ "type": "string",
133
+ "title": "${config.title.valveType}",
134
+ "enum": ["GENERIC_VALVE", "IRRIGATION", "SHOWER_HEAD", "WATER_FAUCET"],
135
+ "enumNames": ["${config.enumNames.valveGeneric}", "${config.enumNames.valveIrrigation}", "${config.enumNames.valveShower}", "${config.enumNames.valveFaucet}"]
136
+ },
114
137
  "topicGetBatteryLevel": {
115
138
  "type": "string",
116
139
  "title": "${config.title.topicGetBatteryLevel}"
@@ -235,6 +258,10 @@
235
258
  "type": "string",
236
259
  "title": "${config.title.topicGetLeakDetected}"
237
260
  },
261
+ "topicGetCurrentAmbientLightLevel": {
262
+ "type": "string",
263
+ "title": "${config.title.topicGetCurrentAmbientLightLevel}"
264
+ },
238
265
  "topicGetMotionDetected": {
239
266
  "type": "string",
240
267
  "title": "${config.title.topicGetMotionDetected}"
@@ -339,6 +366,170 @@
339
366
  "type": "string",
340
367
  "title": "${config.title.topicSetTargetHeaterCoolerState}"
341
368
  },
369
+ "topicGetValveActive": {
370
+ "type": "string",
371
+ "title": "${config.title.topicGetValveActive}"
372
+ },
373
+ "topicSetValveActive": {
374
+ "type": "string",
375
+ "title": "${config.title.topicSetValveActive}"
376
+ },
377
+ "topicGetValveInUse": {
378
+ "type": "string",
379
+ "title": "${config.title.topicGetValveInUse}"
380
+ },
381
+ "topicGetValveIsConfigured": {
382
+ "type": "string",
383
+ "title": "${config.title.topicGetValveIsConfigured}"
384
+ },
385
+ "topicSetValveIsConfigured": {
386
+ "type": "string",
387
+ "title": "${config.title.topicSetValveIsConfigured}"
388
+ },
389
+ "topicGetValveRemainingDuration": {
390
+ "type": "string",
391
+ "title": "${config.title.topicGetValveRemainingDuration}"
392
+ },
393
+ "topicGetValveSetDuration": {
394
+ "type": "string",
395
+ "title": "${config.title.topicGetValveSetDuration}"
396
+ },
397
+ "topicSetValveSetDuration": {
398
+ "type": "string",
399
+ "title": "${config.title.topicSetValveSetDuration}"
400
+ },
401
+ "topicGetCurrentPurifierState": {
402
+ "type": "string",
403
+ "title": "${config.title.topicGetCurrentPurifierState}"
404
+ },
405
+ "topicGetTargetPurifierState": {
406
+ "type": "string",
407
+ "title": "${config.title.topicGetTargetPurifierState}"
408
+ },
409
+ "topicSetTargetPurifierState": {
410
+ "type": "string",
411
+ "title": "${config.title.topicSetTargetPurifierState}"
412
+ },
413
+ "topicGetFilterChangeIndication": {
414
+ "type": "string",
415
+ "title": "${config.title.topicGetFilterChangeIndication}"
416
+ },
417
+ "topicGetFilterLifeLevel": {
418
+ "type": "string",
419
+ "title": "${config.title.topicGetFilterLifeLevel}"
420
+ },
421
+ "topicResetFilterIndication": {
422
+ "type": "string",
423
+ "title": "${config.title.topicResetFilterIndication}"
424
+ },
425
+ "topicGetCurrentDoorState": {
426
+ "type": "string",
427
+ "title": "${config.title.topicGetCurrentDoorState}"
428
+ },
429
+ "topicGetObstructionDetected": {
430
+ "type": "string",
431
+ "title": "${config.title.topicGetObstructionDetected}"
432
+ },
433
+ "topicGetTargetDoorState": {
434
+ "type": "string",
435
+ "title": "${config.title.topicGetTargetDoorState}"
436
+ },
437
+ "topicSetTargetDoorState": {
438
+ "type": "string",
439
+ "title": "${config.title.topicSetTargetDoorState}"
440
+ },
441
+ "topicGetCurrentFanState": {
442
+ "type": "string",
443
+ "title": "${config.title.topicGetCurrentFanState}"
444
+ },
445
+ "topicGetRotationDirection": {
446
+ "type": "string",
447
+ "title": "${config.title.topicGetRotationDirection}"
448
+ },
449
+ "topicGetTargetFanState": {
450
+ "type": "string",
451
+ "title": "${config.title.topicGetTargetFanState}"
452
+ },
453
+ "topicSetRotationDirection": {
454
+ "type": "string",
455
+ "title": "${config.title.topicSetRotationDirection}"
456
+ },
457
+ "topicSetTargetFanState": {
458
+ "type": "string",
459
+ "title": "${config.title.topicSetTargetFanState}"
460
+ },
461
+ "topicGetAirQuality": {
462
+ "type": "string",
463
+ "title": "${config.title.topicGetAirQuality}"
464
+ },
465
+ "topicGetNitrogenDioxideDensity": {
466
+ "type": "string",
467
+ "title": "${config.title.topicGetNitrogenDioxideDensity}"
468
+ },
469
+ "topicGetOzoneDensity": {
470
+ "type": "string",
471
+ "title": "${config.title.topicGetOzoneDensity}"
472
+ },
473
+ "topicGetPM10Density": {
474
+ "type": "string",
475
+ "title": "${config.title.topicGetPM10Density}"
476
+ },
477
+ "topicGetPM2_5Density": {
478
+ "type": "string",
479
+ "title": "${config.title.topicGetPM2_5Density}"
480
+ },
481
+ "topicGetSulphurDioxideDensity": {
482
+ "type": "string",
483
+ "title": "${config.title.topicGetSulphurDioxideDensity}"
484
+ },
485
+ "topicGetVOCDensity": {
486
+ "type": "string",
487
+ "title": "${config.title.topicGetVOCDensity}"
488
+ },
489
+ "topicGetCurrentPosition": {
490
+ "type": "string",
491
+ "title": "${config.title.topicGetCurrentPosition}"
492
+ },
493
+ "topicSetHoldPosition": {
494
+ "type": "string",
495
+ "title": "${config.title.topicSetHoldPosition}"
496
+ },
497
+ "topicGetPositionState": {
498
+ "type": "string",
499
+ "title": "${config.title.topicGetPositionState}"
500
+ },
501
+ "topicGetTargetPosition": {
502
+ "type": "string",
503
+ "title": "${config.title.topicGetTargetPosition}"
504
+ },
505
+ "topicSetTargetPosition": {
506
+ "type": "string",
507
+ "title": "${config.title.topicSetTargetPosition}"
508
+ },
509
+ "topicGetCurrentHorizontalTiltAngle": {
510
+ "type": "string",
511
+ "title": "${config.title.topicGetCurrentHorizontalTiltAngle}"
512
+ },
513
+ "topicGetCurrentVerticalTiltAngle": {
514
+ "type": "string",
515
+ "title": "${config.title.topicGetCurrentVerticalTiltAngle}"
516
+ },
517
+ "topicGetTargetHorizontalTiltAngle": {
518
+ "type": "string",
519
+ "title": "${config.title.topicGetTargetHorizontalTiltAngle}"
520
+ },
521
+ "topicGetTargetVerticalTiltAngle": {
522
+ "type": "string",
523
+ "title": "${config.title.topicGetTargetVerticalTiltAngle}"
524
+ },
525
+ "topicSetTargetHorizontalTiltAngle": {
526
+ "type": "string",
527
+ "title": "${config.title.topicSetTargetHorizontalTiltAngle}"
528
+ },
529
+ "topicSetTargetVerticalTiltAngle": {
530
+ "type": "string",
531
+ "title": "${config.title.topicSetTargetVerticalTiltAngle}"
532
+ },
342
533
  "valueBatteryLow": {
343
534
  "type": "string",
344
535
  "title": "${config.title.valueBatteryLow}"
@@ -475,114 +666,1214 @@
475
666
  "type": "string",
476
667
  "title": "${config.title.valueSwingDisabled}"
477
668
  },
669
+ "valueActive": {
670
+ "type": "string",
671
+ "title": "${config.title.valueActive}"
672
+ },
673
+ "valueConfigured": {
674
+ "type": "string",
675
+ "title": "${config.title.valueConfigured}"
676
+ },
677
+ "valueNotConfigured": {
678
+ "type": "string",
679
+ "title": "${config.title.valueNotConfigured}"
680
+ },
681
+ "valueInUse": {
682
+ "type": "string",
683
+ "title": "${config.title.valueInUse}"
684
+ },
685
+ "valueInactive": {
686
+ "type": "string",
687
+ "title": "${config.title.valueInactive}"
688
+ },
689
+ "valueModeManual": {
690
+ "type": "string",
691
+ "title": "${config.title.valueModeManual}"
692
+ },
693
+ "valueModePurifying": {
694
+ "type": "string",
695
+ "title": "${config.title.valueModePurifying}"
696
+ },
697
+ "valueFilterChange": {
698
+ "type": "string",
699
+ "title": "${config.title.valueFilterChange}"
700
+ },
701
+ "valueFilterReset": {
702
+ "type": "string",
703
+ "title": "${config.title.valueFilterReset}"
704
+ },
705
+ "valueDoorObstructed": {
706
+ "type": "string",
707
+ "title": "${config.title.valueDoorObstructed}"
708
+ },
709
+ "valueDoorStateClosed": {
710
+ "type": "string",
711
+ "title": "${config.title.valueDoorStateClosed}"
712
+ },
713
+ "valueDoorStateClosing": {
714
+ "type": "string",
715
+ "title": "${config.title.valueDoorStateClosing}"
716
+ },
717
+ "valueDoorStateOpen": {
718
+ "type": "string",
719
+ "title": "${config.title.valueDoorStateOpen}"
720
+ },
721
+ "valueDoorStateOpening": {
722
+ "type": "string",
723
+ "title": "${config.title.valueDoorStateOpening}"
724
+ },
725
+ "valueDoorStateStopped": {
726
+ "type": "string",
727
+ "title": "${config.title.valueDoorStateStopped}"
728
+ },
729
+ "valueDirectionClockwise": {
730
+ "type": "string",
731
+ "title": "${config.title.valueDirectionClockwise}"
732
+ },
733
+ "valueDirectionCounterClockwise": {
734
+ "type": "string",
735
+ "title": "${config.title.valueDirectionCounterClockwise}"
736
+ },
737
+ "valueModeBlowing": {
738
+ "type": "string",
739
+ "title": "${config.title.valueModeBlowing}"
740
+ },
741
+ "valueAQExcellent": {
742
+ "type": "string",
743
+ "title": "${config.title.valueAQExcellent}"
744
+ },
745
+ "valueAQFair": {
746
+ "type": "string",
747
+ "title": "${config.title.valueAQFair}"
748
+ },
749
+ "valueAQGood": {
750
+ "type": "string",
751
+ "title": "${config.title.valueAQGood}"
752
+ },
753
+ "valueAQInferior": {
754
+ "type": "string",
755
+ "title": "${config.title.valueAQInferior}"
756
+ },
757
+ "valueAQPoor": {
758
+ "type": "string",
759
+ "title": "${config.title.valueAQPoor}"
760
+ },
761
+ "valueAQUnknown": {
762
+ "type": "string",
763
+ "title": "${config.title.valueAQUnknown}"
764
+ },
765
+ "valuePositionHold": {
766
+ "type": "string",
767
+ "title": "${config.title.valuePositionHold}"
768
+ },
769
+ "valuePositionDecreasing": {
770
+ "type": "string",
771
+ "title": "${config.title.valuePositionDecreasing}"
772
+ },
773
+ "valuePositionIncreasing": {
774
+ "type": "string",
775
+ "title": "${config.title.valuePositionIncreasing}"
776
+ },
777
+ "valuePositionObstructed": {
778
+ "type": "string",
779
+ "title": "${config.title.valuePositionObstructed}"
780
+ },
781
+ "valuePositionResume": {
782
+ "type": "string",
783
+ "title": "${config.title.valuePositionResume}"
784
+ },
785
+ "valuePositionStopped": {
786
+ "type": "string",
787
+ "title": "${config.title.valuePositionStopped}"
788
+ },
789
+ "resetOnRestart": {
790
+ "type": "boolean",
791
+ "title": "${config.title.resetOnRestart}"
792
+ },
478
793
  "disableLogging": {
479
794
  "type": "boolean",
480
795
  "title": "${config.title.disableLogging}"
481
796
  }
482
- }
483
- },
484
- "default": []
485
- },
486
- "verbose": {
487
- "type": "boolean",
488
- "default": false
489
- }
490
- }
491
- },
492
- "layout": [
493
- {
494
- "type": "array",
495
- "key": "accessories",
496
- "notitle": true,
497
- "items": [
498
- {
499
- "type": "fieldset",
500
- "expandable": true,
501
- "title": "${config.title.accessory}",
502
- "items": [
797
+ },
798
+ "allOf": [
503
799
  {
504
- "type": "div",
505
- "displayFlex": true,
506
- "flex-direction": "row",
507
- "items": [
508
- {
509
- "key": "accessories[].info.name",
510
- "flex": "0 0 33%"
511
- },
512
- {
513
- "key": "accessories[].info.type",
514
- "flex": "0 0 33%"
515
- },
516
- {
517
- "key": "accessories[].info.group",
518
- "flex": "0 0 33%"
800
+ "if": {
801
+ "properties": {
802
+ "info": {
803
+ "properties": {
804
+ "type" : {
805
+ "enum": ["Lightbulb", "Outlet", "Switch"]
806
+ }
807
+ }
808
+ }
519
809
  }
520
- ]
810
+ },
811
+ "then": {
812
+ "required": ["topicGetOn", "topicSetOn", "valueOn", "valueOff"]
813
+ }
521
814
  },
522
- "accessories[].mqtt.broker",
523
815
  {
524
- "type": "div",
525
- "displayFlex": true,
526
- "flex-direction": "row",
527
- "items": [
528
- {
529
- "key": "accessories[].mqtt.username",
530
- "flex": "0 0 50%"
531
- },
532
- {
533
- "key": "accessories[].mqtt.password",
534
- "flex": "0 0 50%"
816
+ "if": {
817
+ "properties": {
818
+ "info": {
819
+ "properties": {
820
+ "type" : {
821
+ "enum": ["WindowCovering"]
822
+ }
823
+ }
824
+ }
535
825
  }
536
- ]
826
+ },
827
+ "then": {
828
+ "required": ["topicGetCurrentPosition", "topicGetTargetPosition", "topicSetTargetPosition", "topicGetPositionState"],
829
+ "anyOf": [
830
+ { "required": ["valuePositionDecreasing"] },
831
+ { "required": ["valuePositionIncreasing"] },
832
+ { "required": ["valuePositionStopped"] }
833
+ ]
834
+ }
537
835
  },
538
- "accessories[].mqtt.options",
539
- "accessories[].disableLogging",
540
836
  {
541
- "type": "fieldset",
542
- "title": "${config.title.topics}",
543
- "description": "${config.description.topics}",
544
- "condition": {
545
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type !== undefined;"
837
+ "if": {
838
+ "properties": {
839
+ "info": {
840
+ "properties": {
841
+ "type" : {
842
+ "const": "AirQualitySensor"
843
+ }
844
+ }
845
+ }
846
+ }
546
847
  },
547
- "items": [
548
- {
549
- "type": "fieldset",
550
- "notitle": true,
551
- "condition": {
552
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'LockMechanism';"
553
- },
554
- "items": [
555
- {
556
- "type": "div",
557
- "displayFlex": true,
558
- "flex-direction": "row",
559
- "items": [
560
- {
561
- "key": "accessories[].topicGetCurrentLockState",
562
- "flex": "0 0 50%"
563
- }
564
- ]
565
- },
566
- {
567
- "type": "div",
568
- "displayFlex": true,
569
- "flex-direction": "row",
570
- "items": [
571
- {
572
- "key": "accessories[].topicGetTargetLockState",
573
- "flex": "0 0 50%"
574
- },
575
- {
576
- "key": "accessories[].topicSetTargetLockState",
577
- "flex": "0 0 50%"
578
- }
579
- ]
848
+ "then": {
849
+ "required": ["topicGetAirQuality"],
850
+ "anyOf": [
851
+ { "required": ["valueAQExcellent"] },
852
+ { "required": ["valueAQFair"] },
853
+ { "required": ["valueAQGood"] },
854
+ { "required": ["valueAQInferior"] },
855
+ { "required": ["valueAQPoor"] }
856
+ ]
857
+ }
858
+ },
859
+ {
860
+ "if": {
861
+ "properties": {
862
+ "info": {
863
+ "properties": {
864
+ "type" : {
865
+ "const": "CarbonDioxideSensor"
866
+ }
580
867
  }
581
- ]
582
- },
583
- {
584
- "type": "fieldset",
585
- "notitle": true,
868
+ }
869
+ }
870
+ },
871
+ "then": {
872
+ "required": ["topicGetCarbonDioxideDetected", "valueCarbonDioxideDetected"]
873
+ }
874
+ },
875
+ {
876
+ "if": {
877
+ "properties": {
878
+ "info": {
879
+ "properties": {
880
+ "type" : {
881
+ "const": "CarbonMonoxideSensor"
882
+ }
883
+ }
884
+ }
885
+ }
886
+ },
887
+ "then": {
888
+ "required": ["topicGetCarbonMonoxideDetected", "valueCarbonMonoxideDetected"]
889
+ }
890
+ },
891
+ {
892
+ "if": {
893
+ "properties": {
894
+ "info": {
895
+ "properties": {
896
+ "type" : {
897
+ "const": "ContactSensor"
898
+ }
899
+ }
900
+ }
901
+ }
902
+ },
903
+ "then": {
904
+ "required": ["topicGetContactSensorState", "valueContactDetected"]
905
+ }
906
+ },
907
+ {
908
+ "if": {
909
+ "properties": {
910
+ "info": {
911
+ "properties": {
912
+ "type" : {
913
+ "const": "HumiditySensor"
914
+ }
915
+ }
916
+ }
917
+ }
918
+ },
919
+ "then": {
920
+ "required": ["topicGetCurrentRelativeHumidity"]
921
+ }
922
+ },
923
+ {
924
+ "if": {
925
+ "properties": {
926
+ "info": {
927
+ "properties": {
928
+ "type" : {
929
+ "const": "LeakSensor"
930
+ }
931
+ }
932
+ }
933
+ }
934
+ },
935
+ "then": {
936
+ "required": ["topicGetLeakDetected", "valueLeakDetected"]
937
+ }
938
+ },
939
+ {
940
+ "if": {
941
+ "properties": {
942
+ "info": {
943
+ "properties": {
944
+ "type" : {
945
+ "const": "LightSensor"
946
+ }
947
+ }
948
+ }
949
+ }
950
+ },
951
+ "then": {
952
+ "required": ["topicGetCurrentAmbientLightLevel"]
953
+ }
954
+ },
955
+ {
956
+ "if": {
957
+ "properties": {
958
+ "info": {
959
+ "properties": {
960
+ "type" : {
961
+ "const": "MotionSensor"
962
+ }
963
+ }
964
+ }
965
+ }
966
+ },
967
+ "then": {
968
+ "required": ["topicGetMotionDetected", "valueMotionDetected"]
969
+ }
970
+ },
971
+ {
972
+ "if": {
973
+ "properties": {
974
+ "info": {
975
+ "properties": {
976
+ "type" : {
977
+ "const": "OccupancySensor"
978
+ }
979
+ }
980
+ }
981
+ }
982
+ },
983
+ "then": {
984
+ "required": ["topicGetOccupancyDetected", "valueOccupancyDetected"]
985
+ }
986
+ },
987
+ {
988
+ "if": {
989
+ "properties": {
990
+ "info": {
991
+ "properties": {
992
+ "type" : {
993
+ "const": "SmokeSensor"
994
+ }
995
+ }
996
+ }
997
+ }
998
+ },
999
+ "then": {
1000
+ "required": ["topicGetSmokeDetected", "valueSmokeDetected"]
1001
+ }
1002
+ },
1003
+ {
1004
+ "if": {
1005
+ "properties": {
1006
+ "info": {
1007
+ "properties": {
1008
+ "type" : {
1009
+ "const": "TemperatureSensor"
1010
+ }
1011
+ }
1012
+ }
1013
+ }
1014
+ },
1015
+ "then": {
1016
+ "required": ["topicGetCurrentTemperature"]
1017
+ }
1018
+ },
1019
+ {
1020
+ "if": {
1021
+ "properties": {
1022
+ "info": {
1023
+ "properties": {
1024
+ "type" : {
1025
+ "const": "AirPurifier"
1026
+ }
1027
+ }
1028
+ }
1029
+ }
1030
+ },
1031
+ "then": {
1032
+ "required": ["topicGetActive", "topicSetActive", "topicGetCurrentPurifierState", "topicGetTargetPurifierState", "topicSetTargetPurifierState", "valueStateActive", "valueStateInactive"],
1033
+ "anyOf": [
1034
+ { "required": ["valueModeIdle"] },
1035
+ { "required": ["valueModeInactive"] },
1036
+ { "required": ["valueModePurifying"] }
1037
+ ]
1038
+ }
1039
+ },
1040
+ {
1041
+ "if": {
1042
+ "properties": {
1043
+ "info": {
1044
+ "properties": {
1045
+ "type" : {
1046
+ "const": "AirPurifier"
1047
+ }
1048
+ }
1049
+ }
1050
+ }
1051
+ },
1052
+ "then": {
1053
+ "anyOf": [
1054
+ { "required": ["valueModeAuto"] },
1055
+ { "required": ["valueModeManual"] }
1056
+ ]
1057
+ }
1058
+ },
1059
+ {
1060
+ "if": {
1061
+ "properties": {
1062
+ "info": {
1063
+ "properties": {
1064
+ "type" : {
1065
+ "const": "Fanv2"
1066
+ }
1067
+ }
1068
+ }
1069
+ }
1070
+ },
1071
+ "then": {
1072
+ "required": ["topicGetActive", "topicSetActive", "valueStateActive", "valueStateInactive"]
1073
+ }
1074
+ },
1075
+ {
1076
+ "if": {
1077
+ "properties": {
1078
+ "info": {
1079
+ "properties": {
1080
+ "type" : {
1081
+ "const": "HeaterCooler"
1082
+ }
1083
+ }
1084
+ }
1085
+ }
1086
+ },
1087
+ "then": {
1088
+ "required": ["topicGetActive", "topicSetActive", "topicGetCurrentHeaterCoolerState", "topicGetCurrentTemperature", "topicGetTargetHeaterCoolerState", "topicSetTargetHeaterCoolerState", "valueStateActive", "valueStateInactive"],
1089
+ "anyOf": [
1090
+ { "required": ["valueModeCool"] },
1091
+ { "required": ["valueModeHeat"] },
1092
+ { "required": ["valueModeIdle"] },
1093
+ { "required": ["valueModeInactive"] }
1094
+ ]
1095
+ }
1096
+ },
1097
+ {
1098
+ "if": {
1099
+ "properties": {
1100
+ "info": {
1101
+ "properties": {
1102
+ "type" : {
1103
+ "const": "HeaterCooler"
1104
+ }
1105
+ }
1106
+ }
1107
+ }
1108
+ },
1109
+ "then": {
1110
+ "anyOf": [
1111
+ { "required": ["valueModeAuto"] },
1112
+ { "required": ["valueModeHeat"] },
1113
+ { "required": ["valueModeCool"] }
1114
+ ]
1115
+ }
1116
+ },
1117
+ {
1118
+ "if": {
1119
+ "properties": {
1120
+ "info": {
1121
+ "properties": {
1122
+ "type" : {
1123
+ "const": "Thermostat"
1124
+ }
1125
+ }
1126
+ }
1127
+ }
1128
+ },
1129
+ "then": {
1130
+ "required": ["topicGetCurrentHeatingCoolingState", "topicGetTargetHeatingCoolingState", "topicSetTargetHeatingCoolingState", "topicGetCurrentTemperature", "topicGetTargetTemperature", "topicSetTargetTemperature"],
1131
+ "anyOf": [
1132
+ { "required": ["valueModeCool"] },
1133
+ { "required": ["valueModeHeat"] },
1134
+ { "required": ["valueModeOff"] }
1135
+ ]
1136
+ }
1137
+ },
1138
+ {
1139
+ "if": {
1140
+ "properties": {
1141
+ "info": {
1142
+ "properties": {
1143
+ "type" : {
1144
+ "const": "GarageDoorOpener"
1145
+ }
1146
+ }
1147
+ }
1148
+ }
1149
+ },
1150
+ "then": {
1151
+ "required": ["topicGetCurrentDoorState", "topicGetTargetDoorState", "topicSetTargetDoorState", "topicGetObstructionDetected", "valueDoorObstructed"],
1152
+ "anyOf": [
1153
+ { "required": ["valueDoorStateOpen"] },
1154
+ { "required": ["valueDoorStateClosed"] }
1155
+ ]
1156
+ }
1157
+ },
1158
+ {
1159
+ "if": {
1160
+ "properties": {
1161
+ "info": {
1162
+ "properties": {
1163
+ "type" : {
1164
+ "const": "LockMechanism"
1165
+ }
1166
+ }
1167
+ }
1168
+ }
1169
+ },
1170
+ "then": {
1171
+ "required": ["topicGetCurrentLockState", "topicGetTargetLockState", "topicSetTargetLockState", "valueLockStateSecured", "valueLockStateUnsecured"]
1172
+ }
1173
+ },
1174
+ {
1175
+ "if": {
1176
+ "properties": {
1177
+ "info": {
1178
+ "properties": {
1179
+ "type" : {
1180
+ "const": "SecuritySystem"
1181
+ }
1182
+ }
1183
+ }
1184
+ }
1185
+ },
1186
+ "then": {
1187
+ "required": ["topicGetCurrentSecurityState", "topicGetTargetSecurityState", "topicSetTargetSecurityState"],
1188
+ "anyOf": [
1189
+ { "required": ["valueArmStay"] },
1190
+ { "required": ["valueArmAway"] },
1191
+ { "required": ["valueArmNight"] },
1192
+ { "required": ["valueDisarm"] }
1193
+ ]
1194
+ }
1195
+ },
1196
+ {
1197
+ "if": {
1198
+ "properties": {
1199
+ "info": {
1200
+ "properties": {
1201
+ "type" : {
1202
+ "const": "Valve"
1203
+ }
1204
+ }
1205
+ }
1206
+ }
1207
+ },
1208
+ "then": {
1209
+ "required": ["topicGetValveActive", "topicGetValveInUse", "topicSetValveActive", "valueActive", "valueInactive", "valueInUse"]
1210
+ }
1211
+ },
1212
+ {
1213
+ "if": {
1214
+ "properties": {
1215
+ "topicGetLockPhysicalControls": {
1216
+ "minLength": 1
1217
+ }
1218
+ },
1219
+ "required": ["topicGetLockPhysicalControls"]
1220
+ },
1221
+ "then": {
1222
+ "required": ["valueControlLock"]
1223
+ }
1224
+ },
1225
+ {
1226
+ "if": {
1227
+ "properties": {
1228
+ "topicSetLockPhysicalControls": {
1229
+ "minLength": 1
1230
+ }
1231
+ },
1232
+ "required": ["topicSetLockPhysicalControls"]
1233
+ },
1234
+ "then": {
1235
+ "required": ["valueControlLock", "valueControlUnlock"]
1236
+ }
1237
+ },
1238
+ {
1239
+ "if": {
1240
+ "properties": {
1241
+ "topicGetSwingMode": {
1242
+ "minLength": 1
1243
+ }
1244
+ },
1245
+ "required": ["topicGetSwingMode"]
1246
+ },
1247
+ "then": {
1248
+ "required": ["valueSwingEnabled"]
1249
+ }
1250
+ },
1251
+ {
1252
+ "if": {
1253
+ "properties": {
1254
+ "topicSetSwingMode": {
1255
+ "minLength": 1
1256
+ }
1257
+ },
1258
+ "required": ["topicSetSwingMode"]
1259
+ },
1260
+ "then": {
1261
+ "required": ["valueSwingEnabled", "valueSwingDisabled"]
1262
+ }
1263
+ },
1264
+ {
1265
+ "if": {
1266
+ "properties": {
1267
+ "topicGetBatteryLow": {
1268
+ "minLength": 1
1269
+ }
1270
+ },
1271
+ "required": ["topicGetBatteryLow"]
1272
+ },
1273
+ "then": {
1274
+ "required": ["valueBatteryLow"]
1275
+ }
1276
+ },
1277
+ {
1278
+ "if": {
1279
+ "properties": {
1280
+ "topicGetStatusActive": {
1281
+ "minLength": 1
1282
+ }
1283
+ },
1284
+ "required": ["topicGetStatusActive"]
1285
+ },
1286
+ "then": {
1287
+ "required": ["valueStatusActive"]
1288
+ }
1289
+ },
1290
+ {
1291
+ "if": {
1292
+ "properties": {
1293
+ "topicGetStatusFault": {
1294
+ "minLength": 1
1295
+ }
1296
+ },
1297
+ "required": ["topicGetStatusFault"]
1298
+ },
1299
+ "then": {
1300
+ "required": ["valueFault"]
1301
+ }
1302
+ },
1303
+ {
1304
+ "if": {
1305
+ "properties": {
1306
+ "topicGetStatusTampered": {
1307
+ "minLength": 1
1308
+ }
1309
+ },
1310
+ "required": ["topicGetStatusTampered"]
1311
+ },
1312
+ "then": {
1313
+ "required": ["valueTampered"]
1314
+ }
1315
+ },
1316
+ {
1317
+ "if": {
1318
+ "properties": {
1319
+ "topicGetOutletInUse": {
1320
+ "minLength": 1
1321
+ }
1322
+ },
1323
+ "required": ["topicGetOutletInUse"]
1324
+ },
1325
+ "then": {
1326
+ "required": ["valueOutletInUse"]
1327
+ }
1328
+ },
1329
+ {
1330
+ "if": {
1331
+ "properties": {
1332
+ "topicGetValveIsConfigured": {
1333
+ "minLength": 1
1334
+ }
1335
+ },
1336
+ "required": ["topicGetValveIsConfigured"]
1337
+ },
1338
+ "then": {
1339
+ "required": ["valueConfigured"]
1340
+ }
1341
+ },
1342
+ {
1343
+ "if": {
1344
+ "properties": {
1345
+ "topicSetValveIsConfigured": {
1346
+ "minLength": 1
1347
+ }
1348
+ },
1349
+ "required": ["topicSetValveIsConfigured"]
1350
+ },
1351
+ "then": {
1352
+ "required": ["valueConfigured", "valueNotConfigured"]
1353
+ }
1354
+ },
1355
+ {
1356
+ "if": {
1357
+ "properties": {
1358
+ "topicGetFilterChangeIndication": {
1359
+ "minLength": 1
1360
+ }
1361
+ },
1362
+ "required": ["topicGetFilterChangeIndication"]
1363
+ },
1364
+ "then": {
1365
+ "required": ["valueFilterChange"]
1366
+ }
1367
+ },
1368
+ {
1369
+ "if": {
1370
+ "properties": {
1371
+ "topicGetFilterLifeLevel": {
1372
+ "minLength": 1
1373
+ }
1374
+ },
1375
+ "required": ["topicGetFilterLifeLevel"]
1376
+ },
1377
+ "then": {
1378
+ "required": ["topicGetFilterChangeIndication"]
1379
+ }
1380
+ },
1381
+ {
1382
+ "if": {
1383
+ "properties": {
1384
+ "topicResetFilterIndication": {
1385
+ "minLength": 1
1386
+ }
1387
+ },
1388
+ "required": ["topicResetFilterIndication"]
1389
+ },
1390
+ "then": {
1391
+ "required": ["topicGetFilterChangeIndication", "valueFilterReset"]
1392
+ }
1393
+ },
1394
+ {
1395
+ "if": {
1396
+ "properties": {
1397
+ "topicGetCurrentLockState": {
1398
+ "minLength": 1
1399
+ }
1400
+ },
1401
+ "required": ["topicGetCurrentLockState"]
1402
+ },
1403
+ "then": {
1404
+ "required": ["valueLockStateSecured", "valueLockStateUnsecured"]
1405
+ }
1406
+ },
1407
+ {
1408
+ "if": {
1409
+ "properties": {
1410
+ "topicGetTargetLockState": {
1411
+ "minLength": 1
1412
+ }
1413
+ },
1414
+ "required": ["topicGetTargetLockState"]
1415
+ },
1416
+ "then": {
1417
+ "required": ["topicGetCurrentLockState", "topicSetTargetLockState"]
1418
+ }
1419
+ },
1420
+ {
1421
+ "if": {
1422
+ "properties": {
1423
+ "topicSetTargetLockState": {
1424
+ "minLength": 1
1425
+ }
1426
+ },
1427
+ "required": ["topicSetTargetLockState"]
1428
+ },
1429
+ "then": {
1430
+ "required": ["topicGetTargetLockState"]
1431
+ }
1432
+ },
1433
+ {
1434
+ "if": {
1435
+ "properties": {
1436
+ "topicGetCurrentFanState": {
1437
+ "minLength": 1
1438
+ }
1439
+ },
1440
+ "required": ["topicGetCurrentFanState"]
1441
+ },
1442
+ "then": {
1443
+ "anyOf": [
1444
+ { "required": ["valueModeInactive"] },
1445
+ { "required": ["valueModeIdle"] },
1446
+ { "required": ["valueModeBlowing"] }
1447
+ ]
1448
+ }
1449
+ },
1450
+ {
1451
+ "if": {
1452
+ "properties": {
1453
+ "topicGetTargetFanState": {
1454
+ "minLength": 1
1455
+ }
1456
+ },
1457
+ "required": ["topicGetTargetFanState"]
1458
+ },
1459
+ "then": {
1460
+ "required": ["topicSetTargetFanState"],
1461
+ "anyOf": [
1462
+ { "required": ["valueModeAuto"] },
1463
+ { "required": ["valueModeManual"] }
1464
+ ]
1465
+ }
1466
+ },
1467
+ {
1468
+ "if": {
1469
+ "properties": {
1470
+ "topicSetTargetFanState": {
1471
+ "minLength": 1
1472
+ }
1473
+ },
1474
+ "required": ["topicSetTargetFanState"]
1475
+ },
1476
+ "then": {
1477
+ "required": ["topicGetTargetFanState"]
1478
+ }
1479
+ },
1480
+ {
1481
+ "if": {
1482
+ "properties": {
1483
+ "topicGetRotationDirection": {
1484
+ "minLength": 1
1485
+ }
1486
+ },
1487
+ "required": ["topicGetRotationDirection"]
1488
+ },
1489
+ "then": {
1490
+ "required": ["topicSetRotationDirection", "valueDirectionClockwise", "valueDirectionCounterClockwise"]
1491
+ }
1492
+ },
1493
+ {
1494
+ "if": {
1495
+ "properties": {
1496
+ "topicSetRotationDirection": {
1497
+ "minLength": 1
1498
+ }
1499
+ },
1500
+ "required": ["topicSetRotationDirection"]
1501
+ },
1502
+ "then": {
1503
+ "required": ["topicGetRotationDirection"]
1504
+ }
1505
+ },
1506
+ {
1507
+ "if": {
1508
+ "properties": {
1509
+ "topicSetHoldPosition": {
1510
+ "minLength": 1
1511
+ }
1512
+ },
1513
+ "required": ["topicSetHoldPosition"]
1514
+ },
1515
+ "then": {
1516
+ "required": ["valuePositionHold", "valuePositionResume"]
1517
+ }
1518
+ },
1519
+ {
1520
+ "if": {
1521
+ "properties": {
1522
+ "topicGetObstructionDetected": {
1523
+ "minLength": 1
1524
+ }
1525
+ },
1526
+ "required": ["topicGetObstructionDetected"]
1527
+ },
1528
+ "then": {
1529
+ "required": ["valuePositionObstructed"]
1530
+ }
1531
+ },
1532
+ {
1533
+ "if": {
1534
+ "properties": {
1535
+ "topicGetCurrentHorizontalTiltAngle": {
1536
+ "minLength": 1
1537
+ }
1538
+ },
1539
+ "required": ["topicGetCurrentHorizontalTiltAngle"]
1540
+ },
1541
+ "then": {
1542
+ "required": ["topicGetTargetHorizontalTiltAngle", "topicSetTargetHorizontalTiltAngle"]
1543
+ }
1544
+ },
1545
+ {
1546
+ "if": {
1547
+ "properties": {
1548
+ "topicSetTargetHorizontalTiltAngle": {
1549
+ "minLength": 1
1550
+ }
1551
+ },
1552
+ "required": ["topicSetTargetHorizontalTiltAngle"]
1553
+ },
1554
+ "then": {
1555
+ "required": ["topicGetTargetHorizontalTiltAngle"]
1556
+ }
1557
+ },
1558
+ {
1559
+ "if": {
1560
+ "properties": {
1561
+ "topicGetTargetVerticalTiltAngle": {
1562
+ "minLength": 1
1563
+ }
1564
+ },
1565
+ "required": ["topicGetTargetVerticalTiltAngle"]
1566
+ },
1567
+ "then": {
1568
+ "required": ["topicGetCurrentVerticalTiltAngle", "topicSetTargetVerticalTiltAngle"]
1569
+ }
1570
+ },
1571
+ {
1572
+ "if": {
1573
+ "properties": {
1574
+ "topicSetTargetVerticalTiltAngle": {
1575
+ "minLength": 1
1576
+ }
1577
+ },
1578
+ "required": ["topicSetTargetVerticalTiltAngle"]
1579
+ },
1580
+ "then": {
1581
+ "required": ["topicGetCurrentVerticalTiltAngle"]
1582
+ }
1583
+ }
1584
+ ]
1585
+ },
1586
+ "default": []
1587
+ },
1588
+ "verbose": {
1589
+ "type": "boolean",
1590
+ "default": false
1591
+ }
1592
+ }
1593
+ },
1594
+ "layout": [
1595
+ {
1596
+ "type": "array",
1597
+ "key": "accessories",
1598
+ "notitle": true,
1599
+ "items": [
1600
+ {
1601
+ "type": "fieldset",
1602
+ "expandable": true,
1603
+ "title": "${config.title.accessory}",
1604
+ "items": [
1605
+ {
1606
+ "type": "div",
1607
+ "displayFlex": true,
1608
+ "flex-direction": "row",
1609
+ "items": [
1610
+ {
1611
+ "key": "accessories[].info.name",
1612
+ "flex": "0 0 33%"
1613
+ },
1614
+ {
1615
+ "key": "accessories[].info.type",
1616
+ "flex": "0 0 33%"
1617
+ },
1618
+ {
1619
+ "key": "accessories[].info.group",
1620
+ "flex": "0 0 33%"
1621
+ }
1622
+ ]
1623
+ },
1624
+ {
1625
+ "type": "fieldset",
1626
+ "notitle": true,
1627
+ "condition": {
1628
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'Valve';"
1629
+ },
1630
+ "items": [
1631
+ {
1632
+ "type": "div",
1633
+ "displayFlex": true,
1634
+ "flex-direction": "row",
1635
+ "items": [
1636
+ {
1637
+ "key": "accessories[].valveType",
1638
+ "flex": "0 0 33%"
1639
+ }
1640
+ ]
1641
+ }
1642
+ ]
1643
+ },
1644
+ "accessories[].mqtt.broker",
1645
+ {
1646
+ "type": "div",
1647
+ "displayFlex": true,
1648
+ "flex-direction": "row",
1649
+ "items": [
1650
+ {
1651
+ "key": "accessories[].mqtt.username",
1652
+ "flex": "0 0 50%"
1653
+ },
1654
+ {
1655
+ "key": "accessories[].mqtt.password",
1656
+ "flex": "0 0 50%"
1657
+ }
1658
+ ]
1659
+ },
1660
+ "accessories[].mqtt.options",
1661
+ {
1662
+ "type": "div",
1663
+ "displayFlex": true,
1664
+ "flex-direction": "row",
1665
+ "items": [
1666
+ {
1667
+ "key": "accessories[].resetOnRestart",
1668
+ "flex": "0 0 25%"
1669
+ },
1670
+ {
1671
+ "key": "accessories[].disableLogging",
1672
+ "flex": "0 0 25%"
1673
+ }
1674
+ ]
1675
+ },
1676
+ {
1677
+ "type": "fieldset",
1678
+ "title": "${config.title.topics}",
1679
+ "description": "${config.description.topics}",
1680
+ "condition": {
1681
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type !== undefined;"
1682
+ },
1683
+ "items": [
1684
+ {
1685
+ "type": "fieldset",
1686
+ "notitle": true,
1687
+ "condition": {
1688
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'GarageDoorOpener';"
1689
+ },
1690
+ "items": [
1691
+ {
1692
+ "type": "div",
1693
+ "displayFlex": true,
1694
+ "flex-direction": "row",
1695
+ "items": [
1696
+ {
1697
+ "key": "accessories[].topicGetCurrentDoorState",
1698
+ "flex": "0 0 50%"
1699
+ },
1700
+ {
1701
+ "key": "accessories[].topicGetObstructionDetected",
1702
+ "flex": "0 0 50%"
1703
+ }
1704
+ ]
1705
+ },
1706
+ {
1707
+ "type": "div",
1708
+ "displayFlex": true,
1709
+ "flex-direction": "row",
1710
+ "items": [
1711
+ {
1712
+ "key": "accessories[].topicGetTargetDoorState",
1713
+ "flex": "0 0 50%"
1714
+ },
1715
+ {
1716
+ "key": "accessories[].topicSetTargetDoorState",
1717
+ "flex": "0 0 50%"
1718
+ }
1719
+ ]
1720
+ },
1721
+ {
1722
+ "type": "div",
1723
+ "displayFlex": true,
1724
+ "flex-direction": "row",
1725
+ "items": [
1726
+ {
1727
+ "key": "accessories[].topicGetCurrentLockState",
1728
+ "title": "${config.title.topicGetCurrentLockStateOptional}",
1729
+ "flex": "0 0 50%"
1730
+ }
1731
+ ]
1732
+ },
1733
+ {
1734
+ "type": "div",
1735
+ "displayFlex": true,
1736
+ "flex-direction": "row",
1737
+ "items": [
1738
+ {
1739
+ "key": "accessories[].topicGetTargetLockState",
1740
+ "title": "${config.title.topicGetTargetLockStateOptional}",
1741
+ "flex": "0 0 50%"
1742
+ },
1743
+ {
1744
+ "key": "accessories[].topicSetTargetLockState",
1745
+ "title": "${config.title.topicSetTargetLockStateOptional}",
1746
+ "flex": "0 0 50%"
1747
+ }
1748
+ ]
1749
+ }
1750
+ ]
1751
+ },
1752
+ {
1753
+ "type": "fieldset",
1754
+ "notitle": true,
1755
+ "condition": {
1756
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'LockMechanism';"
1757
+ },
1758
+ "items": [
1759
+ {
1760
+ "type": "div",
1761
+ "displayFlex": true,
1762
+ "flex-direction": "row",
1763
+ "items": [
1764
+ {
1765
+ "key": "accessories[].topicGetCurrentLockState",
1766
+ "flex": "0 0 50%"
1767
+ }
1768
+ ]
1769
+ },
1770
+ {
1771
+ "type": "div",
1772
+ "displayFlex": true,
1773
+ "flex-direction": "row",
1774
+ "items": [
1775
+ {
1776
+ "key": "accessories[].topicGetTargetLockState",
1777
+ "flex": "0 0 50%"
1778
+ },
1779
+ {
1780
+ "key": "accessories[].topicSetTargetLockState",
1781
+ "flex": "0 0 50%"
1782
+ }
1783
+ ]
1784
+ }
1785
+ ]
1786
+ },
1787
+ {
1788
+ "type": "fieldset",
1789
+ "notitle": true,
1790
+ "condition": {
1791
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'Valve';"
1792
+ },
1793
+ "items": [
1794
+ {
1795
+ "type": "div",
1796
+ "displayFlex": true,
1797
+ "flex-direction": "row",
1798
+ "items": [
1799
+ {
1800
+ "key": "accessories[].topicGetValveActive",
1801
+ "flex": "0 0 50%"
1802
+ },
1803
+ {
1804
+ "key": "accessories[].topicSetValveActive",
1805
+ "flex": "0 0 50%"
1806
+ }
1807
+ ]
1808
+ },
1809
+ {
1810
+ "type": "div",
1811
+ "displayFlex": true,
1812
+ "flex-direction": "row",
1813
+ "items": [
1814
+ {
1815
+ "key": "accessories[].topicGetValveInUse",
1816
+ "flex": "0 0 50%"
1817
+ }
1818
+ ]
1819
+ },
1820
+ {
1821
+ "type": "div",
1822
+ "displayFlex": true,
1823
+ "flex-direction": "row",
1824
+ "items": [
1825
+ {
1826
+ "key": "accessories[].topicGetValveIsConfigured",
1827
+ "flex": "0 0 50%"
1828
+ },
1829
+ {
1830
+ "key": "accessories[].topicSetValveIsConfigured",
1831
+ "flex": "0 0 50%"
1832
+ }
1833
+ ]
1834
+ },
1835
+ {
1836
+ "type": "div",
1837
+ "displayFlex": true,
1838
+ "flex-direction": "row",
1839
+ "items": [
1840
+ {
1841
+ "key": "accessories[].topicGetValveSetDuration",
1842
+ "flex": "0 0 50%"
1843
+ },
1844
+ {
1845
+ "key": "accessories[].topicSetValveSetDuration",
1846
+ "flex": "0 0 50%"
1847
+ }
1848
+ ]
1849
+ },
1850
+ {
1851
+ "type": "div",
1852
+ "displayFlex": true,
1853
+ "flex-direction": "row",
1854
+ "items": [
1855
+ {
1856
+ "key": "accessories[].topicGetValveRemainingDuration",
1857
+ "flex": "0 0 50%"
1858
+ }
1859
+ ]
1860
+ },
1861
+ {
1862
+ "type": "div",
1863
+ "displayFlex": true,
1864
+ "flex-direction": "row",
1865
+ "items": [
1866
+ {
1867
+ "key": "accessories[].topicGetStatusFault",
1868
+ "flex": "0 0 50%"
1869
+ }
1870
+ ]
1871
+ }
1872
+ ]
1873
+ },
1874
+ {
1875
+ "type": "fieldset",
1876
+ "notitle": true,
586
1877
  "condition": {
587
1878
  "functionBody": "return ['Lightbulb', 'Outlet', 'Switch'].includes(model.accessories?.[arguments[1]]?.info?.type);"
588
1879
  },
@@ -593,11 +1884,359 @@
593
1884
  "flex-direction": "row",
594
1885
  "items": [
595
1886
  {
596
- "key": "accessories[].topicGetOn",
1887
+ "key": "accessories[].topicGetOn",
1888
+ "flex": "0 0 50%"
1889
+ },
1890
+ {
1891
+ "key": "accessories[].topicSetOn",
1892
+ "flex": "0 0 50%"
1893
+ }
1894
+ ]
1895
+ }
1896
+ ]
1897
+ },
1898
+ {
1899
+ "type": "fieldset",
1900
+ "notitle": true,
1901
+ "condition": {
1902
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'Lightbulb';"
1903
+ },
1904
+ "items": [
1905
+ {
1906
+ "type": "div",
1907
+ "displayFlex": true,
1908
+ "flex-direction": "row",
1909
+ "items": [
1910
+ {
1911
+ "key": "accessories[].topicGetBrightness",
1912
+ "flex": "0 0 50%"
1913
+ },
1914
+ {
1915
+ "key": "accessories[].topicSetBrightness",
1916
+ "flex": "0 0 50%"
1917
+ }
1918
+ ]
1919
+ },
1920
+ {
1921
+ "type": "div",
1922
+ "displayFlex": true,
1923
+ "flex-direction": "row",
1924
+ "items": [
1925
+ {
1926
+ "key": "accessories[].topicGetHue",
1927
+ "flex": "0 0 50%"
1928
+ },
1929
+ {
1930
+ "key": "accessories[].topicSetHue",
1931
+ "flex": "0 0 50%"
1932
+ }
1933
+ ]
1934
+ },
1935
+ {
1936
+ "type": "div",
1937
+ "displayFlex": true,
1938
+ "flex-direction": "row",
1939
+ "items": [
1940
+ {
1941
+ "key": "accessories[].topicGetColorTemperature",
1942
+ "flex": "0 0 50%"
1943
+ },
1944
+ {
1945
+ "key": "accessories[].topicSetColorTemperature",
1946
+ "flex": "0 0 50%"
1947
+ }
1948
+ ]
1949
+ },
1950
+ {
1951
+ "type": "div",
1952
+ "displayFlex": true,
1953
+ "flex-direction": "row",
1954
+ "items": [
1955
+ {
1956
+ "key": "accessories[].topicGetSaturation",
1957
+ "flex": "0 0 50%"
1958
+ },
1959
+ {
1960
+ "key": "accessories[].topicSetSaturation",
1961
+ "flex": "0 0 50%"
1962
+ }
1963
+ ]
1964
+ }
1965
+ ]
1966
+ },
1967
+ {
1968
+ "type": "fieldset",
1969
+ "notitle": true,
1970
+ "condition": {
1971
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'Outlet';"
1972
+ },
1973
+ "items": [
1974
+ {
1975
+ "type": "div",
1976
+ "displayFlex": true,
1977
+ "flex-direction": "row",
1978
+ "items": [
1979
+ {
1980
+ "key": "accessories[].topicGetOutletInUse",
1981
+ "flex": "0 0 50%"
1982
+ }
1983
+ ]
1984
+ }
1985
+ ]
1986
+ },
1987
+ {
1988
+ "type": "fieldset",
1989
+ "notitle": true,
1990
+ "condition": {
1991
+ "functionBody": "return ['WindowCovering'].includes(model.accessories?.[arguments[1]]?.info?.type);"
1992
+ },
1993
+ "items": [
1994
+ {
1995
+ "type": "fieldset",
1996
+ "notitle": true,
1997
+ "items": [
1998
+ {
1999
+ "type": "div",
2000
+ "displayFlex": true,
2001
+ "flex-direction": "row",
2002
+ "items": [
2003
+ {
2004
+ "key": "accessories[].topicGetCurrentPosition",
2005
+ "flex": "0 0 50%"
2006
+ },
2007
+ {
2008
+ "key": "accessories[].topicGetPositionState",
2009
+ "flex": "0 0 50%"
2010
+ }
2011
+ ]
2012
+ },
2013
+ {
2014
+ "type": "div",
2015
+ "displayFlex": true,
2016
+ "flex-direction": "row",
2017
+ "items": [
2018
+ {
2019
+ "key": "accessories[].topicGetTargetPosition",
2020
+ "flex": "0 0 50%"
2021
+ },
2022
+ {
2023
+ "key": "accessories[].topicSetTargetPosition",
2024
+ "flex": "0 0 50%"
2025
+ }
2026
+ ]
2027
+ }
2028
+ ]
2029
+ }
2030
+ ]
2031
+ },
2032
+ {
2033
+ "type": "fieldset",
2034
+ "notitle": true,
2035
+ "condition": {
2036
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'WindowCovering';"
2037
+ },
2038
+ "items": [
2039
+ {
2040
+ "type": "fieldset",
2041
+ "notitle": true,
2042
+ "items": [
2043
+ {
2044
+ "type": "div",
2045
+ "displayFlex": true,
2046
+ "flex-direction": "row",
2047
+ "items": [
2048
+ {
2049
+ "key": "accessories[].topicGetCurrentHorizontalTiltAngle",
2050
+ "flex": "0 0 50%"
2051
+ }
2052
+ ]
2053
+ },
2054
+ {
2055
+ "type": "div",
2056
+ "displayFlex": true,
2057
+ "flex-direction": "row",
2058
+ "items": [
2059
+ {
2060
+ "key": "accessories[].topicGetTargetHorizontalTiltAngle",
2061
+ "flex": "0 0 50%"
2062
+ },
2063
+ {
2064
+ "key": "accessories[].topicSetTargetHorizontalTiltAngle",
2065
+ "flex": "0 0 50%"
2066
+ }
2067
+ ]
2068
+ },
2069
+ {
2070
+ "type": "div",
2071
+ "displayFlex": true,
2072
+ "flex-direction": "row",
2073
+ "items": [
2074
+ {
2075
+ "type": "div",
2076
+ "displayFlex": true,
2077
+ "flex-direction": "row",
2078
+ "items": [
2079
+ {
2080
+ "key": "accessories[].topicGetCurrentVerticalTiltAngle",
2081
+ "flex": "0 0 50%"
2082
+ }
2083
+ ]
2084
+ }
2085
+ ]
2086
+ },
2087
+ {
2088
+ "type": "div",
2089
+ "displayFlex": true,
2090
+ "flex-direction": "row",
2091
+ "items": [
2092
+ {
2093
+ "key": "accessories[].topicGetTargetVerticalTiltAngle",
2094
+ "flex": "0 0 50%"
2095
+ },
2096
+ {
2097
+ "key": "accessories[].topicSetTargetVerticalTiltAngle",
2098
+ "flex": "0 0 50%"
2099
+ }
2100
+ ]
2101
+ }
2102
+ ]
2103
+ }
2104
+ ]
2105
+ },
2106
+ {
2107
+ "type": "fieldset",
2108
+ "notitle": true,
2109
+ "condition": {
2110
+ "functionBody": "return ['WindowCovering'].includes(model.accessories?.[arguments[1]]?.info?.type);"
2111
+ },
2112
+ "items": [
2113
+ {
2114
+ "type": "div",
2115
+ "displayFlex": true,
2116
+ "flex-direction": "row",
2117
+ "items": [
2118
+ {
2119
+ "key": "accessories[].topicSetHoldPosition",
2120
+ "flex": "0 0 50%"
2121
+ },
2122
+ {
2123
+ "key": "accessories[].topicGetObstructionDetected",
2124
+ "title": "${config.title.topicGetObstructionDetectedOptional}",
2125
+ "flex": "0 0 50%"
2126
+ }
2127
+ ]
2128
+ }
2129
+ ]
2130
+ },
2131
+ {
2132
+ "type": "fieldset",
2133
+ "notitle": true,
2134
+ "condition": {
2135
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'SecuritySystem';"
2136
+ },
2137
+ "items": [
2138
+ {
2139
+ "type": "div",
2140
+ "displayFlex": true,
2141
+ "flex-direction": "row",
2142
+ "items": [
2143
+ {
2144
+ "key": "accessories[].topicGetCurrentSecurityState",
2145
+ "flex": "0 0 50%"
2146
+ }
2147
+ ]
2148
+ },
2149
+ {
2150
+ "type": "div",
2151
+ "displayFlex": true,
2152
+ "flex-direction": "row",
2153
+ "items": [
2154
+ {
2155
+ "key": "accessories[].topicGetTargetSecurityState",
2156
+ "flex": "0 0 50%"
2157
+ },
2158
+ {
2159
+ "key": "accessories[].topicSetTargetSecurityState",
2160
+ "flex": "0 0 50%"
2161
+ }
2162
+ ]
2163
+ },
2164
+ {
2165
+ "type": "div",
2166
+ "displayFlex": true,
2167
+ "flex-direction": "row",
2168
+ "items": [
2169
+ {
2170
+ "key": "accessories[].topicGetStatusTampered",
2171
+ "flex": "0 0 50%"
2172
+ },
2173
+ {
2174
+ "key": "accessories[].topicGetStatusFault",
2175
+ "flex": "0 0 50%"
2176
+ }
2177
+ ]
2178
+ }
2179
+ ]
2180
+ },
2181
+ {
2182
+ "type": "fieldset",
2183
+ "notitle": true,
2184
+ "condition": {
2185
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'AirQualitySensor';"
2186
+ },
2187
+ "items": [
2188
+ {
2189
+ "type": "div",
2190
+ "displayFlex": true,
2191
+ "flex-direction": "row",
2192
+ "items": [
2193
+ {
2194
+ "key": "accessories[].topicGetAirQuality",
2195
+ "flex": "0 0 50%"
2196
+ }
2197
+ ]
2198
+ },
2199
+ {
2200
+ "type": "div",
2201
+ "displayFlex": true,
2202
+ "flex-direction": "row",
2203
+ "items": [
2204
+ {
2205
+ "key": "accessories[].topicGetNitrogenDioxideDensity",
2206
+ "flex": "0 0 50%"
2207
+ },
2208
+ {
2209
+ "key": "accessories[].topicGetOzoneDensity",
2210
+ "flex": "0 0 50%"
2211
+ }
2212
+ ]
2213
+ },
2214
+ {
2215
+ "type": "div",
2216
+ "displayFlex": true,
2217
+ "flex-direction": "row",
2218
+ "items": [
2219
+ {
2220
+ "key": "accessories[].topicGetPM2_5Density",
597
2221
  "flex": "0 0 50%"
598
2222
  },
599
2223
  {
600
- "key": "accessories[].topicSetOn",
2224
+ "key": "accessories[].topicGetPM10Density",
2225
+ "flex": "0 0 50%"
2226
+ }
2227
+ ]
2228
+ },
2229
+ {
2230
+ "type": "div",
2231
+ "displayFlex": true,
2232
+ "flex-direction": "row",
2233
+ "items": [
2234
+ {
2235
+ "key": "accessories[].topicGetSulphurDioxideDensity",
2236
+ "flex": "0 0 50%"
2237
+ },
2238
+ {
2239
+ "key": "accessories[].topicGetVOCDensity",
601
2240
  "flex": "0 0 50%"
602
2241
  }
603
2242
  ]
@@ -608,7 +2247,7 @@
608
2247
  "type": "fieldset",
609
2248
  "notitle": true,
610
2249
  "condition": {
611
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'Lightbulb';"
2250
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'CarbonDioxideSensor';"
612
2251
  },
613
2252
  "items": [
614
2253
  {
@@ -617,11 +2256,7 @@
617
2256
  "flex-direction": "row",
618
2257
  "items": [
619
2258
  {
620
- "key": "accessories[].topicGetBrightness",
621
- "flex": "0 0 50%"
622
- },
623
- {
624
- "key": "accessories[].topicSetBrightness",
2259
+ "key": "accessories[].topicGetCarbonDioxideDetected",
625
2260
  "flex": "0 0 50%"
626
2261
  }
627
2262
  ]
@@ -632,26 +2267,31 @@
632
2267
  "flex-direction": "row",
633
2268
  "items": [
634
2269
  {
635
- "key": "accessories[].topicGetHue",
2270
+ "key": "accessories[].topicGetCarbonDioxideLevel",
636
2271
  "flex": "0 0 50%"
637
2272
  },
638
2273
  {
639
- "key": "accessories[].topicSetHue",
2274
+ "key": "accessories[].topicGetCarbonDioxidePeakLevel",
640
2275
  "flex": "0 0 50%"
641
2276
  }
642
2277
  ]
643
- },
2278
+ }
2279
+ ]
2280
+ },
2281
+ {
2282
+ "type": "fieldset",
2283
+ "notitle": true,
2284
+ "condition": {
2285
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'CarbonMonoxideSensor';"
2286
+ },
2287
+ "items": [
644
2288
  {
645
2289
  "type": "div",
646
2290
  "displayFlex": true,
647
2291
  "flex-direction": "row",
648
2292
  "items": [
649
2293
  {
650
- "key": "accessories[].topicGetColorTemperature",
651
- "flex": "0 0 50%"
652
- },
653
- {
654
- "key": "accessories[].topicSetColorTemperature",
2294
+ "key": "accessories[].topicGetCarbonMonoxideDetected",
655
2295
  "flex": "0 0 50%"
656
2296
  }
657
2297
  ]
@@ -662,22 +2302,36 @@
662
2302
  "flex-direction": "row",
663
2303
  "items": [
664
2304
  {
665
- "key": "accessories[].topicGetSaturation",
2305
+ "key": "accessories[].topicGetCarbonMonoxideLevel",
666
2306
  "flex": "0 0 50%"
667
2307
  },
668
2308
  {
669
- "key": "accessories[].topicSetSaturation",
2309
+ "key": "accessories[].topicGetCarbonMonoxidePeakLevel",
670
2310
  "flex": "0 0 50%"
671
2311
  }
672
2312
  ]
673
2313
  }
674
2314
  ]
675
2315
  },
2316
+ {
2317
+ "type": "div",
2318
+ "displayFlex": true,
2319
+ "flex-direction": "row",
2320
+ "condition": {
2321
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'ContactSensor';"
2322
+ },
2323
+ "items": [
2324
+ {
2325
+ "key": "accessories[].topicGetContactSensorState",
2326
+ "flex": "0 0 50%"
2327
+ }
2328
+ ]
2329
+ },
676
2330
  {
677
2331
  "type": "fieldset",
678
2332
  "notitle": true,
679
2333
  "condition": {
680
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'Outlet';"
2334
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'AirPurifier';"
681
2335
  },
682
2336
  "items": [
683
2337
  {
@@ -686,7 +2340,22 @@
686
2340
  "flex-direction": "row",
687
2341
  "items": [
688
2342
  {
689
- "key": "accessories[].topicGetOutletInUse",
2343
+ "key": "accessories[].topicGetCurrentPurifierState",
2344
+ "flex": "0 0 50%"
2345
+ }
2346
+ ]
2347
+ },
2348
+ {
2349
+ "type": "div",
2350
+ "displayFlex": true,
2351
+ "flex-direction": "row",
2352
+ "items": [
2353
+ {
2354
+ "key": "accessories[].topicGetTargetPurifierState",
2355
+ "flex": "0 0 50%"
2356
+ },
2357
+ {
2358
+ "key": "accessories[].topicSetTargetPurifierState",
690
2359
  "flex": "0 0 50%"
691
2360
  }
692
2361
  ]
@@ -697,7 +2366,7 @@
697
2366
  "type": "fieldset",
698
2367
  "notitle": true,
699
2368
  "condition": {
700
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'SecuritySystem';"
2369
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'HeaterCooler';"
701
2370
  },
702
2371
  "items": [
703
2372
  {
@@ -706,7 +2375,22 @@
706
2375
  "flex-direction": "row",
707
2376
  "items": [
708
2377
  {
709
- "key": "accessories[].topicGetCurrentSecurityState",
2378
+ "key": "accessories[].topicGetCurrentTemperature",
2379
+ "flex": "0 0 50%"
2380
+ },
2381
+ {
2382
+ "key": "accessories[].temperatureUnits",
2383
+ "flex": "0 0 25%"
2384
+ }
2385
+ ]
2386
+ },
2387
+ {
2388
+ "type": "div",
2389
+ "displayFlex": true,
2390
+ "flex-direction": "row",
2391
+ "items": [
2392
+ {
2393
+ "key": "accessories[].topicGetCurrentHeaterCoolerState",
710
2394
  "flex": "0 0 50%"
711
2395
  }
712
2396
  ]
@@ -717,26 +2401,35 @@
717
2401
  "flex-direction": "row",
718
2402
  "items": [
719
2403
  {
720
- "key": "accessories[].topicGetTargetSecurityState",
2404
+ "key": "accessories[].topicGetTargetHeaterCoolerState",
721
2405
  "flex": "0 0 50%"
722
2406
  },
723
2407
  {
724
- "key": "accessories[].topicSetTargetSecurityState",
2408
+ "key": "accessories[].topicSetTargetHeaterCoolerState",
725
2409
  "flex": "0 0 50%"
726
2410
  }
727
2411
  ]
728
- },
2412
+ }
2413
+ ]
2414
+ },
2415
+ {
2416
+ "type": "fieldset",
2417
+ "notitle": true,
2418
+ "condition": {
2419
+ "functionBody": "return ['AirPurifier', 'Fanv2', 'HeaterCooler'].includes(model.accessories?.[arguments[1]]?.info?.type);"
2420
+ },
2421
+ "items": [
729
2422
  {
730
2423
  "type": "div",
731
2424
  "displayFlex": true,
732
2425
  "flex-direction": "row",
733
2426
  "items": [
734
2427
  {
735
- "key": "accessories[].topicGetStatusTampered",
2428
+ "key": "accessories[].topicGetActive",
736
2429
  "flex": "0 0 50%"
737
2430
  },
738
2431
  {
739
- "key": "accessories[].topicGetStatusFault",
2432
+ "key": "accessories[].topicSetActive",
740
2433
  "flex": "0 0 50%"
741
2434
  }
742
2435
  ]
@@ -747,7 +2440,7 @@
747
2440
  "type": "fieldset",
748
2441
  "notitle": true,
749
2442
  "condition": {
750
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'CarbonDioxideSensor';"
2443
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'Fanv2';"
751
2444
  },
752
2445
  "items": [
753
2446
  {
@@ -756,7 +2449,7 @@
756
2449
  "flex-direction": "row",
757
2450
  "items": [
758
2451
  {
759
- "key": "accessories[].topicGetCarbonDioxideDetected",
2452
+ "key": "accessories[].topicGetCurrentFanState",
760
2453
  "flex": "0 0 50%"
761
2454
  }
762
2455
  ]
@@ -767,11 +2460,26 @@
767
2460
  "flex-direction": "row",
768
2461
  "items": [
769
2462
  {
770
- "key": "accessories[].topicGetCarbonDioxideLevel",
2463
+ "key": "accessories[].topicGetTargetFanState",
771
2464
  "flex": "0 0 50%"
772
2465
  },
773
2466
  {
774
- "key": "accessories[].topicGetCarbonDioxidePeakLevel",
2467
+ "key": "accessories[].topicSetTargetFanState",
2468
+ "flex": "0 0 50%"
2469
+ }
2470
+ ]
2471
+ },
2472
+ {
2473
+ "type": "div",
2474
+ "displayFlex": true,
2475
+ "flex-direction": "row",
2476
+ "items": [
2477
+ {
2478
+ "key": "accessories[].topicGetRotationDirection",
2479
+ "flex": "0 0 50%"
2480
+ },
2481
+ {
2482
+ "key": "accessories[].topicSetRotationDirection",
775
2483
  "flex": "0 0 50%"
776
2484
  }
777
2485
  ]
@@ -782,7 +2490,7 @@
782
2490
  "type": "fieldset",
783
2491
  "notitle": true,
784
2492
  "condition": {
785
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'CarbonMonoxideSensor';"
2493
+ "functionBody": "return ['AirPurifier', 'Fanv2', 'HeaterCooler'].includes(model.accessories?.[arguments[1]]?.info?.type);"
786
2494
  },
787
2495
  "items": [
788
2496
  {
@@ -791,7 +2499,11 @@
791
2499
  "flex-direction": "row",
792
2500
  "items": [
793
2501
  {
794
- "key": "accessories[].topicGetCarbonMonoxideDetected",
2502
+ "key": "accessories[].topicGetLockPhysicalControls",
2503
+ "flex": "0 0 50%"
2504
+ },
2505
+ {
2506
+ "key": "accessories[].topicSetLockPhysicalControls",
795
2507
  "flex": "0 0 50%"
796
2508
  }
797
2509
  ]
@@ -802,11 +2514,26 @@
802
2514
  "flex-direction": "row",
803
2515
  "items": [
804
2516
  {
805
- "key": "accessories[].topicGetCarbonMonoxideLevel",
2517
+ "key": "accessories[].topicGetRotationSpeed",
806
2518
  "flex": "0 0 50%"
807
2519
  },
808
2520
  {
809
- "key": "accessories[].topicGetCarbonMonoxidePeakLevel",
2521
+ "key": "accessories[].topicSetRotationSpeed",
2522
+ "flex": "0 0 50%"
2523
+ }
2524
+ ]
2525
+ },
2526
+ {
2527
+ "type": "div",
2528
+ "displayFlex": true,
2529
+ "flex-direction": "row",
2530
+ "items": [
2531
+ {
2532
+ "key": "accessories[].topicGetSwingMode",
2533
+ "flex": "0 0 50%"
2534
+ },
2535
+ {
2536
+ "key": "accessories[].topicSetSwingMode",
810
2537
  "flex": "0 0 50%"
811
2538
  }
812
2539
  ]
@@ -818,12 +2545,100 @@
818
2545
  "displayFlex": true,
819
2546
  "flex-direction": "row",
820
2547
  "condition": {
821
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'ContactSensor';"
2548
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'HumiditySensor';"
2549
+ },
2550
+ "items": [
2551
+ {
2552
+ "key": "accessories[].topicGetCurrentRelativeHumidity",
2553
+ "flex": "0 0 50%"
2554
+ }
2555
+ ]
2556
+ },
2557
+ {
2558
+ "type": "div",
2559
+ "displayFlex": true,
2560
+ "flex-direction": "row",
2561
+ "condition": {
2562
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'LeakSensor';"
2563
+ },
2564
+ "items": [
2565
+ {
2566
+ "key": "accessories[].topicGetLeakDetected",
2567
+ "flex": "0 0 50%"
2568
+ }
2569
+ ]
2570
+ },
2571
+ {
2572
+ "type": "div",
2573
+ "displayFlex": true,
2574
+ "flex-direction": "row",
2575
+ "condition": {
2576
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'LightSensor';"
2577
+ },
2578
+ "items": [
2579
+ {
2580
+ "key": "accessories[].topicGetCurrentAmbientLightLevel",
2581
+ "flex": "0 0 50%"
2582
+ }
2583
+ ]
2584
+ },
2585
+ {
2586
+ "type": "div",
2587
+ "displayFlex": true,
2588
+ "flex-direction": "row",
2589
+ "condition": {
2590
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'MotionSensor';"
2591
+ },
2592
+ "items": [
2593
+ {
2594
+ "key": "accessories[].topicGetMotionDetected",
2595
+ "flex": "0 0 50%"
2596
+ }
2597
+ ]
2598
+ },
2599
+ {
2600
+ "type": "div",
2601
+ "displayFlex": true,
2602
+ "flex-direction": "row",
2603
+ "condition": {
2604
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'OccupancySensor';"
2605
+ },
2606
+ "items": [
2607
+ {
2608
+ "key": "accessories[].topicGetOccupancyDetected",
2609
+ "flex": "0 0 50%"
2610
+ }
2611
+ ]
2612
+ },
2613
+ {
2614
+ "type": "div",
2615
+ "displayFlex": true,
2616
+ "flex-direction": "row",
2617
+ "condition": {
2618
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'SmokeSensor';"
2619
+ },
2620
+ "items": [
2621
+ {
2622
+ "key": "accessories[].topicGetSmokeDetected",
2623
+ "flex": "0 0 50%"
2624
+ }
2625
+ ]
2626
+ },
2627
+ {
2628
+ "type": "div",
2629
+ "displayFlex": true,
2630
+ "flex-direction": "row",
2631
+ "condition": {
2632
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'TemperatureSensor';"
822
2633
  },
823
2634
  "items": [
824
2635
  {
825
- "key": "accessories[].topicGetContactSensorState",
826
- "flex": "0 0 50%"
2636
+ "key": "accessories[].topicGetCurrentTemperature",
2637
+ "flex": "0 0 67%"
2638
+ },
2639
+ {
2640
+ "key": "accessories[].temperatureUnits",
2641
+ "flex": "0 0 33%"
827
2642
  }
828
2643
  ]
829
2644
  },
@@ -831,7 +2646,7 @@
831
2646
  "type": "fieldset",
832
2647
  "notitle": true,
833
2648
  "condition": {
834
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'HeaterCooler';"
2649
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'Thermostat';"
835
2650
  },
836
2651
  "items": [
837
2652
  {
@@ -840,13 +2655,8 @@
840
2655
  "flex-direction": "row",
841
2656
  "items": [
842
2657
  {
843
- "key": "accessories[].topicGetCurrentTemperature",
2658
+ "key": "accessories[].topicGetCurrentHeatingCoolingState",
844
2659
  "flex": "0 0 50%"
845
- },
846
- {
847
- "key": "accessories[].temperatureUnits",
848
- "title": "${config.title.sourceUnits}",
849
- "flex": "0 0 25%"
850
2660
  }
851
2661
  ]
852
2662
  },
@@ -856,11 +2666,11 @@
856
2666
  "flex-direction": "row",
857
2667
  "items": [
858
2668
  {
859
- "key": "accessories[].topicGetActive",
2669
+ "key": "accessories[].topicGetTargetHeatingCoolingState",
860
2670
  "flex": "0 0 50%"
861
2671
  },
862
2672
  {
863
- "key": "accessories[].topicSetActive",
2673
+ "key": "accessories[].topicSetTargetHeatingCoolingState",
864
2674
  "flex": "0 0 50%"
865
2675
  }
866
2676
  ]
@@ -871,8 +2681,12 @@
871
2681
  "flex-direction": "row",
872
2682
  "items": [
873
2683
  {
874
- "key": "accessories[].topicGetCurrentHeaterCoolerState",
2684
+ "key": "accessories[].topicGetCurrentTemperature",
875
2685
  "flex": "0 0 50%"
2686
+ },
2687
+ {
2688
+ "key": "accessories[].temperatureUnits",
2689
+ "flex": "0 0 25%"
876
2690
  }
877
2691
  ]
878
2692
  },
@@ -882,11 +2696,11 @@
882
2696
  "flex-direction": "row",
883
2697
  "items": [
884
2698
  {
885
- "key": "accessories[].topicGetTargetHeaterCoolerState",
2699
+ "key": "accessories[].topicGetTargetTemperature",
886
2700
  "flex": "0 0 50%"
887
2701
  },
888
2702
  {
889
- "key": "accessories[].topicSetTargetHeaterCoolerState",
2703
+ "key": "accessories[].topicSetTargetTemperature",
890
2704
  "flex": "0 0 50%"
891
2705
  }
892
2706
  ]
@@ -897,11 +2711,8 @@
897
2711
  "flex-direction": "row",
898
2712
  "items": [
899
2713
  {
900
- "key": "accessories[].topicGetCoolingThresholdTemperature",
901
- "flex": "0 0 50%"
902
- },
903
- {
904
- "key": "accessories[].topicSetCoolingThresholdTemperature",
2714
+ "key": "accessories[].topicGetCurrentRelativeHumidity",
2715
+ "title": "${config.title.topicGetCurrentRelativeHumidityOptional}",
905
2716
  "flex": "0 0 50%"
906
2717
  }
907
2718
  ]
@@ -912,26 +2723,35 @@
912
2723
  "flex-direction": "row",
913
2724
  "items": [
914
2725
  {
915
- "key": "accessories[].topicGetHeatingThresholdTemperature",
2726
+ "key": "accessories[].topicGetTargetRelativeHumidity",
916
2727
  "flex": "0 0 50%"
917
2728
  },
918
2729
  {
919
- "key": "accessories[].topicSetHeatingThresholdTemperature",
2730
+ "key": "accessories[].topicSetTargetRelativeHumidity",
920
2731
  "flex": "0 0 50%"
921
2732
  }
922
2733
  ]
923
- },
2734
+ }
2735
+ ]
2736
+ },
2737
+ {
2738
+ "type": "fieldset",
2739
+ "notitle": true,
2740
+ "condition": {
2741
+ "functionBody": "return ['HeaterCooler', 'Thermostat'].includes(model.accessories?.[arguments[1]]?.info?.type);"
2742
+ },
2743
+ "items": [
924
2744
  {
925
2745
  "type": "div",
926
2746
  "displayFlex": true,
927
2747
  "flex-direction": "row",
928
2748
  "items": [
929
2749
  {
930
- "key": "accessories[].topicGetLockPhysicalControls",
2750
+ "key": "accessories[].topicGetCoolingThresholdTemperature",
931
2751
  "flex": "0 0 50%"
932
2752
  },
933
2753
  {
934
- "key": "accessories[].topicSetLockPhysicalControls",
2754
+ "key": "accessories[].topicSetCoolingThresholdTemperature",
935
2755
  "flex": "0 0 50%"
936
2756
  }
937
2757
  ]
@@ -942,26 +2762,46 @@
942
2762
  "flex-direction": "row",
943
2763
  "items": [
944
2764
  {
945
- "key": "accessories[].topicGetRotationSpeed",
2765
+ "key": "accessories[].topicGetHeatingThresholdTemperature",
946
2766
  "flex": "0 0 50%"
947
2767
  },
948
2768
  {
949
- "key": "accessories[].topicSetRotationSpeed",
2769
+ "key": "accessories[].topicSetHeatingThresholdTemperature",
950
2770
  "flex": "0 0 50%"
951
2771
  }
952
2772
  ]
953
- },
2773
+ }
2774
+ ]
2775
+ },
2776
+ {
2777
+ "type": "fieldset",
2778
+ "notitle": true,
2779
+ "condition": {
2780
+ "functionBody": "return ['AirPurifier', 'HeaterCooler'].includes(model.accessories?.[arguments[1]]?.info?.type);"
2781
+ },
2782
+ "items": [
954
2783
  {
955
2784
  "type": "div",
956
2785
  "displayFlex": true,
957
2786
  "flex-direction": "row",
958
2787
  "items": [
959
2788
  {
960
- "key": "accessories[].topicGetSwingMode",
2789
+ "key": "accessories[].topicGetFilterChangeIndication",
961
2790
  "flex": "0 0 50%"
962
2791
  },
963
2792
  {
964
- "key": "accessories[].topicSetSwingMode",
2793
+ "key": "accessories[].topicGetFilterLifeLevel",
2794
+ "flex": "0 0 50%"
2795
+ }
2796
+ ]
2797
+ },
2798
+ {
2799
+ "type": "div",
2800
+ "displayFlex": true,
2801
+ "flex-direction": "row",
2802
+ "items": [
2803
+ {
2804
+ "key": "accessories[].topicResetFilterIndication",
965
2805
  "flex": "0 0 50%"
966
2806
  }
967
2807
  ]
@@ -973,25 +2813,15 @@
973
2813
  "displayFlex": true,
974
2814
  "flex-direction": "row",
975
2815
  "condition": {
976
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'HumiditySensor';"
2816
+ "functionBody": "const type = model.accessories?.[arguments[1]]?.info?.type; return type !== undefined && type.endsWith('Sensor');"
977
2817
  },
978
2818
  "items": [
979
2819
  {
980
- "key": "accessories[].topicGetCurrentRelativeHumidity",
2820
+ "key": "accessories[].topicGetStatusFault",
981
2821
  "flex": "0 0 50%"
982
- }
983
- ]
984
- },
985
- {
986
- "type": "div",
987
- "displayFlex": true,
988
- "flex-direction": "row",
989
- "condition": {
990
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'LeakSensor';"
991
- },
992
- "items": [
2822
+ },
993
2823
  {
994
- "key": "accessories[].topicGetLeakDetected",
2824
+ "key": "accessories[].topicGetStatusTampered",
995
2825
  "flex": "0 0 50%"
996
2826
  }
997
2827
  ]
@@ -1000,12 +2830,13 @@
1000
2830
  "type": "div",
1001
2831
  "displayFlex": true,
1002
2832
  "flex-direction": "row",
1003
- "condition": {
1004
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'MotionSensor';"
1005
- },
1006
2833
  "items": [
1007
2834
  {
1008
- "key": "accessories[].topicGetMotionDetected",
2835
+ "key": "accessories[].topicGetBatteryLevel",
2836
+ "flex": "0 0 50%"
2837
+ },
2838
+ {
2839
+ "key": "accessories[].topicGetBatteryLow",
1009
2840
  "flex": "0 0 50%"
1010
2841
  }
1011
2842
  ]
@@ -1014,46 +2845,95 @@
1014
2845
  "type": "div",
1015
2846
  "displayFlex": true,
1016
2847
  "flex-direction": "row",
1017
- "condition": {
1018
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'OccupancySensor';"
1019
- },
1020
2848
  "items": [
1021
2849
  {
1022
- "key": "accessories[].topicGetOccupancyDetected",
2850
+ "key": "accessories[].topicGetStatusActive",
1023
2851
  "flex": "0 0 50%"
1024
2852
  }
1025
2853
  ]
1026
- },
2854
+ }
2855
+ ]
2856
+ },
2857
+ {
2858
+ "type": "fieldset",
2859
+ "title": "${config.title.values}",
2860
+ "description": "${config.description.values}",
2861
+ "condition": {
2862
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type !== undefined;"
2863
+ },
2864
+ "items": [
1027
2865
  {
1028
- "type": "div",
1029
- "displayFlex": true,
1030
- "flex-direction": "row",
2866
+ "type": "fieldset",
2867
+ "notitle": true,
1031
2868
  "condition": {
1032
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'SmokeSensor';"
2869
+ "functionBody": "return ['AirPurifier', 'Fanv2', 'HeaterCooler'].includes(model.accessories?.[arguments[1]]?.info?.type);"
1033
2870
  },
1034
2871
  "items": [
1035
2872
  {
1036
- "key": "accessories[].topicGetSmokeDetected",
1037
- "flex": "0 0 50%"
2873
+ "type": "div",
2874
+ "displayFlex": true,
2875
+ "flex-direction": "row",
2876
+ "items": [
2877
+ {
2878
+ "key": "accessories[].valueStateActive",
2879
+ "flex": "0 0 20%"
2880
+ },
2881
+ {
2882
+ "key": "accessories[].valueStateInactive",
2883
+ "flex": "0 0 20%"
2884
+ }
2885
+ ]
1038
2886
  }
1039
2887
  ]
1040
2888
  },
1041
2889
  {
1042
- "type": "div",
1043
- "displayFlex": true,
1044
- "flex-direction": "row",
2890
+ "type": "fieldset",
2891
+ "notitle": true,
1045
2892
  "condition": {
1046
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'TemperatureSensor';"
2893
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'Fanv2';"
1047
2894
  },
1048
2895
  "items": [
1049
2896
  {
1050
- "key": "accessories[].topicGetCurrentTemperature",
1051
- "flex": "0 0 67%"
2897
+ "type": "div",
2898
+ "displayFlex": true,
2899
+ "flex-direction": "row",
2900
+ "items": [
2901
+ {
2902
+ "key": "accessories[].valueModeAuto",
2903
+ "flex": "0 0 20%"
2904
+ },
2905
+ {
2906
+ "key": "accessories[].valueModeManual",
2907
+ "flex": "0 0 20%"
2908
+ },
2909
+ {
2910
+ "key": "accessories[].valueModeBlowing",
2911
+ "flex": "0 0 20%"
2912
+ },
2913
+ {
2914
+ "key": "accessories[].valueModeIdle",
2915
+ "flex": "0 0 20%"
2916
+ },
2917
+ {
2918
+ "key": "accessories[].valueModeInactive",
2919
+ "flex": "0 0 20%"
2920
+ }
2921
+ ]
1052
2922
  },
1053
2923
  {
1054
- "key": "accessories[].temperatureUnits",
1055
- "title": "${config.title.sourceUnits}",
1056
- "flex": "0 0 33%"
2924
+ "type": "div",
2925
+ "displayFlex": true,
2926
+ "flex-direction": "row",
2927
+ "items": [
2928
+ {
2929
+ "key": "accessories[].valueDirectionClockwise",
2930
+ "flex": "0 0 20%"
2931
+ },
2932
+ {
2933
+ "key": "accessories[].valueDirectionCounterClockwise",
2934
+ "flex": "0 0 20%"
2935
+ }
2936
+ ]
1057
2937
  }
1058
2938
  ]
1059
2939
  },
@@ -1061,7 +2941,7 @@
1061
2941
  "type": "fieldset",
1062
2942
  "notitle": true,
1063
2943
  "condition": {
1064
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'Thermostat';"
2944
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'AirPurifier';"
1065
2945
  },
1066
2946
  "items": [
1067
2947
  {
@@ -1070,81 +2950,148 @@
1070
2950
  "flex-direction": "row",
1071
2951
  "items": [
1072
2952
  {
1073
- "key": "accessories[].topicGetCurrentHeatingCoolingState",
1074
- "flex": "0 0 50%"
2953
+ "key": "accessories[].valueModeAuto",
2954
+ "flex": "0 0 20%"
2955
+ },
2956
+ {
2957
+ "key": "accessories[].valueModeManual",
2958
+ "flex": "0 0 20%"
2959
+ },
2960
+ {
2961
+ "key": "accessories[].valueModePurifying",
2962
+ "flex": "0 0 20%"
2963
+ },
2964
+ {
2965
+ "key": "accessories[].valueModeIdle",
2966
+ "flex": "0 0 20%"
2967
+ },
2968
+ {
2969
+ "key": "accessories[].valueModeInactive",
2970
+ "flex": "0 0 20%"
1075
2971
  }
1076
2972
  ]
1077
- },
2973
+ }
2974
+ ]
2975
+ },
2976
+ {
2977
+ "type": "fieldset",
2978
+ "notitle": true,
2979
+ "condition": {
2980
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'HeaterCooler';"
2981
+ },
2982
+ "items": [
1078
2983
  {
1079
2984
  "type": "div",
1080
2985
  "displayFlex": true,
1081
2986
  "flex-direction": "row",
1082
2987
  "items": [
1083
2988
  {
1084
- "key": "accessories[].topicGetTargetHeatingCoolingState",
1085
- "flex": "0 0 50%"
2989
+ "key": "accessories[].valueModeAuto",
2990
+ "flex": "0 0 20%"
1086
2991
  },
1087
2992
  {
1088
- "key": "accessories[].topicSetTargetHeatingCoolingState",
1089
- "flex": "0 0 50%"
2993
+ "key": "accessories[].valueModeCool",
2994
+ "flex": "0 0 20%"
2995
+ },
2996
+ {
2997
+ "key": "accessories[].valueModeHeat",
2998
+ "flex": "0 0 20%"
2999
+ },
3000
+ {
3001
+ "key": "accessories[].valueModeIdle",
3002
+ "flex": "0 0 20%"
3003
+ },
3004
+ {
3005
+ "key": "accessories[].valueModeInactive",
3006
+ "flex": "0 0 20%"
1090
3007
  }
1091
3008
  ]
1092
- },
3009
+ }
3010
+ ]
3011
+ },
3012
+ {
3013
+ "type": "fieldset",
3014
+ "notitle": true,
3015
+ "condition": {
3016
+ "functionBody": "return ['AirPurifier', 'Fanv2', 'HeaterCooler'].includes(model.accessories?.[arguments[1]]?.info?.type);"
3017
+ },
3018
+ "items": [
1093
3019
  {
1094
3020
  "type": "div",
1095
3021
  "displayFlex": true,
1096
3022
  "flex-direction": "row",
1097
3023
  "items": [
1098
3024
  {
1099
- "key": "accessories[].topicGetCurrentTemperature",
1100
- "flex": "0 0 50%"
3025
+ "key": "accessories[].valueControlLock",
3026
+ "flex": "0 0 20%"
3027
+ },
3028
+ {
3029
+ "key": "accessories[].valueControlUnlock",
3030
+ "flex": "0 0 20%"
3031
+ },
3032
+ {
3033
+ "key": "accessories[].valueSwingEnabled",
3034
+ "flex": "0 0 20%"
1101
3035
  },
1102
3036
  {
1103
- "key": "accessories[].temperatureUnits",
1104
- "title": "${config.title.sourceUnits}",
1105
- "flex": "0 0 25%"
3037
+ "key": "accessories[].valueSwingDisabled",
3038
+ "flex": "0 0 20%"
1106
3039
  }
1107
3040
  ]
1108
- },
3041
+ }
3042
+ ]
3043
+ },
3044
+ {
3045
+ "type": "fieldset",
3046
+ "notitle": true,
3047
+ "condition": {
3048
+ "functionBody": "return ['AirPurifier', 'HeaterCooler'].includes(model.accessories?.[arguments[1]]?.info?.type);"
3049
+ },
3050
+ "items": [
1109
3051
  {
1110
3052
  "type": "div",
1111
3053
  "displayFlex": true,
1112
3054
  "flex-direction": "row",
1113
3055
  "items": [
1114
3056
  {
1115
- "key": "accessories[].topicGetTargetTemperature",
1116
- "flex": "0 0 50%"
3057
+ "key": "accessories[].valueFilterChange",
3058
+ "flex": "0 0 20%"
1117
3059
  },
1118
3060
  {
1119
- "key": "accessories[].topicSetTargetTemperature",
1120
- "flex": "0 0 50%"
3061
+ "key": "accessories[].valueFilterReset",
3062
+ "flex": "0 0 20%"
1121
3063
  }
1122
3064
  ]
1123
- },
3065
+ }
3066
+ ]
3067
+ },
3068
+ {
3069
+ "type": "fieldset",
3070
+ "notitle": true,
3071
+ "condition": {
3072
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'GarageDoorOpener';"
3073
+ },
3074
+ "items": [
1124
3075
  {
1125
3076
  "type": "div",
1126
3077
  "displayFlex": true,
1127
3078
  "flex-direction": "row",
1128
3079
  "items": [
1129
3080
  {
1130
- "key": "accessories[].topicGetCurrentRelativeHumidity",
1131
- "title": "${config.title.topicGetCurrentRelativeHumidityOptional}",
1132
- "flex": "0 0 50%"
1133
- }
1134
- ]
1135
- },
1136
- {
1137
- "type": "div",
1138
- "displayFlex": true,
1139
- "flex-direction": "row",
1140
- "items": [
3081
+ "key": "accessories[].valueDoorStateOpen",
3082
+ "flex": "0 0 25%"
3083
+ },
1141
3084
  {
1142
- "key": "accessories[].topicGetTargetRelativeHumidity",
1143
- "flex": "0 0 50%"
3085
+ "key": "accessories[].valueDoorStateClosed",
3086
+ "flex": "0 0 25%"
1144
3087
  },
1145
3088
  {
1146
- "key": "accessories[].topicSetTargetRelativeHumidity",
1147
- "flex": "0 0 50%"
3089
+ "key": "accessories[].valueDoorStateOpening",
3090
+ "flex": "0 0 25%"
3091
+ },
3092
+ {
3093
+ "key": "accessories[].valueDoorStateClosing",
3094
+ "flex": "0 0 25%"
1148
3095
  }
1149
3096
  ]
1150
3097
  },
@@ -1154,12 +3101,12 @@
1154
3101
  "flex-direction": "row",
1155
3102
  "items": [
1156
3103
  {
1157
- "key": "accessories[].topicGetCoolingThresholdTemperature",
1158
- "flex": "0 0 50%"
3104
+ "key": "accessories[].valueDoorStateStopped",
3105
+ "flex": "0 0 25%"
1159
3106
  },
1160
3107
  {
1161
- "key": "accessories[].topicSetCoolingThresholdTemperature",
1162
- "flex": "0 0 50%"
3108
+ "key": "accessories[].valueDoorObstructed",
3109
+ "flex": "0 0 25%"
1163
3110
  }
1164
3111
  ]
1165
3112
  },
@@ -1169,12 +3116,18 @@
1169
3116
  "flex-direction": "row",
1170
3117
  "items": [
1171
3118
  {
1172
- "key": "accessories[].topicGetHeatingThresholdTemperature",
1173
- "flex": "0 0 50%"
3119
+ "key": "accessories[].valueLockStateSecured",
3120
+ "title": "${config.title.valueLockStateSecuredOptional}",
3121
+ "flex": "0 0 25%"
1174
3122
  },
1175
3123
  {
1176
- "key": "accessories[].topicSetHeatingThresholdTemperature",
1177
- "flex": "0 0 50%"
3124
+ "key": "accessories[].valueLockStateUnsecured",
3125
+ "title": "${config.title.valueLockStateUnsecuredOptional}",
3126
+ "flex": "0 0 25%"
3127
+ },
3128
+ {
3129
+ "key": "accessories[].valueLockStateJammed",
3130
+ "flex": "0 0 25%"
1178
3131
  }
1179
3132
  ]
1180
3133
  }
@@ -1185,59 +3138,28 @@
1185
3138
  "displayFlex": true,
1186
3139
  "flex-direction": "row",
1187
3140
  "condition": {
1188
- "functionBody": "const type = model.accessories?.[arguments[1]]?.info?.type; return type !== undefined && type.endsWith('Sensor');"
3141
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'LockMechanism';"
1189
3142
  },
1190
3143
  "items": [
1191
3144
  {
1192
- "key": "accessories[].topicGetStatusFault",
1193
- "flex": "0 0 50%"
3145
+ "key": "accessories[].valueLockStateSecured",
3146
+ "flex": "0 0 25%"
1194
3147
  },
1195
3148
  {
1196
- "key": "accessories[].topicGetStatusTampered",
1197
- "flex": "0 0 50%"
1198
- }
1199
- ]
1200
- },
1201
- {
1202
- "type": "div",
1203
- "displayFlex": true,
1204
- "flex-direction": "row",
1205
- "items": [
1206
- {
1207
- "key": "accessories[].topicGetBatteryLevel",
1208
- "flex": "0 0 50%"
3149
+ "key": "accessories[].valueLockStateUnsecured",
3150
+ "flex": "0 0 25%"
1209
3151
  },
1210
3152
  {
1211
- "key": "accessories[].topicGetBatteryLow",
1212
- "flex": "0 0 50%"
3153
+ "key": "accessories[].valueLockStateJammed",
3154
+ "flex": "0 0 25%"
1213
3155
  }
1214
3156
  ]
1215
3157
  },
1216
3158
  {
1217
- "type": "div",
1218
- "displayFlex": true,
1219
- "flex-direction": "row",
1220
- "items": [
1221
- {
1222
- "key": "accessories[].topicGetStatusActive",
1223
- "flex": "0 0 50%"
1224
- }
1225
- ]
1226
- }
1227
- ]
1228
- },
1229
- {
1230
- "type": "fieldset",
1231
- "title": "${config.title.values}",
1232
- "condition": {
1233
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type !== undefined;"
1234
- },
1235
- "items": [
1236
- {
1237
3159
  "type": "fieldset",
1238
3160
  "notitle": true,
1239
3161
  "condition": {
1240
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'HeaterCooler';"
3162
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'Valve';"
1241
3163
  },
1242
3164
  "items": [
1243
3165
  {
@@ -1246,39 +3168,16 @@
1246
3168
  "flex-direction": "row",
1247
3169
  "items": [
1248
3170
  {
1249
- "key": "accessories[].valueStateActive",
1250
- "flex": "0 0 20%"
1251
- },
1252
- {
1253
- "key": "accessories[].valueStateInactive",
1254
- "flex": "0 0 20%"
1255
- }
1256
- ]
1257
- },
1258
- {
1259
- "type": "div",
1260
- "displayFlex": true,
1261
- "flex-direction": "row",
1262
- "items": [
1263
- {
1264
- "key": "accessories[].valueModeAuto",
1265
- "flex": "0 0 20%"
1266
- },
1267
- {
1268
- "key": "accessories[].valueModeCool",
1269
- "flex": "0 0 20%"
1270
- },
1271
- {
1272
- "key": "accessories[].valueModeHeat",
1273
- "flex": "0 0 20%"
3171
+ "key": "accessories[].valueActive",
3172
+ "flex": "0 0 25%"
1274
3173
  },
1275
3174
  {
1276
- "key": "accessories[].valueModeIdle",
1277
- "flex": "0 0 20%"
3175
+ "key": "accessories[].valueInactive",
3176
+ "flex": "0 0 25%"
1278
3177
  },
1279
3178
  {
1280
- "key": "accessories[].valueModeInactive",
1281
- "flex": "0 0 20%"
3179
+ "key": "accessories[].valueInUse",
3180
+ "flex": "0 0 25%"
1282
3181
  }
1283
3182
  ]
1284
3183
  },
@@ -1288,20 +3187,16 @@
1288
3187
  "flex-direction": "row",
1289
3188
  "items": [
1290
3189
  {
1291
- "key": "accessories[].valueControlLock",
1292
- "flex": "0 0 20%"
1293
- },
1294
- {
1295
- "key": "accessories[].valueControlUnlock",
1296
- "flex": "0 0 20%"
3190
+ "key": "accessories[].valueConfigured",
3191
+ "flex": "0 0 25%"
1297
3192
  },
1298
3193
  {
1299
- "key": "accessories[].valueSwingEnabled",
1300
- "flex": "0 0 20%"
3194
+ "key": "accessories[].valueNotConfigured",
3195
+ "flex": "0 0 25%"
1301
3196
  },
1302
3197
  {
1303
- "key": "accessories[].valueSwingDisabled",
1304
- "flex": "0 0 20%"
3198
+ "key": "accessories[].valueFault",
3199
+ "flex": "0 0 25%"
1305
3200
  }
1306
3201
  ]
1307
3202
  }
@@ -1312,19 +3207,15 @@
1312
3207
  "displayFlex": true,
1313
3208
  "flex-direction": "row",
1314
3209
  "condition": {
1315
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'LockMechanism';"
3210
+ "functionBody": "return ['Lightbulb', 'Outlet', 'Switch'].includes(model.accessories?.[arguments[1]]?.info?.type);"
1316
3211
  },
1317
3212
  "items": [
1318
3213
  {
1319
- "key": "accessories[].valueLockStateSecured",
1320
- "flex": "0 0 25%"
1321
- },
1322
- {
1323
- "key": "accessories[].valueLockStateUnsecured",
3214
+ "key": "accessories[].valueOn",
1324
3215
  "flex": "0 0 25%"
1325
3216
  },
1326
3217
  {
1327
- "key": "accessories[].valueLockStateJammed",
3218
+ "key": "accessories[].valueOff",
1328
3219
  "flex": "0 0 25%"
1329
3220
  }
1330
3221
  ]
@@ -1334,30 +3225,59 @@
1334
3225
  "displayFlex": true,
1335
3226
  "flex-direction": "row",
1336
3227
  "condition": {
1337
- "functionBody": "return ['Lightbulb', 'Outlet', 'Switch'].includes(model.accessories?.[arguments[1]]?.info?.type);"
3228
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'Outlet';"
1338
3229
  },
1339
3230
  "items": [
1340
3231
  {
1341
- "key": "accessories[].valueOn",
1342
- "flex": "0 0 25%"
1343
- },
1344
- {
1345
- "key": "accessories[].valueOff",
3232
+ "key": "accessories[].valueOutletInUse",
1346
3233
  "flex": "0 0 25%"
1347
3234
  }
1348
3235
  ]
1349
3236
  },
1350
3237
  {
1351
- "type": "div",
1352
- "displayFlex": true,
1353
- "flex-direction": "row",
3238
+ "type": "fieldset",
3239
+ "notitle": true,
1354
3240
  "condition": {
1355
- "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'Outlet';"
3241
+ "functionBody": "return ['WindowCovering'].includes(model.accessories?.[arguments[1]]?.info?.type);"
1356
3242
  },
1357
3243
  "items": [
1358
3244
  {
1359
- "key": "accessories[].valueOutletInUse",
1360
- "flex": "0 0 25%"
3245
+ "type": "div",
3246
+ "displayFlex": true,
3247
+ "flex-direction": "row",
3248
+ "items": [
3249
+ {
3250
+ "key": "accessories[].valuePositionDecreasing",
3251
+ "flex": "0 0 25%"
3252
+ },
3253
+ {
3254
+ "key": "accessories[].valuePositionIncreasing",
3255
+ "flex": "0 0 25%"
3256
+ },
3257
+ {
3258
+ "key": "accessories[].valuePositionStopped",
3259
+ "flex": "0 0 25%"
3260
+ }
3261
+ ]
3262
+ },
3263
+ {
3264
+ "type": "div",
3265
+ "displayFlex": true,
3266
+ "flex-direction": "row",
3267
+ "items": [
3268
+ {
3269
+ "key": "accessories[].valuePositionHold",
3270
+ "flex": "0 0 25%"
3271
+ },
3272
+ {
3273
+ "key": "accessories[].valuePositionResume",
3274
+ "flex": "0 0 25%"
3275
+ },
3276
+ {
3277
+ "key": "accessories[].valuePositionObstructed",
3278
+ "flex": "0 0 25%"
3279
+ }
3280
+ ]
1361
3281
  }
1362
3282
  ]
1363
3283
  },
@@ -1438,6 +3358,53 @@
1438
3358
  }
1439
3359
  ]
1440
3360
  },
3361
+ {
3362
+ "type": "fieldset",
3363
+ "notitle": true,
3364
+ "condition": {
3365
+ "functionBody": "return model.accessories?.[arguments[1]]?.info?.type === 'AirQualitySensor';"
3366
+ },
3367
+ "items": [
3368
+ {
3369
+ "type": "div",
3370
+ "displayFlex": true,
3371
+ "flex-direction": "row",
3372
+ "items": [
3373
+ {
3374
+ "key": "accessories[].valueAQExcellent",
3375
+ "flex": "0 0 25%"
3376
+ },
3377
+ {
3378
+ "key": "accessories[].valueAQGood",
3379
+ "flex": "0 0 25%"
3380
+ },
3381
+ {
3382
+ "key": "accessories[].valueAQFair",
3383
+ "flex": "0 0 25%"
3384
+ }
3385
+ ]
3386
+ },
3387
+ {
3388
+ "type": "div",
3389
+ "displayFlex": true,
3390
+ "flex-direction": "row",
3391
+ "items": [
3392
+ {
3393
+ "key": "accessories[].valueAQInferior",
3394
+ "flex": "0 0 25%"
3395
+ },
3396
+ {
3397
+ "key": "accessories[].valueAQPoor",
3398
+ "flex": "0 0 25%"
3399
+ },
3400
+ {
3401
+ "key": "accessories[].valueAQUnknown",
3402
+ "flex": "0 0 25%"
3403
+ }
3404
+ ]
3405
+ }
3406
+ ]
3407
+ },
1441
3408
  {
1442
3409
  "type": "div",
1443
3410
  "displayFlex": true,