@switchbot/homebridge-switchbot 5.0.0-beta.3 → 5.0.0-beta.31
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 +13 -0
- package/README.md +23 -3
- package/config.schema.json +70 -4
- package/dist/devices-hap/device.d.ts +1 -0
- package/dist/devices-hap/device.d.ts.map +1 -1
- package/dist/devices-hap/device.js +70 -30
- package/dist/devices-hap/device.js.map +1 -1
- package/dist/devices-matter/BaseMatterAccessory.d.ts +23 -0
- package/dist/devices-matter/BaseMatterAccessory.d.ts.map +1 -1
- package/dist/devices-matter/BaseMatterAccessory.js +167 -5
- package/dist/devices-matter/BaseMatterAccessory.js.map +1 -1
- package/dist/devices-matter/ColorLightAccessory.d.ts.map +1 -1
- package/dist/devices-matter/ColorLightAccessory.js +12 -12
- package/dist/devices-matter/ColorLightAccessory.js.map +1 -1
- package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts.map +1 -1
- package/dist/devices-matter/ColorTemperatureLightAccessory.js +5 -7
- package/dist/devices-matter/ColorTemperatureLightAccessory.js.map +1 -1
- package/dist/devices-matter/DimmableLightAccessory.js +9 -9
- package/dist/devices-matter/DimmableLightAccessory.js.map +1 -1
- package/dist/devices-matter/ExtendedColorLightAccessory.d.ts.map +1 -1
- package/dist/devices-matter/ExtendedColorLightAccessory.js +14 -15
- package/dist/devices-matter/ExtendedColorLightAccessory.js.map +1 -1
- package/dist/devices-matter/OnOffLightAccessory.d.ts.map +1 -1
- package/dist/devices-matter/OnOffLightAccessory.js +8 -16
- package/dist/devices-matter/OnOffLightAccessory.js.map +1 -1
- package/dist/devices-matter/OnOffOutletAccessory.d.ts +2 -0
- package/dist/devices-matter/OnOffOutletAccessory.d.ts.map +1 -1
- package/dist/devices-matter/OnOffOutletAccessory.js +10 -7
- package/dist/devices-matter/OnOffOutletAccessory.js.map +1 -1
- package/dist/devices-matter/OnOffSwitchAccessory.js +2 -2
- package/dist/devices-matter/OnOffSwitchAccessory.js.map +1 -1
- package/dist/homebridge-ui/public/index.html +48 -1
- package/dist/homebridge-ui/server.js +35 -0
- package/dist/homebridge-ui/server.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -5
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +7 -2
- package/dist/index.test.js.map +1 -1
- package/dist/irdevice/irdevice.d.ts +11 -10
- package/dist/irdevice/irdevice.d.ts.map +1 -1
- package/dist/irdevice/irdevice.js +76 -35
- package/dist/irdevice/irdevice.js.map +1 -1
- package/dist/platform-hap.d.ts +11 -14
- package/dist/platform-hap.d.ts.map +1 -1
- package/dist/platform-hap.js +64 -64
- package/dist/platform-hap.js.map +1 -1
- package/dist/platform-matter.d.ts +87 -6
- package/dist/platform-matter.d.ts.map +1 -1
- package/dist/platform-matter.js +1845 -84
- package/dist/platform-matter.js.map +1 -1
- package/dist/settings.d.ts +11 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js.map +1 -1
- package/dist/test/hap/platform-hap.logging.test.d.ts +2 -0
- package/dist/test/hap/platform-hap.logging.test.d.ts.map +1 -0
- package/dist/test/hap/platform-hap.logging.test.js +33 -0
- package/dist/test/hap/platform-hap.logging.test.js.map +1 -0
- package/dist/test/hap/platform-hap.test.d.ts +2 -0
- package/dist/test/hap/platform-hap.test.d.ts.map +1 -0
- package/dist/test/hap/platform-hap.test.js +62 -0
- package/dist/test/hap/platform-hap.test.js.map +1 -0
- package/dist/test/helpers/platform-fixtures.d.ts +9 -0
- package/dist/test/helpers/platform-fixtures.d.ts.map +1 -0
- package/dist/test/helpers/platform-fixtures.js +30 -0
- package/dist/test/helpers/platform-fixtures.js.map +1 -0
- package/dist/test/matter/devices-matter/baseMatterAccessory.test.d.ts +2 -0
- package/dist/test/matter/devices-matter/baseMatterAccessory.test.d.ts.map +1 -0
- package/dist/test/matter/devices-matter/baseMatterAccessory.test.js +71 -0
- package/dist/test/matter/devices-matter/baseMatterAccessory.test.js.map +1 -0
- package/dist/test/matter/platform-matter.additional.test.d.ts +2 -0
- package/dist/test/matter/platform-matter.additional.test.d.ts.map +1 -0
- package/dist/test/matter/platform-matter.additional.test.js +35 -0
- package/dist/test/matter/platform-matter.additional.test.js.map +1 -0
- package/dist/test/matter/platform-matter.bleparse.test.d.ts +2 -0
- package/dist/test/matter/platform-matter.bleparse.test.d.ts.map +1 -0
- package/dist/test/matter/platform-matter.bleparse.test.js +43 -0
- package/dist/test/matter/platform-matter.bleparse.test.js.map +1 -0
- package/dist/test/matter/platform-matter.cleanup.test.d.ts +2 -0
- package/dist/test/matter/platform-matter.cleanup.test.d.ts.map +1 -0
- package/dist/test/matter/platform-matter.cleanup.test.js +70 -0
- package/dist/test/matter/platform-matter.cleanup.test.js.map +1 -0
- package/dist/test/matter/platform-matter.keepstale.test.d.ts +2 -0
- package/dist/test/matter/platform-matter.keepstale.test.d.ts.map +1 -0
- package/dist/test/matter/platform-matter.keepstale.test.js +27 -0
- package/dist/test/matter/platform-matter.keepstale.test.js.map +1 -0
- package/dist/test/matter/platform-matter.logging.test.d.ts +2 -0
- package/dist/test/matter/platform-matter.logging.test.d.ts.map +1 -0
- package/dist/test/matter/platform-matter.logging.test.js +29 -0
- package/dist/test/matter/platform-matter.logging.test.js.map +1 -0
- package/dist/test/matter/platform-matter.mapping.test.d.ts +2 -0
- package/dist/test/matter/platform-matter.mapping.test.d.ts.map +1 -0
- package/dist/test/matter/platform-matter.mapping.test.js +43 -0
- package/dist/test/matter/platform-matter.mapping.test.js.map +1 -0
- package/dist/test/matter/platform-matter.openapi-mapping.test.d.ts +2 -0
- package/dist/test/matter/platform-matter.openapi-mapping.test.d.ts.map +1 -0
- package/dist/test/matter/platform-matter.openapi-mapping.test.js +84 -0
- package/dist/test/matter/platform-matter.openapi-mapping.test.js.map +1 -0
- package/dist/test/matter/platform-matter.test.d.ts +2 -0
- package/dist/test/matter/platform-matter.test.d.ts.map +1 -0
- package/dist/test/matter/platform-matter.test.js +117 -0
- package/dist/test/matter/platform-matter.test.js.map +1 -0
- package/dist/test/matter/platform-matter.unregister.test.d.ts +2 -0
- package/dist/test/matter/platform-matter.unregister.test.d.ts.map +1 -0
- package/dist/test/matter/platform-matter.unregister.test.js +30 -0
- package/dist/test/matter/platform-matter.unregister.test.js.map +1 -0
- package/dist/utils.d.ts +127 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +405 -0
- package/dist/utils.js.map +1 -1
- package/dist/utils.test.d.ts +2 -0
- package/dist/utils.test.d.ts.map +1 -0
- package/dist/utils.test.js +95 -0
- package/dist/utils.test.js.map +1 -0
- package/dist/verifyconfig.test.js +2 -2
- package/dist/verifyconfig.test.js.map +1 -1
- package/docs/assets/main.js +2 -2
- package/docs/index.html +20 -2
- package/docs/variables/default.html +1 -1
- package/package.json +14 -14
- package/src/devices-hap/device.ts +68 -30
- package/src/devices-matter/BaseMatterAccessory.ts +168 -5
- package/src/devices-matter/ColorLightAccessory.ts +12 -12
- package/src/devices-matter/ColorTemperatureLightAccessory.ts +5 -7
- package/src/devices-matter/DimmableLightAccessory.ts +9 -9
- package/src/devices-matter/ExtendedColorLightAccessory.ts +14 -15
- package/src/devices-matter/OnOffLightAccessory.ts +8 -16
- package/src/devices-matter/OnOffOutletAccessory.ts +12 -7
- package/src/devices-matter/OnOffSwitchAccessory.ts +2 -2
- package/src/homebridge-ui/public/index.html +48 -1
- package/src/homebridge-ui/server.ts +37 -0
- package/src/index.test.ts +7 -2
- package/src/index.ts +4 -5
- package/src/irdevice/irdevice.ts +74 -35
- package/src/platform-hap.ts +68 -73
- package/src/platform-matter.ts +1879 -87
- package/src/settings.ts +15 -0
- package/src/test/hap/platform-hap.logging.test.ts +36 -0
- package/src/test/hap/platform-hap.test.ts +70 -0
- package/src/test/helpers/platform-fixtures.ts +33 -0
- package/src/test/matter/devices-matter/baseMatterAccessory.test.ts +88 -0
- package/src/test/matter/platform-matter.additional.test.ts +44 -0
- package/src/test/matter/platform-matter.bleparse.test.ts +47 -0
- package/src/test/matter/platform-matter.cleanup.test.ts +86 -0
- package/src/test/matter/platform-matter.keepstale.test.ts +37 -0
- package/src/test/matter/platform-matter.logging.test.ts +33 -0
- package/src/test/matter/platform-matter.mapping.test.ts +57 -0
- package/src/test/matter/platform-matter.openapi-mapping.test.ts +109 -0
- package/src/test/matter/platform-matter.test.ts +144 -0
- package/src/test/matter/platform-matter.unregister.test.ts +39 -0
- package/src/utils.test.ts +96 -0
- package/src/utils.ts +419 -3
- package/src/verifyconfig.test.ts +11 -10
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import type { API, Logger, MatterRequests } from 'homebridge'
|
|
7
7
|
|
|
8
|
+
import { hs2rgb } from '../utils.js'
|
|
8
9
|
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
9
10
|
|
|
10
11
|
export class ExtendedColorLightAccessory extends BaseMatterAccessory {
|
|
@@ -61,46 +62,44 @@ export class ExtendedColorLightAccessory extends BaseMatterAccessory {
|
|
|
61
62
|
|
|
62
63
|
private async handleOn(): Promise<void> {
|
|
63
64
|
this.logInfo('turning on.')
|
|
64
|
-
|
|
65
|
+
await this.sendOnCommand()
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
private async handleOff(): Promise<void> {
|
|
68
69
|
this.logInfo('turning off.')
|
|
69
|
-
|
|
70
|
+
await this.sendOffCommand()
|
|
70
71
|
}
|
|
71
72
|
|
|
72
73
|
private async handleSetLevel(request: MatterRequests.MoveToLevel): Promise<void> {
|
|
73
74
|
this.logInfo(`MoveToLevel request: ${JSON.stringify(request)}`)
|
|
74
75
|
const { level } = request
|
|
75
76
|
const brightnessPercent = Math.round((level / 254) * 100)
|
|
76
|
-
this.
|
|
77
|
-
// TODO: await myLightAPI.setBrightness(brightnessPercent)
|
|
77
|
+
await this.sendSetBrightness(brightnessPercent)
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
private async handleSetColor(request: MatterRequests.MoveToColor): Promise<void> {
|
|
81
81
|
this.logInfo(`MoveToColor request: ${JSON.stringify(request)}`)
|
|
82
|
-
const { colorX, colorY
|
|
83
|
-
const
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
82
|
+
const { colorX, colorY } = request
|
|
83
|
+
const hueApprox = Math.round((colorX / 65535) * 360)
|
|
84
|
+
const satApprox = Math.round((colorY / 65535) * 100)
|
|
85
|
+
const [r, g, b] = hs2rgb(hueApprox, satApprox)
|
|
86
|
+
await this.sendSetColor(r, g, b)
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
private async handleSetHueSaturation(request: MatterRequests.MoveToHueAndSaturation): Promise<void> {
|
|
90
90
|
this.logInfo(`MoveToHueAndSaturation request: ${JSON.stringify(request)}`)
|
|
91
|
-
const { hue, saturation
|
|
91
|
+
const { hue, saturation } = request
|
|
92
92
|
const hueDegrees = Math.round((hue / 254) * 360)
|
|
93
93
|
const saturationPercent = Math.round((saturation / 254) * 100)
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
const [r, g, b] = hs2rgb(hueDegrees, saturationPercent)
|
|
95
|
+
await this.sendSetColor(r, g, b)
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
private async handleSetColorTemperature(request: MatterRequests.MoveToColorTemperature): Promise<void> {
|
|
99
99
|
this.logInfo(`MoveToColorTemperature request: ${JSON.stringify(request)}`)
|
|
100
|
-
const { colorTemperatureMireds
|
|
100
|
+
const { colorTemperatureMireds } = request
|
|
101
101
|
const kelvin = Math.round(1000000 / colorTemperatureMireds)
|
|
102
|
-
this.
|
|
103
|
-
// TODO: await myLightAPI.setColorTemperature(kelvin, transitionTime)
|
|
102
|
+
await this.sendSetColorTemperature(kelvin)
|
|
104
103
|
}
|
|
105
104
|
|
|
106
105
|
public updateOnOffState(isOn: boolean): void {
|
|
@@ -27,12 +27,8 @@ export class OnOffLightAccessory extends BaseMatterAccessory {
|
|
|
27
27
|
const clusters = opts?.clusters ?? { onOff: { onOff: true } }
|
|
28
28
|
const handlers = opts?.handlers ?? {
|
|
29
29
|
onOff: {
|
|
30
|
-
on: async () =>
|
|
31
|
-
|
|
32
|
-
},
|
|
33
|
-
off: async () => {
|
|
34
|
-
log.debug(`${displayName} off handler invoked (default no-op).`)
|
|
35
|
-
},
|
|
30
|
+
on: async () => this.handleOnCommand(),
|
|
31
|
+
off: async () => this.handleOffCommand(),
|
|
36
32
|
},
|
|
37
33
|
}
|
|
38
34
|
|
|
@@ -61,14 +57,10 @@ export class OnOffLightAccessory extends BaseMatterAccessory {
|
|
|
61
57
|
this.logInfo('turning on.')
|
|
62
58
|
|
|
63
59
|
try {
|
|
64
|
-
//
|
|
65
|
-
|
|
66
|
-
// await fetch('https://api.mydevice.com/light/on', { method: 'POST' })
|
|
67
|
-
// await fetch('http://192.168.1.50/api/light/on')
|
|
68
|
-
// mqttClient.publish('home/light/command', JSON.stringify({ state: 'ON' }))
|
|
69
|
-
// await myLightAPI.turnOn(this.context.deviceId)
|
|
60
|
+
// Delegate to the platform-provided helper (OpenAPI/BLE) when available
|
|
61
|
+
await this.sendOnCommand()
|
|
70
62
|
|
|
71
|
-
this.logInfo('physical device turned on.')
|
|
63
|
+
this.logInfo('physical device turned on (via platform helper).')
|
|
72
64
|
|
|
73
65
|
// State automatically updated by Homebridge after handler completes
|
|
74
66
|
} catch (error) {
|
|
@@ -84,10 +76,10 @@ export class OnOffLightAccessory extends BaseMatterAccessory {
|
|
|
84
76
|
this.logInfo('turning off.')
|
|
85
77
|
|
|
86
78
|
try {
|
|
87
|
-
//
|
|
88
|
-
|
|
79
|
+
// Delegate to the platform-provided helper (OpenAPI/BLE) when available
|
|
80
|
+
await this.sendOffCommand()
|
|
89
81
|
|
|
90
|
-
this.logInfo('physical device turned off.')
|
|
82
|
+
this.logInfo('physical device turned off (via platform helper).')
|
|
91
83
|
|
|
92
84
|
// State automatically updated by Homebridge after handler completes
|
|
93
85
|
} catch (error) {
|
|
@@ -13,13 +13,8 @@ export class OnOffOutletAccessory extends BaseMatterAccessory {
|
|
|
13
13
|
const clusters = opts?.clusters ?? { onOff: { onOff: false } }
|
|
14
14
|
const handlers = opts?.handlers ?? {
|
|
15
15
|
onOff: {
|
|
16
|
-
on: async () =>
|
|
17
|
-
|
|
18
|
-
log.debug(`${displayName} on handler invoked (default no-op).`)
|
|
19
|
-
},
|
|
20
|
-
off: async () => {
|
|
21
|
-
log.debug(`${displayName} off handler invoked (default no-op).`)
|
|
22
|
-
},
|
|
16
|
+
on: async () => this.handleOn(),
|
|
17
|
+
off: async () => this.handleOff(),
|
|
23
18
|
},
|
|
24
19
|
}
|
|
25
20
|
|
|
@@ -43,4 +38,14 @@ export class OnOffOutletAccessory extends BaseMatterAccessory {
|
|
|
43
38
|
public updateOnOffState(isOn: boolean): void {
|
|
44
39
|
this.updateState(this.api.matter.clusterNames.OnOff, { onOff: isOn })
|
|
45
40
|
}
|
|
41
|
+
|
|
42
|
+
private async handleOn(): Promise<void> {
|
|
43
|
+
this.logInfo('turning on.')
|
|
44
|
+
await this.sendOnCommand()
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private async handleOff(): Promise<void> {
|
|
48
|
+
this.logInfo('turning off.')
|
|
49
|
+
await this.sendOffCommand()
|
|
50
|
+
}
|
|
46
51
|
}
|
|
@@ -37,12 +37,12 @@ export class OnOffSwitchAccessory extends BaseMatterAccessory {
|
|
|
37
37
|
|
|
38
38
|
private async handleOn(): Promise<void> {
|
|
39
39
|
this.logInfo('turning on.')
|
|
40
|
-
|
|
40
|
+
await this.sendOnCommand()
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
private async handleOff(): Promise<void> {
|
|
44
44
|
this.logInfo('turning off.')
|
|
45
|
-
|
|
45
|
+
await this.sendOffCommand()
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
public updateOnOffState(isOn: boolean): void {
|
|
@@ -122,6 +122,41 @@
|
|
|
122
122
|
(async () => {
|
|
123
123
|
try {
|
|
124
124
|
const currentConfig = await homebridge.getPluginConfig();
|
|
125
|
+
|
|
126
|
+
// Defensive wrapper: ensure token/secret aren't accidentally cleared by
|
|
127
|
+
// the UI/schema form. Some versions of config UI can omit sensitive
|
|
128
|
+
// fields from the submitted payload; when that happens we copy the
|
|
129
|
+
// existing values from `currentConfig` into the outgoing payload so
|
|
130
|
+
// saved config does not inadvertently remove credentials.
|
|
131
|
+
try {
|
|
132
|
+
if (typeof homebridge.updatePluginConfig === 'function') {
|
|
133
|
+
const _origUpdatePluginConfig = homebridge.updatePluginConfig.bind(homebridge)
|
|
134
|
+
homebridge.updatePluginConfig = async (cfg) => {
|
|
135
|
+
try {
|
|
136
|
+
if (Array.isArray(cfg) && cfg.length > 0 && Array.isArray(currentConfig) && currentConfig.length > 0) {
|
|
137
|
+
const incoming = cfg[0] || {}
|
|
138
|
+
const existing = currentConfig[0] || {}
|
|
139
|
+
incoming.credentials = incoming.credentials || {}
|
|
140
|
+
// Preserve token/secret when incoming payload leaves them blank/undefined
|
|
141
|
+
if ((incoming.credentials.token === undefined || String(incoming.credentials.token).trim() === '') && existing.credentials && existing.credentials.token) {
|
|
142
|
+
incoming.credentials.token = existing.credentials.token
|
|
143
|
+
}
|
|
144
|
+
if ((incoming.credentials.secret === undefined || String(incoming.credentials.secret).trim() === '') && existing.credentials && existing.credentials.secret) {
|
|
145
|
+
incoming.credentials.secret = existing.credentials.secret
|
|
146
|
+
}
|
|
147
|
+
cfg[0] = incoming
|
|
148
|
+
}
|
|
149
|
+
} catch (e) {
|
|
150
|
+
// Swallow any wrapper errors but log to console for debugging
|
|
151
|
+
// (do not expose secrets).
|
|
152
|
+
console.error('updatePluginConfig wrapper error', e)
|
|
153
|
+
}
|
|
154
|
+
return await _origUpdatePluginConfig(cfg)
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
} catch (e) {
|
|
158
|
+
console.error('Failed to attach updatePluginConfig wrapper', e)
|
|
159
|
+
}
|
|
125
160
|
showIntro = () => {
|
|
126
161
|
const introLink = document.getElementById('introLink');
|
|
127
162
|
introLink.addEventListener('click', () => {
|
|
@@ -144,10 +179,22 @@
|
|
|
144
179
|
document.getElementById('menuSettings').classList.add('btn-primary');
|
|
145
180
|
document.getElementById('pageSupport').style.display = 'none';
|
|
146
181
|
document.getElementById('pageDevices').style.display = 'block';
|
|
147
|
-
|
|
182
|
+
let cachedAccessories =
|
|
148
183
|
typeof homebridge.getCachedAccessories === 'function'
|
|
149
184
|
? await homebridge.getCachedAccessories()
|
|
150
185
|
: await homebridge.request('/getCachedAccessories');
|
|
186
|
+
|
|
187
|
+
// If no HAP cached accessories were returned, try the Matter cached list
|
|
188
|
+
if ((!cachedAccessories || cachedAccessories.length === 0) && typeof homebridge.request === 'function') {
|
|
189
|
+
try {
|
|
190
|
+
const matter = await homebridge.request('/getCachedMatterAccessories')
|
|
191
|
+
if (Array.isArray(matter) && matter.length > 0) {
|
|
192
|
+
cachedAccessories = matter
|
|
193
|
+
}
|
|
194
|
+
} catch (e) {
|
|
195
|
+
// ignore
|
|
196
|
+
}
|
|
197
|
+
}
|
|
151
198
|
if (cachedAccessories.length > 0) {
|
|
152
199
|
cachedAccessories.sort((a, b) => {
|
|
153
200
|
return a.displayName.toLowerCase() > b.displayName.toLowerCase() ? 1 : b.displayName.toLowerCase() > a.displayName.toLowerCase() ? -1 : 0;
|
|
@@ -37,6 +37,43 @@ class PluginUiServer extends HomebridgePluginUiServer {
|
|
|
37
37
|
return []
|
|
38
38
|
}
|
|
39
39
|
})
|
|
40
|
+
// Provide Matter cached accessories if Homebridge stores them separately.
|
|
41
|
+
this.onRequest('getCachedMatterAccessories', () => {
|
|
42
|
+
try {
|
|
43
|
+
const plugin = 'homebridge-switchbot'
|
|
44
|
+
const devicesToReturn: any[] = []
|
|
45
|
+
|
|
46
|
+
const accFile = `${this.homebridgeStoragePath}/accessories/cachedAccessories`
|
|
47
|
+
const matterFile = `${this.homebridgeStoragePath}/accessories/cachedMatterAccessories`
|
|
48
|
+
|
|
49
|
+
const readAndCollect = (filePath: string) => {
|
|
50
|
+
if (!fs.existsSync(filePath)) {
|
|
51
|
+
return
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const parsed: any[] = JSON.parse(fs.readFileSync(filePath, 'utf8'))
|
|
55
|
+
parsed.forEach((entry: any) => {
|
|
56
|
+
// Entry shape varies between Homebridge versions; try common locations
|
|
57
|
+
const pluginName = entry.plugin || entry?.accessory?.plugin || entry?.accessory?.pluginName
|
|
58
|
+
const acc = entry.accessory ?? entry
|
|
59
|
+
if (pluginName === plugin) {
|
|
60
|
+
devicesToReturn.push(acc as never)
|
|
61
|
+
}
|
|
62
|
+
})
|
|
63
|
+
} catch {
|
|
64
|
+
// ignore parse errors for a single file
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Read both canonical files (some Homebridge versions use one or the other)
|
|
69
|
+
readAndCollect(accFile)
|
|
70
|
+
readAndCollect(matterFile)
|
|
71
|
+
|
|
72
|
+
return devicesToReturn
|
|
73
|
+
} catch {
|
|
74
|
+
return []
|
|
75
|
+
}
|
|
76
|
+
})
|
|
40
77
|
this.ready()
|
|
41
78
|
}
|
|
42
79
|
}
|
package/src/index.test.ts
CHANGED
|
@@ -3,7 +3,6 @@ import type { API } from 'homebridge'
|
|
|
3
3
|
import { describe, expect, it, vi } from 'vitest'
|
|
4
4
|
|
|
5
5
|
import registerPlatform from './index.js'
|
|
6
|
-
import { SwitchBotHAPPlatform } from './platform-hap.js'
|
|
7
6
|
import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js'
|
|
8
7
|
|
|
9
8
|
describe('index.ts', () => {
|
|
@@ -14,6 +13,12 @@ describe('index.ts', () => {
|
|
|
14
13
|
|
|
15
14
|
registerPlatform(api)
|
|
16
15
|
|
|
17
|
-
|
|
16
|
+
// The platform registration now uses a runtime proxy/delegate constructor so
|
|
17
|
+
// assert the call happened and the third argument is a constructor function.
|
|
18
|
+
expect(api.registerPlatform).toHaveBeenCalled()
|
|
19
|
+
const callArgs = (api.registerPlatform as any).mock.calls[0]
|
|
20
|
+
expect(callArgs[0]).toBe(PLUGIN_NAME)
|
|
21
|
+
expect(callArgs[1]).toBe(PLATFORM_NAME)
|
|
22
|
+
expect(typeof callArgs[2]).toBe('function')
|
|
18
23
|
})
|
|
19
24
|
})
|
package/src/index.ts
CHANGED
|
@@ -7,12 +7,11 @@ import type { API } from 'homebridge'
|
|
|
7
7
|
import { SwitchBotHAPPlatform } from './platform-hap.js'
|
|
8
8
|
import { SwitchBotMatterPlatform } from './platform-matter.js'
|
|
9
9
|
import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js'
|
|
10
|
+
import { createPlatformProxy } from './utils.js'
|
|
10
11
|
|
|
11
12
|
// Register our platform with homebridge.
|
|
12
13
|
export default (api: API): void => {
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
// If Matter is enabled register the Matter platform, otherwise use HAP platform.
|
|
17
|
-
api.registerPlatform(PLUGIN_NAME, PLATFORM_NAME, isMatter ? SwitchBotMatterPlatform : SwitchBotHAPPlatform)
|
|
14
|
+
// Create and register a small proxy that selects the correct platform (HAP or Matter) at runtime.
|
|
15
|
+
const ProxyCtor = createPlatformProxy(SwitchBotHAPPlatform, SwitchBotMatterPlatform)
|
|
16
|
+
api.registerPlatform(PLUGIN_NAME, PLATFORM_NAME, ProxyCtor as any)
|
|
18
17
|
}
|
package/src/irdevice/irdevice.ts
CHANGED
|
@@ -276,69 +276,108 @@ export abstract class irdeviceBase {
|
|
|
276
276
|
/**
|
|
277
277
|
* Logging for Device
|
|
278
278
|
*/
|
|
279
|
-
|
|
280
|
-
if (
|
|
281
|
-
|
|
279
|
+
infoLog(...log: any[]): void {
|
|
280
|
+
if (!this.enablingDeviceLogging()) {
|
|
281
|
+
return
|
|
282
282
|
}
|
|
283
|
+
// Delegate to a single helper that prefers platform-provided loggers.
|
|
284
|
+
this.logWith('info', `${this.device.remoteType}: ${this.accessory.displayName}`, undefined, String(...log))
|
|
283
285
|
}
|
|
284
286
|
|
|
285
|
-
|
|
286
|
-
if (
|
|
287
|
-
|
|
287
|
+
successLog(...log: any[]): void {
|
|
288
|
+
if (!this.enablingDeviceLogging()) {
|
|
289
|
+
return
|
|
288
290
|
}
|
|
291
|
+
this.logWith('success', `${this.device.remoteType}: ${this.accessory.displayName}`, undefined, String(...log))
|
|
289
292
|
}
|
|
290
293
|
|
|
291
|
-
|
|
292
|
-
if (
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
294
|
+
debugSuccessLog(...log: any[]): void {
|
|
295
|
+
if (!this.enablingDeviceLogging()) {
|
|
296
|
+
return
|
|
297
|
+
}
|
|
298
|
+
if (!this.loggingIsDebug()) {
|
|
299
|
+
return
|
|
296
300
|
}
|
|
301
|
+
this.logWith('success', `[DEBUG] ${this.device.remoteType}: ${this.accessory.displayName}`, 'debugSuccessLog', String(...log))
|
|
297
302
|
}
|
|
298
303
|
|
|
299
|
-
|
|
300
|
-
if (
|
|
301
|
-
|
|
304
|
+
warnLog(...log: any[]): void {
|
|
305
|
+
if (!this.enablingDeviceLogging()) {
|
|
306
|
+
return
|
|
302
307
|
}
|
|
308
|
+
this.logWith('warn', `${this.device.remoteType}: ${this.accessory.displayName}`, undefined, String(...log))
|
|
303
309
|
}
|
|
304
310
|
|
|
305
|
-
|
|
306
|
-
if (
|
|
307
|
-
|
|
308
|
-
this.log.warn(`[DEBUG] ${this.device.remoteType}: ${this.accessory.displayName}`, String(...log))
|
|
309
|
-
}
|
|
311
|
+
debugWarnLog(...log: any[]): void {
|
|
312
|
+
if (!this.enablingDeviceLogging() || !this.loggingIsDebug()) {
|
|
313
|
+
return
|
|
310
314
|
}
|
|
315
|
+
this.logWith('warn', `[DEBUG] ${this.device.remoteType}: ${this.accessory.displayName}`, 'debugWarnLog', String(...log))
|
|
311
316
|
}
|
|
312
317
|
|
|
313
|
-
|
|
314
|
-
if (
|
|
315
|
-
|
|
318
|
+
errorLog(...log: any[]): void {
|
|
319
|
+
if (!this.enablingDeviceLogging()) {
|
|
320
|
+
return
|
|
316
321
|
}
|
|
322
|
+
this.logWith('error', `${this.device.remoteType}: ${this.accessory.displayName}`, undefined, String(...log))
|
|
317
323
|
}
|
|
318
324
|
|
|
319
|
-
|
|
320
|
-
if (
|
|
321
|
-
|
|
322
|
-
this.log.error(`[DEBUG] ${this.device.remoteType}: ${this.accessory.displayName}`, String(...log))
|
|
323
|
-
}
|
|
325
|
+
debugErrorLog(...log: any[]): void {
|
|
326
|
+
if (!this.enablingDeviceLogging() || !this.loggingIsDebug()) {
|
|
327
|
+
return
|
|
324
328
|
}
|
|
329
|
+
this.logWith('error', `[DEBUG] ${this.device.remoteType}: ${this.accessory.displayName}`, 'debugErrorLog', String(...log))
|
|
325
330
|
}
|
|
326
331
|
|
|
327
|
-
|
|
328
|
-
if (
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
332
|
+
debugLog(...log: any[]): void {
|
|
333
|
+
if (!this.enablingDeviceLogging()) {
|
|
334
|
+
return
|
|
335
|
+
}
|
|
336
|
+
if (this.deviceLogging === 'debug') {
|
|
337
|
+
this.logWith('debug', `[DEBUG] ${this.device.remoteType}: ${this.accessory.displayName}`, 'debugLog', String(...log))
|
|
338
|
+
} else if (this.deviceLogging === 'debugMode') {
|
|
339
|
+
this.logWith('debug', `${this.device.remoteType}: ${this.accessory.displayName}`, 'debugLog', String(...log))
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Generic platform/local logger delegate
|
|
344
|
+
protected logWith(level: string, message: string, platformMethodName?: string, payload?: string): void {
|
|
345
|
+
const method = platformMethodName ?? `${level}Log`
|
|
346
|
+
const pFn = (this.platform as any)?.[method]
|
|
347
|
+
if (typeof pFn === 'function') {
|
|
348
|
+
try {
|
|
349
|
+
if (payload !== undefined) {
|
|
350
|
+
pFn(message, payload)
|
|
351
|
+
} else {
|
|
352
|
+
pFn(message)
|
|
353
|
+
}
|
|
354
|
+
return
|
|
355
|
+
} catch (_err) {
|
|
356
|
+
// fallthrough to local logger
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
const map: Record<string, string> = {
|
|
360
|
+
info: 'info',
|
|
361
|
+
success: 'success',
|
|
362
|
+
debug: 'debug',
|
|
363
|
+
warn: 'warn',
|
|
364
|
+
error: 'error',
|
|
365
|
+
}
|
|
366
|
+
const local = (this.log as any)[map[level] ?? level]
|
|
367
|
+
if (typeof local === 'function') {
|
|
368
|
+
if (payload !== undefined) {
|
|
369
|
+
local.call(this.log, message, payload)
|
|
370
|
+
} else {
|
|
371
|
+
local.call(this.log, message)
|
|
333
372
|
}
|
|
334
373
|
}
|
|
335
374
|
}
|
|
336
375
|
|
|
337
|
-
|
|
376
|
+
loggingIsDebug(): boolean {
|
|
338
377
|
return this.deviceLogging === 'debugMode' || this.deviceLogging === 'debug'
|
|
339
378
|
}
|
|
340
379
|
|
|
341
|
-
|
|
380
|
+
enablingDeviceLogging(): boolean {
|
|
342
381
|
return this.deviceLogging === 'debugMode' || this.deviceLogging === 'debug' || this.deviceLogging === 'standard'
|
|
343
382
|
}
|
|
344
383
|
}
|
package/src/platform-hap.ts
CHANGED
|
@@ -55,7 +55,7 @@ import { TV } from './irdevice/tv.js'
|
|
|
55
55
|
import { VacuumCleaner } from './irdevice/vacuumcleaner.js'
|
|
56
56
|
import { WaterHeater } from './irdevice/waterheater.js'
|
|
57
57
|
import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js'
|
|
58
|
-
import { cleanDeviceConfig, formatDeviceIdAsMac, isBlindTiltDevice, isCurtainDevice, safeStringify, sleep } from './utils.js'
|
|
58
|
+
import { ApiRequestTracker, cleanDeviceConfig, createPlatformLogger, formatDeviceIdAsMac, isBlindTiltDevice, isCurtainDevice, safeStringify, sleep } from './utils.js'
|
|
59
59
|
|
|
60
60
|
/**
|
|
61
61
|
* HomebridgePlatform
|
|
@@ -68,6 +68,18 @@ export class SwitchBotHAPPlatform implements DynamicPlatformPlugin {
|
|
|
68
68
|
public readonly api: API
|
|
69
69
|
public readonly log: Logging
|
|
70
70
|
|
|
71
|
+
// Logging helper functions (attached from utils.createPlatformLogger in constructor)
|
|
72
|
+
infoLog!: (...log: any[]) => Promise<void>
|
|
73
|
+
successLog!: (...log: any[]) => Promise<void>
|
|
74
|
+
debugSuccessLog!: (...log: any[]) => Promise<void>
|
|
75
|
+
warnLog!: (...log: any[]) => Promise<void>
|
|
76
|
+
debugWarnLog!: (...log: any[]) => Promise<void>
|
|
77
|
+
errorLog!: (...log: any[]) => Promise<void>
|
|
78
|
+
debugErrorLog!: (...log: any[]) => Promise<void>
|
|
79
|
+
debugLog!: (...log: any[]) => Promise<void>
|
|
80
|
+
loggingIsDebug!: () => Promise<boolean>
|
|
81
|
+
enablingPlatformLogging!: () => Promise<boolean>
|
|
82
|
+
|
|
71
83
|
// Configuration properties
|
|
72
84
|
platformConfig!: SwitchBotPlatformConfig
|
|
73
85
|
platformLogging!: options['logging']
|
|
@@ -88,6 +100,9 @@ export class SwitchBotHAPPlatform implements DynamicPlatformPlugin {
|
|
|
88
100
|
switchBotAPI!: SwitchBotOpenAPI
|
|
89
101
|
switchBotBLE!: SwitchBotBLE
|
|
90
102
|
|
|
103
|
+
// API request tracking
|
|
104
|
+
private apiTracker?: ApiRequestTracker
|
|
105
|
+
|
|
91
106
|
// External APIs
|
|
92
107
|
public readonly eve: any
|
|
93
108
|
public readonly fakegatoAPI: any
|
|
@@ -104,9 +119,22 @@ export class SwitchBotHAPPlatform implements DynamicPlatformPlugin {
|
|
|
104
119
|
this.api = api
|
|
105
120
|
this.log = log
|
|
106
121
|
|
|
122
|
+
// Attach shared platform logging helpers (moved to utils for reuse)
|
|
123
|
+
const _pl = createPlatformLogger(async () => this.platformLogging, this.log)
|
|
124
|
+
this.infoLog = _pl.infoLog
|
|
125
|
+
this.successLog = _pl.successLog
|
|
126
|
+
this.debugSuccessLog = _pl.debugSuccessLog
|
|
127
|
+
this.warnLog = _pl.warnLog
|
|
128
|
+
this.debugWarnLog = _pl.debugWarnLog
|
|
129
|
+
this.errorLog = _pl.errorLog
|
|
130
|
+
this.debugErrorLog = _pl.debugErrorLog
|
|
131
|
+
this.debugLog = _pl.debugLog
|
|
132
|
+
this.loggingIsDebug = _pl.loggingIsDebug
|
|
133
|
+
this.enablingPlatformLogging = _pl.enablingPlatformLogging
|
|
134
|
+
|
|
107
135
|
// only load if configured
|
|
108
136
|
if (!config) {
|
|
109
|
-
this.
|
|
137
|
+
this.errorLog('No configuration found for the plugin, please check your config.')
|
|
110
138
|
return
|
|
111
139
|
}
|
|
112
140
|
|
|
@@ -119,6 +147,20 @@ export class SwitchBotHAPPlatform implements DynamicPlatformPlugin {
|
|
|
119
147
|
devices: config.devices as { deviceId: string }[],
|
|
120
148
|
}
|
|
121
149
|
|
|
150
|
+
// Determine platform logging preference (match HAP behaviour as closely as
|
|
151
|
+
// possible using config values. We default to 'standard' when unspecified.)
|
|
152
|
+
this.platformLogging = (this.config.options?.logging === 'debug' || this.config.options?.logging === 'standard' || this.config.options?.logging === 'none')
|
|
153
|
+
? this.config.options.logging
|
|
154
|
+
: 'standard'
|
|
155
|
+
|
|
156
|
+
// Unconditional diagnostic using the raw Homebridge `log` so it always
|
|
157
|
+
// appears regardless of the platform logging helpers' gating logic.
|
|
158
|
+
try {
|
|
159
|
+
this.log.debug?.(`[SwitchBot HAP] effective platformLogging=${String(this.platformLogging)}`)
|
|
160
|
+
} catch (e: any) {
|
|
161
|
+
// swallow any logging errors — diagnostics are best-effort
|
|
162
|
+
}
|
|
163
|
+
|
|
122
164
|
// Normalize deviceConfig to remove UI-inserted defaults (lots of false/empty values)
|
|
123
165
|
try {
|
|
124
166
|
if ((this.config as any).options) {
|
|
@@ -203,9 +245,29 @@ export class SwitchBotHAPPlatform implements DynamicPlatformPlugin {
|
|
|
203
245
|
// to start discovery of new accessories.
|
|
204
246
|
this.api.on('didFinishLaunching', async () => {
|
|
205
247
|
this.debugLog('Executed didFinishLaunching callback')
|
|
248
|
+
|
|
249
|
+
// Initialize API request tracking
|
|
250
|
+
try {
|
|
251
|
+
this.apiTracker = new ApiRequestTracker(this.api, this.log, 'SwitchBot HAP')
|
|
252
|
+
this.apiTracker.startHourlyLogging()
|
|
253
|
+
} catch (e: any) {
|
|
254
|
+
this.errorLog(`Failed to initialize API request tracking: ${e.message ?? e}`)
|
|
255
|
+
}
|
|
256
|
+
|
|
206
257
|
// run the method to discover / register your devices as accessories
|
|
207
258
|
try {
|
|
208
|
-
|
|
259
|
+
// Does the user have a version of Homebridge that is compatible with matter?
|
|
260
|
+
if (!this.api.isMatterAvailable?.()) {
|
|
261
|
+
this.debugLog(`Matter is not available in this version of Homebridge. Please update Homebridge to use this plugin, ${this.api.isMatterAvailable?.() ? '' : ' (Matter is not available in this version of Homebridge)'}`)
|
|
262
|
+
}
|
|
263
|
+
if (!this.api.isMatterEnabled?.()) {
|
|
264
|
+
this.debugLog(`Matter is not enabled in Homebridge. Please enable Matter in the Homebridge settings to use this plugin, ${this.api.isMatterEnabled?.() ? '' : ' (Matter is not enabled in Homebridge)'}`)
|
|
265
|
+
}
|
|
266
|
+
if (!this.api.isMatterAvailable?.() && !this.api.isMatterEnabled?.()) {
|
|
267
|
+
await this.discoverDevices()
|
|
268
|
+
} else {
|
|
269
|
+
this.infoLog('Matter is enabled in Homebridge. SwitchBot Matter devices will be handled by the Matter platform.')
|
|
270
|
+
}
|
|
209
271
|
} catch (e: any) {
|
|
210
272
|
this.errorLog(`Failed to Discover, Error Message: ${e.message ?? e}, Submit Bugs Here: ` + 'https://tinyurl.com/SwitchBotBug')
|
|
211
273
|
this.debugErrorLog(`Failed to Discover, Error: ${e.message ?? e}`)
|
|
@@ -440,6 +502,7 @@ export class SwitchBotHAPPlatform implements DynamicPlatformPlugin {
|
|
|
440
502
|
|
|
441
503
|
while (retryCount < maxRetries) {
|
|
442
504
|
try {
|
|
505
|
+
this.apiTracker?.track()
|
|
443
506
|
const { response, statusCode } = await this.switchBotAPI.getDevices()
|
|
444
507
|
this.debugLog(`response: ${JSON.stringify(response)}`)
|
|
445
508
|
if (this.isSuccessfulResponse(statusCode)) {
|
|
@@ -2752,6 +2815,7 @@ export class SwitchBotHAPPlatform implements DynamicPlatformPlugin {
|
|
|
2752
2815
|
const delayBetweenRetries = deviceDelayBetweenRetries
|
|
2753
2816
|
while (retryCount < maxRetries) {
|
|
2754
2817
|
try {
|
|
2818
|
+
this.apiTracker?.track()
|
|
2755
2819
|
const { response, statusCode } = await this.switchBotAPI.getDeviceStatus(device.deviceId, this.config.credentials?.token, this.config.credentials?.secret)
|
|
2756
2820
|
this.debugLog(`response: ${JSON.stringify(response)}`)
|
|
2757
2821
|
return { response, statusCode }
|
|
@@ -2777,6 +2841,7 @@ export class SwitchBotHAPPlatform implements DynamicPlatformPlugin {
|
|
|
2777
2841
|
const delayBetweenRetries = deviceDelayBetweenRetries ?? 1000
|
|
2778
2842
|
while (retryCount < maxRetries) {
|
|
2779
2843
|
try {
|
|
2844
|
+
this.apiTracker?.track()
|
|
2780
2845
|
const { response, statusCode } = await this.switchBotAPI.controlDevice(
|
|
2781
2846
|
device.deviceId,
|
|
2782
2847
|
bodyChange.command,
|
|
@@ -2913,74 +2978,4 @@ export class SwitchBotHAPPlatform implements DynamicPlatformPlugin {
|
|
|
2913
2978
|
return value
|
|
2914
2979
|
}
|
|
2915
2980
|
}
|
|
2916
|
-
|
|
2917
|
-
/**
|
|
2918
|
-
* If device level logging is turned on, log to log.warn
|
|
2919
|
-
* Otherwise send debug logs to log.debug
|
|
2920
|
-
*/
|
|
2921
|
-
async infoLog(...log: any[]): Promise<void> {
|
|
2922
|
-
if (await this.enablingPlatformLogging()) {
|
|
2923
|
-
this.log.info(String(...log))
|
|
2924
|
-
}
|
|
2925
|
-
}
|
|
2926
|
-
|
|
2927
|
-
async successLog(...log: any[]): Promise<void> {
|
|
2928
|
-
if (await this.enablingPlatformLogging()) {
|
|
2929
|
-
this.log.success(String(...log))
|
|
2930
|
-
}
|
|
2931
|
-
}
|
|
2932
|
-
|
|
2933
|
-
async debugSuccessLog(...log: any[]): Promise<void> {
|
|
2934
|
-
if (await this.enablingPlatformLogging()) {
|
|
2935
|
-
if (await this.loggingIsDebug()) {
|
|
2936
|
-
this.log.success('[DEBUG]', String(...log))
|
|
2937
|
-
}
|
|
2938
|
-
}
|
|
2939
|
-
}
|
|
2940
|
-
|
|
2941
|
-
async warnLog(...log: any[]): Promise<void> {
|
|
2942
|
-
if (await this.enablingPlatformLogging()) {
|
|
2943
|
-
this.log.warn(String(...log))
|
|
2944
|
-
}
|
|
2945
|
-
}
|
|
2946
|
-
|
|
2947
|
-
async debugWarnLog(...log: any[]): Promise<void> {
|
|
2948
|
-
if (await this.enablingPlatformLogging()) {
|
|
2949
|
-
if (await this.loggingIsDebug()) {
|
|
2950
|
-
this.log.warn('[DEBUG]', String(...log))
|
|
2951
|
-
}
|
|
2952
|
-
}
|
|
2953
|
-
}
|
|
2954
|
-
|
|
2955
|
-
async errorLog(...log: any[]): Promise<void> {
|
|
2956
|
-
if (await this.enablingPlatformLogging()) {
|
|
2957
|
-
this.log.error(String(...log))
|
|
2958
|
-
}
|
|
2959
|
-
}
|
|
2960
|
-
|
|
2961
|
-
async debugErrorLog(...log: any[]): Promise<void> {
|
|
2962
|
-
if (await this.enablingPlatformLogging()) {
|
|
2963
|
-
if (await this.loggingIsDebug()) {
|
|
2964
|
-
this.log.error('[DEBUG]', String(...log))
|
|
2965
|
-
}
|
|
2966
|
-
}
|
|
2967
|
-
}
|
|
2968
|
-
|
|
2969
|
-
async debugLog(...log: any[]): Promise<void> {
|
|
2970
|
-
if (await this.enablingPlatformLogging()) {
|
|
2971
|
-
if (this.platformLogging === 'debug') {
|
|
2972
|
-
this.log.info('[DEBUG]', String(...log))
|
|
2973
|
-
} else if (this.platformLogging === 'debugMode') {
|
|
2974
|
-
this.log.debug(String(...log))
|
|
2975
|
-
}
|
|
2976
|
-
}
|
|
2977
|
-
}
|
|
2978
|
-
|
|
2979
|
-
async loggingIsDebug(): Promise<boolean> {
|
|
2980
|
-
return this.platformLogging === 'debugMode' || this.platformLogging === 'debug'
|
|
2981
|
-
}
|
|
2982
|
-
|
|
2983
|
-
async enablingPlatformLogging(): Promise<boolean> {
|
|
2984
|
-
return this.platformLogging === 'debugMode' || this.platformLogging === 'debug' || this.platformLogging === 'standard'
|
|
2985
|
-
}
|
|
2986
2981
|
}
|