matter-python-client 1.4.1a10.dev20261006__tar.gz → 1.5.0__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 (210) hide show
  1. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/PKG-INFO +63 -1
  2. matter_python_client-1.5.0/README.md +162 -0
  3. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/Objects.py +2 -0
  4. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AmbientContextSensing.py +20 -18
  5. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Globals.py +0 -2
  6. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Groupcast.py +20 -20
  7. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/HeimanCluster.py +40 -2
  8. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/IcdManagement.py +2 -2
  9. matter_python_client-1.5.0/chip/clusters/cluster_defs/IkeaValveCalibrationCluster.py +168 -0
  10. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/IlluminanceMeasurement.py +4 -4
  11. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Thermostat.py +43 -32
  12. matter_python_client-1.5.0/chip/clusters/cluster_defs/UnitTestingCluster.py +245 -0
  13. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WebRtcTransportDefinitions.py +2 -2
  14. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WindowCovering.py +36 -0
  15. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/__init__.py +4 -0
  16. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_python_client.egg-info/PKG-INFO +63 -1
  17. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_python_client.egg-info/SOURCES.txt +6 -0
  18. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/client/client.py +607 -26
  19. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/client/models/device_types.py +1 -0
  20. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/client/models/node.py +265 -33
  21. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/common/custom_clusters.py +6 -0
  22. matter_python_client-1.5.0/matter_server/common/errors.py +297 -0
  23. matter_python_client-1.5.0/matter_server/common/models.py +944 -0
  24. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/pyproject.toml +1 -1
  25. matter_python_client-1.5.0/tests/test_bridge_node_fixture.py +291 -0
  26. matter_python_client-1.5.0/tests/test_bridge_topology.py +1443 -0
  27. matter_python_client-1.5.0/tests/test_camera.py +596 -0
  28. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/tests/test_client.py +103 -2
  29. matter_python_client-1.5.0/tests/test_event_dispatch.py +462 -0
  30. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/tests/test_imports.py +16 -1
  31. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/tests/test_integration.py +226 -2
  32. matter_python_client-1.5.0/tests/test_interaction.py +807 -0
  33. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/tests/test_util.py +76 -1
  34. matter_python_client-1.5.0/tests/test_webrtc_protocol.py +143 -0
  35. matter_python_client-1.4.1a10.dev20261006/README.md +0 -100
  36. matter_python_client-1.4.1a10.dev20261006/matter_server/common/errors.py +0 -139
  37. matter_python_client-1.4.1a10.dev20261006/matter_server/common/models.py +0 -419
  38. matter_python_client-1.4.1a10.dev20261006/tests/test_event_dispatch.py +0 -35
  39. matter_python_client-1.4.1a10.dev20261006/tests/test_webrtc_protocol.py +0 -36
  40. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/ChipUtility.py +0 -0
  41. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/__init__.py +0 -0
  42. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/ClusterObjects.py +0 -0
  43. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/Types.py +0 -0
  44. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/__init__.py +0 -0
  45. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AccessControl.py +0 -0
  46. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AccountLogin.py +0 -0
  47. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Actions.py +0 -0
  48. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ActivatedCarbonFilterMonitoring.py +0 -0
  49. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AdministratorCommissioning.py +0 -0
  50. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AirQuality.py +0 -0
  51. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ApplicationBasic.py +0 -0
  52. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ApplicationLauncher.py +0 -0
  53. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AqaraAmbientSensingConfigurationCluster.py +0 -0
  54. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AqaraOccupantLocationCluster.py +0 -0
  55. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AqaraRadarSensingUnionCluster.py +0 -0
  56. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AudioOutput.py +0 -0
  57. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/BasicInformation.py +0 -0
  58. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Binding.py +0 -0
  59. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/BooleanState.py +0 -0
  60. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/BooleanStateConfiguration.py +0 -0
  61. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/BridgedDeviceBasicInformation.py +0 -0
  62. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CameraAvSettingsUserLevelManagement.py +0 -0
  63. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CameraAvStreamManagement.py +0 -0
  64. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CarbonDioxideConcentrationMeasurement.py +0 -0
  65. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CarbonMonoxideConcentrationMeasurement.py +0 -0
  66. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Channel.py +0 -0
  67. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Chime.py +0 -0
  68. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ClosureControl.py +0 -0
  69. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ClosureDimension.py +0 -0
  70. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ColorControl.py +0 -0
  71. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CommissionerControl.py +0 -0
  72. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CommodityMetering.py +0 -0
  73. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CommodityPrice.py +0 -0
  74. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CommodityTariff.py +0 -0
  75. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ContentAppObserver.py +0 -0
  76. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ContentControl.py +0 -0
  77. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ContentLauncher.py +0 -0
  78. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Descriptor.py +0 -0
  79. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/DeviceEnergyManagement.py +0 -0
  80. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/DeviceEnergyManagementMode.py +0 -0
  81. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/DiagnosticLogs.py +0 -0
  82. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/DishwasherAlarm.py +0 -0
  83. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/DishwasherMode.py +0 -0
  84. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/DoorLock.py +0 -0
  85. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/DraftElectricalMeasurementCluster.py +0 -0
  86. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/EcosystemInformation.py +0 -0
  87. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ElectricalEnergyMeasurement.py +0 -0
  88. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ElectricalGridConditions.py +0 -0
  89. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ElectricalPowerMeasurement.py +0 -0
  90. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/EnergyEvse.py +0 -0
  91. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/EnergyEvseMode.py +0 -0
  92. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/EnergyPreference.py +0 -0
  93. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/EthernetNetworkDiagnostics.py +0 -0
  94. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/EveCluster.py +0 -0
  95. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/FanControl.py +0 -0
  96. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/FixedLabel.py +0 -0
  97. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/FlowMeasurement.py +0 -0
  98. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/FormaldehydeConcentrationMeasurement.py +0 -0
  99. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/GeneralCommissioning.py +0 -0
  100. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/GeneralDiagnostics.py +0 -0
  101. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/GroupKeyManagement.py +0 -0
  102. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Groups.py +0 -0
  103. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/HepaFilterMonitoring.py +0 -0
  104. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Identify.py +0 -0
  105. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/InovelliCluster.py +0 -0
  106. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/JointFabricAdministrator.py +0 -0
  107. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/JointFabricDatastore.py +0 -0
  108. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/KeypadInput.py +0 -0
  109. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/LaundryDryerControls.py +0 -0
  110. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/LaundryWasherControls.py +0 -0
  111. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/LaundryWasherMode.py +0 -0
  112. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/LevelControl.py +0 -0
  113. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/LocalizationConfiguration.py +0 -0
  114. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/LowPower.py +0 -0
  115. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/MediaInput.py +0 -0
  116. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/MediaPlayback.py +0 -0
  117. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Messages.py +0 -0
  118. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/MeterIdentification.py +0 -0
  119. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/MicrowaveOvenControl.py +0 -0
  120. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/MicrowaveOvenMode.py +0 -0
  121. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ModeSelect.py +0 -0
  122. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/NeoCluster.py +0 -0
  123. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/NetworkCommissioning.py +0 -0
  124. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/NitrogenDioxideConcentrationMeasurement.py +0 -0
  125. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OccupancySensing.py +0 -0
  126. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OnOff.py +0 -0
  127. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OperationalCredentials.py +0 -0
  128. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OperationalState.py +0 -0
  129. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OtaSoftwareUpdateProvider.py +0 -0
  130. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OtaSoftwareUpdateRequestor.py +0 -0
  131. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OvenCavityOperationalState.py +0 -0
  132. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OvenMode.py +0 -0
  133. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OzoneConcentrationMeasurement.py +0 -0
  134. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Pm10ConcentrationMeasurement.py +0 -0
  135. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Pm1ConcentrationMeasurement.py +0 -0
  136. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Pm25ConcentrationMeasurement.py +0 -0
  137. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/PowerSource.py +0 -0
  138. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/PowerSourceConfiguration.py +0 -0
  139. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/PowerTopology.py +0 -0
  140. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/PressureMeasurement.py +0 -0
  141. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/PumpConfigurationAndControl.py +0 -0
  142. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/PushAvStreamTransport.py +0 -0
  143. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/RadonConcentrationMeasurement.py +0 -0
  144. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/RefrigeratorAlarm.py +0 -0
  145. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/RefrigeratorAndTemperatureControlledCabinetMode.py +0 -0
  146. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/RelativeHumidityMeasurement.py +0 -0
  147. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/RvcCleanMode.py +0 -0
  148. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/RvcOperationalState.py +0 -0
  149. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/RvcRunMode.py +0 -0
  150. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ScenesManagement.py +0 -0
  151. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ServiceArea.py +0 -0
  152. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/SmokeCoAlarm.py +0 -0
  153. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/SoftwareDiagnostics.py +0 -0
  154. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/SoilMeasurement.py +0 -0
  155. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Switch.py +0 -0
  156. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TargetNavigator.py +0 -0
  157. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TclDehumidifierCluster.py +0 -0
  158. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TemperatureAlarm.py +0 -0
  159. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TemperatureControl.py +0 -0
  160. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TemperatureMeasurement.py +0 -0
  161. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ThermostatUserInterfaceConfiguration.py +0 -0
  162. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ThirdRealityMeteringCluster.py +0 -0
  163. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ThreadBorderRouterManagement.py +0 -0
  164. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ThreadNetworkDiagnostics.py +0 -0
  165. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ThreadNetworkDirectory.py +0 -0
  166. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TimeFormatLocalization.py +0 -0
  167. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TimeSynchronization.py +0 -0
  168. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TlsCertificateManagement.py +0 -0
  169. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TlsClientManagement.py +0 -0
  170. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TotalVolatileOrganicCompoundsConcentrationMeasurement.py +0 -0
  171. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/UnitLocalization.py +0 -0
  172. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/UserLabel.py +0 -0
  173. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ValveConfigurationAndControl.py +0 -0
  174. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WagoCluster.py +0 -0
  175. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WakeOnLan.py +0 -0
  176. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WaterHeaterManagement.py +0 -0
  177. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WaterHeaterMode.py +0 -0
  178. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WaterTankLevelMonitoring.py +0 -0
  179. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WebRtcTransportProvider.py +0 -0
  180. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WebRtcTransportRequestor.py +0 -0
  181. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WiFiNetworkDiagnostics.py +0 -0
  182. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WiFiNetworkManagement.py +0 -0
  183. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ZoneManagement.py +0 -0
  184. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/clusters/enum.py +0 -0
  185. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/tlv/__init__.py +0 -0
  186. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/chip/tlv/tlvlist.py +0 -0
  187. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_python_client.egg-info/dependency_links.txt +0 -0
  188. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_python_client.egg-info/not-zip-safe +0 -0
  189. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_python_client.egg-info/requires.txt +0 -0
  190. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_python_client.egg-info/top_level.txt +0 -0
  191. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/__init__.py +0 -0
  192. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/client/__init__.py +0 -0
  193. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/client/connection.py +0 -0
  194. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/client/exceptions.py +0 -0
  195. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/client/models/__init__.py +0 -0
  196. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/common/__init__.py +0 -0
  197. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/common/const.py +0 -0
  198. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/common/helpers/__init__.py +0 -0
  199. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/common/helpers/api.py +0 -0
  200. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/common/helpers/json.py +0 -0
  201. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/common/helpers/util.py +0 -0
  202. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/matter_server/py.typed +0 -0
  203. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/setup.cfg +0 -0
  204. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/tests/test_bigint_wire.py +0 -0
  205. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/tests/test_client_integration.py +0 -0
  206. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/tests/test_credentials.py +0 -0
  207. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/tests/test_icd.py +0 -0
  208. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/tests/test_network_topology.py +0 -0
  209. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/tests/test_ota_upload.py +0 -0
  210. {matter_python_client-1.4.1a10.dev20261006 → matter_python_client-1.5.0}/tests/test_unix_socket.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: matter-python-client
3
- Version: 1.4.1a10.dev20261006
3
+ Version: 1.5.0
4
4
  Summary: Python Client for the OHF Matter Server
5
5
  Author-email: Open Home Foundation <hello@openhomefoundation.io>
6
6
  License-Expression: Apache-2.0
@@ -110,6 +110,68 @@ Beyond the `python-matter-server` API, the client exposes commands the Matter.js
110
110
  then streams the bytes to `POST /ota-upload/<upload_id>`. Raises `OtaUploadError` (code 101) for a
111
111
  corrupt image, an expired/spent id, or disabled OTA support.
112
112
  - `get_icd_state`, `register_icd`, `unregister_icd`, `resync_icd` — ICD Check-In registration
113
+ - `read`, `subscribe`, `unsubscribe`, `enable_auto_subscription`, `disable_auto_subscription` — Matter
114
+ read and subscribe requests with explicit paths (schema 14+). `read` returns an `InteractionReport`,
115
+ `subscribe` a `SubscribeResult` (the priming report plus `subscription_id`). A subscription is named by
116
+ `node_id` and `subscription_id` together. Later reports arrive as `subscription_report` events
117
+ (`SubscriptionReportData`), an end the caller did not ask for as `subscription_ended`
118
+ (`SubscriptionEndedData`); both go only to the connection that subscribed and reach `node_filter`
119
+ subscribers. Pass `listener` to `subscribe` to get every event of that one subscription, including those
120
+ the server sends right behind the response. The listener gets no further calls once `unsubscribe` is
121
+ called. When the connection is lost or `disconnect` is called, the listener receives a
122
+ `subscription_ended` that the client builds itself, because the server ends the subscription without
123
+ sending one; `node_filter` subscribers do not get it. If a `subscribe` call is cancelled or times out
124
+ (for example in `asyncio.wait_for`) before it returns, the client ends that subscription with
125
+ `unsubscribe` and logs a failure of that call. `subscribe`, `unsubscribe` and the two auto
126
+ subscription methods need a server running with auto subscription disabled.
127
+ - `commission_with_code` and `commission_on_network` take `discovery_timeout_s` (schema 14+)
128
+ - `send_batched_device_commands` — sends `(endpoint_id, command)` pairs to one node in a single InvokeRequest and returns
129
+ one `BatchedCommandResult` per command (schema 14+)
130
+ - `write_attribute` takes `*` as the endpoint to write all endpoints of the node that have the attribute, and
131
+ `timed_request_timeout_ms` for a timed write (schema 14+)
132
+ - `parse_onboarding_payload` — decodes a QR code or manual pairing code without contacting a device and returns
133
+ `QrOnboardingPayloadResult` or `ManualOnboardingPayloadResult` (schema 14+)
134
+ - `camera_get_capabilities`, `camera_start_stream`, `camera_provide_answer`,
135
+ `camera_provide_ice_candidates`, `camera_stop_stream`, `camera_snapshot`, `camera_release_stream`
136
+ — the camera API (schema 14+). `camera_get_capabilities`, `camera_start_stream`, `camera_stop_stream`
137
+ and `camera_snapshot` return dataclasses from `matter_server.common.models`; the other three return
138
+ `None`.
139
+ `camera_start_stream`'s `video` / `audio` take `None` (the server decides), a `CameraVideoHints` /
140
+ `CameraAudioHints` dict, or `False` (no such track). `talkback=True` lets the offer ask the camera to
141
+ play your audio; without it the server makes the offer's audio sections not send, so a browser-style
142
+ `sendrecv` audio offer goes to the camera as `recvonly`. `camera_session_ended` and
143
+ `camera_stream_evicted` events arrive as `CameraSessionEndedData` / `CameraStreamEvictedData`;
144
+ `webrtc_callback` stays a dict. `camera_session_ended` covers every end of a session opened with
145
+ `camera_start_stream` that the client did not ask for, the camera's own `End` included; its `cause` says why. Errors 102 to 106 (`CameraStreamIncompatible`, ...) expose their
146
+ details as attributes, e.g. `err.reason` and `err.bound` on `CameraStreamIncompatible`
147
+
148
+ `camera_start_stream(..., client_session_key="...")` names the session with your own key (1 to 128
149
+ characters, unique among the connection's starting and open sessions). Every `webrtc_callback` and
150
+ `camera_session_ended` event of the session carries it as `client_session_key`, so a handler can
151
+ match events even when it runs before the awaited call returns. `camera_provide_ice_candidates(node_id,
152
+ endpoint_id, None, candidates, client_session_key=...)` and `camera_stop_stream(node_id, endpoint_id,
153
+ client_session_key=...)` take it in place of the session id, also while `camera_start_stream` is still
154
+ running: candidates are queued on the server and sent after the start's response, and the stop cancels
155
+ the start.
156
+
157
+ The minimal `camera_start_stream` call is `node_id`, `endpoint_id`, `stream_usage` and your SDP
158
+ offer: the server reuses or allocates the best stream the camera can serve that still fits what
159
+ the offer can decode, and adds audio when it can. Pass `video` / `audio` hints only to set hard bounds. A
160
+ session opened this way is driven with `camera_provide_answer`, `camera_provide_ice_candidates`
161
+ and `camera_stop_stream` only, not with `send_webrtc_provider_command` or a `send_device_command`
162
+ `EndSession`: the server tracks the session and its streams, and only the `camera_*` methods keep
163
+ that record correct. The exception is a re-offer (ICE restart), which goes through
164
+ `send_webrtc_provider_command`. See `docs/websockets_api.md` for the flow and every option.
165
+
166
+ ```python
167
+ try:
168
+ result = await client.camera_start_stream(node_id, 1, "LiveView", sdp=offer)
169
+ except CameraStreamIncompatible as err:
170
+ print(err.reason, err.bound)
171
+ else:
172
+ # The camera's answer arrives as a webrtc_callback "answer" event for this session.
173
+ print(result.webrtc_session_id, result.video.codec if result.video else None)
174
+ ```
113
175
 
114
176
  ```python
115
177
  version = await client.upload_ota_file("/path/to/firmware.ota")
@@ -0,0 +1,162 @@
1
+ # Python Client for the OHF Matter Server
2
+
3
+ A PyPI package (`matter-python-client`) providing Python bindings for the [OHF Matter Server](https://github.com/matter-js/matterjs-server). This is a drop-in replacement for the client portion of [`python-matter-server`](https://github.com/matter-js/python-matter-server), with custom cluster definitions updated to match the Matter.js server.
4
+
5
+ ## Origin
6
+
7
+ The client and common modules were copied from [`python-matter-server` v8.1.2](https://github.com/matter-js/python-matter-server) and modified:
8
+
9
+ - **Source**: `matter_server/client/` and `matter_server/common/` from python-matter-server
10
+ - **Modified**: `matter_server/common/custom_clusters.py` — updated to match the JS server's cluster definitions
11
+ - **Excluded**: `matter_server/server/` (the JS server replaces it), `common/helpers/logger.py` (depends on `coloredlogs`, a server-only dependency)
12
+
13
+ ### Custom Cluster Changes
14
+
15
+ | Cluster | Change |
16
+ |---------|--------|
17
+ | EveCluster | +8 attributes (getConfig, setConfig, loggingMetadata, loggingData, lastEventTime, statusFault, childLock, rloc16), wattAccumulatedControlPoint type fixed |
18
+ | HeimanCluster | Attribute IDs shortened to match JS server |
19
+ | NeoCluster | Types changed from float32 to uint |
20
+ | Polling | Removed (JS server handles polling natively) |
21
+
22
+ ## Package
23
+
24
+ - **PyPI name**: `matter-python-client`
25
+ - **Python module**: `matter_server` (same import path as `python-matter-server`)
26
+ - **Python**: >= 3.12
27
+ - **Dependencies**: `aiohttp`, `orjson`, `home-assistant-chip-clusters`
28
+
29
+ ## npm Scripts (from monorepo root)
30
+
31
+ ```bash
32
+ # First-time setup: create venv and install with test dependencies
33
+ npm run python:install
34
+
35
+ # Run unit + mock server tests (fast, ~1s)
36
+ npm run python:test
37
+
38
+ # Run full integration tests against real Matter.js server + test device (~40s)
39
+ npm run python:test-integration
40
+
41
+ # Run all Python tests
42
+ npm run python:test-all
43
+
44
+ # Build the PyPI package (.tar.gz + .whl)
45
+ npm run python:build
46
+ ```
47
+
48
+ ## Usage
49
+
50
+ The package provides the same `matter_server.client` API as `python-matter-server`:
51
+
52
+ ```python
53
+ import aiohttp
54
+ from matter_server.client import MatterClient
55
+
56
+ async with aiohttp.ClientSession() as session:
57
+ client = MatterClient("ws://localhost:5580/ws", session)
58
+ await client.connect()
59
+
60
+ init_ready = asyncio.Event()
61
+ listen_task = asyncio.create_task(client.start_listening(init_ready))
62
+ await init_ready.wait()
63
+
64
+ nodes = client.get_nodes()
65
+ ```
66
+
67
+ To reach a server that listens on a unix socket (`--listen-address /path/to/socket`), pass
68
+ `unix:///path/to/socket` as the server URL. The client then opens its own session on that socket
69
+ for the WebSocket and the OTA upload, and the session passed in stays unused.
70
+
71
+ ### OHF-only extensions
72
+
73
+ Beyond the `python-matter-server` API, the client exposes commands the Matter.js server adds:
74
+
75
+ - `get_network_topology(refresh=False)` — the Thread/Wi-Fi network as a graph (schema 13+)
76
+ - `upload_ota_file(image)` — store a local `.ota` firmware image in the server's OTA image store
77
+ (schema 13+). Takes the raw bytes or a path; reserves an upload id over the WebSocket session,
78
+ then streams the bytes to `POST /ota-upload/<upload_id>`. Raises `OtaUploadError` (code 101) for a
79
+ corrupt image, an expired/spent id, or disabled OTA support.
80
+ - `get_icd_state`, `register_icd`, `unregister_icd`, `resync_icd` — ICD Check-In registration
81
+ - `read`, `subscribe`, `unsubscribe`, `enable_auto_subscription`, `disable_auto_subscription` — Matter
82
+ read and subscribe requests with explicit paths (schema 14+). `read` returns an `InteractionReport`,
83
+ `subscribe` a `SubscribeResult` (the priming report plus `subscription_id`). A subscription is named by
84
+ `node_id` and `subscription_id` together. Later reports arrive as `subscription_report` events
85
+ (`SubscriptionReportData`), an end the caller did not ask for as `subscription_ended`
86
+ (`SubscriptionEndedData`); both go only to the connection that subscribed and reach `node_filter`
87
+ subscribers. Pass `listener` to `subscribe` to get every event of that one subscription, including those
88
+ the server sends right behind the response. The listener gets no further calls once `unsubscribe` is
89
+ called. When the connection is lost or `disconnect` is called, the listener receives a
90
+ `subscription_ended` that the client builds itself, because the server ends the subscription without
91
+ sending one; `node_filter` subscribers do not get it. If a `subscribe` call is cancelled or times out
92
+ (for example in `asyncio.wait_for`) before it returns, the client ends that subscription with
93
+ `unsubscribe` and logs a failure of that call. `subscribe`, `unsubscribe` and the two auto
94
+ subscription methods need a server running with auto subscription disabled.
95
+ - `commission_with_code` and `commission_on_network` take `discovery_timeout_s` (schema 14+)
96
+ - `send_batched_device_commands` — sends `(endpoint_id, command)` pairs to one node in a single InvokeRequest and returns
97
+ one `BatchedCommandResult` per command (schema 14+)
98
+ - `write_attribute` takes `*` as the endpoint to write all endpoints of the node that have the attribute, and
99
+ `timed_request_timeout_ms` for a timed write (schema 14+)
100
+ - `parse_onboarding_payload` — decodes a QR code or manual pairing code without contacting a device and returns
101
+ `QrOnboardingPayloadResult` or `ManualOnboardingPayloadResult` (schema 14+)
102
+ - `camera_get_capabilities`, `camera_start_stream`, `camera_provide_answer`,
103
+ `camera_provide_ice_candidates`, `camera_stop_stream`, `camera_snapshot`, `camera_release_stream`
104
+ — the camera API (schema 14+). `camera_get_capabilities`, `camera_start_stream`, `camera_stop_stream`
105
+ and `camera_snapshot` return dataclasses from `matter_server.common.models`; the other three return
106
+ `None`.
107
+ `camera_start_stream`'s `video` / `audio` take `None` (the server decides), a `CameraVideoHints` /
108
+ `CameraAudioHints` dict, or `False` (no such track). `talkback=True` lets the offer ask the camera to
109
+ play your audio; without it the server makes the offer's audio sections not send, so a browser-style
110
+ `sendrecv` audio offer goes to the camera as `recvonly`. `camera_session_ended` and
111
+ `camera_stream_evicted` events arrive as `CameraSessionEndedData` / `CameraStreamEvictedData`;
112
+ `webrtc_callback` stays a dict. `camera_session_ended` covers every end of a session opened with
113
+ `camera_start_stream` that the client did not ask for, the camera's own `End` included; its `cause` says why. Errors 102 to 106 (`CameraStreamIncompatible`, ...) expose their
114
+ details as attributes, e.g. `err.reason` and `err.bound` on `CameraStreamIncompatible`
115
+
116
+ `camera_start_stream(..., client_session_key="...")` names the session with your own key (1 to 128
117
+ characters, unique among the connection's starting and open sessions). Every `webrtc_callback` and
118
+ `camera_session_ended` event of the session carries it as `client_session_key`, so a handler can
119
+ match events even when it runs before the awaited call returns. `camera_provide_ice_candidates(node_id,
120
+ endpoint_id, None, candidates, client_session_key=...)` and `camera_stop_stream(node_id, endpoint_id,
121
+ client_session_key=...)` take it in place of the session id, also while `camera_start_stream` is still
122
+ running: candidates are queued on the server and sent after the start's response, and the stop cancels
123
+ the start.
124
+
125
+ The minimal `camera_start_stream` call is `node_id`, `endpoint_id`, `stream_usage` and your SDP
126
+ offer: the server reuses or allocates the best stream the camera can serve that still fits what
127
+ the offer can decode, and adds audio when it can. Pass `video` / `audio` hints only to set hard bounds. A
128
+ session opened this way is driven with `camera_provide_answer`, `camera_provide_ice_candidates`
129
+ and `camera_stop_stream` only, not with `send_webrtc_provider_command` or a `send_device_command`
130
+ `EndSession`: the server tracks the session and its streams, and only the `camera_*` methods keep
131
+ that record correct. The exception is a re-offer (ICE restart), which goes through
132
+ `send_webrtc_provider_command`. See `docs/websockets_api.md` for the flow and every option.
133
+
134
+ ```python
135
+ try:
136
+ result = await client.camera_start_stream(node_id, 1, "LiveView", sdp=offer)
137
+ except CameraStreamIncompatible as err:
138
+ print(err.reason, err.bound)
139
+ else:
140
+ # The camera's answer arrives as a webrtc_callback "answer" event for this session.
141
+ print(result.webrtc_session_id, result.video.codec if result.video else None)
142
+ ```
143
+
144
+ ```python
145
+ version = await client.upload_ota_file("/path/to/firmware.ota")
146
+ print(version.vid, version.pid, version.software_version)
147
+ ```
148
+
149
+ To use this package instead of `python-matter-server` in the Home Assistant Matter integration, change `manifest.json`:
150
+
151
+ ```diff
152
+ - "requirements": ["python-matter-server==8.1.2"],
153
+ + "requirements": ["matter-python-client==1.0.0"],
154
+ ```
155
+
156
+ ## Testing
157
+
158
+ The test suite has three layers:
159
+
160
+ - **Import smoke tests** (8 tests) — verify all HA integration imports resolve
161
+ - **Mock server tests** (4 tests) — Python client against JS MockMatterServer subprocess
162
+ - **Integration tests** (63 tests) — Python client against real Matter.js server + test device, mirroring the JS `IntegrationTest.ts`
@@ -97,6 +97,7 @@ __all__ = [
97
97
  "HepaFilterMonitoring",
98
98
  "IcdManagement",
99
99
  "Identify",
100
+ "IkeaValveCalibrationCluster",
100
101
  "IlluminanceMeasurement",
101
102
  "InovelliCluster",
102
103
  "JointFabricAdministrator",
@@ -166,6 +167,7 @@ __all__ = [
166
167
  "TlsClientManagement",
167
168
  "TotalVolatileOrganicCompoundsConcentrationMeasurement",
168
169
  "UnitLocalization",
170
+ "UnitTestingCluster",
169
171
  "UserLabel",
170
172
  "ValveConfigurationAndControl",
171
173
  "WagoCluster",
@@ -12,7 +12,7 @@ from ...tlv import float32, uint
12
12
  from ..ClusterObjects import (Cluster, ClusterAttributeDescriptor, ClusterCommand, ClusterEvent, ClusterObject,
13
13
  ClusterObjectDescriptor, ClusterObjectFieldDescriptor)
14
14
  from ..Types import Nullable, NullValue
15
- from .ModeSelect import ModeSelect
15
+ from .Globals import Globals
16
16
 
17
17
 
18
18
  @dataclass
@@ -27,8 +27,8 @@ class AmbientContextSensing(Cluster):
27
27
  ClusterObjectFieldDescriptor(Label="objectIdentified", Tag=0x00000001, Type=typing.Optional[bool]),
28
28
  ClusterObjectFieldDescriptor(Label="audioContextDetected", Tag=0x00000002, Type=typing.Optional[bool]),
29
29
  ClusterObjectFieldDescriptor(Label="ambientContextType", Tag=0x00000003, Type=typing.Optional[typing.List[AmbientContextSensing.Structs.AmbientContextTypeStruct]]),
30
- ClusterObjectFieldDescriptor(Label="ambientContextTypeSupported", Tag=0x00000004, Type=typing.Optional[typing.List[ModeSelect.Structs.SemanticTagStruct]]),
31
- ClusterObjectFieldDescriptor(Label="objectCountReached", Tag=0x00000005, Type=typing.Optional[bool]),
30
+ ClusterObjectFieldDescriptor(Label="ambientContextTypeSupported", Tag=0x00000004, Type=typing.Optional[typing.List[Globals.Structs.semtag]]),
31
+ ClusterObjectFieldDescriptor(Label="objectCountThresholdReached", Tag=0x00000005, Type=typing.Optional[bool]),
32
32
  ClusterObjectFieldDescriptor(Label="objectCountConfig", Tag=0x00000006, Type=typing.Optional[AmbientContextSensing.Structs.ObjectCountConfigStruct]),
33
33
  ClusterObjectFieldDescriptor(Label="objectCount", Tag=0x00000007, Type=typing.Optional[uint]),
34
34
  ClusterObjectFieldDescriptor(Label="simultaneousDetectionLimit", Tag=0x00000008, Type=typing.Optional[uint]),
@@ -46,8 +46,8 @@ class AmbientContextSensing(Cluster):
46
46
  objectIdentified: typing.Optional[bool] = None
47
47
  audioContextDetected: typing.Optional[bool] = None
48
48
  ambientContextType: typing.Optional[typing.List[AmbientContextSensing.Structs.AmbientContextTypeStruct]] = None
49
- ambientContextTypeSupported: typing.Optional[typing.List[ModeSelect.Structs.SemanticTagStruct]] = None
50
- objectCountReached: typing.Optional[bool] = None
49
+ ambientContextTypeSupported: typing.Optional[typing.List[Globals.Structs.semtag]] = None
50
+ objectCountThresholdReached: typing.Optional[bool] = None
51
51
  objectCountConfig: typing.Optional[AmbientContextSensing.Structs.ObjectCountConfigStruct] = None
52
52
  objectCount: typing.Optional[uint] = None
53
53
  simultaneousDetectionLimit: typing.Optional[uint] = None
@@ -90,10 +90,10 @@ class AmbientContextSensing(Cluster):
90
90
  def descriptor(cls) -> ClusterObjectDescriptor:
91
91
  return ClusterObjectDescriptor(
92
92
  Fields=[
93
- ClusterObjectFieldDescriptor(Label="ambientContextSensed", Tag=0, Type=typing.Optional[typing.List[ModeSelect.Structs.SemanticTagStruct]]),
93
+ ClusterObjectFieldDescriptor(Label="ambientContextSensed", Tag=0, Type=typing.Optional[typing.List[Globals.Structs.semtag]]),
94
94
  ])
95
95
 
96
- ambientContextSensed: typing.Optional[typing.List[ModeSelect.Structs.SemanticTagStruct]] = None
96
+ ambientContextSensed: typing.Optional[typing.List[Globals.Structs.semtag]] = None
97
97
 
98
98
  @dataclass
99
99
  class ObjectCountConfigStruct(ClusterObject):
@@ -101,11 +101,11 @@ class AmbientContextSensing(Cluster):
101
101
  def descriptor(cls) -> ClusterObjectDescriptor:
102
102
  return ClusterObjectDescriptor(
103
103
  Fields=[
104
- ClusterObjectFieldDescriptor(Label="countingObject", Tag=0, Type=typing.Optional[ModeSelect.Structs.SemanticTagStruct]),
104
+ ClusterObjectFieldDescriptor(Label="countingObject", Tag=0, Type=typing.Optional[Globals.Structs.semtag]),
105
105
  ClusterObjectFieldDescriptor(Label="objectCountThreshold", Tag=1, Type=typing.Optional[uint]),
106
106
  ])
107
107
 
108
- countingObject: typing.Optional[ModeSelect.Structs.SemanticTagStruct] = None
108
+ countingObject: typing.Optional[Globals.Structs.semtag] = None
109
109
  objectCountThreshold: typing.Optional[uint] = None
110
110
 
111
111
  @dataclass
@@ -116,7 +116,7 @@ class AmbientContextSensing(Cluster):
116
116
  Fields=[
117
117
  ClusterObjectFieldDescriptor(Label="startTimestamp", Tag=0, Type=typing.Optional[uint]),
118
118
  ClusterObjectFieldDescriptor(Label="endTimestamp", Tag=1, Type=typing.Optional[uint]),
119
- ClusterObjectFieldDescriptor(Label="ambientContextType", Tag=2, Type=typing.Optional[typing.List[ModeSelect.Structs.SemanticTagStruct]]),
119
+ ClusterObjectFieldDescriptor(Label="ambientContextType", Tag=2, Type=typing.Optional[typing.List[Globals.Structs.semtag]]),
120
120
  ClusterObjectFieldDescriptor(Label="crowdDetected", Tag=3, Type=typing.Optional[bool]),
121
121
  ClusterObjectFieldDescriptor(Label="crowdCount", Tag=4, Type=typing.Optional[uint]),
122
122
  ClusterObjectFieldDescriptor(Label="confidence", Tag=5, Type=typing.Optional[uint]),
@@ -124,7 +124,7 @@ class AmbientContextSensing(Cluster):
124
124
 
125
125
  startTimestamp: typing.Optional[uint] = None
126
126
  endTimestamp: typing.Optional[uint] = None
127
- ambientContextType: typing.Optional[typing.List[ModeSelect.Structs.SemanticTagStruct]] = None
127
+ ambientContextType: typing.Optional[typing.List[Globals.Structs.semtag]] = None
128
128
  crowdDetected: typing.Optional[bool] = None
129
129
  crowdCount: typing.Optional[uint] = None
130
130
  confidence: typing.Optional[uint] = None
@@ -206,12 +206,12 @@ class AmbientContextSensing(Cluster):
206
206
 
207
207
  @ChipUtility.classproperty
208
208
  def attribute_type(cls) -> ClusterObjectFieldDescriptor:
209
- return ClusterObjectFieldDescriptor(Type=typing.Optional[typing.List[ModeSelect.Structs.SemanticTagStruct]])
209
+ return ClusterObjectFieldDescriptor(Type=typing.Optional[typing.List[Globals.Structs.semtag]])
210
210
 
211
- value: typing.Optional[typing.List[ModeSelect.Structs.SemanticTagStruct]] = None
211
+ value: typing.Optional[typing.List[Globals.Structs.semtag]] = None
212
212
 
213
213
  @dataclass
214
- class ObjectCountReached(ClusterAttributeDescriptor):
214
+ class ObjectCountThresholdReached(ClusterAttributeDescriptor):
215
215
  @ChipUtility.classproperty
216
216
  def cluster_id(cls) -> int:
217
217
  return 0x00000431
@@ -418,12 +418,12 @@ class AmbientContextSensing(Cluster):
418
418
  return ClusterObjectDescriptor(
419
419
  Fields=[
420
420
  ClusterObjectFieldDescriptor(Label="ambientContextDetected", Tag=0, Type=typing.Optional[AmbientContextSensing.Structs.AmbientContextTypeStruct]),
421
- ClusterObjectFieldDescriptor(Label="objectCountReached", Tag=1, Type=typing.Optional[bool]),
421
+ ClusterObjectFieldDescriptor(Label="objectCountThresholdReached", Tag=1, Type=typing.Optional[bool]),
422
422
  ClusterObjectFieldDescriptor(Label="objectCount", Tag=2, Type=typing.Optional[uint]),
423
423
  ])
424
424
 
425
425
  ambientContextDetected: typing.Optional[AmbientContextSensing.Structs.AmbientContextTypeStruct] = None
426
- objectCountReached: typing.Optional[bool] = None
426
+ objectCountThresholdReached: typing.Optional[bool] = None
427
427
  objectCount: typing.Optional[uint] = None
428
428
 
429
429
  @dataclass
@@ -440,7 +440,9 @@ class AmbientContextSensing(Cluster):
440
440
  def descriptor(cls) -> ClusterObjectDescriptor:
441
441
  return ClusterObjectDescriptor(
442
442
  Fields=[
443
- ClusterObjectFieldDescriptor(Label="eventStartTime", Tag=0, Type=typing.Optional[uint]),
443
+ ClusterObjectFieldDescriptor(Label="eventStartTimePos", Tag=0, Type=typing.Optional[uint]),
444
+ ClusterObjectFieldDescriptor(Label="eventStartTimeSys", Tag=1, Type=typing.Optional[uint]),
444
445
  ])
445
446
 
446
- eventStartTime: typing.Optional[uint] = None
447
+ eventStartTimePos: typing.Optional[uint] = None
448
+ eventStartTimeSys: typing.Optional[uint] = None
@@ -198,7 +198,6 @@ class Globals:
198
198
  kUnsupportedWrite = 0x88
199
199
  kResourceExhausted = 0x89
200
200
  kNotFound = 0x8B
201
- kUnreportableAttribute = 0x8C
202
201
  kInvalidDataType = 0x8D
203
202
  kUnsupportedRead = 0x8F
204
203
  kDataVersionMismatch = 0x92
@@ -207,7 +206,6 @@ class Globals:
207
206
  kBusy = 0x9C
208
207
  kAccessRestricted = 0x9D
209
208
  kUnsupportedCluster = 0xC3
210
- kNoUpstreamSubscription = 0xC5
211
209
  kNeedsTimedInteraction = 0xC6
212
210
  kUnsupportedEvent = 0xC7
213
211
  kPathsExhausted = 0xC8
@@ -22,11 +22,11 @@ class Groupcast(Cluster):
22
22
  def descriptor(cls) -> ClusterObjectDescriptor:
23
23
  return ClusterObjectDescriptor(
24
24
  Fields=[
25
- ClusterObjectFieldDescriptor(Label="membership", Tag=0x00000000, Type=typing.Optional[typing.List[Groupcast.Structs.MembershipStruct]]),
26
- ClusterObjectFieldDescriptor(Label="maxMembershipCount", Tag=0x00000001, Type=typing.Optional[uint]),
27
- ClusterObjectFieldDescriptor(Label="maxMcastAddrCount", Tag=0x00000002, Type=typing.Optional[uint]),
28
- ClusterObjectFieldDescriptor(Label="usedMcastAddrCount", Tag=0x00000003, Type=typing.Optional[uint]),
29
- ClusterObjectFieldDescriptor(Label="fabricUnderTest", Tag=0x00000004, Type=typing.Optional[uint]),
25
+ ClusterObjectFieldDescriptor(Label="membership", Tag=0x00000000, Type=typing.List[Groupcast.Structs.MembershipStruct]),
26
+ ClusterObjectFieldDescriptor(Label="maxMembershipCount", Tag=0x00000001, Type=uint),
27
+ ClusterObjectFieldDescriptor(Label="maxMcastAddrCount", Tag=0x00000002, Type=uint),
28
+ ClusterObjectFieldDescriptor(Label="usedMcastAddrCount", Tag=0x00000003, Type=uint),
29
+ ClusterObjectFieldDescriptor(Label="fabricUnderTest", Tag=0x00000004, Type=uint),
30
30
  ClusterObjectFieldDescriptor(Label="generatedCommandList", Tag=0x0000FFF8, Type=typing.List[uint]),
31
31
  ClusterObjectFieldDescriptor(Label="acceptedCommandList", Tag=0x0000FFF9, Type=typing.List[uint]),
32
32
  ClusterObjectFieldDescriptor(Label="attributeList", Tag=0x0000FFFB, Type=typing.List[uint]),
@@ -34,11 +34,11 @@ class Groupcast(Cluster):
34
34
  ClusterObjectFieldDescriptor(Label="clusterRevision", Tag=0x0000FFFD, Type=uint),
35
35
  ])
36
36
 
37
- membership: typing.Optional[typing.List[Groupcast.Structs.MembershipStruct]] = None
38
- maxMembershipCount: typing.Optional[uint] = None
39
- maxMcastAddrCount: typing.Optional[uint] = None
40
- usedMcastAddrCount: typing.Optional[uint] = None
41
- fabricUnderTest: typing.Optional[uint] = None
37
+ membership: typing.List[Groupcast.Structs.MembershipStruct] = field(default_factory=lambda: [])
38
+ maxMembershipCount: uint = 0
39
+ maxMcastAddrCount: uint = 0
40
+ usedMcastAddrCount: uint = 0
41
+ fabricUnderTest: uint = 0
42
42
  generatedCommandList: typing.List[uint] = field(default_factory=lambda: [])
43
43
  acceptedCommandList: typing.List[uint] = field(default_factory=lambda: [])
44
44
  attributeList: typing.List[uint] = field(default_factory=lambda: [])
@@ -240,9 +240,9 @@ class Groupcast(Cluster):
240
240
 
241
241
  @ChipUtility.classproperty
242
242
  def attribute_type(cls) -> ClusterObjectFieldDescriptor:
243
- return ClusterObjectFieldDescriptor(Type=typing.Optional[typing.List[Groupcast.Structs.MembershipStruct]])
243
+ return ClusterObjectFieldDescriptor(Type=typing.List[Groupcast.Structs.MembershipStruct])
244
244
 
245
- value: typing.Optional[typing.List[Groupcast.Structs.MembershipStruct]] = None
245
+ value: typing.List[Groupcast.Structs.MembershipStruct] = field(default_factory=lambda: [])
246
246
 
247
247
  @dataclass
248
248
  class MaxMembershipCount(ClusterAttributeDescriptor):
@@ -256,9 +256,9 @@ class Groupcast(Cluster):
256
256
 
257
257
  @ChipUtility.classproperty
258
258
  def attribute_type(cls) -> ClusterObjectFieldDescriptor:
259
- return ClusterObjectFieldDescriptor(Type=typing.Optional[uint])
259
+ return ClusterObjectFieldDescriptor(Type=uint)
260
260
 
261
- value: typing.Optional[uint] = None
261
+ value: uint = 0
262
262
 
263
263
  @dataclass
264
264
  class MaxMcastAddrCount(ClusterAttributeDescriptor):
@@ -272,9 +272,9 @@ class Groupcast(Cluster):
272
272
 
273
273
  @ChipUtility.classproperty
274
274
  def attribute_type(cls) -> ClusterObjectFieldDescriptor:
275
- return ClusterObjectFieldDescriptor(Type=typing.Optional[uint])
275
+ return ClusterObjectFieldDescriptor(Type=uint)
276
276
 
277
- value: typing.Optional[uint] = None
277
+ value: uint = 0
278
278
 
279
279
  @dataclass
280
280
  class UsedMcastAddrCount(ClusterAttributeDescriptor):
@@ -288,9 +288,9 @@ class Groupcast(Cluster):
288
288
 
289
289
  @ChipUtility.classproperty
290
290
  def attribute_type(cls) -> ClusterObjectFieldDescriptor:
291
- return ClusterObjectFieldDescriptor(Type=typing.Optional[uint])
291
+ return ClusterObjectFieldDescriptor(Type=uint)
292
292
 
293
- value: typing.Optional[uint] = None
293
+ value: uint = 0
294
294
 
295
295
  @dataclass
296
296
  class FabricUnderTest(ClusterAttributeDescriptor):
@@ -304,9 +304,9 @@ class Groupcast(Cluster):
304
304
 
305
305
  @ChipUtility.classproperty
306
306
  def attribute_type(cls) -> ClusterObjectFieldDescriptor:
307
- return ClusterObjectFieldDescriptor(Type=typing.Optional[uint])
307
+ return ClusterObjectFieldDescriptor(Type=uint)
308
308
 
309
- value: typing.Optional[uint] = None
309
+ value: uint = 0
310
310
 
311
311
  @dataclass
312
312
  class GeneratedCommandList(ClusterAttributeDescriptor):
@@ -29,6 +29,7 @@ class HeimanCluster(Cluster):
29
29
  ClusterObjectFieldDescriptor(Label="sirenActive", Tag=0x00000014, Type=typing.Optional[uint]),
30
30
  ClusterObjectFieldDescriptor(Label="alarmMute", Tag=0x00000015, Type=typing.Optional[uint]),
31
31
  ClusterObjectFieldDescriptor(Label="lowPowerMode", Tag=0x00000016, Type=typing.Optional[uint]),
32
+ ClusterObjectFieldDescriptor(Label="indicatorEnable", Tag=0x00001004, Type=typing.Optional[uint]),
32
33
  ClusterObjectFieldDescriptor(Label="generatedCommandList", Tag=0x0000FFF8, Type=typing.List[uint]),
33
34
  ClusterObjectFieldDescriptor(Label="acceptedCommandList", Tag=0x0000FFF9, Type=typing.List[uint]),
34
35
  ClusterObjectFieldDescriptor(Label="attributeList", Tag=0x0000FFFB, Type=typing.List[uint]),
@@ -43,6 +44,7 @@ class HeimanCluster(Cluster):
43
44
  sirenActive: typing.Optional[uint] = None
44
45
  alarmMute: typing.Optional[uint] = None
45
46
  lowPowerMode: typing.Optional[uint] = None
47
+ indicatorEnable: typing.Optional[uint] = None
46
48
  generatedCommandList: typing.List[uint] = field(default_factory=lambda: [])
47
49
  acceptedCommandList: typing.List[uint] = field(default_factory=lambda: [])
48
50
  attributeList: typing.List[uint] = field(default_factory=lambda: [])
@@ -61,10 +63,30 @@ class HeimanCluster(Cluster):
61
63
  def descriptor(cls) -> ClusterObjectDescriptor:
62
64
  return ClusterObjectDescriptor(
63
65
  Fields=[
64
- ClusterObjectFieldDescriptor(Label="mutingTime", Tag=0, Type=typing.Optional[uint]),
66
+ ClusterObjectFieldDescriptor(Label="mutingTime", Tag=0, Type=uint),
65
67
  ])
66
68
 
67
- mutingTime: typing.Optional[uint] = None
69
+ mutingTime: uint = 0
70
+
71
+ @dataclass
72
+ class SirenActivate(ClusterCommand):
73
+ cluster_id: typing.ClassVar[int] = 0x120BFC01
74
+ command_id: typing.ClassVar[int] = 0x00000001
75
+ is_client: typing.ClassVar[bool] = True
76
+ response_type: typing.ClassVar[typing.Optional[str]] = None
77
+
78
+ @ChipUtility.classproperty
79
+ def descriptor(cls) -> ClusterObjectDescriptor:
80
+ return ClusterObjectDescriptor(
81
+ Fields=[
82
+ ClusterObjectFieldDescriptor(Label="sirenType", Tag=0, Type=uint),
83
+ ClusterObjectFieldDescriptor(Label="volume", Tag=1, Type=uint),
84
+ ClusterObjectFieldDescriptor(Label="duration", Tag=2, Type=uint),
85
+ ])
86
+
87
+ sirenType: uint = 0
88
+ volume: uint = 0
89
+ duration: uint = 0
68
90
 
69
91
  class Attributes:
70
92
  @dataclass
@@ -179,6 +201,22 @@ class HeimanCluster(Cluster):
179
201
 
180
202
  value: typing.Optional[uint] = None
181
203
 
204
+ @dataclass
205
+ class IndicatorEnable(ClusterAttributeDescriptor):
206
+ @ChipUtility.classproperty
207
+ def cluster_id(cls) -> int:
208
+ return 0x120BFC01
209
+
210
+ @ChipUtility.classproperty
211
+ def attribute_id(cls) -> int:
212
+ return 0x00001004
213
+
214
+ @ChipUtility.classproperty
215
+ def attribute_type(cls) -> ClusterObjectFieldDescriptor:
216
+ return ClusterObjectFieldDescriptor(Type=typing.Optional[uint])
217
+
218
+ value: typing.Optional[uint] = None
219
+
182
220
  @dataclass
183
221
  class GeneratedCommandList(ClusterAttributeDescriptor):
184
222
  @ChipUtility.classproperty
@@ -109,14 +109,14 @@ class IcdManagement(Cluster):
109
109
  Fields=[
110
110
  ClusterObjectFieldDescriptor(Label="checkInNodeID", Tag=1, Type=uint),
111
111
  ClusterObjectFieldDescriptor(Label="monitoredSubject", Tag=2, Type=uint),
112
- ClusterObjectFieldDescriptor(Label="key", Tag=3, Type=typing.Optional[uint]),
112
+ ClusterObjectFieldDescriptor(Label="key", Tag=3, Type=typing.Optional[bytes]),
113
113
  ClusterObjectFieldDescriptor(Label="clientType", Tag=4, Type=IcdManagement.Enums.ClientTypeEnum),
114
114
  ClusterObjectFieldDescriptor(Label="fabricIndex", Tag=254, Type=uint),
115
115
  ])
116
116
 
117
117
  checkInNodeID: uint = 0
118
118
  monitoredSubject: uint = 0
119
- key: typing.Optional[uint] = None
119
+ key: typing.Optional[bytes] = None
120
120
  clientType: IcdManagement.Enums.ClientTypeEnum = 0
121
121
  fabricIndex: uint = 0
122
122