Skip to content

Commit 47fa524

Browse files
authored
Merge pull request #148 from cryptk/feat_more_omnitypes
feat: bring in a lot more state types and data
2 parents f4c6089 + 584e75a commit 47fa524

14 files changed

Lines changed: 182 additions & 104 deletions

pyomnilogic_local/api/api.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ async def async_get_filter_diagnostics(self, pool_id: int, equipment_id: int, ra
215215

216216
_LOGGER.debug("Sending GetUIFilterDiagnosticInfo with body: %s", req_body)
217217

218-
resp = await self.async_send_and_receive(MessageType.GET_FILTER_DIAGNOSTIC_INFO, req_body)
218+
resp = await self.async_send_and_receive(MessageType.GET_FILTER_DIAGNOSTIC, req_body)
219219

220220
_LOGGER.debug("Received response for GetUIFilterDiagnosticInfo: %s", resp)
221221

@@ -285,7 +285,7 @@ async def async_set_heater(
285285

286286
_LOGGER.debug("Sending SetUIHeaterCmd with body: %s", req_body)
287287

288-
return await self.async_send(MessageType.SET_HEATER_COMMAND, req_body)
288+
return await self.async_send(MessageType.SET_HEATER, req_body)
289289

290290
async def async_set_solar_heater(
291291
self,
@@ -320,7 +320,7 @@ async def async_set_solar_heater(
320320

321321
_LOGGER.debug("Sending SetUISolarSetPointCmd with body: %s", req_body)
322322

323-
return await self.async_send(MessageType.SET_SOLAR_SET_POINT_COMMAND, req_body)
323+
return await self.async_send(MessageType.SET_SOLAR_SETPOINT, req_body)
324324

325325
async def async_set_heater_mode(
326326
self,
@@ -355,7 +355,7 @@ async def async_set_heater_mode(
355355

356356
_LOGGER.debug("Sending SetUIHeaterModeCmd with body: %s", req_body)
357357

358-
return await self.async_send(MessageType.SET_HEATER_MODE_COMMAND, req_body)
358+
return await self.async_send(MessageType.SET_HEATER_MODE, req_body)
359359

360360
async def async_set_heater_enable(
361361
self,
@@ -390,7 +390,7 @@ async def async_set_heater_enable(
390390

391391
_LOGGER.debug("Sending SetHeaterEnable with body: %s", req_body)
392392

393-
return await self.async_send(MessageType.SET_HEATER_ENABLED, req_body)
393+
return await self.async_send(MessageType.SET_HEATER_ENABLE, req_body)
394394

395395
async def async_set_equipment(
396396
self,
@@ -552,7 +552,7 @@ async def async_set_light_show(
552552

553553
_LOGGER.debug("Sending SetStandAloneLightShow with body: %s", req_body)
554554

555-
return await self.async_send(MessageType.SET_STANDALONE_LIGHT_SHOW, req_body)
555+
return await self.async_send(MessageType.SET_LIGHT_SHOW, req_body)
556556

557557
async def async_set_chlorinator_enable(self, pool_id: int, enabled: int | bool) -> None:
558558
body_element = ET.Element("Request", {"xmlns": XML_NAMESPACE})
@@ -570,7 +570,7 @@ async def async_set_chlorinator_enable(self, pool_id: int, enabled: int | bool)
570570

571571
_LOGGER.debug("Sending SetCHLOREnable with body: %s", req_body)
572572

573-
return await self.async_send(MessageType.SET_CHLOR_ENABLED, req_body)
573+
return await self.async_send(MessageType.SET_CHLOR_ENABLE, req_body)
574574

575575
# This is used to set the ORP target value on a CSAD
576576
async def async_set_csad_orp_target_level(
@@ -596,7 +596,7 @@ async def async_set_csad_orp_target_level(
596596

597597
_LOGGER.debug("Sending SetUICSADORPTargetLevel with body: %s", req_body)
598598

599-
return await self.async_send(MessageType.SET_CSAD_ORP_TARGET, req_body)
599+
return await self.async_send(MessageType.SET_CSAD_ORP_TARGET_LEVEL, req_body)
600600

601601
# This is used to set the pH target value on a CSAD
602602
async def async_set_csad_ph_target_value(
@@ -665,7 +665,7 @@ async def async_set_chlorinator_params(
665665

666666
_LOGGER.debug("Sending SetCHLORParams with body: %s", req_body)
667667

668-
return await self.async_send(MessageType.SET_CHLOR_PARAMS, req_body)
668+
return await self.async_send(MessageType.CHLOR_PARAMS_SET, req_body)
669669

670670
async def async_set_chlorinator_superchlorinate(
671671
self,
@@ -690,7 +690,7 @@ async def async_set_chlorinator_superchlorinate(
690690

691691
_LOGGER.debug("Sending SetUISuperCHLORCmd with body: %s", req_body)
692692

693-
return await self.async_send(MessageType.SET_SUPERCHLORINATE, req_body)
693+
return await self.async_send(MessageType.CHLOR_SUPER_CHLOR_SET, req_body)
694694

695695
async def async_restore_idle_state(self) -> None:
696696
body_element = ET.Element("Request", {"xmlns": XML_NAMESPACE})
@@ -747,7 +747,7 @@ async def async_set_spillover(
747747

748748
_LOGGER.debug("Sending SetUISpilloverCmd with body: %s", req_body)
749749

750-
return await self.async_send(MessageType.SET_SPILLOVER, req_body)
750+
return await self.async_send(MessageType.SET_SPILLOVER_CMD, req_body)
751751

752752
async def async_set_group_enable(
753753
self,
@@ -790,7 +790,7 @@ async def async_set_group_enable(
790790

791791
_LOGGER.debug("Sending RunGroupCmd with body: %s", req_body)
792792

793-
return await self.async_send(MessageType.RUN_GROUP_CMD, req_body)
793+
return await self.async_send(MessageType.RUN_GROUP, req_body)
794794

795795
async def async_edit_schedule(
796796
self,
@@ -863,4 +863,4 @@ async def async_edit_schedule(
863863

864864
_LOGGER.debug("Sending EditUIScheduleCmd with body: %s", req_body)
865865

866-
return await self.async_send(MessageType.EDIT_SCHEDULE, req_body)
866+
return await self.async_send(MessageType.EDIT_SCHEDULE_CMD, req_body)

pyomnilogic_local/api/protocol.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
_ACK_PAYLOAD = f'<Request xmlns="{XML_NAMESPACE}">\n<Name>Ack</Name>\n</Request>'
3030

31-
_ACK_TYPES = frozenset({MessageType.ACK, MessageType.XML_ACK})
31+
_ACK_TYPES = frozenset({MessageType.ACK, MessageType.MSP_ACK})
3232

3333
# Type alias for items placed on the receive queue: either a parsed message or a parse error.
3434
_QueueItem = OmniLogicMessage | OmniMessageFormatError
@@ -110,7 +110,7 @@ def _send_xml_ack(self, msg_id: int) -> None:
110110
if self._transport is None:
111111
_LOGGER.warning("cannot send ACK for ID %d, transport unavailable", msg_id)
112112
return
113-
ack = OmniLogicMessage(msg_id=msg_id, msg_type=MessageType.XML_ACK, payload=_ACK_PAYLOAD)
113+
ack = OmniLogicMessage(msg_id=msg_id, msg_type=MessageType.ACK, payload=_ACK_PAYLOAD)
114114
self._transport.sendto(bytes(ack))
115115
_LOGGER.debug("sent XML_ACK for message ID %d", msg_id)
116116

pyomnilogic_local/chlorinator.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,18 @@
88
from pyomnilogic_local.decorators import control_method
99
from pyomnilogic_local.models.mspconfig import MSPChlorinator
1010
from pyomnilogic_local.models.telemetry import TelemetryChlorinator
11-
from pyomnilogic_local.omnitypes import ChlorinatorMSPConfigMode, ChlorinatorStatus
11+
from pyomnilogic_local.omnitypes import ChlorinatorMode, ChlorinatorStatus
1212
from pyomnilogic_local.util import OmniEquipmentNotInitializedError
1313

1414
if TYPE_CHECKING:
1515
from pyomnilogic_local.models.telemetry import Telemetry
1616
from pyomnilogic_local.omnilogic import OmniLogic
17-
from pyomnilogic_local.omnitypes import ChlorinatorCellType, ChlorinatorDispenserType, ChlorinatorOperatingMode
17+
from pyomnilogic_local.omnitypes import (
18+
ChlorinatorCellType,
19+
ChlorinatorDispenserType,
20+
ChlorinatorOperatingMode,
21+
ChlorinatorOperatingState,
22+
)
1823

1924

2025
class Chlorinator(OmniEquipment[MSPChlorinator, TelemetryChlorinator]):
@@ -94,12 +99,12 @@ def cell_type(self) -> ChlorinatorCellType:
9499

95100
# Expose Telemetry attributes
96101
@property
97-
def operating_state(self) -> int:
102+
def operating_state(self) -> ChlorinatorOperatingState:
98103
"""Current operational state of the chlorinator (raw value)."""
99104
return self.telemetry.operating_state
100105

101106
@property
102-
def mode(self) -> ChlorinatorMSPConfigMode:
107+
def mode(self) -> ChlorinatorMode:
103108
"""Current operating mode from MSP Config (NOT_CONFIGURED, TIMED, ORP_AUTO).
104109
105110
TThis data appears to have some discrepancies with the mode reported in the Telemetry.
@@ -421,7 +426,7 @@ async def set_timed_percent(self, percent: int) -> None:
421426
)
422427

423428
@control_method
424-
async def set_op_mode(self, op_mode: ChlorinatorMSPConfigMode) -> None:
429+
async def set_op_mode(self, op_mode: ChlorinatorMode) -> None:
425430
"""Set the operating mode for chlorine generation.
426431
427432
Args:
@@ -453,9 +458,9 @@ async def set_op_mode(self, op_mode: ChlorinatorMSPConfigMode) -> None:
453458

454459
new_op_mode: int
455460
match op_mode:
456-
case ChlorinatorMSPConfigMode.TIMED:
461+
case ChlorinatorMode.TIMED:
457462
new_op_mode = 1
458-
case ChlorinatorMSPConfigMode.ORP_AUTO:
463+
case ChlorinatorMode.ORP_AUTO:
459464
new_op_mode = 2
460465
case _:
461466
msg = f"Unsupported operating mode: {op_mode}"

pyomnilogic_local/colorlogiclight.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
if TYPE_CHECKING:
1515
from pyomnilogic_local.models.telemetry import Telemetry
1616
from pyomnilogic_local.omnilogic import OmniLogic
17-
from pyomnilogic_local.omnitypes import LightShows
17+
from pyomnilogic_local.omnitypes import ColorLogicSpecialEffect, LightShows
1818

1919
_LOGGER = logging.getLogger(__name__)
2020

@@ -197,7 +197,7 @@ def brightness(self) -> ColorLogicBrightness:
197197
return ColorLogicBrightness.ONE_HUNDRED_PERCENT
198198

199199
@property
200-
def special_effect(self) -> int:
200+
def special_effect(self) -> ColorLogicSpecialEffect:
201201
"""Returns the current special effect."""
202202
return self.telemetry.special_effect
203203

@@ -222,10 +222,10 @@ def is_ready(self) -> bool:
222222

223223
# Then check light-specific readiness
224224
return self.state not in [
225-
ColorLogicPowerState.FIFTEEN_SECONDS_WHITE,
226-
ColorLogicPowerState.CHANGING_SHOW,
227-
ColorLogicPowerState.POWERING_OFF,
228-
ColorLogicPowerState.COOLDOWN,
225+
ColorLogicPowerState.STARTING_APP,
226+
ColorLogicPowerState.SHOW_ADVANCE,
227+
ColorLogicPowerState.WAIT_POWER_DOWN,
228+
ColorLogicPowerState.POWER_DOWN,
229229
]
230230

231231
@control_method

pyomnilogic_local/filter.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,8 @@ def is_on(self) -> bool:
179179
FilterState.PRIMING,
180180
FilterState.HEATER_EXTEND,
181181
FilterState.CSAD_EXTEND,
182-
FilterState.FILTER_FORCE_PRIMING,
183-
FilterState.FILTER_SUPERCHLORINATE,
182+
FilterState.FORCE_PRIMING,
183+
FilterState.SUPERCHLORINATE,
184184
)
185185

186186
@property
@@ -203,7 +203,7 @@ def is_ready(self) -> bool:
203203
# We need to consider the filter as ready in this state, otherwise we cannot control the
204204
# virtual filter to switch the physical filter back BoW
205205
# ref: https://github.com/cryptk/python-omnilogic-local/issues/100
206-
return self.state in (FilterState.OFF, FilterState.ON, FilterState.SUSPEND)
206+
return self.state in (FilterState.OFF, FilterState.ON, FilterState.SUSPENDED)
207207

208208
# Control methods
209209
@control_method

pyomnilogic_local/heater.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
if TYPE_CHECKING:
1414
from pyomnilogic_local.models.telemetry import Telemetry
1515
from pyomnilogic_local.omnilogic import OmniLogic
16-
from pyomnilogic_local.omnitypes import HeaterMode
16+
from pyomnilogic_local.omnitypes import HeaterMode, HeaterWhyOn
1717

1818

1919
class Heater(OmniEquipment[MSPVirtualHeater, TelemetryVirtualHeater]):
@@ -173,7 +173,7 @@ def silent_mode(self) -> int:
173173
return self.telemetry.silent_mode
174174

175175
@property
176-
def why_on(self) -> int:
176+
def why_on(self) -> HeaterWhyOn:
177177
"""Returns the reason why the heater is on from telemetry.
178178
179179
We don't have a good understanding of what these values mean yet

pyomnilogic_local/models/mspconfig.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
BodyOfWaterType,
2121
ChlorinatorCellType,
2222
ChlorinatorDispenserType,
23-
ChlorinatorMSPConfigMode,
23+
ChlorinatorMode,
2424
ChlorinatorType,
2525
ColorLogicLightType,
2626
ColorLogicShow25,
@@ -218,7 +218,7 @@ class MSPChlorinator(OmniBase):
218218
omni_type: OmniType = OmniType.CHLORINATOR
219219

220220
enabled: bool = Field(alias="Enabled")
221-
mode: ChlorinatorMSPConfigMode = Field(alias="Mode")
221+
mode: ChlorinatorMode = Field(alias="Mode")
222222
timed_percent: int = Field(alias="Timed-Percent")
223223
superchlor_timeout: int = Field(alias="SuperChlor-Timeout")
224224
orp_timeout: int = Field(alias="ORP-Timeout")
@@ -377,7 +377,7 @@ class MSPSchedule(OmniBase):
377377
bow_id: int = Field(alias="bow-system-id") # pyright: ignore[reportGeneralTypeIssues]
378378
equipment_id: int = Field(alias="equipment-id")
379379
system_id: int = Field(alias="schedule-system-id")
380-
event: MessageType = Field(alias="event")
380+
event: MessageType | int = Field(alias="event")
381381
data: int = Field(alias="data")
382382
enabled: bool = Field()
383383
start_minute: int = Field(alias="start-minute")

pyomnilogic_local/models/telemetry.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
ChlorinatorAlert,
1212
ChlorinatorError,
1313
ChlorinatorOperatingMode,
14+
ChlorinatorOperatingState,
1415
ChlorinatorStatus,
1516
ColorLogicBrightness,
1617
ColorLogicLightType,
@@ -19,6 +20,7 @@
1920
ColorLogicShow40,
2021
ColorLogicShowUCL,
2122
ColorLogicShowUCLV2,
23+
ColorLogicSpecialEffect,
2224
ColorLogicSpeed,
2325
CSADMode,
2426
CSADStatus,
@@ -28,10 +30,12 @@
2830
GroupState,
2931
HeaterMode,
3032
HeaterState,
33+
HeaterWhyOn,
3134
LightShows,
3235
OmniType,
3336
PentairShow,
3437
PumpState,
38+
PumpWhyOn,
3539
RelayState,
3640
RelayWhyOn,
3741
ValveActuatorState,
@@ -127,7 +131,7 @@ class TelemetryChlorinator(BaseModel):
127131
chlr_alert_raw: int = Field(alias="@chlrAlert")
128132
chlr_error_raw: int = Field(alias="@chlrError")
129133
sc_mode: int = Field(alias="@scMode")
130-
operating_state: int = Field(alias="@operatingState")
134+
operating_state: ChlorinatorOperatingState = Field(alias="@operatingState")
131135
timed_percent: int | None = Field(alias="@Timed-Percent", default=None)
132136
operating_mode: ChlorinatorOperatingMode = Field(alias="@operatingMode")
133137
enable: bool = Field(alias="@enable")
@@ -263,7 +267,7 @@ class TelemetryColorLogicLight(BaseModel):
263267
show: LightShows = Field(alias="@currentShow")
264268
speed: ColorLogicSpeed = Field(alias="@speed")
265269
brightness: ColorLogicBrightness = Field(alias="@brightness")
266-
special_effect: int = Field(alias="@specialEffect")
270+
special_effect: ColorLogicSpecialEffect = Field(alias="@specialEffect")
267271

268272
def show_name(
269273
self, model: ColorLogicLightType, v2: bool
@@ -381,7 +385,7 @@ class TelemetryPump(BaseModel):
381385
state: PumpState = Field(alias="@pumpState")
382386
speed: int = Field(alias="@pumpSpeed")
383387
last_speed: int = Field(alias="@lastSpeed")
384-
why_on: int = Field(alias="@whyOn")
388+
why_on: PumpWhyOn = Field(alias="@whyOn")
385389

386390

387391
class TelemetryRelay(BaseModel):
@@ -447,7 +451,7 @@ class TelemetryVirtualHeater(BaseModel):
447451
solar_set_point: int = Field(alias="@SolarSetPoint")
448452
mode: HeaterMode = Field(alias="@Mode")
449453
silent_mode: int = Field(alias="@SilentMode")
450-
why_on: int = Field(alias="@whyHeaterIsOn")
454+
why_on: HeaterWhyOn = Field(alias="@whyHeaterIsOn")
451455

452456

453457
type TelemetryType = (

0 commit comments

Comments
 (0)