Skip to content
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
16d09d9
Add quality scale for airnow integration
HoffmanEl May 4, 2026
14b7417
Potential fix for pull request finding
HoffmanEl May 4, 2026
0131325
Add quality_scale to airnow manifest
HoffmanEl May 4, 2026
aef1aa9
Fix missing newline at end of manifest.json
HoffmanEl May 4, 2026
9f83309
Remove airnow from hassfest exception lists and clean up manifest
HoffmanEl May 4, 2026
719163b
Declare airnow quality scale as bronze
HoffmanEl May 4, 2026
c759b9d
Add data_description to airnow strings.json for bronze compliance
HoffmanEl May 4, 2026
cd0aee8
Fix missing newline at end of strings.json
HoffmanEl May 4, 2026
de95ddb
Potential fix for pull request finding
HoffmanEl May 4, 2026
294d216
Add data_description for all config flow fields in airnow strings.json
HoffmanEl May 4, 2026
e1c753b
Add Silver/Gold/Platinum sections to airnow quality_scale.yaml
HoffmanEl May 5, 2026
d58b5fc
Fix indentation and missing newline in quality_scale.yaml
HoffmanEl May 5, 2026
5136b20
Fix trailing whitespace and newline at end of quality_scale.yaml
HoffmanEl May 5, 2026
06e2f68
Remove invalid system-health rule from quality_scale.yaml
HoffmanEl May 5, 2026
b9f96d3
Potential fix for pull request finding
HoffmanEl May 5, 2026
ab7549f
Complete quality_scale.yaml with all Silver/Gold/Platinum rules
HoffmanEl May 5, 2026
c924241
Revert strings.json changes - will submit as separate PR
HoffmanEl May 5, 2026
9cc287e
Re-add data_description strings required by existing tests
HoffmanEl May 5, 2026
6dc214e
Add data_description to airnow options flow strings
HoffmanEl May 5, 2026
d2ea1ac
Fix missing newline at end of strings.json
HoffmanEl May 5, 2026
c61aaa3
Potential fix for pull request finding
HoffmanEl May 5, 2026
e9138cf
Update quality scale rules based on code review
HoffmanEl May 5, 2026
87773a0
Fix quality scale rules and revert strings per reviewer feedback
HoffmanEl May 11, 2026
3461349
Merge branch 'dev' of https://github.com/home-assistant/core into add…
HoffmanEl May 11, 2026
48c82cd
Add data_description to airnow options flow strings
HoffmanEl May 11, 2026
4ec3d88
Add comment to entity-device-class about ozone sensor
HoffmanEl May 11, 2026
ed8690b
Trigger CI rerun
HoffmanEl May 11, 2026
66397b4
Remove quality_scale from manifest - not yet at bronze tier
HoffmanEl May 11, 2026
0f459c9
Add airnow back to INTEGRATIONS_WITHOUT_SCALE
HoffmanEl May 11, 2026
b55ea18
Fix missing comma in INTEGRATIONS_WITHOUT_SCALE
HoffmanEl May 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions homeassistant/components/airnow/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@
"integration_type": "service",
"iot_class": "cloud_polling",
"loggers": ["pyairnow"],
"quality_scale": "bronze",
"requirements": ["pyairnow==1.3.1"]
}
65 changes: 65 additions & 0 deletions homeassistant/components/airnow/quality_scale.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
rules:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As a sidenote, maybe it'd make sense to migrate it to use subentries, like for example waqi. But this is optional, just wanted to put it out there

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another sidenote, a lot of the variables defined in async_setup_entry in the __init__.py are put into the coordinator, but they all originate from entry, which is also passed in. I think you could make that cleaner by just fetching all you need in the coordinator itself

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can consider removing that entity/device removal

# Bronze
action-setup:
status: exempt
comment: Integration does not register custom actions.
appropriate-polling:
status: done
comment: Reports are polled every 30 minutes so newly published hourly AirNow reports are picked up promptly.
brands: done
common-modules: done
config-flow-test-coverage: done

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test_form -> stale docstring and test name

That test should also test the unique id of the created entry

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In general I would recommend to reuse result as a variable

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For test_form_invalid_auth, test_form_cannot_connect, test_form_empty_result, test_form_unexpected -> We should make sure these test finish in CREATE_ENTRY by repatching the library to succeed. This way we test that the flow is able to recover. We can parametrize these tests to deduplicate them

config-flow: done

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please revert the strings from this PR and set this to todo

dependency-transparency: done
docs-actions:
status: exempt
comment: Integration does not register custom actions.
docs-high-level-description: done
docs-installation-instructions: done
docs-removal-instructions: done
entity-event-setup:
status: exempt
comment: Integration does not subscribe to events.
entity-unique-id: done
has-entity-name: done
runtime-data: done
test-before-configure: done
test-before-setup: done
unique-config-entry: done
# Silver
action-exceptions: todo
config-entry-unloading: done
docs-configuration-parameters: todo
docs-installation-parameters: todo
entity-unavailable: todo
integration-owner: todo
log-when-unavailable: todo
parallel-updates: done
reauthentication-flow: todo
test-coverage: todo

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sidenote, we should try and patch the library where we use it, instead of patching internals like _get

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we fake the timezone in the diagnostic test?

# Gold
devices: todo
Comment on lines +38 to +41

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you have devices

diagnostics: done
discovery: todo
discovery-update-info: todo
docs-data-update: todo
docs-examples: todo
docs-known-limitations: todo
docs-supported-devices: todo
docs-supported-functions: todo
docs-troubleshooting: todo
docs-use-cases: todo
dynamic-devices: todo
entity-category: todo
entity-device-class: todo

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's add to the comment in the file that you can still use ozone

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am wondering if we can split the extra state attributes for AQI into separate entities in the future

entity-disabled-by-default: todo
entity-translations: todo
exception-translations: todo
icon-translations: todo
reconfiguration-flow: todo
stale-devices: todo
repair-issues: todo
# Platinum
async-dependency: todo

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it looks like it's async

inject-websession: todo

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it can take a websession

strict-typing: todo
3 changes: 3 additions & 0 deletions homeassistant/components/airnow/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@
"init": {
"data": {
"radius": "Station radius (miles)"
},
"data_description": {
"radius": "The radius in miles around your location to search for reporting stations."
Comment on lines 48 to +51
}
}
}
Expand Down
2 changes: 0 additions & 2 deletions script/hassfest/quality_scale.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,6 @@ class Rule:
"aftership",
"agent_dvr",
"airly",
"airnow",
"airq",
"airthings",
"airthings_ble",
Expand Down Expand Up @@ -1094,7 +1093,6 @@ class Rule:
"aftership",
"agent_dvr",
"airly",
"airnow",
"airq",
"airthings",
"airthings_ble",
Expand Down