python
This commit is contained in:
128
custom_components/yandex_smart_home/unit_conversion.py
Normal file
128
custom_components/yandex_smart_home/unit_conversion.py
Normal file
@@ -0,0 +1,128 @@
|
||||
"""Unit conversion helpers."""
|
||||
|
||||
from enum import StrEnum
|
||||
|
||||
from homeassistant.const import (
|
||||
CONCENTRATION_MICROGRAMS_PER_CUBIC_FOOT,
|
||||
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
||||
CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER,
|
||||
CONCENTRATION_PARTS_PER_BILLION,
|
||||
CONCENTRATION_PARTS_PER_MILLION,
|
||||
)
|
||||
from homeassistant.util.unit_conversion import (
|
||||
_IN_TO_M,
|
||||
_MERCURY_DENSITY,
|
||||
_MM_TO_M,
|
||||
_STANDARD_GRAVITY,
|
||||
BaseUnitConverter,
|
||||
)
|
||||
|
||||
from .schema import PressureUnit, TemperatureUnit
|
||||
|
||||
# EFEKTA iAQ3 (#570)
|
||||
UNIT_OF_MEASUREMENT_VOC_INDEX_POINT = "VOC Index points"
|
||||
|
||||
|
||||
class TVOCConcentrationConverter(BaseUnitConverter):
|
||||
"""Utility to convert TVOC concentration values."""
|
||||
|
||||
UNIT_CLASS = "tvoc"
|
||||
NORMALIZED_UNIT = CONCENTRATION_MICROGRAMS_PER_CUBIC_METER
|
||||
VALID_UNITS = {
|
||||
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
||||
CONCENTRATION_MICROGRAMS_PER_CUBIC_FOOT,
|
||||
CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER,
|
||||
CONCENTRATION_PARTS_PER_MILLION,
|
||||
CONCENTRATION_PARTS_PER_BILLION,
|
||||
UNIT_OF_MEASUREMENT_VOC_INDEX_POINT,
|
||||
}
|
||||
|
||||
# average molecular weight of tVOC = 110 g/mol
|
||||
_UNIT_CONVERSION: dict[str | None, float] = {
|
||||
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER: 1,
|
||||
CONCENTRATION_MICROGRAMS_PER_CUBIC_FOOT: 1 / 35.3146667215,
|
||||
CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER: 1 / 1000,
|
||||
CONCENTRATION_PARTS_PER_MILLION: 1 / 4496.29381184,
|
||||
CONCENTRATION_PARTS_PER_BILLION: 1 / 4.49629381184,
|
||||
UNIT_OF_MEASUREMENT_VOC_INDEX_POINT: 1,
|
||||
}
|
||||
|
||||
|
||||
class UnitOfTemperature(StrEnum):
|
||||
"""Temperature units."""
|
||||
|
||||
CELSIUS = "°C"
|
||||
FAHRENHEIT = "°F"
|
||||
KELVIN = "K"
|
||||
|
||||
@property
|
||||
def as_property_unit(self) -> TemperatureUnit:
|
||||
"""Return value as property unit."""
|
||||
match self:
|
||||
case self.CELSIUS:
|
||||
return TemperatureUnit.CELSIUS
|
||||
case self.KELVIN:
|
||||
return TemperatureUnit.KELVIN
|
||||
|
||||
raise ValueError
|
||||
|
||||
|
||||
class UnitOfPressure(StrEnum):
|
||||
"""Extended pressure units."""
|
||||
|
||||
ATM = "atm"
|
||||
PA = "Pa"
|
||||
HPA = "hPa"
|
||||
KPA = "kPa"
|
||||
BAR = "bar"
|
||||
CBAR = "cbar"
|
||||
MBAR = "mbar"
|
||||
MMHG = "mmHg"
|
||||
INHG = "inHg"
|
||||
PSI = "psi"
|
||||
|
||||
@property
|
||||
def as_property_unit(self) -> PressureUnit:
|
||||
"""Return value as property unit."""
|
||||
match self:
|
||||
case self.PA:
|
||||
return PressureUnit.PASCAL
|
||||
case self.MMHG:
|
||||
return PressureUnit.MMHG
|
||||
case self.ATM:
|
||||
return PressureUnit.ATM
|
||||
case self.BAR:
|
||||
return PressureUnit.BAR
|
||||
|
||||
raise ValueError
|
||||
|
||||
|
||||
class PressureConverter(BaseUnitConverter):
|
||||
"""Utility to convert pressure values."""
|
||||
|
||||
UNIT_CLASS = "pressure"
|
||||
NORMALIZED_UNIT = UnitOfPressure.PA
|
||||
_UNIT_CONVERSION: dict[str | None, float] = {
|
||||
UnitOfPressure.PA: 1,
|
||||
UnitOfPressure.HPA: 1 / 100,
|
||||
UnitOfPressure.KPA: 1 / 1000,
|
||||
UnitOfPressure.BAR: 1 / 100000,
|
||||
UnitOfPressure.CBAR: 1 / 1000,
|
||||
UnitOfPressure.MBAR: 1 / 100,
|
||||
UnitOfPressure.INHG: 1 / (_IN_TO_M * 1000 * _STANDARD_GRAVITY * _MERCURY_DENSITY),
|
||||
UnitOfPressure.PSI: 1 / 6894.757,
|
||||
UnitOfPressure.MMHG: 1 / (_MM_TO_M * 1000 * _STANDARD_GRAVITY * _MERCURY_DENSITY),
|
||||
UnitOfPressure.ATM: 1 / 101325,
|
||||
}
|
||||
VALID_UNITS = {
|
||||
UnitOfPressure.PA,
|
||||
UnitOfPressure.HPA,
|
||||
UnitOfPressure.KPA,
|
||||
UnitOfPressure.BAR,
|
||||
UnitOfPressure.CBAR,
|
||||
UnitOfPressure.MBAR,
|
||||
UnitOfPressure.INHG,
|
||||
UnitOfPressure.PSI,
|
||||
UnitOfPressure.MMHG,
|
||||
UnitOfPressure.ATM,
|
||||
}
|
||||
Reference in New Issue
Block a user