Skip to content
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ pip install pyvesync
6. OasisMist 1000S
7. Superior 6000S
8. Sprout Humidifier
9. Superior Studio Smart 450S

### Levoit Fans

Expand Down Expand Up @@ -542,6 +543,12 @@ if __name__ == "__main__":

If you would like to request a new device to be added to the library, please open an issue on GitHub. Be sure to include the device model number and a link to the product page. If you are able to provide packet captures or are willing to share the device temporarily, please indicate that in the issue. See the [Packet Capturing for New Device Support](https://webdjoe.github.io/pyvesync/latest/development/capturing) document for more details.

For humidifiers that use the `bypassV2` API, the [dump_humidifier_status.py](./testing_scripts/dump_humidifier_status.py) script can often provide enough information without a packet capture. It logs the raw device list entry and the `getHumidifierStatus` response for any device type, even one not yet in the device map, and writes a redacted JSON file that can be attached to the issue:

```bash
python testing_scripts/dump_humidifier_status.py --email <email> --password <password> --filter <model, e.g. S451S>
```

## Contributing

All [contributions](https://webdjoe.github.io/pyvesync/latest/development/contributing) are welcome.
Expand Down
10 changes: 10 additions & 0 deletions docs/development/capturing.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@ The process outlined below is time consuming and can be difficult. An alternativ

Please do not post a device request without being willing to either capture packets or share the device.

## Quick alternative for humidifiers

Most recent humidifiers use the `bypassV2` API with a `getHumidifierStatus` method. For these devices the `testing_scripts/dump_humidifier_status.py` script can often provide enough information to add basic support without a packet capture. It logs in, prints the raw device list entry (including the exact `deviceType` and `configModule`), calls `getHumidifierStatus` directly for any device type matching `--filter`, and writes a redacted JSON dump:

```bash
python testing_scripts/dump_humidifier_status.py --email <email> --password <password> --filter S451S
```

Attach the resulting `vesync_dump.json` to the issue. A packet capture is still needed to confirm the request payloads for set methods (mode names, level ranges) if they differ from the device's existing class.

## Prerequisites

1. **Mumu Emulator**: Download and install the Mumu Android emulator from [Mumu Player](https://www.mumuplayer.com/). This emulator allows you to run Android apps on your computer. Other emulators may work, but Mumu is known to be compatible with Arm64 apk's and allows `adb root` access.
Expand Down
2 changes: 2 additions & 0 deletions docs/supported_devices.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ The VeSync API supports a variety of devices. The following is a list of devices
- [OasisMist 4.5L Humidifier][pyvesync.devices.vesynchumidifier.VeSyncHumid200300S]
- [OasisMist 1000S Humidifier][pyvesync.devices.vesynchumidifier.VeSyncHumid1000S]
- [Superior 6000S][pyvesync.devices.vesynchumidifier.VeSyncSuperior6000S] - 6L Smart Humidifier
- [Superior Studio Smart 450S][pyvesync.devices.vesynchumidifier.VeSyncSuperior6000S] - 4.5L Evaporative Humidifier
- [Sprout Humidifier][pyvesync.devices.vesynchumidifier.VeSyncSproutHumid]
6. Fans
- [42" Tower Fan][pyvesync.devices.vesyncfan.VeSyncTowerFan]
Expand Down Expand Up @@ -99,6 +100,7 @@ these methods are used.
| LV600S | | | ✔ |
| OasisMist 4.5L | | ✔ | ✔ |
| Superior 6000S | | | ✔ |
| Superior Studio 450S | | | ✔ |
| Sprout Humidifier | | | |

The OasisMist 4.5L (`LUH-O451S-WEU`) exposes an RGB nightlight through
Expand Down
2 changes: 2 additions & 0 deletions src/pyvesync/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -651,6 +651,7 @@ class HumidifierModes(Features):
SLEEP: Sleep mode.
TURBO: Turbo mode.
PET: Pet mode.
FAN: Fan only mode (evaporative humidifiers, no humidification).
UNKNOWN: Unknown mode.
AUTOPRO: AutoPro mode.
"""
Expand All @@ -661,6 +662,7 @@ class HumidifierModes(Features):
SLEEP = 'sleep'
TURBO = 'turbo'
PET = 'pet'
FAN = 'fan'
UNKNOWN = 'unknown'


Expand Down
17 changes: 17 additions & 0 deletions src/pyvesync/device_map.py
Original file line number Diff line number Diff line change
Expand Up @@ -789,6 +789,23 @@ class ThermostatMap(DeviceMapTemplate):
model_name='Superior 6000S',
setup_entry='LEH-S601S',
),
HumidifierMap(
class_name='VeSyncSuperior6000S',
dev_types=['LEH-S451S-WUS', 'LEH-S451S-WUSR', 'LEH-S451S-WEU', 'LEH-S451S-WEUR'],
features=[HumidifierFeatures.DRYING_MODE, HumidifierFeatures.AUTO_STOP],
mist_modes={
HumidifierModes.AUTO: 'autoPro',
HumidifierModes.SLEEP: 'sleep',
HumidifierModes.MANUAL: 'manual',
HumidifierModes.FAN: 'fan',
},
# virtualLevel 1-34 (maxFanLevel); mistLevel 1-3 is the coarse fan band
mist_levels=list(range(1, 35)),
device_alias='Superior Studio 450S',
model_display='LEH-S451S Series',
model_name='Superior Studio Smart 450S',
setup_entry='LEH-S451S',
),
HumidifierMap(
class_name='VeSyncSproutHumid',
dev_types=['LEH-B381S-WUS', 'LEH-B381S-WEU'],
Expand Down
16 changes: 9 additions & 7 deletions src/pyvesync/models/humidifier_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,13 +173,15 @@ class Superior6000SResult(InnerHumidifierBaseResult):
autoStopState: int
screenSwitch: int
screenState: int
scheduleCount: int
timerRemain: int
errorCode: int
autoPreference: int
childLockSwitch: int
filterLifePercent: int
temperature: int
scheduleCount: int = 0
timerRemain: int = 0
errorCode: int = 0
autoPreference: int = 0
childLockSwitch: int = 0
filterLifePercent: int = 0
temperature: int = 0
runningError: int = 0
exceptionType: int = 0
dryingMode: DryingModeModel | None = None


Expand Down
Loading
Loading