Skip to content

Bug: Air Purifier PM2.5 (W5302300 / WoAirPurifier) — BLE parseAdvertising returns null (Advertisement:null), serviceData missing essentials; OpenAPI lacks PM2.5/AQ #319

@martinshreder

Description

@martinshreder

Describe the Bug

@switchbot/homebridge-switchbot v4.3.11 discovers my SwitchBot “Air Purifier PM2.5” (model W5302300, BLE model +, modelName WoAirPurifier) and Noble is poweredOn and starts scanning. However, during scanning the plugin repeatedly reports Advertisement: null and logs:
[parseAdvertising.*] return null, model "*" not available!
even while filtering by the purifier’s MAC and model. Immediately afterwards, the accessory logs that serviceData is missing essential properties (serviceData only contains {model:"+", modelName:"WoAirPurifier"}), BLE connection fails, and the plugin falls back to OpenAPI. OpenAPI status for this device does not include PM2.5/AirQuality telemetry, so HomeKit values remain 0/undefined.

This still happens after the fix in PR #1334 .

If you can tell me how to obtain the raw manufacturerData/serviceData dump, I can attach it to this ticket.

To Reproduce

1.	Configure purifier with BLE/OpenAPI and correct deviceId/MAC.
2.	Restart the SwitchBot child bridge.
3.	Observe logs.

Expected Behavior

BLE status should parse correctly (or GATT read should succeed) so HomeKit gets PM2.5/AirQuality/RotationSpeed/etc.

Relevant Log Output

[2/17/2026, 8:30:37 PM] Homebridge v1.11.2 (HAP v0.14.1) (SwitchBot Bridge) is running on port 49575.
[2/17/2026, 8:30:37 PM] [SwitchBot] [DEBUG] Noble powered on
[2/17/2026, 8:30:37 PM] [SwitchBot] [DEBUG] Started Scanning for SwitchBot BLE devices.
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Advertisement: null
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Filter ID: 
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Filter Model: 
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Advertisement: null
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Filter ID: 
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Filter Model: 
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] [parseAdvertising.*] return null, model "*" not available!
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Advertisement: null
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Filter ID: 
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Filter Model: 
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] [parseAdvertising.*] return null, model "*" not available!
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Advertisement: null
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Filter ID: 
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Filter Model: 
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Got devices: {"statusCode":100,"body":{"deviceList":[{"deviceId":"3C8427768CFE","deviceName":"Purifier 1","deviceType":"Air Purifier PM2.5","enableCloudService":true,"hubDeviceId":""},{"deviceId":"94A9905B06BE","deviceName":"Purifier 2","deviceType":"Air Purifier PM2.5","enableCloudService":true,"hubDeviceId":""}],"infraredRemoteList":[]},"message":"success"}
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] statusCode: 200
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] response: {"statusCode":100,"body":{"deviceList":[{"deviceId":"3C8427768CFE","deviceName":"Purifier 1","deviceType":"Air Purifier PM2.5","enableCloudService":true,"hubDeviceId":""},{"deviceId":"94A9905B06BE","deviceName":"Purifier 2","deviceType":"Air Purifier PM2.5","enableCloudService":true,"hubDeviceId":""}],"infraredRemoteList":[]},"message":"success"}
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] SwitchBot Device Config Set: [{"configDeviceName":"AP01","deviceId":"3C8427768CFE","hide_device":false,"configDeviceType":"Air Purifier PM2.5","connectionType":"BLE/OpenAPI","disablePlatformBLE":false,"allowPush":true,"disableCaching":true,"maxRetry":5,"maxRetries":5,"delayBetweenRetries":3,"offline":false,"firmware":"2.5","external":false,"logging":"debug","refreshRate":360,"pushRate":360}]
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] SwitchBot Devices: [{"deviceId":"3C8427768CFE","deviceName":"Purifier 1","deviceType":"Air Purifier PM2.5","enableCloudService":true,"hubDeviceId":"","configDeviceName":"AP01","hide_device":false,"configDeviceType":"Air Purifier PM2.5","connectionType":"BLE/OpenAPI","disablePlatformBLE":false,"allowPush":true,"disableCaching":true,"maxRetry":5,"maxRetries":5,"delayBetweenRetries":3,"offline":false,"firmware":"2.5","external":false,"logging":"debug","refreshRate":360,"pushRate":360}]
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Discovered Air Purifier PM2.5: 3C8427768CFE
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Device: Purifier 1 registerDevice: true
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Device: Purifier 1 connectionType: BLE/OpenAPI, will display in HomeKit
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 Using Device Config Logging: debug
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 Using Device Config refreshRate: 360, Platform Config updateRate: 5, Device Config pushRate: 360
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 Using Device Max Retries: 5
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 Using Device Delay Between Retries: 3000
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 Using Default scanDuration: 5
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 Config: {"logging":"debug","refreshRate":360,"maxRetry":5,"connectionType":"BLE/OpenAPI","maxRetries":5,"delayBetweenRetries":3}
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 Model: W5302300, BLE Model: +, BLE Model Name: WoAirPurifier, BLE Model Friendly Name: undefined
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 Firmware Version: 2.5
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 version: 2.5
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 Using Default MQTT URL: , Default mqttOptions: {}, Default mqttPubOptions: {}
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 Retrieve initial values and update Homekit
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 BLERefreshStatus
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 Registering Webhook Event Handler
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 is not listening webhook.
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 Registering Platform BLE Event Handler
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 registerPlatformBLE
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 is listening to Platform BLE.
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 bleMac: 3c:84:27:76:8c:fe
[2/17/2026, 8:30:38 PM] [SwitchBot] Restoring existing accessory from cache: AP01 deviceId: 3C8427768CFE
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 'node-switchbot' found: {
  "_events": {},
  "_eventsCount": 1,
  "nobleInitialized": {},
  "noble": {
    "_events": {},
    "_eventsCount": 3,
    "_address": "unknown",
    "_state": "poweredOn",
    "_initialized": true,
    "_bindings": {
      "_events": {},
      "_eventsCount": 25
    },
    "_discoveredPeripherals": {},
    "_peripherals": {},
    "_services": {
      "b5a002d72b6db451ce45016e0f8b8de9": {},
      "72137d3f28c64921cdff3e088a6f61f4": {}
    },
    "_characteristics": {
      "b5a002d72b6db451ce45016e0f8b8de9": {},
      "72137d3f28c64921cdff3e088a6f61f4": {}
    },
    "_descriptors": {
      "b5a002d72b6db451ce45016e0f8b8de9": {},
      "72137d3f28c64921cdff3e088a6f61f4": {}
    },
    "_allowDuplicates": true
  }
}
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5 uuid: 3C8427768CFE-Air Purifier PM2.5, (123666ab-578a-4fc1-bd7c-0adb3cad3b9f)
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 bleMac: 3c:84:27:76:8c:fe
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 Scanning for deviceID: 3c:84:27:76:8c:fe Model: + ModelName: WoAirPurifier...
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Started Scanning for SwitchBot BLE devices.
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Advertisement: null
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Filter ID: 3c:84:27:76:8c:fe
[2/17/2026, 8:30:38 PM] [SwitchBot] [DEBUG] Filter Model: +
[2/17/2026, 8:30:42 PM] [SwitchBot] [DEBUG] [parseAdvertising.*] return null, model "*" not available!
... Repeating ...
[2/17/2026, 8:30:43 PM] [SwitchBot] Air Purifier PM2.5: AP01 serviceData is missing essential properties, serviceData: {"model":"+","modelName":"WoAirPurifier"}
[2/17/2026, 8:30:43 PM] [SwitchBot] Air Purifier PM2.5: AP01 wasn't able to establish BLE Connection, node-switchbot: [object Object]
[2/17/2026, 8:30:43 PM] [SwitchBot] Air Purifier PM2.5: AP01 Using OpenAPI Connection to Refresh Status
[2/17/2026, 8:30:43 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 openAPIRefreshStatus
[2/17/2026, 8:30:43 PM] [SwitchBot] [DEBUG] Stopped Scanning for SwitchBot BLE devices.
[2/17/2026, 8:30:43 PM] [SwitchBot] [DEBUG] Got device status: 3C8427768CFE
[2/17/2026, 8:30:43 PM] [SwitchBot] [DEBUG] statusCode: 200
[2/17/2026, 8:30:43 PM] [SwitchBot] [DEBUG] response: {"version":"V2.5","power":"OFF","mode":2,"childLock":0,"hubDeviceId":"3C8427768CFE","deviceId":"3C8427768CFE","deviceType":"Air Purifier PM2.5"}
[2/17/2026, 8:30:43 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 statusCode: undefined, deviceStatus: {"version":"V2.5","power":"OFF","mode":2,"childLock":0,"hubDeviceId":"3C8427768CFE","deviceId":"3C8427768CFE","deviceType":"Air Purifier PM2.5"}
[2/17/2026, 8:30:43 PM] [SwitchBot] [DEBUG] Air Purifier PM2.5: AP01 statusCode: undefined, deviceStatus: {"version":"V2.5","power":"OFF","mode":2,"childLock":0,"hubDeviceId":"3C8427768CFE","deviceId":"3C8427768CFE","deviceType":"Air Purifier PM2.5"}

Config for homebridge-switchbot

{
    "name": "SwitchBot",
    "credentials": {
        "token": "REDACTED",
        "secret": "REDACTED",
        "notice": "Keep your Token & Secret a secret!"
    },
    "options": {
        "devices": [
            {
                "configDeviceName": "AP01",
                "deviceId": "3C8427768CFE",
                "hide_device": false,
                "configDeviceType": "Air Purifier PM2.5",
                "connectionType": "BLE/OpenAPI",
                "disablePlatformBLE": false,
                "allowPush": true,
                "disableCaching": true,
                "maxRetry": 5,
                "maxRetries": 5,
                "delayBetweenRetries": 3,
                "offline": false,
                "firmware": "2.5",
                "external": false,
                "logging": "debug",
                "refreshRate": 360,
                "pushRate": 360
            }
        ],
},
    "_bridge": {
        "name": "SwitchBot Bridge",
        "username": "0E:E4:A6:06:87:0A",
        "port": 49575,
        "manufacturer": "MSR Productions",
        "firmwareRevision": "0.1",
        "model": "1.0.1"
    },
    "platform": "SwitchBot"
}

Screenshots

I also find it odd that Air Purifier series of devices are missing in the SwitchBot Device Settings UI:
Image

Device and Model

Air Purifier PM2.5 Model: W5302300

Node.js Version

v20.19.6

NPM Version

v10.8.2

Homebridge Version

v1.11.2

Homebridge Switchbot Plugin Version

v4.3.11

Homebridge Config UI X Plugin Version

v5.17.0

Operating System

macOS Tahoe 26.3

Metadata

Metadata

Labels

bugSomething isn't workingpinned

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions