mirror of
https://github.com/home-assistant/core.git
synced 2026-08-28 10:16:02 -05:00
142 lines
3.7 KiB
Python
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
|