matter-python-client 1.3.2a0.dev20260727__tar.gz → 1.4.0a0.dev20260731__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.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/PKG-INFO +1 -1
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_python_client.egg-info/PKG-INFO +1 -1
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_python_client.egg-info/SOURCES.txt +1 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/client/client.py +25 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/common/models.py +74 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/pyproject.toml +1 -1
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/tests/test_integration.py +2 -2
- matter_python_client-1.4.0a0.dev20260731/tests/test_network_topology.py +194 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/README.md +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/ChipUtility.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/__init__.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/ClusterObjects.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/Objects.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/Types.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/__init__.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/AccessControl.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/AccountLogin.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/Actions.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ActivatedCarbonFilterMonitoring.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/AdministratorCommissioning.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/AirQuality.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/AmbientContextSensing.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ApplicationBasic.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ApplicationLauncher.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/AudioOutput.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/BasicInformation.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/Binding.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/BooleanState.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/BooleanStateConfiguration.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/BridgedDeviceBasicInformation.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/CameraAvSettingsUserLevelManagement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/CameraAvStreamManagement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/CarbonDioxideConcentrationMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/CarbonMonoxideConcentrationMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/Channel.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/Chime.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ClosureControl.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ClosureDimension.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ColorControl.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/CommissionerControl.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/CommodityMetering.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/CommodityPrice.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/CommodityTariff.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ContentAppObserver.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ContentControl.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ContentLauncher.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/Descriptor.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/DeviceEnergyManagement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/DeviceEnergyManagementMode.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/DiagnosticLogs.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/DishwasherAlarm.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/DishwasherMode.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/DoorLock.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/DraftElectricalMeasurementCluster.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/EcosystemInformation.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ElectricalEnergyMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ElectricalGridConditions.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ElectricalPowerMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/EnergyEvse.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/EnergyEvseMode.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/EnergyPreference.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/EthernetNetworkDiagnostics.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/EveCluster.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/FanControl.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/FixedLabel.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/FlowMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/FormaldehydeConcentrationMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/GeneralCommissioning.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/GeneralDiagnostics.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/Globals.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/GroupKeyManagement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/Groupcast.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/Groups.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/HeimanCluster.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/HepaFilterMonitoring.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/IcdManagement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/Identify.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/IlluminanceMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/InovelliCluster.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/JointFabricAdministrator.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/JointFabricDatastore.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/KeypadInput.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/LaundryDryerControls.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/LaundryWasherControls.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/LaundryWasherMode.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/LevelControl.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/LocalizationConfiguration.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/LowPower.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/MediaInput.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/MediaPlayback.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/Messages.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/MeterIdentification.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/MicrowaveOvenControl.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/MicrowaveOvenMode.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ModeSelect.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/NeoCluster.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/NetworkCommissioning.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/NitrogenDioxideConcentrationMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/OccupancySensing.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/OnOff.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/OperationalCredentials.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/OperationalState.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/OtaSoftwareUpdateProvider.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/OtaSoftwareUpdateRequestor.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/OvenCavityOperationalState.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/OvenMode.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/OzoneConcentrationMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/Pm10ConcentrationMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/Pm1ConcentrationMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/Pm25ConcentrationMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/PowerSource.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/PowerSourceConfiguration.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/PowerTopology.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/PressureMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/PumpConfigurationAndControl.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/PushAvStreamTransport.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/RadonConcentrationMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/RefrigeratorAlarm.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/RefrigeratorAndTemperatureControlledCabinetMode.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/RelativeHumidityMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/RvcCleanMode.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/RvcOperationalState.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/RvcRunMode.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ScenesManagement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ServiceArea.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/SmokeCoAlarm.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/SoftwareDiagnostics.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/SoilMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/Switch.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/TargetNavigator.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/TclDehumidifierCluster.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/TemperatureAlarm.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/TemperatureControl.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/TemperatureMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/Thermostat.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ThermostatUserInterfaceConfiguration.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ThirdRealityMeteringCluster.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ThreadBorderRouterManagement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ThreadNetworkDiagnostics.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ThreadNetworkDirectory.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/TimeFormatLocalization.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/TimeSynchronization.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/TlsCertificateManagement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/TlsClientManagement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/TotalVolatileOrganicCompoundsConcentrationMeasurement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/UnitLocalization.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/UserLabel.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ValveConfigurationAndControl.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/WakeOnLan.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/WaterHeaterManagement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/WaterHeaterMode.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/WaterTankLevelMonitoring.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/WebRtcTransportDefinitions.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/WebRtcTransportProvider.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/WebRtcTransportRequestor.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/WiFiNetworkDiagnostics.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/WiFiNetworkManagement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/WindowCovering.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/ZoneManagement.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/cluster_defs/__init__.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/clusters/enum.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/tlv/__init__.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/chip/tlv/tlvlist.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_python_client.egg-info/dependency_links.txt +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_python_client.egg-info/not-zip-safe +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_python_client.egg-info/requires.txt +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_python_client.egg-info/top_level.txt +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/__init__.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/client/__init__.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/client/connection.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/client/exceptions.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/client/models/__init__.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/client/models/device_types.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/client/models/node.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/common/__init__.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/common/const.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/common/custom_clusters.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/common/errors.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/common/helpers/__init__.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/common/helpers/api.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/common/helpers/json.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/common/helpers/util.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/matter_server/py.typed +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/setup.cfg +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/tests/test_client_integration.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/tests/test_credentials.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/tests/test_event_dispatch.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/tests/test_icd.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/tests/test_imports.py +0 -0
- {matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/tests/test_webrtc_protocol.py +0 -0
|
@@ -30,6 +30,7 @@ from matter_server.common.models import (
|
|
|
30
30
|
MatterNodeEvent,
|
|
31
31
|
MatterSoftwareVersion,
|
|
32
32
|
MessageType,
|
|
33
|
+
NetworkTopology,
|
|
33
34
|
NodePingResult,
|
|
34
35
|
ResultMessageBase,
|
|
35
36
|
ServerDiagnostics,
|
|
@@ -308,6 +309,26 @@ class MatterClient:
|
|
|
308
309
|
"""
|
|
309
310
|
await self.send_command(APICommand.RESYNC_ICD, require_schema=12, node_id=node_id)
|
|
310
311
|
|
|
312
|
+
async def get_network_topology(self, refresh: bool = False) -> NetworkTopology:
|
|
313
|
+
"""Return the derived network topology graph (Thread mesh + Wi-Fi).
|
|
314
|
+
|
|
315
|
+
Issuing this command also subscribes the connection to
|
|
316
|
+
EventType.NETWORK_TOPOLOGY_UPDATED pushes. With refresh=True the server
|
|
317
|
+
re-reads the Thread/Wi-Fi diagnostics from every online node before
|
|
318
|
+
building the snapshot (slower - seconds); otherwise it builds from the
|
|
319
|
+
current attribute cache.
|
|
320
|
+
|
|
321
|
+
refresh=True costs real radio traffic on every online node, so it is a
|
|
322
|
+
user-initiated action - never poll it. The push event is the intended
|
|
323
|
+
source for keeping a graph current.
|
|
324
|
+
|
|
325
|
+
Requires schema 13 (OHF Matter Server).
|
|
326
|
+
"""
|
|
327
|
+
data = await self.send_command(
|
|
328
|
+
APICommand.GET_NETWORK_TOPOLOGY, require_schema=13, refresh=refresh
|
|
329
|
+
)
|
|
330
|
+
return dataclass_from_dict(NetworkTopology, data)
|
|
331
|
+
|
|
311
332
|
async def open_commissioning_window(
|
|
312
333
|
self,
|
|
313
334
|
node_id: int,
|
|
@@ -869,6 +890,10 @@ class MatterClient:
|
|
|
869
890
|
node_id=node_event.node_id,
|
|
870
891
|
)
|
|
871
892
|
return
|
|
893
|
+
if msg.event == EventType.NETWORK_TOPOLOGY_UPDATED:
|
|
894
|
+
topology = dataclass_from_dict(NetworkTopology, msg.data)
|
|
895
|
+
self._signal_event(EventType.NETWORK_TOPOLOGY_UPDATED, data=topology)
|
|
896
|
+
return
|
|
872
897
|
# An event type unknown to this (older) client is passed through by parse_value as a raw
|
|
873
898
|
# string; forwarding it would crash on `event.value` in _signal_event. Drop it instead so a
|
|
874
899
|
# newer server emitting a new event type can never disconnect the client.
|
|
@@ -25,6 +25,7 @@ class EventType(Enum):
|
|
|
25
25
|
ENDPOINT_REMOVED = "endpoint_removed"
|
|
26
26
|
WEBRTC_CALLBACK = "webrtc_callback"
|
|
27
27
|
THREAD_DIAGNOSTICS_UPDATED = "thread_diagnostics_updated" # schema 12+
|
|
28
|
+
NETWORK_TOPOLOGY_UPDATED = "network_topology_updated" # schema 13+
|
|
28
29
|
|
|
29
30
|
|
|
30
31
|
class APICommand(str, Enum):
|
|
@@ -66,6 +67,7 @@ class APICommand(str, Enum):
|
|
|
66
67
|
REGISTER_ICD = "register_icd"
|
|
67
68
|
RESYNC_ICD = "resync_icd"
|
|
68
69
|
UNREGISTER_ICD = "unregister_icd"
|
|
70
|
+
GET_NETWORK_TOPOLOGY = "get_network_topology"
|
|
69
71
|
|
|
70
72
|
|
|
71
73
|
EventCallBackType = Callable[[EventType, Any], None]
|
|
@@ -270,6 +272,78 @@ class IcdStateData:
|
|
|
270
272
|
next_expected_checkin: int | None
|
|
271
273
|
|
|
272
274
|
|
|
275
|
+
@dataclass
|
|
276
|
+
class TopologyDirectionInfo:
|
|
277
|
+
"""One direction's observed link quality on a topology connection.
|
|
278
|
+
|
|
279
|
+
Note: Only available with OHF Matter Server (schema 13+).
|
|
280
|
+
"""
|
|
281
|
+
|
|
282
|
+
strength: str
|
|
283
|
+
lqi: int | None = None
|
|
284
|
+
rssi: int | None = None
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
@dataclass
|
|
288
|
+
class NetworkTopologyNode:
|
|
289
|
+
"""A node in the network topology graph.
|
|
290
|
+
|
|
291
|
+
`kind`/`role` values are open string sets so a newer server can
|
|
292
|
+
introduce values without breaking older clients.
|
|
293
|
+
Note: Only available with OHF Matter Server (schema 13+).
|
|
294
|
+
"""
|
|
295
|
+
|
|
296
|
+
# pylint: disable=too-many-instance-attributes
|
|
297
|
+
|
|
298
|
+
id: str
|
|
299
|
+
kind: str # matter | border_router | thread_unknown | wifi_ap
|
|
300
|
+
network_type: str # thread | wifi | ethernet | unknown
|
|
301
|
+
node_id: int | None = None
|
|
302
|
+
role: str | None = None
|
|
303
|
+
available: bool | None = None
|
|
304
|
+
is_bridge: bool | None = None
|
|
305
|
+
ext_address: str | None = None
|
|
306
|
+
rloc16: int | None = None
|
|
307
|
+
ext_pan_id: str | None = None
|
|
308
|
+
network_name: str | None = None
|
|
309
|
+
vendor_name: str | None = None
|
|
310
|
+
model_name: str | None = None
|
|
311
|
+
last_seen: int | None = None
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
@dataclass
|
|
315
|
+
class NetworkTopologyConnection:
|
|
316
|
+
"""An edge between two topology nodes.
|
|
317
|
+
|
|
318
|
+
Thread links may be asymmetric: `source_to_target`/`target_to_source` carry
|
|
319
|
+
each observed direction; the top-level `strength` is the strongest of them.
|
|
320
|
+
Note: Only available with OHF Matter Server (schema 13+).
|
|
321
|
+
"""
|
|
322
|
+
|
|
323
|
+
source: str
|
|
324
|
+
target: str
|
|
325
|
+
network: str # thread | wifi
|
|
326
|
+
strength: str # strong | medium | weak | none
|
|
327
|
+
source_to_target: TopologyDirectionInfo | None = None
|
|
328
|
+
target_to_source: TopologyDirectionInfo | None = None
|
|
329
|
+
via_route_table: bool | None = None
|
|
330
|
+
path_cost: int | None = None
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
@dataclass
|
|
334
|
+
class NetworkTopology:
|
|
335
|
+
"""Snapshot of the Matter network topology (Thread mesh + Wi-Fi).
|
|
336
|
+
|
|
337
|
+
Returned by the 'get_network_topology' command and pushed via the
|
|
338
|
+
'network_topology_updated' event.
|
|
339
|
+
Note: Only available with OHF Matter Server (schema 13+).
|
|
340
|
+
"""
|
|
341
|
+
|
|
342
|
+
collected_at: int
|
|
343
|
+
nodes: list[NetworkTopologyNode]
|
|
344
|
+
connections: list[NetworkTopologyConnection]
|
|
345
|
+
|
|
346
|
+
|
|
273
347
|
class UpdateSource(Enum):
|
|
274
348
|
"""Enum with possible sources for a software update."""
|
|
275
349
|
|
{matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/pyproject.toml
RENAMED
|
@@ -25,7 +25,7 @@ license = "Apache-2.0"
|
|
|
25
25
|
name = "matter-python-client"
|
|
26
26
|
readme = "README.md"
|
|
27
27
|
requires-python = ">=3.12"
|
|
28
|
-
version = "1.
|
|
28
|
+
version = "1.4.0a0.dev20260731"
|
|
29
29
|
|
|
30
30
|
[project.urls]
|
|
31
31
|
Homepage = "https://github.com/matter-js/matterjs-server"
|
|
@@ -162,7 +162,7 @@ class TestServerCommands:
|
|
|
162
162
|
|
|
163
163
|
assert "fabric_id" in info
|
|
164
164
|
assert "compressed_fabric_id" in info
|
|
165
|
-
assert info["schema_version"] ==
|
|
165
|
+
assert info["schema_version"] == 13
|
|
166
166
|
assert info["min_supported_schema_version"] == 11
|
|
167
167
|
assert "matter-server" in info["sdk_version"]
|
|
168
168
|
assert "matter.js" in info["sdk_version"]
|
|
@@ -207,7 +207,7 @@ class TestServerCommands:
|
|
|
207
207
|
client: MatterTestClient = env["client"]
|
|
208
208
|
diag = await client.get_diagnostics()
|
|
209
209
|
assert diag.info is not None
|
|
210
|
-
assert diag.info.schema_version ==
|
|
210
|
+
assert diag.info.schema_version == 13
|
|
211
211
|
assert isinstance(diag.nodes, list)
|
|
212
212
|
assert isinstance(diag.events, list)
|
|
213
213
|
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"""Unit tests for the network topology command, schema gating, and event parsing."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from unittest.mock import AsyncMock, MagicMock
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
|
|
9
|
+
from matter_server.client import MatterClient
|
|
10
|
+
from matter_server.client.exceptions import ServerVersionTooOld
|
|
11
|
+
from matter_server.common.models import (
|
|
12
|
+
APICommand,
|
|
13
|
+
EventMessage,
|
|
14
|
+
EventType,
|
|
15
|
+
NetworkTopology,
|
|
16
|
+
NetworkTopologyConnection,
|
|
17
|
+
NetworkTopologyNode,
|
|
18
|
+
ServerInfoMessage,
|
|
19
|
+
TopologyDirectionInfo,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _bare_client() -> MatterClient:
|
|
24
|
+
"""Construct a MatterClient without connecting (for monkeypatching send_command)."""
|
|
25
|
+
return MatterClient.__new__(MatterClient)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _gated_client(schema_version: int) -> MatterClient:
|
|
29
|
+
"""Construct a MatterClient with a stub connection that reports a given schema version."""
|
|
30
|
+
client = MatterClient.__new__(MatterClient)
|
|
31
|
+
server_info = ServerInfoMessage(
|
|
32
|
+
fabric_id=1,
|
|
33
|
+
compressed_fabric_id=1,
|
|
34
|
+
schema_version=schema_version,
|
|
35
|
+
min_supported_schema_version=1,
|
|
36
|
+
sdk_version="0.0.0",
|
|
37
|
+
wifi_credentials_set=False,
|
|
38
|
+
thread_credentials_set=False,
|
|
39
|
+
bluetooth_enabled=False,
|
|
40
|
+
)
|
|
41
|
+
connection = MagicMock()
|
|
42
|
+
connection.connected = True
|
|
43
|
+
connection.server_info = server_info
|
|
44
|
+
client.connection = connection
|
|
45
|
+
return client
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
_WIRE_TOPOLOGY = {
|
|
49
|
+
"collected_at": 1767888000000,
|
|
50
|
+
"nodes": [
|
|
51
|
+
{
|
|
52
|
+
"id": "1",
|
|
53
|
+
"kind": "matter",
|
|
54
|
+
"network_type": "thread",
|
|
55
|
+
"node_id": 1,
|
|
56
|
+
"role": "leader",
|
|
57
|
+
"available": True,
|
|
58
|
+
"ext_address": "AABBCCDDEEFF0001",
|
|
59
|
+
"rloc16": 1024,
|
|
60
|
+
"ext_pan_id": "1122334455667788",
|
|
61
|
+
"network_name": "OpenThread",
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"id": "br_1122AABBCC334455",
|
|
65
|
+
"kind": "border_router",
|
|
66
|
+
"network_type": "thread",
|
|
67
|
+
"role": "router",
|
|
68
|
+
"ext_address": "1122AABBCC334455",
|
|
69
|
+
"vendor_name": "Apple",
|
|
70
|
+
"last_seen": 1767887990000,
|
|
71
|
+
},
|
|
72
|
+
{"id": "5", "kind": "matter", "network_type": "wifi", "node_id": 5, "role": "station"},
|
|
73
|
+
{"id": "ap_112233445566", "kind": "wifi_ap", "network_type": "wifi", "role": "ap"},
|
|
74
|
+
],
|
|
75
|
+
"connections": [
|
|
76
|
+
{
|
|
77
|
+
"source": "1",
|
|
78
|
+
"target": "br_1122AABBCC334455",
|
|
79
|
+
"network": "thread",
|
|
80
|
+
"strength": "medium",
|
|
81
|
+
"source_to_target": {"strength": "medium", "lqi": 2, "rssi": -70},
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"source": "5",
|
|
85
|
+
"target": "ap_112233445566",
|
|
86
|
+
"network": "wifi",
|
|
87
|
+
"strength": "strong",
|
|
88
|
+
"source_to_target": {"strength": "strong", "rssi": -55},
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
async def test_get_network_topology_uses_schema_13() -> None:
|
|
95
|
+
c = _bare_client()
|
|
96
|
+
c.send_command = AsyncMock(return_value=_WIRE_TOPOLOGY)
|
|
97
|
+
result = await c.get_network_topology()
|
|
98
|
+
args, kwargs = c.send_command.call_args
|
|
99
|
+
assert args[0] == APICommand.GET_NETWORK_TOPOLOGY
|
|
100
|
+
assert kwargs.get("require_schema") == 13
|
|
101
|
+
assert kwargs.get("refresh") is False
|
|
102
|
+
|
|
103
|
+
assert isinstance(result, NetworkTopology)
|
|
104
|
+
assert result.collected_at == 1767888000000
|
|
105
|
+
assert [n.id for n in result.nodes] == ["1", "br_1122AABBCC334455", "5", "ap_112233445566"]
|
|
106
|
+
node1 = result.nodes[0]
|
|
107
|
+
assert node1 == NetworkTopologyNode(
|
|
108
|
+
id="1",
|
|
109
|
+
kind="matter",
|
|
110
|
+
network_type="thread",
|
|
111
|
+
node_id=1,
|
|
112
|
+
role="leader",
|
|
113
|
+
available=True,
|
|
114
|
+
ext_address="AABBCCDDEEFF0001",
|
|
115
|
+
rloc16=1024,
|
|
116
|
+
ext_pan_id="1122334455667788",
|
|
117
|
+
network_name="OpenThread",
|
|
118
|
+
)
|
|
119
|
+
thread_link = result.connections[0]
|
|
120
|
+
assert thread_link == NetworkTopologyConnection(
|
|
121
|
+
source="1",
|
|
122
|
+
target="br_1122AABBCC334455",
|
|
123
|
+
network="thread",
|
|
124
|
+
strength="medium",
|
|
125
|
+
source_to_target=TopologyDirectionInfo(strength="medium", lqi=2, rssi=-70),
|
|
126
|
+
)
|
|
127
|
+
assert thread_link.target_to_source is None
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
async def test_get_network_topology_refresh_passthrough() -> None:
|
|
131
|
+
c = _bare_client()
|
|
132
|
+
c.send_command = AsyncMock(return_value=_WIRE_TOPOLOGY)
|
|
133
|
+
await c.get_network_topology(refresh=True)
|
|
134
|
+
_, kwargs = c.send_command.call_args
|
|
135
|
+
assert kwargs.get("refresh") is True
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def test_get_network_topology_rejected_on_schema_12() -> None:
|
|
139
|
+
"""Prove require_schema=13 actually enforces the gate against a schema-12 server."""
|
|
140
|
+
c = _gated_client(schema_version=12)
|
|
141
|
+
with pytest.raises(ServerVersionTooOld):
|
|
142
|
+
c._prepare_message(APICommand.GET_NETWORK_TOPOLOGY, require_schema=13, refresh=False)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
async def test_wire_dict_with_unknown_keys_and_values_parses() -> None:
|
|
146
|
+
"""A newer server's extra fields and new kind/role/strength values must not break parsing."""
|
|
147
|
+
wire = {
|
|
148
|
+
"collected_at": 1,
|
|
149
|
+
"future_field": "ignored",
|
|
150
|
+
"nodes": [
|
|
151
|
+
{
|
|
152
|
+
"id": "x",
|
|
153
|
+
"kind": "quantum_relay", # unknown future kind
|
|
154
|
+
"network_type": "thread",
|
|
155
|
+
"role": "overlord", # unknown future role
|
|
156
|
+
"another_future_field": {"nested": True},
|
|
157
|
+
}
|
|
158
|
+
],
|
|
159
|
+
"connections": [
|
|
160
|
+
{
|
|
161
|
+
"source": "x",
|
|
162
|
+
"target": "y",
|
|
163
|
+
"network": "thread",
|
|
164
|
+
"strength": "superb", # unknown future strength
|
|
165
|
+
"future_metric": 42,
|
|
166
|
+
}
|
|
167
|
+
],
|
|
168
|
+
}
|
|
169
|
+
c = _bare_client()
|
|
170
|
+
c.send_command = AsyncMock(return_value=wire)
|
|
171
|
+
result = await c.get_network_topology()
|
|
172
|
+
assert result.nodes[0].kind == "quantum_relay"
|
|
173
|
+
assert result.nodes[0].role == "overlord"
|
|
174
|
+
assert result.nodes[0].node_id is None
|
|
175
|
+
assert result.connections[0].strength == "superb"
|
|
176
|
+
assert result.connections[0].source_to_target is None
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def test_network_topology_updated_event_parses_typed() -> None:
|
|
180
|
+
"""The event payload reaches subscribers as a parsed NetworkTopology."""
|
|
181
|
+
client = MatterClient("ws://localhost:5580/ws", MagicMock())
|
|
182
|
+
received: list[tuple[object, object]] = []
|
|
183
|
+
client.subscribe_events(lambda event, data: received.append((event, data)))
|
|
184
|
+
|
|
185
|
+
client._handle_event_message(
|
|
186
|
+
EventMessage(event=EventType.NETWORK_TOPOLOGY_UPDATED, data=_WIRE_TOPOLOGY)
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
assert len(received) == 1
|
|
190
|
+
event, data = received[0]
|
|
191
|
+
assert event == EventType.NETWORK_TOPOLOGY_UPDATED
|
|
192
|
+
assert isinstance(data, NetworkTopology)
|
|
193
|
+
assert len(data.nodes) == 4
|
|
194
|
+
assert data.connections[1].source_to_target == TopologyDirectionInfo(strength="strong", rssi=-55)
|
{matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/README.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{matter_python_client-1.3.2a0.dev20260727 → matter_python_client-1.4.0a0.dev20260731}/setup.cfg
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|