This commit is contained in:
Victor Alexandrovich Tsyrenschikov
2026-03-30 20:25:42 +05:00
parent 139f9f1bd2
commit 373ed28445
2449 changed files with 53602 additions and 0 deletions

View 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,
}