matter-python-client 1.4.1a11.dev20261007__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.
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/PKG-INFO +63 -1
- matter_python_client-1.5.0/README.md +162 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/Objects.py +2 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AmbientContextSensing.py +20 -18
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Globals.py +0 -2
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Groupcast.py +20 -20
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/HeimanCluster.py +40 -2
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/IcdManagement.py +2 -2
- matter_python_client-1.5.0/chip/clusters/cluster_defs/IkeaValveCalibrationCluster.py +168 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/IlluminanceMeasurement.py +4 -4
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Thermostat.py +43 -32
- matter_python_client-1.5.0/chip/clusters/cluster_defs/UnitTestingCluster.py +245 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WebRtcTransportDefinitions.py +2 -2
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WindowCovering.py +36 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/__init__.py +4 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_python_client.egg-info/PKG-INFO +63 -1
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_python_client.egg-info/SOURCES.txt +6 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/client/client.py +607 -26
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/client/models/device_types.py +1 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/client/models/node.py +265 -33
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/common/custom_clusters.py +6 -0
- matter_python_client-1.5.0/matter_server/common/errors.py +297 -0
- matter_python_client-1.5.0/matter_server/common/models.py +944 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/pyproject.toml +1 -1
- matter_python_client-1.5.0/tests/test_bridge_node_fixture.py +291 -0
- matter_python_client-1.5.0/tests/test_bridge_topology.py +1443 -0
- matter_python_client-1.5.0/tests/test_camera.py +596 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/tests/test_client.py +103 -2
- matter_python_client-1.5.0/tests/test_event_dispatch.py +462 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/tests/test_imports.py +16 -1
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/tests/test_integration.py +226 -2
- matter_python_client-1.5.0/tests/test_interaction.py +807 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/tests/test_util.py +76 -1
- matter_python_client-1.5.0/tests/test_webrtc_protocol.py +143 -0
- matter_python_client-1.4.1a11.dev20261007/README.md +0 -100
- matter_python_client-1.4.1a11.dev20261007/matter_server/common/errors.py +0 -139
- matter_python_client-1.4.1a11.dev20261007/matter_server/common/models.py +0 -419
- matter_python_client-1.4.1a11.dev20261007/tests/test_event_dispatch.py +0 -35
- matter_python_client-1.4.1a11.dev20261007/tests/test_webrtc_protocol.py +0 -36
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/ChipUtility.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/__init__.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/ClusterObjects.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/Types.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/__init__.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AccessControl.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AccountLogin.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Actions.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ActivatedCarbonFilterMonitoring.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AdministratorCommissioning.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AirQuality.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ApplicationBasic.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ApplicationLauncher.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AqaraAmbientSensingConfigurationCluster.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AqaraOccupantLocationCluster.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AqaraRadarSensingUnionCluster.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/AudioOutput.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/BasicInformation.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Binding.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/BooleanState.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/BooleanStateConfiguration.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/BridgedDeviceBasicInformation.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CameraAvSettingsUserLevelManagement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CameraAvStreamManagement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CarbonDioxideConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CarbonMonoxideConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Channel.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Chime.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ClosureControl.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ClosureDimension.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ColorControl.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CommissionerControl.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CommodityMetering.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CommodityPrice.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/CommodityTariff.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ContentAppObserver.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ContentControl.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ContentLauncher.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Descriptor.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/DeviceEnergyManagement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/DeviceEnergyManagementMode.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/DiagnosticLogs.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/DishwasherAlarm.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/DishwasherMode.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/DoorLock.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/DraftElectricalMeasurementCluster.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/EcosystemInformation.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ElectricalEnergyMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ElectricalGridConditions.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ElectricalPowerMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/EnergyEvse.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/EnergyEvseMode.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/EnergyPreference.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/EthernetNetworkDiagnostics.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/EveCluster.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/FanControl.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/FixedLabel.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/FlowMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/FormaldehydeConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/GeneralCommissioning.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/GeneralDiagnostics.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/GroupKeyManagement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Groups.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/HepaFilterMonitoring.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Identify.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/InovelliCluster.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/JointFabricAdministrator.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/JointFabricDatastore.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/KeypadInput.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/LaundryDryerControls.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/LaundryWasherControls.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/LaundryWasherMode.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/LevelControl.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/LocalizationConfiguration.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/LowPower.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/MediaInput.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/MediaPlayback.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Messages.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/MeterIdentification.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/MicrowaveOvenControl.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/MicrowaveOvenMode.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ModeSelect.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/NeoCluster.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/NetworkCommissioning.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/NitrogenDioxideConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OccupancySensing.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OnOff.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OperationalCredentials.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OperationalState.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OtaSoftwareUpdateProvider.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OtaSoftwareUpdateRequestor.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OvenCavityOperationalState.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OvenMode.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/OzoneConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Pm10ConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Pm1ConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Pm25ConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/PowerSource.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/PowerSourceConfiguration.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/PowerTopology.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/PressureMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/PumpConfigurationAndControl.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/PushAvStreamTransport.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/RadonConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/RefrigeratorAlarm.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/RefrigeratorAndTemperatureControlledCabinetMode.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/RelativeHumidityMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/RvcCleanMode.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/RvcOperationalState.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/RvcRunMode.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ScenesManagement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ServiceArea.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/SmokeCoAlarm.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/SoftwareDiagnostics.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/SoilMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/Switch.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TargetNavigator.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TclDehumidifierCluster.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TemperatureAlarm.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TemperatureControl.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TemperatureMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ThermostatUserInterfaceConfiguration.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ThirdRealityMeteringCluster.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ThreadBorderRouterManagement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ThreadNetworkDiagnostics.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ThreadNetworkDirectory.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TimeFormatLocalization.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TimeSynchronization.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TlsCertificateManagement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TlsClientManagement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/TotalVolatileOrganicCompoundsConcentrationMeasurement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/UnitLocalization.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/UserLabel.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ValveConfigurationAndControl.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WagoCluster.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WakeOnLan.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WaterHeaterManagement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WaterHeaterMode.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WaterTankLevelMonitoring.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WebRtcTransportProvider.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WebRtcTransportRequestor.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WiFiNetworkDiagnostics.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/WiFiNetworkManagement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/cluster_defs/ZoneManagement.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/enum.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/tlv/__init__.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/tlv/tlvlist.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_python_client.egg-info/dependency_links.txt +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_python_client.egg-info/not-zip-safe +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_python_client.egg-info/requires.txt +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_python_client.egg-info/top_level.txt +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/__init__.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/client/__init__.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/client/connection.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/client/exceptions.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/client/models/__init__.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/common/__init__.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/common/const.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/common/helpers/__init__.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/common/helpers/api.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/common/helpers/json.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/common/helpers/util.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/matter_server/py.typed +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/setup.cfg +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/tests/test_bigint_wire.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/tests/test_client_integration.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/tests/test_credentials.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/tests/test_icd.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/tests/test_network_topology.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/tests/test_ota_upload.py +0 -0
- {matter_python_client-1.4.1a11.dev20261007 → 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.
|
|
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`
|
{matter_python_client-1.4.1a11.dev20261007 → matter_python_client-1.5.0}/chip/clusters/Objects.py
RENAMED
|
@@ -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 .
|
|
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[
|
|
31
|
-
ClusterObjectFieldDescriptor(Label="
|
|
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[
|
|
50
|
-
|
|
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[
|
|
93
|
+
ClusterObjectFieldDescriptor(Label="ambientContextSensed", Tag=0, Type=typing.Optional[typing.List[Globals.Structs.semtag]]),
|
|
94
94
|
])
|
|
95
95
|
|
|
96
|
-
ambientContextSensed: typing.Optional[typing.List[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
209
|
+
return ClusterObjectFieldDescriptor(Type=typing.Optional[typing.List[Globals.Structs.semtag]])
|
|
210
210
|
|
|
211
|
-
value: typing.Optional[typing.List[
|
|
211
|
+
value: typing.Optional[typing.List[Globals.Structs.semtag]] = None
|
|
212
212
|
|
|
213
213
|
@dataclass
|
|
214
|
-
class
|
|
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="
|
|
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
|
-
|
|
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="
|
|
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
|
-
|
|
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.
|
|
26
|
-
ClusterObjectFieldDescriptor(Label="maxMembershipCount", Tag=0x00000001, Type=
|
|
27
|
-
ClusterObjectFieldDescriptor(Label="maxMcastAddrCount", Tag=0x00000002, Type=
|
|
28
|
-
ClusterObjectFieldDescriptor(Label="usedMcastAddrCount", Tag=0x00000003, Type=
|
|
29
|
-
ClusterObjectFieldDescriptor(Label="fabricUnderTest", Tag=0x00000004, Type=
|
|
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.
|
|
38
|
-
maxMembershipCount:
|
|
39
|
-
maxMcastAddrCount:
|
|
40
|
-
usedMcastAddrCount:
|
|
41
|
-
fabricUnderTest:
|
|
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.
|
|
243
|
+
return ClusterObjectFieldDescriptor(Type=typing.List[Groupcast.Structs.MembershipStruct])
|
|
244
244
|
|
|
245
|
-
value: typing.
|
|
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=
|
|
259
|
+
return ClusterObjectFieldDescriptor(Type=uint)
|
|
260
260
|
|
|
261
|
-
value:
|
|
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=
|
|
275
|
+
return ClusterObjectFieldDescriptor(Type=uint)
|
|
276
276
|
|
|
277
|
-
value:
|
|
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=
|
|
291
|
+
return ClusterObjectFieldDescriptor(Type=uint)
|
|
292
292
|
|
|
293
|
-
value:
|
|
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=
|
|
307
|
+
return ClusterObjectFieldDescriptor(Type=uint)
|
|
308
308
|
|
|
309
|
-
value:
|
|
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=
|
|
66
|
+
ClusterObjectFieldDescriptor(Label="mutingTime", Tag=0, Type=uint),
|
|
65
67
|
])
|
|
66
68
|
|
|
67
|
-
mutingTime:
|
|
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[
|
|
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[
|
|
119
|
+
key: typing.Optional[bytes] = None
|
|
120
120
|
clientType: IcdManagement.Enums.ClientTypeEnum = 0
|
|
121
121
|
fabricIndex: uint = 0
|
|
122
122
|
|