matter-python-client 1.4.0a0.dev20260802__tar.gz → 1.4.0a0.dev20260806__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 (192) hide show
  1. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/PKG-INFO +1 -1
  2. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_python_client.egg-info/PKG-INFO +1 -1
  3. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_python_client.egg-info/SOURCES.txt +2 -0
  4. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/client/client.py +2 -1
  5. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/helpers/util.py +37 -0
  6. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/pyproject.toml +1 -1
  7. matter_python_client-1.4.0a0.dev20260806/tests/test_client.py +44 -0
  8. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_integration.py +18 -0
  9. matter_python_client-1.4.0a0.dev20260806/tests/test_util.py +132 -0
  10. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/README.md +0 -0
  11. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/ChipUtility.py +0 -0
  12. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/__init__.py +0 -0
  13. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/ClusterObjects.py +0 -0
  14. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/Objects.py +0 -0
  15. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/Types.py +0 -0
  16. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/__init__.py +0 -0
  17. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/AccessControl.py +0 -0
  18. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/AccountLogin.py +0 -0
  19. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Actions.py +0 -0
  20. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ActivatedCarbonFilterMonitoring.py +0 -0
  21. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/AdministratorCommissioning.py +0 -0
  22. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/AirQuality.py +0 -0
  23. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/AmbientContextSensing.py +0 -0
  24. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ApplicationBasic.py +0 -0
  25. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ApplicationLauncher.py +0 -0
  26. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/AudioOutput.py +0 -0
  27. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/BasicInformation.py +0 -0
  28. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Binding.py +0 -0
  29. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/BooleanState.py +0 -0
  30. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/BooleanStateConfiguration.py +0 -0
  31. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/BridgedDeviceBasicInformation.py +0 -0
  32. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CameraAvSettingsUserLevelManagement.py +0 -0
  33. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CameraAvStreamManagement.py +0 -0
  34. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CarbonDioxideConcentrationMeasurement.py +0 -0
  35. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CarbonMonoxideConcentrationMeasurement.py +0 -0
  36. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Channel.py +0 -0
  37. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Chime.py +0 -0
  38. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ClosureControl.py +0 -0
  39. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ClosureDimension.py +0 -0
  40. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ColorControl.py +0 -0
  41. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CommissionerControl.py +0 -0
  42. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CommodityMetering.py +0 -0
  43. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CommodityPrice.py +0 -0
  44. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CommodityTariff.py +0 -0
  45. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ContentAppObserver.py +0 -0
  46. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ContentControl.py +0 -0
  47. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ContentLauncher.py +0 -0
  48. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Descriptor.py +0 -0
  49. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/DeviceEnergyManagement.py +0 -0
  50. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/DeviceEnergyManagementMode.py +0 -0
  51. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/DiagnosticLogs.py +0 -0
  52. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/DishwasherAlarm.py +0 -0
  53. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/DishwasherMode.py +0 -0
  54. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/DoorLock.py +0 -0
  55. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/DraftElectricalMeasurementCluster.py +0 -0
  56. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/EcosystemInformation.py +0 -0
  57. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ElectricalEnergyMeasurement.py +0 -0
  58. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ElectricalGridConditions.py +0 -0
  59. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ElectricalPowerMeasurement.py +0 -0
  60. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/EnergyEvse.py +0 -0
  61. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/EnergyEvseMode.py +0 -0
  62. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/EnergyPreference.py +0 -0
  63. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/EthernetNetworkDiagnostics.py +0 -0
  64. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/EveCluster.py +0 -0
  65. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/FanControl.py +0 -0
  66. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/FixedLabel.py +0 -0
  67. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/FlowMeasurement.py +0 -0
  68. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/FormaldehydeConcentrationMeasurement.py +0 -0
  69. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/GeneralCommissioning.py +0 -0
  70. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/GeneralDiagnostics.py +0 -0
  71. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Globals.py +0 -0
  72. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/GroupKeyManagement.py +0 -0
  73. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Groupcast.py +0 -0
  74. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Groups.py +0 -0
  75. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/HeimanCluster.py +0 -0
  76. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/HepaFilterMonitoring.py +0 -0
  77. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/IcdManagement.py +0 -0
  78. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Identify.py +0 -0
  79. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/IlluminanceMeasurement.py +0 -0
  80. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/InovelliCluster.py +0 -0
  81. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/JointFabricAdministrator.py +0 -0
  82. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/JointFabricDatastore.py +0 -0
  83. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/KeypadInput.py +0 -0
  84. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/LaundryDryerControls.py +0 -0
  85. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/LaundryWasherControls.py +0 -0
  86. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/LaundryWasherMode.py +0 -0
  87. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/LevelControl.py +0 -0
  88. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/LocalizationConfiguration.py +0 -0
  89. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/LowPower.py +0 -0
  90. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/MediaInput.py +0 -0
  91. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/MediaPlayback.py +0 -0
  92. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Messages.py +0 -0
  93. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/MeterIdentification.py +0 -0
  94. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/MicrowaveOvenControl.py +0 -0
  95. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/MicrowaveOvenMode.py +0 -0
  96. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ModeSelect.py +0 -0
  97. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/NeoCluster.py +0 -0
  98. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/NetworkCommissioning.py +0 -0
  99. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/NitrogenDioxideConcentrationMeasurement.py +0 -0
  100. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OccupancySensing.py +0 -0
  101. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OnOff.py +0 -0
  102. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OperationalCredentials.py +0 -0
  103. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OperationalState.py +0 -0
  104. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OtaSoftwareUpdateProvider.py +0 -0
  105. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OtaSoftwareUpdateRequestor.py +0 -0
  106. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OvenCavityOperationalState.py +0 -0
  107. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OvenMode.py +0 -0
  108. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OzoneConcentrationMeasurement.py +0 -0
  109. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Pm10ConcentrationMeasurement.py +0 -0
  110. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Pm1ConcentrationMeasurement.py +0 -0
  111. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Pm25ConcentrationMeasurement.py +0 -0
  112. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/PowerSource.py +0 -0
  113. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/PowerSourceConfiguration.py +0 -0
  114. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/PowerTopology.py +0 -0
  115. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/PressureMeasurement.py +0 -0
  116. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/PumpConfigurationAndControl.py +0 -0
  117. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/PushAvStreamTransport.py +0 -0
  118. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/RadonConcentrationMeasurement.py +0 -0
  119. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/RefrigeratorAlarm.py +0 -0
  120. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/RefrigeratorAndTemperatureControlledCabinetMode.py +0 -0
  121. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/RelativeHumidityMeasurement.py +0 -0
  122. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/RvcCleanMode.py +0 -0
  123. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/RvcOperationalState.py +0 -0
  124. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/RvcRunMode.py +0 -0
  125. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ScenesManagement.py +0 -0
  126. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ServiceArea.py +0 -0
  127. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/SmokeCoAlarm.py +0 -0
  128. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/SoftwareDiagnostics.py +0 -0
  129. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/SoilMeasurement.py +0 -0
  130. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Switch.py +0 -0
  131. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TargetNavigator.py +0 -0
  132. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TclDehumidifierCluster.py +0 -0
  133. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TemperatureAlarm.py +0 -0
  134. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TemperatureControl.py +0 -0
  135. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TemperatureMeasurement.py +0 -0
  136. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Thermostat.py +0 -0
  137. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ThermostatUserInterfaceConfiguration.py +0 -0
  138. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ThirdRealityMeteringCluster.py +0 -0
  139. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ThreadBorderRouterManagement.py +0 -0
  140. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ThreadNetworkDiagnostics.py +0 -0
  141. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ThreadNetworkDirectory.py +0 -0
  142. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TimeFormatLocalization.py +0 -0
  143. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TimeSynchronization.py +0 -0
  144. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TlsCertificateManagement.py +0 -0
  145. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TlsClientManagement.py +0 -0
  146. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TotalVolatileOrganicCompoundsConcentrationMeasurement.py +0 -0
  147. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/UnitLocalization.py +0 -0
  148. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/UserLabel.py +0 -0
  149. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ValveConfigurationAndControl.py +0 -0
  150. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WakeOnLan.py +0 -0
  151. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WaterHeaterManagement.py +0 -0
  152. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WaterHeaterMode.py +0 -0
  153. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WaterTankLevelMonitoring.py +0 -0
  154. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WebRtcTransportDefinitions.py +0 -0
  155. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WebRtcTransportProvider.py +0 -0
  156. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WebRtcTransportRequestor.py +0 -0
  157. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WiFiNetworkDiagnostics.py +0 -0
  158. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WiFiNetworkManagement.py +0 -0
  159. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WindowCovering.py +0 -0
  160. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ZoneManagement.py +0 -0
  161. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/__init__.py +0 -0
  162. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/enum.py +0 -0
  163. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/tlv/__init__.py +0 -0
  164. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/tlv/tlvlist.py +0 -0
  165. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_python_client.egg-info/dependency_links.txt +0 -0
  166. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_python_client.egg-info/not-zip-safe +0 -0
  167. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_python_client.egg-info/requires.txt +0 -0
  168. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_python_client.egg-info/top_level.txt +0 -0
  169. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/__init__.py +0 -0
  170. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/client/__init__.py +0 -0
  171. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/client/connection.py +0 -0
  172. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/client/exceptions.py +0 -0
  173. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/client/models/__init__.py +0 -0
  174. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/client/models/device_types.py +0 -0
  175. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/client/models/node.py +0 -0
  176. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/__init__.py +0 -0
  177. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/const.py +0 -0
  178. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/custom_clusters.py +0 -0
  179. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/errors.py +0 -0
  180. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/helpers/__init__.py +0 -0
  181. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/helpers/api.py +0 -0
  182. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/helpers/json.py +0 -0
  183. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/models.py +0 -0
  184. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/py.typed +0 -0
  185. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/setup.cfg +0 -0
  186. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_client_integration.py +0 -0
  187. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_credentials.py +0 -0
  188. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_event_dispatch.py +0 -0
  189. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_icd.py +0 -0
  190. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_imports.py +0 -0
  191. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_network_topology.py +0 -0
  192. {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_webrtc_protocol.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: matter-python-client
3
- Version: 1.4.0a0.dev20260802
3
+ Version: 1.4.0a0.dev20260806
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: matter-python-client
3
- Version: 1.4.0a0.dev20260802
3
+ Version: 1.4.0a0.dev20260806
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
@@ -178,6 +178,7 @@ matter_server/common/helpers/__init__.py
178
178
  matter_server/common/helpers/api.py
179
179
  matter_server/common/helpers/json.py
180
180
  matter_server/common/helpers/util.py
181
+ tests/test_client.py
181
182
  tests/test_client_integration.py
182
183
  tests/test_credentials.py
183
184
  tests/test_event_dispatch.py
@@ -185,4 +186,5 @@ tests/test_icd.py
185
186
  tests/test_imports.py
186
187
  tests/test_integration.py
187
188
  tests/test_network_topology.py
189
+ tests/test_util.py
188
190
  tests/test_webrtc_protocol.py
@@ -16,6 +16,7 @@ from matter_server.common.helpers.util import (
16
16
  create_attribute_path_from_attribute,
17
17
  dataclass_from_dict,
18
18
  dataclass_to_dict,
19
+ dataclass_to_tag_dict,
19
20
  )
20
21
  from matter_server.common.models import (
21
22
  APICommand,
@@ -623,7 +624,7 @@ class MatterClient:
623
624
  require_schema=4,
624
625
  node_id=node_id,
625
626
  attribute_path=attribute_path,
626
- value=value,
627
+ value=dataclass_to_tag_dict(value),
627
628
  )
628
629
 
629
630
  async def remove_node(self, node_id: int) -> None:
@@ -89,6 +89,43 @@ def dataclass_to_dict(obj_in: DataclassInstance) -> dict:
89
89
  )
90
90
 
91
91
 
92
+ def dataclass_to_tag_dict(obj_in: Any) -> Any:
93
+ """Recursively convert dataclass instance(s) to TLV tag-keyed dict(s).
94
+
95
+ Unlike dataclass_to_dict (keyed by field name, used for DEVICE_COMMAND
96
+ payloads), WRITE_ATTRIBUTE expects struct values keyed by their numeric
97
+ TLV tag, matching the format already used for attribute reports.
98
+
99
+ Every generated CHIP cluster dataclass (the only kind ever passed to
100
+ write_attribute()) exposes a `descriptor` with a Tag per field, so the
101
+ tag lookup always succeeds in practice. A dataclass field is only ever
102
+ kept name-keyed if `descriptor`/`GetFieldByLabel` is missing/unset for
103
+ that field, which should not happen for real cluster structs; this is a
104
+ defensive fallback, not an expected code path.
105
+
106
+ A field whose value is None is omitted, matching CHIP's own TLV encoder
107
+ (ClusterObjects.PutFieldToTLV), which treats None as absent rather than
108
+ writing an explicit null; NullValue fields are still emitted.
109
+ """
110
+ if is_dataclass(obj_in) and not isinstance(obj_in, type):
111
+ descriptor = getattr(type(obj_in), "descriptor", None)
112
+ result: dict[str, Any] = {}
113
+ for field in cached_fields(type(obj_in)):
114
+ value = getattr(obj_in, field.name)
115
+ if value is None:
116
+ continue
117
+ field_descriptor = descriptor.GetFieldByLabel(field.name) if descriptor is not None else None
118
+ tag = field_descriptor.Tag if field_descriptor is not None else None
119
+ key = str(tag) if tag is not None else field.name
120
+ result[key] = dataclass_to_tag_dict(value)
121
+ return result
122
+ if isinstance(obj_in, (list, tuple)):
123
+ return [dataclass_to_tag_dict(item) for item in obj_in]
124
+ if isinstance(obj_in, dict):
125
+ return {key: dataclass_to_tag_dict(value) for key, value in obj_in.items()}
126
+ return obj_in
127
+
128
+
92
129
  def parse_utc_timestamp(datetime_string: str) -> datetime:
93
130
  """Parse datetime from string."""
94
131
  return datetime.fromisoformat(datetime_string)
@@ -25,7 +25,7 @@ license = "Apache-2.0"
25
25
  name = "matter-python-client"
26
26
  readme = "README.md"
27
27
  requires-python = ">=3.12"
28
- version = "1.4.0a0.dev20260802"
28
+ version = "1.4.0a0.dev20260806"
29
29
 
30
30
  [project.urls]
31
31
  Homepage = "https://github.com/matter-js/matterjs-server"
@@ -0,0 +1,44 @@
1
+ """Tests for matter_server.client.client.MatterClient."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from unittest.mock import AsyncMock, MagicMock
6
+
7
+ from chip.clusters import Objects as clusters
8
+ from matter_server.client.client import MatterClient
9
+ from matter_server.common.models import APICommand
10
+
11
+
12
+ async def test_write_attribute_sends_tag_keyed_value() -> None:
13
+ """write_attribute must route struct values through dataclass_to_tag_dict.
14
+
15
+ send_command must receive TLV-tag keys ("0".."5"), not field names, or the
16
+ server rejects the write with INVALID_DATA_TYPE.
17
+ """
18
+ client = MatterClient(ws_server_url="ws://example.invalid/ws", aiohttp_session=MagicMock())
19
+ client.send_command = AsyncMock(return_value=None)
20
+
21
+ preset = clusters.Thermostat.Structs.PresetStruct(
22
+ presetHandle=b"\x01",
23
+ presetScenario=clusters.Thermostat.Enums.PresetScenarioEnum.kOccupied,
24
+ name=None,
25
+ coolingSetpoint=2500,
26
+ heatingSetpoint=2100,
27
+ builtIn=True,
28
+ )
29
+
30
+ await client.write_attribute(node_id=1, attribute_path="1/513/80", value=preset)
31
+
32
+ client.send_command.assert_awaited_once_with(
33
+ APICommand.WRITE_ATTRIBUTE,
34
+ require_schema=4,
35
+ node_id=1,
36
+ attribute_path="1/513/80",
37
+ value={
38
+ "0": b"\x01",
39
+ "1": clusters.Thermostat.Enums.PresetScenarioEnum.kOccupied,
40
+ "3": 2500,
41
+ "4": 2100,
42
+ "5": True,
43
+ },
44
+ )
@@ -548,6 +548,24 @@ class TestAttributeOperations:
548
548
  attrs = await client.read_attribute(env["node_id"], "0/40/5")
549
549
  assert attrs["0/40/5"] == "Integration Test Node"
550
550
 
551
+ async def test_32a_write_struct_list_attribute(self, env):
552
+ """Write UserLabel.LabelList with a real CHIP struct and verify."""
553
+ from chip.clusters import Objects as Clusters
554
+
555
+ _require_state(env, "node_id")
556
+ client: MatterTestClient = env["client"]
557
+ result = await client.write_attribute(
558
+ env["node_id"],
559
+ "1/65/0",
560
+ [Clusters.UserLabel.Structs.LabelStruct(label="room", value="den")],
561
+ )
562
+ assert isinstance(result, list)
563
+ assert result[0]["Status"] == 0
564
+
565
+ # Read back
566
+ attrs = await client.read_attribute(env["node_id"], "1/65/0")
567
+ assert attrs["1/65/0"] == [{"0": "room", "1": "den"}]
568
+
551
569
 
552
570
  # ============================================================================
553
571
  # Section 6 -- Device Commands
@@ -0,0 +1,132 @@
1
+ """Tests for matter_server.common.helpers.util."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from chip.clusters import Objects as clusters
6
+ from chip.clusters.Types import NullValue
7
+ from chip.tlv import uint
8
+ from matter_server.common.helpers.util import dataclass_to_dict, dataclass_to_tag_dict
9
+
10
+
11
+ def test_dataclass_to_tag_dict_uses_tlv_tags() -> None:
12
+ """dataclass_to_tag_dict must key struct fields by their TLV tag, not field name.
13
+
14
+ WRITE_ATTRIBUTE expects the same tag-keyed struct format already used for
15
+ attribute reports. Sending field-name keys instead (as plain
16
+ dataclasses.asdict()/dataclass_to_dict() would) causes the receiving
17
+ matter-server to fail mapping fields like `presetHandle`, leaving binary
18
+ handle fields as un-decoded base64 strings and the write rejected with
19
+ INVALID_DATA_TYPE.
20
+ """
21
+ preset = clusters.Thermostat.Structs.PresetStruct(
22
+ presetHandle=b"\x01",
23
+ presetScenario=clusters.Thermostat.Enums.PresetScenarioEnum.kOccupied,
24
+ name=None,
25
+ coolingSetpoint=2500,
26
+ heatingSetpoint=2100,
27
+ builtIn=True,
28
+ )
29
+
30
+ result = dataclass_to_tag_dict(preset)
31
+
32
+ assert result == {
33
+ "0": b"\x01",
34
+ "1": clusters.Thermostat.Enums.PresetScenarioEnum.kOccupied,
35
+ "3": 2500,
36
+ "4": 2100,
37
+ "5": True,
38
+ }
39
+ assert "2" not in result # name=None (absent optional field)
40
+
41
+
42
+ def test_dataclass_to_tag_dict_is_recursive_through_lists() -> None:
43
+ """Nested dataclasses inside lists (e.g. Schedule.transitions) must also convert."""
44
+ schedule = clusters.Thermostat.Structs.ScheduleStruct(
45
+ scheduleHandle=NullValue,
46
+ systemMode=clusters.Thermostat.Enums.SystemModeEnum.kHeat,
47
+ name="Weekdays",
48
+ presetHandle=None,
49
+ transitions=[
50
+ clusters.Thermostat.Structs.ScheduleTransitionStruct(
51
+ dayOfWeek=clusters.Thermostat.Bitmaps.ScheduleDayOfWeekBitmap.kMonday,
52
+ transitionTime=uint(420),
53
+ heatingSetpoint=2100,
54
+ )
55
+ ],
56
+ builtIn=False,
57
+ )
58
+
59
+ result = dataclass_to_tag_dict(schedule)
60
+
61
+ assert result["0"] is NullValue # scheduleHandle, passed through unchanged
62
+ assert result["1"] == clusters.Thermostat.Enums.SystemModeEnum.kHeat
63
+ assert result["2"] == "Weekdays"
64
+ assert isinstance(result["4"], list)
65
+ transition = result["4"][0]
66
+ assert transition == {
67
+ "0": clusters.Thermostat.Bitmaps.ScheduleDayOfWeekBitmap.kMonday,
68
+ "1": 420,
69
+ "5": 2100,
70
+ }
71
+ for absent_tag in ("2", "3", "4"): # presetHandle, systemMode, coolingSetpoint
72
+ assert absent_tag not in transition
73
+
74
+
75
+ def test_dataclass_to_tag_dict_omits_none_but_keeps_nullvalue() -> None:
76
+ """Absent optional fields (None) are omitted; explicit NullValue fields are kept.
77
+
78
+ Partial-struct writes (e.g. a heat-only ScheduleTransitionStruct) must not
79
+ emit unset fields as JSON null, since matter.js rejects null on optional
80
+ non-nullable members.
81
+ """
82
+ transition = clusters.Thermostat.Structs.ScheduleTransitionStruct(
83
+ dayOfWeek=clusters.Thermostat.Bitmaps.ScheduleDayOfWeekBitmap.kMonday,
84
+ transitionTime=uint(420),
85
+ heatingSetpoint=2100,
86
+ )
87
+
88
+ result = dataclass_to_tag_dict(transition)
89
+
90
+ assert result == {
91
+ "0": clusters.Thermostat.Bitmaps.ScheduleDayOfWeekBitmap.kMonday,
92
+ "1": 420,
93
+ "5": 2100,
94
+ }
95
+
96
+ preset = clusters.Thermostat.Structs.PresetStruct(
97
+ presetHandle=b"\x01",
98
+ presetScenario=clusters.Thermostat.Enums.PresetScenarioEnum.kOccupied,
99
+ name=NullValue,
100
+ coolingSetpoint=None,
101
+ heatingSetpoint=2100,
102
+ builtIn=True,
103
+ )
104
+
105
+ preset_result = dataclass_to_tag_dict(preset)
106
+
107
+ assert preset_result["2"] is NullValue # name explicitly nulled
108
+ assert "3" not in preset_result # coolingSetpoint absent
109
+
110
+
111
+ def test_dataclass_to_tag_dict_passes_through_scalars() -> None:
112
+ """Non-dataclass values (the common case for simple attributes) are untouched."""
113
+ assert dataclass_to_tag_dict(2000) == 2000
114
+ assert dataclass_to_tag_dict("Integration Test Node") == "Integration Test Node"
115
+ assert dataclass_to_tag_dict(None) is None
116
+
117
+
118
+ def test_dataclass_to_dict_still_uses_field_names() -> None:
119
+ """dataclass_to_dict (used for DEVICE_COMMAND payloads) is unaffected by this change."""
120
+ preset = clusters.Thermostat.Structs.PresetStruct(
121
+ presetHandle=b"\x01",
122
+ presetScenario=clusters.Thermostat.Enums.PresetScenarioEnum.kOccupied,
123
+ name=None,
124
+ coolingSetpoint=2500,
125
+ heatingSetpoint=2100,
126
+ builtIn=True,
127
+ )
128
+
129
+ result = dataclass_to_dict(preset)
130
+
131
+ assert result["presetHandle"] == b"\x01"
132
+ assert result["presetScenario"] == clusters.Thermostat.Enums.PresetScenarioEnum.kOccupied