homebridge-ring 11.4.0 → 11.5.1
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/README.md +3 -1
- package/lib/base-accessory.js +36 -34
- package/lib/base-data-accessory.js +28 -28
- package/lib/base-device-accessory.js +40 -34
- package/lib/beam.js +38 -48
- package/lib/brightness-only.js +23 -30
- package/lib/camera-source.js +229 -263
- package/lib/camera.js +82 -65
- package/lib/chime.js +39 -37
- package/lib/co-alarm.js +13 -15
- package/lib/config.js +18 -29
- package/lib/contact-sensor.js +13 -15
- package/lib/fan.js +23 -37
- package/lib/flood-freeze-sensor.js +28 -24
- package/lib/freeze-sensor.js +19 -19
- package/lib/hap.js +4 -15
- package/lib/homebridge-ui/server.js +21 -32
- package/lib/index.js +7 -12
- package/lib/location-mode-switch.js +39 -42
- package/lib/lock.js +28 -29
- package/lib/motion-sensor.js +10 -14
- package/lib/multi-level-switch.js +24 -38
- package/lib/opus-repacketizer.js +66 -23
- package/lib/outlet.js +16 -26
- package/lib/panic-buttons.js +41 -45
- package/lib/ring-platform.js +186 -175
- package/lib/security-panel.js +84 -74
- package/lib/smoke-alarm.js +13 -15
- package/lib/smoke-co-listener.js +18 -18
- package/lib/switch.js +15 -25
- package/lib/target-value-timer.js +4 -8
- package/lib/temperature-sensor.js +11 -15
- package/lib/thermostat.js +60 -77
- package/lib/unknown-zwave-switch.js +15 -25
- package/lib/util.js +6 -10
- package/lib/water-sensor.js +19 -19
- package/package.json +9 -6
- package/lib/server.js +0 -58
package/README.md
CHANGED
|
@@ -102,9 +102,11 @@ Only include an optional parameter if you actually need it. Default behavior wit
|
|
|
102
102
|
|
|
103
103
|
### Cameras
|
|
104
104
|
|
|
105
|
+
The plugin supports all Ring camera models, as well as ONVIF cameras connected via Ring Edge
|
|
106
|
+
|
|
105
107
|
- Camera Feed
|
|
106
108
|
- Shows a snapshot from the camera while viewing the room in Home. There are limitations on when battery cameras can take snapshots. See [the Snapshot Limitations Wiki](https://github.com/dgreif/ring/wiki/Snapshot-Limitations) for details.
|
|
107
|
-
- Shows a live feed from the camera if you click on it. The feed supports video and 2-way audio, but requires that you have `ffmpeg` with `libfdk_aac` installed. A pre-built `ffmpeg` will be automatically installed on most platforms using `ffmpeg-for-homebridge`. See the [FFmpeg wiki](https://github.com/dgreif/ring/wiki/FFmpeg) for details.
|
|
109
|
+
- Shows a live feed from the camera if you click on it. The feed supports video and 2-way audio, but requires that you have `ffmpeg` with `libfdk_aac` installed. A pre-built `ffmpeg` will be automatically installed on most platforms using `ffmpeg-for-homebridge`. See the [FFmpeg wiki](https://github.com/dgreif/ring/wiki/FFmpeg) for details. 2-way audio may not work for ONVIF cameras.
|
|
108
110
|
- Motion Sensor
|
|
109
111
|
- Can be hidden with `hideCameraMotionSensor`
|
|
110
112
|
- Light (if camera is equipped)
|
package/lib/base-accessory.js
CHANGED
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const _hap = require("./hap");
|
|
10
|
-
const _operators = require("rxjs/operators");
|
|
11
|
-
const _rxjs = require("rxjs");
|
|
12
|
-
const _config = require("./config");
|
|
13
|
-
const _homebridge = require("homebridge");
|
|
14
|
-
const _util = require("ring-client-api/util");
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseAccessory = void 0;
|
|
4
|
+
const hap_1 = require("./hap");
|
|
5
|
+
const operators_1 = require("rxjs/operators");
|
|
6
|
+
const rxjs_1 = require("rxjs");
|
|
7
|
+
const config_1 = require("./config");
|
|
8
|
+
const util_1 = require("ring-client-api/util");
|
|
15
9
|
function isServiceInstance(serviceType) {
|
|
16
10
|
return typeof serviceType === 'object';
|
|
17
11
|
}
|
|
18
12
|
class BaseAccessory {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.servicesInUse = [];
|
|
15
|
+
}
|
|
19
16
|
initBase() {
|
|
20
17
|
this.pruneUnusedServices();
|
|
21
18
|
}
|
|
@@ -23,11 +20,16 @@ class BaseAccessory {
|
|
|
23
20
|
if (isServiceInstance(serviceType)) {
|
|
24
21
|
return serviceType;
|
|
25
22
|
}
|
|
26
|
-
if (
|
|
23
|
+
if (config_1.debug) {
|
|
27
24
|
name = 'TEST ' + name;
|
|
28
25
|
}
|
|
29
|
-
const existingService = subType
|
|
30
|
-
|
|
26
|
+
const existingService = subType
|
|
27
|
+
? this.accessory.getServiceById(serviceType, subType)
|
|
28
|
+
: this.accessory.getService(serviceType), service = existingService || this.accessory.addService(serviceType, name, subType);
|
|
29
|
+
if (config_1.debug &&
|
|
30
|
+
existingService &&
|
|
31
|
+
existingService.displayName &&
|
|
32
|
+
name !== existingService.displayName) {
|
|
31
33
|
throw new Error(`Overlapping services for device ${this.device.name} - ${name} != ${existingService.displayName} - ${serviceType}`);
|
|
32
34
|
}
|
|
33
35
|
if (!this.servicesInUse.includes(service)) {
|
|
@@ -35,30 +37,31 @@ class BaseAccessory {
|
|
|
35
37
|
}
|
|
36
38
|
return service;
|
|
37
39
|
}
|
|
38
|
-
registerObservableCharacteristic({ characteristicType
|
|
39
|
-
const service = this.getService(serviceType, name, serviceSubType), characteristic = service.getCharacteristic(characteristicType), onCachedValue = onValue.pipe((0,
|
|
40
|
-
onCachedValue.subscribe((value)=>{
|
|
40
|
+
registerObservableCharacteristic({ characteristicType, serviceType, serviceSubType, onValue, setValue, name, requestUpdate, }) {
|
|
41
|
+
const service = this.getService(serviceType, name, serviceSubType), characteristic = service.getCharacteristic(characteristicType), onCachedValue = onValue.pipe((0, operators_1.shareReplay)(1));
|
|
42
|
+
onCachedValue.subscribe((value) => {
|
|
41
43
|
characteristic.updateValue(value);
|
|
42
44
|
});
|
|
43
45
|
if (requestUpdate) {
|
|
44
46
|
// Only register for GET if an async request should be made to get an updated value
|
|
45
|
-
onCachedValue.pipe((0,
|
|
47
|
+
onCachedValue.pipe((0, operators_1.take)(1)).subscribe(() => {
|
|
46
48
|
// allow GET once a value is cached
|
|
47
|
-
characteristic.on(
|
|
49
|
+
characteristic.on("get" /* CharacteristicEventTypes.GET */, async (callback) => {
|
|
48
50
|
try {
|
|
49
|
-
const value = await (0,
|
|
51
|
+
const value = await (0, rxjs_1.firstValueFrom)(onCachedValue);
|
|
50
52
|
callback(null, value);
|
|
51
53
|
requestUpdate();
|
|
52
|
-
}
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
53
56
|
callback(e);
|
|
54
57
|
}
|
|
55
58
|
});
|
|
56
59
|
});
|
|
57
60
|
}
|
|
58
61
|
if (setValue) {
|
|
59
|
-
characteristic.on(
|
|
60
|
-
Promise.resolve(setValue(newValue)).catch((e)=>{
|
|
61
|
-
(0,
|
|
62
|
+
characteristic.on("set" /* CharacteristicEventTypes.SET */, (newValue, callback) => {
|
|
63
|
+
Promise.resolve(setValue(newValue)).catch((e) => {
|
|
64
|
+
(0, util_1.logError)(e);
|
|
62
65
|
});
|
|
63
66
|
callback();
|
|
64
67
|
});
|
|
@@ -66,17 +69,16 @@ class BaseAccessory {
|
|
|
66
69
|
}
|
|
67
70
|
pruneUnusedServices() {
|
|
68
71
|
const safeServiceUUIDs = [
|
|
69
|
-
|
|
70
|
-
|
|
72
|
+
hap_1.hap.Service.CameraRTPStreamManagement.UUID,
|
|
73
|
+
hap_1.hap.Service.CameraControl.UUID,
|
|
71
74
|
];
|
|
72
|
-
this.accessory.services.forEach((service)=>{
|
|
73
|
-
if (!this.servicesInUse.includes(service) &&
|
|
74
|
-
|
|
75
|
+
this.accessory.services.forEach((service) => {
|
|
76
|
+
if (!this.servicesInUse.includes(service) &&
|
|
77
|
+
!safeServiceUUIDs.includes(service.UUID)) {
|
|
78
|
+
(0, util_1.logInfo)('Pruning unused service', service.UUID, service.displayName || service.name, 'from', this.device.name);
|
|
75
79
|
this.accessory.removeService(service);
|
|
76
80
|
}
|
|
77
81
|
});
|
|
78
82
|
}
|
|
79
|
-
constructor(){
|
|
80
|
-
this.servicesInUse = [];
|
|
81
|
-
}
|
|
82
83
|
}
|
|
84
|
+
exports.BaseAccessory = BaseAccessory;
|
|
@@ -1,64 +1,64 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const _operators = require("rxjs/operators");
|
|
12
|
-
const _homebridge = require("homebridge");
|
|
13
|
-
const _util = require("ring-client-api/util");
|
|
14
|
-
class BaseDataAccessory extends _baseAccessory.BaseAccessory {
|
|
15
|
-
registerCharacteristic({ characteristicType , serviceType , getValue , setValue , setValueDebounceTime =0 , name , requestUpdate , serviceSubType }) {
|
|
16
|
-
const service = this.getService(serviceType, name, serviceSubType), characteristic = service.getCharacteristic(characteristicType), { device } = this;
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseDataAccessory = void 0;
|
|
4
|
+
const base_accessory_1 = require("./base-accessory");
|
|
5
|
+
const rxjs_1 = require("rxjs");
|
|
6
|
+
const operators_1 = require("rxjs/operators");
|
|
7
|
+
const util_1 = require("ring-client-api/util");
|
|
8
|
+
class BaseDataAccessory extends base_accessory_1.BaseAccessory {
|
|
9
|
+
registerCharacteristic({ characteristicType, serviceType, getValue, setValue, setValueDebounceTime = 0, name, requestUpdate, serviceSubType, }) {
|
|
10
|
+
const service = this.getService(serviceType, name, serviceSubType), characteristic = service.getCharacteristic(characteristicType), { device } = this;
|
|
17
11
|
if (requestUpdate) {
|
|
18
12
|
// Only register for GET if an async request should be made to get an updated value
|
|
19
|
-
characteristic.on(
|
|
13
|
+
characteristic.on("get" /* CharacteristicEventTypes.GET */, (callback) => {
|
|
20
14
|
try {
|
|
21
15
|
const value = getValue(device.data);
|
|
22
16
|
callback(null, value);
|
|
23
17
|
requestUpdate();
|
|
24
|
-
}
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
25
20
|
callback(e);
|
|
26
21
|
}
|
|
27
22
|
});
|
|
28
23
|
}
|
|
29
24
|
if (setValue && setValueDebounceTime) {
|
|
30
|
-
const onValueToSet = new
|
|
31
|
-
characteristic.on(
|
|
25
|
+
const onValueToSet = new rxjs_1.Subject();
|
|
26
|
+
characteristic.on("set" /* CharacteristicEventTypes.SET */, (newValue, callback) => {
|
|
32
27
|
onValueToSet.next(newValue);
|
|
33
28
|
callback();
|
|
34
29
|
});
|
|
35
|
-
onValueToSet.pipe((0,
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
30
|
+
onValueToSet.pipe((0, operators_1.debounceTime)(setValueDebounceTime)).subscribe(setValue);
|
|
31
|
+
}
|
|
32
|
+
else if (setValue) {
|
|
33
|
+
characteristic.on("set" /* CharacteristicEventTypes.SET */, (newValue, callback) => {
|
|
34
|
+
Promise.resolve(setValue(newValue)).catch(util_1.logError);
|
|
39
35
|
callback();
|
|
40
36
|
});
|
|
41
37
|
}
|
|
42
|
-
|
|
38
|
+
;
|
|
39
|
+
this.device.onData
|
|
40
|
+
.pipe((0, operators_1.map)(getValue), (0, operators_1.distinctUntilChanged)())
|
|
41
|
+
.subscribe((value) => characteristic.updateValue(value));
|
|
43
42
|
}
|
|
44
|
-
registerLevelCharacteristic({ characteristicType
|
|
43
|
+
registerLevelCharacteristic({ characteristicType, serviceType, getValue, setValue, requestUpdate, }) {
|
|
45
44
|
let targetLevel;
|
|
46
45
|
this.registerCharacteristic({
|
|
47
46
|
characteristicType,
|
|
48
47
|
serviceType,
|
|
49
|
-
getValue: (data)=>{
|
|
48
|
+
getValue: (data) => {
|
|
50
49
|
const newLevel = getValue(data);
|
|
51
50
|
if (newLevel === targetLevel) {
|
|
52
51
|
targetLevel = undefined;
|
|
53
52
|
}
|
|
54
53
|
return targetLevel === undefined ? newLevel : targetLevel;
|
|
55
54
|
},
|
|
56
|
-
setValue: (level)=>{
|
|
55
|
+
setValue: (level) => {
|
|
57
56
|
targetLevel = level;
|
|
58
57
|
setValue(level);
|
|
59
58
|
},
|
|
60
59
|
setValueDebounceTime: 500,
|
|
61
|
-
requestUpdate
|
|
60
|
+
requestUpdate,
|
|
62
61
|
});
|
|
63
62
|
}
|
|
64
63
|
}
|
|
64
|
+
exports.BaseDataAccessory = BaseDataAccessory;
|
|
@@ -1,30 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
get: ()=>BaseDeviceAccessory
|
|
8
|
-
});
|
|
9
|
-
const _hap = require("./hap");
|
|
10
|
-
const _baseDataAccessory = require("./base-data-accessory");
|
|
11
|
-
function getBatteryLevel({ batteryLevel , batteryStatus }) {
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseDeviceAccessory = void 0;
|
|
4
|
+
const hap_1 = require("./hap");
|
|
5
|
+
const base_data_accessory_1 = require("./base-data-accessory");
|
|
6
|
+
function getBatteryLevel({ batteryLevel, batteryStatus }) {
|
|
12
7
|
if (batteryLevel !== undefined) {
|
|
13
8
|
return batteryLevel;
|
|
14
|
-
}
|
|
9
|
+
}
|
|
10
|
+
else if (batteryStatus === 'full' || batteryStatus === 'charged') {
|
|
15
11
|
return 100;
|
|
16
|
-
}
|
|
12
|
+
}
|
|
13
|
+
else if (batteryStatus === 'ok' || batteryStatus === 'charging') {
|
|
17
14
|
return 50;
|
|
18
15
|
}
|
|
19
16
|
return 0;
|
|
20
17
|
}
|
|
21
18
|
function getStatusLowBattery(data) {
|
|
22
|
-
const { StatusLowBattery
|
|
23
|
-
return batteryLevel > 20
|
|
19
|
+
const { StatusLowBattery } = hap_1.hap.Characteristic, batteryLevel = getBatteryLevel(data);
|
|
20
|
+
return batteryLevel > 20
|
|
21
|
+
? StatusLowBattery.BATTERY_LEVEL_NORMAL
|
|
22
|
+
: StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
24
23
|
}
|
|
25
|
-
function getBatteryChargingState({ batteryStatus
|
|
26
|
-
const { ChargingState
|
|
27
|
-
if (batteryStatus === 'charging' ||
|
|
24
|
+
function getBatteryChargingState({ batteryStatus, batteryBackup, acStatus, }) {
|
|
25
|
+
const { ChargingState } = hap_1.hap.Characteristic;
|
|
26
|
+
if (batteryStatus === 'charging' ||
|
|
27
|
+
batteryStatus === 'charged' ||
|
|
28
|
+
batteryBackup === 'charged' ||
|
|
29
|
+
batteryBackup === 'charging' ||
|
|
30
|
+
acStatus === 'ok') {
|
|
28
31
|
return ChargingState.CHARGING;
|
|
29
32
|
}
|
|
30
33
|
if (batteryBackup === 'inUse' || acStatus === 'error') {
|
|
@@ -32,76 +35,79 @@ function getBatteryChargingState({ batteryStatus , batteryBackup , acStatus })
|
|
|
32
35
|
}
|
|
33
36
|
return ChargingState.NOT_CHARGEABLE;
|
|
34
37
|
}
|
|
35
|
-
function hasBatteryStatus({ batteryStatus
|
|
38
|
+
function hasBatteryStatus({ batteryStatus }) {
|
|
36
39
|
return batteryStatus !== 'none';
|
|
37
40
|
}
|
|
38
|
-
class BaseDeviceAccessory extends
|
|
41
|
+
class BaseDeviceAccessory extends base_data_accessory_1.BaseDataAccessory {
|
|
39
42
|
initBase() {
|
|
40
|
-
const { device: { data: initialData
|
|
43
|
+
const { device: { data: initialData }, device, } = this, { Characteristic, Service } = hap_1.hap;
|
|
41
44
|
this.registerCharacteristic({
|
|
42
45
|
characteristicType: Characteristic.Manufacturer,
|
|
43
46
|
serviceType: Service.AccessoryInformation,
|
|
44
|
-
getValue: (data)=>data.manufacturerName || 'Ring'
|
|
47
|
+
getValue: (data) => data.manufacturerName || 'Ring',
|
|
45
48
|
});
|
|
46
49
|
this.registerCharacteristic({
|
|
47
50
|
characteristicType: Characteristic.Model,
|
|
48
51
|
serviceType: Service.AccessoryInformation,
|
|
49
|
-
getValue: (data)=>data.deviceType
|
|
52
|
+
getValue: (data) => data.deviceType,
|
|
50
53
|
});
|
|
51
54
|
this.registerCharacteristic({
|
|
52
55
|
characteristicType: Characteristic.SerialNumber,
|
|
53
56
|
serviceType: Service.AccessoryInformation,
|
|
54
|
-
getValue: (data)=>data.serialNumber || 'Unknown'
|
|
57
|
+
getValue: (data) => data.serialNumber || 'Unknown',
|
|
55
58
|
});
|
|
56
59
|
if ('volume' in initialData && 'setVolume' in device) {
|
|
57
60
|
this.registerCharacteristic({
|
|
58
61
|
characteristicType: Characteristic.Mute,
|
|
59
62
|
serviceType: Service.Speaker,
|
|
60
|
-
getValue: ()=>false
|
|
63
|
+
getValue: () => false,
|
|
61
64
|
});
|
|
62
65
|
this.registerLevelCharacteristic({
|
|
63
66
|
characteristicType: Characteristic.Volume,
|
|
64
67
|
serviceType: Service.Speaker,
|
|
65
|
-
getValue: (data)=>{
|
|
68
|
+
getValue: (data) => {
|
|
66
69
|
return data.volume ? data.volume * 100 : 0;
|
|
67
70
|
},
|
|
68
|
-
setValue: (volume)=>device.setVolume(volume / 100)
|
|
71
|
+
setValue: (volume) => device.setVolume(volume / 100),
|
|
69
72
|
});
|
|
70
73
|
}
|
|
71
74
|
if (hasBatteryStatus(initialData)) {
|
|
72
75
|
this.registerCharacteristic({
|
|
73
76
|
characteristicType: Characteristic.BatteryLevel,
|
|
74
77
|
serviceType: Service.BatteryService,
|
|
75
|
-
getValue: getBatteryLevel
|
|
78
|
+
getValue: getBatteryLevel,
|
|
76
79
|
});
|
|
77
80
|
this.registerCharacteristic({
|
|
78
81
|
characteristicType: Characteristic.StatusLowBattery,
|
|
79
82
|
serviceType: Service.BatteryService,
|
|
80
|
-
getValue: getStatusLowBattery
|
|
83
|
+
getValue: getStatusLowBattery,
|
|
81
84
|
});
|
|
82
85
|
this.registerCharacteristic({
|
|
83
86
|
characteristicType: Characteristic.ChargingState,
|
|
84
87
|
serviceType: Service.BatteryService,
|
|
85
|
-
getValue: getBatteryChargingState
|
|
88
|
+
getValue: getBatteryChargingState,
|
|
86
89
|
});
|
|
87
90
|
}
|
|
88
91
|
super.initBase();
|
|
89
92
|
}
|
|
90
93
|
initSensorService(serviceType) {
|
|
91
|
-
const { Characteristic
|
|
94
|
+
const { Characteristic } = hap_1.hap;
|
|
92
95
|
this.registerCharacteristic({
|
|
93
96
|
characteristicType: Characteristic.StatusTampered,
|
|
94
97
|
serviceType,
|
|
95
|
-
getValue: (data)=>{
|
|
96
|
-
return data.tamperStatus === 'ok'
|
|
97
|
-
|
|
98
|
+
getValue: (data) => {
|
|
99
|
+
return data.tamperStatus === 'ok'
|
|
100
|
+
? Characteristic.StatusTampered.NOT_TAMPERED
|
|
101
|
+
: Characteristic.StatusTampered.TAMPERED;
|
|
102
|
+
},
|
|
98
103
|
});
|
|
99
104
|
if (hasBatteryStatus(this.device.data)) {
|
|
100
105
|
this.registerCharacteristic({
|
|
101
106
|
characteristicType: Characteristic.StatusLowBattery,
|
|
102
107
|
serviceType,
|
|
103
|
-
getValue: (data)=>getStatusLowBattery(data)
|
|
108
|
+
getValue: (data) => getStatusLowBattery(data),
|
|
104
109
|
});
|
|
105
110
|
}
|
|
106
111
|
}
|
|
107
112
|
}
|
|
113
|
+
exports.BaseDeviceAccessory = BaseDeviceAccessory;
|
package/lib/beam.js
CHANGED
|
@@ -1,74 +1,64 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const _hap = require("./hap");
|
|
11
|
-
const _baseDeviceAccessory = require("./base-device-accessory");
|
|
12
|
-
const _util = require("ring-client-api/util");
|
|
13
|
-
class Beam extends _baseDeviceAccessory.BaseDeviceAccessory {
|
|
14
|
-
setOnState(on) {
|
|
15
|
-
(0, _util.logInfo)(`Turning ${this.device.name} ${on ? 'On' : 'Off'}`);
|
|
16
|
-
const { beamDurationSeconds } = this.config, duration = beamDurationSeconds ? Math.min(beamDurationSeconds, 32767) : undefined;
|
|
17
|
-
if (this.isLightGroup && this.groupId) {
|
|
18
|
-
return this.device.location.setLightGroup(this.groupId, on, duration);
|
|
19
|
-
}
|
|
20
|
-
const data = on ? {
|
|
21
|
-
lightMode: 'on',
|
|
22
|
-
duration
|
|
23
|
-
} : {
|
|
24
|
-
lightMode: 'default'
|
|
25
|
-
};
|
|
26
|
-
return this.device.sendCommand('light-mode.set', data);
|
|
27
|
-
}
|
|
28
|
-
setLevelState(level) {
|
|
29
|
-
(0, _util.logInfo)(`Setting brightness of ${this.device.name} to ${level}%`);
|
|
30
|
-
return this.device.setInfo({
|
|
31
|
-
device: {
|
|
32
|
-
v1: {
|
|
33
|
-
level: level / 100
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
constructor(device, accessory, config){
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Beam = void 0;
|
|
4
|
+
const ring_client_api_1 = require("ring-client-api");
|
|
5
|
+
const hap_1 = require("./hap");
|
|
6
|
+
const base_device_accessory_1 = require("./base-device-accessory");
|
|
7
|
+
const util_1 = require("ring-client-api/util");
|
|
8
|
+
class Beam extends base_device_accessory_1.BaseDeviceAccessory {
|
|
9
|
+
constructor(device, accessory, config) {
|
|
39
10
|
super();
|
|
40
11
|
this.device = device;
|
|
41
12
|
this.accessory = accessory;
|
|
42
13
|
this.config = config;
|
|
43
|
-
this.isLightGroup = this.device.data.deviceType ===
|
|
14
|
+
this.isLightGroup = this.device.data.deviceType === ring_client_api_1.RingDeviceType.BeamsLightGroupSwitch;
|
|
44
15
|
this.groupId = this.device.data.groupId;
|
|
45
|
-
const { Characteristic
|
|
46
|
-
if (deviceType !==
|
|
16
|
+
const { Characteristic, Service } = hap_1.hap, { MotionSensor } = Service, { data: { deviceType }, } = this.device;
|
|
17
|
+
if (deviceType !== ring_client_api_1.RingDeviceType.BeamsMotionSensor) {
|
|
47
18
|
this.registerCharacteristic({
|
|
48
19
|
characteristicType: Characteristic.On,
|
|
49
20
|
serviceType: Service.Lightbulb,
|
|
50
|
-
getValue: (data)=>Boolean(data.on),
|
|
51
|
-
setValue: (value)=>this.setOnState(value)
|
|
21
|
+
getValue: (data) => Boolean(data.on),
|
|
22
|
+
setValue: (value) => this.setOnState(value),
|
|
52
23
|
});
|
|
53
24
|
this.getService(Service.Lightbulb).setPrimaryService(true);
|
|
54
25
|
}
|
|
55
|
-
if (deviceType ===
|
|
26
|
+
if (deviceType === ring_client_api_1.RingDeviceType.BeamsMultiLevelSwitch) {
|
|
56
27
|
this.registerLevelCharacteristic({
|
|
57
28
|
characteristicType: Characteristic.Brightness,
|
|
58
29
|
serviceType: Service.Lightbulb,
|
|
59
|
-
getValue: (data)=>{
|
|
30
|
+
getValue: (data) => {
|
|
60
31
|
return data.level && !isNaN(data.level) ? 100 * data.level : 0;
|
|
61
32
|
},
|
|
62
|
-
setValue: (value)=>this.setLevelState(value)
|
|
33
|
+
setValue: (value) => this.setLevelState(value),
|
|
63
34
|
});
|
|
64
35
|
}
|
|
65
|
-
if (device.data.motionStatus !== undefined &&
|
|
36
|
+
if (device.data.motionStatus !== undefined &&
|
|
37
|
+
device.data.motionSensorEnabled !== false) {
|
|
66
38
|
this.registerCharacteristic({
|
|
67
|
-
characteristicType:
|
|
39
|
+
characteristicType: hap_1.hap.Characteristic.MotionDetected,
|
|
68
40
|
serviceType: MotionSensor,
|
|
69
|
-
getValue: (data)=>data.motionStatus === 'faulted'
|
|
41
|
+
getValue: (data) => data.motionStatus === 'faulted',
|
|
70
42
|
});
|
|
71
43
|
this.initSensorService(MotionSensor);
|
|
72
44
|
}
|
|
73
45
|
}
|
|
46
|
+
setOnState(on) {
|
|
47
|
+
(0, util_1.logInfo)(`Turning ${this.device.name} ${on ? 'On' : 'Off'}`);
|
|
48
|
+
const { beamDurationSeconds } = this.config, duration = beamDurationSeconds
|
|
49
|
+
? Math.min(beamDurationSeconds, 32767)
|
|
50
|
+
: undefined;
|
|
51
|
+
if (this.isLightGroup && this.groupId) {
|
|
52
|
+
return this.device.location.setLightGroup(this.groupId, on, duration);
|
|
53
|
+
}
|
|
54
|
+
const data = on ? { lightMode: 'on', duration } : { lightMode: 'default' };
|
|
55
|
+
return this.device.sendCommand('light-mode.set', data);
|
|
56
|
+
}
|
|
57
|
+
setLevelState(level) {
|
|
58
|
+
(0, util_1.logInfo)(`Setting brightness of ${this.device.name} to ${level}%`);
|
|
59
|
+
return this.device.setInfo({
|
|
60
|
+
device: { v1: { level: level / 100 } },
|
|
61
|
+
});
|
|
62
|
+
}
|
|
74
63
|
}
|
|
64
|
+
exports.Beam = Beam;
|
package/lib/brightness-only.js
CHANGED
|
@@ -1,36 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const _baseDeviceAccessory = require("./base-device-accessory");
|
|
10
|
-
const _hap = require("./hap");
|
|
11
|
-
const _util = require("ring-client-api/util");
|
|
12
|
-
class BrightnessOnly extends _baseDeviceAccessory.BaseDeviceAccessory {
|
|
13
|
-
setLevelState(brightness) {
|
|
14
|
-
(0, _util.logInfo)(`Setting brightness of ${this.device.name} to ${brightness}%`);
|
|
15
|
-
return this.device.setInfo({
|
|
16
|
-
device: {
|
|
17
|
-
v1: {
|
|
18
|
-
brightness: brightness / 100
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
constructor(device, accessory, config){
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BrightnessOnly = void 0;
|
|
4
|
+
const base_device_accessory_1 = require("./base-device-accessory");
|
|
5
|
+
const hap_1 = require("./hap");
|
|
6
|
+
const util_1 = require("ring-client-api/util");
|
|
7
|
+
class BrightnessOnly extends base_device_accessory_1.BaseDeviceAccessory {
|
|
8
|
+
constructor(device, accessory, config) {
|
|
24
9
|
super();
|
|
25
10
|
this.device = device;
|
|
26
11
|
this.accessory = accessory;
|
|
27
12
|
this.config = config;
|
|
28
|
-
const { Characteristic
|
|
29
|
-
if (device.data.brightness !== undefined &&
|
|
13
|
+
const { Characteristic, Service } = hap_1.hap, { context } = accessory;
|
|
14
|
+
if (device.data.brightness !== undefined &&
|
|
15
|
+
!isNaN(device.data.brightness)) {
|
|
30
16
|
this.registerLevelCharacteristic({
|
|
31
17
|
characteristicType: Characteristic.Brightness,
|
|
32
18
|
serviceType: Service.Lightbulb,
|
|
33
|
-
getValue: (data)=>{
|
|
19
|
+
getValue: (data) => {
|
|
34
20
|
if (!data.brightness || isNaN(data.brightness)) {
|
|
35
21
|
return 0;
|
|
36
22
|
}
|
|
@@ -38,23 +24,30 @@ class BrightnessOnly extends _baseDeviceAccessory.BaseDeviceAccessory {
|
|
|
38
24
|
context.brightness = data.brightness * 100;
|
|
39
25
|
return context.brightness;
|
|
40
26
|
},
|
|
41
|
-
setValue: (brightness)=>{
|
|
27
|
+
setValue: (brightness) => {
|
|
42
28
|
if (brightness) {
|
|
43
29
|
context.brightness = brightness;
|
|
44
30
|
}
|
|
45
31
|
return this.setLevelState(brightness);
|
|
46
|
-
}
|
|
32
|
+
},
|
|
47
33
|
});
|
|
48
34
|
this.registerCharacteristic({
|
|
49
35
|
characteristicType: Characteristic.On,
|
|
50
36
|
serviceType: Service.Lightbulb,
|
|
51
|
-
getValue: (data)=>Boolean(data.brightness),
|
|
52
|
-
setValue: (on)=>{
|
|
37
|
+
getValue: (data) => Boolean(data.brightness),
|
|
38
|
+
setValue: (on) => {
|
|
53
39
|
const brightness = context.brightness || 100;
|
|
54
40
|
return this.setLevelState(on ? brightness : 0);
|
|
55
|
-
}
|
|
41
|
+
},
|
|
56
42
|
});
|
|
57
43
|
this.getService(Service.Lightbulb).setPrimaryService(true);
|
|
58
44
|
}
|
|
59
45
|
}
|
|
46
|
+
setLevelState(brightness) {
|
|
47
|
+
(0, util_1.logInfo)(`Setting brightness of ${this.device.name} to ${brightness}%`);
|
|
48
|
+
return this.device.setInfo({
|
|
49
|
+
device: { v1: { brightness: brightness / 100 } },
|
|
50
|
+
});
|
|
51
|
+
}
|
|
60
52
|
}
|
|
53
|
+
exports.BrightnessOnly = BrightnessOnly;
|