Files

142 lines
3.7 KiB
Python

"""Constants for the Airgradient integration."""
from dataclasses import dataclass
import logging
from airgradient import ApiVersion, Config, PmStandard
DOMAIN = "airgradient"
LOGGER = logging.getLogger(__package__)
PM_STANDARD = {
PmStandard.UGM3: "ugm3",
PmStandard.USAQI: "us_aqi",
}
PM_STANDARD_REVERSE = {v: k for k, v in PM_STANDARD.items()}
CONFIGURATION_CONTROL = "configuration_control"
CO2_ABC = "co2_automatic_baseline_calibration_days"
NOX_LEARNING_OFFSET = "nox_learning_offset"
TVOC_LEARNING_OFFSET = "tvoc_learning_offset"
POST_DATA = "post_data_to_airgradient"
PM_STANDARD_CONFIG = "pm_standard"
TEMPERATURE_UNIT = "temperature_unit"
LED_BAR_MODE = "led_bar_mode"
LED_BAR_BRIGHTNESS = "led_bar_brightness"
DISPLAY_BRIGHTNESS = "display_brightness"
GPS_MODE = "gps_mode"
FRONT_LED_BRIGHTNESS = "front_led_brightness"
BACK_LED_BRIGHTNESS = "back_led_brightness"
TOUCH_LED_INTENSITY = "touch_led_intensity"
BUZZER_ENABLED = "buzzer_enabled"
CLOUD_CONNECTION = "cloud_connection"
CO2_CALIBRATION = "co2_calibration"
LED_BAR_TEST = "led_bar_test"
@dataclass(frozen=True, kw_only=True)
class ModelCapabilities:
"""Configuration and action capabilities for a device model."""
config: frozenset[str]
actions: frozenset[str]
COMMON_LEGACY_CONFIG = frozenset(
{
CONFIGURATION_CONTROL,
CO2_ABC,
NOX_LEARNING_OFFSET,
TVOC_LEARNING_OFFSET,
POST_DATA,
}
)
GO_CONFIG = frozenset(
{
CONFIGURATION_CONTROL,
CO2_ABC,
NOX_LEARNING_OFFSET,
TVOC_LEARNING_OFFSET,
PM_STANDARD_CONFIG,
TEMPERATURE_UNIT,
GPS_MODE,
FRONT_LED_BRIGHTNESS,
BACK_LED_BRIGHTNESS,
TOUCH_LED_INTENSITY,
BUZZER_ENABLED,
CLOUD_CONNECTION,
}
)
MODEL_CAPABILITIES: tuple[tuple[str, ModelCapabilities], ...] = (
(
"I-9PSL",
ModelCapabilities(
config=COMMON_LEGACY_CONFIG
| {
PM_STANDARD_CONFIG,
TEMPERATURE_UNIT,
LED_BAR_MODE,
LED_BAR_BRIGHTNESS,
DISPLAY_BRIGHTNESS,
},
actions=frozenset({CO2_CALIBRATION, LED_BAR_TEST}),
),
),
(
"O-1",
ModelCapabilities(
config=COMMON_LEGACY_CONFIG,
actions=frozenset({CO2_CALIBRATION}),
),
),
(
"DIY",
ModelCapabilities(
config=COMMON_LEGACY_CONFIG
| {
PM_STANDARD_CONFIG,
TEMPERATURE_UNIT,
DISPLAY_BRIGHTNESS,
},
actions=frozenset({CO2_CALIBRATION}),
),
),
(
"P-1PSG",
ModelCapabilities(
config=GO_CONFIG,
actions=frozenset({CO2_CALIBRATION, LED_BAR_TEST}),
),
),
)
def get_model_capabilities(model: str) -> ModelCapabilities | None:
"""Return capabilities for a recognized model."""
for prefix, capabilities in MODEL_CAPABILITIES:
if model.startswith(prefix):
return capabilities
return None
def supports_config(
model: str, api_version: ApiVersion | None, config: Config, capability: str
) -> bool:
"""Return whether a device supports a configuration capability."""
capabilities = get_model_capabilities(model)
if api_version is ApiVersion.V1:
return getattr(config, capability) is not None and (
capabilities is None or capability in capabilities.config
)
return capabilities is not None and capability in capabilities.config
def supports_action(model: str, action: str) -> bool:
"""Return whether a device supports an action."""
capabilities = get_model_capabilities(model)
return capabilities is not None and action in capabilities.actions