aioamazondevices 11.0.3__py3-none-any.whl → 11.1.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.
@@ -1,6 +1,6 @@
1
1
  """aioamazondevices library."""
2
2
 
3
- __version__ = "11.0.3"
3
+ __version__ = "11.1.2"
4
4
 
5
5
 
6
6
  from .api import AmazonDevice, AmazonEchoApi
aioamazondevices/api.py CHANGED
@@ -9,6 +9,7 @@ from aiohttp import ClientSession
9
9
 
10
10
  from . import __version__
11
11
  from .const.devices import (
12
+ AQM_DEVICE_TYPE,
12
13
  DEVICE_TO_IGNORE,
13
14
  DEVICE_TYPE_TO_MODEL,
14
15
  SPEAKER_GROUP_FAMILY,
@@ -20,7 +21,7 @@ from .const.http import (
20
21
  URI_DEVICES,
21
22
  URI_NEXUS_GRAPHQL,
22
23
  )
23
- from .const.metadata import SENSORS
24
+ from .const.metadata import ALEXA_INFO_SKILLS, AQM_RANGE_SENSORS, SENSORS
24
25
  from .const.queries import QUERY_DEVICE_DATA, QUERY_SENSOR_STATE
25
26
  from .const.schedules import (
26
27
  NOTIFICATION_ALARM,
@@ -164,12 +165,13 @@ class AmazonEchoApi:
164
165
  self, endpoint: dict[str, Any], serial_number: str
165
166
  ) -> dict[str, AmazonDeviceSensor]:
166
167
  device_sensors: dict[str, AmazonDeviceSensor] = {}
168
+ device = self._final_devices[serial_number]
167
169
  for feature in endpoint.get("features", {}):
168
170
  if (sensor_template := SENSORS.get(feature["name"])) is None:
169
171
  # Skip sensors that are not in the predefined list
170
172
  continue
171
173
 
172
- if not (name := sensor_template["name"]):
174
+ if not (sensor_template_name_value := sensor_template["name"]):
173
175
  raise CannotRetrieveData("Unable to read sensor template")
174
176
 
175
177
  for feature_property in feature.get("properties"):
@@ -190,7 +192,7 @@ class AmazonEchoApi:
190
192
  if not value_raw:
191
193
  _LOGGER.warning(
192
194
  "Sensor %s [device %s] ignored due to empty value",
193
- name,
195
+ sensor_template_name_value,
194
196
  serial_number,
195
197
  )
196
198
  continue
@@ -208,26 +210,50 @@ class AmazonEchoApi:
208
210
  except (KeyError, ValueError) as exc:
209
211
  _LOGGER.warning(
210
212
  "Sensor %s [device %s] ignored due to errors in feature %s: %s", # noqa: E501
211
- name,
213
+ sensor_template_name_value,
212
214
  serial_number,
213
215
  feature_property,
214
216
  repr(exc),
215
217
  )
216
218
  if error:
217
219
  _LOGGER.debug(
218
- "error in sensor %s - %s - %s", name, error_type, error_msg
219
- )
220
-
221
- if error_type != "NOT_FOUND":
222
- device_sensors[name] = AmazonDeviceSensor(
223
- name,
224
- value,
225
- error,
220
+ "error in sensor %s - %s - %s",
221
+ sensor_template_name_value,
226
222
  error_type,
227
223
  error_msg,
228
- scale,
229
224
  )
230
225
 
226
+ if error_type == "NOT_FOUND":
227
+ continue
228
+
229
+ sensor_name = sensor_template_name_value
230
+
231
+ if (
232
+ device.device_type == AQM_DEVICE_TYPE
233
+ and sensor_template_name_value == "rangeValue"
234
+ ):
235
+ if not (
236
+ (instance := feature.get("instance"))
237
+ and (aqm_sensor := AQM_RANGE_SENSORS.get(instance))
238
+ and (aqm_sensor_name := aqm_sensor.get("name"))
239
+ ):
240
+ _LOGGER.debug(
241
+ "No template for rangeValue (%s) - Skipping sensor",
242
+ instance,
243
+ )
244
+ continue
245
+ sensor_name = aqm_sensor_name
246
+ scale = aqm_sensor.get("scale")
247
+
248
+ device_sensors[sensor_name] = AmazonDeviceSensor(
249
+ sensor_name,
250
+ value,
251
+ error,
252
+ error_type,
253
+ error_msg,
254
+ scale,
255
+ )
256
+
231
257
  return device_sensors
232
258
 
233
259
  async def _get_devices_endpoint_data(self) -> dict[str, dict[str, Any]]:
@@ -247,13 +273,15 @@ class AmazonEchoApi:
247
273
 
248
274
  endpoint_data = await self._http_wrapper.response_to_json(raw_resp, "endpoint")
249
275
 
250
- if not (data := endpoint_data.get("data")) or not data.get("listEndpoints"):
276
+ if not (data := endpoint_data.get("data")) or not data.get("alexaVoiceDevices"):
251
277
  await self._format_human_error(endpoint_data)
252
278
  return {}
253
279
 
254
- endpoints = data["listEndpoints"]
255
280
  devices_endpoints: dict[str, dict[str, Any]] = {}
256
- for endpoint in endpoints.get("endpoints"):
281
+
282
+ # Process Alexa Voice Enabled devices
283
+ # Just map endpoint ID to serial number to facilitate sensor lookup
284
+ for endpoint in data.get("alexaVoiceDevices", {}).get("endpoints", {}):
257
285
  # save looking up sensor data on apps
258
286
  if endpoint.get("alexaEnabledMetadata", {}).get("category") == "APP":
259
287
  continue
@@ -263,6 +291,39 @@ class AmazonEchoApi:
263
291
  devices_endpoints[serial_number] = endpoint
264
292
  self._endpoints[endpoint["endpointId"]] = serial_number
265
293
 
294
+ # Process Air Quality Monitors if present
295
+ # map endpoint ID to serial number to facilitate sensor lookup but also
296
+ # create AmazonDevice as these are not present in api/devices-v2/device endpoint
297
+ for aqm_endpoint in data.get("airQualityMonitors", {}).get("endpoints", {}):
298
+ aqm_serial_number: str = aqm_endpoint["serialNumber"]["value"]["text"]
299
+ devices_endpoints[aqm_serial_number] = aqm_endpoint
300
+ self._endpoints[aqm_endpoint["endpointId"]] = aqm_serial_number
301
+
302
+ device_name = aqm_endpoint["friendlyNameObject"]["value"]["text"]
303
+ device_type = aqm_endpoint["legacyIdentifiers"]["dmsIdentifier"][
304
+ "deviceType"
305
+ ]["value"]["text"]
306
+ software_version = aqm_endpoint["softwareVersion"]["value"]["text"]
307
+
308
+ self._final_devices[aqm_serial_number] = AmazonDevice(
309
+ account_name=device_name,
310
+ capabilities=[],
311
+ device_family="AIR_QUALITY_MONITOR",
312
+ device_type=device_type,
313
+ device_owner_customer_id=self._session_state_data.account_customer_id
314
+ or "n/a",
315
+ household_device=False,
316
+ device_cluster_members={aqm_serial_number: AQM_DEVICE_TYPE},
317
+ online=True,
318
+ serial_number=aqm_serial_number,
319
+ software_version=software_version,
320
+ entity_id=None,
321
+ endpoint_id=aqm_endpoint.get("endpointId"),
322
+ sensors={},
323
+ notifications_supported=False,
324
+ notifications={},
325
+ )
326
+
266
327
  return devices_endpoints
267
328
 
268
329
  async def get_devices_data(
@@ -397,6 +458,11 @@ class AmazonEchoApi:
397
458
 
398
459
  serial_number: str = device["serialNumber"]
399
460
 
461
+ _has_notification_capability = any(
462
+ capability in capabilities
463
+ for capability in ["REMINDERS", "TIMERS_AND_ALARMS"]
464
+ )
465
+
400
466
  final_devices_list[serial_number] = AmazonDevice(
401
467
  account_name=account_name,
402
468
  capabilities=capabilities,
@@ -414,6 +480,7 @@ class AmazonEchoApi:
414
480
  entity_id=None,
415
481
  endpoint_id=None,
416
482
  sensors={},
483
+ notifications_supported=_has_notification_capability,
417
484
  notifications={},
418
485
  )
419
486
 
@@ -468,7 +535,7 @@ class AmazonEchoApi:
468
535
  sound_name: str,
469
536
  ) -> None:
470
537
  """Call Alexa.Sound to play sound."""
471
- await self._sequence_handler.send_message(
538
+ await self._call_alexa_command_per_cluster_member(
472
539
  device, AmazonSequenceType.Sound, sound_name
473
540
  )
474
541
 
@@ -489,7 +556,7 @@ class AmazonEchoApi:
489
556
  text_command: str,
490
557
  ) -> None:
491
558
  """Call Alexa.TextCommand to issue command."""
492
- await self._sequence_handler.send_message(
559
+ await self._call_alexa_command_per_cluster_member(
493
560
  device, AmazonSequenceType.TextCommand, text_command
494
561
  )
495
562
 
@@ -499,7 +566,7 @@ class AmazonEchoApi:
499
566
  skill_name: str,
500
567
  ) -> None:
501
568
  """Call Alexa.LaunchSkill to launch a skill."""
502
- await self._sequence_handler.send_message(
569
+ await self._call_alexa_command_per_cluster_member(
503
570
  device, AmazonSequenceType.LaunchSkill, skill_name
504
571
  )
505
572
 
@@ -509,7 +576,22 @@ class AmazonEchoApi:
509
576
  info_skill_name: str,
510
577
  ) -> None:
511
578
  """Call Info skill. See ALEXA_INFO_SKILLS . const."""
512
- await self._sequence_handler.send_message(device, info_skill_name, "")
579
+ info_skill = ALEXA_INFO_SKILLS.get(info_skill_name, info_skill_name)
580
+ await self._call_alexa_command_per_cluster_member(device, info_skill, "")
581
+
582
+ async def _call_alexa_command_per_cluster_member(
583
+ self,
584
+ device: AmazonDevice,
585
+ message_type: str,
586
+ message_body: str,
587
+ ) -> None:
588
+ """Call Alexa command per cluster member."""
589
+ for cluster_member in device.device_cluster_members:
590
+ await self._sequence_handler.send_message(
591
+ self._final_devices[cluster_member],
592
+ message_type,
593
+ message_body,
594
+ )
513
595
 
514
596
  async def _format_human_error(self, sensors_state: dict) -> bool:
515
597
  """Format human readable error from malformed data."""
@@ -4,6 +4,7 @@ from .http import AMAZON_DEVICE_TYPE
4
4
 
5
5
  SPEAKER_GROUP_FAMILY = "WHA"
6
6
  SPEAKER_GROUP_MODEL = "Speaker Group"
7
+ AQM_DEVICE_TYPE = "AEZME1X38KDRA"
7
8
 
8
9
  DEVICE_TO_IGNORE: list[str] = [
9
10
  AMAZON_DEVICE_TYPE, # Alexa App for iOS
@@ -28,10 +29,15 @@ DEVICE_TO_IGNORE: list[str] = [
28
29
  "A3BW5ZVFHRCQPO", # BMW Mini Car System - issue #479
29
30
  "A133UZ2CB0IB8", # Sony Soundbar Sony HT-A5000 - issue #486
30
31
  "A2M9HB23M9MSSM", # Smartwatch Amazfit Bip U Pro - issue #507
32
+ "A2QDHDQIWC2LTG", # Echo Buds (Left) - issue #515
33
+ "A31PMVIWCRNTX2", # Echo Buds (Right) - issue #515
34
+ "A3HVREY4JWAZ6K", # Echo Buds (Charger) - issue #515
31
35
  "A1P7E7V3FCZKU6", # Toshiba Corporation TV 32LF221U19 - issue #531
36
+ "APHEAY6LX7T13", # Samsung Refrigerator RS22T5561SR/AA - issue #577
32
37
  "A1NPP2J03FTS0I", # Eero Pro 6 - issue #602
33
38
  "A14AIWB3T3AS1Z", # Samsung Soundbar HW-Q950A - issue #603
34
- "APHEAY6LX7T13", # Samsung Refrigerator RS22T5561SR/AA - issue #577
39
+ "A1X5IB2CRN3E8G", # Fitbit Versa 3 - issue #651
40
+ "A1NQ0LXWBGVQS9", # Samsung 2012 QLED TV - Issue #660
35
41
  ]
36
42
 
37
43
  DEVICE_TYPE_TO_MODEL: dict[str, dict[str, str | None]] = {
@@ -426,4 +432,23 @@ DEVICE_TYPE_TO_MODEL: dict[str, dict[str, str | None]] = {
426
432
  "model": "Orbi Voice (RBS40V)",
427
433
  "hw_version": None,
428
434
  },
435
+ AQM_DEVICE_TYPE: {
436
+ "model": "Air Quality Monitor",
437
+ "hw_version": "Gen1",
438
+ },
439
+ "A1MR3F8QRZNAXI": {
440
+ "model": "Echo Dot Max",
441
+ "hw_version": "Gen1",
442
+ },
443
+ "A1XULUOD31VLF4": {
444
+ "manufacturer": "Broan-NuTone LLC",
445
+ "model": "Bathroom Fan with Alexa (VC110CCT)",
446
+ "hw_version": None,
447
+ },
448
+ "A15QWUTQ6FSMYX": {
449
+ # This appears to be a group for both speakers
450
+ # but four devices show this device type (see issue #515)
451
+ "model": "Echo Buds",
452
+ "hw_version": "Gen2",
453
+ },
429
454
  }
@@ -27,26 +27,60 @@ SENSORS: dict[str, dict[str, str | None]] = {
27
27
  "subkey": None,
28
28
  "scale": None,
29
29
  },
30
+ "range": {
31
+ "name": "rangeValue",
32
+ "key": "rangeValue",
33
+ "subkey": "value",
34
+ "scale": None,
35
+ },
30
36
  }
31
37
 
32
- ALEXA_INFO_SKILLS = [
33
- "Alexa.Calendar.PlayToday",
34
- "Alexa.Calendar.PlayTomorrow",
35
- "Alexa.Calendar.PlayNext",
36
- "Alexa.Date.Play",
37
- "Alexa.Time.Play",
38
- "Alexa.News.NationalNews",
39
- "Alexa.FlashBriefing.Play",
40
- "Alexa.Traffic.Play",
41
- "Alexa.Weather.Play",
42
- "Alexa.CleanUp.Play",
43
- "Alexa.GoodMorning.Play",
44
- "Alexa.SingASong.Play",
45
- "Alexa.FunFact.Play",
46
- "Alexa.Joke.Play",
47
- "Alexa.TellStory.Play",
48
- "Alexa.ImHome.Play",
49
- "Alexa.GoodNight.Play",
50
- ]
38
+ AQM_RANGE_SENSORS: dict[str, dict[str, str | None]] = {
39
+ "4": {
40
+ "name": "Humidity",
41
+ "scale": "%",
42
+ },
43
+ "5": {
44
+ "name": "VOC",
45
+ "scale": None,
46
+ },
47
+ "6": {
48
+ "name": "PM25",
49
+ "scale": "MicroGramsPerCubicMeter",
50
+ },
51
+ "7": {
52
+ "name": "PM10",
53
+ "scale": "MicroGramsPerCubicMeter",
54
+ },
55
+ "8": {
56
+ "name": "CO",
57
+ "scale": "ppm",
58
+ },
59
+ "9": {
60
+ "name": "Air Quality",
61
+ "scale": None,
62
+ },
63
+ }
64
+
65
+
66
+ ALEXA_INFO_SKILLS = {
67
+ "alexa_calendar_today": "Alexa.Calendar.PlayToday",
68
+ "alexa_calendar_tomorrow": "Alexa.Calendar.PlayTomorrow",
69
+ "alexa_calendar_next": "Alexa.Calendar.PlayNext",
70
+ "alexa_date": "Alexa.Date.Play",
71
+ "alexa_time": "Alexa.Time.Play",
72
+ "alexa_nationalnews": "Alexa.News.NationalNews",
73
+ "alexa_flashbriefing": "Alexa.FlashBriefing.Play",
74
+ "alexa_traffic": "Alexa.Traffic.Play",
75
+ "alexa_weather": "Alexa.Weather.Play",
76
+ "alexa_cleanup": "Alexa.CleanUp.Play",
77
+ "alexa_goodmorning": "Alexa.GoodMorning.Play",
78
+ "alexa_singasong": "Alexa.SingASong.Play",
79
+ "alexa_funfact": "Alexa.FunFact.Play",
80
+ "alexa_joke": "Alexa.Joke.Play",
81
+ "alexa_tellstory": "Alexa.TellStory.Play",
82
+ "alexa_imhome": "Alexa.ImHome.Play",
83
+ "alexa_goodnight": "Alexa.GoodNight.Play",
84
+ }
51
85
 
52
86
  MAX_CUSTOMER_ACCOUNT_RETRIES = 3
@@ -2,40 +2,50 @@
2
2
 
3
3
  QUERY_DEVICE_DATA = """
4
4
  query getDevicesBaseData {
5
- listEndpoints(
5
+ alexaVoiceDevices: listEndpoints(
6
6
  listEndpointsInput: {
7
- displayCategory: "ALEXA_VOICE_ENABLED"
8
- includeHouseholdDevices: true
7
+ displayCategory: "ALEXA_VOICE_ENABLED"
8
+ includeHouseholdDevices: true
9
9
  }
10
- )
11
- {
12
- endpoints {
13
- endpointId: id
14
- friendlyNameObject { value { text } }
15
- manufacturer { value { text } }
16
- model { value { text} }
17
- serialNumber { value { text } }
18
- softwareVersion { value { text } }
19
- creationTime
20
- enablement
21
- displayCategories {
22
- all { value }
23
- primary { value }
24
- }
25
- alexaEnabledMetadata {
26
- iconId
27
- isVisible
28
- category
29
- capabilities
30
- }
31
- legacyIdentifiers {
32
- dmsIdentifier {
33
- deviceType { value { text } }
34
- }
35
- chrsIdentifier { entityId }
36
- }
37
- legacyAppliance { applianceId }
10
+ ) {
11
+ ...DeviceEndpoints
12
+ }
13
+
14
+ airQualityMonitors: listEndpoints(
15
+ listEndpointsInput: {
16
+ displayCategory: "AIR_QUALITY_MONITOR"
17
+ includeHouseholdDevices: true
38
18
  }
19
+ ) {
20
+ ...DeviceEndpoints
21
+ }
22
+ }
23
+
24
+ fragment DeviceEndpoints on ListEndpointsResponse {
25
+ endpoints {
26
+ endpointId: id
27
+ friendlyNameObject { value { text } }
28
+ manufacturer { value { text } }
29
+ model { value { text } }
30
+ serialNumber { value { text } }
31
+ softwareVersion { value { text } }
32
+ creationTime
33
+ enablement
34
+ displayCategories {
35
+ all { value }
36
+ primary { value }
37
+ }
38
+ alexaEnabledMetadata {
39
+ iconId
40
+ isVisible
41
+ category
42
+ capabilities
43
+ }
44
+ legacyIdentifiers {
45
+ dmsIdentifier { deviceType { value { text } } }
46
+ chrsIdentifier { entityId }
47
+ }
48
+ legacyAppliance { applianceId }
39
49
  }
40
50
  }
41
51
  """
@@ -46,6 +56,7 @@ fragment EndpointState on Endpoint {
46
56
  friendlyNameObject { value { text } }
47
57
  features {
48
58
  name
59
+ instance
49
60
  properties {
50
61
  name
51
62
  type
@@ -76,6 +87,11 @@ fragment EndpointState on Endpoint {
76
87
  timeOfSample
77
88
  timeOfLastChange
78
89
  }
90
+ ... on RangeValue {
91
+ rangeValue { value }
92
+ timeOfSample
93
+ timeOfLastChange
94
+ }
79
95
  }
80
96
  }
81
97
  }
@@ -123,7 +123,7 @@ class AmazonSequenceHandler:
123
123
  "uri": "connection://AMAZON.Launch/" + message_body,
124
124
  },
125
125
  }
126
- elif message_type in ALEXA_INFO_SKILLS:
126
+ elif message_type in ALEXA_INFO_SKILLS.values():
127
127
  payload = {
128
128
  **base_payload,
129
129
  }
@@ -44,6 +44,7 @@ class AmazonDevice:
44
44
  entity_id: str | None
45
45
  endpoint_id: str | None
46
46
  sensors: dict[str, AmazonDeviceSensor]
47
+ notifications_supported: bool
47
48
  notifications: dict[str, AmazonSchedule]
48
49
 
49
50
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aioamazondevices
3
- Version: 11.0.3
3
+ Version: 11.1.2
4
4
  Summary: Python library to control Amazon devices
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
@@ -1,10 +1,10 @@
1
- aioamazondevices/__init__.py,sha256=Q_uFYFnNYMzrZjtqxHRSTatCd-pn44lYmk0nn0Q3rOY,277
2
- aioamazondevices/api.py,sha256=CQ_CQMhpwHryTX8Utqmw8AVKvi56UmD3xpozIXTe0Uc,19888
1
+ aioamazondevices/__init__.py,sha256=xTc0WeNhgVatWs2jOYhExLbA8RRICucmoDbm6JIc0UQ,277
2
+ aioamazondevices/api.py,sha256=QrUKwyJL_CvtJegdp2SczogV-AU4yWjU8aCsHappzA4,23538
3
3
  aioamazondevices/const/__init__.py,sha256=xQt8Smq2Ojjo30KKdev_gxDkcpY9PJlArTUXKel8oqs,38
4
- aioamazondevices/const/devices.py,sha256=-W4yBSeACIsG3z_8MC_jrQoFJN1NZMe4c62XPee6q1k,11285
4
+ aioamazondevices/const/devices.py,sha256=YZ30GoOCItnwm_3vbXK83RYMyzmbDXQOcJy32wAQRaM,12164
5
5
  aioamazondevices/const/http.py,sha256=tgsRJWfx_SFRBk6T7TiClP02qIsPN4wShfMqRbZcQio,1204
6
- aioamazondevices/const/metadata.py,sha256=zfia4dzEJQ1NPKiVzL-BslOngBRPSpL_vX0DPvIBhSg,1250
7
- aioamazondevices/const/queries.py,sha256=weCYmUJedNyx1P8z_tG_6cHGMjICUVo6KOckkl4P_-w,1900
6
+ aioamazondevices/const/metadata.py,sha256=7RUnu0F5gezJLvJRtXnU15rp-g5P8EE5K8g7nnPjV4k,2204
7
+ aioamazondevices/const/queries.py,sha256=MrY-7g5dNPe4MS8PpUninztQOQCFr9hscBzh_ryVxlM,2230
8
8
  aioamazondevices/const/schedules.py,sha256=GohhoXSGxXEq_fEycSBsjaDJdIxuMtvspLVqaCmJjOU,1378
9
9
  aioamazondevices/const/sounds.py,sha256=hdrXYKEuSOCw7fDdylvqLcDqD5poHzhgXEnUwq_TwDE,1923
10
10
  aioamazondevices/exceptions.py,sha256=gRYrxNAJnrV6uRuMx5e76VMvtNKyceXd09q84pDBBrI,638
@@ -12,12 +12,12 @@ aioamazondevices/http_wrapper.py,sha256=MrPiWisER2piJy02yiP5eAP6SDuq-i10lIp5DN_e
12
12
  aioamazondevices/implementation/__init__.py,sha256=HU18CNdQaDYFksyHi8BL0a0FK0_knqo60ueOxH3zvgo,47
13
13
  aioamazondevices/implementation/dnd.py,sha256=UrYSavcaddpYY7JA3aGXEjw7TCNaVERnEcunNcvheac,2065
14
14
  aioamazondevices/implementation/notification.py,sha256=b9pvajZvdn-ykISuYFb9-BW4bVczUQGnnnuctJ9_kZY,8674
15
- aioamazondevices/implementation/sequence.py,sha256=xDOzQouGrsPAAPjBfHkDIAuC0fTEB5uqi8QR4VmNHYs,5650
15
+ aioamazondevices/implementation/sequence.py,sha256=2KjNemevskRrJScxnqjwh__XxFgmjTa3chMH_c905yw,5659
16
16
  aioamazondevices/login.py,sha256=NNbZjaSC32uOGsKNkSx-URA4DIEGpCZSLp2Ey5xFv9U,17375
17
17
  aioamazondevices/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- aioamazondevices/structures.py,sha256=2duKj9kiknFQHVGOysh0pWTQagTT-IDStCskayrwYSE,1425
18
+ aioamazondevices/structures.py,sha256=eAMXMvkqa0dlqlxE-tz8GGSqmOjnfTBjRPqvmMuzXsE,1459
19
19
  aioamazondevices/utils.py,sha256=V6b5_CNJ5LtVBl9KSitr14nNle4mNDkZVojGhKfy60A,2373
20
- aioamazondevices-11.0.3.dist-info/METADATA,sha256=BxEuuS0OxVpBisq1ViK3xhejCOdQBAwu_1b7glFrQSg,8308
21
- aioamazondevices-11.0.3.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
22
- aioamazondevices-11.0.3.dist-info/licenses/LICENSE,sha256=sS48k5sp9bFV-NSHDfAJuTZZ_-AP9ZDqUzQ9sffGlsg,11346
23
- aioamazondevices-11.0.3.dist-info/RECORD,,
20
+ aioamazondevices-11.1.2.dist-info/METADATA,sha256=g0yIJtBIncoYM2cU9BXZ2aEsftR-_wxyBANqSLJk2pg,8308
21
+ aioamazondevices-11.1.2.dist-info/WHEEL,sha256=kJCRJT_g0adfAJzTx2GUMmS80rTJIVHRCfG0DQgLq3o,88
22
+ aioamazondevices-11.1.2.dist-info/licenses/LICENSE,sha256=sS48k5sp9bFV-NSHDfAJuTZZ_-AP9ZDqUzQ9sffGlsg,11346
23
+ aioamazondevices-11.1.2.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.2.1
2
+ Generator: poetry-core 2.3.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any