Fix tomorrow.io units... again... (#70029)

This commit is contained in:
Raman Gupta 2022-04-14 12:58:16 -04:00 committed by GitHub
parent c73cf2cf50
commit 60ac53374b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 34 deletions

View file

@ -202,6 +202,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
entry.data[CONF_API_KEY], entry.data[CONF_API_KEY],
entry.data[CONF_LOCATION][CONF_LATITUDE], entry.data[CONF_LOCATION][CONF_LATITUDE],
entry.data[CONF_LOCATION][CONF_LONGITUDE], entry.data[CONF_LOCATION][CONF_LONGITUDE],
unit_system="metric",
session=async_get_clientsession(hass), session=async_get_clientsession(hass),
) )

View file

@ -31,16 +31,14 @@ from homeassistant.const import (
LENGTH_MILES, LENGTH_MILES,
PERCENTAGE, PERCENTAGE,
PRESSURE_HPA, PRESSURE_HPA,
PRESSURE_INHG,
SPEED_METERS_PER_SECOND, SPEED_METERS_PER_SECOND,
SPEED_MILES_PER_HOUR, SPEED_MILES_PER_HOUR,
TEMP_FAHRENHEIT, TEMP_CELSIUS,
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.util import slugify from homeassistant.util import slugify
from homeassistant.util.distance import convert as distance_convert from homeassistant.util.distance import convert as distance_convert
from homeassistant.util.pressure import convert as pressure_convert
from . import TomorrowioDataUpdateCoordinator, TomorrowioEntity from . import TomorrowioDataUpdateCoordinator, TomorrowioEntity
from .const import ( from .const import (
@ -80,7 +78,7 @@ class TomorrowioSensorEntityDescription(SensorEntityDescription):
unit_imperial: str | None = None unit_imperial: str | None = None
unit_metric: str | None = None unit_metric: str | None = None
multiplication_factor: Callable[[float], float] | float | None = None multiplication_factor: Callable[[float], float] | float | None = None
metric_conversion: Callable[[float], float] | float | None = None imperial_conversion: Callable[[float], float] | float | None = None
value_map: Any | None = None value_map: Any | None = None
def __post_init__(self) -> None: def __post_init__(self) -> None:
@ -105,13 +103,13 @@ SENSOR_TYPES = (
TomorrowioSensorEntityDescription( TomorrowioSensorEntityDescription(
key=TMRW_ATTR_FEELS_LIKE, key=TMRW_ATTR_FEELS_LIKE,
name="Feels Like", name="Feels Like",
native_unit_of_measurement=TEMP_FAHRENHEIT, native_unit_of_measurement=TEMP_CELSIUS,
device_class=SensorDeviceClass.TEMPERATURE, device_class=SensorDeviceClass.TEMPERATURE,
), ),
TomorrowioSensorEntityDescription( TomorrowioSensorEntityDescription(
key=TMRW_ATTR_DEW_POINT, key=TMRW_ATTR_DEW_POINT,
name="Dew Point", name="Dew Point",
native_unit_of_measurement=TEMP_FAHRENHEIT, native_unit_of_measurement=TEMP_CELSIUS,
device_class=SensorDeviceClass.TEMPERATURE, device_class=SensorDeviceClass.TEMPERATURE,
), ),
# Data comes in as inHg # Data comes in as inHg
@ -119,9 +117,6 @@ SENSOR_TYPES = (
key=TMRW_ATTR_PRESSURE_SURFACE_LEVEL, key=TMRW_ATTR_PRESSURE_SURFACE_LEVEL,
name="Pressure (Surface Level)", name="Pressure (Surface Level)",
native_unit_of_measurement=PRESSURE_HPA, native_unit_of_measurement=PRESSURE_HPA,
multiplication_factor=lambda val: pressure_convert(
val, PRESSURE_INHG, PRESSURE_HPA
),
device_class=SensorDeviceClass.PRESSURE, device_class=SensorDeviceClass.PRESSURE,
), ),
# Data comes in as BTUs/(hr * ft^2) # Data comes in as BTUs/(hr * ft^2)
@ -131,7 +126,7 @@ SENSOR_TYPES = (
name="Global Horizontal Irradiance", name="Global Horizontal Irradiance",
unit_imperial=IRRADIATION_BTUS_PER_HOUR_SQUARE_FOOT, unit_imperial=IRRADIATION_BTUS_PER_HOUR_SQUARE_FOOT,
unit_metric=IRRADIATION_WATTS_PER_SQUARE_METER, unit_metric=IRRADIATION_WATTS_PER_SQUARE_METER,
metric_conversion=3.15459, imperial_conversion=(1 / 3.15459),
), ),
# Data comes in as miles # Data comes in as miles
TomorrowioSensorEntityDescription( TomorrowioSensorEntityDescription(
@ -139,8 +134,8 @@ SENSOR_TYPES = (
name="Cloud Base", name="Cloud Base",
unit_imperial=LENGTH_MILES, unit_imperial=LENGTH_MILES,
unit_metric=LENGTH_KILOMETERS, unit_metric=LENGTH_KILOMETERS,
metric_conversion=lambda val: distance_convert( imperial_conversion=lambda val: distance_convert(
val, LENGTH_MILES, LENGTH_KILOMETERS val, LENGTH_KILOMETERS, LENGTH_MILES
), ),
), ),
# Data comes in as miles # Data comes in as miles
@ -149,8 +144,8 @@ SENSOR_TYPES = (
name="Cloud Ceiling", name="Cloud Ceiling",
unit_imperial=LENGTH_MILES, unit_imperial=LENGTH_MILES,
unit_metric=LENGTH_KILOMETERS, unit_metric=LENGTH_KILOMETERS,
metric_conversion=lambda val: distance_convert( imperial_conversion=lambda val: distance_convert(
val, LENGTH_MILES, LENGTH_KILOMETERS val, LENGTH_KILOMETERS, LENGTH_MILES
), ),
), ),
TomorrowioSensorEntityDescription( TomorrowioSensorEntityDescription(
@ -164,8 +159,10 @@ SENSOR_TYPES = (
name="Wind Gust", name="Wind Gust",
unit_imperial=SPEED_MILES_PER_HOUR, unit_imperial=SPEED_MILES_PER_HOUR,
unit_metric=SPEED_METERS_PER_SECOND, unit_metric=SPEED_METERS_PER_SECOND,
metric_conversion=lambda val: distance_convert(val, LENGTH_MILES, LENGTH_METERS) imperial_conversion=lambda val: distance_convert(
/ 3600, val, LENGTH_METERS, LENGTH_MILES
)
* 3600,
), ),
TomorrowioSensorEntityDescription( TomorrowioSensorEntityDescription(
key=TMRW_ATTR_PRECIPITATION_TYPE, key=TMRW_ATTR_PRECIPITATION_TYPE,
@ -183,20 +180,16 @@ SENSOR_TYPES = (
multiplication_factor=convert_ppb_to_ugm3(48), multiplication_factor=convert_ppb_to_ugm3(48),
device_class=SensorDeviceClass.OZONE, device_class=SensorDeviceClass.OZONE,
), ),
# Data comes in as ug/ft^3
TomorrowioSensorEntityDescription( TomorrowioSensorEntityDescription(
key=TMRW_ATTR_PARTICULATE_MATTER_25, key=TMRW_ATTR_PARTICULATE_MATTER_25,
name="Particulate Matter < 2.5 μm", name="Particulate Matter < 2.5 μm",
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
multiplication_factor=3.2808399**3,
device_class=SensorDeviceClass.PM25, device_class=SensorDeviceClass.PM25,
), ),
# Data comes in as ug/ft^3
TomorrowioSensorEntityDescription( TomorrowioSensorEntityDescription(
key=TMRW_ATTR_PARTICULATE_MATTER_10, key=TMRW_ATTR_PARTICULATE_MATTER_10,
name="Particulate Matter < 10 μm", name="Particulate Matter < 10 μm",
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
multiplication_factor=3.2808399**3,
device_class=SensorDeviceClass.PM10, device_class=SensorDeviceClass.PM10,
), ),
# Data comes in as ppb # Data comes in as ppb
@ -360,15 +353,15 @@ class BaseTomorrowioSensorEntity(TomorrowioEntity, SensorEntity):
if desc.multiplication_factor is not None: if desc.multiplication_factor is not None:
state = handle_conversion(state, desc.multiplication_factor) state = handle_conversion(state, desc.multiplication_factor)
# If an imperial unit isn't provided, we always want to convert to metric since # If there is an imperial conversion needed and the instance is using imperial,
# that is what the UI expects # apply the conversion logic.
if ( if (
desc.metric_conversion desc.imperial_conversion
and desc.unit_imperial is not None and desc.unit_imperial is not None
and desc.unit_imperial != desc.unit_metric and desc.unit_imperial != desc.unit_metric
and self.hass.config.units.is_metric and not self.hass.config.units.is_metric
): ):
return handle_conversion(state, desc.metric_conversion) return handle_conversion(state, desc.imperial_conversion)
return state return state

View file

@ -146,8 +146,8 @@ async def test_v4_sensor(hass: HomeAssistant) -> None:
check_sensor_state(hass, CO, "0.0") check_sensor_state(hass, CO, "0.0")
check_sensor_state(hass, NO2, "20.08") check_sensor_state(hass, NO2, "20.08")
check_sensor_state(hass, SO2, "4.32") check_sensor_state(hass, SO2, "4.32")
check_sensor_state(hass, PM25, "5.3") check_sensor_state(hass, PM25, "0.15")
check_sensor_state(hass, PM10, "20.13") check_sensor_state(hass, PM10, "0.57")
check_sensor_state(hass, MEP_AQI, "23") check_sensor_state(hass, MEP_AQI, "23")
check_sensor_state(hass, MEP_HEALTH_CONCERN, "good") check_sensor_state(hass, MEP_HEALTH_CONCERN, "good")
check_sensor_state(hass, MEP_PRIMARY_POLLUTANT, "pm10") check_sensor_state(hass, MEP_PRIMARY_POLLUTANT, "pm10")
@ -158,14 +158,14 @@ async def test_v4_sensor(hass: HomeAssistant) -> None:
check_sensor_state(hass, GRASS_POLLEN, "none") check_sensor_state(hass, GRASS_POLLEN, "none")
check_sensor_state(hass, WEED_POLLEN, "none") check_sensor_state(hass, WEED_POLLEN, "none")
check_sensor_state(hass, TREE_POLLEN, "none") check_sensor_state(hass, TREE_POLLEN, "none")
check_sensor_state(hass, FEELS_LIKE, "38.5") check_sensor_state(hass, FEELS_LIKE, "101.3")
check_sensor_state(hass, DEW_POINT, "22.68") check_sensor_state(hass, DEW_POINT, "72.82")
check_sensor_state(hass, PRESSURE_SURFACE_LEVEL, "997.97") check_sensor_state(hass, PRESSURE_SURFACE_LEVEL, "29.47")
check_sensor_state(hass, GHI, "0.0") check_sensor_state(hass, GHI, "0")
check_sensor_state(hass, CLOUD_BASE, "1.19") check_sensor_state(hass, CLOUD_BASE, "0.74")
check_sensor_state(hass, CLOUD_COVER, "100") check_sensor_state(hass, CLOUD_COVER, "100")
check_sensor_state(hass, CLOUD_CEILING, "1.19") check_sensor_state(hass, CLOUD_CEILING, "0.74")
check_sensor_state(hass, WIND_GUST, "5.65") check_sensor_state(hass, WIND_GUST, "12.64")
check_sensor_state(hass, PRECIPITATION_TYPE, "rain") check_sensor_state(hass, PRECIPITATION_TYPE, "rain")