Changed
- Requires
philips-airctrl1.3.0 (Pydantic v2 best practices, strict typing withpy.typed, clearer errors when a client is used before it is initialised). There are no behaviour changes for the integration, and 1.3.0 was tested against a live AC4220. - CI runs Pyright in strict mode on every pull request (quality scale
strict-typingis now done). - CI restored to the tinkerologie standard set: a Test job runs the full pytest suite with coverage on every pull request and push, and uploads coverage to Codecov (OIDC, with a tokenless fallback for forks and Dependabot); a Validate workflow runs hassfest and HACS validation; and a Release workflow creates the GitHub release and tag whenever the manifest version changes on
main, using that version's CHANGELOG section as the release notes. - Modernized for Home Assistant 2026.10 and the current Integration Quality Scale: the coordinator receives its config entry explicitly, the reconfigure flow uses Home Assistant's reconfigure helpers, setup and update errors and failed device commands are translated (a failed command now shows "Failed to send command to device at ..." instead of an unknown error), diagnostics no longer use device-registry APIs deprecated in 2026.8, and
quality_scale.yamllists the current rule set with accurate statuses. - Pull requests get path labels and at most one type label,
bugorenhancement, from the shared tinkerologie PR labeler. Dependabot pull requests whose largest update is a patch or minor version merge automatically once the checks and commit statuses on their head commit have finished without a failure (a Codecov check that is still pending is not waited for; a Codecov failure blocks); majors, and pull requests with open review threads, stay for review. - Release workflows hardened (least-privilege job permissions, no expressions in shell scripts, no persisted checkout credentials, no dependency caches); scheduled workflows run on Australia/Brisbane time. LICENSE now contains the complete Apache License 2.0 text.
- Workflow layout tidied after the release hardening (no behaviour change): blank-line layout restored in
ci.yml. - Tinkerologie-Bot governance report updated to v1.4.3: an older run can no longer post a stale report after a newer run passed. Workflow formatting tidied.
- Repository standardised to the tinkerologie layout (STANDARDS.md in tinkerologie/.github): workflows renamed to the standard set (CI, Validate, Release, PR Governance, ...), every action pinned to a commit SHA, shared Dependabot,
.editorconfig,.gitattributesandCODEOWNERSfiles, and organization-wide labels and community files. - Tinkerologie-Bot's comment is now a readable "Pull request checklist": each problem is a numbered heading with plain-English guidance and its items listed underneath, and report updates for a pull request are serialised so an older run can never overwrite a newer one.
- Contribution governance: issues without a
bugorenhancementlabel are labeled automatically when their type can be determined (issues labeledquestion,duplicate,invalid,wontfix, orno-typeare skipped), so CodeRabbit can plan them. Pull requests that conflict with the default branch are labeled, and their authors are notified in a comment. Stale issues and pull requests are labeled after 14 days without activity and closed 30 days later. PR governance now re-validates a human-authored, non-draft PR when a bot such as CodeRabbit edits its description, instead of skipping the check and reporting a pass, only maintainers with write access may useNoneinstead of linking an issue, and a link to an issue that does not exist now fails the check. - Tinkerologie-Bot now posts one comment on pull requests that fail PR governance, listing every problem to fix, and updates it once they are fixed. PR governance runs from the default branch's workflow (
pull_request_target), so a pull request cannot change its own check.
Fixed
- Fixed
ImportErroron setup (e.g.cannot import name 'FanEntityFeature') by importing platform classes and constants from the Home Assistant component packages instead of their.constsubmodules. - AMF870 units with
AWS_Philips_AIR_Combo@86firmware are now handled as push-only: this firmware never answers a status read and only pushes status when something changes, so setup could keep retrying and the device went unavailable whenever it was idle in standby. The integration now briefly changes the display backlight (D0312D, 0/100) to get a status push at setup and on reconnect, then restores the last-known backlight value (the display may flicker briefly), and uses the fixed 30-minute push-only watchdog. The per-device option to turn the watchdog off still applies; the missed-package threshold doesn't apply to push-only models. Existing AMF870 entries pick this up after a restart or reload, with no reconfiguration needed. Thanks to @mbreitkreuz for the detailed analysis (#132). - The
filter_resetandset_child_lockactions accept a target again. Their schemas did not allow the target fields, so Home Assistant rejected every targeted call with "not a valid option at 'entity_id'". A device or area target now sends each purifier the command once, entities of other integrations in a targeted area are ignored, and an invalid entity named directly fails the call before any device is changed. - The actions stay registered after the last purifier is removed or unloaded, instead of disappearing until Home Assistant restarts. Calling them for an unloaded purifier reports an invalid target instead of an unexpected error.
- Repair issue titles and action names are now shown in English instead of raw translation keys (they were missing from
translations/en.json).
Security
- Development tooling only (not shipped in the integration): npm
overridesmovekatexto 0.18 (GHSA-238p-pmpm-9mq7, low) andsmol-tomlto 1.9 (GHSA-r4xh-jqrq-34v2, moderate), both pulled in bymarkdownlint-cli2, whose latest release still pins the vulnerable versions.