vsslctrl 0.1.4.dev1__tar.gz → 0.1.5.dev1__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 (32) hide show
  1. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/PKG-INFO +6 -3
  2. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/README.md +5 -2
  3. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/pyproject.toml +1 -1
  4. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/api_base.py +13 -0
  5. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/data_structure.py +181 -38
  6. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/io.py +1 -1
  7. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl.egg-info/PKG-INFO +6 -3
  8. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/LICENSE +0 -0
  9. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/setup.cfg +0 -0
  10. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/tests/test_event_bus.py +0 -0
  11. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/tests/test_integration.py +0 -0
  12. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/tests/test_settings.py +0 -0
  13. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/tests/test_zone.py +0 -0
  14. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/__init__.py +0 -0
  15. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/api_alpha.py +0 -0
  16. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/api_bravo.py +0 -0
  17. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/core.py +0 -0
  18. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/decorators.py +0 -0
  19. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/device.py +0 -0
  20. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/discovery.py +0 -0
  21. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/event_bus.py +0 -0
  22. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/exceptions.py +0 -0
  23. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/group.py +0 -0
  24. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/settings.py +0 -0
  25. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/track.py +0 -0
  26. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/transport.py +0 -0
  27. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/utils.py +0 -0
  28. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl/zone.py +0 -0
  29. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl.egg-info/SOURCES.txt +0 -0
  30. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl.egg-info/dependency_links.txt +0 -0
  31. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl.egg-info/requires.txt +0 -0
  32. {vsslctrl-0.1.4.dev1 → vsslctrl-0.1.5.dev1}/vsslctrl.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vsslctrl
3
- Version: 0.1.4.dev1
3
+ Version: 0.1.5.dev1
4
4
  Summary: Package for controlling VSSL amplifiers
5
5
  Author-email: vsslctrl <vsslcontrolled@proton.me>
6
6
  Classifier: Development Status :: 4 - Beta
@@ -32,6 +32,8 @@ Important
32
32
  -----------
33
33
  Only tested on a VSSL **A.3x** software version **p15305.016.3701**.
34
34
 
35
+ **Notice:** VSSLs new iOS app titled `VSSL`can cause connection refused issues if running at the same time as `vsslctrl`. Best to not use the iOS app togeather. The `VSSL Legacy` app works fine
36
+
35
37
  **Warning:** no *[VSSL Agent](https://vssl.gitbook.io/vssl-rest-api/getting-started/start)* should be running on the same network. If you dont know what this is, then you can probably ignore this notice.
36
38
 
37
39
  ## TODOs
@@ -225,7 +227,7 @@ zone1.transport.state = ZoneTransport.States.PAUSE
225
227
  ## `Zone.track`
226
228
 
227
229
  * Not all sources have complete metadata - missing value will be set to defaults.
228
- * Airplay track position is not avaiable.
230
+ * Airplay track `progress` is not avaiable.
229
231
 
230
232
  | Property | Description | Type | Values |
231
233
  | ---------------------- | ----------- | ----------- |----------- |
@@ -379,7 +381,7 @@ zone1.settings.eq.khz1_db = -2
379
381
 
380
382
  ## Another (Lite) Way
381
383
 
382
- If you perfer to not run the complete intergration, you can send basic HEX commands to the VSSL device using [Netcat](https://nc110.sourceforge.io/) (or ant network tool) on port `50002`.
384
+ If you perfer to not run the complete intergration, you can send basic HEX commands to the VSSL device using [Netcat](https://nc110.sourceforge.io/) (or any network tool) on port `50002`.
383
385
 
384
386
  | HEX | Description |
385
387
  | ---------------------- | ----------- |
@@ -435,6 +437,7 @@ The VSSL API was reverse engineered using Wireshark, VSSLs native "legacy" iOS a
435
437
  * VSSL can not start a stream except for playing a URL directly. This is a limitation of the hardware itself.
436
438
  * Not all sources set the volume to 0 when the zone is muted
437
439
  * Grouping feedback is flaky on the X series amplifiers
440
+ * Airplay `Zone.track.progress` is not avaiable.
438
441
  * Cant stop a URL playback, feedback is worng at least
439
442
  * VSSL likes to cache old track metadata. For example when playing a URL after Spotify, often the device will respond with the previous (Spotify) tracks metadata
440
443
  * `stop()` is intended to disconnect the client and pause the stream. Doesnt always function this way, depending on stream source
@@ -11,6 +11,8 @@ Important
11
11
  -----------
12
12
  Only tested on a VSSL **A.3x** software version **p15305.016.3701**.
13
13
 
14
+ **Notice:** VSSLs new iOS app titled `VSSL`can cause connection refused issues if running at the same time as `vsslctrl`. Best to not use the iOS app togeather. The `VSSL Legacy` app works fine
15
+
14
16
  **Warning:** no *[VSSL Agent](https://vssl.gitbook.io/vssl-rest-api/getting-started/start)* should be running on the same network. If you dont know what this is, then you can probably ignore this notice.
15
17
 
16
18
  ## TODOs
@@ -204,7 +206,7 @@ zone1.transport.state = ZoneTransport.States.PAUSE
204
206
  ## `Zone.track`
205
207
 
206
208
  * Not all sources have complete metadata - missing value will be set to defaults.
207
- * Airplay track position is not avaiable.
209
+ * Airplay track `progress` is not avaiable.
208
210
 
209
211
  | Property | Description | Type | Values |
210
212
  | ---------------------- | ----------- | ----------- |----------- |
@@ -358,7 +360,7 @@ zone1.settings.eq.khz1_db = -2
358
360
 
359
361
  ## Another (Lite) Way
360
362
 
361
- If you perfer to not run the complete intergration, you can send basic HEX commands to the VSSL device using [Netcat](https://nc110.sourceforge.io/) (or ant network tool) on port `50002`.
363
+ If you perfer to not run the complete intergration, you can send basic HEX commands to the VSSL device using [Netcat](https://nc110.sourceforge.io/) (or any network tool) on port `50002`.
362
364
 
363
365
  | HEX | Description |
364
366
  | ---------------------- | ----------- |
@@ -414,6 +416,7 @@ The VSSL API was reverse engineered using Wireshark, VSSLs native "legacy" iOS a
414
416
  * VSSL can not start a stream except for playing a URL directly. This is a limitation of the hardware itself.
415
417
  * Not all sources set the volume to 0 when the zone is muted
416
418
  * Grouping feedback is flaky on the X series amplifiers
419
+ * Airplay `Zone.track.progress` is not avaiable.
417
420
  * Cant stop a URL playback, feedback is worng at least
418
421
  * VSSL likes to cache old track metadata. For example when playing a URL after Spotify, often the device will respond with the previous (Spotify) tracks metadata
419
422
  * `stop()` is intended to disconnect the client and pause the stream. Doesnt always function this way, depending on stream source
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "vsslctrl"
7
- version = "0.1.4.dev1"
7
+ version = "0.1.5.dev1"
8
8
  description = "Package for controlling VSSL amplifiers"
9
9
  authors = [
10
10
  { name="vsslctrl", email="vsslcontrolled@proton.me" },
@@ -158,6 +158,19 @@ class APIBase(ABC):
158
158
 
159
159
  except asyncio.CancelledError:
160
160
  self._log_debug(f"writer close timeout")
161
+ except asyncio.TimeoutError as e:
162
+ self._log_error(f"Timeout while closing connection: {e}")
163
+ # Handle the timeout: log, retry, or take other actions
164
+ except ConnectionResetError as e:
165
+ self._log_error(f"Connection reset by peer: {e}")
166
+ # Handle the error: log, retry, or take other actions
167
+ except Exception as e:
168
+ self._log_error(f"Unexpected error occurred while disconnecting: {e}")
169
+ # Handle unexpected errors
170
+ finally:
171
+ self._writer = None
172
+
173
+ self._reader = None
161
174
 
162
175
  self._log_info(f"{self.host}:{self.port}: disconnected")
163
176
 
@@ -43,12 +43,35 @@ class ZoneIDs(VsslIntEnum):
43
43
  ZONE_6 = 6
44
44
 
45
45
 
46
- """ JSON Structure
47
-
48
- DO NOT CHANGE - VSSL Defined
49
-
50
- {'B1Src': '3', 'B2Src': '4', 'B3Src': '5', 'B1Nm': '', 'B2Nm': 'Optical In', 'dev': 'Device Name', 'ver': 'p15305.016.3701'}
51
-
46
+ """
47
+ JSON Structure
48
+
49
+ DO NOT CHANGE - VSSL Defined
50
+
51
+ A3.x
52
+ {
53
+ "B1Src": "3",
54
+ "B2Src": "4",
55
+ "B3Src": "5",
56
+ "B1Nm": "",
57
+ "B2Nm": "Optical In",
58
+ "dev": "Device Name",
59
+ "ver": "p15305.016.3701"
60
+ }
61
+
62
+ A6.x
63
+ {
64
+ "B1Src": "3",
65
+ "B2Src": "4",
66
+ "B3Src": "5",
67
+ "B4Src": "6",
68
+ "B5Src": "7",
69
+ "B6Src": "8",
70
+ "B1Nm": "",
71
+ "B2Nm": "",
72
+ "dev": "VSSL A.6x",
73
+ "ver": "p15305.017.3701"
74
+ }
52
75
  """
53
76
 
54
77
 
@@ -69,13 +92,50 @@ class DeviceStatusExtKeys:
69
92
  return f"B{zone_id}Src"
70
93
 
71
94
 
72
- """ JSON Structure
73
-
74
- DO NOT CHANGE - VSSL Defined
75
-
76
- {'id': '1', 'ac': '0', 'mc': 'XXXXXXXXXXXX', 'vol': '20', 'mt': '0', 'pa': '0', 'rm': '0', 'ts': '14',
77
- 'alex': '14', 'nmd': '0', 'ird': '14', 'lb': '24', 'tp': '13', 'wr': '0', 'as': '0', 'rg': '0'}
78
-
95
+ """
96
+ JSON Structure
97
+
98
+ DO NOT CHANGE - VSSL Defined
99
+
100
+ A3.x
101
+ {
102
+ "id": "1",
103
+ "ac": "0",
104
+ "mc": "XXXXXXXXXXXX",
105
+ "vol": "20",
106
+ "mt": "0",
107
+ "pa": "0",
108
+ "rm": "0",
109
+ "ts": "14",
110
+ "alex": "14",
111
+ "nmd": "0",
112
+ "ird": "14",
113
+ "lb": "24",
114
+ "tp": "13",
115
+ "wr": "0",
116
+ "as": "0",
117
+ "rg": "0"
118
+ }
119
+
120
+ A6.x
121
+ {
122
+ "id": "1",
123
+ "ac": "0",
124
+ "mc": "XXXXXXXXXXXX",
125
+ "vol": "50",
126
+ "mt": "0",
127
+ "pa": "0",
128
+ "rm": "0",
129
+ "ts": "0",
130
+ "alex": "126",
131
+ "nmd": "0",
132
+ "ird": "255",
133
+ "lb": "17",
134
+ "tp": "16",
135
+ "wr": "0",
136
+ "as": "0",
137
+ "rg": "0"
138
+ }
79
139
  """
80
140
 
81
141
 
@@ -91,13 +151,42 @@ class ZoneStatusExtKeys:
91
151
  DISABLED = "wr"
92
152
 
93
153
 
94
- """ JSON Structure
95
-
96
- DO NOT CHANGE - VSSL Defined
97
-
98
- {'mono': '0', 'AiNm': 'Analog In 1', 'eq1': '100', 'eq2': '100', 'eq3': '100', 'eq4': '100',
99
- 'eq5': '100', 'eq6': '100', 'eq7': '100', 'voll': '75', 'volr': '75', 'vold': '0'}
100
-
154
+ """
155
+ JSON Structure
156
+
157
+ DO NOT CHANGE - VSSL Defined
158
+
159
+ A3.x
160
+ {
161
+ "mono": "0",
162
+ "AiNm": "Analog In 1",
163
+ "eq1": "100",
164
+ "eq2": "100",
165
+ "eq3": "100",
166
+ "eq4": "100",
167
+ "eq5": "100",
168
+ "eq6": "100",
169
+ "eq7": "100",
170
+ "voll": "75",
171
+ "volr": "75",
172
+ "vold": "0"
173
+ }
174
+
175
+ A6.x
176
+ {
177
+ "mono": "0",
178
+ "AiNm": "",
179
+ "eq1": "100",
180
+ "eq2": "100",
181
+ "eq3": "100",
182
+ "eq4": "100",
183
+ "eq5": "100",
184
+ "eq6": "100",
185
+ "eq7": "100",
186
+ "voll": "75",
187
+ "volr": "75",
188
+ "vold": "0"
189
+ }
101
190
  """
102
191
 
103
192
 
@@ -116,13 +205,47 @@ class ZoneEQStatusExtKeys:
116
205
  VOL_DEFAULT_ON = "vold"
117
206
 
118
207
 
119
- """ JSON Structure
120
-
121
- DO NOT CHANGE - VSSL Defined
122
-
123
- {'ECO': '0', 'eqsw': '1', 'inSrc': '0', 'SP': '0', 'BF1': '0', 'BF2': '0', 'BF3': '0',
124
- 'GRM': '0', 'GRS': '255', 'Pwr': '0', 'Bvr': '1', 'fxv': '24', 'AtPwr': '1'}
125
-
208
+ """
209
+ JSON Structure
210
+
211
+ DO NOT CHANGE - VSSL Defined
212
+
213
+ A3.x
214
+ {
215
+ "ECO": "0",
216
+ "eqsw": "1",
217
+ "inSrc": "0",
218
+ "SP": "0",
219
+ "BF1": "0",
220
+ "BF2": "0",
221
+ "BF3": "0",
222
+ "GRM": "0",
223
+ "GRS": "255",
224
+ "Pwr": "0",
225
+ "Bvr": "1",
226
+ "fxv": "24",
227
+ "AtPwr": "1"
228
+ }
229
+
230
+ A6.x
231
+ {
232
+ "ECO": "0",
233
+ "eqsw": "1",
234
+ "inSrc": "0",
235
+ "SP": "0",
236
+ "BF1": "0",
237
+ "BF2": "0",
238
+ "BF3": "0",
239
+ "BF4": "0",
240
+ "BF5": "0",
241
+ "BF6": "0",
242
+ "GRM": "0",
243
+ "GRS": "255",
244
+ "Pwr": "0",
245
+ "Bvr": "2",
246
+ "fxv": "25",
247
+ "AtPwr": "1"
248
+ }
126
249
  """
127
250
 
128
251
 
@@ -142,17 +265,37 @@ class ZoneRouterStatusExtKeys:
142
265
  return f"BF{zone_id}"
143
266
 
144
267
 
145
- """ JSON Structure
146
-
147
- DO NOT CHANGE - VSSL Defined
148
-
149
- {'Album': 'International Skankers', 'Artist': 'Ashkabad', 'BitDepth': 16,
150
- 'BitRate': '320000', 'CoverArtUrl': 'https://i.scdn.co/image/ab67616d0000b2730cbb03a339c6ffd18d10eab2',
151
- 'Current Source': 4, 'Current_time': -1, 'DSDType': '', 'Fav': False, 'FileSize': 0, 'Genre': '',
152
- 'Index': 0, 'Mime': 'Ogg', 'Next': False, 'PlayState': 0, 'PlayUrl': 'spotify:track:0IHTiLO5qBYhf7Hmn0UDBN',
153
- 'Prev': False, 'Repeat': 0, 'SampleRate': '44100', 'Seek': False, 'Shuffle': 0, 'SinglePlay': False,
154
- 'TotalTime': 203087, 'TrackName': 'Beijing'}
155
-
268
+ """
269
+ JSON Structure
270
+
271
+ DO NOT CHANGE - VSSL Defined
272
+
273
+ {
274
+ "Album": "International Skankers",
275
+ "Artist": "Ashkabad",
276
+ "BitDepth": 16,
277
+ "BitRate": "320000",
278
+ "CoverArtUrl": "https://i.scdn.co/image/ab67616d0000b2730cbb03a339c6ffd18d10eab2",
279
+ "Current Source": 4,
280
+ "Current_time": -1,
281
+ "DSDType": "",
282
+ "Fav": False,
283
+ "FileSize": 0,
284
+ "Genre": "",
285
+ "Index": 0,
286
+ "Mime": "Ogg",
287
+ "Next": False,
288
+ "PlayState": 0,
289
+ "PlayUrl": "spotify:track:0IHTiLO5qBYhf7Hmn0UDBN",
290
+ "Prev": False,
291
+ "Repeat": 0,
292
+ "SampleRate": "44100",
293
+ "Seek": False,
294
+ "Shuffle": 0,
295
+ "SinglePlay": False,
296
+ "TotalTime": 203087,
297
+ "TrackName": "Beijing"
298
+ }
156
299
  """
157
300
 
158
301
 
@@ -139,7 +139,7 @@ class AnalogOutput(ZoneDataClass):
139
139
  self.zone = zone
140
140
 
141
141
  self._is_fixed_volume = False
142
- self._source = self.Sources(zone.id + 3)
142
+ self._source = self.Sources(zone.id + 2)
143
143
 
144
144
  #
145
145
  # Analog Output Fix Volume. Output wont respond to volume control
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vsslctrl
3
- Version: 0.1.4.dev1
3
+ Version: 0.1.5.dev1
4
4
  Summary: Package for controlling VSSL amplifiers
5
5
  Author-email: vsslctrl <vsslcontrolled@proton.me>
6
6
  Classifier: Development Status :: 4 - Beta
@@ -32,6 +32,8 @@ Important
32
32
  -----------
33
33
  Only tested on a VSSL **A.3x** software version **p15305.016.3701**.
34
34
 
35
+ **Notice:** VSSLs new iOS app titled `VSSL`can cause connection refused issues if running at the same time as `vsslctrl`. Best to not use the iOS app togeather. The `VSSL Legacy` app works fine
36
+
35
37
  **Warning:** no *[VSSL Agent](https://vssl.gitbook.io/vssl-rest-api/getting-started/start)* should be running on the same network. If you dont know what this is, then you can probably ignore this notice.
36
38
 
37
39
  ## TODOs
@@ -225,7 +227,7 @@ zone1.transport.state = ZoneTransport.States.PAUSE
225
227
  ## `Zone.track`
226
228
 
227
229
  * Not all sources have complete metadata - missing value will be set to defaults.
228
- * Airplay track position is not avaiable.
230
+ * Airplay track `progress` is not avaiable.
229
231
 
230
232
  | Property | Description | Type | Values |
231
233
  | ---------------------- | ----------- | ----------- |----------- |
@@ -379,7 +381,7 @@ zone1.settings.eq.khz1_db = -2
379
381
 
380
382
  ## Another (Lite) Way
381
383
 
382
- If you perfer to not run the complete intergration, you can send basic HEX commands to the VSSL device using [Netcat](https://nc110.sourceforge.io/) (or ant network tool) on port `50002`.
384
+ If you perfer to not run the complete intergration, you can send basic HEX commands to the VSSL device using [Netcat](https://nc110.sourceforge.io/) (or any network tool) on port `50002`.
383
385
 
384
386
  | HEX | Description |
385
387
  | ---------------------- | ----------- |
@@ -435,6 +437,7 @@ The VSSL API was reverse engineered using Wireshark, VSSLs native "legacy" iOS a
435
437
  * VSSL can not start a stream except for playing a URL directly. This is a limitation of the hardware itself.
436
438
  * Not all sources set the volume to 0 when the zone is muted
437
439
  * Grouping feedback is flaky on the X series amplifiers
440
+ * Airplay `Zone.track.progress` is not avaiable.
438
441
  * Cant stop a URL playback, feedback is worng at least
439
442
  * VSSL likes to cache old track metadata. For example when playing a URL after Spotify, often the device will respond with the previous (Spotify) tracks metadata
440
443
  * `stop()` is intended to disconnect the client and pause the stream. Doesnt always function this way, depending on stream source
File without changes
File without changes