195 lines
6.6 KiB
Python
195 lines
6.6 KiB
Python
"""Schema for float property.
|
|
https://yandex.ru/dev/dialogs/smart-home/doc/concepts/float.html
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from enum import StrEnum
|
|
from typing import Literal, Optional
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
from .base import APIModel
|
|
|
|
|
|
class FloatPropertyInstance(StrEnum):
|
|
"""Instance of a float property.
|
|
https://yandex.ru/dev/dialogs/smart-home/doc/concepts/float-instance.html
|
|
"""
|
|
AMPERAGE = "amperage"
|
|
BATTERY_LEVEL = "battery_level"
|
|
CO2_LEVEL = "co2_level"
|
|
ELECTRICITY_METER = "electricity_meter"
|
|
FOOD_LEVEL = "food_level"
|
|
GAS_METER = "gas_meter"
|
|
HEAT_METER = "heat_meter"
|
|
HUMIDITY = "humidity"
|
|
ILLUMINATION = "illumination"
|
|
METER = "meter"
|
|
PM10_DENSITY = "pm10_density"
|
|
PM1_DENSITY = "pm1_density"
|
|
PM2_5_DENSITY = "pm2.5_density"
|
|
POWER = "power"
|
|
PRESSURE = "pressure"
|
|
TEMPERATURE = "temperature"
|
|
TVOC = "tvoc"
|
|
VOLTAGE = "voltage"
|
|
WATER_LEVEL = "water_level"
|
|
WATER_METER = "water_meter"
|
|
|
|
|
|
class FloatUnit(StrEnum):
|
|
"""Unit used in a float property."""
|
|
|
|
AMPERE = "unit.ampere"
|
|
CUBIC_METER = "unit.cubic_meter"
|
|
GIGACALORIE = "unit.gigacalorie"
|
|
KILOWATT_HOUR = "unit.kilowatt_hour"
|
|
LUX = "unit.illumination.lux"
|
|
MCG_M3 = "unit.density.mcg_m3"
|
|
PERCENT = "unit.percent"
|
|
PPM = "unit.ppm"
|
|
VOLT = "unit.volt"
|
|
WATT = "unit.watt"
|
|
|
|
|
|
class PressureUnit(StrEnum):
|
|
"""Pressure unit."""
|
|
|
|
PASCAL = "unit.pressure.pascal"
|
|
MMHG = "unit.pressure.mmhg"
|
|
ATM = "unit.pressure.atm"
|
|
BAR = "unit.pressure.bar"
|
|
|
|
|
|
class TemperatureUnit(StrEnum):
|
|
"""Temperature unit."""
|
|
|
|
CELSIUS = "unit.temperature.celsius"
|
|
KELVIN = "unit.temperature.kelvin"
|
|
|
|
|
|
class FloatPropertyParameters(APIModel):
|
|
"""Parameters of a float property."""
|
|
|
|
instance: FloatPropertyInstance
|
|
unit: FloatUnit | PressureUnit | TemperatureUnit | None = None
|
|
|
|
@property
|
|
def range(self) -> tuple[int | None, int | None]:
|
|
"""Return value range."""
|
|
return None, None
|
|
|
|
|
|
class FloatPropertyAboveZeroMixin:
|
|
"""Mixin for a property that has value only above zero."""
|
|
|
|
@property
|
|
def range(self) -> tuple[int | None, int | None]:
|
|
"""Return value range."""
|
|
return 0, None
|
|
|
|
|
|
class PercentFloatPropertyParameters(FloatPropertyParameters):
|
|
unit: Literal[FloatUnit.PERCENT] = FloatUnit.PERCENT
|
|
|
|
@property
|
|
def range(self) -> tuple[int | None, int | None]:
|
|
"""Return value range."""
|
|
return 0, 100
|
|
|
|
|
|
class DensityFloatPropertyParameters(FloatPropertyAboveZeroMixin, FloatPropertyParameters):
|
|
unit: Literal[FloatUnit.MCG_M3] = FloatUnit.MCG_M3
|
|
|
|
|
|
class AmperageFloatPropertyParameters(FloatPropertyAboveZeroMixin, FloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.AMPERAGE] = FloatPropertyInstance.AMPERAGE
|
|
unit: Literal[FloatUnit.AMPERE] = FloatUnit.AMPERE
|
|
|
|
|
|
class BatteryLevelFloatPropertyParameters(PercentFloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.BATTERY_LEVEL] = FloatPropertyInstance.BATTERY_LEVEL
|
|
|
|
|
|
class CO2LevelFloatPropertyParameters(FloatPropertyAboveZeroMixin, FloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.CO2_LEVEL] = FloatPropertyInstance.CO2_LEVEL
|
|
unit: Literal[FloatUnit.PPM] = FloatUnit.PPM
|
|
|
|
|
|
class ElectricityMeterFloatPropertyParameters(FloatPropertyAboveZeroMixin, FloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.ELECTRICITY_METER] = FloatPropertyInstance.ELECTRICITY_METER
|
|
unit: Literal[FloatUnit.KILOWATT_HOUR] = FloatUnit.KILOWATT_HOUR
|
|
|
|
|
|
class FoodLevelFloatPropertyParameters(PercentFloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.FOOD_LEVEL] = FloatPropertyInstance.FOOD_LEVEL
|
|
|
|
|
|
class GasMeterFloatPropertyParameters(FloatPropertyAboveZeroMixin, FloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.GAS_METER] = FloatPropertyInstance.GAS_METER
|
|
unit: Literal[FloatUnit.CUBIC_METER] = FloatUnit.CUBIC_METER
|
|
|
|
|
|
class HeatMeterFloatPropertyParameters(FloatPropertyAboveZeroMixin, FloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.HEAT_METER] = FloatPropertyInstance.HEAT_METER
|
|
unit: Literal[FloatUnit.GIGACALORIE] = FloatUnit.GIGACALORIE
|
|
|
|
|
|
class HumidityFloatPropertyParameters(PercentFloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.HUMIDITY] = FloatPropertyInstance.HUMIDITY
|
|
|
|
|
|
class IlluminationFloatPropertyParameters(FloatPropertyAboveZeroMixin, FloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.ILLUMINATION] = FloatPropertyInstance.ILLUMINATION
|
|
unit: Literal[FloatUnit.LUX] = FloatUnit.LUX
|
|
|
|
|
|
class MeterFloatPropertyParameters(FloatPropertyAboveZeroMixin, FloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.METER] = FloatPropertyInstance.METER
|
|
unit: None = Field(default=None)
|
|
|
|
|
|
class PM1DensityFloatPropertyParameters(DensityFloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.PM1_DENSITY] = FloatPropertyInstance.PM1_DENSITY
|
|
|
|
|
|
class PM25DensityFloatPropertyParameters(DensityFloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.PM2_5_DENSITY] = FloatPropertyInstance.PM2_5_DENSITY
|
|
|
|
|
|
class PM10DensityFloatPropertyParameters(DensityFloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.PM10_DENSITY] = FloatPropertyInstance.PM10_DENSITY
|
|
|
|
|
|
class PowerFloatPropertyParameters(FloatPropertyAboveZeroMixin, FloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.POWER] = FloatPropertyInstance.POWER
|
|
unit: Literal[FloatUnit.WATT] = FloatUnit.WATT
|
|
|
|
|
|
class PressureFloatPropertyParameters(FloatPropertyAboveZeroMixin, FloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.PRESSURE] = FloatPropertyInstance.PRESSURE
|
|
unit: PressureUnit
|
|
|
|
|
|
class TemperatureFloatPropertyParameters(FloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.TEMPERATURE] = FloatPropertyInstance.TEMPERATURE
|
|
unit: TemperatureUnit
|
|
|
|
|
|
class TVOCFloatPropertyParameters(DensityFloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.TVOC] = FloatPropertyInstance.TVOC
|
|
|
|
|
|
class VoltageFloatPropertyParameters(FloatPropertyAboveZeroMixin, FloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.VOLTAGE] = FloatPropertyInstance.VOLTAGE
|
|
unit: Literal[FloatUnit.VOLT] = FloatUnit.VOLT
|
|
|
|
|
|
class WaterLevelFloatPropertyParameters(PercentFloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.WATER_LEVEL] = FloatPropertyInstance.WATER_LEVEL
|
|
|
|
|
|
class WaterMeterFloatPropertyParameters(FloatPropertyAboveZeroMixin, FloatPropertyParameters):
|
|
instance: Literal[FloatPropertyInstance.WATER_METER] = FloatPropertyInstance.WATER_METER
|
|
unit: Literal[FloatUnit.CUBIC_METER] = FloatUnit.CUBIC_METER |