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, convert_to_float,
density_to_air_quality, density_to_air_quality,
density_to_air_quality_pm10, density_to_air_quality_pm10,
density_to_air_quality_pm25,
temperature_to_homekit, temperature_to_homekit,
) )
@ -239,7 +238,7 @@ class PM25Sensor(AirQualitySensor):
if self.char_density.value != density: if self.char_density.value != density:
self.char_density.set_value(density) self.char_density.set_value(density)
_LOGGER.debug("%s: Set density to %d", self.entity_id, 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: if self.char_quality.value != air_quality:
self.char_quality.set_value(air_quality) self.char_quality.set_value(air_quality)
_LOGGER.debug("%s: Set air_quality to %d", self.entity_id, 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: def density_to_air_quality(density: float) -> int:
"""Map PM2.5 density to HomeKit AirQuality level.""" """Map PM2.5 µg/m3 density to HomeKit AirQuality level."""
if density <= 35: if density <= 12: # US AQI 0-50 (HomeKit: Excellent)
return 1 return 1
if density <= 75: if density <= 35.4: # US AQI 51-100 (HomeKit: Good)
return 2 return 2
if density <= 115: if density <= 55.4: # US AQI 101-150 (HomeKit: Fair)
return 3 return 3
if density <= 150: if density <= 150.4: # US AQI 151-200 (HomeKit: Inferior)
return 4 return 4
return 5 return 5 # US AQI 201+ (HomeKit: Poor)
def density_to_air_quality_pm10(density: float) -> int: def density_to_air_quality_pm10(density: float) -> int:
@ -425,19 +425,6 @@ def density_to_air_quality_pm10(density: float) -> int:
return 5 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: def get_persist_filename_for_entry_id(entry_id: str) -> str:
"""Determine the filename of the homekit state file.""" """Determine the filename of the homekit state file."""
return f"{DOMAIN}.{entry_id}.state" 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") hass.states.async_set(entity_id, "34")
await hass.async_block_till_done() await hass.async_block_till_done()
assert acc.char_density.value == 34 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") hass.states.async_set(entity_id, "200")
await hass.async_block_till_done() await hass.async_block_till_done()
@ -205,7 +205,7 @@ async def test_pm25(hass, hk_driver):
hass.states.async_set(entity_id, "23") hass.states.async_set(entity_id, "23")
await hass.async_block_till_done() await hass.async_block_till_done()
assert acc.char_density.value == 23 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") hass.states.async_set(entity_id, "34")
await hass.async_block_till_done() await hass.async_block_till_done()
@ -215,12 +215,12 @@ async def test_pm25(hass, hk_driver):
hass.states.async_set(entity_id, "90") hass.states.async_set(entity_id, "90")
await hass.async_block_till_done() await hass.async_block_till_done()
assert acc.char_density.value == 90 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") hass.states.async_set(entity_id, "200")
await hass.async_block_till_done() await hass.async_block_till_done()
assert acc.char_density.value == 200 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") hass.states.async_set(entity_id, "400")
await hass.async_block_till_done() await hass.async_block_till_done()

View File

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