lifx-emulator 1.0.1__py3-none-any.whl → 1.0.2__py3-none-any.whl

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.
lifx_emulator/__main__.py CHANGED
@@ -102,10 +102,12 @@ def _format_product_capabilities(product: ProductInfo) -> str:
102
102
  # Add additional capabilities
103
103
  if product.has_infrared:
104
104
  caps.append("infrared")
105
- if product.has_multizone:
106
- caps.append("multizone")
105
+ # Extended multizone is backwards compatible with multizone,
106
+ # so only show multizone if extended multizone is not present
107
107
  if product.has_extended_multizone:
108
108
  caps.append("extended-multizone")
109
+ elif product.has_multizone:
110
+ caps.append("multizone")
109
111
  if product.has_matrix:
110
112
  caps.append("matrix")
111
113
  if product.has_hev:
@@ -97,16 +97,22 @@ def generate_product_definitions(
97
97
  if features.get("hev"):
98
98
  capabilities.append("ProductCapability.HEV")
99
99
 
100
- # Check for extended multizone in upgrades
100
+ # Check for extended multizone capability
101
101
  min_ext_mz_firmware = None
102
- for upgrade in product.get("upgrades", []):
103
- if upgrade.get("features", {}).get("extended_multizone"):
104
- capabilities.append("ProductCapability.EXTENDED_MULTIZONE")
105
- # Parse firmware version (major.minor format)
106
- major = upgrade.get("major", 0)
107
- minor = upgrade.get("minor", 0)
108
- min_ext_mz_firmware = (major << 16) | minor
109
- break
102
+
103
+ # First check if it's a native feature (no firmware requirement)
104
+ if features.get("extended_multizone"):
105
+ capabilities.append("ProductCapability.EXTENDED_MULTIZONE")
106
+ else:
107
+ # Check if it's available as an upgrade (requires minimum firmware)
108
+ for upgrade in product.get("upgrades", []):
109
+ if upgrade.get("features", {}).get("extended_multizone"):
110
+ capabilities.append("ProductCapability.EXTENDED_MULTIZONE")
111
+ # Parse firmware version (major.minor format)
112
+ major = upgrade.get("major", 0)
113
+ minor = upgrade.get("minor", 0)
114
+ min_ext_mz_firmware = (major << 16) | minor
115
+ break
110
116
 
111
117
  # Build capabilities expression
112
118
  if capabilities:
@@ -357,16 +363,22 @@ class ProductRegistry:
357
363
  if features.get("hev"):
358
364
  capabilities |= ProductCapability.HEV
359
365
 
360
- # Check for extended multizone in upgrades
366
+ # Check for extended multizone capability
361
367
  min_ext_mz_firmware = None
362
- for upgrade in product.get("upgrades", []):
363
- if upgrade.get("features", {}).get("extended_multizone"):
364
- capabilities |= ProductCapability.EXTENDED_MULTIZONE
365
- # Parse firmware version (major.minor format)
366
- major = upgrade.get("major", 0)
367
- minor = upgrade.get("minor", 0)
368
- min_ext_mz_firmware = (major << 16) | minor
369
- break
368
+
369
+ # First check if it's a native feature (no firmware requirement)
370
+ if features.get("extended_multizone"):
371
+ capabilities |= ProductCapability.EXTENDED_MULTIZONE
372
+ else:
373
+ # Check if it's available as an upgrade (requires minimum firmware)
374
+ for upgrade in product.get("upgrades", []):
375
+ if upgrade.get("features", {}).get("extended_multizone"):
376
+ capabilities |= ProductCapability.EXTENDED_MULTIZONE
377
+ # Parse firmware version (major.minor format)
378
+ major = upgrade.get("major", 0)
379
+ minor = upgrade.get("minor", 0)
380
+ min_ext_mz_firmware = (major << 16) | minor
381
+ break
370
382
 
371
383
  # Parse temperature range
372
384
  temp_range = None
@@ -677,7 +677,9 @@ PRODUCTS: dict[int, ProductInfo] = {
677
677
  pid=117,
678
678
  name="LIFX Z US",
679
679
  vendor=1,
680
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
680
+ capabilities=ProductCapability.COLOR
681
+ | ProductCapability.MULTIZONE
682
+ | ProductCapability.EXTENDED_MULTIZONE,
681
683
  temperature_range=TemperatureRange(min=1500, max=9000),
682
684
  min_ext_mz_firmware=None,
683
685
  ),
@@ -685,7 +687,9 @@ PRODUCTS: dict[int, ProductInfo] = {
685
687
  pid=118,
686
688
  name="LIFX Z Intl",
687
689
  vendor=1,
688
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
690
+ capabilities=ProductCapability.COLOR
691
+ | ProductCapability.MULTIZONE
692
+ | ProductCapability.EXTENDED_MULTIZONE,
689
693
  temperature_range=TemperatureRange(min=1500, max=9000),
690
694
  min_ext_mz_firmware=None,
691
695
  ),
@@ -693,7 +697,9 @@ PRODUCTS: dict[int, ProductInfo] = {
693
697
  pid=119,
694
698
  name="LIFX Beam US",
695
699
  vendor=1,
696
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
700
+ capabilities=ProductCapability.COLOR
701
+ | ProductCapability.MULTIZONE
702
+ | ProductCapability.EXTENDED_MULTIZONE,
697
703
  temperature_range=TemperatureRange(min=1500, max=9000),
698
704
  min_ext_mz_firmware=None,
699
705
  ),
@@ -701,7 +707,9 @@ PRODUCTS: dict[int, ProductInfo] = {
701
707
  pid=120,
702
708
  name="LIFX Beam Intl",
703
709
  vendor=1,
704
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
710
+ capabilities=ProductCapability.COLOR
711
+ | ProductCapability.MULTIZONE
712
+ | ProductCapability.EXTENDED_MULTIZONE,
705
713
  temperature_range=TemperatureRange(min=1500, max=9000),
706
714
  min_ext_mz_firmware=None,
707
715
  ),
@@ -853,7 +861,9 @@ PRODUCTS: dict[int, ProductInfo] = {
853
861
  pid=141,
854
862
  name="LIFX Neon US",
855
863
  vendor=1,
856
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
864
+ capabilities=ProductCapability.COLOR
865
+ | ProductCapability.MULTIZONE
866
+ | ProductCapability.EXTENDED_MULTIZONE,
857
867
  temperature_range=TemperatureRange(min=1500, max=9000),
858
868
  min_ext_mz_firmware=None,
859
869
  ),
@@ -861,7 +871,9 @@ PRODUCTS: dict[int, ProductInfo] = {
861
871
  pid=142,
862
872
  name="LIFX Neon Intl",
863
873
  vendor=1,
864
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
874
+ capabilities=ProductCapability.COLOR
875
+ | ProductCapability.MULTIZONE
876
+ | ProductCapability.EXTENDED_MULTIZONE,
865
877
  temperature_range=TemperatureRange(min=1500, max=9000),
866
878
  min_ext_mz_firmware=None,
867
879
  ),
@@ -869,7 +881,9 @@ PRODUCTS: dict[int, ProductInfo] = {
869
881
  pid=143,
870
882
  name="LIFX String US",
871
883
  vendor=1,
872
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
884
+ capabilities=ProductCapability.COLOR
885
+ | ProductCapability.MULTIZONE
886
+ | ProductCapability.EXTENDED_MULTIZONE,
873
887
  temperature_range=TemperatureRange(min=1500, max=9000),
874
888
  min_ext_mz_firmware=None,
875
889
  ),
@@ -877,7 +891,9 @@ PRODUCTS: dict[int, ProductInfo] = {
877
891
  pid=144,
878
892
  name="LIFX String Intl",
879
893
  vendor=1,
880
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
894
+ capabilities=ProductCapability.COLOR
895
+ | ProductCapability.MULTIZONE
896
+ | ProductCapability.EXTENDED_MULTIZONE,
881
897
  temperature_range=TemperatureRange(min=1500, max=9000),
882
898
  min_ext_mz_firmware=None,
883
899
  ),
@@ -885,7 +901,9 @@ PRODUCTS: dict[int, ProductInfo] = {
885
901
  pid=161,
886
902
  name="LIFX Outdoor Neon US",
887
903
  vendor=1,
888
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
904
+ capabilities=ProductCapability.COLOR
905
+ | ProductCapability.MULTIZONE
906
+ | ProductCapability.EXTENDED_MULTIZONE,
889
907
  temperature_range=TemperatureRange(min=1500, max=9000),
890
908
  min_ext_mz_firmware=None,
891
909
  ),
@@ -893,7 +911,9 @@ PRODUCTS: dict[int, ProductInfo] = {
893
911
  pid=162,
894
912
  name="LIFX Outdoor Neon Intl",
895
913
  vendor=1,
896
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
914
+ capabilities=ProductCapability.COLOR
915
+ | ProductCapability.MULTIZONE
916
+ | ProductCapability.EXTENDED_MULTIZONE,
897
917
  temperature_range=TemperatureRange(min=1500, max=9000),
898
918
  min_ext_mz_firmware=None,
899
919
  ),
@@ -1101,7 +1121,9 @@ PRODUCTS: dict[int, ProductInfo] = {
1101
1121
  pid=203,
1102
1122
  name="LIFX String US",
1103
1123
  vendor=1,
1104
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
1124
+ capabilities=ProductCapability.COLOR
1125
+ | ProductCapability.MULTIZONE
1126
+ | ProductCapability.EXTENDED_MULTIZONE,
1105
1127
  temperature_range=TemperatureRange(min=1500, max=9000),
1106
1128
  min_ext_mz_firmware=None,
1107
1129
  ),
@@ -1109,7 +1131,9 @@ PRODUCTS: dict[int, ProductInfo] = {
1109
1131
  pid=204,
1110
1132
  name="LIFX String Intl",
1111
1133
  vendor=1,
1112
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
1134
+ capabilities=ProductCapability.COLOR
1135
+ | ProductCapability.MULTIZONE
1136
+ | ProductCapability.EXTENDED_MULTIZONE,
1113
1137
  temperature_range=TemperatureRange(min=1500, max=9000),
1114
1138
  min_ext_mz_firmware=None,
1115
1139
  ),
@@ -1117,7 +1141,9 @@ PRODUCTS: dict[int, ProductInfo] = {
1117
1141
  pid=205,
1118
1142
  name="LIFX Indoor Neon US",
1119
1143
  vendor=1,
1120
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
1144
+ capabilities=ProductCapability.COLOR
1145
+ | ProductCapability.MULTIZONE
1146
+ | ProductCapability.EXTENDED_MULTIZONE,
1121
1147
  temperature_range=TemperatureRange(min=1500, max=9000),
1122
1148
  min_ext_mz_firmware=None,
1123
1149
  ),
@@ -1125,7 +1151,9 @@ PRODUCTS: dict[int, ProductInfo] = {
1125
1151
  pid=206,
1126
1152
  name="LIFX Indoor Neon Intl",
1127
1153
  vendor=1,
1128
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
1154
+ capabilities=ProductCapability.COLOR
1155
+ | ProductCapability.MULTIZONE
1156
+ | ProductCapability.EXTENDED_MULTIZONE,
1129
1157
  temperature_range=TemperatureRange(min=1500, max=9000),
1130
1158
  min_ext_mz_firmware=None,
1131
1159
  ),
@@ -1133,7 +1161,9 @@ PRODUCTS: dict[int, ProductInfo] = {
1133
1161
  pid=213,
1134
1162
  name="LIFX Permanent Outdoor US",
1135
1163
  vendor=1,
1136
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
1164
+ capabilities=ProductCapability.COLOR
1165
+ | ProductCapability.MULTIZONE
1166
+ | ProductCapability.EXTENDED_MULTIZONE,
1137
1167
  temperature_range=TemperatureRange(min=1500, max=9000),
1138
1168
  min_ext_mz_firmware=None,
1139
1169
  ),
@@ -1141,7 +1171,9 @@ PRODUCTS: dict[int, ProductInfo] = {
1141
1171
  pid=214,
1142
1172
  name="LIFX Permanent Outdoor Intl",
1143
1173
  vendor=1,
1144
- capabilities=ProductCapability.COLOR | ProductCapability.MULTIZONE,
1174
+ capabilities=ProductCapability.COLOR
1175
+ | ProductCapability.MULTIZONE
1176
+ | ProductCapability.EXTENDED_MULTIZONE,
1145
1177
  temperature_range=TemperatureRange(min=1500, max=9000),
1146
1178
  min_ext_mz_firmware=None,
1147
1179
  ),
@@ -1300,16 +1332,22 @@ class ProductRegistry:
1300
1332
  if features.get("hev"):
1301
1333
  capabilities |= ProductCapability.HEV
1302
1334
 
1303
- # Check for extended multizone in upgrades
1335
+ # Check for extended multizone capability
1304
1336
  min_ext_mz_firmware = None
1305
- for upgrade in product.get("upgrades", []):
1306
- if upgrade.get("features", {}).get("extended_multizone"):
1307
- capabilities |= ProductCapability.EXTENDED_MULTIZONE
1308
- # Parse firmware version (major.minor format)
1309
- major = upgrade.get("major", 0)
1310
- minor = upgrade.get("minor", 0)
1311
- min_ext_mz_firmware = (major << 16) | minor
1312
- break
1337
+
1338
+ # First check if it's a native feature (no firmware requirement)
1339
+ if features.get("extended_multizone"):
1340
+ capabilities |= ProductCapability.EXTENDED_MULTIZONE
1341
+ else:
1342
+ # Check if it's available as an upgrade (requires minimum firmware)
1343
+ for upgrade in product.get("upgrades", []):
1344
+ if upgrade.get("features", {}).get("extended_multizone"):
1345
+ capabilities |= ProductCapability.EXTENDED_MULTIZONE
1346
+ # Parse firmware version (major.minor format)
1347
+ major = upgrade.get("major", 0)
1348
+ minor = upgrade.get("minor", 0)
1349
+ min_ext_mz_firmware = (major << 16) | minor
1350
+ break
1313
1351
 
1314
1352
  # Parse temperature range
1315
1353
  temp_range = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lifx-emulator
3
- Version: 1.0.1
3
+ Version: 1.0.2
4
4
  Summary: LIFX Emulator for testing LIFX LAN protocol libraries
5
5
  Author-email: Avi Miller <me@dje.li>
6
6
  Maintainer-email: Avi Miller <me@dje.li>
@@ -1,5 +1,5 @@
1
1
  lifx_emulator/__init__.py,sha256=WzD3GRp_QFlYF9IexitPxuTVyOUDNv2ZApKhfRP0UGA,818
2
- lifx_emulator/__main__.py,sha256=gfx_SW0Vywlvt68KmozYuZMRWiTow0rgPmeiVHoTfHg,22437
2
+ lifx_emulator/__main__.py,sha256=Irr5g-OBIoWn6shPzfWIPjJSVM2Sq5Y1R1ETxdhCjx8,22570
3
3
  lifx_emulator/api.py,sha256=ATVLtPNh-9TySn_orFV03vJvZ20D5VZyuVQPgvzUuFg,67416
4
4
  lifx_emulator/async_storage.py,sha256=-J4s_4Cxika_EDlFjBegKAaM8sY78wbTDWnttWH4Eik,10504
5
5
  lifx_emulator/constants.py,sha256=DFZkUsdewE-x_3MgO28tMGkjUCWPeYc3xLj_EXViGOw,1032
@@ -21,8 +21,8 @@ lifx_emulator/handlers/multizone_handlers.py,sha256=949FEt1Ilhp-LCxxY0xfHxYJccGN
21
21
  lifx_emulator/handlers/registry.py,sha256=s1ht4PmPhXhAcwu1hoY4yW39wy3SPJBMY-9Uxd0FWuE,3292
22
22
  lifx_emulator/handlers/tile_handlers.py,sha256=jzguqNr_aZheuqd4mikfQlkRcVeqs3HAEAseFSlkBlE,10038
23
23
  lifx_emulator/products/__init__.py,sha256=qcNop_kRYFF3zSjNemzQEgu3jPrIxfyQyLv9GsnaLEI,627
24
- lifx_emulator/products/generator.py,sha256=N8dNDTX9eoDtB3Nb02zHnLyooUR396GdjWGI4_I-Dls,25742
25
- lifx_emulator/products/registry.py,sha256=zNF3Nzzaj3Rlrs_YdI-KpDGCj3jA_zpoqFmcaD3_LJo,44526
24
+ lifx_emulator/products/generator.py,sha256=ovXSwh-3bFNeNJJntYDSURUrzM-WAtXeGKI0-sP1miI,26431
25
+ lifx_emulator/products/registry.py,sha256=oKO7Nb4KsWMMc3bkr5FWKgdXsi4xbrRCD9xP27rQPPQ,45757
26
26
  lifx_emulator/products/specs.py,sha256=2bpgr2z2Ugb_0IBl9LY8LGotB031Bim8zizwvtviFZ0,7186
27
27
  lifx_emulator/products/specs.yml,sha256=uxzdKFREAHphk8XSPiCHvQE2vwoPfT2m1xy-zC4ZIl4,8552
28
28
  lifx_emulator/protocol/__init__.py,sha256=-wjC-wBcb7fxi5I-mJr2Ad8K2YRflJFdLLdobfD-W1Q,56
@@ -33,8 +33,8 @@ lifx_emulator/protocol/header.py,sha256=RXMJ5YZG1jyxl4Mz46ZGJBYX41Jdp7J95BHuY-sc
33
33
  lifx_emulator/protocol/packets.py,sha256=_xYYPuu6WfBpg1LwYVdzQdytFwTyMqpZRadmDdwZXWk,41567
34
34
  lifx_emulator/protocol/protocol_types.py,sha256=2Mccm9717EuTXQYaW44W_yReI4EtnlPp3-WEVASgdGY,24820
35
35
  lifx_emulator/protocol/serializer.py,sha256=2bZz7TddxaMRO4_6LujRGCS1w7GxD4E3rRk3r-hpEIE,10738
36
- lifx_emulator-1.0.1.dist-info/METADATA,sha256=nF8KzCbCNFR6O0CvE_S9-VD5pAuTQLJBxDpwXVk9Dqk,4549
37
- lifx_emulator-1.0.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
38
- lifx_emulator-1.0.1.dist-info/entry_points.txt,sha256=R9C_K_tTgt6yXEmhzH4r2Yx2Tu1rLlnYzeG4RFUVzSc,62
39
- lifx_emulator-1.0.1.dist-info/licenses/LICENSE,sha256=eBz48GRA3gSiWn3rYZAz2Ewp35snnhV9cSqkVBq7g3k,1832
40
- lifx_emulator-1.0.1.dist-info/RECORD,,
36
+ lifx_emulator-1.0.2.dist-info/METADATA,sha256=gASUaAnvN-dLyu3rBoyYb4lYq_guVFwTXznmTOzAAvM,4549
37
+ lifx_emulator-1.0.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
38
+ lifx_emulator-1.0.2.dist-info/entry_points.txt,sha256=R9C_K_tTgt6yXEmhzH4r2Yx2Tu1rLlnYzeG4RFUVzSc,62
39
+ lifx_emulator-1.0.2.dist-info/licenses/LICENSE,sha256=eBz48GRA3gSiWn3rYZAz2Ewp35snnhV9cSqkVBq7g3k,1832
40
+ lifx_emulator-1.0.2.dist-info/RECORD,,