vsslctrl 0.1.7.dev1__tar.gz → 0.1.8.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.7.dev1 → vsslctrl-0.1.8.dev1}/PKG-INFO +8 -1
  2. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/README.md +7 -0
  3. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/pyproject.toml +1 -1
  4. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/api_alpha.py +101 -34
  5. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/core.py +5 -0
  6. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/data_structure.py +86 -16
  7. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/device.py +156 -11
  8. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/discovery.py +1 -1
  9. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/io.py +14 -2
  10. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/settings.py +5 -4
  11. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl.egg-info/PKG-INFO +8 -1
  12. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/LICENSE +0 -0
  13. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/setup.cfg +0 -0
  14. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/tests/test_event_bus.py +0 -0
  15. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/tests/test_integration.py +0 -0
  16. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/tests/test_settings.py +0 -0
  17. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/tests/test_zone.py +0 -0
  18. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/__init__.py +0 -0
  19. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/api_base.py +0 -0
  20. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/api_bravo.py +0 -0
  21. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/decorators.py +0 -0
  22. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/event_bus.py +0 -0
  23. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/exceptions.py +0 -0
  24. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/group.py +0 -0
  25. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/track.py +0 -0
  26. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/transport.py +0 -0
  27. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/utils.py +0 -0
  28. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl/zone.py +0 -0
  29. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl.egg-info/SOURCES.txt +0 -0
  30. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl.egg-info/dependency_links.txt +0 -0
  31. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.dev1}/vsslctrl.egg-info/requires.txt +0 -0
  32. {vsslctrl-0.1.7.dev1 → vsslctrl-0.1.8.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.7.dev1
3
+ Version: 0.1.8.dev1
4
4
  Summary: Package for controlling VSSL's range of streaming amplifiers
5
5
  Author-email: vsslctrl <vsslcontrolled@proton.me>
6
6
  Classifier: Development Status :: 4 - Beta
@@ -247,6 +247,13 @@ zone1.transport.state = ZoneTransport.States.PAUSE
247
247
  | `source` | Change input source | `int` | `InputRouter.Sources`
248
248
  | `priority` | Change input priority. Stream or analog in higher priority | `int` | `InputRouter.Priorities`
249
249
 
250
+ ### Priority Order:
251
+
252
+ | `InputRouter.Priorities` | Priority Order |
253
+ | ---------------------- | ----------- |
254
+ | **`STREAM`** | <ol><li>Stream</li><li>Party Zone</li><li>Bus 1 In</li><li>Bus 2 In</li><li>Analog Input</li></ol>
255
+ | **`LOCAL`** | <ol><li>Bus 1 In</li><li>Bus 2 In</li><li>Analog Input</li><li>Stream</li><li>Party Zone</li></ol>
256
+
250
257
  ```python
251
258
  """Example"""
252
259
  # Change zone 1 to listen to analog input 4
@@ -226,6 +226,13 @@ zone1.transport.state = ZoneTransport.States.PAUSE
226
226
  | `source` | Change input source | `int` | `InputRouter.Sources`
227
227
  | `priority` | Change input priority. Stream or analog in higher priority | `int` | `InputRouter.Priorities`
228
228
 
229
+ ### Priority Order:
230
+
231
+ | `InputRouter.Priorities` | Priority Order |
232
+ | ---------------------- | ----------- |
233
+ | **`STREAM`** | <ol><li>Stream</li><li>Party Zone</li><li>Bus 1 In</li><li>Bus 2 In</li><li>Analog Input</li></ol>
234
+ | **`LOCAL`** | <ol><li>Bus 1 In</li><li>Bus 2 In</li><li>Analog Input</li><li>Stream</li><li>Party Zone</li></ol>
235
+
229
236
  ```python
230
237
  """Example"""
231
238
  # Change zone 1 to listen to analog input 4
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "vsslctrl"
7
- version = "0.1.7.dev1"
7
+ version = "0.1.8.dev1"
8
8
  description = "Package for controlling VSSL's range of streaming amplifiers"
9
9
  authors = [
10
10
  { name="vsslctrl", email="vsslcontrolled@proton.me" },
@@ -550,12 +550,22 @@ class APIAlpha(APIBase):
550
550
  except Exception as error:
551
551
  self._log_error(f"Couldnt parse JSON: {error} | {hexl}")
552
552
 
553
- #
554
- # 00_00
555
- # Device Status 00
556
- #
557
- # {'B1Src': '3', 'B2Src': '4', 'B3Src': '5', 'B1Nm': '', 'B2Nm': 'Optical In', 'dev': 'Device Name', 'ver': 'p15305.016.3701'}
558
- #
553
+ """
554
+ 00_00
555
+ Device Status 00
556
+
557
+ A.3x:
558
+ {
559
+ "B1Src": "3",
560
+ "B2Src": "4",
561
+ "B3Src": "5",
562
+ "B1Nm": "",
563
+ "B2Nm": "Optical In",
564
+ "dev": "Device Name",
565
+ "ver": "p15305.016.3701"
566
+ }
567
+ """
568
+
559
569
  def response_action_00_00(self, metadata: list):
560
570
  self._log_debug(f"Received 00 Status: {metadata}")
561
571
 
@@ -589,13 +599,32 @@ class APIAlpha(APIBase):
589
599
  "sw_version", metadata[DeviceStatusExtKeys.SW_VERSION].strip()
590
600
  )
591
601
 
592
- #
593
- # 00_08
594
- # Zone Status 08
595
- #
596
- # {'id': '1', 'ac': '0', 'mc': 'XXXXXXXXXXXX', 'vol': '20', 'mt': '0', 'pa': '0', 'rm': '0', 'ts': '14',
597
- # 'alex': '14', 'nmd': '0', 'ird': '14', 'lb': '24', 'tp': '13', 'wr': '0', 'as': '0', 'rg': '0'}
598
- #
602
+ """
603
+ 00_08
604
+ Zone Status 08
605
+
606
+ A.3x:
607
+ {
608
+ "id": "1",
609
+ "ac": "0",
610
+ "mc": "XXXXXXXXXXXX",
611
+ "vol": "20",
612
+ "mt": "0",
613
+ "pa": "0",
614
+ "rm": "0",
615
+ "ts": "14",
616
+ "alex": "14",
617
+ "nmd": "0",
618
+ "ird": "14",
619
+ "lb": "24",
620
+ "tp": "13",
621
+ "wr": "0",
622
+ "as": "0",
623
+ "rg": "0"
624
+ }
625
+
626
+ """
627
+
599
628
  def response_action_00_08(self, metadata: list):
600
629
  self._log_debug(f"Received 08 Status: {metadata}")
601
630
 
@@ -653,13 +682,27 @@ class APIAlpha(APIBase):
653
682
  "disabled", bool(int(metadata[ZoneStatusExtKeys.DISABLED]))
654
683
  )
655
684
 
656
- #
657
- # 00_09
658
- # EQ Status
659
- #
660
- # {'mono': '0', 'AiNm': 'Analog In 1', 'eq1': '100', 'eq2': '100', 'eq3': '100', 'eq4': '100',
661
- # 'eq5': '100', 'eq6': '100', 'eq7': '100', 'voll': '75', 'volr': '75', 'vold': '0'}
662
- #
685
+ """
686
+ 00_09
687
+ EQ Status
688
+
689
+ A.3x:
690
+ {
691
+ "mono": "0",
692
+ "AiNm": "Analog In 1",
693
+ "eq1": "100",
694
+ "eq2": "100",
695
+ "eq3": "100",
696
+ "eq4": "100",
697
+ "eq5": "100",
698
+ "eq6": "100",
699
+ "eq7": "100",
700
+ "voll": "75",
701
+ "volr": "75",
702
+ "vold": "0"
703
+ }
704
+ """
705
+
663
706
  def response_action_00_09(self, metadata: list):
664
707
  self._log_debug(f"Received 09 Status: {metadata}")
665
708
 
@@ -678,13 +721,28 @@ class APIAlpha(APIBase):
678
721
  self.zone.settings.eq._map_response_dict(metadata)
679
722
  self.zone.settings.volume._map_response_dict(metadata)
680
723
 
681
- #
682
- # 00_0A
683
- # System Status 0A (Output / Amp)
684
- #
685
- # {'ECO': '0', 'eqsw': '1', 'inSrc': '0', 'SP': '0', 'BF1': '0', 'BF2': '0', 'BF3': '0',
686
- # 'GRM': '0', 'GRS': '255', 'Pwr': '0', 'Bvr': '1', 'fxv': '24', 'AtPwr': '1'}
687
- #
724
+ """
725
+ 00_0A
726
+ System Status 0A (Output / Amp)
727
+
728
+ A.3x:
729
+ {
730
+ "ECO": "0",
731
+ "eqsw": "1",
732
+ "inSrc": "0",
733
+ "SP": "0",
734
+ "BF1": "0",
735
+ "BF2": "0",
736
+ "BF3": "0",
737
+ "GRM": "0",
738
+ "GRS": "255",
739
+ "Pwr": "0",
740
+ "Bvr": "1",
741
+ "fxv": "24",
742
+ "AtPwr": "1"
743
+ }
744
+ """
745
+
688
746
  def response_action_00_0A(self, metadata: list):
689
747
  self._log_debug(f"Received 0A Status: {metadata}")
690
748
 
@@ -745,12 +803,21 @@ class APIAlpha(APIBase):
745
803
  "adaptive", bool(int(metadata[ZoneRouterStatusExtKeys.ADAPTIVE_POWER]))
746
804
  )
747
805
 
748
- #
749
- # 00_0B
750
- # Device Status Extended 0B
751
- #
752
- # {'IRMskL': '241', 'IRMskH': '255', 'BTSta': '0', 'Crs': '0', 'Fes': '0', 'Drk': '0'}
753
- #
806
+ """
807
+ 00_0B
808
+ Device Status Extended 0B
809
+
810
+ A.3x:
811
+ {
812
+ 'IRMskL': '241',
813
+ 'IRMskH': '255',
814
+ 'BTSta': '0',
815
+ 'Crs': '0',
816
+ 'Fes': '0',
817
+ 'Drk': '0'
818
+ }
819
+ """
820
+
754
821
  def response_action_00_0B(self, metadata: list):
755
822
  self._log_debug(f"Received 0B Status: {metadata}")
756
823
 
@@ -925,7 +992,7 @@ class APIAlpha(APIBase):
925
992
  # Keep Alive
926
993
  #
927
994
  def response_action_17(self, hexl: list, response: bytes):
928
- self._log_debug(f"Z{self.zone.id} Alpha - Received keep alive: {response}")
995
+ self._log_debug(f"Received keep alive: {response}")
929
996
  # TODO
930
997
  pass
931
998
 
@@ -93,6 +93,11 @@ class Vssl:
93
93
  await first_zone.disconnect()
94
94
  raise VsslCtrlException(message)
95
95
 
96
+ # Output a bit of helpful info
97
+ self._log_info(f"Device Model: {self.model.name}")
98
+ self._log_info(f"Device SW Version: {self.sw_version}")
99
+ self._log_info(f"Device Serial: {self.serial}")
100
+
96
101
  # Now we can init the rest of the zones
97
102
  initialisations = [zone.initialise() for zone in zones_to_init.values()]
98
103
  await asyncio.gather(*initialisations)
@@ -41,6 +41,7 @@ class ZoneIDs(VsslIntEnum):
41
41
  ZONE_4 = 4
42
42
  ZONE_5 = 5
43
43
  ZONE_6 = 6
44
+ A1 = 7 # A.1 and A.1x
44
45
 
45
46
 
46
47
  """
@@ -48,7 +49,7 @@ JSON Structure
48
49
 
49
50
  DO NOT CHANGE - VSSL Defined
50
51
 
51
- A3.x
52
+ A.3x
52
53
  {
53
54
  "B1Src": "3",
54
55
  "B2Src": "4",
@@ -59,7 +60,17 @@ A3.x
59
60
  "ver": "p15305.016.3701"
60
61
  }
61
62
 
62
- A6.x
63
+ A.3
64
+ {
65
+ 'B1Src': '1',
66
+ 'B2Src': '2',
67
+ 'B1Nm': '',
68
+ 'B2Nm': '',
69
+ 'dev': 'VSSL A.3',
70
+ 'ver': '12013 .141.3703'
71
+ }
72
+
73
+ A.6x
63
74
  {
64
75
  "B1Src": "3",
65
76
  "B2Src": "4",
@@ -113,7 +124,7 @@ DO NOT CHANGE - VSSL Defined
113
124
  Drk: ?
114
125
 
115
126
 
116
- A3.x
127
+ A.3x
117
128
  {
118
129
  'IRMskL': '241',
119
130
  'IRMskH': '255',
@@ -123,14 +134,24 @@ A3.x
123
134
  'Drk': '0'
124
135
  }
125
136
 
126
- A6.x
137
+ A.3
138
+ {
139
+ 'IRMskL': '255',
140
+ 'IRMskH': '255',
141
+ 'BTSta': '0',
142
+ 'Crs': '0',
143
+ 'Fes': '0',
144
+ 'Drk': '0'
145
+ }
146
+
147
+ A.6x
127
148
  {
128
- "IRMskL":"255",
129
- "IRMskH":"255",
130
- "BTSta":"0",
131
- "Crs":"0",
132
- "Fes":"0",
133
- "Drk":"0"
149
+ "IRMskL": "255",
150
+ "IRMskH": "255",
151
+ "BTSta": "0",
152
+ "Crs": "0",
153
+ "Fes": "0",
154
+ "Drk": "0"
134
155
  '
135
156
 
136
157
  """
@@ -148,7 +169,7 @@ JSON Structure
148
169
 
149
170
  DO NOT CHANGE - VSSL Defined
150
171
 
151
- A3.x
172
+ A.3x
152
173
  {
153
174
  "id": "1",
154
175
  "ac": "0",
@@ -168,7 +189,24 @@ A3.x
168
189
  "rg": "0"
169
190
  }
170
191
 
171
- A6.x
192
+ A.3
193
+ {
194
+ 'id': '3',
195
+ 'ac': '0',
196
+ 'mc': 'XXXXXXXXXXXX',
197
+ 'vol': '27',
198
+ 'mt': '0',
199
+ 'pa': '1',
200
+ 'rm': '0',
201
+ 'ts': '0',
202
+ 'lb': '17',
203
+ 'tp': '3',
204
+ 'wr': '0',
205
+ 'as': '0',
206
+ 'rg': '0'
207
+ }
208
+
209
+ A.6x
172
210
  {
173
211
  "id": "1",
174
212
  "ac": "0",
@@ -207,7 +245,7 @@ JSON Structure
207
245
 
208
246
  DO NOT CHANGE - VSSL Defined
209
247
 
210
- A3.x
248
+ A.3x
211
249
  {
212
250
  "mono": "0",
213
251
  "AiNm": "Analog In 1",
@@ -223,7 +261,23 @@ A3.x
223
261
  "vold": "0"
224
262
  }
225
263
 
226
- A6.x
264
+ A.3
265
+ {
266
+ 'mono': '0',
267
+ 'AiNm': 'Backup',
268
+ 'eq1': '106',
269
+ 'eq2': '102',
270
+ 'eq3': '100',
271
+ 'eq4': '100',
272
+ 'eq5': '100',
273
+ 'eq6': '101',
274
+ 'eq7': '105',
275
+ 'voll': '75',
276
+ 'volr': '75',
277
+ 'vold': '27'
278
+ }
279
+
280
+ A.6x
227
281
  {
228
282
  "mono": "0",
229
283
  "AiNm": "",
@@ -261,7 +315,7 @@ JSON Structure
261
315
 
262
316
  DO NOT CHANGE - VSSL Defined
263
317
 
264
- A3.x
318
+ A.3x
265
319
  {
266
320
  "ECO": "0",
267
321
  "eqsw": "1",
@@ -278,7 +332,23 @@ A3.x
278
332
  "AtPwr": "1"
279
333
  }
280
334
 
281
- A6.x
335
+ A.3
336
+ {
337
+ "ECO": "0",
338
+ "eqsw": "1",
339
+ "inSrc": "0",
340
+ "SP": "0",
341
+ "BF1": "0",
342
+ "BF2": "0",
343
+ "GRM": "0",
344
+ "GRS": "255",
345
+ "Pwr": "0",
346
+ "Bvr": "15",
347
+ "fxv": "25",
348
+ "AtPwr": "1"
349
+ }
350
+
351
+ A.6x
282
352
  {
283
353
  "ECO": "0",
284
354
  "eqsw": "1",
@@ -1,35 +1,180 @@
1
1
  from .data_structure import VsslEnum, VsslIntEnum, ZoneIDs
2
2
  from .io import AnalogOutput, InputRouter
3
3
 
4
- SINGLE_ZONE = [ZoneIDs.ZONE_1]
4
+
5
+ """
6
+ Model Physical IOs, sourced from the product manuals
7
+
8
+ A.1x:
9
+ SUB OUT
10
+ ANALOG IN 1
11
+ ANALOG OUT 1
12
+ COAXIAL IN (Are Coxial and Optical inputs linked?)
13
+ COAXIAL OUT
14
+ OPTICAL IN
15
+ OPTICAL OUT
16
+ IR REMOTE
17
+
18
+ A1:
19
+ SUB OUT
20
+ ANALOG IN 1
21
+ ANALOG OUT 1
22
+ COAXIAL IN (Are Coxial and Optical inputs linked?)
23
+ COAXIAL OUT
24
+ OPTICAL IN
25
+ OPTICAL OUT
26
+ IR REMOTE
27
+
28
+
29
+
30
+ A.3x:
31
+ ANALOG IN 1
32
+ ANALOG IN 2
33
+ ANALOG IN 3
34
+ ANALOG OUT 1
35
+ ANALOG OUT 2
36
+ ANALOG OUT 3
37
+ OPTICAL IN
38
+ IR REMOTE
39
+
40
+ A3:
41
+ BUS 1 IN
42
+ BUS 1 OUT
43
+ ANALOG IN 1
44
+ ANALOG IN 2
45
+ ANALOG IN 3
46
+ OPTICAL IN
47
+
48
+
49
+
50
+ A.6x:
51
+ ANALOG IN 1
52
+ ANALOG IN 2
53
+ ANALOG IN 3
54
+ ANALOG IN 4
55
+ ANALOG IN 5
56
+ ANALOG IN 6
57
+ ANALOG OUT 1
58
+ ANALOG OUT 2
59
+ ANALOG OUT 3
60
+ ANALOG OUT 4
61
+ ANALOG OUT 5
62
+ ANALOG OUT 6
63
+ OPTICAL IN
64
+ IR REMOTE
65
+
66
+ A6:
67
+ BUS 1 IN
68
+ BUS 1 OUT
69
+ BUS 2 IN
70
+ BUS 2 OUT
71
+ ANALOG IN 1
72
+ ANALOG IN 2
73
+ ANALOG IN 3
74
+ ANALOG IN 4
75
+ ANALOG IN 5
76
+ ANALOG IN 6
77
+
78
+ ---------------------------------
79
+
80
+ Analog Input Source legend: input: inputs specific to model (e.g. A3 does not have zones 4-6 or bus input 2, only A3 has optical input, ...)
81
+
82
+
83
+ 0 - none
84
+ 1 - bus input 1
85
+ 2 - bus input 2
86
+ 3 - zone 1 local input
87
+ 4 - zone 2 local input
88
+ 5 - zone 3 local input
89
+ 6 - zone 4 local input
90
+ 7 - zone 5 local input
91
+ 8 - zone 6 local input
92
+ 16 - optical input
93
+
94
+
95
+ Source: https://vssl.gitbook.io/vssl-rest-api/zone-control/set-analog-input-source
96
+
97
+
98
+ """
99
+
100
+
101
+ """
102
+ Zones
103
+
104
+
105
+ """
106
+ SINGLE_ZONE = [ZoneIDs.A1]
5
107
  THREE_ZONES = [ZoneIDs.ZONE_1, ZoneIDs.ZONE_2, ZoneIDs.ZONE_3]
6
- SIX_ZONES = list(ZoneIDs)
108
+ SIX_ZONES = THREE_ZONES + [ZoneIDs.ZONE_4, ZoneIDs.ZONE_5, ZoneIDs.ZONE_6]
109
+
110
+ """
111
+ Input Sources
7
112
 
113
+
114
+ """
115
+
116
+ # A.1 & A.1x
8
117
  INPUT_SOURCES_FOR_1_ZONE_DEVICE = [
9
118
  InputRouter.Sources.STREAM,
10
119
  InputRouter.Sources.ANALOG_IN_1,
11
120
  InputRouter.Sources.OPTICAL_IN,
12
121
  ]
13
122
 
123
+ # A.3x
14
124
  INPUT_SOURCES_FOR_3_ZONE_DEVICE = INPUT_SOURCES_FOR_1_ZONE_DEVICE + [
15
125
  InputRouter.Sources.ANALOG_IN_2,
16
126
  InputRouter.Sources.ANALOG_IN_3,
17
127
  ]
18
128
 
19
- INPUT_SOURCES_FOR_6_ZONE_DEVICE = list(InputRouter.Sources)
129
+ # A.3
130
+ INPUT_SOURCES_FOR_A3 = INPUT_SOURCES_FOR_3_ZONE_DEVICE + [InputRouter.Sources.BUS_IN_1]
131
+
132
+ # A.6x
133
+ INPUT_SOURCES_FOR_6_ZONE_DEVICE = INPUT_SOURCES_FOR_3_ZONE_DEVICE + [
134
+ InputRouter.Sources.ANALOG_IN_4,
135
+ InputRouter.Sources.ANALOG_IN_5,
136
+ InputRouter.Sources.ANALOG_IN_6,
137
+ ]
138
+
139
+ # A.6
140
+ INPUT_SOURCES_FOR_A6 = [
141
+ source for source in InputRouter.Sources if source != InputRouter.Sources.OPTICAL_IN
142
+ ]
143
+
144
+
145
+ """
146
+ Analog Output Sources
20
147
 
148
+
149
+ """
150
+
151
+ # A.1 & A.1x
21
152
  ANALOG_OUTPUT_SOURCES_FOR_1_ZONE_DEVICE = [
22
153
  AnalogOutput.Sources.OFF,
23
154
  AnalogOutput.Sources.ZONE_1,
24
155
  AnalogOutput.Sources.OPTICAL_IN,
25
156
  ]
26
157
 
158
+ # A.3x
27
159
  ANALOG_OUTPUT_SOURCES_FOR_3_ZONE_DEVICE = ANALOG_OUTPUT_SOURCES_FOR_1_ZONE_DEVICE + [
28
160
  AnalogOutput.Sources.ZONE_2,
29
161
  AnalogOutput.Sources.ZONE_3,
30
162
  ]
31
163
 
32
- ANALOG_OUTPUT_SOURCES_FOR_6_ZONE_DEVICE = list(AnalogOutput.Sources)
164
+ # A.3
165
+ ANALOG_OUTPUT_SOURCES_FOR_A3 = ANALOG_OUTPUT_SOURCES_FOR_3_ZONE_DEVICE + [
166
+ AnalogOutput.Sources.BUS_IN_1
167
+ ]
168
+
169
+ # A.6x
170
+ ANALOG_OUTPUT_SOURCES_FOR_6_ZONE_DEVICE = ANALOG_OUTPUT_SOURCES_FOR_3_ZONE_DEVICE + [
171
+ AnalogOutput.Sources.ZONE_4,
172
+ AnalogOutput.Sources.ZONE_5,
173
+ AnalogOutput.Sources.ZONE_6,
174
+ ]
175
+
176
+ # A.6
177
+ ANALOG_OUTPUT_SOURCES_FOR_A6 = list(AnalogOutput.Sources)
33
178
 
34
179
 
35
180
  class Features(VsslIntEnum):
@@ -62,7 +207,7 @@ class Model:
62
207
  class Models(VsslEnum):
63
208
  A1 = Model(
64
209
  {
65
- "name": "A1",
210
+ "name": "A.1",
66
211
  "zones": SINGLE_ZONE,
67
212
  "input_sources": INPUT_SOURCES_FOR_1_ZONE_DEVICE,
68
213
  "analog_output_sources": ANALOG_OUTPUT_SOURCES_FOR_1_ZONE_DEVICE,
@@ -71,19 +216,19 @@ class Models(VsslEnum):
71
216
  )
72
217
  A3 = Model(
73
218
  {
74
- "name": "A3",
219
+ "name": "A.3",
75
220
  "zones": THREE_ZONES,
76
- "input_sources": INPUT_SOURCES_FOR_3_ZONE_DEVICE,
77
- "analog_output_sources": ANALOG_OUTPUT_SOURCES_FOR_3_ZONE_DEVICE,
221
+ "input_sources": INPUT_SOURCES_FOR_A3,
222
+ "analog_output_sources": ANALOG_OUTPUT_SOURCES_FOR_A3,
78
223
  "features": [Features.GROUPING, Features.PARTY_MODE],
79
224
  }
80
225
  )
81
226
  A6 = Model(
82
227
  {
83
- "name": "A6",
228
+ "name": "A.6",
84
229
  "zones": SIX_ZONES,
85
- "input_sources": INPUT_SOURCES_FOR_6_ZONE_DEVICE,
86
- "analog_output_sources": ANALOG_OUTPUT_SOURCES_FOR_6_ZONE_DEVICE,
230
+ "input_sources": INPUT_SOURCES_FOR_A6,
231
+ "analog_output_sources": ANALOG_OUTPUT_SOURCES_FOR_A6,
87
232
  "features": [Features.GROUPING, Features.PARTY_MODE],
88
233
  }
89
234
  )
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
- """ Scan for apple devices. """
3
+ """ UNTESTED AND IN DEV """
4
4
 
5
5
  import json
6
6
  import asyncio
@@ -9,8 +9,8 @@ class InputRouter(ZoneDataClass):
9
9
  #
10
10
  # Input Priority
11
11
  #
12
- # 0: Stream -> Analog Input
13
- # 1: Analog Input -> Stream (Local first)
12
+ # 0: Stream -> Party Zone -> Bus 1 In -> Bus 2 In -> Analog Input (Stream First)
13
+ # 1: Bus 1 In -> Bus 2 In -> Analog Input -> Stream -> Party Zone (Local First)
14
14
  #
15
15
  # DO NOT CHANGE - VSSL Defined
16
16
  #
@@ -25,6 +25,8 @@ class InputRouter(ZoneDataClass):
25
25
  #
26
26
  class Sources(VsslIntEnum):
27
27
  STREAM = 0
28
+ BUS_IN_1 = 1 # TODO bus or party mode of original A series
29
+ BUS_IN_2 = 2 # TODO bus or party mode of original A series
28
30
  ANALOG_IN_1 = 3
29
31
  ANALOG_IN_2 = 4
30
32
  ANALOG_IN_3 = 5
@@ -103,8 +105,14 @@ class InputRouter(ZoneDataClass):
103
105
 
104
106
  class AnalogOutput(ZoneDataClass):
105
107
  """
108
+
109
+ Analog output is the source which will play out the corrosponding analog output
110
+
111
+
106
112
  Should this be on the VSSL or Zone? For now its on the zone, because the zone will
107
113
  receive feedback for the corrosponding analog output id
114
+
115
+ Zones will be determined by source Input Priority
108
116
  """
109
117
 
110
118
  #
@@ -114,6 +122,8 @@ class AnalogOutput(ZoneDataClass):
114
122
  #
115
123
  class Sources(VsslIntEnum):
116
124
  OFF = 0 # Disconnected / Off / No Output
125
+ BUS_IN_1 = 1 # TODO bus or party mode of original A series
126
+ BUS_IN_2 = 2 # TODO bus or party mode of original A series
117
127
  ZONE_1 = 3
118
128
  ZONE_2 = 4
119
129
  ZONE_3 = 5
@@ -158,6 +168,8 @@ class AnalogOutput(ZoneDataClass):
158
168
  #
159
169
  # Analog Output Source
160
170
  #
171
+ # As in what audio is going to be sent to the analog output.
172
+ #
161
173
  @property
162
174
  def source(self):
163
175
  return self._source
@@ -90,7 +90,7 @@ class VsslSettings(VsslDataClass):
90
90
  if zone:
91
91
  # TODO
92
92
  # zone.api_alpha.request_action_bluetooth(not not enabled)
93
- pass
93
+ self._vssl._log_info(f"TODO - bluetooth set function")
94
94
 
95
95
  def bluetooth_toggle(self):
96
96
  self.bluetooth = False if self.bluetooth else True
@@ -118,13 +118,13 @@ class VsslPowerSettings(VsslDataClass):
118
118
  #
119
119
  # Defaults
120
120
  #
121
- DEFAULTS = {"state": States.ON, "adaptive": False}
121
+ DEFAULTS = {"state": States.ON, "adaptive": True}
122
122
 
123
123
  def __init__(self, vssl: "vsslctrl.Vssl"):
124
124
  self._vssl = vssl
125
125
 
126
- self._state = self.States.ON
127
- self._adaptive = True # 1 = auto, 0 = always on
126
+ self._state = self.DEFAULTS["state"]
127
+ self._adaptive = self.DEFAULTS["adaptive"] # 1 = auto, 0 = always on
128
128
 
129
129
  #
130
130
  # Power State
@@ -735,6 +735,7 @@ class SubwooferSettings(ZoneDataClass):
735
735
  #
736
736
  # TODO
737
737
  #
738
+ self.zone._log_info(f"TODO - crossover set function")
738
739
  # self.zone.api_alpha.request_action_crossover(freq)
739
740
 
740
741
  def _set_crossover(self, freq: int):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vsslctrl
3
- Version: 0.1.7.dev1
3
+ Version: 0.1.8.dev1
4
4
  Summary: Package for controlling VSSL's range of streaming amplifiers
5
5
  Author-email: vsslctrl <vsslcontrolled@proton.me>
6
6
  Classifier: Development Status :: 4 - Beta
@@ -247,6 +247,13 @@ zone1.transport.state = ZoneTransport.States.PAUSE
247
247
  | `source` | Change input source | `int` | `InputRouter.Sources`
248
248
  | `priority` | Change input priority. Stream or analog in higher priority | `int` | `InputRouter.Priorities`
249
249
 
250
+ ### Priority Order:
251
+
252
+ | `InputRouter.Priorities` | Priority Order |
253
+ | ---------------------- | ----------- |
254
+ | **`STREAM`** | <ol><li>Stream</li><li>Party Zone</li><li>Bus 1 In</li><li>Bus 2 In</li><li>Analog Input</li></ol>
255
+ | **`LOCAL`** | <ol><li>Bus 1 In</li><li>Bus 2 In</li><li>Analog Input</li><li>Stream</li><li>Party Zone</li></ol>
256
+
250
257
  ```python
251
258
  """Example"""
252
259
  # Change zone 1 to listen to analog input 4
File without changes
File without changes