Skip to content

chore(deps): raise aiohttp minimum to 3.14.4 - #573

Merged
webdjoe merged 1 commit into
webdjoe:devfrom
cdnninja:claude/aiohttp-floor
Nov 5, 2026
Merged

webdjoe merged 1 commit into
webdjoe:devfrom
cdnninja:claude/aiohttp-floor

Conversation

@cdnninja

Copy link
Copy Markdown
Contributor

aiohttp>=3.8.1 still allows releases with published security advisories. 3.14.4 is the oldest release with none listed on PyPI, and it matches what Home Assistant already ships (3.14.5).

Claude-Session: https://claude.ai/code/session_01CxGYP1MF5XktdJeS1hyNaf

Description

Type of change

  • Bug fix (fix:)
  • New feature or device support (feat:)
  • Documentation (docs:)
  • Refactor / test / chore (no functional change)

Checklist

  • This PR is a single feature, fix, or edit (not a bundle of unrelated changes).
  • The change follows the intended architecture (base class → device + API mixin → device map; state in DeviceState; models in models/; constants in pyvesync.const).
  • No API request/response fields were invented — all come from a real packet capture.
  • ruff check, pylint, mypy, and pytest pass locally.
  • Tests added/updated and API fixtures written (pytest --write_api) where relevant.
  • Documentation updated if behavior or public API changed.

Real-hardware verification

  • Tested on the physical device.
    • Model: ____
    • Firmware version: ____
  • Not applicable (explain why): ____
  • I do not own the device; a packet capture is provided / the device has been shared with a maintainer for verification.

aiohttp>=3.8.1 still allows releases with published security
advisories. 3.14.4 is the oldest release with none listed on PyPI,
and it matches what Home Assistant already ships (3.14.5).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CxGYP1MF5XktdJeS1hyNaf
@webdjoe
webdjoe force-pushed the claude/aiohttp-floor branch from af9ceda to 4b42c46 Compare November 5, 2026 03:28
@webdjoe
webdjoe merged commit 830b506 into webdjoe:dev Nov 5, 2026
6 checks passed
webdjoe added a commit that referenced this pull request Nov 5, 2026
## Description

Releases pyvesync 3.5.0 from `dev` to `master`. Merging publishes to
PyPI and deploys the docs.

**Main changes:** air fryer support is rewritten around a single
`VeSyncFryer` interface, with new Cosori models added. New devices and
fixes for outlets, humidifiers and the thermostat are also included.
**CS137/CS158 air fryer users have breaking changes, listed below.**

### New features and devices

- **Air fryers (#503):** a common interface for cooking, chambers,
presets, temperature limits and units.
- New models: CAF-DC601S TurboBlaze, CAF-P583S Dual Blaze (KUS and KEU),
CAF-TF101S, CAF-TF102S and CAF-DC111S-AEU Turbo Tower Pro.
- A failed or unreadable response now leaves the fryer's state
unchanged, and a refused command returns `False`.
- **WYLDR16A1081 smart plug (#508):** uses `VeSyncBSDOGPlug` without
energy history.
- This adds `OutletFeatures.ENERGY_HISTORY` and
`supports_energy_history`. Weekly, monthly and yearly energy requests
now do nothing on outlets without the flag.
- **RGB nightlight for LUH-O451S-WEU (#502):** adds
`set_rgb_nightlight()` and `supports_rgb_nightlight`.

### Breaking changes

For CS137/CS158 air fryers:

| 3.4.2 | 3.5.0 |
| --- | --- |
| `cook(set_temp, set_time)` (minutes) | `set_mode(cook_time,
cook_temp)` (seconds) |
| `set_preheat(target_temp, cook_time)` | `set_mode(cook_time,
cook_temp, preheat_time=...)` |
| `pause()` | `stop()` |
| `check_status()` | `update()` |
| `state.is_resumable` | `state.can_resume` |
| `state.remaining_time` | `state.total_time_remaining` |
| `state.is_heating` | `state.is_preheating` |
| `state.cook_status` as a string | `AirFryerCookStatus` |

- `AirFryer158138State` is removed; use `FryerState`.
- The device map `setup_entry` changes from `CS137-AF/CS158-AF` to
`CS158-AF`.
- `toggle_switch()` on air fryers is deprecated and sends no request,
because they have no on/off command.

Other changes that may affect you:

- The minimum `aiohttp` version rises from 3.8.1 to 3.14.4 (#573),
because older releases have published security advisories.
- `VeSync.save_credentials(None)` now saves to the configured token
file, or to `.vesync_auth` in the working directory if none is set. It
used to do nothing (#503).

### Fixes

- **Sprout Humidifier LEH-B381S:** `set_nightlight_brightness()` and
`toggle_nightlight()` now call the API instead of the base-class stub,
and toggling no longer sends a null brightness (#528).
- **Aura thermostat:** details processing read `supportMode` from the
dataclass instead of the response instance (#555).
- **Unknown API error codes:** `last_response` and logs now keep the
API's code and message (#582).
- **Device discovery:** a device whose class raises `VeSyncError` during
setup is skipped with a warning, so it no longer stops discovery of the
others (#503).
- **`update_all_devices()`:** errors other than `VeSyncError` are now
logged with a traceback instead of being dropped (#503).
- **Test suite:** the event loop is closed in teardown, preventing a
file descriptor leak (#514).

### Docs, tooling and CI

- **Contribution docs (#572):**
  - Adds `AGENTS.md`, a PR template and issue forms.
  - Rewrites the contribution guides.
  - Refreshes the README and docs.
- **Python and mypy (#574):**
  - CI and tox now test Python 3.14.
  - mypy targets Python 3.11.
  - Removes the unused `python-dateutil` from `requirements.txt`.
- **Ruff and pre-commit:**
- `ruff` is pinned to 0.15.21 in `pyproject.toml` and
`requirements-dev.txt`, and `ERA001` is enforced (#503).
  - The pre-commit hooks move to mypy v2.4.1 and ruff v0.17.3 (#498).
- **GitHub Actions:** `actions/checkout` moves to v7 (#527) and
`actions/setup-python` to v7 (#534).

### Known issues

- **RGB nightlight:** the API can return stale values for several
minutes after a change, and the timeout added to handle this isn't fully
reliable. Minimum brightness is 40% (#502).
- **`save_credentials()` docstring:** it still says "If None, no action
is taken", which is no longer true.
- **Ruff versions:** the pre-commit hook (v0.17.3) doesn't match the
pinned version (0.15.21).

## Type of change

- [ ] Bug fix (`fix:`)
- [ ] New feature or device support (`feat:`)
- [ ] Documentation (`docs:`)
- [x] Refactor / test / chore (no functional change): release PR. The
functional changes were reviewed in the PRs linked above.

## Checklist

- [ ] This PR is a **single** feature, fix, or edit. This is a release
PR, so it combines the PRs above.
- [x] The change follows the intended architecture (base class → device
+ API mixin → device map; state in `DeviceState`; models in `models/`;
constants in `pyvesync.const`).
- [ ] No API request/response fields were invented. Not checked because
some models have no capture: see "Mapped or inferred without a capture"
below.
- [x] `ruff check`, `pylint`, `mypy`, and `pytest` pass locally: 613
passed, 3 skipped on Python 3.12; pylint 10/10.
- [x] Tests added/updated and API fixtures written (`pytest
--write_api`) where relevant.
- [x] Documentation updated if behavior or public API changed.

## Real-hardware verification

- [ ] Tested on the physical device. Partial; status by model:

| Model | Status | Firmware | Source |
| --- | --- | --- | --- |
| CAF-P583S-KUS | Tested: remote start and stop, status polling, 11
presets | v1.0.15 | #517, #503 |
| LTM-A401S-WUS | Tested | 1.0.60 | #555 |
| LUH-O451S-WEU | Tested | `____` | #502 |
| LEH-B381S | Tested by the reporter | `____` | #528 |
| WYLDR16A1081 | Not stated in the PR | `____` | #508 |
| CS137-AF / CS158-AF | Not recorded | `____` | #503 |
| CAF-DC601S | Not recorded | `____` | #503 |
| CAF-TF101S | Not recorded | `____` | #503 |
| CAF-TF102S | Pending | `____` | #503 |
| CAF-DC111S-AEU | Pending | `____` | #503, #581 |
| CAF-P583S-KEU | Pending | `____` | #503 |

Mapped or inferred without a capture:

- **CAF-TF102S:** mapped from the VeSync app; there is no capture.
- **CAF-DC111S-AEU:** status captures come from #536. Cook and end
requests have not been tested on the device.
- **CAF-P583S-KEU:** there is no capture. It is assumed to match the
KUS, apart from using Celsius.
- **CAF-TF101S:** there is no capture with `readyStart` false, so its
`COOKING` status after a cook starts is inferred from the CS158
captures.

- [ ] Not applicable (explain why): `____`
- [ ] I do not own the device; a packet capture is provided / the device
has been shared with a maintainer for verification.
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.

2 participants