From eb1ea72498b176ff2868d6a2865e2538c0990d58 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 24 Oct 2026 08:30:28 -0500 Subject: [PATCH] fix: resolve the OpenAPI deviceType names for locks and other devices The OpenAPI reports these device types under names DEVICE_CLASS_MAP did not have, so the device was never created for OpenAPI users: - Smart Lock, Smart Lock Pro, Smart Lock Pro Wifi, Smart Lock Ultra - Air Purifier VOC, Air Purifier Table PM2.5, Air Purifier Table VOC - Smart Radiator Thermostat, Home Climate Panel - Standing Fan, Battery Circulator Fan 2 Pro - RGBIC Neon Rope Light, AI Art Frame, Hub Names are taken from the SwitchBotAPI device pages. Cameras, Video Doorbell, AI MindClip, Kata Friends, WeatherStation, Permanent Outdoor Lights and RGBICWW Ceiling Light have no device class yet and stay unmapped. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01TYWa2RXoWsaUTWh76oNv8s --- src/settings.ts | 15 +++++++++++++++ test/types/device-type-resolution.test.ts | 23 +++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/settings.ts b/src/settings.ts index ff0cb5ba..543bf419 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -308,6 +308,11 @@ export const DEVICE_CLASS_MAP: Record = { 'Lock Lite': 'WoSmartLockLite', 'Lock Pro': 'WoSmartLockPro', 'Lock Pro WiFi': 'WoSmartLockProWiFi', + // OpenAPI deviceType names (SwitchBotAPI device pages) + 'Smart Lock': 'WoSmartLock', + 'Smart Lock Pro': 'WoSmartLockPro', + 'Smart Lock Pro Wifi': 'WoSmartLockProWiFi', + 'Smart Lock Ultra': 'WoSmartLockPro', 'Lock Vision': 'WoSmartLockVision', 'Lock Vision Pro': 'WoSmartLockVisionPro', 'Keypad': 'WoKeypad', @@ -332,6 +337,7 @@ export const DEVICE_CLASS_MAP: Record = { 'RGBICWW Floor Lamp': 'WoRGBICWWFloorLamp', 'SwitchBot RGBICWW Floor Lamp': 'WoRGBICWWFloorLamp', 'Art Frame': 'WoArtFrame', + 'AI Art Frame': 'WoArtFrame', 'SwitchBot Art Frame': 'WoArtFrame', // S1 and S1 Plus use the original start/stop/dock OpenAPI commands, unlike the S10/S20 'Robot Vacuum Cleaner S1': 'WoVacuum', @@ -359,17 +365,25 @@ export const DEVICE_CLASS_MAP: Record = { 'WoLinkMatter': 'WoHubMiniMatter', 'SwitchBot HubMini Matter': 'WoHubMiniMatter', 'Hub Plus': 'WoHub2', + 'Hub': 'WoHub2', 'Remote': 'WoRemote', 'Battery Circulator Fan': 'WoCirculatorFan', 'Circulator Fan': 'WoCirculatorFan', + 'Battery Circulator Fan 2 Pro': 'WoCirculatorFan', + 'Standing Fan': 'WoCirculatorFan', 'USB Circulator Fan': 'WoCirculatorFan', 'Smart Thermostat Radiator': 'WoSmartThermostatRadiator', + 'Smart Radiator Thermostat': 'WoSmartThermostatRadiator', 'Thermostat Radiator': 'WoSmartThermostatRadiator', 'Radiator Thermostat': 'WoSmartThermostatRadiator', 'Climate Panel': 'WoClimatePanel', + 'Home Climate Panel': 'WoClimatePanel', 'Smart Climate Panel': 'WoClimatePanel', 'Air Purifier': 'WoAirPurifier', 'Air Purifier Table': 'WoAirPurifierTable', + 'Air Purifier VOC': 'WoAirPurifier', + 'Air Purifier Table PM2.5': 'WoAirPurifierTable', + 'Air Purifier Table VOC': 'WoAirPurifierTable', 'Water Leak Detector': 'WoLeak', 'Presence Sensor': 'WoPresence', 'Relay Switch 1PM': 'WoRelaySwitch1PM', @@ -383,6 +397,7 @@ export const DEVICE_CLASS_MAP: Record = { 'K10+': 'WoVacuumK10Plus', 'K10+ Pro': 'WoVacuumK10Pro', 'RGBIC Neon Wire Rope Light': 'WoRGBICNeonWireRopeLight', + 'RGBIC Neon Rope Light': 'WoRGBICNeonWireRopeLight', 'Candle Warmer Lamp': 'WoCandleWarmerLamp', 'Pan/Tilt Cam Plus 3K': 'WoPanTiltCamPlus3K', 'remote with screen': 'WoRemoteWithScreen', diff --git a/test/types/device-type-resolution.test.ts b/test/types/device-type-resolution.test.ts index 12478796..27849402 100644 --- a/test/types/device-type-resolution.test.ts +++ b/test/types/device-type-resolution.test.ts @@ -53,3 +53,26 @@ describe('resolveDeviceClassName', () => { } }) }) + +// OpenAPI deviceType values from the SwitchBotAPI device pages. These had no class, so the +// device was never created for OpenAPI users (every lock, for example). +describe('openAPI deviceType names', () => { + it.each([ + ['Smart Lock', 'WoSmartLock'], + ['Smart Lock Pro', 'WoSmartLockPro'], + ['Smart Lock Pro Wifi', 'WoSmartLockProWiFi'], + ['Smart Lock Ultra', 'WoSmartLockPro'], + ['Air Purifier VOC', 'WoAirPurifier'], + ['Air Purifier Table PM2.5', 'WoAirPurifierTable'], + ['Air Purifier Table VOC', 'WoAirPurifierTable'], + ['Smart Radiator Thermostat', 'WoSmartThermostatRadiator'], + ['Home Climate Panel', 'WoClimatePanel'], + ['Standing Fan', 'WoCirculatorFan'], + ['Battery Circulator Fan 2 Pro', 'WoCirculatorFan'], + ['RGBIC Neon Rope Light', 'WoRGBICNeonWireRopeLight'], + ['AI Art Frame', 'WoArtFrame'], + ['Hub', 'WoHub2'], + ])('resolves %s', (apiType, className) => { + expect(resolveDeviceClassName(apiType)).toBe(className) + }) +})