Update HomeKit PM2.5 mappings to US AQI (#76358)

This commit is contained in:
Sarabveer Singh 2022-08-08 17:49:07 -04:00 committed by GitHub
parent cefc535edb
commit 01de1c6304
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 20 additions and 31 deletions

View file

@ -56,7 +56,6 @@ from .util import (
convert_to_float,
density_to_air_quality,
density_to_air_quality_pm10,
density_to_air_quality_pm25,
temperature_to_homekit,
)
@ -239,7 +238,7 @@ class PM25Sensor(AirQualitySensor):
if self.char_density.value != density:
self.char_density.set_value(density)
_LOGGER.debug("%s: Set density to %d", self.entity_id, density)
air_quality = density_to_air_quality_pm25(density)
air_quality = density_to_air_quality(density)
if self.char_quality.value != air_quality:
self.char_quality.set_value(air_quality)
_LOGGER.debug("%s: Set air_quality to %d", self.entity_id, air_quality)

View file

@ -400,16 +400,16 @@ def temperature_to_states(temperature: float | int, unit: str) -> float:
def density_to_air_quality(density: float) -> int:
"""Map PM2.5 density to HomeKit AirQuality level."""
if density <= 35:
"""Map PM2.5 µg/m3 density to HomeKit AirQuality level."""
if density <= 12: # US AQI 0-50 (HomeKit: Excellent)
return 1
if density <= 75:
if density <= 35.4: # US AQI 51-100 (HomeKit: Good)
return 2
if density <= 115:
if density <= 55.4: # US AQI 101-150 (HomeKit: Fair)
return 3
if density <= 150:
if density <= 150.4: # US AQI 151-200 (HomeKit: Inferior)
return 4
return 5
return 5 # US AQI 201+ (HomeKit: Poor)
def density_to_air_quality_pm10(density: float) -> int:
@ -425,19 +425,6 @@ def density_to_air_quality_pm10(density: float) -> int:
return 5
def density_to_air_quality_pm25(density: float) -> int:
"""Map PM2.5 density to HomeKit AirQuality level."""
if density <= 25:
return 1
if density <= 50:
return 2
if density <= 100:
return 3
if density <= 300:
return 4
return 5
def get_persist_filename_for_entry_id(entry_id: str) -> str:
"""Determine the filename of the homekit state file."""
return f"{DOMAIN}.{entry_id}.state"

View file

@ -126,7 +126,7 @@ async def test_air_quality(hass, hk_driver):
hass.states.async_set(entity_id, "34")
await hass.async_block_till_done()
assert acc.char_density.value == 34
assert acc.char_quality.value == 1
assert acc.char_quality.value == 2
hass.states.async_set(entity_id, "200")
await hass.async_block_till_done()
@ -205,7 +205,7 @@ async def test_pm25(hass, hk_driver):
hass.states.async_set(entity_id, "23")
await hass.async_block_till_done()
assert acc.char_density.value == 23
assert acc.char_quality.value == 1
assert acc.char_quality.value == 2
hass.states.async_set(entity_id, "34")
await hass.async_block_till_done()
@ -215,12 +215,12 @@ async def test_pm25(hass, hk_driver):
hass.states.async_set(entity_id, "90")
await hass.async_block_till_done()
assert acc.char_density.value == 90
assert acc.char_quality.value == 3
assert acc.char_quality.value == 4
hass.states.async_set(entity_id, "200")
await hass.async_block_till_done()
assert acc.char_density.value == 200
assert acc.char_quality.value == 4
assert acc.char_quality.value == 5
hass.states.async_set(entity_id, "400")
await hass.async_block_till_done()

View file

@ -224,12 +224,15 @@ def test_temperature_to_states():
def test_density_to_air_quality():
"""Test map PM2.5 density to HomeKit AirQuality level."""
assert density_to_air_quality(0) == 1
assert density_to_air_quality(35) == 1
assert density_to_air_quality(35.1) == 2
assert density_to_air_quality(75) == 2
assert density_to_air_quality(115) == 3
assert density_to_air_quality(150) == 4
assert density_to_air_quality(300) == 5
assert density_to_air_quality(12) == 1
assert density_to_air_quality(12.1) == 2
assert density_to_air_quality(35.4) == 2
assert density_to_air_quality(35.5) == 3
assert density_to_air_quality(55.4) == 3
assert density_to_air_quality(55.5) == 4
assert density_to_air_quality(150.4) == 4
assert density_to_air_quality(150.5) == 5
assert density_to_air_quality(200) == 5
async def test_async_show_setup_msg(hass, hk_driver, mock_get_source_ip):