@switchbot/homebridge-switchbot 5.0.0-beta.154 → 5.0.0-beta.155
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/.github/workflows/release.yml +63 -15
- package/.github/workflows/stale.yml +2 -4
- package/CHANGELOG.md +21 -29
- package/MIGRATION.md +6 -6
- package/README.md +5 -3
- package/dist/device-types.js +7 -7
- package/dist/device-types.js.map +1 -1
- package/dist/deviceFactory.d.ts +1 -1
- package/dist/deviceFactory.d.ts.map +1 -1
- package/dist/deviceFactory.js +20 -20
- package/dist/deviceFactory.js.map +1 -1
- package/dist/homebridge-ui/device-types.js +246 -0
- package/dist/homebridge-ui/device-types.js.map +1 -0
- package/dist/homebridge-ui/deviceCommandMapper.js +319 -0
- package/dist/homebridge-ui/deviceCommandMapper.js.map +1 -0
- package/dist/homebridge-ui/endpoints/discovery.d.ts.map +1 -1
- package/dist/homebridge-ui/endpoints/discovery.js +5 -1
- package/dist/homebridge-ui/endpoints/discovery.js.map +1 -1
- package/dist/homebridge-ui/errors.js +32 -0
- package/dist/homebridge-ui/errors.js.map +1 -0
- package/dist/homebridge-ui/homebridge-ui/endpoints/config.js +90 -0
- package/dist/homebridge-ui/homebridge-ui/endpoints/config.js.map +1 -0
- package/dist/homebridge-ui/homebridge-ui/endpoints/devices.js +144 -0
- package/dist/homebridge-ui/homebridge-ui/endpoints/devices.js.map +1 -0
- package/dist/homebridge-ui/homebridge-ui/endpoints/discovery.js +219 -0
- package/dist/homebridge-ui/homebridge-ui/endpoints/discovery.js.map +1 -0
- package/dist/homebridge-ui/homebridge-ui/server.js +11 -0
- package/dist/homebridge-ui/homebridge-ui/server.js.map +1 -0
- package/dist/homebridge-ui/homebridge-ui/utils/config-parser.js +108 -0
- package/dist/homebridge-ui/homebridge-ui/utils/config-parser.js.map +1 -0
- package/dist/homebridge-ui/homebridge-ui/utils/device-migration.js +111 -0
- package/dist/homebridge-ui/homebridge-ui/utils/device-migration.js.map +1 -0
- package/dist/homebridge-ui/homebridge-ui/utils/logger.js +17 -0
- package/dist/homebridge-ui/homebridge-ui/utils/logger.js.map +1 -0
- package/dist/homebridge-ui/public/js/app.js +5 -9
- package/dist/homebridge-ui/public/js/app.js.map +2 -2
- package/dist/homebridge-ui/settings.js +8 -0
- package/dist/homebridge-ui/settings.js.map +1 -0
- package/dist/homebridge-ui/switchbotClient.js +247 -0
- package/dist/homebridge-ui/switchbotClient.js.map +1 -0
- package/dist/switchbotClient.d.ts +7 -1
- package/dist/switchbotClient.d.ts.map +1 -1
- package/dist/switchbotClient.js +82 -10
- package/dist/switchbotClient.js.map +1 -1
- package/docs/assets/main.js +1 -1
- package/docs/index.html +10 -4
- package/docs/variables/default.html +1 -1
- package/eslint.config.js +9 -10
- package/package.json +25 -23
- package/src/device-types.js +246 -0
- package/src/device-types.js.map +1 -0
- package/src/device-types.ts +7 -7
- package/src/deviceCommandMapper.js +319 -0
- package/src/deviceCommandMapper.js.map +1 -0
- package/src/deviceFactory.ts +22 -21
- package/src/errors.js +32 -0
- package/src/errors.js.map +1 -0
- package/src/homebridge-ui/endpoints/discovery.ts +5 -1
- package/src/settings.js +8 -0
- package/src/settings.js.map +1 -0
- package/src/switchbotClient.js +247 -0
- package/src/switchbotClient.js.map +1 -0
- package/src/switchbotClient.ts +95 -10
- package/test/client/switchbotClient.spec.ts +42 -1
- package/test/e2e/run-e2e.spec.ts +1 -0
- package/tsconfig.ui.json +11 -0
- package/.github/workflows/beta-release.yml +0 -52
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensure required fields are present on the SwitchBot platform config
|
|
3
|
+
*/
|
|
4
|
+
export function enforcePlatformConfigFields(platform) {
|
|
5
|
+
if (!platform)
|
|
6
|
+
return;
|
|
7
|
+
if (!platform.platform)
|
|
8
|
+
platform.platform = 'SwitchBot';
|
|
9
|
+
if (!platform.name)
|
|
10
|
+
platform.name = 'SwitchBot';
|
|
11
|
+
if (!Array.isArray(platform.devices))
|
|
12
|
+
platform.devices = [];
|
|
13
|
+
}
|
|
14
|
+
import fs from 'node:fs/promises';
|
|
15
|
+
import { uiLog } from './logger.js';
|
|
16
|
+
// Module-scope regex pattern to avoid recompilation
|
|
17
|
+
export const SWITCHBOT_PLATFORM_REGEX = /switchbot/i;
|
|
18
|
+
/**
|
|
19
|
+
* Get reference to the devices array in platform config
|
|
20
|
+
*/
|
|
21
|
+
export function getDevicesRef(platform) {
|
|
22
|
+
if (!platform || typeof platform !== 'object') {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
if (Array.isArray(platform.devices)) {
|
|
26
|
+
return platform.devices;
|
|
27
|
+
}
|
|
28
|
+
platform.devices = [];
|
|
29
|
+
return platform.devices;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get all device arrays from platform config
|
|
33
|
+
*/
|
|
34
|
+
export function getDeviceArrays(platform) {
|
|
35
|
+
const rootDevices = getDevicesRef(platform);
|
|
36
|
+
return [rootDevices];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get all unique devices from platform config
|
|
40
|
+
*/
|
|
41
|
+
export function getAllDevices(platform) {
|
|
42
|
+
const all = getDevicesRef(platform);
|
|
43
|
+
const seen = new Set();
|
|
44
|
+
return all.filter((d) => {
|
|
45
|
+
const id = String(d?.deviceId ?? d?.id ?? '').trim().toLowerCase();
|
|
46
|
+
if (!id || seen.has(id)) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
seen.add(id);
|
|
50
|
+
return true;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get credential from platform config
|
|
55
|
+
*/
|
|
56
|
+
export function getCredential(platform, key) {
|
|
57
|
+
return platform?.[key];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Set credential in platform config
|
|
61
|
+
*/
|
|
62
|
+
export function setCredential(platform, key, value) {
|
|
63
|
+
if (!platform || typeof platform !== 'object') {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
platform[key] = value;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Find and parse the SwitchBot platform config from Homebridge config file
|
|
70
|
+
*/
|
|
71
|
+
export async function getSwitchBotPlatformConfig(server) {
|
|
72
|
+
const cfgPath = server.homebridgeConfigPath;
|
|
73
|
+
if (!cfgPath) {
|
|
74
|
+
throw new Error('HOMEBRIDGE_CONFIG_PATH not set');
|
|
75
|
+
}
|
|
76
|
+
const raw = await fs.readFile(cfgPath, 'utf-8');
|
|
77
|
+
const cfg = JSON.parse(raw);
|
|
78
|
+
const platforms = Array.isArray(cfg.platforms) ? cfg.platforms : [];
|
|
79
|
+
const candidates = platforms.filter((p) => {
|
|
80
|
+
const platformName = p.platform || p.name || '';
|
|
81
|
+
return !!platformName && (SWITCHBOT_PLATFORM_REGEX.test(String(platformName)) || String(platformName).toLowerCase() === '@switchbot/homebridge-switchbot');
|
|
82
|
+
});
|
|
83
|
+
uiLog.info(`Found ${candidates.length} SwitchBot candidate(s)`);
|
|
84
|
+
const platform = candidates.find((p) => {
|
|
85
|
+
const name = String(p.platform || '').toLowerCase();
|
|
86
|
+
return name === 'switchbot' || name.includes('switchbot');
|
|
87
|
+
});
|
|
88
|
+
if (!platform) {
|
|
89
|
+
throw new Error('SwitchBot platform not found in config. Please add the plugin configuration first.');
|
|
90
|
+
}
|
|
91
|
+
uiLog.info(`Using SwitchBot platform: ${platform.name || platform.platform || 'SwitchBot'}`);
|
|
92
|
+
return { platform, cfg, cfgPath };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Save the Homebridge config file
|
|
96
|
+
*/
|
|
97
|
+
export async function saveConfig(cfgPath, cfg) {
|
|
98
|
+
// Defensive: enforce required fields on all SwitchBot platform blocks before saving
|
|
99
|
+
if (cfg && Array.isArray(cfg.platforms)) {
|
|
100
|
+
for (const p of cfg.platforms) {
|
|
101
|
+
if (p && (String(p.platform || '').toLowerCase() === 'switchbot' || String(p.name || '').toLowerCase() === 'switchbot')) {
|
|
102
|
+
enforcePlatformConfigFields(p);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
await fs.writeFile(cfgPath, JSON.stringify(cfg, null, 2), 'utf-8');
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=config-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-parser.js","sourceRoot":"","sources":["../../../../src/homebridge-ui/utils/config-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { DEVICE_TYPES, isValidDeviceType, normalizeDeviceType } from '../../device-types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validate and optionally correct a device's configDeviceType
|
|
4
|
+
* @param device Device object from config
|
|
5
|
+
* @param autoCorrect Whether to auto-correct invalid types
|
|
6
|
+
* @returns Migration result with details
|
|
7
|
+
*/
|
|
8
|
+
export function validateAndMigrateDeviceType(device, autoCorrect = false) {
|
|
9
|
+
const originalType = device.configDeviceType;
|
|
10
|
+
const deviceId = device.deviceId || device.id || 'unknown';
|
|
11
|
+
// Check if type is valid
|
|
12
|
+
if (isValidDeviceType(originalType)) {
|
|
13
|
+
return {
|
|
14
|
+
migrated: false,
|
|
15
|
+
originalType,
|
|
16
|
+
correctedType: originalType,
|
|
17
|
+
message: `Device "${device.configDeviceName || deviceId}" type is valid`,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
// Try to find a valid mapping
|
|
21
|
+
const correctedType = normalizeDeviceType(originalType);
|
|
22
|
+
if (!correctedType) {
|
|
23
|
+
return {
|
|
24
|
+
migrated: false,
|
|
25
|
+
originalType,
|
|
26
|
+
correctedType: null,
|
|
27
|
+
message: `Device "${device.configDeviceName || deviceId}" has invalid type "${originalType}" with no valid mapping`,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// Found a valid mapping
|
|
31
|
+
if (autoCorrect) {
|
|
32
|
+
device.configDeviceType = correctedType;
|
|
33
|
+
return {
|
|
34
|
+
migrated: true,
|
|
35
|
+
originalType,
|
|
36
|
+
correctedType,
|
|
37
|
+
message: `Device "${device.configDeviceName || deviceId}" type auto-corrected: "${originalType}" → "${correctedType}"`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
return {
|
|
42
|
+
migrated: false,
|
|
43
|
+
originalType,
|
|
44
|
+
correctedType,
|
|
45
|
+
message: `Device "${device.configDeviceName || deviceId}" requires migration: "${originalType}" → "${correctedType}"`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Validate all devices in config and optionally auto-correct invalid types
|
|
51
|
+
* @param config Configuration object containing devices array
|
|
52
|
+
* @param autoCorrect Whether to auto-correct invalid types
|
|
53
|
+
* @returns Array of migration results with statistics
|
|
54
|
+
*/
|
|
55
|
+
export function validateAndMigrateConfig(config, autoCorrect = false) {
|
|
56
|
+
const results = [];
|
|
57
|
+
const warnings = [];
|
|
58
|
+
let validCount = 0;
|
|
59
|
+
let correctedCount = 0;
|
|
60
|
+
let invalidCount = 0;
|
|
61
|
+
if (!config?.devices || !Array.isArray(config.devices)) {
|
|
62
|
+
return {
|
|
63
|
+
results,
|
|
64
|
+
statistics: {
|
|
65
|
+
total: 0,
|
|
66
|
+
valid: 0,
|
|
67
|
+
corrected: 0,
|
|
68
|
+
invalid: 0,
|
|
69
|
+
},
|
|
70
|
+
warnings: ['No devices found in config'],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
for (const device of config.devices) {
|
|
74
|
+
const result = validateAndMigrateDeviceType(device, autoCorrect);
|
|
75
|
+
results.push(result);
|
|
76
|
+
if (!result.originalType || isValidDeviceType(result.originalType)) {
|
|
77
|
+
validCount++;
|
|
78
|
+
}
|
|
79
|
+
else if (result.migrated) {
|
|
80
|
+
correctedCount++;
|
|
81
|
+
}
|
|
82
|
+
else if (result.correctedType) {
|
|
83
|
+
warnings.push(`Device "${device.configDeviceName || device.deviceId}" needs correction: "${result.originalType}" → "${result.correctedType}"`);
|
|
84
|
+
invalidCount++;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
invalidCount++;
|
|
88
|
+
warnings.push(`Device "${device.configDeviceName || device.deviceId}" has INVALID type "${result.originalType}" with no mapping`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Validation complete - results and warnings are returned via return value
|
|
92
|
+
// Caller (config endpoint) will handle logging/reporting
|
|
93
|
+
return {
|
|
94
|
+
results,
|
|
95
|
+
statistics: {
|
|
96
|
+
total: config.devices.length,
|
|
97
|
+
valid: validCount,
|
|
98
|
+
corrected: correctedCount,
|
|
99
|
+
invalid: invalidCount,
|
|
100
|
+
},
|
|
101
|
+
warnings,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get list of all valid device types for error messages
|
|
106
|
+
* @returns Array of valid device types grouped by category
|
|
107
|
+
*/
|
|
108
|
+
export function getValidDeviceTypesList() {
|
|
109
|
+
return DEVICE_TYPES;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=device-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-migration.js","sourceRoot":"","sources":["../../../../src/homebridge-ui/utils/device-migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
const PREFIX = '[SwitchBot UI/Server]';
|
|
3
|
+
export const uiLog = {
|
|
4
|
+
info: (message, ...parameters) => {
|
|
5
|
+
console.log(PREFIX, message, ...parameters);
|
|
6
|
+
},
|
|
7
|
+
warn: (message, ...parameters) => {
|
|
8
|
+
console.warn(PREFIX, message, ...parameters);
|
|
9
|
+
},
|
|
10
|
+
error: (message, ...parameters) => {
|
|
11
|
+
console.error(PREFIX, message, ...parameters);
|
|
12
|
+
},
|
|
13
|
+
debug: (message, ...parameters) => {
|
|
14
|
+
console.debug(PREFIX, message, ...parameters);
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../../src/homebridge-ui/utils/logger.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,MAAM,MAAM,GAAG,uBAAuB,CAAA;AAEtC,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,UAAiB,EAAE,EAAE;QAC9C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAA;IAC7C,CAAC;IACD,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,UAAiB,EAAE,EAAE;QAC9C,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAA;IAC9C,CAAC;IACD,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,UAAiB,EAAE,EAAE;QAC/C,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAA;IAC/C,CAAC;IACD,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,UAAiB,EAAE,EAAE;QAC/C,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAA;IAC/C,CAAC;CACF,CAAA"}
|
|
@@ -113,7 +113,7 @@ var init_toast = __esm({
|
|
|
113
113
|
}
|
|
114
114
|
});
|
|
115
115
|
|
|
116
|
-
// src/device-types.
|
|
116
|
+
// src/device-types.js
|
|
117
117
|
function getValidDeviceTypes() {
|
|
118
118
|
const validTypes = /* @__PURE__ */ new Set();
|
|
119
119
|
for (const category of Object.values(DEVICE_TYPES)) {
|
|
@@ -148,7 +148,7 @@ function isValidDeviceType(deviceType) {
|
|
|
148
148
|
}
|
|
149
149
|
var DEVICE_TYPES, DEVICE_TYPE_NORMALIZATION_MAP;
|
|
150
150
|
var init_device_types = __esm({
|
|
151
|
-
"src/device-types.
|
|
151
|
+
"src/device-types.js"() {
|
|
152
152
|
"use strict";
|
|
153
153
|
DEVICE_TYPES = {
|
|
154
154
|
"Window Coverings": ["Blind Tilt", "Curtain", "Curtain3", "Roller Shade"],
|
|
@@ -246,11 +246,10 @@ var init_device_types = __esm({
|
|
|
246
246
|
"Other Devices": ["AI Art Frame", "Bot", "Home Climate Panel", "Remote", "remote with screen"]
|
|
247
247
|
};
|
|
248
248
|
DEVICE_TYPE_NORMALIZATION_MAP = {
|
|
249
|
-
// --- node-switchbot
|
|
249
|
+
// --- node-switchbot v4 normalization additions ---
|
|
250
250
|
"hub mini": "Hub Mini",
|
|
251
251
|
"hub 3": "Hub 3",
|
|
252
252
|
"keypad": "Keypad",
|
|
253
|
-
// node-switchbot beta
|
|
254
253
|
"plug mini": "Plug Mini (US)",
|
|
255
254
|
// fallback to US if region not specified
|
|
256
255
|
"art frame": "AI Art Frame",
|
|
@@ -259,13 +258,11 @@ var init_device_types = __esm({
|
|
|
259
258
|
// alias for new lock vision
|
|
260
259
|
"lock pro": "Smart Lock Pro",
|
|
261
260
|
"lock lite": "Lock Lite",
|
|
262
|
-
// node-switchbot beta
|
|
263
261
|
"circulator fan": "Circulator Fan",
|
|
264
|
-
// node-switchbot beta
|
|
265
262
|
"smart thermostat radiator": "Smart Radiator Thermostat",
|
|
266
263
|
"climate panel": "Home Climate Panel",
|
|
267
264
|
"evaporative humidifier": "Humidifier",
|
|
268
|
-
// --- end node-switchbot
|
|
265
|
+
// --- end node-switchbot v4 additions ---
|
|
269
266
|
// Only keep the last occurrence for each key, all values canonical
|
|
270
267
|
"air purifier pm2.5": "Air Purifier PM2.5",
|
|
271
268
|
"pan/tilt cam plus 3k": "Pan/Tilt Cam Plus 3K",
|
|
@@ -304,7 +301,6 @@ var init_device_types = __esm({
|
|
|
304
301
|
"rgbicww strip light": "RGBICWW Strip Light",
|
|
305
302
|
"strip light": "Strip Light",
|
|
306
303
|
"strip light 3": "Strip Light 3",
|
|
307
|
-
// node-switchbot beta
|
|
308
304
|
// Vacuum conversions
|
|
309
305
|
"robot vacuum cleaner s1": "Robot Vacuum Cleaner S1",
|
|
310
306
|
"robot vacuum cleaner s1 plus": "Robot Vacuum Cleaner S1 Plus",
|
|
@@ -337,7 +333,7 @@ var init_device_types = __esm({
|
|
|
337
333
|
// Migration mappings for invalid/legacy device types
|
|
338
334
|
"lock vision pro": "Lock Vision Pro",
|
|
339
335
|
// Valid alias; map to canonical
|
|
340
|
-
// 'lock vision': 'Keypad Vision', // Invalid type (removed, now
|
|
336
|
+
// 'lock vision': 'Keypad Vision', // Invalid type (removed, now alias above)
|
|
341
337
|
"lock touch": "Keypad Touch",
|
|
342
338
|
// Invalid type
|
|
343
339
|
// Additional normalization for new/unknown types from logs
|