sinricpro 2.12.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.
- package/LICENSE +15 -0
- package/README.md +132 -15
- package/dist/capabilities/AirQualitySensor.js +23 -0
- package/dist/capabilities/AirQualitySensor.js.map +1 -0
- package/dist/capabilities/BrightnessController.js +76 -0
- package/dist/capabilities/BrightnessController.js.map +1 -0
- package/dist/capabilities/CameraController.js +29 -0
- package/dist/capabilities/CameraController.js.map +1 -0
- package/dist/capabilities/ChannelController.js +52 -0
- package/dist/capabilities/ChannelController.js.map +1 -0
- package/dist/capabilities/ColorController.js +53 -0
- package/dist/capabilities/ColorController.js.map +1 -0
- package/dist/capabilities/ColorTemperatureController.js +53 -0
- package/dist/capabilities/ColorTemperatureController.js.map +1 -0
- package/dist/capabilities/ContactSensor.js +23 -0
- package/dist/capabilities/ContactSensor.js.map +1 -0
- package/dist/capabilities/Doorbell.js +23 -0
- package/dist/capabilities/Doorbell.js.map +1 -0
- package/dist/capabilities/EqualizerController.js +103 -0
- package/dist/capabilities/EqualizerController.js.map +1 -0
- package/dist/capabilities/InputController.js +51 -0
- package/dist/capabilities/InputController.js.map +1 -0
- package/dist/capabilities/KeypadController.js +23 -0
- package/dist/capabilities/KeypadController.js.map +1 -0
- package/dist/capabilities/LockController.js +40 -0
- package/dist/capabilities/LockController.js.map +1 -0
- package/dist/capabilities/MediaController.js +40 -0
- package/dist/capabilities/MediaController.js.map +1 -0
- package/dist/capabilities/ModeController.js +51 -0
- package/dist/capabilities/ModeController.js.map +1 -0
- package/dist/capabilities/MotionSensor.js +23 -0
- package/dist/capabilities/MotionSensor.js.map +1 -0
- package/dist/capabilities/MuteController.js +51 -0
- package/dist/capabilities/MuteController.js.map +1 -0
- package/dist/capabilities/OpenCloseController.js +40 -0
- package/dist/capabilities/OpenCloseController.js.map +1 -0
- package/dist/capabilities/PercentageController.js +52 -0
- package/dist/capabilities/PercentageController.js.map +1 -0
- package/dist/capabilities/PowerLevelController.js +52 -0
- package/dist/capabilities/PowerLevelController.js.map +1 -0
- package/dist/capabilities/PowerSensor.js +23 -0
- package/dist/capabilities/PowerSensor.js.map +1 -0
- package/dist/capabilities/PowerStateController.js +53 -0
- package/dist/capabilities/PowerStateController.js.map +1 -0
- package/dist/capabilities/PushNotification.js +23 -0
- package/dist/capabilities/PushNotification.js.map +1 -0
- package/dist/capabilities/RangeController.js +52 -0
- package/dist/capabilities/RangeController.js.map +1 -0
- package/dist/capabilities/SettingController.js +33 -0
- package/dist/capabilities/SettingController.js.map +1 -0
- package/dist/capabilities/StartStopController.js +51 -0
- package/dist/capabilities/StartStopController.js.map +1 -0
- package/dist/capabilities/TemperatureSensor.js +29 -0
- package/dist/capabilities/TemperatureSensor.js.map +1 -0
- package/dist/capabilities/ThermostatController.js +70 -0
- package/dist/capabilities/ThermostatController.js.map +1 -0
- package/dist/capabilities/ToggleController.js +51 -0
- package/dist/capabilities/ToggleController.js.map +1 -0
- package/dist/capabilities/VolumeController.js +74 -0
- package/dist/capabilities/VolumeController.js.map +1 -0
- package/dist/capabilities/index.js +56 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/core/EventLimiter.js +50 -0
- package/dist/core/EventLimiter.js.map +1 -0
- package/dist/core/MessageQueue.js +28 -0
- package/dist/core/MessageQueue.js.map +1 -0
- package/dist/core/Signature.js +68 -0
- package/dist/core/Signature.js.map +1 -0
- package/dist/core/SinricPro.js +332 -0
- package/dist/core/SinricPro.js.map +1 -0
- package/dist/core/SinricProDevice.js +82 -0
- package/dist/core/SinricProDevice.js.map +1 -0
- package/dist/core/WebSocketClient.js +156 -0
- package/dist/core/WebSocketClient.js.map +1 -0
- package/dist/core/types.js +30 -0
- package/dist/core/types.js.map +1 -0
- package/dist/devices/SinricProAirQualitySensor.js +29 -0
- package/dist/devices/SinricProAirQualitySensor.js.map +1 -0
- package/dist/devices/SinricProBlinds.js +29 -0
- package/dist/devices/SinricProBlinds.js.map +1 -0
- package/dist/devices/SinricProCamera.js +29 -0
- package/dist/devices/SinricProCamera.js.map +1 -0
- package/dist/devices/SinricProContactSensor.js +28 -0
- package/dist/devices/SinricProContactSensor.js.map +1 -0
- package/dist/devices/SinricProDimSwitch.js +29 -0
- package/dist/devices/SinricProDimSwitch.js.map +1 -0
- package/dist/devices/SinricProDoorbell.js +29 -0
- package/dist/devices/SinricProDoorbell.js.map +1 -0
- package/dist/devices/SinricProFan.js +29 -0
- package/dist/devices/SinricProFan.js.map +1 -0
- package/dist/devices/SinricProFanUS.js +29 -0
- package/dist/devices/SinricProFanUS.js.map +1 -0
- package/dist/devices/SinricProGarageDoor.js +28 -0
- package/dist/devices/SinricProGarageDoor.js.map +1 -0
- package/dist/devices/SinricProLight.js +30 -0
- package/dist/devices/SinricProLight.js.map +1 -0
- package/dist/devices/SinricProLock.js +28 -0
- package/dist/devices/SinricProLock.js.map +1 -0
- package/dist/devices/SinricProMotionSensor.js +28 -0
- package/dist/devices/SinricProMotionSensor.js.map +1 -0
- package/dist/devices/SinricProPowerSensor.js +28 -0
- package/dist/devices/SinricProPowerSensor.js.map +1 -0
- package/dist/devices/SinricProSpeaker.js +33 -0
- package/dist/devices/SinricProSpeaker.js.map +1 -0
- package/dist/devices/SinricProSwitch.js +24 -0
- package/dist/devices/SinricProSwitch.js.map +1 -0
- package/dist/devices/SinricProTV.js +33 -0
- package/dist/devices/SinricProTV.js.map +1 -0
- package/dist/devices/SinricProThermostat.js +30 -0
- package/dist/devices/SinricProThermostat.js.map +1 -0
- package/dist/devices/SinricProWindowAC.js +31 -0
- package/dist/devices/SinricProWindowAC.js.map +1 -0
- package/dist/devices/index.js +44 -0
- package/dist/devices/index.js.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/SinricProSdkLogger.js +42 -0
- package/dist/utils/SinricProSdkLogger.js.map +1 -0
- package/package.json +78 -38
- package/.github/workflows/npm-publish.yml +0 -32
- package/.nvmrc +0 -1
- package/.prettierrc +0 -5
- package/CHANGELOG.md +0 -45
- package/index.js +0 -1
- package/lib/cbhandler.js +0 -182
- package/lib/contorllers/brightness_controller.js +0 -40
- package/lib/contorllers/camera_stream_controller.js +0 -39
- package/lib/contorllers/color_controller.js +0 -23
- package/lib/contorllers/color_temperature.js +0 -23
- package/lib/contorllers/mode_controller.js +0 -22
- package/lib/contorllers/power_controller.js +0 -53
- package/lib/contorllers/range_value_controller.js +0 -38
- package/lib/contorllers/sensors_controller.js +0 -54
- package/lib/contorllers/speaker_controller.js +0 -51
- package/lib/contorllers/toggle_state_controller.js +0 -21
- package/lib/contorllers/tv_controller.js +0 -93
- package/lib/errors/errors.js +0 -8
- package/lib/events/event_handler.js +0 -108
- package/lib/signature.js +0 -26
- package/lib/sinrcpro.js +0 -129
- package/lib/sinricproudp.js +0 -60
- package/lib/storage.js +0 -31
package/LICENSE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 SinricPro
|
|
4
|
+
|
|
5
|
+
This is a human-readable summary of (and not a substitute for) the license.
|
|
6
|
+
|
|
7
|
+
You are free to:
|
|
8
|
+
- Share — copy and redistribute the material in any medium or format
|
|
9
|
+
- Adapt — remix, transform, and build upon the material for any purpose, even commercially
|
|
10
|
+
|
|
11
|
+
Under the following terms:
|
|
12
|
+
- Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made
|
|
13
|
+
- ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original
|
|
14
|
+
|
|
15
|
+
Full license text: https://creativecommons.org/licenses/by-sa/4.0/legalcode
|
package/README.md
CHANGED
|
@@ -1,15 +1,132 @@
|
|
|
1
|
-
# SinricPro
|
|
2
|
-
|
|
3
|
-
[](https://www.npmjs.com/package/sinricpro)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
|
|
6
|
+
Official SinricPro SDK for Node.js and TypeScript. Control your IoT devices with Alexa and Google Home.
|
|
7
|
+
|
|
8
|
+
**🎯 Features:**
|
|
9
|
+
- ✅ Full TypeScript support with strong typing
|
|
10
|
+
- ✅ Modern async/await API
|
|
11
|
+
- ✅ WebSocket with automatic reconnection
|
|
12
|
+
- ✅ HMAC-SHA256 authentication
|
|
13
|
+
- ✅ Event rate limiting
|
|
14
|
+
- ✅ Multiple device types (Switch, Light, Thermostat, etc.)
|
|
15
|
+
- ✅ Comprehensive error handling
|
|
16
|
+
- ✅ Unit tested
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 📦 Installation
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install sinricpro
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Or with yarn:
|
|
27
|
+
```bash
|
|
28
|
+
yarn add sinricpro
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 🚀 Quick Start
|
|
34
|
+
|
|
35
|
+
### 1. Get Your Credentials
|
|
36
|
+
|
|
37
|
+
1. Sign up at [sinric.pro](https://sinric.pro)
|
|
38
|
+
2. Create a new device (e.g., "Switch")
|
|
39
|
+
3. Copy your credentials:
|
|
40
|
+
- `APP_KEY`
|
|
41
|
+
- `APP_SECRET`
|
|
42
|
+
- `DEVICE_ID`
|
|
43
|
+
|
|
44
|
+
### 2. Create a Simple Switch
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
import SinricPro from 'sinricpro';
|
|
48
|
+
import { SinricProSwitch } from 'sinricpro/devices';
|
|
49
|
+
|
|
50
|
+
const config = {
|
|
51
|
+
appKey: 'YOUR-APP-KEY',
|
|
52
|
+
appSecret: 'YOUR-APP-SECRET',
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
async function main() {
|
|
56
|
+
// Create a switch device
|
|
57
|
+
const mySwitch = SinricProSwitch('YOUR-DEVICE-ID');
|
|
58
|
+
|
|
59
|
+
// Handle power state changes from Alexa/Google Home
|
|
60
|
+
mySwitch.onPowerState(async (deviceId, state) => {
|
|
61
|
+
console.log(`Device turned ${state ? 'ON' : 'OFF'}`);
|
|
62
|
+
// Control your hardware here
|
|
63
|
+
return true; // Return true if successful
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Add device to SinricPro
|
|
67
|
+
SinricPro.add(mySwitch);
|
|
68
|
+
|
|
69
|
+
// Connection events
|
|
70
|
+
SinricPro.onConnected(() => console.log('Connected!'));
|
|
71
|
+
SinricPro.onDisconnected(() => console.log('Disconnected!'));
|
|
72
|
+
|
|
73
|
+
// Initialize SDK
|
|
74
|
+
await SinricPro.begin(config);
|
|
75
|
+
|
|
76
|
+
// Send events when state changes locally
|
|
77
|
+
setTimeout(async () => {
|
|
78
|
+
await mySwitch.sendPowerStateEvent(true);
|
|
79
|
+
}, 5000);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
main().catch(console.error);
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 3. Run Your App
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
ts-node app.ts
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 4. Control with Voice
|
|
92
|
+
|
|
93
|
+
- "Alexa, turn on Switch"
|
|
94
|
+
- "OK Google, turn off Switch"
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 🤝 Contributing
|
|
99
|
+
|
|
100
|
+
Contributions welcome! Please:
|
|
101
|
+
|
|
102
|
+
1. Fork the repository
|
|
103
|
+
2. Create a feature branch
|
|
104
|
+
3. Add tests for new features
|
|
105
|
+
4. Submit a pull request
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 📄 License
|
|
110
|
+
|
|
111
|
+
This project is licensed under CC-BY-SA-4.0.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 🔗 Links
|
|
116
|
+
|
|
117
|
+
- **Website:** [sinric.pro](https://sinric.pro)
|
|
118
|
+
- **Documentation:** [help.sinric.pro](https://help.sinric.pro)
|
|
119
|
+
- **GitHub:** [github.com/sinricpro](https://github.com/sinricpro)
|
|
120
|
+
- **Support:** [community.sinric.pro](https://community.sinric.pro)
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 💬 Support
|
|
125
|
+
|
|
126
|
+
- **Issues:** [GitHub Issues](https://github.com/sinricpro/nodejs-sdk/issues)
|
|
127
|
+
- **Community:** [SinricPro Community](https://community.sinric.pro)
|
|
128
|
+
- **Email:** support@sinric.pro
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
**Made with ❤️ by the SinricPro team**
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AirQualitySensor - Adds air quality monitoring capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AirQualitySensor = AirQualitySensor;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
9
|
+
function AirQualitySensor(Base) {
|
|
10
|
+
return class extends Base {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments);
|
|
13
|
+
this.airQualityEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_SENSOR_VALUE);
|
|
14
|
+
}
|
|
15
|
+
async sendAirQualityEvent(value, cause = types_1.PERIODIC_POLL) {
|
|
16
|
+
if (this.airQualityEventLimiter.isLimited()) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return this.sendEvent('currentAirQuality', value, cause);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=AirQualitySensor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AirQualitySensor.js","sourceRoot":"","sources":["../../src/capabilities/AirQualitySensor.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAoBH,4CAeC;AAhCD,uDAAoD;AACpD,yCAAwE;AAgBxE,SAAgB,gBAAgB,CAAyC,IAAO;IAC9E,OAAO,KAAM,SAAQ,IAAI;QAAlB;;YACG,2BAAsB,GAAG,IAAI,2BAAY,CAAC,gCAAwB,CAAC,CAAC;QAY9E,CAAC;QAVC,KAAK,CAAC,mBAAmB,CACvB,KAAsB,EACtB,QAAgB,qBAAa;YAE7B,IAAI,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC5C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BrightnessController - Adds brightness control capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BrightnessController = BrightnessController;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
9
|
+
function BrightnessController(Base) {
|
|
10
|
+
return class extends Base {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
constructor(...args) {
|
|
13
|
+
super(...args);
|
|
14
|
+
this.brightnessCallback = null;
|
|
15
|
+
this.adjustBrightnessCallback = null;
|
|
16
|
+
this.brightnessEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
|
|
17
|
+
this.registerRequestHandler(this.handleBrightnessRequest.bind(this));
|
|
18
|
+
}
|
|
19
|
+
onBrightness(callback) {
|
|
20
|
+
this.brightnessCallback = callback;
|
|
21
|
+
}
|
|
22
|
+
onAdjustBrightness(callback) {
|
|
23
|
+
this.adjustBrightnessCallback = callback;
|
|
24
|
+
}
|
|
25
|
+
async sendBrightnessEvent(brightness, cause = types_1.PHYSICAL_INTERACTION) {
|
|
26
|
+
if (this.brightnessEventLimiter.isLimited()) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return this.sendEvent('setBrightness', {
|
|
30
|
+
brightness,
|
|
31
|
+
}, cause);
|
|
32
|
+
}
|
|
33
|
+
async handleBrightnessRequest(request) {
|
|
34
|
+
if (request.action === 'setBrightness' && this.brightnessCallback) {
|
|
35
|
+
const brightness = request.requestValue.brightness;
|
|
36
|
+
const result = await this.brightnessCallback(this.getDeviceId(), brightness);
|
|
37
|
+
// Handle both boolean and object return types
|
|
38
|
+
let success;
|
|
39
|
+
if (typeof result === 'boolean') {
|
|
40
|
+
success = result;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
success = result.success;
|
|
44
|
+
if (result.message) {
|
|
45
|
+
request.errorMessage = result.message;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (success) {
|
|
49
|
+
request.responseValue.brightness = brightness;
|
|
50
|
+
}
|
|
51
|
+
return success;
|
|
52
|
+
}
|
|
53
|
+
if (request.action === 'adjustBrightness' && this.adjustBrightnessCallback) {
|
|
54
|
+
const brightnessDelta = request.requestValue.brightnessDelta;
|
|
55
|
+
const result = await this.adjustBrightnessCallback(this.getDeviceId(), brightnessDelta);
|
|
56
|
+
// Handle both boolean and object return types
|
|
57
|
+
let success;
|
|
58
|
+
if (typeof result === 'boolean') {
|
|
59
|
+
success = result;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
success = result.success;
|
|
63
|
+
if (result.message) {
|
|
64
|
+
request.errorMessage = result.message;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (success) {
|
|
68
|
+
request.responseValue.brightness = brightnessDelta;
|
|
69
|
+
}
|
|
70
|
+
return success;
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=BrightnessController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BrightnessController.js","sourceRoot":"","sources":["../../src/capabilities/BrightnessController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CameraController - Adds camera control capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CameraController = CameraController;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
9
|
+
function CameraController(Base) {
|
|
10
|
+
return class extends Base {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments);
|
|
13
|
+
this.cameraEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
|
|
14
|
+
}
|
|
15
|
+
async sendCameraStreamEvent(streamUrl, protocol = 'RTSP', cause = types_1.PHYSICAL_INTERACTION) {
|
|
16
|
+
if (this.cameraEventLimiter.isLimited()) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return this.sendEvent('setCameraStream', { streamUrl, protocol }, cause);
|
|
20
|
+
}
|
|
21
|
+
async sendSnapshotEvent(imageUrl, cause = types_1.PHYSICAL_INTERACTION) {
|
|
22
|
+
if (this.cameraEventLimiter.isLimited()) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return this.sendEvent('snapshot', { imageUrl }, cause);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=CameraController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CameraController.js","sourceRoot":"","sources":["../../src/capabilities/CameraController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAcH,4CA2BC;AAtCD,uDAAoD;AACpD,yCAAwE;AAUxE,SAAgB,gBAAgB,CAAyC,IAAO;IAC9E,OAAO,KAAM,SAAQ,IAAI;QAAlB;;YACG,uBAAkB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;QAwBnE,CAAC;QAtBC,KAAK,CAAC,qBAAqB,CACzB,SAAiB,EACjB,WAAmB,MAAM,EACzB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACxC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC;QAED,KAAK,CAAC,iBAAiB,CACrB,QAAgB,EAChB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACxC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ChannelController - Adds TV channel control capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ChannelController = ChannelController;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
9
|
+
function ChannelController(Base) {
|
|
10
|
+
return class extends Base {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
constructor(...args) {
|
|
13
|
+
super(...args);
|
|
14
|
+
this.changeChannelCallback = null;
|
|
15
|
+
this.skipChannelsCallback = null;
|
|
16
|
+
this.channelEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
|
|
17
|
+
this.registerRequestHandler(this.handleChannelRequest.bind(this));
|
|
18
|
+
}
|
|
19
|
+
onChangeChannel(callback) {
|
|
20
|
+
this.changeChannelCallback = callback;
|
|
21
|
+
}
|
|
22
|
+
onSkipChannels(callback) {
|
|
23
|
+
this.skipChannelsCallback = callback;
|
|
24
|
+
}
|
|
25
|
+
async sendChannelEvent(channel, cause = types_1.PHYSICAL_INTERACTION) {
|
|
26
|
+
if (this.channelEventLimiter.isLimited()) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return this.sendEvent('changeChannel', { channel }, cause);
|
|
30
|
+
}
|
|
31
|
+
async handleChannelRequest(request) {
|
|
32
|
+
if (request.action === 'changeChannel' && this.changeChannelCallback) {
|
|
33
|
+
const channel = request.requestValue.channel;
|
|
34
|
+
const success = await this.changeChannelCallback(this.getDeviceId(), channel);
|
|
35
|
+
if (success) {
|
|
36
|
+
request.responseValue.channel = channel;
|
|
37
|
+
}
|
|
38
|
+
return success;
|
|
39
|
+
}
|
|
40
|
+
if (request.action === 'skipChannels' && this.skipChannelsCallback) {
|
|
41
|
+
const channelCount = request.requestValue.channelCount;
|
|
42
|
+
const success = await this.skipChannelsCallback(this.getDeviceId(), channelCount);
|
|
43
|
+
if (success) {
|
|
44
|
+
request.responseValue.channelCount = channelCount;
|
|
45
|
+
}
|
|
46
|
+
return success;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=ChannelController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChannelController.js","sourceRoot":"","sources":["../../src/capabilities/ChannelController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA+BH,8CAyDC;AArFD,uDAAoD;AAEpD,yCAAwE;AA0BxE,SAAgB,iBAAiB,CAAyC,IAAO;IAC/E,OAAO,KAAM,SAAQ,IAAI;QAKvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YANT,0BAAqB,GAAiC,IAAI,CAAC;YAC3D,yBAAoB,GAAgC,IAAI,CAAC;YACzD,wBAAmB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAKhE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,eAAe,CAAC,QAA+B;YAC7C,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC;QACxC,CAAC;QAED,cAAc,CAAC,QAA8B;YAC3C,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;QACvC,CAAC;QAED,KAAK,CAAC,gBAAgB,CACpB,OAAoB,EACpB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACzC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;QAC7D,CAAC;QAEO,KAAK,CAAC,oBAAoB,CAAC,OAAyB;YAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,eAAe,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBACrE,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;gBAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;gBAE9E,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,aAAa,CAAC,OAAO,GAAG,OAAO,CAAC;gBAC1C,CAAC;gBAED,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,cAAc,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACnE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC;gBACvD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,CAAC;gBAElF,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,aAAa,CAAC,YAAY,GAAG,YAAY,CAAC;gBACpD,CAAC;gBAED,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ColorController - Adds RGB color control capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ColorController = ColorController;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
9
|
+
function ColorController(Base) {
|
|
10
|
+
return class extends Base {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
constructor(...args) {
|
|
13
|
+
super(...args);
|
|
14
|
+
this.colorCallback = null;
|
|
15
|
+
this.colorEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
|
|
16
|
+
this.registerRequestHandler(this.handleColorRequest.bind(this));
|
|
17
|
+
}
|
|
18
|
+
onColor(callback) {
|
|
19
|
+
this.colorCallback = callback;
|
|
20
|
+
}
|
|
21
|
+
async sendColorEvent(r, g, b, cause = types_1.PHYSICAL_INTERACTION) {
|
|
22
|
+
if (this.colorEventLimiter.isLimited()) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return this.sendEvent('setColor', {
|
|
26
|
+
color: { r, g, b },
|
|
27
|
+
}, cause);
|
|
28
|
+
}
|
|
29
|
+
async handleColorRequest(request) {
|
|
30
|
+
if (request.action !== 'setColor' || !this.colorCallback) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
const { r, g, b } = request.requestValue.color;
|
|
34
|
+
const result = await this.colorCallback(this.getDeviceId(), r, g, b);
|
|
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.color = { r, g, b };
|
|
48
|
+
}
|
|
49
|
+
return success;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=ColorController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColorController.js","sourceRoot":"","sources":["../../src/capabilities/ColorController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAeH,0CA4DC;AAxED,uDAAoD;AAEpD,yCAAwE;AAUxE,SAAgB,eAAe,CAAyC,IAAO;IAC7E,OAAO,KAAM,SAAQ,IAAI;QAIvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YALT,kBAAa,GAAyB,IAAI,CAAC;YAC3C,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,OAAO,CAAC,QAAuB;YAC7B,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;QAChC,CAAC;QAED,KAAK,CAAC,cAAc,CAClB,CAAS,EACT,CAAS,EACT,CAAS,EACT,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACvC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CACnB,UAAU,EACV;gBACE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;aACnB,EACD,KAAK,CACN,CAAC;QACJ,CAAC;QAEO,KAAK,CAAC,kBAAkB,CAAC,OAAyB;YACxD,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACzD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAErE,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,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5C,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ColorTemperatureController - Adds color temperature control capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ColorTemperatureController = ColorTemperatureController;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
9
|
+
function ColorTemperatureController(Base) {
|
|
10
|
+
return class extends Base {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
constructor(...args) {
|
|
13
|
+
super(...args);
|
|
14
|
+
this.colorTemperatureCallback = null;
|
|
15
|
+
this.colorTemperatureEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
|
|
16
|
+
this.registerRequestHandler(this.handleColorTemperatureRequest.bind(this));
|
|
17
|
+
}
|
|
18
|
+
onColorTemperature(callback) {
|
|
19
|
+
this.colorTemperatureCallback = callback;
|
|
20
|
+
}
|
|
21
|
+
async sendColorTemperatureEvent(colorTemperature, cause = types_1.PHYSICAL_INTERACTION) {
|
|
22
|
+
if (this.colorTemperatureEventLimiter.isLimited()) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return this.sendEvent('setColorTemperature', {
|
|
26
|
+
colorTemperature,
|
|
27
|
+
}, cause);
|
|
28
|
+
}
|
|
29
|
+
async handleColorTemperatureRequest(request) {
|
|
30
|
+
if (request.action !== 'setColorTemperature' || !this.colorTemperatureCallback) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
const colorTemperature = request.requestValue.colorTemperature;
|
|
34
|
+
const result = await this.colorTemperatureCallback(this.getDeviceId(), colorTemperature);
|
|
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.colorTemperature = colorTemperature;
|
|
48
|
+
}
|
|
49
|
+
return success;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=ColorTemperatureController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColorTemperatureController.js","sourceRoot":"","sources":["../../src/capabilities/ColorTemperatureController.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAeH,gEA0DC;AAtED,uDAAoD;AAEpD,yCAAwE;AAUxE,SAAgB,0BAA0B,CAAyC,IAAO;IACxF,OAAO,KAAM,SAAQ,IAAI;QAIvB,8DAA8D;QAC9D,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YALT,6BAAwB,GAAoC,IAAI,CAAC;YACjE,iCAA4B,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;YAKzE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,kBAAkB,CAAC,QAAkC;YACnD,IAAI,CAAC,wBAAwB,GAAG,QAAQ,CAAC;QAC3C,CAAC;QAED,KAAK,CAAC,yBAAyB,CAC7B,gBAAwB,EACxB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,4BAA4B,CAAC,SAAS,EAAE,EAAE,CAAC;gBAClD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CACnB,qBAAqB,EACrB;gBACE,gBAAgB;aACjB,EACD,KAAK,CACN,CAAC;QACJ,CAAC;QAEO,KAAK,CAAC,6BAA6B,CAAC,OAAyB;YACnE,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAC/E,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,gBAAgB,CAAC,CAAC;YAEzF,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,gBAAgB,GAAG,gBAAgB,CAAC;YAC5D,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ContactSensor - Adds contact/door sensor capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ContactSensor = ContactSensor;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
9
|
+
function ContactSensor(Base) {
|
|
10
|
+
return class extends Base {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments);
|
|
13
|
+
this.contactEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_SENSOR_VALUE);
|
|
14
|
+
}
|
|
15
|
+
async sendContactEvent(detected, cause = types_1.PHYSICAL_INTERACTION) {
|
|
16
|
+
if (this.contactEventLimiter.isLimited()) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return this.sendEvent('setContactState', { state: detected ? 'closed' : 'open' }, cause);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=ContactSensor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContactSensor.js","sourceRoot":"","sources":["../../src/capabilities/ContactSensor.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAaH,sCAeC;AAzBD,uDAAoD;AACpD,yCAA+E;AAS/E,SAAgB,aAAa,CAAyC,IAAO;IAC3E,OAAO,KAAM,SAAQ,IAAI;QAAlB;;YACG,wBAAmB,GAAG,IAAI,2BAAY,CAAC,gCAAwB,CAAC,CAAC;QAY3E,CAAC;QAVC,KAAK,CAAC,gBAAgB,CACpB,QAAiB,EACjB,QAAgB,4BAAoB;YAEpC,IAAI,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACzC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;QAC3F,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Doorbell - Adds doorbell press capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Doorbell = Doorbell;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
9
|
+
function Doorbell(Base) {
|
|
10
|
+
return class extends Base {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments);
|
|
13
|
+
this.doorbellEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
|
|
14
|
+
}
|
|
15
|
+
async sendDoorbellEvent(cause = types_1.PHYSICAL_INTERACTION) {
|
|
16
|
+
if (this.doorbellEventLimiter.isLimited()) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return this.sendEvent('DoorbellPress', { state: 'pressed' }, cause);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=Doorbell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Doorbell.js","sourceRoot":"","sources":["../../src/capabilities/Doorbell.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAaH,4BAYC;AAtBD,uDAAoD;AACpD,yCAAwE;AASxE,SAAgB,QAAQ,CAAyC,IAAO;IACtE,OAAO,KAAM,SAAQ,IAAI;QAAlB;;YACG,yBAAoB,GAAG,IAAI,2BAAY,CAAC,yBAAiB,CAAC,CAAC;QASrE,CAAC;QAPC,KAAK,CAAC,iBAAiB,CAAC,QAAgB,4BAAoB;YAC1D,IAAI,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC1C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;QACtE,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* EqualizerController - Adds equalizer control capability
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.EqualizerController = EqualizerController;
|
|
7
|
+
const EventLimiter_1 = require("../core/EventLimiter");
|
|
8
|
+
const types_1 = require("../core/types");
|
|
9
|
+
function EqualizerController(Base) {
|
|
10
|
+
return class extends Base {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
constructor(...args) {
|
|
13
|
+
super(...args);
|
|
14
|
+
this.setBandsCallback = null;
|
|
15
|
+
this.adjustBandsCallback = null;
|
|
16
|
+
this.setModeCallback = null;
|
|
17
|
+
this.equalizerEventLimiter = new EventLimiter_1.EventLimiter(types_1.EVENT_LIMIT_STATE);
|
|
18
|
+
this.registerRequestHandler(this.handleEqualizerRequest.bind(this));
|
|
19
|
+
}
|
|
20
|
+
onSetBands(callback) {
|
|
21
|
+
this.setBandsCallback = callback;
|
|
22
|
+
}
|
|
23
|
+
onAdjustBands(callback) {
|
|
24
|
+
this.adjustBandsCallback = callback;
|
|
25
|
+
}
|
|
26
|
+
onSetMode(callback) {
|
|
27
|
+
this.setModeCallback = callback;
|
|
28
|
+
}
|
|
29
|
+
async sendBandsEvent(bands, cause = types_1.PHYSICAL_INTERACTION) {
|
|
30
|
+
if (this.equalizerEventLimiter.isLimited()) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return this.sendEvent('setBands', { bands }, cause);
|
|
34
|
+
}
|
|
35
|
+
async sendModeEvent(mode, cause = types_1.PHYSICAL_INTERACTION) {
|
|
36
|
+
if (this.equalizerEventLimiter.isLimited()) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return this.sendEvent('setMode', { mode }, cause);
|
|
40
|
+
}
|
|
41
|
+
async handleEqualizerRequest(request) {
|
|
42
|
+
if (request.action === 'setBands' && this.setBandsCallback) {
|
|
43
|
+
const bands = request.requestValue.bands;
|
|
44
|
+
const result = await this.setBandsCallback(this.getDeviceId(), bands);
|
|
45
|
+
// Handle both boolean and object return types
|
|
46
|
+
let success;
|
|
47
|
+
if (typeof result === 'boolean') {
|
|
48
|
+
success = result;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
success = result.success;
|
|
52
|
+
if (result.message) {
|
|
53
|
+
request.errorMessage = result.message;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (success) {
|
|
57
|
+
request.responseValue.bands = bands;
|
|
58
|
+
}
|
|
59
|
+
return success;
|
|
60
|
+
}
|
|
61
|
+
if (request.action === 'adjustBands' && this.adjustBandsCallback) {
|
|
62
|
+
const bands = request.requestValue.bands;
|
|
63
|
+
const result = await this.adjustBandsCallback(this.getDeviceId(), bands);
|
|
64
|
+
// Handle both boolean and object return types
|
|
65
|
+
let success;
|
|
66
|
+
if (typeof result === 'boolean') {
|
|
67
|
+
success = result;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
success = result.success;
|
|
71
|
+
if (result.message) {
|
|
72
|
+
request.errorMessage = result.message;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (success) {
|
|
76
|
+
request.responseValue.bands = bands;
|
|
77
|
+
}
|
|
78
|
+
return success;
|
|
79
|
+
}
|
|
80
|
+
if (request.action === 'setMode' && this.setModeCallback) {
|
|
81
|
+
const mode = request.requestValue.mode;
|
|
82
|
+
const result = await this.setModeCallback(this.getDeviceId(), mode);
|
|
83
|
+
// Handle both boolean and object return types
|
|
84
|
+
let success;
|
|
85
|
+
if (typeof result === 'boolean') {
|
|
86
|
+
success = result;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
success = result.success;
|
|
90
|
+
if (result.message) {
|
|
91
|
+
request.errorMessage = result.message;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (success) {
|
|
95
|
+
request.responseValue.mode = mode;
|
|
96
|
+
}
|
|
97
|
+
return success;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=EqualizerController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EqualizerController.js","sourceRoot":"","sources":["../../src/capabilities/EqualizerController.ts"],"names":[],"mappings":"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"}
|