matter-python-client 1.5.0a0.dev202610200302__tar.gz → 1.5.1__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.5.0a0.dev202610200302 → matter_python_client-1.5.1}/PKG-INFO +12 -2
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/README.md +11 -1
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/Objects.py +1 -0
- matter_python_client-1.5.1/chip/clusters/cluster_defs/AqaraLedStripT2Cluster.py +171 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/__init__.py +2 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_python_client.egg-info/PKG-INFO +12 -2
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_python_client.egg-info/SOURCES.txt +1 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/client/client.py +62 -11
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/common/custom_clusters.py +3 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/common/models.py +18 -1
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/pyproject.toml +1 -1
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_camera.py +46 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_client.py +97 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_event_dispatch.py +7 -2
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_webrtc_protocol.py +15 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/ChipUtility.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302/matter_server/common/helpers → matter_python_client-1.5.1/chip}/__init__.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/ClusterObjects.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/Types.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/__init__.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/AccessControl.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/AccountLogin.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/Actions.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ActivatedCarbonFilterMonitoring.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/AdministratorCommissioning.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/AirQuality.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/AmbientContextSensing.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ApplicationBasic.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ApplicationLauncher.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/AqaraAmbientSensingConfigurationCluster.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/AqaraOccupantLocationCluster.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/AqaraRadarSensingUnionCluster.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/AudioOutput.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/BasicInformation.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/Binding.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/BooleanState.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/BooleanStateConfiguration.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/BridgedDeviceBasicInformation.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/CameraAvSettingsUserLevelManagement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/CameraAvStreamManagement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/CarbonDioxideConcentrationMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/CarbonMonoxideConcentrationMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/Channel.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/Chime.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ClosureControl.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ClosureDimension.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ColorControl.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/CommissionerControl.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/CommodityMetering.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/CommodityPrice.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/CommodityTariff.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ContentAppObserver.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ContentControl.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ContentLauncher.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/Descriptor.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/DeviceEnergyManagement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/DeviceEnergyManagementMode.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/DiagnosticLogs.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/DishwasherAlarm.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/DishwasherMode.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/DoorLock.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/DraftElectricalMeasurementCluster.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/EcosystemInformation.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ElectricalEnergyMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ElectricalGridConditions.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ElectricalPowerMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/EnergyEvse.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/EnergyEvseMode.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/EnergyPreference.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/EthernetNetworkDiagnostics.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/EveCluster.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/FanControl.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/FixedLabel.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/FlowMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/FormaldehydeConcentrationMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/GeneralCommissioning.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/GeneralDiagnostics.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/Globals.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/GroupKeyManagement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/Groupcast.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/Groups.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/HeimanCluster.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/HepaFilterMonitoring.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/IcdManagement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/Identify.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/IkeaValveCalibrationCluster.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/IlluminanceMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/InovelliCluster.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/JointFabricAdministrator.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/JointFabricDatastore.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/KeypadInput.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/LaundryDryerControls.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/LaundryWasherControls.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/LaundryWasherMode.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/LevelControl.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/LocalizationConfiguration.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/LowPower.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/MediaInput.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/MediaPlayback.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/Messages.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/MeterIdentification.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/MicrowaveOvenControl.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/MicrowaveOvenMode.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ModeSelect.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/NeoCluster.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/NetworkCommissioning.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/NitrogenDioxideConcentrationMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/OccupancySensing.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/OnOff.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/OperationalCredentials.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/OperationalState.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/OtaSoftwareUpdateProvider.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/OtaSoftwareUpdateRequestor.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/OvenCavityOperationalState.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/OvenMode.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/OzoneConcentrationMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/Pm10ConcentrationMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/Pm1ConcentrationMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/Pm25ConcentrationMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/PowerSource.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/PowerSourceConfiguration.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/PowerTopology.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/PressureMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/PumpConfigurationAndControl.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/PushAvStreamTransport.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/RadonConcentrationMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/RefrigeratorAlarm.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/RefrigeratorAndTemperatureControlledCabinetMode.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/RelativeHumidityMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/RvcCleanMode.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/RvcOperationalState.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/RvcRunMode.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ScenesManagement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ServiceArea.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/SmokeCoAlarm.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/SoftwareDiagnostics.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/SoilMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/Switch.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/TargetNavigator.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/TclDehumidifierCluster.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/TemperatureAlarm.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/TemperatureControl.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/TemperatureMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/Thermostat.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ThermostatUserInterfaceConfiguration.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ThirdRealityMeteringCluster.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ThreadBorderRouterManagement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ThreadNetworkDiagnostics.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ThreadNetworkDirectory.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/TimeFormatLocalization.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/TimeSynchronization.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/TlsCertificateManagement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/TlsClientManagement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/TotalVolatileOrganicCompoundsConcentrationMeasurement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/UnitLocalization.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/UnitTestingCluster.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/UserLabel.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ValveConfigurationAndControl.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/WagoCluster.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/WakeOnLan.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/WaterHeaterManagement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/WaterHeaterMode.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/WaterTankLevelMonitoring.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/WebRtcTransportDefinitions.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/WebRtcTransportProvider.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/WebRtcTransportRequestor.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/WiFiNetworkDiagnostics.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/WiFiNetworkManagement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/WindowCovering.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/cluster_defs/ZoneManagement.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/clusters/enum.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/tlv/__init__.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/chip/tlv/tlvlist.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_python_client.egg-info/dependency_links.txt +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_python_client.egg-info/not-zip-safe +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_python_client.egg-info/requires.txt +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_python_client.egg-info/top_level.txt +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/__init__.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/client/__init__.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/client/connection.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/client/exceptions.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/client/models/__init__.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/client/models/device_types.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/client/models/node.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/common/__init__.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/common/const.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/common/errors.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302/chip → matter_python_client-1.5.1/matter_server/common/helpers}/__init__.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/common/helpers/api.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/common/helpers/json.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/common/helpers/util.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/matter_server/py.typed +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/setup.cfg +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_bigint_wire.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_bridge_node_fixture.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_bridge_topology.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_client_integration.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_credentials.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_icd.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_imports.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_integration.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_interaction.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_network_topology.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_ota_upload.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_unix_socket.py +0 -0
- {matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_util.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: matter-python-client
|
|
3
|
-
Version: 1.5.
|
|
3
|
+
Version: 1.5.1
|
|
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
|
|
@@ -141,9 +141,19 @@ Beyond the `python-matter-server` API, the client exposes commands the Matter.js
|
|
|
141
141
|
play your audio; without it the server makes the offer's audio sections not send, so a browser-style
|
|
142
142
|
`sendrecv` audio offer goes to the camera as `recvonly`. `camera_session_ended` and
|
|
143
143
|
`camera_stream_evicted` events arrive as `CameraSessionEndedData` / `CameraStreamEvictedData`;
|
|
144
|
-
`webrtc_callback` stays a dict.
|
|
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
|
|
145
146
|
details as attributes, e.g. `err.reason` and `err.bound` on `CameraStreamIncompatible`
|
|
146
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
|
+
|
|
147
157
|
The minimal `camera_start_stream` call is `node_id`, `endpoint_id`, `stream_usage` and your SDP
|
|
148
158
|
offer: the server reuses or allocates the best stream the camera can serve that still fits what
|
|
149
159
|
the offer can decode, and adds audio when it can. Pass `video` / `audio` hints only to set hard bounds. A
|
|
@@ -109,9 +109,19 @@ Beyond the `python-matter-server` API, the client exposes commands the Matter.js
|
|
|
109
109
|
play your audio; without it the server makes the offer's audio sections not send, so a browser-style
|
|
110
110
|
`sendrecv` audio offer goes to the camera as `recvonly`. `camera_session_ended` and
|
|
111
111
|
`camera_stream_evicted` events arrive as `CameraSessionEndedData` / `CameraStreamEvictedData`;
|
|
112
|
-
`webrtc_callback` stays a dict.
|
|
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
|
|
113
114
|
details as attributes, e.g. `err.reason` and `err.bound` on `CameraStreamIncompatible`
|
|
114
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
|
+
|
|
115
125
|
The minimal `camera_start_stream` call is `node_id`, `endpoint_id`, `stream_usage` and your SDP
|
|
116
126
|
offer: the server reuses or allocates the best stream the camera can serve that still fits what
|
|
117
127
|
the offer can decode, and adds audio when it can. Pass `video` / `audio` hints only to set hard bounds. A
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"""AqaraLedStripT2Cluster cluster definition (auto-generated, DO NOT edit)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import typing
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from enum import IntFlag
|
|
8
|
+
|
|
9
|
+
from ... import ChipUtility
|
|
10
|
+
from ...clusters.enum import MatterIntEnum
|
|
11
|
+
from ...tlv import float32, uint
|
|
12
|
+
from ..ClusterObjects import (Cluster, ClusterAttributeDescriptor, ClusterCommand, ClusterEvent, ClusterObject,
|
|
13
|
+
ClusterObjectDescriptor, ClusterObjectFieldDescriptor)
|
|
14
|
+
from ..Types import Nullable, NullValue
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class AqaraLedStripT2Cluster(Cluster):
|
|
19
|
+
id: typing.ClassVar[int] = 0x115FFC0F
|
|
20
|
+
|
|
21
|
+
@ChipUtility.classproperty
|
|
22
|
+
def descriptor(cls) -> ClusterObjectDescriptor:
|
|
23
|
+
return ClusterObjectDescriptor(
|
|
24
|
+
Fields=[
|
|
25
|
+
ClusterObjectFieldDescriptor(Label="musicSyncEnabled", Tag=0x00000013, Type=typing.Optional[bool]),
|
|
26
|
+
ClusterObjectFieldDescriptor(Label="musicSyncEffect", Tag=0x00000015, Type=typing.Optional[uint]),
|
|
27
|
+
ClusterObjectFieldDescriptor(Label="musicSyncSensitivity", Tag=0x00000016, Type=typing.Optional[uint]),
|
|
28
|
+
ClusterObjectFieldDescriptor(Label="generatedCommandList", Tag=0x0000FFF8, Type=typing.List[uint]),
|
|
29
|
+
ClusterObjectFieldDescriptor(Label="acceptedCommandList", Tag=0x0000FFF9, Type=typing.List[uint]),
|
|
30
|
+
ClusterObjectFieldDescriptor(Label="attributeList", Tag=0x0000FFFB, Type=typing.List[uint]),
|
|
31
|
+
ClusterObjectFieldDescriptor(Label="featureMap", Tag=0x0000FFFC, Type=uint),
|
|
32
|
+
ClusterObjectFieldDescriptor(Label="clusterRevision", Tag=0x0000FFFD, Type=uint),
|
|
33
|
+
])
|
|
34
|
+
|
|
35
|
+
musicSyncEnabled: typing.Optional[bool] = None
|
|
36
|
+
musicSyncEffect: typing.Optional[uint] = None
|
|
37
|
+
musicSyncSensitivity: typing.Optional[uint] = None
|
|
38
|
+
generatedCommandList: typing.List[uint] = field(default_factory=lambda: [])
|
|
39
|
+
acceptedCommandList: typing.List[uint] = field(default_factory=lambda: [])
|
|
40
|
+
attributeList: typing.List[uint] = field(default_factory=lambda: [])
|
|
41
|
+
featureMap: uint = 0
|
|
42
|
+
clusterRevision: uint = 0
|
|
43
|
+
|
|
44
|
+
class Attributes:
|
|
45
|
+
@dataclass
|
|
46
|
+
class MusicSyncEnabled(ClusterAttributeDescriptor):
|
|
47
|
+
@ChipUtility.classproperty
|
|
48
|
+
def cluster_id(cls) -> int:
|
|
49
|
+
return 0x115FFC0F
|
|
50
|
+
|
|
51
|
+
@ChipUtility.classproperty
|
|
52
|
+
def attribute_id(cls) -> int:
|
|
53
|
+
return 0x00000013
|
|
54
|
+
|
|
55
|
+
@ChipUtility.classproperty
|
|
56
|
+
def attribute_type(cls) -> ClusterObjectFieldDescriptor:
|
|
57
|
+
return ClusterObjectFieldDescriptor(Type=typing.Optional[bool])
|
|
58
|
+
|
|
59
|
+
value: typing.Optional[bool] = None
|
|
60
|
+
|
|
61
|
+
@dataclass
|
|
62
|
+
class MusicSyncEffect(ClusterAttributeDescriptor):
|
|
63
|
+
@ChipUtility.classproperty
|
|
64
|
+
def cluster_id(cls) -> int:
|
|
65
|
+
return 0x115FFC0F
|
|
66
|
+
|
|
67
|
+
@ChipUtility.classproperty
|
|
68
|
+
def attribute_id(cls) -> int:
|
|
69
|
+
return 0x00000015
|
|
70
|
+
|
|
71
|
+
@ChipUtility.classproperty
|
|
72
|
+
def attribute_type(cls) -> ClusterObjectFieldDescriptor:
|
|
73
|
+
return ClusterObjectFieldDescriptor(Type=typing.Optional[uint])
|
|
74
|
+
|
|
75
|
+
value: typing.Optional[uint] = None
|
|
76
|
+
|
|
77
|
+
@dataclass
|
|
78
|
+
class MusicSyncSensitivity(ClusterAttributeDescriptor):
|
|
79
|
+
@ChipUtility.classproperty
|
|
80
|
+
def cluster_id(cls) -> int:
|
|
81
|
+
return 0x115FFC0F
|
|
82
|
+
|
|
83
|
+
@ChipUtility.classproperty
|
|
84
|
+
def attribute_id(cls) -> int:
|
|
85
|
+
return 0x00000016
|
|
86
|
+
|
|
87
|
+
@ChipUtility.classproperty
|
|
88
|
+
def attribute_type(cls) -> ClusterObjectFieldDescriptor:
|
|
89
|
+
return ClusterObjectFieldDescriptor(Type=typing.Optional[uint])
|
|
90
|
+
|
|
91
|
+
value: typing.Optional[uint] = None
|
|
92
|
+
|
|
93
|
+
@dataclass
|
|
94
|
+
class GeneratedCommandList(ClusterAttributeDescriptor):
|
|
95
|
+
@ChipUtility.classproperty
|
|
96
|
+
def cluster_id(cls) -> int:
|
|
97
|
+
return 0x115FFC0F
|
|
98
|
+
|
|
99
|
+
@ChipUtility.classproperty
|
|
100
|
+
def attribute_id(cls) -> int:
|
|
101
|
+
return 0x0000FFF8
|
|
102
|
+
|
|
103
|
+
@ChipUtility.classproperty
|
|
104
|
+
def attribute_type(cls) -> ClusterObjectFieldDescriptor:
|
|
105
|
+
return ClusterObjectFieldDescriptor(Type=typing.List[uint])
|
|
106
|
+
|
|
107
|
+
value: typing.List[uint] = field(default_factory=lambda: [])
|
|
108
|
+
|
|
109
|
+
@dataclass
|
|
110
|
+
class AcceptedCommandList(ClusterAttributeDescriptor):
|
|
111
|
+
@ChipUtility.classproperty
|
|
112
|
+
def cluster_id(cls) -> int:
|
|
113
|
+
return 0x115FFC0F
|
|
114
|
+
|
|
115
|
+
@ChipUtility.classproperty
|
|
116
|
+
def attribute_id(cls) -> int:
|
|
117
|
+
return 0x0000FFF9
|
|
118
|
+
|
|
119
|
+
@ChipUtility.classproperty
|
|
120
|
+
def attribute_type(cls) -> ClusterObjectFieldDescriptor:
|
|
121
|
+
return ClusterObjectFieldDescriptor(Type=typing.List[uint])
|
|
122
|
+
|
|
123
|
+
value: typing.List[uint] = field(default_factory=lambda: [])
|
|
124
|
+
|
|
125
|
+
@dataclass
|
|
126
|
+
class AttributeList(ClusterAttributeDescriptor):
|
|
127
|
+
@ChipUtility.classproperty
|
|
128
|
+
def cluster_id(cls) -> int:
|
|
129
|
+
return 0x115FFC0F
|
|
130
|
+
|
|
131
|
+
@ChipUtility.classproperty
|
|
132
|
+
def attribute_id(cls) -> int:
|
|
133
|
+
return 0x0000FFFB
|
|
134
|
+
|
|
135
|
+
@ChipUtility.classproperty
|
|
136
|
+
def attribute_type(cls) -> ClusterObjectFieldDescriptor:
|
|
137
|
+
return ClusterObjectFieldDescriptor(Type=typing.List[uint])
|
|
138
|
+
|
|
139
|
+
value: typing.List[uint] = field(default_factory=lambda: [])
|
|
140
|
+
|
|
141
|
+
@dataclass
|
|
142
|
+
class FeatureMap(ClusterAttributeDescriptor):
|
|
143
|
+
@ChipUtility.classproperty
|
|
144
|
+
def cluster_id(cls) -> int:
|
|
145
|
+
return 0x115FFC0F
|
|
146
|
+
|
|
147
|
+
@ChipUtility.classproperty
|
|
148
|
+
def attribute_id(cls) -> int:
|
|
149
|
+
return 0x0000FFFC
|
|
150
|
+
|
|
151
|
+
@ChipUtility.classproperty
|
|
152
|
+
def attribute_type(cls) -> ClusterObjectFieldDescriptor:
|
|
153
|
+
return ClusterObjectFieldDescriptor(Type=uint)
|
|
154
|
+
|
|
155
|
+
value: uint = 0
|
|
156
|
+
|
|
157
|
+
@dataclass
|
|
158
|
+
class ClusterRevision(ClusterAttributeDescriptor):
|
|
159
|
+
@ChipUtility.classproperty
|
|
160
|
+
def cluster_id(cls) -> int:
|
|
161
|
+
return 0x115FFC0F
|
|
162
|
+
|
|
163
|
+
@ChipUtility.classproperty
|
|
164
|
+
def attribute_id(cls) -> int:
|
|
165
|
+
return 0x0000FFFD
|
|
166
|
+
|
|
167
|
+
@ChipUtility.classproperty
|
|
168
|
+
def attribute_type(cls) -> ClusterObjectFieldDescriptor:
|
|
169
|
+
return ClusterObjectFieldDescriptor(Type=uint)
|
|
170
|
+
|
|
171
|
+
value: uint = 0
|
|
@@ -11,6 +11,7 @@ from .AmbientContextSensing import AmbientContextSensing
|
|
|
11
11
|
from .ApplicationBasic import ApplicationBasic
|
|
12
12
|
from .ApplicationLauncher import ApplicationLauncher
|
|
13
13
|
from .AqaraAmbientSensingConfigurationCluster import AqaraAmbientSensingConfigurationCluster
|
|
14
|
+
from .AqaraLedStripT2Cluster import AqaraLedStripT2Cluster
|
|
14
15
|
from .AqaraOccupantLocationCluster import AqaraOccupantLocationCluster
|
|
15
16
|
from .AqaraRadarSensingUnionCluster import AqaraRadarSensingUnionCluster
|
|
16
17
|
from .AudioOutput import AudioOutput
|
|
@@ -163,6 +164,7 @@ __all__ = [
|
|
|
163
164
|
"ApplicationBasic",
|
|
164
165
|
"ApplicationLauncher",
|
|
165
166
|
"AqaraAmbientSensingConfigurationCluster",
|
|
167
|
+
"AqaraLedStripT2Cluster",
|
|
166
168
|
"AqaraOccupantLocationCluster",
|
|
167
169
|
"AqaraRadarSensingUnionCluster",
|
|
168
170
|
"AudioOutput",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: matter-python-client
|
|
3
|
-
Version: 1.5.
|
|
3
|
+
Version: 1.5.1
|
|
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
|
|
@@ -141,9 +141,19 @@ Beyond the `python-matter-server` API, the client exposes commands the Matter.js
|
|
|
141
141
|
play your audio; without it the server makes the offer's audio sections not send, so a browser-style
|
|
142
142
|
`sendrecv` audio offer goes to the camera as `recvonly`. `camera_session_ended` and
|
|
143
143
|
`camera_stream_evicted` events arrive as `CameraSessionEndedData` / `CameraStreamEvictedData`;
|
|
144
|
-
`webrtc_callback` stays a dict.
|
|
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
|
|
145
146
|
details as attributes, e.g. `err.reason` and `err.bound` on `CameraStreamIncompatible`
|
|
146
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
|
+
|
|
147
157
|
The minimal `camera_start_stream` call is `node_id`, `endpoint_id`, `stream_usage` and your SDP
|
|
148
158
|
offer: the server reuses or allocates the best stream the camera can serve that still fits what
|
|
149
159
|
the offer can decode, and adds audio when it can. Pass `video` / `audio` hints only to set hard bounds. A
|
|
@@ -17,6 +17,7 @@ chip/clusters/cluster_defs/AmbientContextSensing.py
|
|
|
17
17
|
chip/clusters/cluster_defs/ApplicationBasic.py
|
|
18
18
|
chip/clusters/cluster_defs/ApplicationLauncher.py
|
|
19
19
|
chip/clusters/cluster_defs/AqaraAmbientSensingConfigurationCluster.py
|
|
20
|
+
chip/clusters/cluster_defs/AqaraLedStripT2Cluster.py
|
|
20
21
|
chip/clusters/cluster_defs/AqaraOccupantLocationCluster.py
|
|
21
22
|
chip/clusters/cluster_defs/AqaraRadarSensingUnionCluster.py
|
|
22
23
|
chip/clusters/cluster_defs/AudioOutput.py
|
|
@@ -31,6 +31,7 @@ from matter_server.common.models import (
|
|
|
31
31
|
CameraCapabilities,
|
|
32
32
|
CameraIceServer,
|
|
33
33
|
CameraResolutionHint,
|
|
34
|
+
CameraResolutionTarget,
|
|
34
35
|
CameraSessionEndedData,
|
|
35
36
|
CameraSnapshotResult,
|
|
36
37
|
CameraStartStreamResult,
|
|
@@ -116,6 +117,16 @@ NODE_SCOPED_CAMERA_EVENTS: Final = frozenset(
|
|
|
116
117
|
# pylint: disable=too-many-public-methods,too-many-locals,too-many-branches
|
|
117
118
|
|
|
118
119
|
|
|
120
|
+
def _session_reference(webrtc_session_id: int | None, client_session_key: str | None) -> dict[str, Any]:
|
|
121
|
+
"""Return the arguments naming a session; the server refuses both or neither with error 8."""
|
|
122
|
+
reference: dict[str, Any] = {}
|
|
123
|
+
if webrtc_session_id is not None:
|
|
124
|
+
reference["webrtc_session_id"] = webrtc_session_id
|
|
125
|
+
if client_session_key is not None:
|
|
126
|
+
reference["client_session_key"] = client_session_key
|
|
127
|
+
return reference
|
|
128
|
+
|
|
129
|
+
|
|
119
130
|
def _command_name(command: ClusterCommand) -> str:
|
|
120
131
|
"""Return the wire name of a command: the name of its class."""
|
|
121
132
|
return type(command).__name__
|
|
@@ -599,10 +610,20 @@ class MatterClient:
|
|
|
599
610
|
node_type = NodeType.END_DEVICE
|
|
600
611
|
elif network_type == NetworkType.WIFI:
|
|
601
612
|
node_type = NodeType.END_DEVICE
|
|
613
|
+
# NetworkID is an SSID only on a Wi-Fi instance; Thread uses the binary Extended PAN ID
|
|
614
|
+
network_commissioning_features = node.get_attribute_value(
|
|
615
|
+
0,
|
|
616
|
+
cluster=None,
|
|
617
|
+
attribute=Clusters.NetworkCommissioning.Attributes.FeatureMap,
|
|
618
|
+
)
|
|
619
|
+
network_id_is_ssid = network_type in (NetworkType.WIFI, NetworkType.UNKNOWN) and bool(
|
|
620
|
+
(network_commissioning_features or 0)
|
|
621
|
+
& Clusters.NetworkCommissioning.Bitmaps.Feature.kWiFiNetworkInterface
|
|
622
|
+
)
|
|
602
623
|
# use lastNetworkID from NetworkCommissioning cluster as fallback to get the network name
|
|
603
624
|
# this allows getting the SSID as the wifi diagnostics cluster only has the BSSID
|
|
604
625
|
last_network_id: bytes | str | None
|
|
605
|
-
if not network_name and (
|
|
626
|
+
if network_id_is_ssid and not network_name and (
|
|
606
627
|
last_network_id := node.get_attribute_value(
|
|
607
628
|
0,
|
|
608
629
|
cluster=None,
|
|
@@ -616,7 +637,7 @@ class MatterClient:
|
|
|
616
637
|
# last resort to get the (wifi) networkname;
|
|
617
638
|
# enumerate networks on the NetworkCommissioning cluster
|
|
618
639
|
networks: list[Clusters.NetworkCommissioning.Structs.NetworkInfoStruct]
|
|
619
|
-
if not network_name and (
|
|
640
|
+
if network_id_is_ssid and not network_name and (
|
|
620
641
|
networks := node.get_attribute_value(
|
|
621
642
|
0,
|
|
622
643
|
cluster=None,
|
|
@@ -1058,6 +1079,7 @@ class MatterClient:
|
|
|
1058
1079
|
metadata_enabled: bool | None = None,
|
|
1059
1080
|
allow_eviction: bool | None = None,
|
|
1060
1081
|
talkback: bool | None = None,
|
|
1082
|
+
client_session_key: str | None = None,
|
|
1061
1083
|
) -> CameraStartStreamResult:
|
|
1062
1084
|
"""Open a WebRTC session, allocating or reusing the streams it needs.
|
|
1063
1085
|
|
|
@@ -1065,9 +1087,15 @@ class MatterClient:
|
|
|
1065
1087
|
offer arrives as a ``webrtc_callback`` ``offer`` event. For ``video`` and ``audio``, ``None``
|
|
1066
1088
|
lets the server decide, a hints dict sets hard requirements, and ``False`` leaves the track
|
|
1067
1089
|
out. ``talkback=True`` (requires ``sdp``) forwards the offer unchanged so the camera can play
|
|
1068
|
-
the caller's audio; otherwise the server makes the offer's audio sections not send.
|
|
1069
|
-
|
|
1070
|
-
|
|
1090
|
+
the caller's audio; otherwise the server makes the offer's audio sections not send. A camera
|
|
1091
|
+
that answers ``sendrecv`` anyway gets its answer narrowed by the server to the directions the
|
|
1092
|
+
offer allows. Arguments left ``None`` are not sent.
|
|
1093
|
+
|
|
1094
|
+
``client_session_key`` (1 to 128 characters, unique among this connection's starting and open
|
|
1095
|
+
sessions) is the caller's own name for the session. Every ``webrtc_callback`` and
|
|
1096
|
+
``camera_session_ended`` event of the session carries it, so a handler can match events
|
|
1097
|
+
before this call returns. ``camera_provide_ice_candidates`` and ``camera_stop_stream`` accept
|
|
1098
|
+
it in place of the session id, also while this call is still running.
|
|
1071
1099
|
|
|
1072
1100
|
Requires schema 14.
|
|
1073
1101
|
"""
|
|
@@ -1080,6 +1108,7 @@ class MatterClient:
|
|
|
1080
1108
|
"metadata_enabled": metadata_enabled,
|
|
1081
1109
|
"allow_eviction": allow_eviction,
|
|
1082
1110
|
"talkback": talkback,
|
|
1111
|
+
"client_session_key": client_session_key,
|
|
1083
1112
|
}
|
|
1084
1113
|
data = await self.send_command(
|
|
1085
1114
|
APICommand.CAMERA_START_STREAM,
|
|
@@ -1109,12 +1138,18 @@ class MatterClient:
|
|
|
1109
1138
|
self,
|
|
1110
1139
|
node_id: int,
|
|
1111
1140
|
endpoint_id: int,
|
|
1112
|
-
webrtc_session_id: int,
|
|
1141
|
+
webrtc_session_id: int | None,
|
|
1113
1142
|
ice_candidates: Sequence[WebRTCIceCandidate | dict[str, Any]],
|
|
1143
|
+
*,
|
|
1144
|
+
client_session_key: str | None = None,
|
|
1114
1145
|
) -> None:
|
|
1115
|
-
"""Send one or more ICE candidates to
|
|
1146
|
+
"""Send one or more ICE candidates to a session.
|
|
1116
1147
|
|
|
1117
|
-
|
|
1148
|
+
Name the session by ``webrtc_session_id`` or by ``client_session_key`` (pass ``None`` for the
|
|
1149
|
+
id then), not both. With the key of a session whose ``camera_start_stream`` is still running,
|
|
1150
|
+
the server queues the candidates and this call returns once they were sent, after that
|
|
1151
|
+
response. A candidate from a ``webrtc_callback`` ``ice_candidates`` event can be passed
|
|
1152
|
+
unchanged.
|
|
1118
1153
|
|
|
1119
1154
|
Requires schema 14.
|
|
1120
1155
|
"""
|
|
@@ -1123,7 +1158,7 @@ class MatterClient:
|
|
|
1123
1158
|
require_schema=14,
|
|
1124
1159
|
node_id=node_id,
|
|
1125
1160
|
endpoint_id=endpoint_id,
|
|
1126
|
-
webrtc_session_id
|
|
1161
|
+
**_session_reference(webrtc_session_id, client_session_key),
|
|
1127
1162
|
ice_candidates=[
|
|
1128
1163
|
asdict(candidate) if isinstance(candidate, WebRTCIceCandidate) else candidate
|
|
1129
1164
|
for candidate in ice_candidates
|
|
@@ -1131,10 +1166,19 @@ class MatterClient:
|
|
|
1131
1166
|
)
|
|
1132
1167
|
|
|
1133
1168
|
async def camera_stop_stream(
|
|
1134
|
-
self,
|
|
1169
|
+
self,
|
|
1170
|
+
node_id: int,
|
|
1171
|
+
endpoint_id: int,
|
|
1172
|
+
webrtc_session_id: int | None = None,
|
|
1173
|
+
*,
|
|
1174
|
+
client_session_key: str | None = None,
|
|
1135
1175
|
) -> CameraStopStreamResult:
|
|
1136
1176
|
"""End a WebRTC session; the stream allocation is kept.
|
|
1137
1177
|
|
|
1178
|
+
Name the session by ``webrtc_session_id`` or by ``client_session_key``, not both. The key of a
|
|
1179
|
+
session whose ``camera_start_stream`` is still running cancels that start; ``ended`` then says
|
|
1180
|
+
whether the camera had opened a session that the server ended.
|
|
1181
|
+
|
|
1138
1182
|
Requires schema 14.
|
|
1139
1183
|
"""
|
|
1140
1184
|
data = await self.send_command(
|
|
@@ -1142,7 +1186,7 @@ class MatterClient:
|
|
|
1142
1186
|
require_schema=14,
|
|
1143
1187
|
node_id=node_id,
|
|
1144
1188
|
endpoint_id=endpoint_id,
|
|
1145
|
-
webrtc_session_id
|
|
1189
|
+
**_session_reference(webrtc_session_id, client_session_key),
|
|
1146
1190
|
)
|
|
1147
1191
|
return dataclass_from_dict(CameraStopStreamResult, data)
|
|
1148
1192
|
|
|
@@ -1154,15 +1198,22 @@ class MatterClient:
|
|
|
1154
1198
|
codec: str | None = None,
|
|
1155
1199
|
watermark_enabled: bool | None = None,
|
|
1156
1200
|
osd_enabled: bool | None = None,
|
|
1201
|
+
resolution: CameraResolutionTarget | None = None,
|
|
1157
1202
|
) -> CameraSnapshotResult:
|
|
1158
1203
|
"""Capture one image. An argument left ``None`` is not sent.
|
|
1159
1204
|
|
|
1205
|
+
``resolution`` is the size you want, such as a thumbnail's: ``{"width": 320}``,
|
|
1206
|
+
``{"height": 240}`` or both. The server uses the smallest capability that reaches it
|
|
1207
|
+
(within ``max_resolution``) and asks the camera to scale to it. The camera may return
|
|
1208
|
+
a larger frame, so check the result's ``resolution``.
|
|
1209
|
+
|
|
1160
1210
|
The snapshot stream stays allocated; free it with ``camera_release_stream``.
|
|
1161
1211
|
|
|
1162
1212
|
Requires schema 14.
|
|
1163
1213
|
"""
|
|
1164
1214
|
optional = {
|
|
1165
1215
|
"max_resolution": max_resolution,
|
|
1216
|
+
"resolution": resolution,
|
|
1166
1217
|
"codec": codec,
|
|
1167
1218
|
"watermark_enabled": watermark_enabled,
|
|
1168
1219
|
"osd_enabled": osd_enabled,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Custom (vendor-specific) cluster re-exports (auto-generated, DO NOT edit)."""
|
|
2
2
|
|
|
3
3
|
from chip.clusters.cluster_defs.AqaraAmbientSensingConfigurationCluster import AqaraAmbientSensingConfigurationCluster
|
|
4
|
+
from chip.clusters.cluster_defs.AqaraLedStripT2Cluster import AqaraLedStripT2Cluster
|
|
4
5
|
from chip.clusters.cluster_defs.AqaraOccupantLocationCluster import AqaraOccupantLocationCluster
|
|
5
6
|
from chip.clusters.cluster_defs.AqaraRadarSensingUnionCluster import AqaraRadarSensingUnionCluster
|
|
6
7
|
from chip.clusters.cluster_defs.DraftElectricalMeasurementCluster import DraftElectricalMeasurementCluster
|
|
@@ -16,6 +17,7 @@ from chip.clusters.cluster_defs.WagoCluster import WagoCluster
|
|
|
16
17
|
|
|
17
18
|
ALL_CUSTOM_CLUSTERS: dict = {
|
|
18
19
|
AqaraAmbientSensingConfigurationCluster.id: AqaraAmbientSensingConfigurationCluster,
|
|
20
|
+
AqaraLedStripT2Cluster.id: AqaraLedStripT2Cluster,
|
|
19
21
|
AqaraOccupantLocationCluster.id: AqaraOccupantLocationCluster,
|
|
20
22
|
AqaraRadarSensingUnionCluster.id: AqaraRadarSensingUnionCluster,
|
|
21
23
|
DraftElectricalMeasurementCluster.id: DraftElectricalMeasurementCluster,
|
|
@@ -33,6 +35,7 @@ ALL_CUSTOM_CLUSTERS: dict = {
|
|
|
33
35
|
__all__ = [
|
|
34
36
|
"ALL_CUSTOM_CLUSTERS",
|
|
35
37
|
"AqaraAmbientSensingConfigurationCluster",
|
|
38
|
+
"AqaraLedStripT2Cluster",
|
|
36
39
|
"AqaraOccupantLocationCluster",
|
|
37
40
|
"AqaraRadarSensingUnionCluster",
|
|
38
41
|
"DraftElectricalMeasurementCluster",
|
|
@@ -163,6 +163,7 @@ class WebRTCCallbackData:
|
|
|
163
163
|
- "answer": {"sdp": str}
|
|
164
164
|
- "ice_candidates": {"ice_candidates": list[WebRTCIceCandidate]}
|
|
165
165
|
- "end": {"reason": int}
|
|
166
|
+
`client_session_key` is the key the session was started with, absent when it had none.
|
|
166
167
|
"""
|
|
167
168
|
|
|
168
169
|
event_type: str
|
|
@@ -171,6 +172,7 @@ class WebRTCCallbackData:
|
|
|
171
172
|
endpoint_id: int
|
|
172
173
|
fabric_index: int
|
|
173
174
|
data: dict | None
|
|
175
|
+
client_session_key: str | None = None
|
|
174
176
|
|
|
175
177
|
|
|
176
178
|
@dataclass
|
|
@@ -458,6 +460,13 @@ class CameraResolutionHint(TypedDict):
|
|
|
458
460
|
height: int
|
|
459
461
|
|
|
460
462
|
|
|
463
|
+
class CameraResolutionTarget(TypedDict, total=False):
|
|
464
|
+
"""The size `camera_snapshot` should aim for. State `width`, `height` or both; at least one."""
|
|
465
|
+
|
|
466
|
+
width: int
|
|
467
|
+
height: int
|
|
468
|
+
|
|
469
|
+
|
|
461
470
|
class CameraVideoHints(TypedDict, total=False):
|
|
462
471
|
"""Video hints for `camera_start_stream`; every key set is a hard requirement."""
|
|
463
472
|
|
|
@@ -775,11 +784,19 @@ class CameraSnapshotResult:
|
|
|
775
784
|
|
|
776
785
|
@dataclass
|
|
777
786
|
class CameraSessionEndedData:
|
|
778
|
-
"""Payload of the `camera_session_ended` event.
|
|
787
|
+
"""Payload of the `camera_session_ended` event.
|
|
788
|
+
|
|
789
|
+
`cause` is `peer`, `other_connection`, `camera_restarted`, `camera_dropped` or `node_removed`.
|
|
790
|
+
`reason` is the camera's WebRTCEndReasonEnum value, sent with `cause` `peer` when the camera stated one.
|
|
791
|
+
`client_session_key` is the key the session was started with, absent when it had none.
|
|
792
|
+
"""
|
|
779
793
|
|
|
780
794
|
node_id: int
|
|
781
795
|
endpoint_id: int
|
|
782
796
|
webrtc_session_id: int
|
|
797
|
+
cause: str
|
|
798
|
+
reason: int | None = None
|
|
799
|
+
client_session_key: str | None = None
|
|
783
800
|
|
|
784
801
|
|
|
785
802
|
@dataclass
|
{matter_python_client-1.5.0a0.dev202610200302 → matter_python_client-1.5.1}/tests/test_camera.py
RENAMED
|
@@ -393,6 +393,23 @@ async def test_snapshot_sends_stated_arguments_and_parses_the_result() -> None:
|
|
|
393
393
|
)
|
|
394
394
|
|
|
395
395
|
|
|
396
|
+
async def test_snapshot_sends_a_width_only_resolution_target() -> None:
|
|
397
|
+
client = _bare_client(
|
|
398
|
+
{
|
|
399
|
+
"data": "",
|
|
400
|
+
"codec": "JPEG",
|
|
401
|
+
"resolution": _RESOLUTION,
|
|
402
|
+
"degraded": False,
|
|
403
|
+
"stream_id": 4,
|
|
404
|
+
"provenance": "allocated",
|
|
405
|
+
}
|
|
406
|
+
)
|
|
407
|
+
await client.camera_snapshot(5, 1, resolution={"width": 320})
|
|
408
|
+
_, kwargs = _sent(client)
|
|
409
|
+
assert kwargs["resolution"] == {"width": 320}
|
|
410
|
+
assert "max_resolution" not in kwargs
|
|
411
|
+
|
|
412
|
+
|
|
396
413
|
async def test_snapshot_sends_overlay_flags_including_false() -> None:
|
|
397
414
|
client = _bare_client(
|
|
398
415
|
{
|
|
@@ -419,6 +436,35 @@ async def test_stop_stream_parses_ended() -> None:
|
|
|
419
436
|
assert kwargs["webrtc_session_id"] == 9
|
|
420
437
|
|
|
421
438
|
|
|
439
|
+
async def test_stop_stream_by_key_sends_the_key_and_no_id() -> None:
|
|
440
|
+
client = _bare_client({"ended": True})
|
|
441
|
+
assert await client.camera_stop_stream(5, 1, client_session_key="k1") == CameraStopStreamResult(ended=True)
|
|
442
|
+
_, kwargs = _sent(client)
|
|
443
|
+
assert kwargs["client_session_key"] == "k1"
|
|
444
|
+
assert "webrtc_session_id" not in kwargs
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
async def test_provide_ice_candidates_by_key_sends_the_key_and_no_id() -> None:
|
|
448
|
+
client = _bare_client()
|
|
449
|
+
await client.camera_provide_ice_candidates(5, 1, None, [{"candidate": "c"}], client_session_key="k1")
|
|
450
|
+
_, kwargs = _sent(client)
|
|
451
|
+
assert kwargs["client_session_key"] == "k1"
|
|
452
|
+
assert "webrtc_session_id" not in kwargs
|
|
453
|
+
assert kwargs["ice_candidates"] == [{"candidate": "c"}]
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
async def test_start_stream_sends_the_key_only_when_given() -> None:
|
|
457
|
+
client = _bare_client(
|
|
458
|
+
{"webrtc_session_id": 9, "mode": "provide_offer", "video": None, "audio": None, "talkback": False}
|
|
459
|
+
)
|
|
460
|
+
await client.camera_start_stream(5, 1, "LiveView", client_session_key="k1")
|
|
461
|
+
_, kwargs = _sent(client)
|
|
462
|
+
assert kwargs["client_session_key"] == "k1"
|
|
463
|
+
await client.camera_start_stream(5, 1, "LiveView")
|
|
464
|
+
_, kwargs = _sent(client)
|
|
465
|
+
assert "client_session_key" not in kwargs
|
|
466
|
+
|
|
467
|
+
|
|
422
468
|
async def test_provide_answer_sends_session_and_sdp() -> None:
|
|
423
469
|
client = _bare_client()
|
|
424
470
|
await client.camera_provide_answer(5, 1, 9, "v=0")
|