iobroker.loxone 3.0.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/LICENSE +183 -183
  2. package/README.md +417 -411
  3. package/admin/i18n/de.json +15 -0
  4. package/admin/i18n/en.json +15 -0
  5. package/admin/i18n/es.json +18 -0
  6. package/admin/i18n/fr.json +18 -0
  7. package/admin/i18n/it.json +18 -0
  8. package/admin/i18n/nl.json +18 -0
  9. package/admin/i18n/pl.json +18 -0
  10. package/admin/i18n/pt.json +18 -0
  11. package/admin/i18n/ru.json +18 -0
  12. package/admin/i18n/uk.json +18 -0
  13. package/admin/i18n/zh-cn.json +18 -0
  14. package/admin/jsonConfig.json +96 -0
  15. package/io-package.json +49 -38
  16. package/package.json +36 -49
  17. package/src/controls/AalEmergency.ts +90 -0
  18. package/src/controls/AalSmartAlarm.ts +99 -0
  19. package/src/controls/Alarm.ts +146 -0
  20. package/src/controls/AlarmClock.ts +137 -0
  21. package/src/controls/Application.ts +13 -0
  22. package/src/controls/AudioZone.ts +227 -0
  23. package/src/controls/AudioZoneV2.ts +135 -0
  24. package/src/controls/CentralAlarm.ts +59 -0
  25. package/src/controls/CentralAudioZone.ts +41 -0
  26. package/src/controls/CentralGate.ts +53 -0
  27. package/src/controls/CentralJalousie.ts +67 -0
  28. package/src/controls/CentralLightController.ts +45 -0
  29. package/src/controls/ColorPickerV2.ts +34 -0
  30. package/src/controls/Colorpicker.ts +30 -0
  31. package/src/controls/ColorpickerBase.ts +326 -0
  32. package/src/controls/Daytimer.ts +201 -0
  33. package/src/controls/Dimmer.ts +64 -0
  34. package/src/controls/EIBDimmer.ts +61 -0
  35. package/src/controls/Fronius.ts +217 -0
  36. package/src/controls/Gate.ts +150 -0
  37. package/src/controls/Hourcounter.ts +115 -0
  38. package/src/controls/IRCDaytimer.ts +4 -0
  39. package/src/controls/IRCV2Daytimer.ts +4 -0
  40. package/src/controls/IRoomControllerV2.ts +595 -0
  41. package/src/controls/InfoOnlyAnalog.ts +56 -0
  42. package/src/controls/InfoOnlyDigital.ts +95 -0
  43. package/src/controls/InfoOnlyText.ts +52 -0
  44. package/{build/controls/Intercom.js → src/controls/Intercom.ts} +27 -11
  45. package/src/controls/Jalousie.ts +219 -0
  46. package/src/controls/LightController.ts +112 -0
  47. package/src/controls/LightControllerV2.ts +246 -0
  48. package/src/controls/MailBox.ts +92 -0
  49. package/src/controls/Meter.ts +94 -0
  50. package/src/controls/None.ts +29 -0
  51. package/src/controls/PresenceDetector.ts +47 -0
  52. package/src/controls/Pushbutton.ts +55 -0
  53. package/src/controls/Radio.ts +61 -0
  54. package/{build/controls/Remote.js → src/controls/Remote.ts} +19 -11
  55. package/src/controls/Slider.ts +78 -0
  56. package/src/controls/SmokeAlarm.ts +163 -0
  57. package/src/controls/Switch.ts +46 -0
  58. package/src/controls/SystemScheme.ts +13 -0
  59. package/src/controls/TextInput.ts +96 -0
  60. package/src/controls/TextState.ts +37 -0
  61. package/src/controls/TimedSwitch.ts +75 -0
  62. package/src/controls/Tracker.ts +30 -0
  63. package/{build/controls/Unknown.js → src/controls/Unknown.ts} +18 -11
  64. package/src/controls/UpDownAnalog.ts +78 -0
  65. package/{build/controls/ValueSelector.js → src/controls/ValueSelector.ts} +21 -9
  66. package/src/controls/WindowMonitor.ts +139 -0
  67. package/src/controls/all-controls.ts +99 -0
  68. package/src/controls/control-base.ts +28 -0
  69. package/src/lib/adapter-config.d.ts +22 -0
  70. package/src/loxone-handler-base.ts +285 -0
  71. package/src/lxcommunicator.d.ts +1 -0
  72. package/src/main.test.ts +24 -0
  73. package/{build/main.js → src/main.ts} +545 -270
  74. package/src/structure-file.d.ts +154 -0
  75. package/src/weather-server-handler.ts +266 -0
  76. package/admin/admin.d.ts +0 -58
  77. package/admin/index_m.html +0 -126
  78. package/admin/style.css +0 -32
  79. package/admin/words.js +0 -25
  80. package/build/controls/AalEmergency.js +0 -45
  81. package/build/controls/AalEmergency.js.map +0 -1
  82. package/build/controls/AalSmartAlarm.js +0 -48
  83. package/build/controls/AalSmartAlarm.js.map +0 -1
  84. package/build/controls/Alarm.js +0 -81
  85. package/build/controls/Alarm.js.map +0 -1
  86. package/build/controls/AlarmClock.js +0 -59
  87. package/build/controls/AlarmClock.js.map +0 -1
  88. package/build/controls/Application.js +0 -11
  89. package/build/controls/Application.js.map +0 -1
  90. package/build/controls/AudioZone.js +0 -116
  91. package/build/controls/AudioZone.js.map +0 -1
  92. package/build/controls/CentralAlarm.js +0 -30
  93. package/build/controls/CentralAlarm.js.map +0 -1
  94. package/build/controls/CentralAudioZone.js +0 -22
  95. package/build/controls/CentralAudioZone.js.map +0 -1
  96. package/build/controls/CentralGate.js +0 -30
  97. package/build/controls/CentralGate.js.map +0 -1
  98. package/build/controls/CentralJalousie.js +0 -39
  99. package/build/controls/CentralJalousie.js.map +0 -1
  100. package/build/controls/CentralLightController.js +0 -27
  101. package/build/controls/CentralLightController.js.map +0 -1
  102. package/build/controls/ColorPickerV2.js +0 -24
  103. package/build/controls/ColorPickerV2.js.map +0 -1
  104. package/build/controls/Colorpicker.js +0 -20
  105. package/build/controls/Colorpicker.js.map +0 -1
  106. package/build/controls/ColorpickerBase.js +0 -263
  107. package/build/controls/ColorpickerBase.js.map +0 -1
  108. package/build/controls/Daytimer.js +0 -119
  109. package/build/controls/Daytimer.js.map +0 -1
  110. package/build/controls/Dimmer.js +0 -34
  111. package/build/controls/Dimmer.js.map +0 -1
  112. package/build/controls/EIBDimmer.js +0 -31
  113. package/build/controls/EIBDimmer.js.map +0 -1
  114. package/build/controls/Fronius.js +0 -64
  115. package/build/controls/Fronius.js.map +0 -1
  116. package/build/controls/Gate.js +0 -104
  117. package/build/controls/Gate.js.map +0 -1
  118. package/build/controls/Hourcounter.js +0 -46
  119. package/build/controls/Hourcounter.js.map +0 -1
  120. package/build/controls/IRCDaytimer.js +0 -9
  121. package/build/controls/IRCDaytimer.js.map +0 -1
  122. package/build/controls/IRCV2Daytimer.js +0 -9
  123. package/build/controls/IRCV2Daytimer.js.map +0 -1
  124. package/build/controls/IRoomControllerV2.js +0 -371
  125. package/build/controls/IRoomControllerV2.js.map +0 -1
  126. package/build/controls/InfoOnlyAnalog.js +0 -38
  127. package/build/controls/InfoOnlyAnalog.js.map +0 -1
  128. package/build/controls/InfoOnlyDigital.js +0 -65
  129. package/build/controls/InfoOnlyDigital.js.map +0 -1
  130. package/build/controls/InfoOnlyText.js +0 -35
  131. package/build/controls/InfoOnlyText.js.map +0 -1
  132. package/build/controls/Intercom.js.map +0 -1
  133. package/build/controls/Jalousie.js +0 -153
  134. package/build/controls/Jalousie.js.map +0 -1
  135. package/build/controls/LightController.js +0 -68
  136. package/build/controls/LightController.js.map +0 -1
  137. package/build/controls/LightControllerV2.js +0 -195
  138. package/build/controls/LightControllerV2.js.map +0 -1
  139. package/build/controls/MailBox.js +0 -41
  140. package/build/controls/MailBox.js.map +0 -1
  141. package/build/controls/Meter.js +0 -52
  142. package/build/controls/Meter.js.map +0 -1
  143. package/build/controls/None.js +0 -23
  144. package/build/controls/None.js.map +0 -1
  145. package/build/controls/PresenceDetector.js +0 -29
  146. package/build/controls/PresenceDetector.js.map +0 -1
  147. package/build/controls/Pushbutton.js +0 -35
  148. package/build/controls/Pushbutton.js.map +0 -1
  149. package/build/controls/Radio.js +0 -39
  150. package/build/controls/Radio.js.map +0 -1
  151. package/build/controls/Remote.js.map +0 -1
  152. package/build/controls/Slider.js +0 -44
  153. package/build/controls/Slider.js.map +0 -1
  154. package/build/controls/SmokeAlarm.js +0 -85
  155. package/build/controls/SmokeAlarm.js.map +0 -1
  156. package/build/controls/Switch.js +0 -31
  157. package/build/controls/Switch.js.map +0 -1
  158. package/build/controls/SystemScheme.js +0 -11
  159. package/build/controls/SystemScheme.js.map +0 -1
  160. package/build/controls/TextInput.js +0 -55
  161. package/build/controls/TextInput.js.map +0 -1
  162. package/build/controls/TextState.js +0 -20
  163. package/build/controls/TextState.js.map +0 -1
  164. package/build/controls/TimedSwitch.js +0 -36
  165. package/build/controls/TimedSwitch.js.map +0 -1
  166. package/build/controls/Tracker.js +0 -20
  167. package/build/controls/Tracker.js.map +0 -1
  168. package/build/controls/Unknown.js.map +0 -1
  169. package/build/controls/UpDownAnalog.js +0 -44
  170. package/build/controls/UpDownAnalog.js.map +0 -1
  171. package/build/controls/ValueSelector.js.map +0 -1
  172. package/build/controls/WindowMonitor.js +0 -84
  173. package/build/controls/WindowMonitor.js.map +0 -1
  174. package/build/controls/control-base.js +0 -12
  175. package/build/controls/control-base.js.map +0 -1
  176. package/build/loxone-handler-base.js +0 -186
  177. package/build/loxone-handler-base.js.map +0 -1
  178. package/build/main.js.map +0 -1
  179. package/build/weather-server-handler.js +0 -120
  180. package/build/weather-server-handler.js.map +0 -1
  181. package/doc/details-missing-control-type.png +0 -0
  182. package/doc/log-missing-control-type.png +0 -0
  183. package/doc/loxone-config-display-diagnostics.png +0 -0
  184. package/doc/loxone-config-info-only-digital.png +0 -0
  185. package/doc/loxone-config-use-in-visualization.png +0 -0
@@ -0,0 +1,90 @@
1
+ import type { CurrentStateValue, OldStateValue } from '../main';
2
+ import type { Control } from '../structure-file';
3
+ import type { ControlType } from './control-base';
4
+ import { ControlBase } from './control-base';
5
+
6
+ /**
7
+ * Handler for AalEmergency controls.
8
+ */
9
+ export class AalEmergency extends ControlBase {
10
+ /**
11
+ * Loads the control and sets up state objects and event handlers.
12
+ *
13
+ * @param type The type of the control ('device' or 'channel').
14
+ * @param uuid The unique identifier of the control.
15
+ * @param control The control data from the structure file.
16
+ */
17
+ async loadAsync(type: ControlType, uuid: string, control: Control): Promise<void> {
18
+ await this.updateObjectAsync(uuid, {
19
+ type: type,
20
+ common: {
21
+ name: control.name,
22
+ role: 'alarm',
23
+ },
24
+ native: { control },
25
+ });
26
+
27
+ await this.loadOtherControlStatesAsync(control.name, uuid, control.states, [
28
+ 'status',
29
+ 'disableEndTime',
30
+ 'resetActive',
31
+ ]);
32
+
33
+ const statusStates = {
34
+ 0: 'Running',
35
+ 1: 'Triggered',
36
+ 2: 'Reset',
37
+ 3: 'Disabled',
38
+ };
39
+ await this.createSimpleControlStateObjectAsync(
40
+ control.name,
41
+ uuid,
42
+ control.states,
43
+ 'status',
44
+ 'number',
45
+ 'value',
46
+ { states: statusStates },
47
+ );
48
+ await this.createSimpleControlStateObjectAsync(
49
+ control.name,
50
+ uuid,
51
+ control.states,
52
+ 'disableEndTime',
53
+ 'number',
54
+ 'value.interval',
55
+ );
56
+ await this.createSimpleControlStateObjectAsync(
57
+ control.name,
58
+ uuid,
59
+ control.states,
60
+ 'resetActive',
61
+ 'string',
62
+ 'text',
63
+ );
64
+
65
+ await this.createButtonCommandStateObjectAsync(control.name, uuid, 'trigger');
66
+ this.addStateChangeListener(
67
+ `${uuid}.trigger`,
68
+ () => {
69
+ this.sendCommand(control.uuidAction, 'trigger');
70
+ },
71
+ { selfAck: true },
72
+ );
73
+
74
+ await this.createButtonCommandStateObjectAsync(control.name, uuid, 'quit');
75
+ this.addStateChangeListener(
76
+ `${uuid}.quit`,
77
+ () => {
78
+ this.sendCommand(control.uuidAction, 'quit');
79
+ },
80
+ { selfAck: true },
81
+ );
82
+
83
+ await this.createNumberInputStateObjectAsync(control.name, uuid, 'disable', 'level.timer');
84
+ this.addStateChangeListener(`${uuid}.disable`, (oldValue: OldStateValue, newValue: CurrentStateValue) => {
85
+ this.sendCommand(control.uuidAction, `disable/${newValue || '0'}`);
86
+ });
87
+
88
+ await this.loadSubControlsAsync(uuid, control);
89
+ }
90
+ }
@@ -0,0 +1,99 @@
1
+ import type { CurrentStateValue, OldStateValue } from '../main';
2
+ import type { Control } from '../structure-file';
3
+ import type { ControlType } from './control-base';
4
+ import { ControlBase } from './control-base';
5
+
6
+ /**
7
+ * Handler for AAL Smart Alarm controls.
8
+ */
9
+ export class AalSmartAlarm extends ControlBase {
10
+ /**
11
+ * Loads the control and sets up state objects and event handlers.
12
+ *
13
+ * @param type The type of the control ('device' or 'channel').
14
+ * @param uuid The unique identifier of the control.
15
+ * @param control The control data from the structure file.
16
+ */
17
+ async loadAsync(type: ControlType, uuid: string, control: Control): Promise<void> {
18
+ await this.updateObjectAsync(uuid, {
19
+ type: type,
20
+ common: {
21
+ name: control.name,
22
+ role: 'alarm',
23
+ },
24
+ native: { control },
25
+ });
26
+
27
+ await this.loadOtherControlStatesAsync(control.name, uuid, control.states, [
28
+ 'alarmLevel',
29
+ 'alarmCause',
30
+ 'isLocked',
31
+ 'isLeaveActive',
32
+ 'disableEndTime',
33
+ ]);
34
+
35
+ const levelStates = {
36
+ 0: 'None',
37
+ 1: 'Immediate',
38
+ 2: 'Delayed',
39
+ };
40
+ await this.createSimpleControlStateObjectAsync(
41
+ control.name,
42
+ uuid,
43
+ control.states,
44
+ 'alarmLevel',
45
+ 'number',
46
+ 'value',
47
+ { states: levelStates },
48
+ );
49
+ await this.createSimpleControlStateObjectAsync(
50
+ control.name,
51
+ uuid,
52
+ control.states,
53
+ 'alarmCause',
54
+ 'string',
55
+ 'text',
56
+ );
57
+ await this.createBooleanControlStateObjectAsync(control.name, uuid, control.states, 'isLocked', 'indicator');
58
+ await this.createBooleanControlStateObjectAsync(
59
+ control.name,
60
+ uuid,
61
+ control.states,
62
+ 'isLeaveActive',
63
+ 'indicator',
64
+ );
65
+ await this.createSimpleControlStateObjectAsync(
66
+ control.name,
67
+ uuid,
68
+ control.states,
69
+ 'disableEndTime',
70
+ 'number',
71
+ 'value.interval',
72
+ );
73
+
74
+ await this.createButtonCommandStateObjectAsync(control.name, uuid, 'confirm');
75
+ this.addStateChangeListener(
76
+ `${uuid}.confirm`,
77
+ () => {
78
+ this.sendCommand(control.uuidAction, 'confirm');
79
+ },
80
+ { selfAck: true },
81
+ );
82
+
83
+ await this.createNumberInputStateObjectAsync(control.name, uuid, 'disable', 'level.timer');
84
+ this.addStateChangeListener(`${uuid}.disable`, (oldValue: OldStateValue, newValue: CurrentStateValue) => {
85
+ this.sendCommand(control.uuidAction, `disable/${newValue || '0'}`);
86
+ });
87
+
88
+ await this.createButtonCommandStateObjectAsync(control.name, uuid, 'startDrill');
89
+ this.addStateChangeListener(
90
+ `${uuid}.startDrill`,
91
+ () => {
92
+ this.sendCommand(control.uuidAction, 'startDrill');
93
+ },
94
+ { selfAck: true },
95
+ );
96
+
97
+ await this.loadSubControlsAsync(uuid, control);
98
+ }
99
+ }
@@ -0,0 +1,146 @@
1
+ import type { CurrentStateValue, OldStateValue } from '../main';
2
+ import type { Control } from '../structure-file';
3
+ import type { ControlType } from './control-base';
4
+ import { ControlBase } from './control-base';
5
+
6
+ /**
7
+ * Handler for Alarm controls.
8
+ */
9
+ export class Alarm extends ControlBase {
10
+ /**
11
+ * Loads the control and sets up state objects and event handlers.
12
+ *
13
+ * @param type The type of the control ('device' or 'channel').
14
+ * @param uuid The unique identifier of the control.
15
+ * @param control The control data from the structure file.
16
+ */
17
+ async loadAsync(type: ControlType, uuid: string, control: Control): Promise<void> {
18
+ await this.updateObjectAsync(uuid, {
19
+ type: type,
20
+ common: {
21
+ name: control.name,
22
+ role: 'alarm',
23
+ },
24
+ native: { control },
25
+ });
26
+
27
+ await this.loadOtherControlStatesAsync(control.name, uuid, control.states, [
28
+ 'armed',
29
+ 'nextLevel',
30
+ 'nextLevelDelay',
31
+ 'nextLevelDelayTotal',
32
+ 'level',
33
+ 'startTime',
34
+ 'armedDelay',
35
+ 'armedDelayTotal',
36
+ 'sensors',
37
+ 'disabledMove',
38
+ ]);
39
+
40
+ const levelStates = {
41
+ 0: 'None',
42
+ 1: 'Silent',
43
+ 2: 'Acustic',
44
+ 3: 'Optical',
45
+ 4: 'Internal',
46
+ 5: 'External',
47
+ 6: 'Remote',
48
+ };
49
+ await this.createBooleanControlStateObjectAsync(control.name, uuid, control.states, 'armed', 'switch', {
50
+ write: true,
51
+ // TODO: re-add: smartIgnore: false,
52
+ });
53
+ await this.createSimpleControlStateObjectAsync(
54
+ control.name,
55
+ uuid,
56
+ control.states,
57
+ 'nextLevel',
58
+ 'number',
59
+ 'value',
60
+ { states: levelStates },
61
+ );
62
+ await this.createSimpleControlStateObjectAsync(
63
+ control.name,
64
+ uuid,
65
+ control.states,
66
+ 'nextLevelDelay',
67
+ 'number',
68
+ 'value.interval',
69
+ );
70
+ await this.createSimpleControlStateObjectAsync(
71
+ control.name,
72
+ uuid,
73
+ control.states,
74
+ 'nextLevelDelayTotal',
75
+ 'number',
76
+ 'value.interval',
77
+ );
78
+ await this.createSimpleControlStateObjectAsync(control.name, uuid, control.states, 'level', 'number', 'value', {
79
+ states: levelStates,
80
+ });
81
+ await this.createSimpleControlStateObjectAsync(
82
+ control.name,
83
+ uuid,
84
+ control.states,
85
+ 'startTime',
86
+ 'string',
87
+ 'value.datetime',
88
+ );
89
+ await this.createSimpleControlStateObjectAsync(
90
+ control.name,
91
+ uuid,
92
+ control.states,
93
+ 'armedDelay',
94
+ 'number',
95
+ 'value.interval',
96
+ );
97
+ await this.createSimpleControlStateObjectAsync(
98
+ control.name,
99
+ uuid,
100
+ control.states,
101
+ 'armedDelayTotal',
102
+ 'number',
103
+ 'value.interval',
104
+ );
105
+ await this.createListControlStateObjectAsync(control.name, uuid, control.states, 'sensors');
106
+ await this.createBooleanControlStateObjectAsync(control.name, uuid, control.states, 'disabledMove', 'switch', {
107
+ write: true,
108
+ });
109
+
110
+ this.addStateChangeListener(`${uuid}.armed`, (oldValue: OldStateValue, newValue: CurrentStateValue) => {
111
+ if (newValue) {
112
+ this.sendCommand(control.uuidAction, 'on');
113
+ } else {
114
+ this.sendCommand(control.uuidAction, 'off');
115
+ }
116
+ });
117
+
118
+ this.addStateChangeListener(`${uuid}.disabledMove`, (oldValue: OldStateValue, newValue: CurrentStateValue) => {
119
+ if (newValue) {
120
+ this.sendCommand(control.uuidAction, 'dismv/0');
121
+ } else {
122
+ this.sendCommand(control.uuidAction, 'dismv/1');
123
+ }
124
+ });
125
+
126
+ await this.createButtonCommandStateObjectAsync(control.name, uuid, 'delayedOn');
127
+ this.addStateChangeListener(
128
+ `${uuid}.delayedOn`,
129
+ (oldValue: OldStateValue, newValue: CurrentStateValue) => {
130
+ this.sendCommand(control.uuidAction, `delayedon/${newValue ? 1 : 0}`);
131
+ },
132
+ { selfAck: true },
133
+ );
134
+
135
+ await this.createButtonCommandStateObjectAsync(control.name, uuid, 'quit');
136
+ this.addStateChangeListener(
137
+ `${uuid}.quit`,
138
+ () => {
139
+ this.sendCommand(control.uuidAction, 'quit');
140
+ },
141
+ { selfAck: true },
142
+ );
143
+
144
+ // subControls are not needed because "sensors" already contains the information from the tracker
145
+ }
146
+ }
@@ -0,0 +1,137 @@
1
+ import type { CurrentStateValue, OldStateValue } from '../main';
2
+ import type { Control } from '../structure-file';
3
+ import type { ControlType } from './control-base';
4
+ import { ControlBase } from './control-base';
5
+
6
+ /**
7
+ * Handler for Alarm Clock controls.
8
+ */
9
+ export class AlarmClock extends ControlBase {
10
+ /**
11
+ * Loads the control and sets up state objects and event handlers.
12
+ *
13
+ * @param type The type of the control ('device' or 'channel').
14
+ * @param uuid The unique identifier of the control.
15
+ * @param control The control data from the structure file.
16
+ */
17
+ async loadAsync(type: ControlType, uuid: string, control: Control): Promise<void> {
18
+ await this.updateObjectAsync(uuid, {
19
+ type: type,
20
+ common: {
21
+ name: control.name,
22
+ role: 'alarm', // TODO: what's the best role here? ioBroker doc is not very clear on what's an "alarm"
23
+ },
24
+ native: { control },
25
+ });
26
+
27
+ await this.loadOtherControlStatesAsync(control.name, uuid, control.states, [
28
+ 'isEnabled',
29
+ 'isAlarmActive',
30
+ 'confirmationNeeded',
31
+ 'ringingTime',
32
+ 'ringDuration',
33
+ 'prepareDuration',
34
+ 'snoozeTime',
35
+ 'snoozeDuration',
36
+ ]);
37
+
38
+ await this.createBooleanControlStateObjectAsync(control.name, uuid, control.states, 'isEnabled', 'switch', {
39
+ write: true,
40
+ // TODO: re-add: smartIgnore: false,
41
+ });
42
+ await this.createBooleanControlStateObjectAsync(
43
+ control.name,
44
+ uuid,
45
+ control.states,
46
+ 'isAlarmActive',
47
+ 'indicator',
48
+ );
49
+ await this.createBooleanControlStateObjectAsync(
50
+ control.name,
51
+ uuid,
52
+ control.states,
53
+ 'confirmationNeeded',
54
+ 'indicator',
55
+ );
56
+ await this.createSimpleControlStateObjectAsync(
57
+ control.name,
58
+ uuid,
59
+ control.states,
60
+ 'ringingTime',
61
+ 'number',
62
+ 'value.interval',
63
+ );
64
+ await this.createSimpleControlStateObjectAsync(
65
+ control.name,
66
+ uuid,
67
+ control.states,
68
+ 'ringDuration',
69
+ 'number',
70
+ 'value.interval',
71
+ { write: true },
72
+ );
73
+ await this.createSimpleControlStateObjectAsync(
74
+ control.name,
75
+ uuid,
76
+ control.states,
77
+ 'prepareDuration',
78
+ 'number',
79
+ 'value.interval',
80
+ { write: true },
81
+ );
82
+ await this.createSimpleControlStateObjectAsync(
83
+ control.name,
84
+ uuid,
85
+ control.states,
86
+ 'snoozeTime',
87
+ 'number',
88
+ 'value.interval',
89
+ );
90
+ await this.createSimpleControlStateObjectAsync(
91
+ control.name,
92
+ uuid,
93
+ control.states,
94
+ 'snoozeDuration',
95
+ 'number',
96
+ 'value.interval',
97
+ { write: true },
98
+ );
99
+
100
+ this.addStateChangeListener(`${uuid}.isEnabled`, (oldValue: OldStateValue, newValue: CurrentStateValue) => {
101
+ this.sendCommand(control.uuidAction, `setActive/${newValue ? '0' : '1'}`); // yes, really, this is inverted!
102
+ });
103
+ this.addStateChangeListener(`${uuid}.ringDuration`, (oldValue: OldStateValue, newValue: CurrentStateValue) => {
104
+ this.sendCommand(control.uuidAction, `setRingDuration/${newValue}`);
105
+ });
106
+ this.addStateChangeListener(
107
+ `${uuid}.prepareDuration`,
108
+ (oldValue: OldStateValue, newValue: CurrentStateValue) => {
109
+ this.sendCommand(control.uuidAction, `setPrepDuration/${newValue}`);
110
+ },
111
+ );
112
+ this.addStateChangeListener(
113
+ `${uuid}.snoozeDuration`,
114
+ (oldValue: OldStateValue, newValue: CurrentStateValue) => {
115
+ this.sendCommand(control.uuidAction, `setSnoozeDuration/${newValue}`);
116
+ },
117
+ );
118
+
119
+ await this.createButtonCommandStateObjectAsync(control.name, uuid, 'snooze');
120
+ this.addStateChangeListener(
121
+ `${uuid}.snooze`,
122
+ () => {
123
+ this.sendCommand(control.uuidAction, 'snooze');
124
+ },
125
+ { selfAck: true },
126
+ );
127
+
128
+ await this.createButtonCommandStateObjectAsync(control.name, uuid, 'dismiss');
129
+ this.addStateChangeListener(
130
+ `${uuid}.dismiss`,
131
+ () => {
132
+ this.sendCommand(control.uuidAction, 'dismiss');
133
+ },
134
+ { selfAck: true },
135
+ );
136
+ }
137
+ }
@@ -0,0 +1,13 @@
1
+ import { ControlBase } from './control-base';
2
+
3
+ /**
4
+ * Handler for Application controls.
5
+ */
6
+ export class Application extends ControlBase {
7
+ /**
8
+ * Loads the control and sets up state objects and event handlers.
9
+ */
10
+ async loadAsync(): Promise<void> {
11
+ // Application has no states, thus we don't use it at all
12
+ }
13
+ }