homebridge-smartthings-oauth 1.0.28 → 1.0.29
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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
All notable changes to this project will be documented in this file.
|
|
3
|
+
## [1.0.29] - Complete Samsung TV Experience & Reference Implementation Alignment
|
|
4
|
+
### Fixed
|
|
5
|
+
- **🚨 CRITICAL: Volume Slider Component Targeting**: Fixed volume slider targeting wrong device components (was controlling light sensor instead of TV audio)
|
|
6
|
+
- **Volume Slider Tile Placement**: Volume slider now appears within the same TV tile in HomeKit (not as separate accessory)
|
|
7
|
+
- **Direct API Calls**: Volume slider now uses direct SmartThings API calls to main TV component, ensuring reliable volume control
|
|
8
|
+
- **Component Confusion**: Added strict `componentId === 'main'` check to prevent volume slider creation on sensor components
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- **Volume Slider Architecture**: Simplified to work as a service within the same TV accessory (same HomeKit tile)
|
|
12
|
+
- **TelevisionSpeaker Conflicts**: When volume slider is enabled, TelevisionSpeaker completely disables volume controls to prevent conflicts
|
|
13
|
+
- **API Communication**: Volume slider bypasses internal component status and uses direct API calls for immediate responsiveness
|
|
3
14
|
## [1.0.28] - Complete Samsung TV Experience & Reference Implementation Alignment
|
|
4
15
|
### Fixed
|
|
5
16
|
- **🚨 CRITICAL: Volume Slider Component Targeting**: Fixed volume slider targeting wrong device components (was controlling light sensor instead of TV audio)
|
|
@@ -2,6 +2,7 @@ import { PlatformAccessory, Service } from 'homebridge';
|
|
|
2
2
|
import { BaseService } from './baseService';
|
|
3
3
|
import { MultiServiceAccessory } from '../multiServiceAccessory';
|
|
4
4
|
import { IKHomeBridgeHomebridgePlatform } from '../platform';
|
|
5
|
+
import { ShortEvent } from '../webhook/subscriptionHandler';
|
|
5
6
|
/**
|
|
6
7
|
* Volume Slider Service (Within Same TV Accessory)
|
|
7
8
|
* Creates a lightbulb service within the TV accessory for volume control.
|
|
@@ -42,6 +43,10 @@ export declare class VolumeSliderService extends BaseService {
|
|
|
42
43
|
* Check if the given capabilities support volume slider functionality
|
|
43
44
|
*/
|
|
44
45
|
static supportsVolumeSlider(capabilities: string[]): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Process webhook events for real-time updates
|
|
48
|
+
*/
|
|
49
|
+
processEvent(event: ShortEvent): void;
|
|
45
50
|
/**
|
|
46
51
|
* Cleanup method to stop polling when accessory is removed
|
|
47
52
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"volumeSliderService.d.ts","sourceRoot":"","sources":["../../src/services/volumeSliderService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,iBAAiB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"volumeSliderService.d.ts","sourceRoot":"","sources":["../../src/services/volumeSliderService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,iBAAiB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D;;;;;;;GAOG;AACH,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,YAAY,CAA6B;gBAG/C,QAAQ,EAAE,8BAA8B,EACxC,SAAS,EAAE,iBAAiB,EAC5B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EAAE,EACtB,qBAAqB,EAAE,qBAAqB,EAC5C,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,GAAG;IAgCnB,OAAO,CAAC,kBAAkB;IA4B1B;;;OAGG;YACW,KAAK;IAsBnB;;;OAGG;YACW,KAAK;IAuBnB;;OAEG;YACW,aAAa;IA4B3B;;OAEG;YACW,aAAa;IA0C3B;;OAEG;WACW,2BAA2B,IAAI,MAAM,EAAE;IAIrD;;OAEG;WACW,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO;IAInE;;OAEG;IACI,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAkB5C;;OAEG;IACI,OAAO,IAAI,IAAI;CAOvB"}
|
|
@@ -46,13 +46,14 @@ class VolumeSliderService extends baseService_1.BaseService {
|
|
|
46
46
|
this.pollInterval = setInterval(async () => {
|
|
47
47
|
try {
|
|
48
48
|
this.log.debug(`🔄 Volume slider polling for ${this.name}...`);
|
|
49
|
-
//
|
|
50
|
-
await this.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
// Use the proper status mechanism instead of direct API calls
|
|
50
|
+
if (await this.getStatus()) {
|
|
51
|
+
// Update characteristics from device status
|
|
52
|
+
const onValue = await this.getOn();
|
|
53
|
+
const brightnessValue = await this.getBrightness();
|
|
54
|
+
this.service.updateCharacteristic(this.platform.Characteristic.On, onValue);
|
|
55
|
+
this.service.updateCharacteristic(this.platform.Characteristic.Brightness, brightnessValue);
|
|
56
|
+
}
|
|
56
57
|
}
|
|
57
58
|
catch (error) {
|
|
58
59
|
this.log.debug(`Volume slider polling error for ${this.name}:`, error);
|
|
@@ -64,64 +65,50 @@ class VolumeSliderService extends baseService_1.BaseService {
|
|
|
64
65
|
* On = true means NOT muted, On = false means muted
|
|
65
66
|
*/
|
|
66
67
|
async getOn() {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
68
|
+
return new Promise((resolve) => {
|
|
69
|
+
this.getStatus().then(success => {
|
|
70
|
+
var _a, _b, _c, _d;
|
|
71
|
+
if (!success) {
|
|
72
|
+
this.log.debug(`Could not get status for mute check on ${this.name}`);
|
|
73
|
+
resolve(true); // Default to not muted if we can't get status
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
try {
|
|
77
|
+
// Get mute status from device status (main component)
|
|
78
|
+
const muteValue = (_d = (_c = (_b = (_a = this.deviceStatus.status) === null || _a === void 0 ? void 0 : _a.main) === null || _b === void 0 ? void 0 : _b.audioMute) === null || _c === void 0 ? void 0 : _c.mute) === null || _d === void 0 ? void 0 : _d.value;
|
|
79
|
+
const isNotMuted = muteValue !== 'muted';
|
|
80
|
+
this.log.debug(`Volume slider On state for ${this.name}: ${isNotMuted} (mute: ${muteValue}) from main component`);
|
|
81
|
+
resolve(isNotMuted);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
this.log.debug(`Error parsing mute status for ${this.name}:`, error);
|
|
85
|
+
resolve(true); // Default to not muted
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
});
|
|
80
90
|
}
|
|
81
91
|
/**
|
|
82
92
|
* Set On state (toggle mute)
|
|
83
93
|
* On = true means unmute, On = false means mute
|
|
84
94
|
*/
|
|
85
95
|
async setOn(value) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
this.log.debug(`Volume slider turning ON (unmuting) ${this.name}`);
|
|
90
|
-
await this.platform.axInstance.post(`devices/${this.accessory.context.device.deviceId}/commands`, {
|
|
91
|
-
commands: [{
|
|
92
|
-
component: 'main', // Always target main component
|
|
93
|
-
capability: 'audioMute',
|
|
94
|
-
command: 'unmute',
|
|
95
|
-
}],
|
|
96
|
-
});
|
|
97
|
-
this.log.info(`✅ Volume slider unmuted successfully for ${this.name}`);
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
// Turning off = mute
|
|
101
|
-
this.log.debug(`Volume slider turning OFF (muting) ${this.name}`);
|
|
102
|
-
await this.platform.axInstance.post(`devices/${this.accessory.context.device.deviceId}/commands`, {
|
|
103
|
-
commands: [{
|
|
104
|
-
component: 'main', // Always target main component
|
|
105
|
-
capability: 'audioMute',
|
|
106
|
-
command: 'mute',
|
|
107
|
-
}],
|
|
108
|
-
});
|
|
109
|
-
this.log.info(`✅ Volume slider muted successfully for ${this.name}`);
|
|
110
|
-
}
|
|
111
|
-
// Update our characteristics immediately with fresh API calls (bypass cached status)
|
|
112
|
-
setTimeout(async () => {
|
|
113
|
-
try {
|
|
114
|
-
this.log.debug(`🔄 Refreshing volume slider state after mute command for ${this.name}`);
|
|
115
|
-
const onValue = await this.getOn(); // This makes a fresh API call
|
|
116
|
-
this.service.updateCharacteristic(this.platform.Characteristic.On, onValue);
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
this.log.debug(`Status refresh after mute toggle failed for ${this.name}:`, error);
|
|
120
|
-
}
|
|
121
|
-
}, 2000); // Allow time for SmartThings to process the command
|
|
96
|
+
if (!this.multiServiceAccessory.isOnline()) {
|
|
97
|
+
this.log.error(`${this.name} is offline`);
|
|
98
|
+
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
122
99
|
}
|
|
123
|
-
|
|
124
|
-
|
|
100
|
+
const command = value ? 'unmute' : 'mute';
|
|
101
|
+
this.log.debug(`Volume slider turning ${value ? 'ON (unmuting)' : 'OFF (muting)'} ${this.name}`);
|
|
102
|
+
const success = await this.multiServiceAccessory.sendCommand('audioMute', command);
|
|
103
|
+
if (success) {
|
|
104
|
+
this.log.info(`✅ Volume slider ${command}d successfully for ${this.name}`);
|
|
105
|
+
// Force a status refresh after a delay to get updated values
|
|
106
|
+
setTimeout(() => {
|
|
107
|
+
this.multiServiceAccessory.forceNextStatusRefresh();
|
|
108
|
+
}, 1000);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
this.log.error(`❌ Failed to ${command} volume slider for ${this.name}`);
|
|
125
112
|
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
126
113
|
}
|
|
127
114
|
}
|
|
@@ -129,80 +116,73 @@ class VolumeSliderService extends baseService_1.BaseService {
|
|
|
129
116
|
* Get Brightness (represents volume level 0-100)
|
|
130
117
|
*/
|
|
131
118
|
async getBrightness() {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
119
|
+
return new Promise((resolve) => {
|
|
120
|
+
this.getStatus().then(success => {
|
|
121
|
+
var _a, _b, _c, _d;
|
|
122
|
+
if (!success) {
|
|
123
|
+
this.log.debug(`Could not get status for volume check on ${this.name}`);
|
|
124
|
+
resolve(0); // Default to 0 volume if we can't get status
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
try {
|
|
128
|
+
// Get volume from device status (main component)
|
|
129
|
+
const volume = (_d = (_c = (_b = (_a = this.deviceStatus.status) === null || _a === void 0 ? void 0 : _a.main) === null || _b === void 0 ? void 0 : _b.audioVolume) === null || _c === void 0 ? void 0 : _c.volume) === null || _d === void 0 ? void 0 : _d.value;
|
|
130
|
+
if (typeof volume === 'number') {
|
|
131
|
+
const boundedVolume = Math.max(0, Math.min(100, volume)); // Bound between 0-100
|
|
132
|
+
this.log.debug(`Volume slider brightness for ${this.name}: ${boundedVolume}% (from main component)`);
|
|
133
|
+
resolve(boundedVolume);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
this.log.warn(`⚠️ No audioVolume data in main component for ${this.name}`);
|
|
137
|
+
resolve(0);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
this.log.debug(`Error parsing volume status for ${this.name}:`, error);
|
|
142
|
+
resolve(0); // Default to 0 volume
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
});
|
|
151
147
|
}
|
|
152
148
|
/**
|
|
153
149
|
* Set Brightness (set volume level 0-100)
|
|
154
150
|
*/
|
|
155
151
|
async setBrightness(value) {
|
|
156
|
-
var _a, _b;
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
this.
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
}],
|
|
168
|
-
});
|
|
152
|
+
var _a, _b, _c, _d;
|
|
153
|
+
if (!this.multiServiceAccessory.isOnline()) {
|
|
154
|
+
this.log.error(`${this.name} is offline`);
|
|
155
|
+
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
156
|
+
}
|
|
157
|
+
const volume = Math.max(0, Math.min(100, value)); // Bound between 0-100
|
|
158
|
+
this.log.debug(`Volume slider setting brightness to ${volume}% for ${this.name}`);
|
|
159
|
+
// Set volume using proper command mechanism
|
|
160
|
+
const success = await this.multiServiceAccessory.sendCommand('audioVolume', 'setVolume', [volume]);
|
|
161
|
+
if (success) {
|
|
162
|
+
this.log.info(`✅ Volume slider set successfully to ${volume}% for ${this.name}`);
|
|
169
163
|
// If setting volume above 0 and TV is muted, automatically unmute
|
|
170
164
|
if (volume > 0) {
|
|
171
165
|
try {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
capability: 'audioMute',
|
|
180
|
-
command: 'unmute',
|
|
181
|
-
}],
|
|
182
|
-
});
|
|
166
|
+
// Check current mute status from device status
|
|
167
|
+
if (await this.getStatus()) {
|
|
168
|
+
const muteValue = (_d = (_c = (_b = (_a = this.deviceStatus.status) === null || _a === void 0 ? void 0 : _a.main) === null || _b === void 0 ? void 0 : _b.audioMute) === null || _c === void 0 ? void 0 : _c.mute) === null || _d === void 0 ? void 0 : _d.value;
|
|
169
|
+
if (muteValue === 'muted') {
|
|
170
|
+
this.log.debug(`Auto-unmuting ${this.name} because volume was set to ${volume}%`);
|
|
171
|
+
await this.multiServiceAccessory.sendCommand('audioMute', 'unmute');
|
|
172
|
+
}
|
|
183
173
|
}
|
|
184
174
|
}
|
|
185
175
|
catch (error) {
|
|
186
176
|
this.log.debug(`Could not check/set mute state during volume change for ${this.name}:`, error);
|
|
187
177
|
}
|
|
188
178
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
this.log.debug(`🔄 Refreshing volume slider state after volume command for ${this.name}`);
|
|
194
|
-
const brightnessValue = await this.getBrightness(); // This makes a fresh API call
|
|
195
|
-
const onValue = await this.getOn(); // This makes a fresh API call
|
|
196
|
-
this.service.updateCharacteristic(this.platform.Characteristic.Brightness, brightnessValue);
|
|
197
|
-
this.service.updateCharacteristic(this.platform.Characteristic.On, onValue);
|
|
198
|
-
}
|
|
199
|
-
catch (error) {
|
|
200
|
-
this.log.debug(`Status refresh after volume change failed for ${this.name}:`, error);
|
|
201
|
-
}
|
|
202
|
-
}, 2000); // Allow time for SmartThings to process the command
|
|
179
|
+
// Force a status refresh after a delay to get updated values
|
|
180
|
+
setTimeout(() => {
|
|
181
|
+
this.multiServiceAccessory.forceNextStatusRefresh();
|
|
182
|
+
}, 1000);
|
|
203
183
|
}
|
|
204
|
-
|
|
205
|
-
this.log.error(`❌ Failed to set volume for slider ${this.name}
|
|
184
|
+
else {
|
|
185
|
+
this.log.error(`❌ Failed to set volume for slider ${this.name}`);
|
|
206
186
|
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
207
187
|
}
|
|
208
188
|
}
|
|
@@ -218,6 +198,27 @@ class VolumeSliderService extends baseService_1.BaseService {
|
|
|
218
198
|
static supportsVolumeSlider(capabilities) {
|
|
219
199
|
return capabilities.includes('audioVolume') || capabilities.includes('audioMute');
|
|
220
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* Process webhook events for real-time updates
|
|
203
|
+
*/
|
|
204
|
+
processEvent(event) {
|
|
205
|
+
this.log.debug(`Volume slider received event for ${this.name}: ${event.capability}.${event.attribute} = ${event.value}`);
|
|
206
|
+
try {
|
|
207
|
+
if (event.capability === 'audioMute' && event.attribute === 'mute') {
|
|
208
|
+
const isNotMuted = event.value !== 'muted';
|
|
209
|
+
this.service.updateCharacteristic(this.platform.Characteristic.On, isNotMuted);
|
|
210
|
+
this.log.debug(`Volume slider mute state updated via webhook for ${this.name}: ${isNotMuted}`);
|
|
211
|
+
}
|
|
212
|
+
else if (event.capability === 'audioVolume' && event.attribute === 'volume') {
|
|
213
|
+
const volume = Math.max(0, Math.min(100, Number(event.value) || 0));
|
|
214
|
+
this.service.updateCharacteristic(this.platform.Characteristic.Brightness, volume);
|
|
215
|
+
this.log.debug(`Volume slider volume updated via webhook for ${this.name}: ${volume}%`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
this.log.debug(`Error processing event for volume slider ${this.name}:`, error);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
221
222
|
/**
|
|
222
223
|
* Cleanup method to stop polling when accessory is removed
|
|
223
224
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"volumeSliderService.js","sourceRoot":"","sources":["../../src/services/volumeSliderService.ts"],"names":[],"mappings":";;;AACA,+CAA4C;
|
|
1
|
+
{"version":3,"file":"volumeSliderService.js","sourceRoot":"","sources":["../../src/services/volumeSliderService.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"private": false,
|
|
3
3
|
"displayName": "Homebridge Smartthings oAuth Plugin",
|
|
4
4
|
"name": "homebridge-smartthings-oauth",
|
|
5
|
-
"version": "1.0.
|
|
5
|
+
"version": "1.0.29",
|
|
6
6
|
"description": "Connects SmartThings devices to Homebridge. Automatically discovers devices.",
|
|
7
7
|
"license": "Apache-2.0",
|
|
8
8
|
"repository": {
|