python-omnilogic-local 0.20.7__tar.gz → 0.20.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/PKG-INFO +1 -1
  2. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/colorlogiclight.py +20 -10
  3. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/models/mspconfig.py +5 -5
  4. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/models/telemetry.py +3 -2
  5. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/sensor.py +1 -1
  6. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyproject.toml +1 -1
  7. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/LICENSE +0 -0
  8. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/README.md +0 -0
  9. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/__init__.py +0 -0
  10. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/_base.py +0 -0
  11. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/api/__init__.py +0 -0
  12. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/api/api.py +0 -0
  13. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/api/constants.py +0 -0
  14. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/api/exceptions.py +0 -0
  15. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/api/protocol.py +0 -0
  16. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/backyard.py +0 -0
  17. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/bow.py +0 -0
  18. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/chlorinator.py +0 -0
  19. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/chlorinator_equip.py +0 -0
  20. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/__init__.py +0 -0
  21. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/cli.py +0 -0
  22. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/debug/__init__.py +0 -0
  23. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/debug/commands.py +0 -0
  24. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/get/__init__.py +0 -0
  25. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/get/backyard.py +0 -0
  26. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/get/bows.py +0 -0
  27. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/get/chlorinators.py +0 -0
  28. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/get/commands.py +0 -0
  29. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/get/csads.py +0 -0
  30. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/get/filters.py +0 -0
  31. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/get/groups.py +0 -0
  32. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/get/heaters.py +0 -0
  33. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/get/lights.py +0 -0
  34. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/get/pumps.py +0 -0
  35. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/get/relays.py +0 -0
  36. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/get/schedules.py +0 -0
  37. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/get/sensors.py +0 -0
  38. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/get/valves.py +0 -0
  39. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/pcap_utils.py +0 -0
  40. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/cli/utils.py +0 -0
  41. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/collections.py +0 -0
  42. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/csad.py +0 -0
  43. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/csad_equip.py +0 -0
  44. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/decorators.py +0 -0
  45. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/filter.py +0 -0
  46. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/groups.py +0 -0
  47. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/heater.py +0 -0
  48. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/heater_equip.py +0 -0
  49. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/models/__init__.py +0 -0
  50. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/models/const.py +0 -0
  51. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/models/exceptions.py +0 -0
  52. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/models/filter_diagnostics.py +0 -0
  53. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/models/leadmessage.py +0 -0
  54. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/omnilogic.py +0 -0
  55. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/omnitypes.py +0 -0
  56. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/pump.py +0 -0
  57. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/py.typed +0 -0
  58. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/relay.py +0 -0
  59. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/schedule.py +0 -0
  60. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/system.py +0 -0
  61. {python_omnilogic_local-0.20.7 → python_omnilogic_local-0.20.9}/pyomnilogic_local/util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-omnilogic-local
3
- Version: 0.20.7
3
+ Version: 0.20.9
4
4
  Summary: A library for local control of Hayward OmniHub/OmniLogic pool controllers using their local API
5
5
  Author: Chris Jowett, djtimca, garionphx
6
6
  Author-email: Chris Jowett <421501+cryptk@users.noreply.github.com>
@@ -117,7 +117,7 @@ class ColorLogicLight(OmniEquipment[MSPColorLogicLight, TelemetryColorLogicLight
117
117
  super().__init__(omni, mspconfig, telemetry)
118
118
 
119
119
  @property
120
- def model(self) -> ColorLogicLightType:
120
+ def equip_type(self) -> ColorLogicLightType:
121
121
  """Returns the model of the light."""
122
122
  return self.mspconfig.equip_type
123
123
 
@@ -168,12 +168,17 @@ class ColorLogicLight(OmniEquipment[MSPColorLogicLight, TelemetryColorLogicLight
168
168
  @property
169
169
  def show(self) -> LightShows:
170
170
  """Returns the current light show."""
171
- return self.telemetry.show
171
+ return self.telemetry.show_name(self.equip_type, self.v2_active)
172
172
 
173
173
  @property
174
174
  def speed(self) -> ColorLogicSpeed:
175
175
  """Returns the current speed."""
176
- if self.model in [ColorLogicLightType.SAM, ColorLogicLightType.TWO_FIVE, ColorLogicLightType.FOUR_ZERO, ColorLogicLightType.UCL]:
176
+ if self.equip_type in [
177
+ ColorLogicLightType.SAM,
178
+ ColorLogicLightType.TWO_FIVE,
179
+ ColorLogicLightType.FOUR_ZERO,
180
+ ColorLogicLightType.UCL,
181
+ ]:
177
182
  return self.telemetry.speed
178
183
  # Non color-logic lights only support 1x speed
179
184
  return ColorLogicSpeed.ONE_TIMES
@@ -181,7 +186,12 @@ class ColorLogicLight(OmniEquipment[MSPColorLogicLight, TelemetryColorLogicLight
181
186
  @property
182
187
  def brightness(self) -> ColorLogicBrightness:
183
188
  """Returns the current brightness."""
184
- if self.model in [ColorLogicLightType.SAM, ColorLogicLightType.TWO_FIVE, ColorLogicLightType.FOUR_ZERO, ColorLogicLightType.UCL]:
189
+ if self.equip_type in [
190
+ ColorLogicLightType.SAM,
191
+ ColorLogicLightType.TWO_FIVE,
192
+ ColorLogicLightType.FOUR_ZERO,
193
+ ColorLogicLightType.UCL,
194
+ ]:
185
195
  return self.telemetry.brightness
186
196
  # Non color-logic lights only support 100% brightness
187
197
  return ColorLogicBrightness.ONE_HUNDRED_PERCENT
@@ -262,17 +272,17 @@ class ColorLogicLight(OmniEquipment[MSPColorLogicLight, TelemetryColorLogicLight
262
272
  and a warning will be logged.
263
273
  """
264
274
  # Non color-logic lights do not support speed or brightness control
265
- if self.model not in [
275
+ if self.equip_type not in [
266
276
  ColorLogicLightType.SAM,
267
277
  ColorLogicLightType.TWO_FIVE,
268
278
  ColorLogicLightType.FOUR_ZERO,
269
279
  ColorLogicLightType.UCL,
270
280
  ]:
271
281
  if speed is not None:
272
- _LOGGER.warning("Non colorlogic lights do not support speed control %s", self.model.name)
282
+ _LOGGER.warning("Non colorlogic lights do not support speed control %s", self.equip_type.name)
273
283
  speed = ColorLogicSpeed.ONE_TIMES
274
284
  if brightness is not None:
275
- _LOGGER.warning("Non colorlogic lights do not support brightness control %s", self.model.name)
285
+ _LOGGER.warning("Non colorlogic lights do not support brightness control %s", self.equip_type.name)
276
286
  brightness = ColorLogicBrightness.ONE_HUNDRED_PERCENT
277
287
 
278
288
  if self.bow_id is None or self.system_id is None:
@@ -282,7 +292,7 @@ class ColorLogicLight(OmniEquipment[MSPColorLogicLight, TelemetryColorLogicLight
282
292
  await self._api.async_set_light_show(
283
293
  self.bow_id,
284
294
  self.system_id,
285
- show or self.show, # use current value if None
286
- speed or self.speed, # use current value if None
287
- brightness or self.brightness, # use current value if None
295
+ show if show is not None else self.show, # use current value if None
296
+ speed if speed is not None else self.speed, # use current value if None
297
+ brightness if brightness is not None else self.brightness, # use current value if None
288
298
  )
@@ -289,14 +289,13 @@ class MSPColorLogicLight(OmniBase):
289
289
 
290
290
  omni_type: OmniType = OmniType.CL_LIGHT
291
291
 
292
- equip_type: ColorLogicLightType = Field(alias="Type")
293
292
  v2_active: bool = Field(alias="V2-Active", default=False)
293
+ equip_type: ColorLogicLightType = Field(alias="Type")
294
294
  effects: list[LightShows] | None = None
295
295
 
296
- def __init__(self, **data: Any) -> None:
297
- super().__init__(**data)
298
-
299
- # Get the available light shows depending on the light type.
296
+ @model_validator(mode="after")
297
+ def set_effects(self) -> Any:
298
+ """Set the available light shows based on the light type."""
300
299
  match self.equip_type:
301
300
  case ColorLogicLightType.TWO_FIVE:
302
301
  self.effects = list(ColorLogicShow25)
@@ -311,6 +310,7 @@ class MSPColorLogicLight(OmniBase):
311
310
  self.effects = list(PentairShow)
312
311
  case ColorLogicLightType.ZODIAC_COLOR:
313
312
  self.effects = list(ZodiacShow)
313
+ return self
314
314
 
315
315
 
316
316
  class MSPGroup(OmniBase):
@@ -267,7 +267,7 @@ class TelemetryColorLogicLight(BaseModel):
267
267
 
268
268
  def show_name(
269
269
  self, model: ColorLogicLightType, v2: bool
270
- ) -> ColorLogicShow25 | ColorLogicShow40 | ColorLogicShowUCL | ColorLogicShowUCLV2 | PentairShow | ZodiacShow | int:
270
+ ) -> ColorLogicShow25 | ColorLogicShow40 | ColorLogicShowUCL | ColorLogicShowUCLV2 | PentairShow | ZodiacShow:
271
271
  """Get the current light show depending on the light type.
272
272
 
273
273
  Returns:
@@ -287,7 +287,8 @@ class TelemetryColorLogicLight(BaseModel):
287
287
  return PentairShow(self.show)
288
288
  case ColorLogicLightType.ZODIAC_COLOR:
289
289
  return ZodiacShow(self.show)
290
- return self.show # Return raw int if type is unknown
290
+ msg = f"Unknown ColorLogicLightType {model} for show name parsing"
291
+ raise OmniParsingError(msg)
291
292
 
292
293
 
293
294
  class TelemetryFilter(BaseModel):
@@ -86,7 +86,7 @@ class Sensor(OmniEquipment[MSPSensor, None]):
86
86
  super().__init__(omni, mspconfig, telemetry)
87
87
 
88
88
  @property
89
- def sensor_type(self) -> SensorType | str:
89
+ def equip_type(self) -> SensorType | str:
90
90
  """Returns the type of sensor.
91
91
 
92
92
  Can be AIR_TEMP, SOLAR_TEMP, WATER_TEMP, FLOW, ORP, or EXT_INPUT.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-omnilogic-local"
3
- version = "0.20.7"
3
+ version = "0.20.9"
4
4
  description = "A library for local control of Hayward OmniHub/OmniLogic pool controllers using their local API"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13,<4.0.0"