mirror of
https://github.com/python-kasa/python-kasa.git
synced 2025-04-26 08:36:22 +00:00

Some checks failed
CI / Perform linting checks (3.13) (push) Has been cancelled
CodeQL checks / Analyze (python) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.11) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.12) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.13) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.11) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.12) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.13) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.11) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.12) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.13) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.11) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.12) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.13) (push) Has been cancelled
## [0.10.0](https://github.com/python-kasa/python-kasa/tree/0.10.0) (2025-01-26) [Full Changelog](https://github.com/python-kasa/python-kasa/compare/0.9.1...0.10.0) **Release summary:** This release brings support for many new devices, including completely new device types: - Support for Tapo robot vacuums. Special thanks to @steveredden, @MAXIGAMESSUPPER, and veep60 for helping to get this implemented! - Support for hub attached cameras and doorbells (H200) - Improved support for hubs (including pairing & better chime controls) - Support for many new camera and doorbell device models, including C220, C720, D100C, D130, and D230 Many thanks to testers and new contributors - @steveredden, @DawidPietrykowski, @Obbay2, @andrewome, @ryenitcher and @etmmvdp! **Breaking changes:** - `uses_http` is now a readonly property of device config. Consumers that relied on `uses_http` to be persisted with `DeviceConfig.to_dict()` will need to store the value separately. - `is_color`, `is_dimmable`, `is_variable_color_temp`, `valid_temperate_range`, and `has_effects` attributes from the `Light` module are deprecated, consumers should use `has_feature("hsv")`, `has_feature("brightness")`, `has_feature("color_temp")`, `get_feature("color_temp").range`, and `Module.LightEffect in dev.modules` respectively. Calling the deprecated attributes will emit a `DeprecationWarning` and type checkers will fail them. - `alarm_volume` on the `smart.Alarm` module is changed from `str` to `int` **Breaking changes:** - Make uses\_http a readonly property of device config [\#1449](https://github.com/python-kasa/python-kasa/pull/1449) (@sdb9696) - Allow passing alarm parameter overrides [\#1340](https://github.com/python-kasa/python-kasa/pull/1340) (@rytilahti) - Deprecate legacy light module is\_capability checks [\#1297](https://github.com/python-kasa/python-kasa/pull/1297) (@sdb9696) **Implemented enhancements:** - Expose more battery sensors for D230 [\#1451](https://github.com/python-kasa/python-kasa/issues/1451) - dumping HTTP POST Body for Tapo Vacuum \(RV30 Plus\) [\#937](https://github.com/python-kasa/python-kasa/issues/937) - Add common alarm interface [\#1479](https://github.com/python-kasa/python-kasa/pull/1479) (@sdb9696) - Add common childsetup interface [\#1470](https://github.com/python-kasa/python-kasa/pull/1470) (@sdb9696) - Add childsetup module to smartcam hubs [\#1469](https://github.com/python-kasa/python-kasa/pull/1469) (@sdb9696) - Add smartcam pet detection toggle module [\#1465](https://github.com/python-kasa/python-kasa/pull/1465) (@DawidPietrykowski) - Only log one warning per unknown clean error code and status [\#1462](https://github.com/python-kasa/python-kasa/pull/1462) (@rytilahti) - Add childlock module for vacuums [\#1461](https://github.com/python-kasa/python-kasa/pull/1461) (@rytilahti) - Add ultra mode \(fanspeed = 5\) for vacuums [\#1459](https://github.com/python-kasa/python-kasa/pull/1459) (@rytilahti) - Add setting to change carpet clean mode [\#1458](https://github.com/python-kasa/python-kasa/pull/1458) (@rytilahti) - Add setting to change clean count [\#1457](https://github.com/python-kasa/python-kasa/pull/1457) (@rytilahti) - Add mop module [\#1456](https://github.com/python-kasa/python-kasa/pull/1456) (@rytilahti) - Enable dynamic hub child creation and deletion on update [\#1454](https://github.com/python-kasa/python-kasa/pull/1454) (@sdb9696) - Expose current cleaning information [\#1453](https://github.com/python-kasa/python-kasa/pull/1453) (@rytilahti) - Add battery module to smartcam devices [\#1452](https://github.com/python-kasa/python-kasa/pull/1452) (@sdb9696) - Allow update of camera modules after setting values [\#1450](https://github.com/python-kasa/python-kasa/pull/1450) (@sdb9696) - Update hub children on first update and delay subsequent updates [\#1438](https://github.com/python-kasa/python-kasa/pull/1438) (@sdb9696) - Add support for doorbells and chimes [\#1435](https://github.com/python-kasa/python-kasa/pull/1435) (@steveredden) - Implement vacuum dustbin module \(dust\_bucket\) [\#1423](https://github.com/python-kasa/python-kasa/pull/1423) (@rytilahti) - Allow https for klaptransport [\#1415](https://github.com/python-kasa/python-kasa/pull/1415) (@rytilahti) - Add smartcam child device support for smartcam hubs [\#1413](https://github.com/python-kasa/python-kasa/pull/1413) (@sdb9696) - Add powerprotection module [\#1337](https://github.com/python-kasa/python-kasa/pull/1337) (@rytilahti) - Add vacuum speaker controls [\#1332](https://github.com/python-kasa/python-kasa/pull/1332) (@rytilahti) - Add consumables module for vacuums [\#1327](https://github.com/python-kasa/python-kasa/pull/1327) (@rytilahti) - Add ADC Value to PIR Enabled Switches [\#1263](https://github.com/python-kasa/python-kasa/pull/1263) (@ryenitcher) - Add support for cleaning records [\#945](https://github.com/python-kasa/python-kasa/pull/945) (@rytilahti) - Initial support for vacuums \(clean module\) [\#944](https://github.com/python-kasa/python-kasa/pull/944) (@rytilahti) - Add support for pairing devices with hubs [\#859](https://github.com/python-kasa/python-kasa/pull/859) (@rytilahti) **Fixed bugs:** - TP-Link HS300 Wi-Fi Power-Strip - "Parent On/Off" not functioning. [\#637](https://github.com/python-kasa/python-kasa/issues/637) - Convert carpet\_clean\_mode to carpet\_boost switch [\#1486](https://github.com/python-kasa/python-kasa/pull/1486) (@rytilahti) - Change category for empty dustbin feature from Primary to Config [\#1485](https://github.com/python-kasa/python-kasa/pull/1485) (@rytilahti) - Report 0 for instead of None for zero current and voltage [\#1483](https://github.com/python-kasa/python-kasa/pull/1483) (@ryenitcher) - Disable iot camera creation until more complete [\#1480](https://github.com/python-kasa/python-kasa/pull/1480) (@sdb9696) - ssltransport: use debug logger for sending requests [\#1443](https://github.com/python-kasa/python-kasa/pull/1443) (@rytilahti) - Fix discover cli command with host [\#1437](https://github.com/python-kasa/python-kasa/pull/1437) (@sdb9696) - Fallback to is\_low for batterysensor's battery\_low [\#1420](https://github.com/python-kasa/python-kasa/pull/1420) (@rytilahti) - Fix iot strip turn on and off from parent [\#639](https://github.com/python-kasa/python-kasa/pull/639) (@Obbay2) **Added support for devices:** - Add D130\(US\) 1.0 1.1.9 fixture [\#1476](https://github.com/python-kasa/python-kasa/pull/1476) (@sdb9696) - Add D100C\(US\) 1.0 1.1.3 fixture [\#1475](https://github.com/python-kasa/python-kasa/pull/1475) (@sdb9696) - Add C220\(EU\) 1.0 1.2.2 camera fixture [\#1466](https://github.com/python-kasa/python-kasa/pull/1466) (@DawidPietrykowski) - Add D230\(EU\) 1.20 1.1.19 fixture [\#1448](https://github.com/python-kasa/python-kasa/pull/1448) (@sdb9696) - Add fixture for C720 camera [\#1433](https://github.com/python-kasa/python-kasa/pull/1433) (@steveredden) **Project maintenance:** - Update ruff to 0.9 [\#1482](https://github.com/python-kasa/python-kasa/pull/1482) (@sdb9696) - Cancel in progress CI workflows after new pushes [\#1481](https://github.com/python-kasa/python-kasa/pull/1481) (@sdb9696) - Update test framework to support smartcam device discovery. [\#1477](https://github.com/python-kasa/python-kasa/pull/1477) (@sdb9696) - Add error code 7 for clean module [\#1474](https://github.com/python-kasa/python-kasa/pull/1474) (@rytilahti) - Enable CI workflow on PRs to feat/ fix/ and janitor/ [\#1471](https://github.com/python-kasa/python-kasa/pull/1471) (@sdb9696) - Add commit-hook to prettify JSON files [\#1455](https://github.com/python-kasa/python-kasa/pull/1455) (@rytilahti) - Add required sphinx.configuration [\#1446](https://github.com/python-kasa/python-kasa/pull/1446) (@rytilahti) - Add more redactors for smartcams [\#1439](https://github.com/python-kasa/python-kasa/pull/1439) (@sdb9696) - Add KS230\(US\) 2.0 1.0.11 IOT Fixture [\#1430](https://github.com/python-kasa/python-kasa/pull/1430) (@ZeliardM) - Add tests for dump\_devinfo parent/child smartcam fixture generation [\#1428](https://github.com/python-kasa/python-kasa/pull/1428) (@sdb9696) - Raise errors on single smartcam child requests [\#1427](https://github.com/python-kasa/python-kasa/pull/1427) (@sdb9696)
321 lines
8.0 KiB
Markdown
321 lines
8.0 KiB
Markdown
# Releasing
|
|
|
|
## Requirements
|
|
* [github client](https://github.com/cli/cli#installation)
|
|
* [gitchub_changelog_generator](https://github.com/github-changelog-generator)
|
|
* [github access token](https://github.com/github-changelog-generator/github-changelog-generator#github-token)
|
|
|
|
## Export changelog token
|
|
|
|
```bash
|
|
export CHANGELOG_GITHUB_TOKEN=token
|
|
```
|
|
|
|
## Set release information
|
|
|
|
0.3.5 should always be the previous release as it's the last pyhs100 release in HISTORY.md which is the changelog prior to github release notes.
|
|
|
|
```bash
|
|
export NEW_RELEASE=x.x.x.devx
|
|
```
|
|
|
|
## Normal releases from master
|
|
|
|
### Create a branch for the release
|
|
|
|
```bash
|
|
git checkout master
|
|
git fetch upstream master
|
|
git rebase upstream/master
|
|
git checkout -b release/$NEW_RELEASE
|
|
```
|
|
|
|
### Update the version number
|
|
|
|
```bash
|
|
sed -i "0,/version = /{s/version = .*/version = \"${NEW_RELEASE}\"/}" pyproject.toml
|
|
```
|
|
|
|
### Update dependencies
|
|
|
|
```bash
|
|
uv sync --all-extras
|
|
uv lock --upgrade
|
|
uv sync --all-extras
|
|
```
|
|
|
|
### Update and run pre-commit and tests
|
|
|
|
```bash
|
|
pre-commit autoupdate
|
|
uv run pre-commit run --all-files
|
|
uv run pytest -n auto
|
|
```
|
|
|
|
### Create release summary (skip for dev releases)
|
|
|
|
Write a short and understandable summary for the release. Can include images.
|
|
|
|
#### Create $NEW_RELEASE milestone in github
|
|
|
|
If not already created
|
|
|
|
#### Create new issue linked to the milestone
|
|
|
|
```bash
|
|
gh issue create --label "release-summary" --milestone $NEW_RELEASE --title "$NEW_RELEASE Release Summary" --body "**Release summary:**"
|
|
```
|
|
|
|
You can exclude the --body option to get an interactive editor or go into the issue on github and edit there.
|
|
|
|
#### Close the issue
|
|
|
|
Either via github or:
|
|
|
|
```bash
|
|
gh issue close ISSUE_NUMBER
|
|
```
|
|
|
|
### Generate changelog
|
|
|
|
Configuration settings are in `.github_changelog_generator`
|
|
|
|
#### For pre-release
|
|
|
|
EXCLUDE_TAGS will exclude all dev tags except for the current release dev tags.
|
|
|
|
Regex should be something like this `^((?!0\.7\.0)(.*dev\d))+`. The first match group negative matches on the current release and the second matches on releases ending with dev.
|
|
|
|
```bash
|
|
EXCLUDE_TAGS=${NEW_RELEASE%.dev*}; EXCLUDE_TAGS=${EXCLUDE_TAGS//"."/"\."}; EXCLUDE_TAGS="^((?!"$EXCLUDE_TAGS")(.*dev\d))+"
|
|
echo "$EXCLUDE_TAGS"
|
|
github_changelog_generator --future-release $NEW_RELEASE --exclude-tags-regex "$EXCLUDE_TAGS"
|
|
```
|
|
|
|
#### For production
|
|
|
|
```bash
|
|
github_changelog_generator --future-release $NEW_RELEASE --exclude-tags-regex 'dev\d$'
|
|
```
|
|
|
|
You can ignore warnings about missing PR commits like below as these relate to PRs to branches other than master:
|
|
```
|
|
Warning: PR 908 merge commit was not found in the release branch or tagged git history and no rebased SHA comment was found
|
|
```
|
|
|
|
|
|
### Export new release notes to variable
|
|
|
|
```bash
|
|
export RELEASE_NOTES=$(grep -Poz '(?<=\# Changelog\n\n)(.|\n)+?(?=\#\#)' CHANGELOG.md | tr '\0' '\n' )
|
|
echo "$RELEASE_NOTES" # Check the output and copy paste if neccessary
|
|
```
|
|
|
|
### Commit and push the changed files
|
|
|
|
```bash
|
|
git commit --all --verbose -m "Prepare $NEW_RELEASE"
|
|
git push upstream release/$NEW_RELEASE -u
|
|
```
|
|
|
|
### Create a PR for the release, merge it, and re-fetch the master
|
|
|
|
#### Create the PR
|
|
```
|
|
gh pr create --title "Prepare $NEW_RELEASE" --body "$RELEASE_NOTES" --label release-prep --base master
|
|
```
|
|
|
|
To update the PR after refreshing the changelog:
|
|
|
|
```
|
|
gh pr edit --body "$RELEASE_NOTES"
|
|
```
|
|
|
|
#### Merge the PR once the CI passes
|
|
|
|
Create a squash commit and add the markdown from the PR description to the commit description.
|
|
|
|
```bash
|
|
gh pr merge --squash --body "$RELEASE_NOTES"
|
|
```
|
|
|
|
### Rebase local master
|
|
|
|
```bash
|
|
git checkout master
|
|
git fetch upstream master
|
|
git rebase upstream/master
|
|
```
|
|
|
|
### Create a release tag
|
|
|
|
Note, add changelog release notes as the tag commit message so `gh release create --notes-from-tag` can be used to create a release draft.
|
|
|
|
```bash
|
|
git tag --annotate $NEW_RELEASE -m "$RELEASE_NOTES"
|
|
git push upstream $NEW_RELEASE
|
|
```
|
|
|
|
### Create release
|
|
|
|
#### Pre-releases
|
|
|
|
```bash
|
|
gh release create "$NEW_RELEASE" --verify-tag --notes-from-tag --title "$NEW_RELEASE" --draft --latest=false --prerelease
|
|
|
|
```
|
|
|
|
#### Production release
|
|
|
|
```bash
|
|
gh release create "$NEW_RELEASE" --verify-tag --notes-from-tag --title "$NEW_RELEASE" --draft --latest=true
|
|
```
|
|
|
|
### Manually publish the release
|
|
|
|
Go to the linked URL, verify the contents, and click "release" button to trigger the release CI.
|
|
|
|
## Patch releases
|
|
|
|
This requires git commit signing to be enabled.
|
|
|
|
https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification
|
|
|
|
### Create release branch
|
|
|
|
#### For the first patch release since a new release only
|
|
|
|
```bash
|
|
export NEW_RELEASE=x.x.x.x
|
|
export CURRENT_RELEASE=x.x.x
|
|
```
|
|
|
|
```bash
|
|
git fetch upstream $CURRENT_RELEASE
|
|
git checkout patch
|
|
git fetch upstream patch
|
|
git rebase upstream/patch
|
|
git fetch upstream $CURRENT_RELEASE
|
|
git merge $CURRENT_RELEASE --ff-only
|
|
git push upstream patch -u
|
|
git checkout -b release/$NEW_RELEASE
|
|
```
|
|
|
|
#### For subsequent patch releases
|
|
|
|
```bash
|
|
export NEW_RELEASE=x.x.x.x
|
|
```
|
|
|
|
```bash
|
|
git checkout patch
|
|
git fetch upstream patch
|
|
git rebase upstream/patch
|
|
git checkout -b release/$NEW_RELEASE
|
|
```
|
|
### Cherry pick required commits
|
|
|
|
```bash
|
|
git cherry-pick commitSHA1 -S
|
|
git cherry-pick commitSHA2 -S
|
|
```
|
|
|
|
### Update the version number
|
|
|
|
```bash
|
|
sed -i "0,/version = /{s/version = .*/version = \"${NEW_RELEASE}\"/}" pyproject.toml
|
|
```
|
|
|
|
### Manually edit the changelog
|
|
|
|
github_changlog generator_does not work with patch releases so manually add the section for the new release to CHANGELOG.md.
|
|
|
|
### Export new release notes to variable
|
|
|
|
```bash
|
|
export RELEASE_NOTES=$(grep -Poz '(?<=\# Changelog\n\n)(.|\n)+?(?=\#\#)' CHANGELOG.md | tr '\0' '\n' )
|
|
echo "$RELEASE_NOTES" # Check the output and copy paste if neccessary
|
|
```
|
|
|
|
### Commit and push the changed files
|
|
|
|
```bash
|
|
git commit --all --verbose -m "Prepare $NEW_RELEASE" -S
|
|
git push upstream release/$NEW_RELEASE -u
|
|
```
|
|
|
|
### Create a PR for the release, merge it, and re-fetch patch
|
|
|
|
#### Create the PR
|
|
```
|
|
gh pr create --title "$NEW_RELEASE" --body "$RELEASE_NOTES" --label release-prep --base patch
|
|
```
|
|
|
|
#### Merge the PR once the CI passes
|
|
|
|
Create a **merge** commit and add the markdown from the PR description to the commit description.
|
|
|
|
```bash
|
|
gh pr merge --merge --body "$RELEASE_NOTES"
|
|
```
|
|
|
|
### Rebase local patch
|
|
|
|
```bash
|
|
git checkout patch
|
|
git fetch upstream patch
|
|
git rebase upstream/patch
|
|
```
|
|
|
|
### Create a release tag
|
|
|
|
```bash
|
|
git tag -s --annotate $NEW_RELEASE -m "$RELEASE_NOTES"
|
|
git push upstream $NEW_RELEASE
|
|
```
|
|
|
|
### Create release
|
|
|
|
```bash
|
|
gh release create "$NEW_RELEASE" --verify-tag --notes-from-tag --title "$NEW_RELEASE" --draft --latest=true
|
|
```
|
|
Then go into github, review and release
|
|
|
|
### Merge patch back to master
|
|
|
|
```bash
|
|
git checkout master
|
|
git fetch upstream master
|
|
git rebase upstream/master
|
|
git checkout -b janitor/merge_patch
|
|
git fetch upstream patch
|
|
git merge upstream/patch --no-commit
|
|
# If there are any merge conflicts run the following command which will simply make master win
|
|
# Do not run it if there are no conflicts as it will end up checking out upstream/master
|
|
git diff --name-only --diff-filter=U | xargs git checkout upstream/master
|
|
# Check the diff is as expected
|
|
git diff --staged
|
|
# The only diff should be the version in pyproject.toml and uv.lock, and CHANGELOG.md
|
|
# unless a change made on patch that was not part of a cherry-pick commit
|
|
# If there are any other unexpected diffs `git checkout upstream/master [thefilename]`
|
|
git commit -m "Merge patch into local master" -S
|
|
git push upstream janitor/merge_patch -u
|
|
gh pr create --title "Merge patch into master" --body '' --label release-prep --base master
|
|
```
|
|
|
|
#### Temporarily allow merge commits to master
|
|
|
|
1. Open [repository settings](https://github.com/python-kasa/python-kasa/settings)
|
|
2. From the left select `Rules` > `Rulesets`
|
|
3. Open `master` ruleset, under `Bypass list` select `+ Add bypass`
|
|
4. Check `Repository admin` > `Add selected`, select `Save changes`
|
|
|
|
#### Merge commit the PR
|
|
```bash
|
|
gh pr merge --merge --body ""
|
|
```
|
|
#### Revert allow merge commits
|
|
|
|
1. Under `Bypass list` select `...` next to `Repository admins`
|
|
2. `Delete bypass`, select `Save changes`
|