{ "packageName": "Levoit Air Purifiers, Humidifiers, and Fans", "description": "Drivers for Levoit air purifiers, humidifiers, and fans via the VeSync cloud API.", "author": "Dan Cox (level99 fork); Niklas Gustafsson (original upstream)", "version": "2.6", "minimumHEVersion": "2.3.2", "dateReleased": "2026-05-22", "releaseNotes": "2.6 - Bug-fix release with three breaking changes worth checking your automations against. **BREAKING (all 9 humidifiers):** setMistLevel(0) now turns the device off (previously kept it running at the lowest level). Update dashboard sliders / Rule Machine actions that call setMistLevel(0) expecting the device to stay on. **BREAKING (Core line, Sprout Air, Sprout Humidifier, Sup6000S):** on/off attributes (childLock, display, lightDetection, dryingEnabled) now always store \"on\"/\"off\" — Rule Machine conditions or external integrations comparing against \"true\"/\"1\"/\"yes\" must change to \"on\". **BREAKING (Core 300S/400S/600S):** the speed attribute now stores named bands (low/medium/high/max) instead of integer strings — update Rule Machine conditions comparing speed against \"1\"/\"2\"/\"3\"/\"4\". Fixes: Vital 100S/200S resetFilter actually resets the filter now (sent wrong API field since v2.1); Vital setAutoPreference/setRoomSize work again (silently failing since v2.1); EverestAir setTimer/cancelTimer work (silently failing since v2.5); Superior 6000S setDisplay/setMistLevel no longer log \"write failed\" errors when device is in sleep mode (firmware rejects preference writes in sleep); Core 200S setLevel now picks the right speed band for percentages (was always going to high regardless of value); Core 300S/400S/600S setAutoMode falls back to a reasonable room size when the parameter is blank; uppercase \"ON\"/\"OFF\" inputs from Rule Machine or dashboards no longer silently send the opposite command (class-wide fix across 17 setter methods); blank Rule Machine parameter slots on numeric and string commands no longer cause silent failures. Adds airQuality attribute on Core 300S/400S/600S (standard scale, alongside existing aqi/airQualityIndex) and declares it on Vital 100S/200S/Generic for dashboard tile parity.\n2.5 - Calling setSpeed, cycleSpeed, setMistLevel, or setMode on a device that's currently off now turns the device on first instead of silently doing nothing physical. Affects Core 200S/300S/400S/600S, Tower Fan, Pedestal Fan, and the Classic-family humidifiers (Classic 200S/300S, Dual 200S, LV600S, OasisMist 450S). Fixes Core 300S/400S/600S `aqi` attribute reporting null since v2.3 — dashboards and Rule Machine rules using AQI values now work again. Adds setTimer / cancelTimer commands on EverestAir. **BREAKING (Superior 6000S only):** three attributes renamed: `display`→`displayOn`, `autoStopConfig`→`autoStopEnabled`, `autoStopActive`→`autoStopReached`. Rule Machine actions that call `setDisplay` or `setAutoStop` keep working — the COMMAND names didn't change, only the read-side attribute names. What to check: dashboard tiles bound to those attribute names will show null; Rule Machine triggers/conditions that READ those attribute values will never fire; external integrations (Maker API, Home Assistant, Grafana) polling them will get null.\n2.4.2 - Patch release. Fixes a v2.4 packaging bug where Hubitat Package Manager did not install the diagnostic library, so drivers errored on `#include` after install or upgrade. The library now ships as a Hubitat Bundle.\n2.4.1 - Patch release. Fixes a long-standing bug where calling setLevel on a Levoit air purifier (Core 200S/300S/400S/600S, Vital 100S/200S) or fan (Tower, Pedestal) child device while it was off would silently fail to turn the device on (the level was set on the cloud but the physical device stayed off). Affected scenarios: Room Lighting 'Activate' actions configured with Dimmer activation type, dashboard slider tiles set from a fully-off state, and Rule Machine 'Set Level'.\n2.4 - Adds per-device offline detection: every Levoit child exposes a new `online` attribute for Rule Machine alerting and dashboards. Adds `captureDiagnostics()` on every device page for one-click bug-report data capture. Pedestal Fan moves out of preview after live hardware verification — gains child lock and smart cleaning reminder commands. Rule Machine 'Set Level (with duration)' now applies on Levoit dimmers (duration ignored — no hardware fade). Replaces per-poll ERROR log spam for unresponsive devices with one-time INFO plus hourly WARN re-surface. Completes the v2.3 polling self-heal fix for firmware-update edge cases.\n2.3 - Adds six new device drivers (preview): EverestAir Air Purifier (LAP-EL551S, with Turbo mode), OasisMist 1000S Humidifier (LUH-M101S, US + EU), Sprout Air Purifier (LAP-B851S), Sprout Humidifier (LEH-B381S), Classic 200S Humidifier, and LV600S Hub Connect Humidifier (LUH-A603S). Adds child lock, display read-back, auto-off timer, filter-reset, and PM2.5/AQ readings to the Core 200S/300S/400S/600S air purifiers. Adds support for the PlasmaPro 400S-P black (LAP-C401S-KUSR) and UK Pedestal Fan (LPF-R432S-AUK). Polling now self-heals automatically if a device's VeSync configuration changes (firmware update or re-pair) — previously required Save Preferences on the parent.\n2.2.1 - Patch release. Fixes a crash in Resync Equipment that could prevent newly-added Levoit devices from appearing in Hubitat when the package was installed without all optional drivers. Eliminates hourly log spam.\n2.2 - Adds two new humidifier drivers: Levoit LV600S (LUH-A602S, all 6 regional variants) and Levoit Dual 200S (LUH-D301S, all 5 variants). Adds EU region support — EU users can select their VeSync cloud (smartapi.vesync.eu) in parent preferences. Adds RGB color nightlight for the EU OasisMist 450S 4.5L (LUH-O451S-WEU). Closes routing gaps for 6 regional model codes (Vital 200S/Core 200S/Core 300S variants) that previously fell through to the Generic driver. Fixes two reboot-survival bugs: device polling no longer permanently stops after a hub reboot, and debug logging no longer gets stuck on indefinitely after a reboot.\n2.1 - Adds five new drivers: Levoit Vital 100S Air Purifier (LAP-V102S), Levoit Classic 300S Humidifier (LUH-A601S), Levoit OasisMist 450S Smart Humidifier (LUH-O451S/O601S), Levoit Tower Fan (LTF-F422S), and Levoit Pedestal Fan (LPF-R432S).\n2.0 - First community-fork release after Niklas's repo went idle. Adds Levoit Vital 200S Air Purifier and Superior 6000S Humidifier drivers, plus Generic Levoit fall-through diagnostic driver. Parent-driver fix: humidifier polling was silently failing every cycle (wrong API method). Adds connection-pool retry and token-expiry auto re-auth so devices stay connected across long uptimes. Existing Core 200S/300S/400S/600S installs upgrade in place; Vital 200S / Superior 6000S users on prior 'discovered but no data' versions need to re-pick the device Type once.", "documentationLink": "https://github.com/level99/Hubitat-VeSync/blob/main/Drivers/Levoit/readme.md", "communityLink": "https://community.hubitat.com/t/release-levoit-air-purifiers-humidifiers-and-fans/163499", "licenseFile": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/LICENSE", "drivers": [ { "id": "65bbed4f-4075-46ad-a2fc-c148e1af21e4", "name": "VeSync Integration", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/VeSyncIntegration.groovy", "required": true }, { "id": "e55e1532-f00f-407b-ad00-c27077225592", "name": "Levoit Core200S Air Purifier Light", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitCore200S%20Light.groovy", "required": false }, { "id": "4467437a-8850-4a9e-9722-cbf98c984952", "name": "Levoit Core200S Air Purifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitCore200S.groovy", "required": false }, { "id": "9044814e-27d1-498d-a0a8-308f49002467", "name": "Levoit Core300S Air Purifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitCore300S.groovy", "required": false }, { "id": "a9c8ab02-abd9-4956-b000-68331d59f1df", "name": "Levoit Core400S Air Purifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitCore400S.groovy", "required": false }, { "id": "b7d0cbb9-3419-4c5c-8926-a90519ce929f", "name": "Levoit Core600S Air Purifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitCore600S.groovy", "required": false }, { "id": "c4f9d7b3-1a2b-4c8e-9f3a-7e8d4b2a1c5e", "name": "Levoit Vital 200S Air Purifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitVital200S.groovy", "required": false }, { "id": "d8a5e2f1-3c7b-49d6-b1f8-2e9c5a8b4d7a", "name": "Levoit Superior 6000S Humidifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitSuperior6000S.groovy", "required": false }, { "id": "f3a7c1d2-8e4b-4f9a-b2c6-1d5e8a3f9c7b", "name": "Levoit Generic Device", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitGeneric.groovy", "required": false }, { "id": "3520c1fc-eaf1-484f-bbca-3f69416107ae", "name": "Levoit Vital 100S Air Purifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitVital100S.groovy", "required": false }, { "id": "8f66a3e2-be30-4780-9673-16f9ae63e72d", "name": "Levoit Classic 300S Humidifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitClassic300S.groovy", "required": false }, { "id": "274a9cb8-f5e0-4023-9a54-bf02c1701650", "name": "Levoit OasisMist 450S Humidifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitOasisMist450S.groovy", "required": false }, { "id": "db1e032d-cadd-4346-b5fd-5aff254bff96", "name": "Levoit LV600S Humidifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitLV600S.groovy", "required": false }, { "id": "4498037d-0da4-40ad-a587-0a607b76c475", "name": "Levoit Dual 200S Humidifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitDual200S.groovy", "required": false }, { "id": "b2e94f7a-3d1c-4e8b-a6f0-5c7d9e2b1a4f", "name": "Levoit Classic 200S Humidifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitClassic200S.groovy", "required": false }, { "id": "7f3a8c2d-e5b1-4d9a-b7c0-2e6f4a1d8c3b", "name": "Levoit LV600S Hub Connect Humidifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitLV600SHubConnect.groovy", "required": false }, { "id": "a1c7e3f9-2b4d-4a8e-b6f1-9d3c5e7a2b4f", "name": "Levoit OasisMist 1000S Humidifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitOasisMist1000S.groovy", "required": false }, { "id": "3e8b1f5d-7c2a-4d9e-b0f4-6a1c8e3d5b7f", "name": "Levoit Sprout Humidifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitSproutHumidifier.groovy", "required": false }, { "id": "9f4a2e7c-1b6d-4c8f-a3e5-2d0b7f9c4e1a", "name": "Levoit Sprout Air Purifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitSproutAir.groovy", "required": false }, { "id": "2c7a4f1e-8b3d-4e9c-a5f2-6d0b8e4c1a7f", "name": "Levoit EverestAir Air Purifier", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitEverestAir.groovy", "required": false }, { "id": "ca33c74b-ac89-44d5-b9f1-10044c8a520f", "name": "Levoit Tower Fan", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitTowerFan.groovy", "required": false }, { "id": "c83e6eed-bede-4ca6-b265-6cfc91c53400", "name": "Levoit Pedestal Fan", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/LevoitPedestalFan.groovy", "required": false }, { "id": "f3ce4dab-de16-49d8-ac5a-5c29bbb24864", "name": "VeSync Virtual Test Parent", "namespace": "NiklasGustafsson", "location": "https://raw.githubusercontent.com/level99/Hubitat-VeSync/main/Drivers/Levoit/VeSyncIntegrationVirtual.groovy", "required": false } ], "bundles": [ { "id": "769f15db-78ec-451d-9244-94b56597c422", "name": "levoit_libraries", "namespace": "level99", "location": "https://github.com/level99/Hubitat-VeSync/releases/download/v2.6/levoit_libraries.zip", "required": true } ] }