violet-poolController-api 0.0.34__tar.gz → 0.0.35__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 (26) hide show
  1. {violet_poolcontroller_api-0.0.34/violet_poolController_api.egg-info → violet_poolcontroller_api-0.0.35}/PKG-INFO +1 -1
  2. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/pyproject.toml +1 -1
  3. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/tests/test_api.py +41 -0
  4. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35/violet_poolController_api.egg-info}/PKG-INFO +1 -1
  5. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/violet_poolcontroller_api/api.py +6 -11
  6. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/LICENSE +0 -0
  7. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/README.md +0 -0
  8. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/setup.cfg +0 -0
  9. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/tests/test_api_smoke.py +0 -0
  10. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/tests/test_circuit_breaker.py +0 -0
  11. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/tests/test_mock_server.py +0 -0
  12. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/tests/test_parsers.py +0 -0
  13. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/tests/test_readings.py +0 -0
  14. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/violet_poolController_api.egg-info/SOURCES.txt +0 -0
  15. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/violet_poolController_api.egg-info/dependency_links.txt +0 -0
  16. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/violet_poolController_api.egg-info/requires.txt +0 -0
  17. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/violet_poolController_api.egg-info/top_level.txt +0 -0
  18. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/violet_poolcontroller_api/__init__.py +0 -0
  19. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/violet_poolcontroller_api/circuit_breaker.py +0 -0
  20. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/violet_poolcontroller_api/const_api.py +0 -0
  21. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/violet_poolcontroller_api/const_devices.py +0 -0
  22. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/violet_poolcontroller_api/parsers.py +0 -0
  23. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/violet_poolcontroller_api/py.typed +0 -0
  24. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/violet_poolcontroller_api/readings.py +0 -0
  25. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/violet_poolcontroller_api/utils_rate_limiter.py +0 -0
  26. {violet_poolcontroller_api-0.0.34 → violet_poolcontroller_api-0.0.35}/violet_poolcontroller_api/utils_sanitizer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: violet-poolController-api
3
- Version: 0.0.34
3
+ Version: 0.0.35
4
4
  Summary: Asynchronous Python client for the Violet Pool Controller.
5
5
  Author-email: "Basti (Xerolux)" <git@xerolux.de>
6
6
  License: AGPL-3.0-or-later
@@ -10,7 +10,7 @@ violet_poolcontroller_api = ["py.typed"]
10
10
 
11
11
  [project]
12
12
  name = "violet-poolController-api"
13
- version = "0.0.34"
13
+ version = "0.0.35"
14
14
  authors = [
15
15
  { name="Basti (Xerolux)", email="git@xerolux.de" },
16
16
  ]
@@ -96,6 +96,47 @@ async def test_get_readings_success(
96
96
  assert dict(result) == mock_data
97
97
 
98
98
 
99
+ @pytest.mark.asyncio
100
+ async def test_get_output_runtimes_success(
101
+ mock_aioresponse: aioresponses,
102
+ api_client: VioletPoolAPI,
103
+ ) -> None:
104
+ """Test get_output_runtimes parses a JSON dict response.
105
+
106
+ Regression: previously the endpoint was requested without expect_json,
107
+ so the raw text body was returned and the method logged a warning
108
+ ("Unexpected non-dict response for get_output_runtimes: str") and
109
+ returned an empty dict.
110
+ """
111
+ url = "http://192.168.1.100/getOutputruntimes"
112
+ mock_data = {
113
+ "PUMP_RUNTIME": "04h 33m 12s",
114
+ "PUMP_LAST_ON": 1700000000,
115
+ "PUMP_LAST_OFF": 1699996800,
116
+ "CPU_UPTIME": "12d 4h 30m",
117
+ "LOAD_AVG": "0.42",
118
+ }
119
+ mock_aioresponse.get(url, payload=mock_data, status=200)
120
+
121
+ result = await api_client.get_output_runtimes()
122
+
123
+ assert isinstance(result, dict)
124
+ assert result == mock_data
125
+
126
+
127
+ @pytest.mark.asyncio
128
+ async def test_get_output_runtimes_non_dict_raises(
129
+ mock_aioresponse: aioresponses,
130
+ api_client: VioletPoolAPI,
131
+ ) -> None:
132
+ """Test get_output_runtimes raises when the controller returns a non-dict."""
133
+ url = "http://192.168.1.100/getOutputruntimes"
134
+ mock_aioresponse.get(url, body="not-json", status=200)
135
+
136
+ with pytest.raises(VioletPoolAPIError):
137
+ await api_client.get_output_runtimes()
138
+
139
+
99
140
  @pytest.mark.asyncio
100
141
  async def test_set_pump_speed_success(
101
142
  mock_aioresponse: aioresponses,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: violet-poolController-api
3
- Version: 0.0.34
3
+ Version: 0.0.35
4
4
  Summary: Asynchronous Python client for the Violet Pool Controller.
5
5
  Author-email: "Basti (Xerolux)" <git@xerolux.de>
6
6
  License: AGPL-3.0-or-later
@@ -2205,23 +2205,18 @@ class VioletPoolAPI:
2205
2205
 
2206
2206
  Returns a flat dict with runtime (HH:MM:SS format) and last-on/off
2207
2207
  (ISO datetime strings) for all outputs: PUMP, SOLAR, HEATER, BACKWASH,
2208
- REFILL, LIGHT, ECO, all dosing outputs, OMNI_DC channels, and extension
2208
+ REFILL, LIGHT, ECO, all dosing outputs, OMNIDC channels, and extension
2209
2209
  relay channels. Also includes CPU_UPTIME, LOAD_AVG, and version fields.
2210
2210
 
2211
2211
  Returns:
2212
- Dict with runtime/timestamp strings for all outputs, or empty dict
2213
- on error.
2212
+ Dict with runtime/timestamp strings for all outputs.
2214
2213
 
2215
2214
  Raises:
2216
- VioletPoolAPIError: If the API call fails.
2215
+ VioletPoolAPIError: If the API call fails or the response is not a
2216
+ JSON object.
2217
2217
 
2218
2218
  """
2219
- resp = await self._request(
2219
+ return await self._request_json_dict(
2220
2220
  API_GET_OUTPUT_RUNTIMES,
2221
- method="GET",
2222
- priority=API_PRIORITY_NORMAL,
2221
+ payload_name="getOutputruntimes",
2223
2222
  )
2224
- if isinstance(resp, dict):
2225
- return resp
2226
- _LOGGER.warning("Unexpected non-dict response for get_output_runtimes: %s", type(resp).__name__)
2227
- return {}