sinricpro 2.12.1 → 3.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 (142) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +132 -15
  3. package/dist/capabilities/AirQualitySensor.js +23 -0
  4. package/dist/capabilities/AirQualitySensor.js.map +1 -0
  5. package/dist/capabilities/BrightnessController.js +76 -0
  6. package/dist/capabilities/BrightnessController.js.map +1 -0
  7. package/dist/capabilities/CameraController.js +29 -0
  8. package/dist/capabilities/CameraController.js.map +1 -0
  9. package/dist/capabilities/ChannelController.js +52 -0
  10. package/dist/capabilities/ChannelController.js.map +1 -0
  11. package/dist/capabilities/ColorController.js +53 -0
  12. package/dist/capabilities/ColorController.js.map +1 -0
  13. package/dist/capabilities/ColorTemperatureController.js +53 -0
  14. package/dist/capabilities/ColorTemperatureController.js.map +1 -0
  15. package/dist/capabilities/ContactSensor.js +23 -0
  16. package/dist/capabilities/ContactSensor.js.map +1 -0
  17. package/dist/capabilities/Doorbell.js +23 -0
  18. package/dist/capabilities/Doorbell.js.map +1 -0
  19. package/dist/capabilities/EqualizerController.js +103 -0
  20. package/dist/capabilities/EqualizerController.js.map +1 -0
  21. package/dist/capabilities/InputController.js +51 -0
  22. package/dist/capabilities/InputController.js.map +1 -0
  23. package/dist/capabilities/KeypadController.js +23 -0
  24. package/dist/capabilities/KeypadController.js.map +1 -0
  25. package/dist/capabilities/LockController.js +40 -0
  26. package/dist/capabilities/LockController.js.map +1 -0
  27. package/dist/capabilities/MediaController.js +40 -0
  28. package/dist/capabilities/MediaController.js.map +1 -0
  29. package/dist/capabilities/ModeController.js +51 -0
  30. package/dist/capabilities/ModeController.js.map +1 -0
  31. package/dist/capabilities/MotionSensor.js +23 -0
  32. package/dist/capabilities/MotionSensor.js.map +1 -0
  33. package/dist/capabilities/MuteController.js +51 -0
  34. package/dist/capabilities/MuteController.js.map +1 -0
  35. package/dist/capabilities/OpenCloseController.js +40 -0
  36. package/dist/capabilities/OpenCloseController.js.map +1 -0
  37. package/dist/capabilities/PercentageController.js +52 -0
  38. package/dist/capabilities/PercentageController.js.map +1 -0
  39. package/dist/capabilities/PowerLevelController.js +52 -0
  40. package/dist/capabilities/PowerLevelController.js.map +1 -0
  41. package/dist/capabilities/PowerSensor.js +23 -0
  42. package/dist/capabilities/PowerSensor.js.map +1 -0
  43. package/dist/capabilities/PowerStateController.js +53 -0
  44. package/dist/capabilities/PowerStateController.js.map +1 -0
  45. package/dist/capabilities/PushNotification.js +23 -0
  46. package/dist/capabilities/PushNotification.js.map +1 -0
  47. package/dist/capabilities/RangeController.js +52 -0
  48. package/dist/capabilities/RangeController.js.map +1 -0
  49. package/dist/capabilities/SettingController.js +33 -0
  50. package/dist/capabilities/SettingController.js.map +1 -0
  51. package/dist/capabilities/StartStopController.js +51 -0
  52. package/dist/capabilities/StartStopController.js.map +1 -0
  53. package/dist/capabilities/TemperatureSensor.js +29 -0
  54. package/dist/capabilities/TemperatureSensor.js.map +1 -0
  55. package/dist/capabilities/ThermostatController.js +70 -0
  56. package/dist/capabilities/ThermostatController.js.map +1 -0
  57. package/dist/capabilities/ToggleController.js +51 -0
  58. package/dist/capabilities/ToggleController.js.map +1 -0
  59. package/dist/capabilities/VolumeController.js +74 -0
  60. package/dist/capabilities/VolumeController.js.map +1 -0
  61. package/dist/capabilities/index.js +56 -0
  62. package/dist/capabilities/index.js.map +1 -0
  63. package/dist/core/EventLimiter.js +50 -0
  64. package/dist/core/EventLimiter.js.map +1 -0
  65. package/dist/core/MessageQueue.js +28 -0
  66. package/dist/core/MessageQueue.js.map +1 -0
  67. package/dist/core/Signature.js +68 -0
  68. package/dist/core/Signature.js.map +1 -0
  69. package/dist/core/SinricPro.js +332 -0
  70. package/dist/core/SinricPro.js.map +1 -0
  71. package/dist/core/SinricProDevice.js +82 -0
  72. package/dist/core/SinricProDevice.js.map +1 -0
  73. package/dist/core/WebSocketClient.js +156 -0
  74. package/dist/core/WebSocketClient.js.map +1 -0
  75. package/dist/core/types.js +30 -0
  76. package/dist/core/types.js.map +1 -0
  77. package/dist/devices/SinricProAirQualitySensor.js +29 -0
  78. package/dist/devices/SinricProAirQualitySensor.js.map +1 -0
  79. package/dist/devices/SinricProBlinds.js +29 -0
  80. package/dist/devices/SinricProBlinds.js.map +1 -0
  81. package/dist/devices/SinricProCamera.js +29 -0
  82. package/dist/devices/SinricProCamera.js.map +1 -0
  83. package/dist/devices/SinricProContactSensor.js +28 -0
  84. package/dist/devices/SinricProContactSensor.js.map +1 -0
  85. package/dist/devices/SinricProDimSwitch.js +29 -0
  86. package/dist/devices/SinricProDimSwitch.js.map +1 -0
  87. package/dist/devices/SinricProDoorbell.js +29 -0
  88. package/dist/devices/SinricProDoorbell.js.map +1 -0
  89. package/dist/devices/SinricProFan.js +29 -0
  90. package/dist/devices/SinricProFan.js.map +1 -0
  91. package/dist/devices/SinricProFanUS.js +29 -0
  92. package/dist/devices/SinricProFanUS.js.map +1 -0
  93. package/dist/devices/SinricProGarageDoor.js +28 -0
  94. package/dist/devices/SinricProGarageDoor.js.map +1 -0
  95. package/dist/devices/SinricProLight.js +30 -0
  96. package/dist/devices/SinricProLight.js.map +1 -0
  97. package/dist/devices/SinricProLock.js +28 -0
  98. package/dist/devices/SinricProLock.js.map +1 -0
  99. package/dist/devices/SinricProMotionSensor.js +28 -0
  100. package/dist/devices/SinricProMotionSensor.js.map +1 -0
  101. package/dist/devices/SinricProPowerSensor.js +28 -0
  102. package/dist/devices/SinricProPowerSensor.js.map +1 -0
  103. package/dist/devices/SinricProSpeaker.js +33 -0
  104. package/dist/devices/SinricProSpeaker.js.map +1 -0
  105. package/dist/devices/SinricProSwitch.js +24 -0
  106. package/dist/devices/SinricProSwitch.js.map +1 -0
  107. package/dist/devices/SinricProTV.js +33 -0
  108. package/dist/devices/SinricProTV.js.map +1 -0
  109. package/dist/devices/SinricProThermostat.js +30 -0
  110. package/dist/devices/SinricProThermostat.js.map +1 -0
  111. package/dist/devices/SinricProWindowAC.js +31 -0
  112. package/dist/devices/SinricProWindowAC.js.map +1 -0
  113. package/dist/devices/index.js +44 -0
  114. package/dist/devices/index.js.map +1 -0
  115. package/dist/index.js +43 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/utils/SinricProSdkLogger.js +42 -0
  118. package/dist/utils/SinricProSdkLogger.js.map +1 -0
  119. package/package.json +78 -38
  120. package/.github/workflows/npm-publish.yml +0 -32
  121. package/.nvmrc +0 -1
  122. package/.prettierrc +0 -5
  123. package/CHANGELOG.md +0 -45
  124. package/index.js +0 -1
  125. package/lib/cbhandler.js +0 -182
  126. package/lib/contorllers/brightness_controller.js +0 -40
  127. package/lib/contorllers/camera_stream_controller.js +0 -39
  128. package/lib/contorllers/color_controller.js +0 -23
  129. package/lib/contorllers/color_temperature.js +0 -23
  130. package/lib/contorllers/mode_controller.js +0 -22
  131. package/lib/contorllers/power_controller.js +0 -53
  132. package/lib/contorllers/range_value_controller.js +0 -38
  133. package/lib/contorllers/sensors_controller.js +0 -54
  134. package/lib/contorllers/speaker_controller.js +0 -51
  135. package/lib/contorllers/toggle_state_controller.js +0 -21
  136. package/lib/contorllers/tv_controller.js +0 -93
  137. package/lib/errors/errors.js +0 -8
  138. package/lib/events/event_handler.js +0 -108
  139. package/lib/signature.js +0 -26
  140. package/lib/sinrcpro.js +0 -129
  141. package/lib/sinricproudp.js +0 -60
  142. package/lib/storage.js +0 -31
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * InputController - Adds input selection capability (for TV/AV receivers)
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.InputController = InputController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function InputController(Base) {
10
+ return class extends Base {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ constructor(...args) {
13
+ super(...args);
14
+ this.selectInputCallback = null;
15
+ this.inputEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
16
+ this.registerRequestHandler(this.handleInputRequest.bind(this));
17
+ }
18
+ onSelectInput(callback) {
19
+ this.selectInputCallback = callback;
20
+ }
21
+ async sendInputEvent(input, cause = types_1.PHYSICAL_INTERACTION) {
22
+ if (this.inputEventLimiter.isLimited()) {
23
+ return false;
24
+ }
25
+ return this.sendEvent('selectInput', { input }, cause);
26
+ }
27
+ async handleInputRequest(request) {
28
+ if (request.action !== 'selectInput' || !this.selectInputCallback) {
29
+ return false;
30
+ }
31
+ const input = request.requestValue.input;
32
+ const result = await this.selectInputCallback(this.getDeviceId(), input);
33
+ // Handle both boolean and object return types
34
+ let success;
35
+ if (typeof result === 'boolean') {
36
+ success = result;
37
+ }
38
+ else {
39
+ success = result.success;
40
+ if (result.message) {
41
+ request.errorMessage = result.message;
42
+ }
43
+ }
44
+ if (success) {
45
+ request.responseValue.input = input;
46
+ }
47
+ return success;
48
+ }
49
+ };
50
+ }
51
+ //# sourceMappingURL=InputController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputController.js","sourceRoot":"","sources":["../../src/capabilities/InputController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAoBH,0CAiDC;AAlED,uDAAoD;AAEpD,yCAAwE;AAexE,SAAgB,eAAe,CAAyC,IAAO;IAC7E,OAAO,KAAM,SAAQ,IAAI;QAIvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YALT,wBAAmB,GAA+B,IAAI,CAAC;YACvD,sBAAiB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAK9D,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,aAAa,CAAC,QAA6B;YACzC,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC;QACtC,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,QAAgB,4BAAoB;YACtE,IAAI,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACvC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;QAEO,KAAK,CAAC,kBAAkB,CAAC,OAAyB;YACxD,IAAI,OAAO,CAAC,MAAM,KAAK,aAAa,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAClE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;YAEzE,8CAA8C;YAC9C,IAAI,OAAgB,CAAC;YACrB,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,GAAG,MAAM,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBACzB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;gBACxC,CAAC;YACH,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC;YACtC,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ /**
3
+ * KeypadController - Adds keypad input capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.KeypadController = KeypadController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function KeypadController(Base) {
10
+ return class extends Base {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.keypadEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
14
+ }
15
+ async sendKeystrokeEvent(keystroke, cause = types_1.PHYSICAL_INTERACTION) {
16
+ if (this.keypadEventLimiter.isLimited()) {
17
+ return false;
18
+ }
19
+ return this.sendEvent('keystroke', { keystroke }, cause);
20
+ }
21
+ };
22
+ }
23
+ //# sourceMappingURL=KeypadController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeypadController.js","sourceRoot":"","sources":["../../src/capabilities/KeypadController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAaH,4CAeC;AAzBD,uDAAoD;AACpD,yCAAwE;AASxE,SAAgB,gBAAgB,CAAyC,IAAO;IAC9E,OAAO,KAAM,SAAQ,IAAI;QAAlB;;YACG,uBAAkB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;QAYnE,CAAC;QAVC,KAAK,CAAC,kBAAkB,CACtB,SAAiB,EACjB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACxC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /**
3
+ * LockController - Adds lock/unlock capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LockController = LockController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function LockController(Base) {
10
+ return class extends Base {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ constructor(...args) {
13
+ super(...args);
14
+ this.lockStateCallback = null;
15
+ this.lockEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
16
+ this.registerRequestHandler(this.handleLockRequest.bind(this));
17
+ }
18
+ onLockState(callback) {
19
+ this.lockStateCallback = callback;
20
+ }
21
+ async sendLockStateEvent(lockState, cause = types_1.PHYSICAL_INTERACTION) {
22
+ if (this.lockEventLimiter.isLimited()) {
23
+ return false;
24
+ }
25
+ return this.sendEvent('setLockState', { state: lockState }, cause);
26
+ }
27
+ async handleLockRequest(request) {
28
+ if (request.action !== 'setLockState' || !this.lockStateCallback) {
29
+ return false;
30
+ }
31
+ const lockState = request.requestValue.state;
32
+ const success = await this.lockStateCallback(this.getDeviceId(), lockState);
33
+ if (success) {
34
+ request.responseValue.state = lockState;
35
+ }
36
+ return success;
37
+ }
38
+ };
39
+ }
40
+ //# sourceMappingURL=LockController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LockController.js","sourceRoot":"","sources":["../../src/capabilities/LockController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAoBH,wCAyCC;AA1DD,uDAAoD;AAEpD,yCAAwE;AAexE,SAAgB,cAAc,CAAyC,IAAO;IAC5E,OAAO,KAAM,SAAQ,IAAI;QAIvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YALT,sBAAiB,GAA6B,IAAI,CAAC;YACnD,qBAAgB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAK7D,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,WAAW,CAAC,QAA2B;YACrC,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;QACpC,CAAC;QAED,KAAK,CAAC,kBAAkB,CACtB,SAA2C,EAC3C,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACtC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;QACrE,CAAC;QAEO,KAAK,CAAC,iBAAiB,CAAC,OAAyB;YACvD,IAAI,OAAO,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACjE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC;YAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,CAAC;YAE5E,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,aAAa,CAAC,KAAK,GAAG,SAAS,CAAC;YAC1C,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /**
3
+ * MediaController - Adds media playback control capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MediaController = MediaController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function MediaController(Base) {
10
+ return class extends Base {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ constructor(...args) {
13
+ super(...args);
14
+ this.mediaControlCallback = null;
15
+ this.mediaEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
16
+ this.registerRequestHandler(this.handleMediaControlRequest.bind(this));
17
+ }
18
+ onMediaControl(callback) {
19
+ this.mediaControlCallback = callback;
20
+ }
21
+ async sendMediaControlEvent(control, cause = types_1.PHYSICAL_INTERACTION) {
22
+ if (this.mediaEventLimiter.isLimited()) {
23
+ return false;
24
+ }
25
+ return this.sendEvent('mediaControl', { control }, cause);
26
+ }
27
+ async handleMediaControlRequest(request) {
28
+ if (request.action !== 'mediaControl' || !this.mediaControlCallback) {
29
+ return false;
30
+ }
31
+ const control = request.requestValue.control;
32
+ const success = await this.mediaControlCallback(this.getDeviceId(), control);
33
+ if (success) {
34
+ request.responseValue.control = control;
35
+ }
36
+ return success;
37
+ }
38
+ };
39
+ }
40
+ //# sourceMappingURL=MediaController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaController.js","sourceRoot":"","sources":["../../src/capabilities/MediaController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAoBH,0CAiDC;AAlED,uDAAoD;AAEpD,yCAAwE;AAexE,SAAgB,eAAe,CAAyC,IAAO;IAC7E,OAAO,KAAM,SAAQ,IAAI;QAIvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YALT,yBAAoB,GAAgC,IAAI,CAAC;YACzD,sBAAiB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAK9D,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACzE,CAAC;QAED,cAAc,CAAC,QAA8B;YAC3C,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;QACvC,CAAC;QAED,KAAK,CAAC,qBAAqB,CACzB,OAAe,EACf,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACvC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;QAEO,KAAK,CAAC,yBAAyB,CAAC,OAAyB;YAC/D,IAAI,OAAO,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACpE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAQpB,CAAC;YAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;YAE7E,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,aAAa,CAAC,OAAO,GAAG,OAAO,CAAC;YAC1C,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * ModeController - Adds generic mode control capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ModeController = ModeController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function ModeController(Base) {
10
+ return class extends Base {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ constructor(...args) {
13
+ super(...args);
14
+ this.setModeCallback = null;
15
+ this.modeEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
16
+ this.registerRequestHandler(this.handleModeRequest.bind(this));
17
+ }
18
+ onSetMode(callback) {
19
+ this.setModeCallback = callback;
20
+ }
21
+ async sendModeEvent(mode, cause = types_1.PHYSICAL_INTERACTION) {
22
+ if (this.modeEventLimiter.isLimited()) {
23
+ return false;
24
+ }
25
+ return this.sendEvent('setMode', { mode }, cause);
26
+ }
27
+ async handleModeRequest(request) {
28
+ if (request.action !== 'setMode' || !this.setModeCallback) {
29
+ return false;
30
+ }
31
+ const mode = request.requestValue.mode;
32
+ const result = await this.setModeCallback(this.getDeviceId(), mode);
33
+ // Handle both boolean and object return types
34
+ let success;
35
+ if (typeof result === 'boolean') {
36
+ success = result;
37
+ }
38
+ else {
39
+ success = result.success;
40
+ if (result.message) {
41
+ request.errorMessage = result.message;
42
+ }
43
+ }
44
+ if (success) {
45
+ request.responseValue.mode = mode;
46
+ }
47
+ return success;
48
+ }
49
+ };
50
+ }
51
+ //# sourceMappingURL=ModeController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModeController.js","sourceRoot":"","sources":["../../src/capabilities/ModeController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAoBH,wCAiDC;AAlED,uDAAoD;AAEpD,yCAAwE;AAexE,SAAgB,cAAc,CAAyC,IAAO;IAC5E,OAAO,KAAM,SAAQ,IAAI;QAIvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YALT,oBAAe,GAA2B,IAAI,CAAC;YAC/C,qBAAgB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAK7D,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,SAAS,CAAC,QAAyB;YACjC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;QAClC,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,QAAgB,4BAAoB;YACpE,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACtC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;QAEO,KAAK,CAAC,iBAAiB,CAAC,OAAyB;YACvD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC1D,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;YAEpE,8CAA8C;YAC9C,IAAI,OAAgB,CAAC;YACrB,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,GAAG,MAAM,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBACzB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;gBACxC,CAAC;YACH,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC;YACpC,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ /**
3
+ * MotionSensor - Adds motion detection capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MotionSensor = MotionSensor;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function MotionSensor(Base) {
10
+ return class extends Base {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.motionEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_SENSOR_VALUE);
14
+ }
15
+ async sendMotionEvent(detected, cause = types_1.PHYSICAL_INTERACTION) {
16
+ if (this.motionEventLimiter.isLimited()) {
17
+ return false;
18
+ }
19
+ return this.sendEvent('motion', { state: detected ? 'detected' : 'notDetected' }, cause);
20
+ }
21
+ };
22
+ }
23
+ //# sourceMappingURL=MotionSensor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MotionSensor.js","sourceRoot":"","sources":["../../src/capabilities/MotionSensor.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAaH,oCAeC;AAzBD,uDAAoD;AACpD,yCAA+E;AAS/E,SAAgB,YAAY,CAAyC,IAAO;IAC1E,OAAO,KAAM,SAAQ,IAAI;QAAlB;;YACG,uBAAkB,GAAG,IAAI,2BAAY,CAAC,gCAAwB,CAAC,CAAC;QAY1E,CAAC;QAVC,KAAK,CAAC,eAAe,CACnB,QAAiB,EACjB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACxC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC,CAAC;QAC3F,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * MuteController - Adds mute/unmute capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MuteController = MuteController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function MuteController(Base) {
10
+ return class extends Base {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ constructor(...args) {
13
+ super(...args);
14
+ this.muteCallback = null;
15
+ this.muteEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
16
+ this.registerRequestHandler(this.handleMuteRequest.bind(this));
17
+ }
18
+ onMute(callback) {
19
+ this.muteCallback = callback;
20
+ }
21
+ async sendMuteEvent(mute, cause = types_1.PHYSICAL_INTERACTION) {
22
+ if (this.muteEventLimiter.isLimited()) {
23
+ return false;
24
+ }
25
+ return this.sendEvent('setMute', { mute }, cause);
26
+ }
27
+ async handleMuteRequest(request) {
28
+ if (request.action !== 'setMute' || !this.muteCallback) {
29
+ return false;
30
+ }
31
+ const mute = request.requestValue.mute;
32
+ const result = await this.muteCallback(this.getDeviceId(), mute);
33
+ // Handle both boolean and object return types
34
+ let success;
35
+ if (typeof result === 'boolean') {
36
+ success = result;
37
+ }
38
+ else {
39
+ success = result.success;
40
+ if (result.message) {
41
+ request.errorMessage = result.message;
42
+ }
43
+ }
44
+ if (success) {
45
+ request.responseValue.mute = mute;
46
+ }
47
+ return success;
48
+ }
49
+ };
50
+ }
51
+ //# sourceMappingURL=MuteController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MuteController.js","sourceRoot":"","sources":["../../src/capabilities/MuteController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAoBH,wCAiDC;AAlED,uDAAoD;AAEpD,yCAAwE;AAexE,SAAgB,cAAc,CAAyC,IAAO;IAC5E,OAAO,KAAM,SAAQ,IAAI;QAIvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YALT,iBAAY,GAAwB,IAAI,CAAC;YACzC,qBAAgB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAK7D,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,CAAC,QAAsB;YAC3B,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC/B,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,IAAa,EAAE,QAAgB,4BAAoB;YACrE,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACtC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;QAEO,KAAK,CAAC,iBAAiB,CAAC,OAAyB;YACvD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;YAEjE,8CAA8C;YAC9C,IAAI,OAAgB,CAAC;YACrB,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,GAAG,MAAM,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBACzB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;gBACxC,CAAC;YACH,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC;YACpC,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /**
3
+ * OpenCloseController - Adds open/close capability (for blinds, curtains)
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenCloseController = OpenCloseController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function OpenCloseController(Base) {
10
+ return class extends Base {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ constructor(...args) {
13
+ super(...args);
14
+ this.openCloseCallback = null;
15
+ this.openCloseEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
16
+ this.registerRequestHandler(this.handleOpenCloseRequest.bind(this));
17
+ }
18
+ onOpenClose(callback) {
19
+ this.openCloseCallback = callback;
20
+ }
21
+ async sendOpenCloseEvent(position, cause = types_1.PHYSICAL_INTERACTION) {
22
+ if (this.openCloseEventLimiter.isLimited()) {
23
+ return false;
24
+ }
25
+ return this.sendEvent('setRangeValue', { rangeValue: position }, cause);
26
+ }
27
+ async handleOpenCloseRequest(request) {
28
+ if (request.action !== 'setRangeValue' || !this.openCloseCallback) {
29
+ return false;
30
+ }
31
+ const position = request.requestValue.rangeValue;
32
+ const success = await this.openCloseCallback(this.getDeviceId(), position);
33
+ if (success) {
34
+ request.responseValue.rangeValue = position;
35
+ }
36
+ return success;
37
+ }
38
+ };
39
+ }
40
+ //# sourceMappingURL=OpenCloseController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenCloseController.js","sourceRoot":"","sources":["../../src/capabilities/OpenCloseController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAoBH,kDAyCC;AA1DD,uDAAoD;AAEpD,yCAAwE;AAexE,SAAgB,mBAAmB,CAAyC,IAAO;IACjF,OAAO,KAAM,SAAQ,IAAI;QAIvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YALT,sBAAiB,GAA6B,IAAI,CAAC;YACnD,0BAAqB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAKlE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,CAAC;QAED,WAAW,CAAC,QAA2B;YACrC,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;QACpC,CAAC;QAED,KAAK,CAAC,kBAAkB,CACtB,QAAgB,EAChB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC3C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QAC1E,CAAC;QAEO,KAAK,CAAC,sBAAsB,CAAC,OAAyB;YAC5D,IAAI,OAAO,CAAC,MAAM,KAAK,eAAe,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAClE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC;YACjD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;YAE3E,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,aAAa,CAAC,UAAU,GAAG,QAAQ,CAAC;YAC9C,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /**
3
+ * PercentageController - Adds percentage control capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PercentageController = PercentageController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function PercentageController(Base) {
10
+ return class extends Base {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ constructor(...args) {
13
+ super(...args);
14
+ this.percentageCallback = null;
15
+ this.adjustPercentageCallback = null;
16
+ this.percentageEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
17
+ this.registerRequestHandler(this.handlePercentageRequest.bind(this));
18
+ }
19
+ onPercentage(callback) {
20
+ this.percentageCallback = callback;
21
+ }
22
+ onAdjustPercentage(callback) {
23
+ this.adjustPercentageCallback = callback;
24
+ }
25
+ async sendPercentageEvent(percentage, cause = types_1.PHYSICAL_INTERACTION) {
26
+ if (this.percentageEventLimiter.isLimited()) {
27
+ return false;
28
+ }
29
+ return this.sendEvent('setPercentage', { percentage }, cause);
30
+ }
31
+ async handlePercentageRequest(request) {
32
+ if (request.action === 'setPercentage' && this.percentageCallback) {
33
+ const percentage = request.requestValue.percentage;
34
+ const success = await this.percentageCallback(this.getDeviceId(), percentage);
35
+ if (success) {
36
+ request.responseValue.percentage = percentage;
37
+ }
38
+ return success;
39
+ }
40
+ if (request.action === 'adjustPercentage' && this.adjustPercentageCallback) {
41
+ const percentageDelta = request.requestValue.percentageDelta;
42
+ const success = await this.adjustPercentageCallback(this.getDeviceId(), percentageDelta);
43
+ if (success) {
44
+ request.responseValue.percentage = percentageDelta;
45
+ }
46
+ return success;
47
+ }
48
+ return false;
49
+ }
50
+ };
51
+ }
52
+ //# sourceMappingURL=PercentageController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PercentageController.js","sourceRoot":"","sources":["../../src/capabilities/PercentageController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA0BH,oDAyDC;AAhFD,uDAAoD;AAEpD,yCAAwE;AAqBxE,SAAgB,oBAAoB,CAAyC,IAAO;IAClF,OAAO,KAAM,SAAQ,IAAI;QAKvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YANT,uBAAkB,GAA8B,IAAI,CAAC;YACrD,6BAAwB,GAAoC,IAAI,CAAC;YACjE,2BAAsB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAKnE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,YAAY,CAAC,QAA4B;YACvC,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;QACrC,CAAC;QAED,kBAAkB,CAAC,QAAkC;YACnD,IAAI,CAAC,wBAAwB,GAAG,QAAQ,CAAC;QAC3C,CAAC;QAED,KAAK,CAAC,mBAAmB,CACvB,UAAkB,EAClB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC5C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC;QAEO,KAAK,CAAC,uBAAuB,CAAC,OAAyB;YAC7D,IAAI,OAAO,CAAC,MAAM,KAAK,eAAe,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAClE,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC;gBACnD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,CAAC,CAAC;gBAE9E,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,aAAa,CAAC,UAAU,GAAG,UAAU,CAAC;gBAChD,CAAC;gBAED,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,kBAAkB,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAC3E,MAAM,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC;gBAC7D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,eAAe,CAAC,CAAC;gBAEzF,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,aAAa,CAAC,UAAU,GAAG,eAAe,CAAC;gBACrD,CAAC;gBAED,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /**
3
+ * PowerLevelController - Adds power level control capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PowerLevelController = PowerLevelController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function PowerLevelController(Base) {
10
+ return class extends Base {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ constructor(...args) {
13
+ super(...args);
14
+ this.powerLevelCallback = null;
15
+ this.adjustPowerLevelCallback = null;
16
+ this.powerLevelEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
17
+ this.registerRequestHandler(this.handlePowerLevelRequest.bind(this));
18
+ }
19
+ onPowerLevel(callback) {
20
+ this.powerLevelCallback = callback;
21
+ }
22
+ onAdjustPowerLevel(callback) {
23
+ this.adjustPowerLevelCallback = callback;
24
+ }
25
+ async sendPowerLevelEvent(powerLevel, cause = types_1.PHYSICAL_INTERACTION) {
26
+ if (this.powerLevelEventLimiter.isLimited()) {
27
+ return false;
28
+ }
29
+ return this.sendEvent('setPowerLevel', { powerLevel }, cause);
30
+ }
31
+ async handlePowerLevelRequest(request) {
32
+ if (request.action === 'setPowerLevel' && this.powerLevelCallback) {
33
+ const powerLevel = request.requestValue.powerLevel;
34
+ const success = await this.powerLevelCallback(this.getDeviceId(), powerLevel);
35
+ if (success) {
36
+ request.responseValue.powerLevel = powerLevel;
37
+ }
38
+ return success;
39
+ }
40
+ if (request.action === 'adjustPowerLevel' && this.adjustPowerLevelCallback) {
41
+ const powerLevelDelta = request.requestValue.powerLevelDelta;
42
+ const success = await this.adjustPowerLevelCallback(this.getDeviceId(), powerLevelDelta);
43
+ if (success) {
44
+ request.responseValue.powerLevel = powerLevelDelta;
45
+ }
46
+ return success;
47
+ }
48
+ return false;
49
+ }
50
+ };
51
+ }
52
+ //# sourceMappingURL=PowerLevelController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PowerLevelController.js","sourceRoot":"","sources":["../../src/capabilities/PowerLevelController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA0BH,oDAyDC;AAhFD,uDAAoD;AAEpD,yCAAwE;AAqBxE,SAAgB,oBAAoB,CAAyC,IAAO;IAClF,OAAO,KAAM,SAAQ,IAAI;QAKvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YANT,uBAAkB,GAA8B,IAAI,CAAC;YACrD,6BAAwB,GAAoC,IAAI,CAAC;YACjE,2BAAsB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAKnE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,YAAY,CAAC,QAA4B;YACvC,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;QACrC,CAAC;QAED,kBAAkB,CAAC,QAAkC;YACnD,IAAI,CAAC,wBAAwB,GAAG,QAAQ,CAAC;QAC3C,CAAC;QAED,KAAK,CAAC,mBAAmB,CACvB,UAAkB,EAClB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC5C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC;QAEO,KAAK,CAAC,uBAAuB,CAAC,OAAyB;YAC7D,IAAI,OAAO,CAAC,MAAM,KAAK,eAAe,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAClE,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC;gBACnD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,CAAC,CAAC;gBAE9E,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,aAAa,CAAC,UAAU,GAAG,UAAU,CAAC;gBAChD,CAAC;gBAED,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,kBAAkB,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAC3E,MAAM,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC;gBAC7D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,eAAe,CAAC,CAAC;gBAEzF,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,aAAa,CAAC,UAAU,GAAG,eAAe,CAAC;gBACrD,CAAC;gBAED,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ /**
3
+ * PowerSensor - Adds power consumption monitoring capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PowerSensor = PowerSensor;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function PowerSensor(Base) {
10
+ return class extends Base {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.powerSensorEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_SENSOR_VALUE);
14
+ }
15
+ async sendPowerSensorEvent(value, cause = types_1.PERIODIC_POLL) {
16
+ if (this.powerSensorEventLimiter.isLimited()) {
17
+ return false;
18
+ }
19
+ return this.sendEvent('currentPowerConsumption', value, cause);
20
+ }
21
+ };
22
+ }
23
+ //# sourceMappingURL=PowerSensor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PowerSensor.js","sourceRoot":"","sources":["../../src/capabilities/PowerSensor.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAqBH,kCAYC;AA9BD,uDAAoD;AACpD,yCAAwE;AAiBxE,SAAgB,WAAW,CAAyC,IAAO;IACzE,OAAO,KAAM,SAAQ,IAAI;QAAlB;;YACG,4BAAuB,GAAG,IAAI,2BAAY,CAAC,gCAAwB,CAAC,CAAC;QAS/E,CAAC;QAPC,KAAK,CAAC,oBAAoB,CAAC,KAAiB,EAAE,QAAgB,qBAAa;YACzE,IAAI,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC7C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,yBAAyB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /**
3
+ * PowerStateController - Adds on/off capability to devices
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PowerStateController = PowerStateController;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function PowerStateController(Base) {
10
+ return class extends Base {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ constructor(...args) {
13
+ super(...args);
14
+ this.powerStateCallback = null;
15
+ this.powerStateEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
16
+ this.registerRequestHandler(this.handlePowerStateRequest.bind(this));
17
+ }
18
+ onPowerState(callback) {
19
+ this.powerStateCallback = callback;
20
+ }
21
+ async sendPowerStateEvent(state, cause = types_1.PHYSICAL_INTERACTION) {
22
+ if (this.powerStateEventLimiter.isLimited()) {
23
+ return false;
24
+ }
25
+ return this.sendEvent('setPowerState', {
26
+ state: state ? 'On' : 'Off',
27
+ }, cause);
28
+ }
29
+ async handlePowerStateRequest(request) {
30
+ if (request.action !== 'setPowerState' || !this.powerStateCallback) {
31
+ return false;
32
+ }
33
+ const state = request.requestValue.state === 'On';
34
+ const result = await this.powerStateCallback(this.getDeviceId(), state);
35
+ // Handle both boolean and object return types
36
+ let success;
37
+ if (typeof result === 'boolean') {
38
+ success = result;
39
+ }
40
+ else {
41
+ success = result.success;
42
+ if (result.message) {
43
+ request.errorMessage = result.message;
44
+ }
45
+ }
46
+ if (success) {
47
+ request.responseValue.state = state ? 'On' : 'Off';
48
+ }
49
+ return success;
50
+ }
51
+ };
52
+ }
53
+ //# sourceMappingURL=PowerStateController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PowerStateController.js","sourceRoot":"","sources":["../../src/capabilities/PowerStateController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAeH,oDA0DC;AAtED,uDAAoD;AAEpD,yCAAwE;AAUxE,SAAgB,oBAAoB,CAAyC,IAAO;IAClF,OAAO,KAAM,SAAQ,IAAI;QAIvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YALT,uBAAkB,GAA8B,IAAI,CAAC;YACrD,2BAAsB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAKnE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,YAAY,CAAC,QAA4B;YACvC,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;QACrC,CAAC;QAED,KAAK,CAAC,mBAAmB,CACvB,KAAc,EACd,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC5C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CACnB,eAAe,EACf;gBACE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;aAC5B,EACD,KAAK,CACN,CAAC;QACJ,CAAC;QAEO,KAAK,CAAC,uBAAuB,CAAC,OAAyB;YAC7D,IAAI,OAAO,CAAC,MAAM,KAAK,eAAe,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACnE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,KAAK,IAAI,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;YAExE,8CAA8C;YAC9C,IAAI,OAAgB,CAAC;YACrB,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,GAAG,MAAM,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBACzB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;gBACxC,CAAC;YACH,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;YACrD,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ /**
3
+ * PushNotification - Adds push notification capability
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PushNotification = PushNotification;
7
+ const EventLimiter_1 = require("../core/EventLimiter");
8
+ const types_1 = require("../core/types");
9
+ function PushNotification(Base) {
10
+ return class extends Base {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.pushNotificationEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
14
+ }
15
+ async sendPushNotification(notification, cause = types_1.PHYSICAL_INTERACTION) {
16
+ if (this.pushNotificationEventLimiter.isLimited()) {
17
+ return false;
18
+ }
19
+ return this.sendEvent('pushNotification', { notification }, cause);
20
+ }
21
+ };
22
+ }
23
+ //# sourceMappingURL=PushNotification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PushNotification.js","sourceRoot":"","sources":["../../src/capabilities/PushNotification.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAaH,4CAeC;AAzBD,uDAAoD;AACpD,yCAAwE;AASxE,SAAgB,gBAAgB,CAAyC,IAAO;IAC9E,OAAO,KAAM,SAAQ,IAAI;QAAlB;;YACG,iCAA4B,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;QAY7E,CAAC;QAVC,KAAK,CAAC,oBAAoB,CACxB,YAAoB,EACpB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,4BAA4B,CAAC,SAAS,EAAE,EAAE,CAAC;gBAClD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,EAAE,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;QACrE,CAAC;KACF,CAAC;AACJ,CAAC"}