160 lines
7.9 KiB
Python
160 lines
7.9 KiB
Python
"""Constants for the Overkiz (by Somfy) integration."""
|
|
from __future__ import annotations
|
|
|
|
from datetime import timedelta
|
|
import logging
|
|
from typing import Final
|
|
|
|
from pyoverkiz.enums import MeasuredValueType, OverkizCommandParam, UIClass, UIWidget
|
|
|
|
from homeassistant.const import (
|
|
CONCENTRATION_PARTS_PER_BILLION,
|
|
CONCENTRATION_PARTS_PER_MILLION,
|
|
DEGREE,
|
|
LIGHT_LUX,
|
|
PERCENTAGE,
|
|
Platform,
|
|
UnitOfElectricCurrent,
|
|
UnitOfElectricPotential,
|
|
UnitOfEnergy,
|
|
UnitOfIrradiance,
|
|
UnitOfLength,
|
|
UnitOfPower,
|
|
UnitOfPressure,
|
|
UnitOfSpeed,
|
|
UnitOfTemperature,
|
|
UnitOfTime,
|
|
UnitOfVolume,
|
|
UnitOfVolumeFlowRate,
|
|
)
|
|
|
|
DOMAIN: Final = "overkiz"
|
|
LOGGER: logging.Logger = logging.getLogger(__package__)
|
|
|
|
CONF_HUB: Final = "hub"
|
|
DEFAULT_HUB: Final = "somfy_europe"
|
|
|
|
UPDATE_INTERVAL: Final = timedelta(seconds=30)
|
|
UPDATE_INTERVAL_ALL_ASSUMED_STATE: Final = timedelta(minutes=60)
|
|
|
|
PLATFORMS: list[Platform] = [
|
|
Platform.ALARM_CONTROL_PANEL,
|
|
Platform.BINARY_SENSOR,
|
|
Platform.BUTTON,
|
|
Platform.CLIMATE,
|
|
Platform.COVER,
|
|
Platform.LIGHT,
|
|
Platform.LOCK,
|
|
Platform.NUMBER,
|
|
Platform.SCENE,
|
|
Platform.SELECT,
|
|
Platform.SENSOR,
|
|
Platform.SIREN,
|
|
Platform.SWITCH,
|
|
Platform.WATER_HEATER,
|
|
]
|
|
|
|
IGNORED_OVERKIZ_DEVICES: list[UIClass | UIWidget] = [
|
|
UIClass.PROTOCOL_GATEWAY,
|
|
UIClass.POD,
|
|
]
|
|
|
|
# Used to map the Somfy widget and ui_class to the Home Assistant platform
|
|
OVERKIZ_DEVICE_TO_PLATFORM: dict[UIClass | UIWidget, Platform | None] = {
|
|
UIClass.ADJUSTABLE_SLATS_ROLLER_SHUTTER: Platform.COVER,
|
|
UIClass.AWNING: Platform.COVER,
|
|
UIClass.CURTAIN: Platform.COVER,
|
|
UIClass.DOOR_LOCK: Platform.LOCK,
|
|
UIClass.EXTERIOR_SCREEN: Platform.COVER,
|
|
UIClass.EXTERIOR_VENETIAN_BLIND: Platform.COVER,
|
|
UIClass.GARAGE_DOOR: Platform.COVER,
|
|
UIClass.GATE: Platform.COVER,
|
|
UIClass.LIGHT: Platform.LIGHT,
|
|
UIClass.ON_OFF: Platform.SWITCH,
|
|
UIClass.PERGOLA: Platform.COVER,
|
|
UIClass.ROLLER_SHUTTER: Platform.COVER,
|
|
UIClass.SCREEN: Platform.COVER,
|
|
UIClass.SHUTTER: Platform.COVER,
|
|
UIClass.SIREN: Platform.SIREN,
|
|
UIClass.SWIMMING_POOL: Platform.SWITCH,
|
|
UIClass.SWINGING_SHUTTER: Platform.COVER,
|
|
UIClass.VENETIAN_BLIND: Platform.COVER,
|
|
UIClass.WINDOW: Platform.COVER,
|
|
UIWidget.ALARM_PANEL_CONTROLLER: Platform.ALARM_CONTROL_PANEL, # widgetName, uiClass is Alarm (not supported)
|
|
UIWidget.ATLANTIC_ELECTRICAL_HEATER: Platform.CLIMATE, # widgetName, uiClass is HeatingSystem (not supported)
|
|
UIWidget.ATLANTIC_ELECTRICAL_HEATER_WITH_ADJUSTABLE_TEMPERATURE_SETPOINT: Platform.CLIMATE, # widgetName, uiClass is HeatingSystem (not supported)
|
|
UIWidget.ATLANTIC_ELECTRICAL_TOWEL_DRYER: Platform.CLIMATE, # widgetName, uiClass is HeatingSystem (not supported)
|
|
UIWidget.ATLANTIC_HEAT_RECOVERY_VENTILATION: Platform.CLIMATE, # widgetName, uiClass is HeatingSystem (not supported)
|
|
UIWidget.ATLANTIC_PASS_APC_DHW: Platform.WATER_HEATER, # widgetName, uiClass is WaterHeatingSystem (not supported)
|
|
UIWidget.ATLANTIC_PASS_APC_HEATING_AND_COOLING_ZONE: Platform.CLIMATE, # widgetName, uiClass is HeatingSystem (not supported)
|
|
UIWidget.ATLANTIC_PASS_APC_HEATING_ZONE: Platform.CLIMATE, # widgetName, uiClass is HeatingSystem (not supported)
|
|
UIWidget.ATLANTIC_PASS_APC_ZONE_CONTROL: Platform.CLIMATE, # widgetName, uiClass is HeatingSystem (not supported)
|
|
UIWidget.DOMESTIC_HOT_WATER_PRODUCTION: Platform.WATER_HEATER, # widgetName, uiClass is WaterHeatingSystem (not supported)
|
|
UIWidget.DOMESTIC_HOT_WATER_TANK: Platform.SWITCH, # widgetName, uiClass is WaterHeatingSystem (not supported)
|
|
UIWidget.HITACHI_DHW: Platform.WATER_HEATER, # widgetName, uiClass is HitachiHeatingSystem (not supported)
|
|
UIWidget.MY_FOX_ALARM_CONTROLLER: Platform.ALARM_CONTROL_PANEL, # widgetName, uiClass is Alarm (not supported)
|
|
UIWidget.MY_FOX_SECURITY_CAMERA: Platform.SWITCH, # widgetName, uiClass is Camera (not supported)
|
|
UIWidget.RTD_INDOOR_SIREN: Platform.SWITCH, # widgetName, uiClass is Siren (not supported)
|
|
UIWidget.RTD_OUTDOOR_SIREN: Platform.SWITCH, # widgetName, uiClass is Siren (not supported)
|
|
UIWidget.RTS_GENERIC: Platform.COVER, # widgetName, uiClass is Generic (not supported)
|
|
UIWidget.SIREN_STATUS: None, # widgetName, uiClass is Siren (siren)
|
|
UIWidget.SOMFY_THERMOSTAT: Platform.CLIMATE, # widgetName, uiClass is HeatingSystem (not supported)
|
|
UIWidget.STATELESS_ALARM_CONTROLLER: Platform.SWITCH, # widgetName, uiClass is Alarm (not supported)
|
|
UIWidget.STATEFUL_ALARM_CONTROLLER: Platform.ALARM_CONTROL_PANEL, # widgetName, uiClass is Alarm (not supported)
|
|
UIWidget.STATELESS_EXTERIOR_HEATING: Platform.SWITCH, # widgetName, uiClass is ExteriorHeatingSystem (not supported)
|
|
UIWidget.TSKALARM_CONTROLLER: Platform.ALARM_CONTROL_PANEL, # widgetName, uiClass is Alarm (not supported)
|
|
UIWidget.VALVE_HEATING_TEMPERATURE_INTERFACE: Platform.CLIMATE, # widgetName, uiClass is HeatingSystem (not supported)
|
|
}
|
|
|
|
# Map Overkiz camelCase to Home Assistant snake_case for translation
|
|
OVERKIZ_STATE_TO_TRANSLATION: dict[str, str] = {
|
|
OverkizCommandParam.EXTERNAL_GATEWAY: "external_gateway",
|
|
OverkizCommandParam.LOCAL_USER: "local_user",
|
|
OverkizCommandParam.LOW_BATTERY: "low_battery",
|
|
OverkizCommandParam.LSC: "lsc",
|
|
OverkizCommandParam.MAINTENANCE_REQUIRED: "maintenance_required",
|
|
OverkizCommandParam.NO_DEFECT: "no_defect",
|
|
OverkizCommandParam.SAAC: "saac",
|
|
OverkizCommandParam.SFC: "sfc",
|
|
OverkizCommandParam.UPS: "ups",
|
|
}
|
|
|
|
OVERKIZ_UNIT_TO_HA: dict[str, str] = {
|
|
MeasuredValueType.ABSOLUTE_VALUE: "",
|
|
MeasuredValueType.ANGLE_IN_DEGREES: DEGREE,
|
|
MeasuredValueType.ANGULAR_SPEED_IN_DEGREES_PER_SECOND: f"{DEGREE}/{UnitOfTime.SECONDS}",
|
|
MeasuredValueType.ELECTRICAL_ENERGY_IN_KWH: UnitOfEnergy.KILO_WATT_HOUR,
|
|
MeasuredValueType.ELECTRICAL_ENERGY_IN_WH: UnitOfEnergy.WATT_HOUR,
|
|
MeasuredValueType.ELECTRICAL_POWER_IN_KW: UnitOfPower.KILO_WATT,
|
|
MeasuredValueType.ELECTRICAL_POWER_IN_W: UnitOfPower.WATT,
|
|
MeasuredValueType.ELECTRIC_CURRENT_IN_AMPERE: UnitOfElectricCurrent.AMPERE,
|
|
MeasuredValueType.ELECTRIC_CURRENT_IN_MILLI_AMPERE: UnitOfElectricCurrent.MILLIAMPERE,
|
|
MeasuredValueType.ENERGY_IN_CAL: "cal",
|
|
MeasuredValueType.ENERGY_IN_KCAL: "kcal",
|
|
MeasuredValueType.FLOW_IN_LITRE_PER_SECOND: f"{UnitOfVolume.LITERS}/{UnitOfTime.SECONDS}",
|
|
MeasuredValueType.FLOW_IN_METER_CUBE_PER_HOUR: UnitOfVolumeFlowRate.CUBIC_METERS_PER_HOUR,
|
|
MeasuredValueType.FLOW_IN_METER_CUBE_PER_SECOND: f"{UnitOfVolume.CUBIC_METERS}/{UnitOfTime.SECONDS}",
|
|
MeasuredValueType.FOSSIL_ENERGY_IN_WH: UnitOfEnergy.WATT_HOUR,
|
|
MeasuredValueType.GRADIENT_IN_PERCENTAGE_PER_SECOND: f"{PERCENTAGE}/{UnitOfTime.SECONDS}",
|
|
MeasuredValueType.LENGTH_IN_METER: UnitOfLength.METERS,
|
|
MeasuredValueType.LINEAR_SPEED_IN_METER_PER_SECOND: UnitOfSpeed.METERS_PER_SECOND,
|
|
MeasuredValueType.LUMINANCE_IN_LUX: LIGHT_LUX,
|
|
MeasuredValueType.PARTS_PER_BILLION: CONCENTRATION_PARTS_PER_BILLION,
|
|
MeasuredValueType.PARTS_PER_MILLION: CONCENTRATION_PARTS_PER_MILLION,
|
|
MeasuredValueType.PARTS_PER_QUADRILLION: "ppq",
|
|
MeasuredValueType.PARTS_PER_TRILLION: "ppt",
|
|
MeasuredValueType.POWER_PER_SQUARE_METER: UnitOfIrradiance.WATTS_PER_SQUARE_METER,
|
|
MeasuredValueType.PRESSURE_IN_HPA: UnitOfPressure.HPA,
|
|
MeasuredValueType.PRESSURE_IN_MILLI_BAR: UnitOfPressure.MBAR,
|
|
MeasuredValueType.RELATIVE_VALUE_IN_PERCENTAGE: PERCENTAGE,
|
|
MeasuredValueType.TEMPERATURE_IN_CELCIUS: UnitOfTemperature.CELSIUS,
|
|
MeasuredValueType.TEMPERATURE_IN_KELVIN: UnitOfTemperature.KELVIN,
|
|
MeasuredValueType.TIME_IN_SECOND: UnitOfTime.SECONDS,
|
|
# MeasuredValueType.VECTOR_COORDINATE: "",
|
|
MeasuredValueType.VOLTAGE_IN_MILLI_VOLT: UnitOfElectricPotential.MILLIVOLT,
|
|
MeasuredValueType.VOLTAGE_IN_VOLT: UnitOfElectricPotential.VOLT,
|
|
MeasuredValueType.VOLUME_IN_CUBIC_METER: UnitOfVolume.CUBIC_METERS,
|
|
MeasuredValueType.VOLUME_IN_GALLON: UnitOfVolume.GALLONS,
|
|
MeasuredValueType.VOLUME_IN_LITER: UnitOfVolume.LITERS,
|
|
}
|