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.
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/PKG-INFO +1 -1
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_python_client.egg-info/PKG-INFO +1 -1
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_python_client.egg-info/SOURCES.txt +2 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/client/client.py +2 -1
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/helpers/util.py +37 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/pyproject.toml +1 -1
- matter_python_client-1.4.0a0.dev20260806/tests/test_client.py +44 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_integration.py +18 -0
- matter_python_client-1.4.0a0.dev20260806/tests/test_util.py +132 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/README.md +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/ChipUtility.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/__init__.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/ClusterObjects.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/Objects.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/Types.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/__init__.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/AccessControl.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/AccountLogin.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Actions.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ActivatedCarbonFilterMonitoring.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/AdministratorCommissioning.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/AirQuality.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/AmbientContextSensing.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ApplicationBasic.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ApplicationLauncher.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/AudioOutput.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/BasicInformation.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Binding.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/BooleanState.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/BooleanStateConfiguration.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/BridgedDeviceBasicInformation.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CameraAvSettingsUserLevelManagement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CameraAvStreamManagement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CarbonDioxideConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CarbonMonoxideConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Channel.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Chime.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ClosureControl.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ClosureDimension.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ColorControl.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CommissionerControl.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CommodityMetering.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CommodityPrice.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/CommodityTariff.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ContentAppObserver.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ContentControl.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ContentLauncher.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Descriptor.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/DeviceEnergyManagement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/DeviceEnergyManagementMode.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/DiagnosticLogs.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/DishwasherAlarm.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/DishwasherMode.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/DoorLock.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/DraftElectricalMeasurementCluster.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/EcosystemInformation.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ElectricalEnergyMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ElectricalGridConditions.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ElectricalPowerMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/EnergyEvse.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/EnergyEvseMode.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/EnergyPreference.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/EthernetNetworkDiagnostics.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/EveCluster.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/FanControl.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/FixedLabel.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/FlowMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/FormaldehydeConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/GeneralCommissioning.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/GeneralDiagnostics.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Globals.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/GroupKeyManagement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Groupcast.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Groups.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/HeimanCluster.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/HepaFilterMonitoring.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/IcdManagement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Identify.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/IlluminanceMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/InovelliCluster.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/JointFabricAdministrator.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/JointFabricDatastore.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/KeypadInput.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/LaundryDryerControls.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/LaundryWasherControls.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/LaundryWasherMode.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/LevelControl.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/LocalizationConfiguration.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/LowPower.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/MediaInput.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/MediaPlayback.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Messages.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/MeterIdentification.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/MicrowaveOvenControl.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/MicrowaveOvenMode.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ModeSelect.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/NeoCluster.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/NetworkCommissioning.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/NitrogenDioxideConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OccupancySensing.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OnOff.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OperationalCredentials.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OperationalState.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OtaSoftwareUpdateProvider.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OtaSoftwareUpdateRequestor.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OvenCavityOperationalState.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OvenMode.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/OzoneConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Pm10ConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Pm1ConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Pm25ConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/PowerSource.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/PowerSourceConfiguration.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/PowerTopology.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/PressureMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/PumpConfigurationAndControl.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/PushAvStreamTransport.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/RadonConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/RefrigeratorAlarm.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/RefrigeratorAndTemperatureControlledCabinetMode.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/RelativeHumidityMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/RvcCleanMode.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/RvcOperationalState.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/RvcRunMode.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ScenesManagement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ServiceArea.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/SmokeCoAlarm.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/SoftwareDiagnostics.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/SoilMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Switch.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TargetNavigator.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TclDehumidifierCluster.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TemperatureAlarm.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TemperatureControl.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TemperatureMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/Thermostat.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ThermostatUserInterfaceConfiguration.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ThirdRealityMeteringCluster.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ThreadBorderRouterManagement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ThreadNetworkDiagnostics.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ThreadNetworkDirectory.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TimeFormatLocalization.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TimeSynchronization.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TlsCertificateManagement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TlsClientManagement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/TotalVolatileOrganicCompoundsConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/UnitLocalization.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/UserLabel.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ValveConfigurationAndControl.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WakeOnLan.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WaterHeaterManagement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WaterHeaterMode.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WaterTankLevelMonitoring.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WebRtcTransportDefinitions.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WebRtcTransportProvider.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WebRtcTransportRequestor.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WiFiNetworkDiagnostics.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WiFiNetworkManagement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/WindowCovering.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/ZoneManagement.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/cluster_defs/__init__.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/clusters/enum.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/tlv/__init__.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/chip/tlv/tlvlist.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_python_client.egg-info/dependency_links.txt +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_python_client.egg-info/not-zip-safe +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_python_client.egg-info/requires.txt +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_python_client.egg-info/top_level.txt +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/__init__.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/client/__init__.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/client/connection.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/client/exceptions.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/client/models/__init__.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/client/models/device_types.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/client/models/node.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/__init__.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/const.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/custom_clusters.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/errors.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/helpers/__init__.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/helpers/api.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/helpers/json.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/common/models.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/matter_server/py.typed +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/setup.cfg +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_client_integration.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_credentials.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_event_dispatch.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_icd.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_imports.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_network_topology.py +0 -0
- {matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/tests/test_webrtc_protocol.py +0 -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)
|
{matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/pyproject.toml
RENAMED
|
@@ -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.
|
|
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
|
{matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/README.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{matter_python_client-1.4.0a0.dev20260802 → matter_python_client-1.4.0a0.dev20260806}/setup.cfg
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|