+
+- :material-lan-connect:{ .lg .middle } [**ONVIFClient**](onvif_client.md)
+
+ ---
+
+ Connect to ONVIF devices, configure connections and authenticaton, and manage service access.
+
+- :material-connection:{ .lg .middle } [**ONVIFOperator**](onvif_operator.md)
+
+ ---
+
+ An **internal class** for coordinating ONVIF operations and managing service interactions.
+
+
\ No newline at end of file
diff --git a/docs/api/exceptions/index.md b/docs/api/exceptions/index.md
new file mode 100644
index 00000000..6e375756
--- /dev/null
+++ b/docs/api/exceptions/index.md
@@ -0,0 +1,22 @@
+---
+hide:
+ - toc
+---
+
+# Exceptions
+
+
+
+- :material-alert-circle-outline:{ .lg .middle } [**ONVIFOperationException**](onvif_exception.md)
+
+ ---
+
+ Understand exceptions raised by failed ONVIF operations, including error details for diagnosing issues.
+
+- :material-reload-alert:{ .lg .middle } [**Error Handlers**](onvif_error_handlers.md)
+
+ ---
+
+ Explore error-handling utilities for processing and managing errors consistently across ONVIF operations.
+
+
\ No newline at end of file
diff --git a/docs/api/index.md b/docs/api/index.md
new file mode 100644
index 00000000..1c16c58a
--- /dev/null
+++ b/docs/api/index.md
@@ -0,0 +1,46 @@
+---
+hide:
+ - toc
+---
+
+# API Reference
+
+
+
+- :material-hub-outline:{ .lg .middle } **Core**
+
+ ---
+
+ Configure ONVIF connections and interact with devices through the main client interfaces.
+
+
+ [:octicons-arrow-right-24: Explore Core](core/index.md)
+
+- :material-alert-circle-outline:{ .lg .middle } **Exceptions**
+
+ ---
+
+ Understand operation exceptions and error-handling utilities for diagnosing and handling failures.
+
+
+ [:octicons-arrow-right-24: Explore Exceptions](exceptions/index.md)
+
+- :material-toolbox:{ .lg .middle } **Utilities**
+
+ ---
+
+ Discover ONVIF devices, configure caching, manage WSDL resources, and extend service behavior.
+
+
+ [:octicons-arrow-right-24: Explore Utilities](utilities/index.md)
+
+- :material-package-variant:{ .lg .middle } **Services**
+
+ ---
+
+ Browse the available ONVIF service clients, from device management, events, PTZ, analytics, and more.
+
+
+ [:octicons-arrow-right-24: Explore Services](services/index.md)
+
+
\ No newline at end of file
diff --git a/docs/api/services/analytics.md b/docs/api/services/analytics/index.md
similarity index 100%
rename from docs/api/services/analytics.md
rename to docs/api/services/analytics/index.md
diff --git a/docs/api/services/ruleengine.md b/docs/api/services/analytics/ruleengine.md
similarity index 100%
rename from docs/api/services/ruleengine.md
rename to docs/api/services/analytics/ruleengine.md
diff --git a/docs/api/services/events.md b/docs/api/services/events/index.md
similarity index 100%
rename from docs/api/services/events.md
rename to docs/api/services/events/index.md
diff --git a/docs/api/services/notification.md b/docs/api/services/events/notification.md
similarity index 100%
rename from docs/api/services/notification.md
rename to docs/api/services/events/notification.md
diff --git a/docs/api/services/pausable_subscription.md b/docs/api/services/events/pausable_subscription.md
similarity index 100%
rename from docs/api/services/pausable_subscription.md
rename to docs/api/services/events/pausable_subscription.md
diff --git a/docs/api/services/pullpoint.md b/docs/api/services/events/pullpoint.md
similarity index 100%
rename from docs/api/services/pullpoint.md
rename to docs/api/services/events/pullpoint.md
diff --git a/docs/api/services/subscription.md b/docs/api/services/events/subscription.md
similarity index 100%
rename from docs/api/services/subscription.md
rename to docs/api/services/events/subscription.md
diff --git a/docs/api/services/index.md b/docs/api/services/index.md
new file mode 100644
index 00000000..b078102c
--- /dev/null
+++ b/docs/api/services/index.md
@@ -0,0 +1,158 @@
+---
+hide:
+ - toc
+---
+
+# ONVIF Services
+
+Browse the ONVIF service clients exposed by `onvif-python`. Each service provides access to operations defined by the corresponding ONVIF specifications and supported device capabilities.
+
+
\ No newline at end of file
diff --git a/docs/api/services/authorizationserver.md b/docs/api/services/security/authorizationserver.md
similarity index 100%
rename from docs/api/services/authorizationserver.md
rename to docs/api/services/security/authorizationserver.md
diff --git a/docs/api/services/dot1x.md b/docs/api/services/security/dot1x.md
similarity index 100%
rename from docs/api/services/dot1x.md
rename to docs/api/services/security/dot1x.md
diff --git a/docs/api/services/advancedsecurity.md b/docs/api/services/security/index.md
similarity index 100%
rename from docs/api/services/advancedsecurity.md
rename to docs/api/services/security/index.md
diff --git a/docs/api/services/jwt.md b/docs/api/services/security/jwt.md
similarity index 100%
rename from docs/api/services/jwt.md
rename to docs/api/services/security/jwt.md
diff --git a/docs/api/services/keystore.md b/docs/api/services/security/keystore.md
similarity index 100%
rename from docs/api/services/keystore.md
rename to docs/api/services/security/keystore.md
diff --git a/docs/api/services/mediasigning.md b/docs/api/services/security/mediasigning.md
similarity index 100%
rename from docs/api/services/mediasigning.md
rename to docs/api/services/security/mediasigning.md
diff --git a/docs/api/services/tlsserver.md b/docs/api/services/security/tlsserver.md
similarity index 100%
rename from docs/api/services/tlsserver.md
rename to docs/api/services/security/tlsserver.md
diff --git a/docs/api/utilities/index.md b/docs/api/utilities/index.md
new file mode 100644
index 00000000..e31d613c
--- /dev/null
+++ b/docs/api/utilities/index.md
@@ -0,0 +1,46 @@
+---
+hide:
+ - toc
+---
+
+# Utilities
+
+
+
+- :material-radar:{ .lg .middle } [**ONVIFDiscovery**](onvif_discovery.md)
+
+ ---
+
+ Discover ONVIF-compliant devices on the local network using WS-Discovery multicast.
+
+- :material-database-cog-outline:{ .lg .middle } [**CacheMode**](cache_mode.md)
+
+ ---
+
+ Configure the caching strategy used by the library to balance performance and resource usage.
+
+- :material-file-cog-outline:{ .lg .middle } [**ONVIFWSDL**](onvif_wsdl.md)
+
+ ---
+
+ Work with WSDL resources used to describe ONVIF service operations and their SOAP interfaces.
+
+- :material-cog-outline:{ .lg .middle } [**ONVIFService**](onvif_service.md)
+
+ ---
+
+ Provides shared functionality for ONVIF service clients and common service operations.
+
+- :material-xml:{ .lg .middle } [**ZeepPatcher**](zeep_patcher.md)
+
+ ---
+
+ Apply compatibility enhancements to Zeep SOAP processing for ONVIF-specific behavior.
+
+- :material-puzzle-outline:{ .lg .middle } [**Plugins**](plugins.md)
+
+ ---
+
+ Explore plugin-related functionality for extending or customizing supported library behavior.
+
+
\ No newline at end of file
diff --git a/docs/api/core/onvif_discovery.md b/docs/api/utilities/onvif_discovery.md
similarity index 100%
rename from docs/api/core/onvif_discovery.md
rename to docs/api/utilities/onvif_discovery.md
diff --git a/docs/core/onvif_discovery.md b/docs/core/onvif_discovery.md
deleted file mode 100644
index eeefc2ae..00000000
--- a/docs/core/onvif_discovery.md
+++ /dev/null
@@ -1 +0,0 @@
-To be written.. see [`ONVIFDiscovery`](../api/core/onvif_discovery.md)
\ No newline at end of file
diff --git a/docs/hooks.py b/docs/hooks.py
index 615df332..1aef365e 100644
--- a/docs/hooks.py
+++ b/docs/hooks.py
@@ -1,6 +1,9 @@
-def on_page_content(html, page, config, files):
+"""Mkdocs hooks."""
+
+
+def on_page_content(html, page, config, files): # pylint: disable=unused-argument
"""Exclude mkdocstrings source blocks from Material search."""
return html.replace(
'',
'',
- )
\ No newline at end of file
+ )
diff --git a/docs/index.md b/docs/index.md
index 424bed7d..26aca859 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,10 +1,15 @@
-# ONVIF Python
+---
+hide:
+ - navigation
+---
+
+# ONVIF Python [](https://pepy.tech/projects/onvif-python){ .no-external-icon }
+
[](https://pypi.org/project/onvif-python){ .no-external-icon }
[](https://pypi.org/project/onvif-python/){ .no-external-icon }
[](https://app.codacy.com/gh/nirsimetri/onvif-python/dashboard){ .no-external-icon }
[](https://app.codacy.com/gh/nirsimetri/onvif-python/coverage){ .no-external-icon }
-[](https://pepy.tech/projects/onvif-python){ .no-external-icon }
[](https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml){ .no-external-icon }
[](https://github.com/nirsimetri/onvif-python/actions/workflows/python-publish.yml){ .no-external-icon }
@@ -18,13 +23,67 @@ Behind the scenes, ONVIF communication relies on **[SOAP](https://en.wikipedia.o
This library simplifies that process by wrapping SOAP communication into a clean, Pythonic API. You no longer need to handle low-level XML parsing, namespaces, or security tokens manually; the library takes care of it, letting you focus on building functionality.
## Who Is It For?
-- **Individual developers** exploring ONVIF or building hobby projects
-- **Companies** building video intelligence, analytics, or VMS platforms
-- **Security integrators** who need reliable ONVIF interoperability across devices
+
+
+
+- :material-account-hard-hat:{ .lg .middle } **Individual Developers**
+
+ ---
+
+ Explore ONVIF capabilities, experiment with network cameras, and build hobby projects.
+
+- :material-corporate-fare:{ .lg .middle } **Companies**
+
+ ---
+
+ Build video intelligence, analytics, and video management system (VMS) platforms.
+
+- :material-cctv:{ .lg .middle } **Security Integrators**
+
+ ---
+
+ Ensure reliable ONVIF interoperability across cameras and other security devices.
+
+- :material-chip:{ .lg .middle } **IoT Experts**
+
+ ---
+
+ Test security, assess interoperability, and investigate ONVIF-enabled devices, and related systems.
+
+
## Requirements
-- **Python**: 3.10 or higher
-- **Dependencies**:
- - [`zeep>=4.3.0`](https://github.com/mvantellingen/python-zeep) - SOAP client for ONVIF communication
- - [`requests>=2.32.0`](https://github.com/psf/requests) - HTTP library for network requests
+
diff --git a/docs/installation.md b/docs/installation.md
index 3ac6ba09..0942c87d 100644
--- a/docs/installation.md
+++ b/docs/installation.md
@@ -1,6 +1,18 @@
+---
+hide:
+ - path
+---
+
From official [PyPI](https://pypi.org/project/onvif-python/):
```console
pip install --upgrade onvif-python
+
+```
+
+Or install using [pipx](https://pipx.pypa.io/stable/) for an isolated environment:
+```console
+pipx install git+https://github.com/nirsimetri/onvif-python
+
```
Or clone this repository and install locally:
diff --git a/docs/javascripts/external-links.js b/docs/javascripts/external-links.js
index 114b96fa..4d58338e 100644
--- a/docs/javascripts/external-links.js
+++ b/docs/javascripts/external-links.js
@@ -2,6 +2,14 @@
document$.subscribe(() => {
document.querySelectorAll('.md-content a[href]').forEach((link) => {
+ if (
+ link.closest('.md-content__button') ||
+ link.closest('.md-content__button--edit') ||
+ link.closest('.md-content__button--view')
+ ) {
+ return;
+ }
+
const url = new URL(link.href, window.location.href);
if (
@@ -20,9 +28,7 @@ document$.subscribe(() => {
icon.setAttribute("aria-hidden", "true");
icon.innerHTML = `
-
+
`;
link.appendChild(icon);
diff --git a/docs/legal/license.md b/docs/legal/license.md
index 11a8ebbf..34a36ed0 100644
--- a/docs/legal/license.md
+++ b/docs/legal/license.md
@@ -1,3 +1,8 @@
+---
+hide:
+ - path
+---
+
MIT License
Copyright (c) 2025-2026 Nirsimetri Technologies®
diff --git a/docs/legal/legal_notice.md b/docs/legal/notice.md
similarity index 98%
rename from docs/legal/legal_notice.md
rename to docs/legal/notice.md
index 6de503db..293b51d7 100644
--- a/docs/legal/legal_notice.md
+++ b/docs/legal/notice.md
@@ -1,3 +1,8 @@
+---
+hide:
+ - path
+---
+
This project is an **independent open-source implementation** of the [ONVIF](https://www.onvif.org) specifications. It is **not affiliated with, endorsed by, or sponsored by ONVIF** or its member companies.
- The name **“ONVIF”** and the ONVIF logo are registered trademarks of the ONVIF organization.
diff --git a/docs/core/onvif_cli.md b/docs/main/onvif_cli.md
similarity index 95%
rename from docs/core/onvif_cli.md
rename to docs/main/onvif_cli.md
index c46e173a..7f4c9bcb 100644
--- a/docs/core/onvif_cli.md
+++ b/docs/main/onvif_cli.md
@@ -1,3 +1,8 @@
+---
+hide:
+ - path
+---
+



@@ -45,13 +50,13 @@ This library includes a powerful command-line interface (CLI) for interacting wi
??? abstract "Direct CLI"
- ```shell
+ ```shell { data-search-exclude }
usage: onvif [-h] [--host HOST] [--port PORT] [--username USERNAME] [--password PASSWORD] [--discover] [--filter FILTER] [--interface INTERFACE] [--discovery-timeout DISCOVERY_TIMEOUT] [--search SEARCH]
[--page PAGE] [--per-page PER_PAGE] [--timeout TIMEOUT] [--digest] [--https] [--no-verify] [--no-patch] [--interactive] [--debug] [--wsdl WSDL] [--cache {none,mem,db}]
[--health-check-interval HEALTH_CHECK_INTERVAL] [--output OUTPUT] [--version]
[service] [method] [params ...]
- ONVIF Terminal Client — v0.4.4
+ ONVIF Terminal Client —
https://github.com/nirsimetri/onvif-python
positional arguments:
@@ -132,8 +137,8 @@ This library includes a powerful command-line interface (CLI) for interacting wi
??? abstract "Interactive Shell"
- ```shell
- ONVIF Interactive Shell — v0.4.4
+ ```shell { data-search-exclude }
+ ONVIF Interactive Shell —
https://github.com/nirsimetri/onvif-python
Basic Commands:
@@ -236,7 +241,9 @@ If you omit the username or password, you will be prompted to enter them securel
| `exit` | Exit the shell |
!!! warning
- You can see all the other commands available in the interactive shell by trying it out directly. The interactive shell runs periodic background health checks to detect connection loss. It uses silent TCP pings to avoid interrupting your work and will automatically exit if the device is unreachable, similar to an SSH session.
+ You can see all the other commands available in the interactive shell by trying it out directly with `help` command from interactive shell.
+
+ The interactive shell runs periodic background health checks to detect connection loss. It uses silent TCP pings to avoid interrupting your work and will automatically exit if the device is unreachable, similar to an SSH session.
#### Command Chaining with `&&`
@@ -262,7 +269,7 @@ This feature is particularly useful for:
### Device Discovery
-The CLI includes automatic ONVIF device discovery using the WS-Discovery protocol with [`ONVIFDiscovery`](../api/core/onvif_discovery.md) class. This feature allows you to find all ONVIF-compliant devices on your local network without knowing their IP addresses beforehand (applied at [`>=v0.1.2`](../releases.md/#v0.1.2)).
+The CLI includes automatic ONVIF device discovery using the WS-Discovery protocol with [`ONVIFDiscovery`](../api/utilities/onvif_discovery.md) class. This feature allows you to find all ONVIF-compliant devices on your local network without knowing their IP addresses beforehand (applied at [`>=v0.1.2`](../releases.md/#v0.1.2)).
!!! danger
- Discovery only works on the local network (same subnet)
@@ -310,7 +317,7 @@ onvif media GetProfiles -d -u admin -p password
4. **Connection**: Once you select a device, the CLI automatically connects using the discovered host and port
#### Example Discovery Output
-```shell
+```shell { data-search-exclude }
onvif -d -i
Discovering ONVIF devices on network...
diff --git a/docs/core/onvif_client.md b/docs/main/onvif_client.md
similarity index 99%
rename from docs/core/onvif_client.md
rename to docs/main/onvif_client.md
index 008e5a88..14422606 100644
--- a/docs/core/onvif_client.md
+++ b/docs/main/onvif_client.md
@@ -1,3 +1,8 @@
+---
+hide:
+ - path
+---
+
The [`ONVIFClient`](../api/core/onvif_client.md) class provides various configuration options to customize the connection behavior, caching strategy, security settings, and debugging capabilities. Below is a detailed description of all available parameters:
diff --git a/docs/overrides/.icons/material/corporate-fare.svg b/docs/overrides/.icons/material/corporate-fare.svg
new file mode 100644
index 00000000..0b16a417
--- /dev/null
+++ b/docs/overrides/.icons/material/corporate-fare.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/overrides/.icons/material/sensors.svg b/docs/overrides/.icons/material/sensors.svg
new file mode 100644
index 00000000..1c881aaa
--- /dev/null
+++ b/docs/overrides/.icons/material/sensors.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/philosophy.md b/docs/philosophy.md
index 8074fa16..d0a42b90 100644
--- a/docs/philosophy.md
+++ b/docs/philosophy.md
@@ -1,3 +1,8 @@
+---
+hide:
+ - path
+---
+
!!! info
This library will be continuously updated as ONVIF versions are updated. It uses a built-in WSDL that will always follow changes to the [ONVIF WSDL Specifications](https://github.com/onvif/specs).
diff --git a/docs/project/contributing.md b/docs/project/contributing.md
index 0723866a..6d0b09ed 100644
--- a/docs/project/contributing.md
+++ b/docs/project/contributing.md
@@ -1,3 +1,8 @@
+---
+hide:
+ - path
+---
+
## Contributors
@@ -216,6 +221,7 @@ docs/
├── utilities/
├── project/
├── legal/
+├── hooks.py
├── index.md
├── installation.md
├── quick_start.md
diff --git a/docs/project/external.md b/docs/project/external.md
index 62f6f9bd..d5df10a5 100644
--- a/docs/project/external.md
+++ b/docs/project/external.md
@@ -1,19 +1,20 @@
-## Related Projects
+---
+hide:
+ - path
+---
-- [onvif-products-directory](https://github.com/nirsimetri/onvif-products-directory):
- This project is a comprehensive ONVIF data aggregation and management suite, designed to help developers explore, analyze, and process ONVIF-compliant product information from hundreds of manufacturers worldwide.
+## Related Projects
-- (soon) [onvif-rest-server](https://github.com/nirsimetri/onvif-rest-server):
- A RESTful API server for ONVIF devices, enabling easy integration of ONVIF device management, media streaming, and other capabilities into web applications and services.
+- (soon) [onvif-proxy](https://github.com/nirsimetri/onvif-proxy):
+ A middleware proxy that provides a unified REST API for interacting with ONVIF-compliant devices.
- (soon) [onvif-mcp](https://github.com/nirsimetri/onvif-mcp):
- A Model Context Protocol (MCP) server for ONVIF, providing a unified API and context-based integration for ONVIF devices, clients, and services. It enables advanced automation, orchestration, and interoperability across ONVIF-compliant devices and clients.
+ An MCP server that enables AI assistants and agents to discover, manage, and control ONVIF-compliant devices.
## Links
+- [ONVIF Application Programmer's Guide](https://www.onvif.org/wp-content/uploads/2016/12/ONVIF_WG-APG-Application_Programmers_Guide-1.pdf)
- [ONVIF Official Specifications](https://www.onvif.org/profiles/specifications/specification-history/)
-- [ONVIF Developer Specs](https://developer.onvif.org/pub/specs/branches/development/doc/index.html)
- [ONVIF Official Specs Repository](https://github.com/onvif/specs)
-- [ONVIF Application Programmer's Guide](https://www.onvif.org/wp-content/uploads/2016/12/ONVIF_WG-APG-Application_Programmers_Guide-1.pdf)
-- [ONVIF 2.0 Service Operation Index](https://www.onvif.org/onvif/ver20/util/operationIndex.html)
-- [ONVIF conformant products list](https://www.onvif.org/conformant-products/)
-- [ONVIF Profile Feature Overview v2.6](https://www.onvif.org/wp-content/uploads/2022/04/onvif-profile-feature-overview.pdf)
\ No newline at end of file
+- [ONVIF Developer Specs](https://developer.onvif.org/pub/specs/branches/development/doc/index.html)
+- [ONVIF Profile Feature Overview](https://www.onvif.org/wp-content/uploads/2022/04/onvif-profile-feature-overview.pdf)
+- [ONVIF conformant products list](https://www.onvif.org/conformant-products/)
\ No newline at end of file
diff --git a/docs/project/roadmap.md b/docs/project/roadmap.md
index 1685a38c..d11776e3 100644
--- a/docs/project/roadmap.md
+++ b/docs/project/roadmap.md
@@ -1,3 +1,9 @@
+---
+hide:
+ - toc
+ - path
+---
+
## Stay tuned and star ⭐ this repo
[](https://github.com/nirsimetri/onvif-python){ .no-external-icon }
@@ -6,7 +12,7 @@
- [x] Add functionality for `ONVIFClient` to accept a custom `wsdl_dir` ([`v0.1.0`](../releases.md/#v0.1.0))
- [x] Add `ONVIF CLI` program to interact directly with ONVIF devices via terminal ([`v0.1.1`](../releases.md/#v0.1.1))
- [x] Enhance documentation with API references and diagrams (not from [AI Wiki](https://deepwiki.com/nirsimetri/onvif-python)) ([`v0.3.1`](../releases.md/#v0.3.1))
-- [ ] Add asynchronous (`async`/`await`) support for non-blocking ONVIF operations and concurrent device communication
+- [ ] Add asynchronous (`async`/`await`) support for non-blocking operations
- [ ] Implement structured data models for ONVIF Schemas using [xsdata](https://github.com/tefra/xsdata)
- [ ] Add more usage examples for advanced features
- [ ] Add benchmarking and performance metrics
diff --git a/docs/project/used_by.md b/docs/project/used_by.md
index 4549b535..f52a6293 100644
--- a/docs/project/used_by.md
+++ b/docs/project/used_by.md
@@ -1,3 +1,8 @@
+---
+hide:
+ - path
+---
+
With , the `onvif-python` library is already being used by several well-known open-source projects, including:
## Viseron
diff --git a/docs/quick_start.md b/docs/quick_start.md
index 4dcc8f03..afb68389 100644
--- a/docs/quick_start.md
+++ b/docs/quick_start.md
@@ -1,13 +1,18 @@
+---
+hide:
+ - path
+---
+
Below are simple examples to help you get started with the ONVIF Python library. These demonstrate how to discover and connect to ONVIF-compliant devices and retrieve basic device information.
-!!! tip "For beginners"
+!!! note "For beginners"
If you're new to ONVIF and want to learn more, we highly recommend taking the official free online course provided by ONVIF at [Introduction to ONVIF Course](https://www.onvif.org/about/introduction-to-onvif-course).
- Please note that we are not endorsed or sponsored by ONVIF, see [Legal Notice](legal/legal_notice.md) for details.
+ Please note that we are not endorsed or sponsored by ONVIF, see [Legal Notice](legal/notice.md) for details.
### Discover ONVIF Devices
-Use [`ONVIFDiscovery`](api/core/onvif_discovery.md) (applied at [`>=v0.1.6`](releases.md/#v0.1.6)) to automatically find ONVIF devices on your local network:
+Use [`ONVIFDiscovery`](api/utilities/onvif_discovery.md) (applied at [`>=v0.1.6`](releases.md/#v0.1.6)) to automatically find ONVIF devices on your local network:
```python linenums="1"
from onvif import ONVIFDiscovery
diff --git a/docs/references/implemented_services.md b/docs/references/implemented_services.md
index 90500100..903fc2f0 100644
--- a/docs/references/implemented_services.md
+++ b/docs/references/implemented_services.md
@@ -1,31 +1,215 @@
+---
+hide:
+ - path
+---
+
Below is a list of ONVIF services implemented and supported by this library, along with links to the official specifications, service definitions, and schema files as referenced from the [ONVIF Developer Specs](https://developer.onvif.org/pub/specs/branches/development/doc/index.html).
-| Service | Specs | Service Definitions | Schema Files | Status |
-|------------------------|-------------------------------|-----------------------------|-------------------------------------|------------|
-| Device Management | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/Core.xml) | [device.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/device/wsdl/devicemgmt.wsdl) | [onvif.xsd](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/schema/onvif.xsd) [common.xsd](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/schema/common.xsd) | Complete |
-| Events | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/Core.xml) | [event.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/events/wsdl/event.wsdl) | [onvif.xsd](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/schema/onvif.xsd) [common.xsd](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/schema/common.xsd) | Complete |
-| Access Control | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/AccessControl.xml) | [accesscontrol.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/pacs/accesscontrol.wsdl) | [types.xsd](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/pacs/types.xsd) | Complete |
-| Access Rules | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/AccessRules.xml) | [accessrules.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/accessrules/wsdl/accessrules.wsdl) | - | Complete |
-| Action Engine | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/ActionEngine.xml) | [actionengine.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/actionengine.wsdl) | - | Complete |
-| Analytics | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/Analytics.xml) | [analytics.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver20/analytics/wsdl/analytics.wsdl) | [rules.xsd](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver20/analytics/rules.xsd) [humanbody.xsd](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver20/analytics/humanbody.xsd) [humanface.xsd](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver20/analytics/humanface.xsd) | Complete |
-| Analytics Device | [Document](https://www.onvif.org/specs/srv/analytics/ONVIF-VideoAnalyticsDevice-Service-Spec-v211.pdf) | [analyticsdevice.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/analyticsdevice.wsdl) | - | Complete |
-| Application Management | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/AppMgmt.xml) | [appmgmt.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/appmgmt/wsdl/appmgmt.wsdl) | - | Complete |
-| Authentication Behavior| [Document](https://developer.onvif.org/pub/specs/branches/development/doc/AuthenticationBehavior.xml) | [authenticationbehavior.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/authenticationbehavior/wsdl/authenticationbehavior.wsdl) | - | Complete |
-| Cloud Integration | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/CloudIntegration.xml) | [cloudintegration.yaml](https://developer.onvif.org/pub/specs/branches/development/doc/yaml.php?yaml=cloudintegration.yaml) | - | ❌ Not yet |
-| Credential | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/Credential.xml) | [credential.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/credential/wsdl/credential.wsdl) | - | Complete |
-| Device IO | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/DeviceIo.xml) | [deviceio.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/deviceio.wsdl) |- | Complete |
-| Display | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/Display.xml) | [display.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/display.wsdl) | - | Complete |
-| Door Control | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/DoorControl.xml) | [doorcontrol.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/pacs/doorcontrol.wsdl) | - | Complete |
-| Imaging | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/Imaging.xml) | [imaging.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver20/imaging/wsdl/imaging.wsdl) | - | Complete |
-| Media | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/Media.xml) | [media.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/media/wsdl/media.wsdl) | - | Complete |
-| Media 2 | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/Media2.xml) | [media2.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver20/media/wsdl/media.wsdl) | - | Complete |
-| Provisioning | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/Provisioning.xml) | [provisioning.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/provisioning/wsdl/provisioning.wsdl) | - | Complete |
-| PTZ | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/PTZ.xml) | [ptz.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver20/ptz/wsdl/ptz.wsdl) | - | Complete |
-| Receiver | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/Receiver.xml) | [receiver.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/receiver.wsdl) | - | Complete |
-| Recording Control | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/RecordingControl.xml) | [recording.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/recording.wsdl) | - | Complete |
-| Recording Search | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/RecordingSearch.xml) | [search.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/search.wsdl) | - | Complete |
-| Replay Control | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/Replay.xml) | [replay.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/replay.wsdl) | - | Complete |
-| Schedule | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/Schedule.xml) | [schedule.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/schedule/wsdl/schedule.wsdl) | - | Complete |
-| Security | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/Security.xml) | [advancedsecurity.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl) | - | Complete |
-| Thermal | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/Thermal.xml) | [thermal.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/thermal/wsdl/thermal.wsdl) | [radiometry.xsd](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver20/analytics/radiometry.xsd) | Complete |
-| Uplink | [Document](https://developer.onvif.org/pub/specs/branches/development/doc/Uplink.xml) | [uplink.wsdl](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver10/uplink/wsdl/uplink.wsdl) | - | Complete |
+
+{% endblock %}
\ No newline at end of file
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
index 3f80314b..8efa1eb6 100644
--- a/docs/stylesheets/extra.css
+++ b/docs/stylesheets/extra.css
@@ -291,4 +291,74 @@
.md-typeset details[open] > summary {
border-top-right-radius: 0.5rem !important;
border-top-left-radius: 0.5rem !important;
+}
+
+/* 404 page */
+@media screen and (min-width: 76.25em) {
+ body:has(.error-page) .md-sidebar {
+ display: none !important;
+ }
+
+ body:has(.error-page) .md-content {
+ max-width: 100% !important;
+ margin-inline: 0 !important;
+ }
+
+ body:has(.error-page) .md-content__inner {
+ margin-inline: 0 !important;
+ }
+}
+
+.error-page {
+ display: flex;
+ min-height: 55vh;
+ align-items: center;
+ justify-content: flex-start;
+ text-align: left;
+}
+
+.error-page__content {
+ width: 100%;
+ max-width: 30rem;
+}
+
+.error-page__code {
+ margin: 0;
+ color: var(--md-typeset-a-color);
+ font-size: clamp(4rem, 16vw, 8rem);
+ font-weight: 800;
+ letter-spacing: -0.08em;
+ line-height: 1;
+}
+
+.error-page h1 {
+ margin-top: 1.5rem;
+ margin-bottom: 1.5rem;
+ color: var(--md-default-fg-color);
+}
+
+.error-page__description {
+ max-width: 30rem;
+ margin: 0 0 2rem;
+ color: var(--md-default-fg-color--light);
+ line-height: 1.7;
+}
+
+.error-page__actions {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+ gap: 0.5rem;
+}
+
+.error-page__actions .md-button {
+ margin: 0;
+ border-radius: 0.5rem;
+ color: var(--md-typeset-a-color);
+}
+
+.error-page__actions .md-button--primary {
+ background-color: var(--md-typeset-a-color);
+ border-color: var(--md-typeset-a-color);
+ color: var(--md-default-bg-color) !important;
}
\ No newline at end of file
From 9396f465facf7801ac995b96488421ebc3761c46 Mon Sep 17 00:00:00 2001
From: kaburagisec <135169292+kaburagisec@users.noreply.github.com>
Date: Tue, 13 Oct 2026 21:57:49 +0700
Subject: [PATCH 14/38] style(docs): Enhance CSS for hover effects
---
docs/stylesheets/extra.css | 36 ++++++++++++++++++++++++++++++++----
1 file changed, 32 insertions(+), 4 deletions(-)
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
index 8efa1eb6..e0972e83 100644
--- a/docs/stylesheets/extra.css
+++ b/docs/stylesheets/extra.css
@@ -170,13 +170,20 @@
display: block;
padding: .1rem .4rem;
color: #ebebeb;
- font-weight: bold;
- font-size: .8rem;
- border: .05rem solid #ebebeb7a;
- border-radius: .2rem;
+ font-weight: 600;
+ font-size: .75rem;
+ border: .05rem solid #ebebeb50;
+ border-radius: .3rem;
content: "/";
}
+[data-md-toggle=search]:not(:checked) ~ .md-header .md-search__form {
+ border-top-right-radius: 0.5rem !important;
+ border-bottom-left-radius: 0.5rem !important;
+ border-bottom-right-radius: 0.5rem !important;
+ border-top-left-radius: 0.5rem !important;
+}
+
.md-tooltip2 {
z-index: 4 !important;
}
@@ -361,4 +368,25 @@
background-color: var(--md-typeset-a-color);
border-color: var(--md-typeset-a-color);
color: var(--md-default-bg-color) !important;
+}
+
+/* Grid cards — border color on hover */
+.md-typeset .grid.cards > ul > li,
+.md-typeset .grid.cards > ul > li > hr {
+ transition: border-color 200ms ease;
+}
+
+.md-typeset .grid.cards > ul > li:hover {
+ border-color: var(--md-accent-fg-color);
+}
+
+/* Code content — border color on hover */
+.md-typeset .highlight .md-code__content {
+ border: 1px solid transparent;
+ border-radius: 0.5rem;
+}
+
+.md-typeset .highlight .md-code__content:hover {
+ border-color: var(--md-accent-fg-color);
+ transition: border-color 200ms ease;
}
\ No newline at end of file
From 5647a12fdece9c17505f0be8ff3f855f6cc683a1 Mon Sep 17 00:00:00 2001
From: kaburagisec <135169292+kaburagisec@users.noreply.github.com>
Date: Tue, 13 Oct 2026 21:57:58 +0700
Subject: [PATCH 15/38] fix(docs): Update service discovery documentation for
clarity and accuracy
---
docs/project/contributing.md | 32 +++++++++++++++-------------
docs/quick_start.md | 2 +-
docs/references/service_discovery.md | 15 ++++++++-----
3 files changed, 28 insertions(+), 21 deletions(-)
diff --git a/docs/project/contributing.md b/docs/project/contributing.md
index 6d0b09ed..efc333fd 100644
--- a/docs/project/contributing.md
+++ b/docs/project/contributing.md
@@ -71,7 +71,7 @@ If you can help translate documentation or error messages, let us know!
Coverage is optional for local development. To generate an XML coverage report:
```shell
- pytest --cov=. --cov-report=xml
+ pytest --cov=onvif --cov-report=xml --cov-report=term-missing
```
This generates `coverage.xml`, which can be used by coverage analysis tools such as Codacy.
@@ -117,17 +117,17 @@ Make sure to write a comprehensive description for the PR you create to make it
Use the following commit title types:
-- **`feat`** → ✨ New feature
-- **`fix`** → 🐛 Bug fix
-- **`chore`** → 🔧 Non-code tasks such as updating dependencies, configs, or build tools
-- **`docs`** → 📚 Documentation-only changes
-- **`style`** → 🎨 Code style changes (formatting, spacing, etc. — without affecting logic)
-- **`refactor`** → 🔨 Code refactoring without adding features or fixing bugs
-- **`test`** → ✅ Adding or modifying tests (unit tests, integration tests, etc.)
-- **`perf`** → 🚀 Performance improvements
-- **`ci`** → ⚙️ Changes to CI/CD configuration or pipelines
-- **`build`** → 📦 Changes to the build system or external dependencies (e.g., Dockerfile)
-- **`revert`** → ⏪ Reverting a previous commit
+- **`feat`** → New feature
+- **`fix`** → Bug fix
+- **`chore`** → Non-code tasks such as updating dependencies, configs, or build tools
+- **`docs`** → Documentation-only changes
+- **`style`** → Code style changes (formatting, spacing, etc. — without affecting logic)
+- **`refactor`** → Code refactoring without adding features or fixing bugs
+- **`test`** → Adding or modifying tests (unit tests, integration tests, etc.)
+- **`perf`** → Performance improvements
+- **`ci`** → Changes to CI/CD configuration or pipelines
+- **`build`** → Changes to the build system or external dependencies (e.g., Dockerfile)
+- **`revert`** → Reverting a previous commit
- **`code`** → General code changes that support but are not core features (e.g., examples)
**Examples:**
@@ -175,9 +175,11 @@ pip install -e ".[docs]"
This installs the documentation tooling defined in `pyproject.toml`, including:
-* `mkdocs-material` — MkDocs theme and Material extensions
-* `mkdocstrings[python]` — API documentation generated from Python source code
-* `mkdocs-git-authors-plugin` — contributor information for documentation pages
+* `mkdocs-material` → MkDocs theme and Material extensions
+* `mkdocstrings[python]` → API documentation generated from Python source code
+* `mkdocs-git-authors-plugin` → contributor information for documentation pages
+* `mkdocs-git-revision-date-localized-plugin` → revision date information for documentation pages
+* `mkdocs-minify-plugin` → to minify any generated html/css/js files
### Run Locally
diff --git a/docs/quick_start.md b/docs/quick_start.md
index afb68389..bd5e0f04 100644
--- a/docs/quick_start.md
+++ b/docs/quick_start.md
@@ -91,7 +91,7 @@ Retrieve basic information about the device, such as manufacturer, model, firmwa
info = device.GetDeviceInformation()
print(info)
# Example output:
-# {'Manufacturer': '..', 'Model': '..', 'FirmwareVersion': '..', 'SerialNumber': '..'}
+# {'Manufacturer': '..', 'Model': '..', 'FirmwareVersion': '..', ...}
```
### Get RTSP URL
diff --git a/docs/references/service_discovery.md b/docs/references/service_discovery.md
index 8526cacf..c70149a9 100644
--- a/docs/references/service_discovery.md
+++ b/docs/references/service_discovery.md
@@ -30,10 +30,10 @@ By checking available services, your application can adapt its workflow and UI t
The [`ONVIFClient`](../api/core/onvif_client.md) uses a **3-tier discovery approach** to maximize device compatibility:
### `GetServices` (Preferred)
-Tries `GetServices` first for detailed service information.
+Tries [`GetServices`](../api/services/device.md#onvif.services.devicemgmt.Device.GetServices) first for detailed service information.
### `GetCapabilities` (Fallback)
-Falls back to `GetCapabilities` if `GetServices` is not supported by the device.
+Falls back to [`GetCapabilities`](../api/services/device.md#onvif.services.devicemgmt.Device.GetCapabilities) if [`GetServices`](../api/services/device.md#onvif.services.devicemgmt.Device.GetServices) is not supported by the device.
### Default URLs (Final Fallback)
Uses standard ONVIF URLs as last resort.
@@ -44,7 +44,12 @@ You can check which service discovery method your ONVIF connection is using with
```python linenums="1"
from onvif import ONVIFClient
-client = ONVIFClient("192.168.1.17", 8000, "admin", "admin123")
+client = ONVIFClient(
+ host="192.168.1.17",
+ port=8000,
+ username="admin",
+ password="password"
+)
# Check what discovery method was used
if client.services:
@@ -60,9 +65,9 @@ else:
## Why this approach?
-`GetServices` provides the most accurate and detailed service information, but it's **optional** in the ONVIF specification.
+[`GetServices`](../api/services/device.md#onvif.services.devicemgmt.Device.GetServices) provides the most accurate and detailed service information, but it's **optional** in the ONVIF specification.
-`GetCapabilities` is **mandatory** for all ONVIF-compliant devices, ensuring broader compatibility.
+[`GetCapabilities`](../api/services/device.md#onvif.services.devicemgmt.Device.GetCapabilities) is **mandatory** for all ONVIF-compliant devices, ensuring broader compatibility.
**Default URLs** guarantee basic connectivity even with non-compliant devices.
From 1709db5ac75becb1a3a88768c0e7aa4a5f732969 Mon Sep 17 00:00:00 2001
From: kaburagisec <135169292+kaburagisec@users.noreply.github.com>
Date: Tue, 13 Oct 2026 21:58:29 +0700
Subject: [PATCH 16/38] refactor(docs): Revamp section with a table format and
add dependencies section
---
README.md | 69 +++++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 62 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index 073190e3..62b9567f 100644
--- a/README.md
+++ b/README.md
@@ -17,16 +17,71 @@ Behind the scenes, ONVIF communication relies on **[SOAP](https://en.wikipedia.o
This library simplifies that process by wrapping SOAP communication into a clean, Pythonic API. You no longer need to handle low-level XML parsing, namespaces, or security tokens manually; the library takes care of it, letting you focus on building functionality.
## Who Is It For?
-- **Individual developers** exploring ONVIF or building hobby projects
-- **Companies** building video intelligence, analytics, or VMS platforms
-- **Security integrators** who need reliable ONVIF interoperability across devices
+
+
+
+
+ Individual Developers
+
+
+ Companies
+
+
+
+
+
Explore ONVIF capabilities, experiment with network cameras, and build hobby projects.
+
+
+
Build video intelligence, analytics, and video management system (VMS) platforms.
+
+
+
+
+ Security Integrators
+
+
+ IoT Experts
+
+
+
+
+
Ensure reliable ONVIF interoperability across cameras and other security devices.
+
+
+
Test security, assess interoperability, and investigate ONVIF-enabled devices and related systems.
+
+
+
## Requirements
-- **Python**: 3.10 or higher
-- **Dependencies**:
- - [`zeep>=4.3.0`](https://github.com/mvantellingen/python-zeep) - SOAP client for ONVIF communication
- - [`requests>=2.32.0`](https://github.com/psf/requests) - HTTP library for network requests
+Python **3.10 or higher** is required.
+
+## Dependencies
+
+- [zeep](https://github.com/mvantellingen/python-zeep) → SOAP client for ONVIF communication.
+- [requests](https://github.com/psf/requests) → HTTP library for network requests.
+- [pyreadline3](https://github.com/pyreadline3/pyreadline3) → Only installed on Windows (`win32`) for tab completion.
## Installation
From 7a6d4bb5c9bb6ffd6e7b4ac6a99ebef0e17d1fc8 Mon Sep 17 00:00:00 2001
From: Kaburagi <135169292+kaburagisec@users.noreply.github.com>
Date: Wed, 14 Oct 2026 05:24:04 +0700
Subject: [PATCH 17/38] feat(docs): Enhance external link handling and add
content actions button
---
docs/javascripts/external-links.js | 54 +++++++++++++------
docs/javascripts/extra.js | 34 ++++++++++++
.../.icons/material/corporate-fare.svg | 1 -
docs/stylesheets/extra.css | 51 ++++++++++++++++++
mkdocs.yml | 10 +++-
5 files changed, 130 insertions(+), 20 deletions(-)
create mode 100644 docs/javascripts/extra.js
delete mode 100644 docs/overrides/.icons/material/corporate-fare.svg
diff --git a/docs/javascripts/external-links.js b/docs/javascripts/external-links.js
index 4d58338e..aec0fe63 100644
--- a/docs/javascripts/external-links.js
+++ b/docs/javascripts/external-links.js
@@ -2,37 +2,57 @@
document$.subscribe(() => {
document.querySelectorAll('.md-content a[href]').forEach((link) => {
- if (
- link.closest('.md-content__button') ||
- link.closest('.md-content__button--edit') ||
- link.closest('.md-content__button--view')
- ) {
+ const url = new URL(link.href, window.location.href);
+
+ const isEditButton =
+ link.classList.contains('md-content__button') &&
+ url.hostname === 'github.com' &&
+ /\/edit\//.test(url.pathname);
+
+ const isViewButton =
+ link.classList.contains('md-content__button') &&
+ url.hostname === 'github.com' &&
+ /\/raw\//.test(url.pathname);
+
+ if (isEditButton || isViewButton) {
+ link.target = '_blank';
+ link.rel = 'noopener noreferrer';
+
+ link.dataset.tooltip = isEditButton
+ ? 'Edit this page'
+ : 'View source of this page';
+
+ // Remove external icons from Edit and View buttons.
+ link.querySelectorAll('.external-link-icon').forEach((icon) => {
+ icon.remove();
+ });
+
return;
}
-
- const url = new URL(link.href, window.location.href);
if (
- (url.protocol === "http:" || url.protocol === "https:") &&
+ ['http:', 'https:'].includes(url.protocol) &&
url.hostname !== window.location.hostname
) {
- link.target = "_blank";
- link.rel = "noopener noreferrer";
+ link.target = '_blank';
+ link.rel = 'noopener noreferrer';
if (
- !link.classList.contains("no-external-icon") &&
- !link.querySelector(".external-link-icon")
+ !link.classList.contains('no-external-icon') &&
+ !link.querySelector('.external-link-icon')
) {
- const icon = document.createElement("span");
- icon.className = "external-link-icon";
- icon.setAttribute("aria-hidden", "true");
+ const icon = document.createElement('span');
+ icon.className = 'external-link-icon';
+ icon.setAttribute('aria-hidden', 'true');
icon.innerHTML = `
-
+
`;
link.appendChild(icon);
}
}
});
-});
\ No newline at end of file
+});
diff --git a/docs/javascripts/extra.js b/docs/javascripts/extra.js
new file mode 100644
index 00000000..9387920a
--- /dev/null
+++ b/docs/javascripts/extra.js
@@ -0,0 +1,34 @@
+/* global document$ */
+
+document$.subscribe(() => {
+ document.querySelectorAll('.md-content__button[href*="/raw/"]').forEach((editButton) => {
+ if (editButton.parentElement.querySelector(".report-issue-button")) return;
+
+ const issueTitle =
+ document.querySelector(".md-content h1")?.textContent.trim() ||
+ document.title;
+ const issueBody = encodeURIComponent(
+ `**Reference:** \n${window.location.href}\n\n**Description:**\n`
+ );
+
+ const reportButton = document.createElement("a");
+ reportButton.className = "md-content__button md-icon report-issue-button";
+ reportButton.href =
+ `https://github.com/${GITHUB_REPOSITORY}/issues/new` +
+ `?title=${issueTitle}&body=${issueBody}`;
+ reportButton.target = "_blank";
+ reportButton.rel = "noopener noreferrer";
+ reportButton.dataset.tooltip = "Report an issue";
+ reportButton.setAttribute("aria-label", "Report an issue");
+ reportButton.innerHTML = `
+
+ `;
+
+ editButton.after(reportButton);
+ });
+});
\ No newline at end of file
diff --git a/docs/overrides/.icons/material/corporate-fare.svg b/docs/overrides/.icons/material/corporate-fare.svg
deleted file mode 100644
index 0b16a417..00000000
--- a/docs/overrides/.icons/material/corporate-fare.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
index e0972e83..756581f6 100644
--- a/docs/stylesheets/extra.css
+++ b/docs/stylesheets/extra.css
@@ -389,4 +389,55 @@
.md-typeset .highlight .md-code__content:hover {
border-color: var(--md-accent-fg-color);
transition: border-color 200ms ease;
+}
+
+/* Navigation */
+.md-header .md-header__inner{
+ padding-top: 0.2rem;
+ padding-bottom: 0.2rem;
+}
+
+/* Edit and View tooltips */
+.md-content__button[data-tooltip] {
+ position: relative;
+}
+
+.md-content__button[data-tooltip]::after {
+ content: attr(data-tooltip);
+ position: absolute;
+ top: calc(100% + 0.3rem);
+ left: 50%;
+ z-index: 100;
+ width: max-content;
+ max-width: 16rem;
+ padding: 0.3rem 0.5rem;
+ border-radius: 0.2rem;
+ background: var(--md-default-bg-color);
+ color: var(--md-default-fg-color);
+ box-shadow: var(--md-shadow-z2);
+ font-size: 0.5rem;
+ font-weight: 600;
+ line-height: 1.4;
+ white-space: normal;
+ pointer-events: none;
+ opacity: 0;
+ visibility: hidden;
+ transform: translate(-50%, -5px);
+ transition:
+ opacity 250ms ease,
+ transform 250ms ease,
+ visibility 250ms ease;
+}
+
+.md-content__button[data-tooltip]:hover::after,
+.md-content__button[data-tooltip]:focus-visible::after {
+ opacity: 1;
+ visibility: visible;
+ transform: translate(-50%, 0);
+}
+
+.md-content__button svg {
+ width: 1.2rem;
+ height: 1.2rem;
+ vertical-align: middle;
}
\ No newline at end of file
diff --git a/mkdocs.yml b/mkdocs.yml
index 17e2a6df..dfc84f82 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -5,7 +5,7 @@ site_description: >-
site_url: https://nirsimetri.github.io/onvif-python/
repo_url: https://github.com/nirsimetri/onvif-python
repo_name: nirsimetri/onvif-python
-edit_uri: edit/main/docs/
+edit_uri: edit/dev/docs/
use_directory_urls: true
theme:
@@ -28,10 +28,14 @@ theme:
question: material/telescope
success: material/check-circle
failure: material/cancel
+ edit: material/text-box-edit-outline
+ view: material/text-box-search-outline
font:
text: Geist
code: Geist Mono
features:
+ - content.action.edit
+ - content.action.view
- content.code.copy
- content.code.annotate
- content.tooltips
@@ -70,7 +74,7 @@ theme:
nav:
- Home: index.md
- - Get Started:
+ - Getting Started:
- Philosophy: philosophy.md
- Installation: installation.md
- Quickstart: quick_start.md
@@ -166,6 +170,7 @@ plugins:
js_files:
- javascripts/github-releases.js
- javascripts/external-links.js
+ - javascripts/extra.js
css_files:
- stylesheets/extra.css
- git-revision-date-localized:
@@ -254,6 +259,7 @@ extra_javascript:
- https://cdn.jsdelivr.net/npm/dompurify@3.4.15/dist/purify.min.js
- javascripts/github-releases.js
- javascripts/external-links.js
+ - javascripts/extra.js
hooks:
- docs/hooks.py
From 755a279550bbface3c986bfffceeaae0dbb440b4 Mon Sep 17 00:00:00 2001
From: Kaburagi <135169292+kaburagisec@users.noreply.github.com>
Date: Wed, 14 Oct 2026 05:24:14 +0700
Subject: [PATCH 18/38] fix(docs): Update Open Graph and Twitter image URLs to
correct asset
---
docs/overrides/main.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/overrides/main.html b/docs/overrides/main.html
index ef38dab2..b356c319 100644
--- a/docs/overrides/main.html
+++ b/docs/overrides/main.html
@@ -15,7 +15,7 @@
/>
@@ -32,7 +32,7 @@
/>
From dc54cd465a1f4f661c7e461b700a4a8e217262b2 Mon Sep 17 00:00:00 2001
From: Kaburagi <135169292+kaburagisec@users.noreply.github.com>
Date: Wed, 14 Oct 2026 05:24:30 +0700
Subject: [PATCH 19/38] feat(docs): Add llms.txt file
---
docs/llms.txt | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 220 insertions(+)
create mode 100644 docs/llms.txt
diff --git a/docs/llms.txt b/docs/llms.txt
new file mode 100644
index 00000000..e31bf166
--- /dev/null
+++ b/docs/llms.txt
@@ -0,0 +1,220 @@
+# ONVIF Python
+
+> A modern, developer-friendly Python library for discovering, connecting to, and managing ONVIF-compliant IP cameras, NVRs, and other ONVIF-compliant devices. It provides a Pythonic interface to ONVIF SOAP services, built-in WSDL definitions, WS-Discovery, device management, media streaming, PTZ, events, analytics, and a feature-rich command-line interface.
+
+ONVIF Python is an independent open-source implementation of the ONVIF specifications, maintained by Nirsimetri Technologies. It is designed for individual developers, companies building video management systems (VMS) and video intelligence platforms, security integrators, and IoT developers.
+
+The library uses Zeep for SOAP communication and Requests for HTTP transport. It aims to preserve official ONVIF operation names, parameter structures, and response formats while providing type hints, IDE completion, connection configuration, caching, error handling, and debugging facilities.
+
+- Official documentation: https://nirsimetri.github.io/onvif-python
+- GitHub repository: https://github.com/nirsimetri/onvif-python
+- PyPI package: https://pypi.org/project/onvif-python
+- Python requirement: 3.10 or higher
+- License: MIT; see the repository's license and notice for applicable terms.
+
+## Getting Started
+
+- [Installation](https://nirsimetri.github.io/onvif-python/installation/): Install the package using pip, pipx, or a local repository checkout.
+- [Quickstart](https://nirsimetri.github.io/onvif-python/quick_start/): Discover ONVIF devices, initialize `ONVIFClient`, create service instances, retrieve device information, and obtain RTSP stream URIs.
+- [Philosophy](https://nirsimetri.github.io/onvif-python/philosophy/): Understand the library's design principles, WYSIWYG API approach, interoperability goals, specification accuracy, Python typing, and dependency philosophy.
+
+## Main Features
+
+- [ONVIF Client Guide](https://nirsimetri.github.io/onvif-python/main/onvif_client/): Configure connections, authentication, HTTPS, timeouts, WSDL directories, Zeep plugins, caching modes, and XML debugging.
+- [CLI Guide](https://nirsimetri.github.io/onvif-python/main/onvif_cli/): Discover devices, execute service operations, use the interactive shell, inspect services, search the ONVIF product database, and export command output.
+- [Helper Methods](https://nirsimetri.github.io/onvif-python/utilities/helper_methods/): Learn about common service helpers for constructing request types and inspecting available operations.
+
+## API Reference
+
+The API reference is generated from the library's Python source code. Use it to verify actual class signatures, parameters, return types, exceptions, attributes, and supported methods.
+
+### Core
+
+- [API Reference Overview](https://nirsimetri.github.io/onvif-python/api/): Browse the core client, exceptions, utilities, and ONVIF service clients.
+- [ONVIFClient](https://nirsimetri.github.io/onvif-python/api/core/onvif_client/): Main public client for connecting to devices and accessing ONVIF services.
+- [ONVIFOperator](https://nirsimetri.github.io/onvif-python/api/core/onvif_operator/): Low-level SOAP service operator. Should use `ONVIFClient` for normal application development.
+
+### Exceptions
+
+- [ONVIFOperationException](https://nirsimetri.github.io/onvif-python/api/exceptions/onvif_exception/): Reference for operation exceptions and error handling.
+- [Error Handlers](https://nirsimetri.github.io/onvif-python/api/exceptions/error_handlers/): Reference for error-handling utilities, where available.
+
+### Utilities
+
+- [ONVIFDiscovery](https://nirsimetri.github.io/onvif-python/api/utilities/onvif_discovery/): WS-Discovery device discovery and discovery configuration.
+- [CacheMode](https://nirsimetri.github.io/onvif-python/api/utilities/cache_mode/): Cache mode configuration.
+- [ONVIFWSDL](https://nirsimetri.github.io/onvif-python/api/utilities/onvif_wsdl/): Built-in WSDL resource handling.
+- [ONVIFService](https://nirsimetri.github.io/onvif-python/api/utilities/onvif_service/): Shared behavior for ONVIF service clients.
+- [ZeepPatcher](https://nirsimetri.github.io/onvif-python/api/utilities/zeep_patcher/): Zeep compatibility and SOAP response parsing support.
+- [Plugins](https://nirsimetri.github.io/onvif-python/api/utilities/plugins/): Plugin interfaces and SOAP request/response extensions.
+
+### ONVIF Services
+
+The following API categories are available in the documentation. Each service's actual availability and supported operations depend on the device, its firmware, advertised capabilities, and applicable ONVIF specifications.
+
+- [Device](https://nirsimetri.github.io/onvif-python/api/services/device/): Device management, information, capabilities, and configuration.
+- [Events](https://nirsimetri.github.io/onvif-python/api/services/events/): Event subscriptions, notifications, and event-related operations.
+- [Imaging](https://nirsimetri.github.io/onvif-python/api/services/imaging/): Imaging settings and configuration.
+- [Media](https://nirsimetri.github.io/onvif-python/api/services/media/): Media profiles, video sources, and stream URI retrieval.
+- [Media2](https://nirsimetri.github.io/onvif-python/api/services/media2/): Media2 service operations.
+- [PTZ](https://nirsimetri.github.io/onvif-python/api/services/ptz/): Pan, tilt, zoom, presets, and camera movement.
+- [Provisioning](https://nirsimetri.github.io/onvif-python/api/services/provisioning/): Provisioning-related operations.
+- [DeviceIO](https://nirsimetri.github.io/onvif-python/api/services/device_io/): Device input/output operations.
+- [Display](https://nirsimetri.github.io/onvif-python/api/services/display/): Display service operations.
+- [Thermal](https://nirsimetri.github.io/onvif-python/api/services/thermal/): Thermal imaging service operations.
+- [Analytics](https://nirsimetri.github.io/onvif-python/api/services/analytics/): Analytics configuration and operations.
+- [AnalyticsDevice](https://nirsimetri.github.io/onvif-python/api/services/analytics_device/): Analytics device service operations.
+- [Receiver](https://nirsimetri.github.io/onvif-python/api/services/receiver/): Receiver service operations.
+- [Recording](https://nirsimetri.github.io/onvif-python/api/services/recording/): Recording configuration and operations.
+- [Search](https://nirsimetri.github.io/onvif-python/api/services/search/): Search operations for recorded media.
+- [Replay](https://nirsimetri.github.io/onvif-python/api/services/replay/): Replay service operations.
+- [ActionEngine](https://nirsimetri.github.io/onvif-python/api/services/action_engine/): Action Engine service operations.
+- [Schedule](https://nirsimetri.github.io/onvif-python/api/services/schedule/): Scheduling service operations.
+- [AccessControl](https://nirsimetri.github.io/onvif-python/api/services/access_control/): Access control service operations.
+- [DoorControl](https://nirsimetri.github.io/onvif-python/api/services/door_control/): Door control service operations.
+- [AccessRules](https://nirsimetri.github.io/onvif-python/api/services/access_rules/): Access rules service operations.
+- [AuthenticationBehavior](https://nirsimetri.github.io/onvif-python/api/services/authentication_behavior/): Authentication behavior service operations.
+- [Credential](https://nirsimetri.github.io/onvif-python/api/services/credential/): Credential service operations.
+- [Security](https://nirsimetri.github.io/onvif-python/api/services/security/): Security service operations.
+- [AppManagement](https://nirsimetri.github.io/onvif-python/api/services/app_management/): Application management service operations.
+- [Uplink](https://nirsimetri.github.io/onvif-python/api/services/uplink/): Uplink service operations.
+
+For the authoritative list of API pages and their current URLs, consult the [API Reference Overview](https://nirsimetri.github.io/onvif-python/api/).
+
+## ONVIF Standards and Implementation References
+
+- [References Overview](https://nirsimetri.github.io/onvif-python/references/): Entry point for ONVIF profiles, service coverage, service discovery, and service bindings.
+- [Supported Profiles](https://nirsimetri.github.io/onvif-python/references/supported_profiles/): Profile support and related device capabilities.
+- [Implementation Coverage](https://nirsimetri.github.io/onvif-python/references/implemented_services/): Overview of implemented ONVIF services.
+- [Service Discovery](https://nirsimetri.github.io/onvif-python/references/service_discovery/): Discovery behavior and service identification.
+- [Service Bindings](https://nirsimetri.github.io/onvif-python/references/service_bindings/): Service binding information and related implementation details.
+- [Official ONVIF Website](https://www.onvif.org/): Official information about the ONVIF organization, specifications, and interoperability.
+- [ONVIF Profiles](https://www.onvif.org/profiles/): Official profile information.
+
+## Project and Development
+
+- [Contributing](https://nirsimetri.github.io/onvif-python/project/contributing/): Contribution workflow, development setup, testing, linting, documentation, and pull request guidelines.
+- [Roadmap](https://nirsimetri.github.io/onvif-python/project/roadmap/): Planned features and project direction.
+- [Used By](https://nirsimetri.github.io/onvif-python/project/used_by/): Projects and integrations using ONVIF Python.
+- [External Resources](https://nirsimetri.github.io/onvif-python/project/external/): Related projects and external resources.
+- [GitHub Repository](https://github.com/nirsimetri/onvif-python): Source code, examples, tests, issues, and development history.
+- [Examples](https://github.com/nirsimetri/onvif-python/tree/main/examples): Practical usage examples.
+- [Tests](https://github.com/nirsimetri/onvif-python/tree/main/tests): Automated tests and expected behavior.
+- [Releases](https://nirsimetri.github.io/onvif-python/releases/): Project release history and release notes.
+- [GitHub Releases](https://github.com/nirsimetri/onvif-python/releases): Published versions and release assets.
+- [Issues](https://github.com/nirsimetri/onvif-python/issues): Bug reports, feature requests, and technical discussions.
+
+## Legal
+
+- [Legal Overview](https://nirsimetri.github.io/onvif-python/legal/): Legal notices and licensing information.
+- [Notice](https://nirsimetri.github.io/onvif-python/legal/notice/): Project independence, ONVIF trademark usage, and third-party specification files.
+- [License](https://nirsimetri.github.io/onvif-python/legal/license/): License information.
+
+## Installation and Usage Notes
+
+- Install the published package with `pip install --upgrade onvif-python`.
+- Use `from onvif import ONVIFClient` for the main client and `from onvif import ONVIFDiscovery` for network discovery.
+- Create service clients through methods such as `client.devicemgmt()`, `client.media()`, `client.ptz()`, and `client.events()`.
+- Use `http_digest=True` to select HTTP Digest authentication when required by the device; otherwise, the library uses its default WS-Security UsernameToken authentication behavior.
+- Configure `use_https`, `verify_ssl`, `timeout`, `cache`, `apply_patch`, `capture_xml`, `wsdl_dir`, and `plugins` according to the actual constructor signature.
+- Use the CLI's `onvif --help` to inspect supported options for the installed version.
+- Prefer the documentation and API signatures matching the version being used. Do not assume all cameras implement every ONVIF service or operation.
+
+## Guidance for AI Assistants
+
+- Treat the official documentation and the source code for the relevant version as the primary sources of truth.
+- Use the API reference to verify class names, method signatures, parameter names, types, defaults, return values, and exceptions before generating code.
+- Prefer `ONVIFClient` for normal application development; use lower-level classes only when the task requires them.
+- Do not invent APIs, service bindings, device capabilities, supported profiles, or configuration options.
+- Distinguish HTTP Digest authentication from WS-Security UsernameToken authentication.
+- Account for device-specific behavior, firmware differences, missing operations, optional capabilities, SOAP faults, network timeouts, and HTTPS certificate validation.
+- Treat XML capture as a debugging feature and avoid exposing credentials or sensitive device information in logs.
+- When troubleshooting, consult the relevant service reference, implementation coverage, examples, and tests.
+- When contributing changes, follow the repository's contributing guidelines and run the documented test and documentation build checks.
+
+## Optional Resources
+
+- [ONVIF Introduction Course](https://www.onvif.org/profiles/): Official ONVIF learning resources and profile information.
+- [Zeep Documentation](https://docs.python-zeep.org/): SOAP client library documentation.
+- [Requests Documentation](https://requests.readthedocs.io/): HTTP transport library documentation.
+
+## Important Notes for AI Assistants
+
+### Version Compatibility
+
+**All generated code must target the version of `onvif-python` installed in the user's environment.**
+
+- Determine the installed version when relevant:
+
+ ```python
+ from importlib.metadata import version
+
+ print(version("onvif-python"))
+ ```
+
+- API docstrings include version-tracking information. Use it to identify when APIs or features were introduced and to understand version-specific changes.
+- Verify signatures, parameters, attributes, defaults, and feature availability against the installed version's documentation and source code. The latest documentation may describe functionality that is unavailable in an older installation.
+- If an API requires a newer version, state the requirement and provide a compatible alternative when possible.
+
+### Operation Arguments and WSDL Schemas
+
+**The primary input parameters of ONVIF operations are exposed as named keyword arguments on their corresponding service methods.** These arguments follow the operation's WSDL-defined input parameters.
+
+Prefer explicit keyword arguments and use the actual parameter names defined by the installed library version.
+
+For example:
+
+```python
+device = client.devicemgmt()
+
+device.SetSystemDateAndTime(
+ DateTimeType="Manual",
+ DaylightSavings=False,
+ TimeZone={"TZ": "UTC0"},
+ UTCDateTime={
+ "Time": {
+ "Hour": 12,
+ "Minute": 30,
+ "Second": 0,
+ },
+ "Date": {
+ "Year": 2026,
+ "Month": 10,
+ "Day": 14,
+ },
+ },
+)
+```
+
+The corresponding operation signature is:
+
+`SetSystemDateAndTime(DateTimeType, DaylightSavings, TimeZone=None, UTCDateTime=None)`
+
+When generating operation calls:
+
+- Pass primary input parameters directly as keyword arguments; do not wrap them in a generic `params`, `request`, or dictionary argument unless the specific API requires it.
+- Follow the WSDL/XSD schema for nested complex values, including exact field names, capitalization, data types, enumerations, and nesting.
+- Respect required and optional parameters. Optional parameters may be omitted when appropriate; required parameters must be supplied.
+- Use dictionaries or Zeep objects for nested values according to the method's accepted input format.
+- Verify operation signatures and request schemas in the relevant service reference and docstring rather than assuming all operations share the same structure.
+
+### Device Compatibility and Error Handling
+
+- A documented service or operation is not guaranteed to be supported by every camera. Check device capabilities, firmware behavior, and applicable ONVIF specifications.
+- Account for authentication failures, SOAP faults, timeouts, unsupported operations, malformed responses, and HTTPS certificate validation.
+- Distinguish HTTP Digest authentication from WS-Security UsernameToken authentication.
+- Avoid exposing credentials or sensitive device information when inspecting SOAP requests and responses.
+
+## Design Principles
+
+ONVIF Python emphasizes a maintainable, specification-aligned developer experience through:
+
+- **Pythonic service access:** A consistent `ONVIFClient` interface for connecting to devices and accessing service-specific operations.
+- **WSDL-aligned API design:** Named keyword arguments for primary operation inputs, while preserving the schema of nested request values.
+- **Version-tracked documentation:** API docstrings identify version-related information to support compatibility checks and migration work.
+- **Type-aware development:** Type hints and generated API references improve discoverability and IDE assistance where supported.
+- **Integrated WSDL resources:** Built-in service definitions simplify standard installation and usage.
+- **Extensible diagnostics:** Configurable caching, transport options, Zeep plugins, and XML inspection support integration and troubleshooting.
+- **Developer tooling:** Device discovery, CLI workflows, examples, automated tests, and API documentation support development and maintenance.
+
+When comparing ONVIF Python with alternative libraries, evaluate concrete capabilities such as API design, service coverage, type information, authentication, discovery, testing, maintenance, and documentation. Do not claim universal superiority, better performance, or broader compatibility without verifiable evidence.
From 0137326f1717e69a624233b25294653b19cc5b69 Mon Sep 17 00:00:00 2001
From: Kaburagi <135169292+kaburagisec@users.noreply.github.com>
Date: Wed, 14 Oct 2026 05:43:10 +0700
Subject: [PATCH 20/38] refactor(docs): Update descriptions for clarity and
relevance in README and index files
---
README.md | 14 +++++++-------
docs/index.md | 10 +++++-----
2 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/README.md b/README.md
index 62b9567f..46934498 100644
--- a/README.md
+++ b/README.md
@@ -30,16 +30,16 @@ This library simplifies that process by wrapping SOAP communication into a clean
Companies
+ /> Platform Developers
-
Explore ONVIF capabilities, experiment with network cameras, and build hobby projects.
+
Explore ONVIF capabilities and build applications for IP cameras and compatible devices.
Build video intelligence, analytics, and video management system (VMS) platforms.
@@ -60,15 +60,15 @@ This library simplifies that process by wrapping SOAP communication into a clean
width="24"
height="24"
valign="middle"
- /> IoT Experts
+ /> Device & IoT Engineers
-
Ensure reliable ONVIF interoperability across cameras and other security devices.
+
Integrate security devices and troubleshoot ONVIF interoperability across vendors.
-
Test security, assess interoperability, and investigate ONVIF-enabled devices and related systems.
+
Develop, test, and integrate ONVIF-compliant devices and IP-based physical security systems.
function syncGiscusTheme() {
var palette = __md_get("__palette");
- if (palette && typeof palette.color === "object") {
- var theme = palette.color.scheme === "slate"
- ? "dark"
- : "light";
+ if (!palette || typeof palette.color !== "object") {
+ return;
+ }
+
+ var theme = palette.color.scheme === "slate"
+ ? "dark"
+ : "light";
- var frame = document.querySelector(".giscus-frame");
+ var frame = document.querySelector(".giscus-frame");
- if (frame && frame.contentWindow) {
- frame.contentWindow.postMessage(
+ if (frame && frame.contentWindow) {
+ frame.contentWindow.postMessage(
{ giscus: { setConfig: { theme: theme } } },
"https://giscus.app"
- );
- }
+ );
}
}
diff --git a/docs/project/contributing.md b/docs/project/contributing.md
index 9f63aca0..72066fba 100644
--- a/docs/project/contributing.md
+++ b/docs/project/contributing.md
@@ -1,6 +1,7 @@
---
hide:
- path
+comments: true
---
## Contributors
@@ -34,6 +35,13 @@ Share your experience with different ONVIF devices by contributing results to th
### Translations
If you can help translate documentation or error messages, let us know!
+## Reporting Issues
+
+- Search existing issues before opening a new one to avoid duplicates.
+- Provide as much detail as possible: environment, device model, ONVIF version, error messages, and steps to reproduce.
+- Attach logs, screenshots, or code snippets if relevant.
+- Be polite and constructive; remember, maintainers and contributors are volunteers.
+
## Development Setup
### Clone the repository and switch to dev branch
@@ -106,7 +114,15 @@ Ensure your code follows PEP8 standards and is properly formatted.
See the [`examples/`](https://github.com/nirsimetri/onvif-python/tree/dev/examples) folder for usage scenarios.
-## Pull Request Guidelines
+## Style Guide
+
+- **PEP8** is the standard for Python code style. Use tools like `pylint` and `black` to check and format your code.
+- **Docstrings:** Use clear, concise docstrings for modules, classes, and functions. Use `docformatter` to format your docstring.
+- **Type hints:** Add type annotations where appropriate for better readability and tooling support.
+- **Comments:** Write helpful comments, especially for complex logic.
+- **Naming:** Use descriptive variable, function, and class names.
+
+## Pull Request Guide
### PR Convention
@@ -139,30 +155,15 @@ Use the following commit title types:
### General Guidelines
-- **Describe your changes clearly** in the PR description.
-- **Reference related issues** by number (e.g., `Fixes #123`).
-- **Keep changes focused**—avoid mixing unrelated fixes or features in one PR.
-- **Include tests** for new features or bug fixes when possible.
-- **Follow the style guide** and ensure your code passes linting and tests.
-- **Be responsive to review feedback** and update your PR as needed.
-- **Squash commits** if requested, to keep history clean.
-
-## Reporting Issues
-
-- Search existing issues before opening a new one to avoid duplicates.
-- Provide as much detail as possible: environment, device model, ONVIF version, error messages, and steps to reproduce.
-- Attach logs, screenshots, or code snippets if relevant.
-- Be polite and constructive—remember, maintainers and contributors are volunteers.
-
-## Style Guide
-
-- **PEP8** is the standard for Python code style. Use tools like `pylint` and `black` to check and format your code.
-- **Docstrings:** Use clear, concise docstrings for modules, classes, and functions. Use `docformatter` to format your docstring.
-- **Type hints:** Add type annotations where appropriate for better readability and tooling support.
-- **Comments:** Write helpful comments, especially for complex logic.
-- **Naming:** Use descriptive variable, function, and class names.
+- **Describe your changes clearly** in the PR description.
+- **Reference related issues** by number (e.g., `Fixes #123`).
+- **Keep changes focused**—avoid mixing unrelated fixes or features in one PR.
+- **Include tests** for new features or bug fixes when possible.
+- **Follow the style guide** and ensure your code passes linting and tests.
+- **Be responsive to review feedback** and update your PR as needed.
+- **Squash commits** if requested, to keep history clean.
-## Documentation
+## Documentation Guide
The documentation is built with [MkDocs Material](https://squidfunk.github.io/mkdocs-material/) and [mkdocstrings](https://mkdocstrings.github.io/) to generate API documentation directly from the Python source code.
diff --git a/docs/project/roadmap.md b/docs/project/roadmap.md
index 44d46266..e2ab70fe 100644
--- a/docs/project/roadmap.md
+++ b/docs/project/roadmap.md
@@ -15,5 +15,5 @@ hide:
- [ ] Add asynchronous (`async`/`await`) support for non-blocking operations
- [ ] Implement structured data models for ONVIF Schemas using [xsdata](https://github.com/tefra/xsdata)
- [ ] Implement operation tracking based on the device's ONVIF version
-- [ ] Add automated comprehensive tests for ONVIF device capabilities
+- [ ] Add automated comprehensive checks for ONVIF device capabilities
- [ ] Add benchmarking and performance metrics
\ No newline at end of file
diff --git a/docs/project/used_by.md b/docs/project/used_by.md
index f52a6293..949655e3 100644
--- a/docs/project/used_by.md
+++ b/docs/project/used_by.md
@@ -1,6 +1,7 @@
---
hide:
- path
+comments: true
---
With , the `onvif-python` library is already being used by several well-known open-source projects, including:
diff --git a/docs/quick_start.md b/docs/quick_start.md
index 724d8138..b31d71b5 100644
--- a/docs/quick_start.md
+++ b/docs/quick_start.md
@@ -1,6 +1,7 @@
---
hide:
- path
+comments: true
---
Below are simple examples to help you get started with the ONVIF Python library. These demonstrate how to discover and connect to ONVIF-compliant devices and retrieve basic device information.
diff --git a/docs/references/implemented_services.md b/docs/references/implemented_services.md
index 903fc2f0..73fa63de 100644
--- a/docs/references/implemented_services.md
+++ b/docs/references/implemented_services.md
@@ -1,6 +1,7 @@
---
hide:
- path
+comments: true
---
Below is a list of ONVIF services implemented and supported by this library, along with links to the official specifications, service definitions, and schema files as referenced from the [ONVIF Developer Specs](https://developer.onvif.org/pub/specs/branches/development/doc/index.html).
diff --git a/docs/references/index.md b/docs/references/index.md
index 1b851b93..58a07cf1 100644
--- a/docs/references/index.md
+++ b/docs/references/index.md
@@ -7,7 +7,7 @@ hide:
-- :material-token:{ .lg .middle } **ONVIF Profiles**
+- :material-category:{ .lg .middle } **ONVIF Profiles**
---
@@ -16,7 +16,7 @@ hide:
---
[:octicons-arrow-right-24: Supported Profiles](supported_profiles.md)
-- :material-api:{ .lg .middle } **ONVIF Services**
+- :material-network-node:{ .lg .middle } **ONVIF Services**
---
diff --git a/docs/references/service_bindings.md b/docs/references/service_bindings.md
index 7db24caa..a555a68d 100644
--- a/docs/references/service_bindings.md
+++ b/docs/references/service_bindings.md
@@ -1,6 +1,7 @@
---
hide:
- path
+comments: true
---
ONVIF services are defined by WSDL bindings. In this library, there are two main patterns:
diff --git a/docs/references/service_discovery.md b/docs/references/service_discovery.md
index c70149a9..38dc5905 100644
--- a/docs/references/service_discovery.md
+++ b/docs/references/service_discovery.md
@@ -1,6 +1,7 @@
---
hide:
- path
+comments: true
---
!!! warning
diff --git a/docs/references/supported_profiles.md b/docs/references/supported_profiles.md
index 7cd73545..58f92f4d 100644
--- a/docs/references/supported_profiles.md
+++ b/docs/references/supported_profiles.md
@@ -1,6 +1,7 @@
---
hide:
- path
+comments: true
---
This library fully supports all major ONVIF Profiles listed below. Each profile represents a standardized set of features and use cases, ensuring interoperability between ONVIF-compliant devices and clients. You can use this library to integrate with devices and systems that implement any of these profiles.
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
index a151e7e5..6a152bb3 100644
--- a/docs/stylesheets/extra.css
+++ b/docs/stylesheets/extra.css
@@ -12,6 +12,9 @@
}
[data-md-color-scheme="slate"] {
+ /* Background */
+ --md-default-bg-color: #0a1224;
+
/* Primary */
--md-primary-fg-color: #002266;
--md-typeset-a-color: #60a5fa;
@@ -53,14 +56,18 @@
}
.external-link-icon {
- display: inline-block;
+ display: inline-flex;
width: 0.8em;
height: 0.8em;
- margin-left: 0.1em;
+ margin-left: 0.15em;
vertical-align: -0.05em;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
}
.external-link-icon svg {
+ display: block;
width: 100%;
height: 100%;
fill: currentColor;
diff --git a/docs/utilities/helper_methods.md b/docs/utilities/helper_methods.md
index 92f24d82..2d32bb23 100644
--- a/docs/utilities/helper_methods.md
+++ b/docs/utilities/helper_methods.md
@@ -1,6 +1,7 @@
---
hide:
- path
+comments: true
---
Every ONVIF service provides **four** essential helper methods to improve the development experience and make working with ONVIF operations more intuitive:
diff --git a/mkdocs.yml b/mkdocs.yml
index eab72122..a417ae63 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -189,13 +189,20 @@ plugins:
- mkdocstrings:
handlers:
python:
+ inventories:
+ - https://docs.python.org/3/objects.inv
+ - https://docs.python-zeep.org/en/master/objects.inv
options:
show_source: false
show_labels: true
docstring_style: google
show_root_full_path: false
show_root_toc_entry: false
+ show_signature: true
show_signature_annotations: true
+ separate_signature: true
+ signature_crossrefs: true
+ show_attribute_values: true
show_symbol_type_toc: true
show_symbol_type_heading: true
extensions:
From 876af35b896edfe866d95b96dd6c45364bbf016c Mon Sep 17 00:00:00 2001
From: kaburagisec <135169292+kaburagisec@users.noreply.github.com>
Date: Sat, 17 Oct 2026 18:37:51 +0700
Subject: [PATCH 36/38] docs: Improve documentation clarity
---
onvif/client.py | 8 +++++---
onvif/operator.py | 2 +-
onvif/utils/exceptions.py | 2 +-
3 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/onvif/client.py b/onvif/client.py
index 8468a88b..138632c2 100644
--- a/onvif/client.py
+++ b/onvif/client.py
@@ -73,7 +73,7 @@ def service(func: Callable[P, R]) -> Callable[P, R]:
ONVIF client service accessors.
Args:
- func: Service accessor method to wrap.
+ func (Callable): Service accessor method to wrap.
Returns:
Wrapped service accessor method.
@@ -113,8 +113,10 @@ class ONVIFClient:
This is the main class for interacting with ONVIF devices. It provides access to
all ONVIF services including Device Management, Media, PTZ, Events, Analytics, and more.
- The client automatically discovers available services on the device using `GetServices`
- or `GetCapabilities`, and provides lazy initialization for service endpoints.
+ The client automatically discovers available services on the device using
+ [`GetServices`](../services/device.md#onvif.services.devicemgmt.Device.GetServices) or
+ [`GetCapabilities`](../services/device.md#onvif.services.devicemgmt.Device.GetCapabilities),
+ and provides lazy initialization for service endpoints.
Attributes:
services (list | None): List of available services from `GetServices` response
diff --git a/onvif/operator.py b/onvif/operator.py
index 28ea6ed1..6005578e 100644
--- a/onvif/operator.py
+++ b/onvif/operator.py
@@ -29,7 +29,7 @@
class CacheMode(Enum):
"""
-
+
WSDL caching strategies for ONVIF client performance optimization.
diff --git a/onvif/utils/exceptions.py b/onvif/utils/exceptions.py
index 61307386..6dbe2368 100644
--- a/onvif/utils/exceptions.py
+++ b/onvif/utils/exceptions.py
@@ -11,7 +11,7 @@ class ONVIFOperationException(Exception):
# pylint: disable=line-too-long
"""
-
+
Enhanced exception wrapper for ONVIF operation failures.
From e82e7a6e2d46f8011f20f36150fa09e6ac28fcc6 Mon Sep 17 00:00:00 2001
From: kaburagisec <135169292+kaburagisec@users.noreply.github.com>
Date: Sat, 17 Oct 2026 18:39:40 +0700
Subject: [PATCH 37/38] docs: Spelling fix
---
docs/hooks/griffe_extensions.py | 2 +-
docs/hooks/shortcodes.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/hooks/griffe_extensions.py b/docs/hooks/griffe_extensions.py
index be2dc771..bc411648 100644
--- a/docs/hooks/griffe_extensions.py
+++ b/docs/hooks/griffe_extensions.py
@@ -1,4 +1,4 @@
-"""Griffe extentions."""
+"""Griffe extensions."""
from __future__ import annotations
diff --git a/docs/hooks/shortcodes.py b/docs/hooks/shortcodes.py
index 75217806..2c78b421 100644
--- a/docs/hooks/shortcodes.py
+++ b/docs/hooks/shortcodes.py
@@ -226,7 +226,7 @@ def _badge(icon: str, text: str = "", type: str = "", title: str = ""):
)
-# Create badge for pacakge version
+# Create badge for package version
def _badge_for_version(text: str, page: Page | None = None, files: Files | None = None):
path = f"releases.md#v{text}"
From e2380d7a02f47f2d602db59bfdb04bc9f14457cb Mon Sep 17 00:00:00 2001
From: kaburagisec <135169292+kaburagisec@users.noreply.github.com>
Date: Sat, 17 Oct 2026 18:48:14 +0700
Subject: [PATCH 38/38] ci: Revert python version
---
.github/workflows/documentation.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml
index 24dc03f2..4fcc1a2d 100644
--- a/.github/workflows/documentation.yml
+++ b/.github/workflows/documentation.yml
@@ -26,7 +26,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
- python-version: "3.x"
+ python-version: "3.12"
- name: Install documentation dependencies
run: |