Skip to content

Commit

Permalink
Merge pull request #98 from home-assistant-libs/release-backport-attr…
Browse files Browse the repository at this point in the history
…ibute-cache-improvements

Update Python controller bindings with Attribute cache improvements
  • Loading branch information
agners authored Sep 17, 2024
2 parents 87eae96 + cd0ddab commit 3a29da9
Show file tree
Hide file tree
Showing 3 changed files with 790 additions and 0 deletions.
32 changes: 32 additions & 0 deletions 0036-Python-Avoid-InvalidStateError-on-cancel-35380.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
From 3f6ba15267c08c8665edafd27043de6a6a3c60ee Mon Sep 17 00:00:00 2001
From: Stefan Agner <[email protected]>
Date: Wed, 4 Sep 2024 14:49:53 +0200
Subject: [PATCH] [Python] Avoid InvalidStateError on cancel (#35380)

When the co-routine GetConnectedDevice() gets cancelled, the wait_for
call will cancel the future we are waiting for. However, the SDK still
calls the _DeviceAvailableCallback with an error (CHIP Error 0x00000074:
The operation has been cancelled). However, we can't set the future
result at this point as the co-routine is already cancelled.

Simply check the future state before setting the result.
---
src/controller/python/chip/ChipDeviceCtrl.py | 2 ++
1 file changed, 2 insertions(+)

diff --git a/src/controller/python/chip/ChipDeviceCtrl.py b/src/controller/python/chip/ChipDeviceCtrl.py
index 3ea996e53c..bb4119f1bc 100644
--- a/src/controller/python/chip/ChipDeviceCtrl.py
+++ b/src/controller/python/chip/ChipDeviceCtrl.py
@@ -854,6 +854,8 @@ class ChipDeviceControllerBase():
self._future = future

def _deviceAvailable(self):
+ if self._future.cancelled():
+ return
if self._returnDevice.value is not None:
self._future.set_result(self._returnDevice)
else:
--
2.46.0

99 changes: 99 additions & 0 deletions 0037-python-Add-direct-attribute-paths-to-Read-34833.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
From d586d15f83c5fb5fff30b7b7a91b0aced387aa5f Mon Sep 17 00:00:00 2001
From: C Freeman <[email protected]>
Date: Wed, 7 Aug 2024 23:05:32 -0400
Subject: [PATCH] python: Add direct attribute paths to Read (#34833)

* python: Add direct attribute paths to Read

Supports one particular use case: read one or all endpoints,
all clusters, specific (global) attribute. See spec 8.9.2.4. This
is an allowed wildcard construct that is not currently expressable
in the API.

Test: Used on wildcard read for matter_testing_support. This is
therefore tested on any test using that decorator - switch
and timesync.

* Restyled by isort

---------

Co-authored-by: Restyled.io <[email protected]>
---
src/controller/python/chip/ChipDeviceCtrl.py | 18 +++++++++++++++---
src/python_testing/matter_testing_support.py | 1 +
2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/src/controller/python/chip/ChipDeviceCtrl.py b/src/controller/python/chip/ChipDeviceCtrl.py
index bb4119f1bc..e337bb0c5d 100644
--- a/src/controller/python/chip/ChipDeviceCtrl.py
+++ b/src/controller/python/chip/ChipDeviceCtrl.py
@@ -1142,8 +1142,12 @@ class ChipDeviceControllerBase():
# Wildcard attribute id
typing.Tuple[int, typing.Type[ClusterObjects.Cluster]],
# Concrete path
- typing.Tuple[int, typing.Type[ClusterObjects.ClusterAttributeDescriptor]]
+ typing.Tuple[int, typing.Type[ClusterObjects.ClusterAttributeDescriptor]],
+ # Directly specified attribute path
+ ClusterAttribute.AttributePath
]):
+ if isinstance(pathTuple, ClusterAttribute.AttributePath):
+ return pathTuple
if pathTuple == ('*') or pathTuple == ():
# Wildcard
return ClusterAttribute.AttributePath()
@@ -1228,7 +1232,9 @@ class ChipDeviceControllerBase():
# Wildcard attribute id
typing.Tuple[int, typing.Type[ClusterObjects.Cluster]],
# Concrete path
- typing.Tuple[int, typing.Type[ClusterObjects.ClusterAttributeDescriptor]]
+ typing.Tuple[int, typing.Type[ClusterObjects.ClusterAttributeDescriptor]],
+ # Directly specified attribute path
+ ClusterAttribute.AttributePath
]] = None,
dataVersionFilters: typing.List[typing.Tuple[int, typing.Type[ClusterObjects.Cluster], int]] = None, events: typing.List[
typing.Union[
@@ -1266,6 +1272,8 @@ class ChipDeviceControllerBase():
ReadAttribute(1, [ Clusters.BasicInformation ] ) -- case 5 above.
ReadAttribute(1, [ (1, Clusters.BasicInformation.Attributes.Location ] ) -- case 1 above.

+ An AttributePath can also be specified directly by [chip.cluster.Attribute.AttributePath(...)]
+
dataVersionFilters: A list of tuples of (endpoint, cluster, data version).

events: A list of tuples of varying types depending on the type of read being requested:
@@ -1326,7 +1334,9 @@ class ChipDeviceControllerBase():
# Wildcard attribute id
typing.Tuple[int, typing.Type[ClusterObjects.Cluster]],
# Concrete path
- typing.Tuple[int, typing.Type[ClusterObjects.ClusterAttributeDescriptor]]
+ typing.Tuple[int, typing.Type[ClusterObjects.ClusterAttributeDescriptor]],
+ # Directly specified attribute path
+ ClusterAttribute.AttributePath
]], dataVersionFilters: typing.List[typing.Tuple[int, typing.Type[ClusterObjects.Cluster], int]] = None,
returnClusterObject: bool = False,
reportInterval: typing.Tuple[int, int] = None,
@@ -1350,6 +1360,8 @@ class ChipDeviceControllerBase():
ReadAttribute(1, [ Clusters.BasicInformation ] ) -- case 5 above.
ReadAttribute(1, [ (1, Clusters.BasicInformation.Attributes.Location ] ) -- case 1 above.

+ An AttributePath can also be specified directly by [chip.cluster.Attribute.AttributePath(...)]
+
returnClusterObject: This returns the data as consolidated cluster objects, with all attributes for a cluster inside
a single cluster-wide cluster object.

diff --git a/src/python_testing/matter_testing_support.py b/src/python_testing/matter_testing_support.py
index a3bd5d2837..93a89192dc 100644
--- a/src/python_testing/matter_testing_support.py
+++ b/src/python_testing/matter_testing_support.py
@@ -53,6 +53,7 @@ import chip.logging
import chip.native
from chip import discovery
from chip.ChipStack import ChipStack
+from chip.clusters import Attribute
from chip.clusters import ClusterObjects as ClusterObjects
from chip.clusters.Attribute import EventReadResult, SubscriptionTransaction
from chip.exceptions import ChipStackError
--
2.46.0

Loading

0 comments on commit 3a29da9

Please sign in to comment.