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.
- aioamazondevices/__init__.py +1 -1
- aioamazondevices/api.py +102 -20
- aioamazondevices/const/devices.py +26 -1
- aioamazondevices/const/metadata.py +53 -19
- aioamazondevices/const/queries.py +47 -31
- aioamazondevices/implementation/sequence.py +1 -1
- aioamazondevices/structures.py +1 -0
- {aioamazondevices-11.0.3.dist-info → aioamazondevices-11.1.2.dist-info}/METADATA +1 -1
- {aioamazondevices-11.0.3.dist-info → aioamazondevices-11.1.2.dist-info}/RECORD +11 -11
- {aioamazondevices-11.0.3.dist-info → aioamazondevices-11.1.2.dist-info}/WHEEL +1 -1
- {aioamazondevices-11.0.3.dist-info → aioamazondevices-11.1.2.dist-info}/licenses/LICENSE +0 -0
aioamazondevices/__init__.py
CHANGED
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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",
|
|
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("
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
-
|
|
33
|
-
"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
"
|
|
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
|
-
|
|
8
|
-
|
|
7
|
+
displayCategory: "ALEXA_VOICE_ENABLED"
|
|
8
|
+
includeHouseholdDevices: true
|
|
9
9
|
}
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
}
|
aioamazondevices/structures.py
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
aioamazondevices/__init__.py,sha256=
|
|
2
|
-
aioamazondevices/api.py,sha256=
|
|
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
|
|
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=
|
|
7
|
-
aioamazondevices/const/queries.py,sha256=
|
|
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=
|
|
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=
|
|
18
|
+
aioamazondevices/structures.py,sha256=eAMXMvkqa0dlqlxE-tz8GGSqmOjnfTBjRPqvmMuzXsE,1459
|
|
19
19
|
aioamazondevices/utils.py,sha256=V6b5_CNJ5LtVBl9KSitr14nNle4mNDkZVojGhKfy60A,2373
|
|
20
|
-
aioamazondevices-11.
|
|
21
|
-
aioamazondevices-11.
|
|
22
|
-
aioamazondevices-11.
|
|
23
|
-
aioamazondevices-11.
|
|
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,,
|
|
File without changes
|