From 7e1f189db8d53081b18863a81cdace00167868df Mon Sep 17 00:00:00 2001 From: cryptk <421501+cryptk@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:29:25 -0500 Subject: [PATCH] feat: add support for CSAD units (#47) --- pyomnilogic_local/models/mspconfig.py | 12 +++++++++++- pyomnilogic_local/models/telemetry.py | 12 ++++++++++++ pyomnilogic_local/types.py | 6 ++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/pyomnilogic_local/models/mspconfig.py b/pyomnilogic_local/models/mspconfig.py index a3628be..64e36f8 100644 --- a/pyomnilogic_local/models/mspconfig.py +++ b/pyomnilogic_local/models/mspconfig.py @@ -18,6 +18,7 @@ ChlorinatorDispenserType, ColorLogicLightType, ColorLogicShow, + CSADType, FilterType, HeaterType, OmniType, @@ -162,6 +163,13 @@ def __init__(self, **data: Any) -> None: self.chlorinator_equipment = [MSPChlorinatorEquip.parse_obj(equip) for equip in chlorinator_equip_data[OmniType.CHLORINATOR_EQUIP]] +class MSPCSAD(OmniBase): + omni_type: OmniType = OmniType.CSAD + enabled: Literal["yes", "no"] = Field(alias="Enabled") + csad_type: CSADType | str = Field(alias="Type") + target_value: float = Field(alias="TargetValue") + + class MSPColorLogicLight(OmniBase): omni_type: OmniType = OmniType.CL_LIGHT type: ColorLogicLightType | str = Field(alias="Type") @@ -174,7 +182,7 @@ def __init__(self, **data: Any) -> None: class MSPBoW(OmniBase): - _sub_devices = {"filter", "relay", "heater", "sensor", "colorlogic_light", "pump", "chlorinator"} + _sub_devices = {"filter", "relay", "heater", "sensor", "colorlogic_light", "pump", "chlorinator", "csad"} omni_type: OmniType = OmniType.BOW type: BodyOfWaterType | str = Field(alias="Type") @@ -186,6 +194,7 @@ class MSPBoW(OmniBase): colorlogic_light: list[MSPColorLogicLight] | None = Field(alias="ColorLogic-Light") pump: list[MSPPump] | None = Field(alias="Pump") chlorinator: MSPChlorinator | None = Field(alias="Chlorinator") + csad: list[MSPCSAD] | None = Field(alias="CSAD") # We override the __init__ here so that we can trigger the propagation of the bow_id down to all of it's sub devices after the bow # itself is initialized @@ -232,6 +241,7 @@ def load_xml(xml: str) -> MSPConfig: force_list=( OmniType.BOW_MSP, OmniType.CHLORINATOR_EQUIP, + OmniType.CSAD, OmniType.CL_LIGHT, OmniType.FAVORITES, OmniType.FILTER, diff --git a/pyomnilogic_local/models/telemetry.py b/pyomnilogic_local/models/telemetry.py index 7079603..d4e8083 100644 --- a/pyomnilogic_local/models/telemetry.py +++ b/pyomnilogic_local/models/telemetry.py @@ -13,6 +13,7 @@ ColorLogicPowerState, ColorLogicShow, ColorLogicSpeed, + CSADMode, FilterState, FilterValvePosition, FilterWhyOn, @@ -79,6 +80,15 @@ class TelemetryChlorinator(BaseModel): # return self.status_raw & 4 == 4 # Check if bit 4 is set, which means the chlorinator is currently chlorinating +class TelemetryCSAD(BaseModel): + omni_type: OmniType = OmniType.CSAD + system_id: int = Field(alias="@systemId") + status_raw: int = Field(alias="@status") + ph: float = Field(alias="@ph") + orp: int = Field(alias="@orp") + mode: CSADMode | int = Field(alias="@mode") + + class TelemetryColorLogicLight(BaseModel): omni_type: OmniType = OmniType.CL_LIGHT system_id: int = Field(alias="@systemId") @@ -172,6 +182,7 @@ class Telemetry(BaseModel): bow: list[TelemetryBoW] = Field(alias="BodyOfWater") chlorinator: list[TelemetryChlorinator] | None = Field(alias="Chlorinator") colorlogic_light: list[TelemetryColorLogicLight] | None = Field(alias="ColorLogic-Light") + csad: list[TelemetryCSAD] | None = Field(alias="CSAD") filter: list[TelemetryFilter] | None = Field(alias="Filter") group: list[TelemetryGroup] | None = Field(alias="Group") heater: list[TelemetryHeater] | None = Field(alias="Heater") @@ -223,6 +234,7 @@ def xml_postprocessor(path: Any, key: Any, value: SupportsInt | Any) -> tuple[An force_list=( OmniType.BOW, OmniType.CHLORINATOR, + OmniType.CSAD, OmniType.CL_LIGHT, OmniType.FILTER, OmniType.GROUP, diff --git a/pyomnilogic_local/types.py b/pyomnilogic_local/types.py index e49dfee..268cc57 100644 --- a/pyomnilogic_local/types.py +++ b/pyomnilogic_local/types.py @@ -46,6 +46,7 @@ class OmniType(str, Enum): BOW_MSP = "Body-of-water" CHLORINATOR = "Chlorinator" CHLORINATOR_EQUIP = "Chlorinator-Equipment" + CSAD = "CSAD" CL_LIGHT = "ColorLogic-Light" FAVORITES = "Favorites" FILTER = "Filter" @@ -162,6 +163,11 @@ class ColorLogicLightType(str, PrettyEnum): TWO_FIVE = "COLOR_LOGIC_2_5" +class CSADType(str, PrettyEnum): + ACID = "ACID" + CO2 = "CO2" + + # Chemistry Sense and Dispense class CSADStatus(PrettyEnum): NOT_DISPENSING = 0