Skip to content

feat: add Levoit Eleva 300X (LAP-C341S-WUSZ) air purifier support - #546

Open
jordanenglish wants to merge 1 commit into
webdjoe:devfrom
jordanenglish:feature/eleva-300x-support
Open

feat: add Levoit Eleva 300X (LAP-C341S-WUSZ) air purifier support#546
jordanenglish wants to merge 1 commit into
webdjoe:devfrom
jordanenglish:feature/eleva-300x-support

Conversation

@jordanenglish

@jordanenglish jordanenglish commented Aug 24, 2026

Copy link
Copy Markdown

Adds support for the Levoit Eleva 300X Smart Air Purifier (LAP-C341S-WUSZ). Resolves #545.

The Eleva 300X uses the same bypassV2 getPurifierStatus protocol as the Everest Air (LAP-EL551S), so it reuses VeSyncAirBaseV2 without needing a new device class. Its main difference is a separately-tracked activated carbon filter alongside the HEPA filter, which pyvesync didn't have a field for yet.

Commits

  1. Register LAP-C341S-WUSZ in device_map.py - sleep/manual/auto modes, fan levels 1-4 (level 4 is labeled "Turbo" in the app, but is just the top manual speed, not a separate workMode like on the Everest Air), air quality + light detection features.
  2. Add carbon filter tracking - new carbonFilterLifePercent field on PurifierVitalDetailsResult and PurifierState.carbon_filter_life attribute, wired up in VeSyncAirBaseV2._set_state.
  3. Loosen two fields to optional - efficientModeTimeRemain and V2AutoPreferences.roomSize were required on PurifierVitalDetailsResult, but the Eleva 300X's real getPurifierStatus response omits both. Neither field is read anywhere else in the codebase, so this is a safe, backward-compatible loosening.
  4. Test fixtures for LAP-C341S via pytest --write_api.

Tested on

  • LAP-C341S-WUSZ, real account, via direct calls to the same /cloud/v1/deviceManaged/devices and /cloud/v2/deviceManaged/bypassV2 (getPurifierStatus) endpoints the app uses (iOS app cert-pins its traffic, so this was captured by authenticating directly instead of via a MITM proxy).
  • Verified: device list registration, full status parsing (mode, fan level, both filter percentages, air quality, child lock, display, light detection), and live end-to-end against a running Home Assistant instance - fan control, sensors, and filter-life all working correctly.
  • Full test suite passes locally (390 passed), flake8/pylint clean. ruff/mypy have pre-existing failures elsewhere in the repo, unrelated to this change.

Notes

  • The carbon-filter representation (carbon_filter_life as a second top-level attribute, mirroring filter_life) is a judgment call for a device that's the first in the library to track two filters separately - happy to adjust based on maintainer preference.
  • Exposing this as a distinct HA sensor entity needs a follow-up change in home-assistant/core's vesync integration; out of scope here.

🤖 The patches in this PR were authored with assistance from Claude (Anthropic).

Registers the Eleva 300X using the existing VeSyncAirBaseV2 class
(same protocol family as the Everest Air / LAP-EL551S), and adds
support for its separately-tracked activated carbon filter.

- Register LAP-C341S-WUSZ in device_map.py: sleep/manual/auto modes,
  fan levels 1-4 (level 4 is "Turbo" in the app, not a separate mode),
  air quality + light detection features.
- Add carbonFilterLifePercent field and PurifierState.carbon_filter_life
  attribute for the second (HEPA + carbon) filter.
- Make efficientModeTimeRemain and V2AutoPreferences.roomSize optional
  in PurifierVitalDetailsResult - the Eleva 300X's real API response
  omits both fields, which were previously required.
- Add test fixtures for LAP-C341S.

Resolves webdjoe#545

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@jordanenglish
jordanenglish marked this pull request as ready for review August 24, 2026 17:10
HaruIjima-kun pushed a commit to HaruIjima-kun/pyvesync that referenced this pull request Sep 10, 2026
…ds carbon_filter_life state attribute and carbonFilterLifePercentfield, following the same approach as PR webdjoe#546 (jordanenglish) forthe LAP-C341S-WUSZ variant. The Eleva 300X reports this fieldregardless of region.
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 Eleva 300X Smart Air Purifier

1 participant