Skip to content

feat: add support for Levoit Superior Studio Smart 450S (LEH-S451S) - #554

Open
jkriegshauser wants to merge 8 commits into
webdjoe:devfrom
jkriegshauser:feat/superior-studio-450s
Open

jkriegshauser wants to merge 8 commits into
webdjoe:devfrom
jkriegshauser:feat/superior-studio-450s

Conversation

@jkriegshauser

Copy link
Copy Markdown

Summary

Adds support for the Levoit Superior Studio Smart 450S evaporative humidifier (LEH-S451S-WUS, plus -WUSR/-WEU/-WEUR variants). Fixes #540.

Details

  • The 450S uses the same bypassV2 protocol as the Superior 6000S (getHumidifierStatus, setHumidityMode, setVirtualLevel, setDryingMode, setAutoStopSwitch, setChildLock), so it reuses VeSyncSuperior6000S via a new HumidifierMap entry. VeSync's own config module for it is VS_WFON_AHM_LEH-E601S-WUS_US.
  • virtualLevel ranges 1-34 on this model (maxFanLevel: 34), so mist_levels is range(1, 35). mistLevel 1-3 is the coarse fan band.
  • Work modes observed/used: autoPro, sleep, manual.
  • The device reports errorCodes (a list) instead of errorCode. The non-essential fields on Superior6000SResult (scheduleCount, timerRemain, errorCode, autoPreference, childLockSwitch, filterLifePercent, temperature) now default to 0 so the model parses either device. Existing 6000S parsing is unaffected.

Note

I added testing_scripts/dump_humidifier_status.py, which logs the raw device list and getHumidifierStatus result for any device type, including ones not yet in the device map, to make capturing responses for issues easier. The README file also got updated to suggest usage. This was done as a separate commit that can easily be dropped or moved to a separate PR to keep this one clean.

Testing

  • Captured a real getHumidifierStatus response from a US 450S; the test fixture for LEH-S451S mirrors it field for field.
  • Verified in Home Assistant (core vesync integration): power, mode, target humidity, mist level, display, child lock, auto stop, drying mode, humidity/temperature/filter sensors all appear and work.
  • Full test suite: 392 passed, 3 skipped.

Adds a HumidifierMap entry for the Superior Studio Smart 450S evaporative
humidifier (LEH-S451S-WUS and regional variants), reusing the
VeSyncSuperior6000S class since the device shares the Superior family's
bypassV2 protocol (getHumidifierStatus, setHumidityMode, setVirtualLevel,
setDryingMode, etc.).

Fields on Superior6000SResult that are not essential for state parsing
(scheduleCount, timerRemain, errorCode, autoPreference, childLockSwitch,
filterLifePercent, temperature) now default to 0 so a response that omits
any of them still parses instead of dropping the device.

Fixes webdjoe#540
Adds testing_scripts/dump_humidifier_status.py, which logs in, prints the
raw device list, and calls getHumidifierStatus directly for any device
type matching a filter, even one not in the device map. It writes a
redacted JSON dump suitable for attaching to a device request issue.

Documents the script in the testing_scripts README, the packet capturing
guide, and the README device request section.
@jkriegshauser
jkriegshauser force-pushed the feat/superior-studio-450s branch from afe2baa to d263136 Compare October 9, 2026 18:45
The LEH-S451S reports workMode 'fan' (fan only, no humidification). Add
HumidifierModes.FAN and map it for this model so it no longer logs an
unknown mode. Also accept the optional runningError and exceptionType
status fields on the Superior result model.
@jkriegshauser
jkriegshauser force-pushed the feat/superior-studio-450s branch from d263136 to aae1c39 Compare October 9, 2026 18:45

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add support for Levoit Superior Studio Smart 450S (LEH-S451S-WUS)

1 participant