onvif-python 0.1.8__tar.gz → 0.1.9__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.
- {onvif_python-0.1.8/onvif_python.egg-info → onvif_python-0.1.9}/PKG-INFO +6 -4
- {onvif_python-0.1.8 → onvif_python-0.1.9}/README.md +5 -3
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/cli/interactive.py +10 -2
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/cli/main.py +2 -2
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/operator.py +101 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/analyticsdevice.py +4 -4
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/service.py +62 -14
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/wsdl.py +40 -44
- onvif_python-0.1.9/onvif/wsdl/LICENSE.md +232 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9/onvif_python.egg-info}/PKG-INFO +6 -4
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif_python.egg-info/SOURCES.txt +1 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/pyproject.toml +1 -1
- {onvif_python-0.1.8 → onvif_python-0.1.9}/LICENSE.md +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/MANIFEST.in +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/__init__.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/cli/__init__.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/cli/__main__.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/cli/utils.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/client.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/__init__.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/accesscontrol.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/accessrules.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/actionengine.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/analytics/analytics.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/analytics/ruleengine.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/appmgmt.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/authenticationbehavior.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/credential.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/deviceio.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/devicemgmt.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/display.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/doorcontrol.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/events/events.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/events/notification.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/events/pullpoint.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/events/subscription.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/imaging.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/media.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/media2.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/provisioning.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/ptz.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/receiver.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/recording.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/replay.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/schedule.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/search.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/security/advancedsecurity.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/security/authorizationserver.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/security/dot1x.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/security/jwt.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/security/keystore.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/security/mediasigning.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/security/tlsserver.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/thermal.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/uplink.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/__init__.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/discovery.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/error_handlers.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/exceptions.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/xml_capture.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/zeep.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/accesscontrol/wsdl/index.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/accessrules/wsdl/accessrules.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/accessrules/wsdl/index.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/actionengine.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/advancedsecurity/wsdl/index.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/analyticsdevice.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/appmgmt/wsdl/appmgmt.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/appmgmt/wsdl/index.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/authenticationbehavior/wsdl/authenticationbehavior.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/authenticationbehavior/wsdl/index.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/credential/wsdl/credential.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/credential/wsdl/index.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/device/wsdl/devicemgmt.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/deviceio.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/display/display.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/display/wsdl/index.htm +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/display.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/doorcontrol/wsdl/index.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/events/wsdl/bw-2-vs-mod.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/events/wsdl/event-vs.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/events/wsdl/event.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/events/wsdl/index.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/federatedsearch.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/media/wsdl/media.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/pacs/accesscontrol.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/pacs/doorcontrol.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/pacs/types.xsd +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/provisioning/wsdl/provisioning.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/receiver.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/recording.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/replay.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/schedule/wsdl/index.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/schedule/wsdl/schedule.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/schema/common.xsd +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/schema/metadatastream.xsd +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/schema/onvif.xsd +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/search.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/thermal/wsdl/index.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/thermal/wsdl/thermal.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/topics/topicns.xml +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/uplink/wsdl/index.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/uplink/wsdl/uplink.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/analytics/humanbody.xsd +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/analytics/humanface.xsd +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/analytics/index.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/analytics/radiometry.xsd +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/analytics/rules.xsd +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/analytics/wsdl/analytics.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/analytics/wsdl/index.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/imaging/wsdl/imaging.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/media/wsdl/index.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/media/wsdl/media.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/ptz/wsdl/ptz.wsdl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/util/federated_search_documentation.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/util/fedsearch-docu-viewer.xsl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/util/onvif-wsdl-viewer.xsl +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/util/operationIndex.html +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif_python.egg-info/dependency_links.txt +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif_python.egg-info/entry_points.txt +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif_python.egg-info/requires.txt +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif_python.egg-info/top_level.txt +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/setup.cfg +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/setup.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/tests/test_client.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/tests/test_core.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/tests/test_error_handlers.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/tests/test_exceptions.py +0 -0
- {onvif_python-0.1.8 → onvif_python-0.1.9}/tests/test_wsdl_map.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: onvif-python
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.9
|
|
4
4
|
Summary: A modern Python library for ONVIF-compliant devices
|
|
5
5
|
Author-email: Nirsimetri Technologies® <open@nirsimetri.com>
|
|
6
6
|
Maintainer: Kaburagi
|
|
@@ -47,7 +47,7 @@ Dynamic: license-file
|
|
|
47
47
|
|
|
48
48
|
[](https://app.codacy.com/gh/nirsimetri/onvif-python/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
|
|
49
49
|
[](https://deepwiki.com/nirsimetri/onvif-python)
|
|
50
|
-
[](https://pypi.org/project/onvif-python/)
|
|
51
51
|
[](https://clickpy.clickhouse.com/dashboard/onvif-python)
|
|
52
52
|
<br>
|
|
53
53
|
[](https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml)
|
|
@@ -254,7 +254,7 @@ usage: onvif [-h] [--host HOST] [--port PORT] [--username USERNAME] [--password
|
|
|
254
254
|
[--health-check-interval HEALTH_CHECK_INTERVAL] [--version]
|
|
255
255
|
[service] [method] [params ...]
|
|
256
256
|
|
|
257
|
-
ONVIF Terminal Client — v0.1.
|
|
257
|
+
ONVIF Terminal Client — v0.1.9
|
|
258
258
|
https://github.com/nirsimetri/onvif-python
|
|
259
259
|
|
|
260
260
|
positional arguments:
|
|
@@ -318,7 +318,7 @@ Examples:
|
|
|
318
318
|
<summary><b>2. Interactive Shell</b></summary>
|
|
319
319
|
|
|
320
320
|
```bash
|
|
321
|
-
ONVIF Interactive Shell — v0.1.
|
|
321
|
+
ONVIF Interactive Shell — v0.1.9
|
|
322
322
|
https://github.com/nirsimetri/onvif-python
|
|
323
323
|
|
|
324
324
|
Basic Commands:
|
|
@@ -863,6 +863,7 @@ Below is a list of ONVIF services implemented and supported by this library, alo
|
|
|
863
863
|
| 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 |
|
|
864
864
|
| 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 |
|
|
865
865
|
| 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) <br> [humanbody.xsd](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver20/analytics/humanbody.xsd) <br> [humanface.xsd](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver20/analytics/humanface.xsd) | ✅ Complete |
|
|
866
|
+
| 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 |
|
|
866
867
|
| 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 |
|
|
867
868
|
| 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 |
|
|
868
869
|
| 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 |
|
|
@@ -1023,6 +1024,7 @@ This project is an **independent open-source implementation** of the [ONVIF](htt
|
|
|
1023
1024
|
- Use of the ONVIF trademark in this repository is solely nominative and does not imply any partnership, certification, or official status.
|
|
1024
1025
|
- This project includes WSDL/XSD/HTML files from the official ONVIF specifications.
|
|
1025
1026
|
- These files are © ONVIF and are redistributed here for interoperability purposes.
|
|
1027
|
+
- The WSDL files in the [`wsdl/`](./onvif/wsdl) folder are distributed under the ONVIF Contributor License Agreement and Apache License 2.0. See [`LICENSE.md`](./onvif/wsdl/LICENSE.md) for details.
|
|
1026
1028
|
- All rights to the ONVIF specifications are reserved by ONVIF.
|
|
1027
1029
|
|
|
1028
1030
|
If you require certified ONVIF-compliant devices or clients, please refer to the official [ONVIF conformant product list](https://www.onvif.org/conformant-products/). For authoritative reference and the latest official ONVIF specifications, please consult the [ONVIF Official Specifications](https://www.onvif.org/profiles/specifications/specification-history/).
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
[](https://app.codacy.com/gh/nirsimetri/onvif-python/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
|
|
6
6
|
[](https://deepwiki.com/nirsimetri/onvif-python)
|
|
7
|
-
[](https://pypi.org/project/onvif-python/)
|
|
8
8
|
[](https://clickpy.clickhouse.com/dashboard/onvif-python)
|
|
9
9
|
<br>
|
|
10
10
|
[](https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml)
|
|
@@ -211,7 +211,7 @@ usage: onvif [-h] [--host HOST] [--port PORT] [--username USERNAME] [--password
|
|
|
211
211
|
[--health-check-interval HEALTH_CHECK_INTERVAL] [--version]
|
|
212
212
|
[service] [method] [params ...]
|
|
213
213
|
|
|
214
|
-
ONVIF Terminal Client — v0.1.
|
|
214
|
+
ONVIF Terminal Client — v0.1.9
|
|
215
215
|
https://github.com/nirsimetri/onvif-python
|
|
216
216
|
|
|
217
217
|
positional arguments:
|
|
@@ -275,7 +275,7 @@ Examples:
|
|
|
275
275
|
<summary><b>2. Interactive Shell</b></summary>
|
|
276
276
|
|
|
277
277
|
```bash
|
|
278
|
-
ONVIF Interactive Shell — v0.1.
|
|
278
|
+
ONVIF Interactive Shell — v0.1.9
|
|
279
279
|
https://github.com/nirsimetri/onvif-python
|
|
280
280
|
|
|
281
281
|
Basic Commands:
|
|
@@ -820,6 +820,7 @@ Below is a list of ONVIF services implemented and supported by this library, alo
|
|
|
820
820
|
| 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 |
|
|
821
821
|
| 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 |
|
|
822
822
|
| 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) <br> [humanbody.xsd](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver20/analytics/humanbody.xsd) <br> [humanface.xsd](https://developer.onvif.org/pub/specs/branches/development/wsdl/ver20/analytics/humanface.xsd) | ✅ Complete |
|
|
823
|
+
| 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 |
|
|
823
824
|
| 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 |
|
|
824
825
|
| 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 |
|
|
825
826
|
| 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 |
|
|
@@ -980,6 +981,7 @@ This project is an **independent open-source implementation** of the [ONVIF](htt
|
|
|
980
981
|
- Use of the ONVIF trademark in this repository is solely nominative and does not imply any partnership, certification, or official status.
|
|
981
982
|
- This project includes WSDL/XSD/HTML files from the official ONVIF specifications.
|
|
982
983
|
- These files are © ONVIF and are redistributed here for interoperability purposes.
|
|
984
|
+
- The WSDL files in the [`wsdl/`](./onvif/wsdl) folder are distributed under the ONVIF Contributor License Agreement and Apache License 2.0. See [`LICENSE.md`](./onvif/wsdl/LICENSE.md) for details.
|
|
983
985
|
- All rights to the ONVIF specifications are reserved by ONVIF.
|
|
984
986
|
|
|
985
987
|
If you require certified ONVIF-compliant devices or clients, please refer to the official [ONVIF conformant product list](https://www.onvif.org/conformant-products/). For authoritative reference and the latest official ONVIF specifications, please consult the [ONVIF Official Specifications](https://www.onvif.org/profiles/specifications/specification-history/).
|
|
@@ -173,6 +173,9 @@ class InteractiveShell(cmd.Cmd):
|
|
|
173
173
|
if hasattr(args, "no_patch") and args.no_patch:
|
|
174
174
|
options_info.append(f" ZeepPatcher : {colorize('Disabled', 'red')}")
|
|
175
175
|
|
|
176
|
+
if hasattr(args, "wsdl") and args.wsdl:
|
|
177
|
+
options_info.append(f" Custom WSDL : {colorize(args.wsdl, 'yellow')}")
|
|
178
|
+
|
|
176
179
|
if (
|
|
177
180
|
hasattr(args, "health_check_interval") and args.health_check_interval != 10
|
|
178
181
|
): # 10 is default
|
|
@@ -191,7 +194,7 @@ class InteractiveShell(cmd.Cmd):
|
|
|
191
194
|
" / __ \\/ | / / | / / _/ ____/",
|
|
192
195
|
" / / / / |/ /| | / // // /_ ",
|
|
193
196
|
"/ /_/ / /| / | |/ // // __/ ",
|
|
194
|
-
"\\____/_/ |_/ |___/___/_/ v0.1.
|
|
197
|
+
"\\____/_/ |_/ |___/___/_/ v0.1.9",
|
|
195
198
|
" ",
|
|
196
199
|
]
|
|
197
200
|
|
|
@@ -1268,6 +1271,11 @@ class InteractiveShell(cmd.Cmd):
|
|
|
1268
1271
|
if hasattr(self.args, "no_patch") and self.args.no_patch:
|
|
1269
1272
|
options_info.append(f" ZeepPatcher : {colorize('Disabled', 'red')}")
|
|
1270
1273
|
|
|
1274
|
+
if hasattr(self.args, "wsdl") and self.args.wsdl:
|
|
1275
|
+
options_info.append(
|
|
1276
|
+
f" Custom WSDL : {colorize(self.args.wsdl, 'yellow')}"
|
|
1277
|
+
)
|
|
1278
|
+
|
|
1271
1279
|
if (
|
|
1272
1280
|
hasattr(self.args, "health_check_interval")
|
|
1273
1281
|
and self.args.health_check_interval != 10
|
|
@@ -1385,7 +1393,7 @@ class InteractiveShell(cmd.Cmd):
|
|
|
1385
1393
|
super().do_help(line)
|
|
1386
1394
|
else:
|
|
1387
1395
|
help_text = f"""
|
|
1388
|
-
{colorize('ONVIF Interactive Shell — v0.1.
|
|
1396
|
+
{colorize('ONVIF Interactive Shell — v0.1.9', 'cyan')}\n{colorize('https://github.com/nirsimetri/onvif-python', 'white')}
|
|
1389
1397
|
|
|
1390
1398
|
{colorize('Basic Commands:', 'yellow')}
|
|
1391
1399
|
capabilities, caps - Show device capabilities
|
|
@@ -17,7 +17,7 @@ def create_parser():
|
|
|
17
17
|
"""Create argument parser for ONVIF CLI"""
|
|
18
18
|
parser = argparse.ArgumentParser(
|
|
19
19
|
prog="onvif",
|
|
20
|
-
description=f"{colorize('ONVIF Terminal Client', 'yellow')} — v0.1.
|
|
20
|
+
description=f"{colorize('ONVIF Terminal Client', 'yellow')} — v0.1.9\nhttps://github.com/nirsimetri/onvif-python",
|
|
21
21
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
22
22
|
epilog=f"""
|
|
23
23
|
Examples:
|
|
@@ -149,7 +149,7 @@ def main():
|
|
|
149
149
|
|
|
150
150
|
# Show ONVIF CLI version
|
|
151
151
|
if args.version:
|
|
152
|
-
print(colorize("0.1.
|
|
152
|
+
print(colorize("0.1.9", "yellow"))
|
|
153
153
|
sys.exit(0)
|
|
154
154
|
|
|
155
155
|
# Validate arguments early (before discovery)
|
|
@@ -191,3 +191,104 @@ class ONVIFOperator:
|
|
|
191
191
|
except Exception as e:
|
|
192
192
|
# logging.error(f"ONVIF call error in {method}: {e}")
|
|
193
193
|
raise ONVIFOperationException(operation=method, original_exception=e)
|
|
194
|
+
|
|
195
|
+
def create_type(self, type_name: str):
|
|
196
|
+
"""
|
|
197
|
+
Create a type instance from WSDL schema for the given type name.
|
|
198
|
+
|
|
199
|
+
Recursively initializes nested complex types so that fields like TimeZone, DateTime,
|
|
200
|
+
Date, and Time are properly instantiated as objects rather than None.
|
|
201
|
+
|
|
202
|
+
Args:
|
|
203
|
+
type_name (str): Name of the type to create (e.g., 'SetHostname', 'SetIPAddressFilter')
|
|
204
|
+
|
|
205
|
+
Returns:
|
|
206
|
+
Type instance that can be populated with data
|
|
207
|
+
|
|
208
|
+
Raises:
|
|
209
|
+
AttributeError: If type not found in WSDL schema
|
|
210
|
+
"""
|
|
211
|
+
# Method 1: Try to get element from WSDL (works for operation parameters)
|
|
212
|
+
# Common namespace prefixes for ONVIF services
|
|
213
|
+
namespaces_to_try = [
|
|
214
|
+
"ns0", # Default namespace
|
|
215
|
+
"tt", # Common types (User, NetworkInterface, etc.)
|
|
216
|
+
]
|
|
217
|
+
|
|
218
|
+
# Try to get element with namespace prefix
|
|
219
|
+
for ns in namespaces_to_try:
|
|
220
|
+
try:
|
|
221
|
+
element = self.client.get_element(f"{ns}:{type_name}")
|
|
222
|
+
instance = element()
|
|
223
|
+
return self._initialize_nested_types(instance)
|
|
224
|
+
except Exception:
|
|
225
|
+
continue
|
|
226
|
+
|
|
227
|
+
# Method 2: Try without namespace prefix
|
|
228
|
+
try:
|
|
229
|
+
element = self.client.get_element(type_name)
|
|
230
|
+
instance = element()
|
|
231
|
+
return self._initialize_nested_types(instance)
|
|
232
|
+
except Exception:
|
|
233
|
+
pass
|
|
234
|
+
|
|
235
|
+
# Method 3: Try to get type from schema (for complex types)
|
|
236
|
+
try:
|
|
237
|
+
for ns in namespaces_to_try:
|
|
238
|
+
try:
|
|
239
|
+
type_obj = self.client.get_type(f"{ns}:{type_name}")
|
|
240
|
+
instance = type_obj()
|
|
241
|
+
return self._initialize_nested_types(instance)
|
|
242
|
+
except Exception:
|
|
243
|
+
continue
|
|
244
|
+
|
|
245
|
+
# Try without namespace
|
|
246
|
+
type_obj = self.client.get_type(type_name)
|
|
247
|
+
instance = type_obj()
|
|
248
|
+
return self._initialize_nested_types(instance)
|
|
249
|
+
except Exception:
|
|
250
|
+
pass
|
|
251
|
+
|
|
252
|
+
raise AttributeError(f"Type '{type_name}' not found in WSDL schema.")
|
|
253
|
+
|
|
254
|
+
def _initialize_nested_types(self, instance):
|
|
255
|
+
"""
|
|
256
|
+
Recursively initialize nested complex types in a Zeep object.
|
|
257
|
+
|
|
258
|
+
This ensures that fields like TimeZone, DateTime, Date, and Time are
|
|
259
|
+
properly instantiated as objects rather than None values.
|
|
260
|
+
|
|
261
|
+
Args:
|
|
262
|
+
instance: A Zeep object instance to initialize
|
|
263
|
+
|
|
264
|
+
Returns:
|
|
265
|
+
The instance with all nested complex types initialized
|
|
266
|
+
"""
|
|
267
|
+
try:
|
|
268
|
+
# Get the XSD type from the instance's class
|
|
269
|
+
if hasattr(instance.__class__, "_xsd_type"):
|
|
270
|
+
xsd_type = instance.__class__._xsd_type
|
|
271
|
+
|
|
272
|
+
# Iterate through elements defined in the XSD type
|
|
273
|
+
if hasattr(xsd_type, "elements"):
|
|
274
|
+
for element_name, element_obj in xsd_type.elements:
|
|
275
|
+
current_value = getattr(instance, element_name, None)
|
|
276
|
+
|
|
277
|
+
# Only initialize if the value is None and the element has a type
|
|
278
|
+
if current_value is None and hasattr(element_obj, "type"):
|
|
279
|
+
element_type = element_obj.type
|
|
280
|
+
|
|
281
|
+
# Check if this is a complex type (has elements)
|
|
282
|
+
if hasattr(element_type, "elements"):
|
|
283
|
+
# Complex type - instantiate it and recursively initialize
|
|
284
|
+
nested_instance = element_type()
|
|
285
|
+
nested_instance = self._initialize_nested_types(
|
|
286
|
+
nested_instance
|
|
287
|
+
)
|
|
288
|
+
setattr(instance, element_name, nested_instance)
|
|
289
|
+
except Exception:
|
|
290
|
+
# If anything goes wrong during nested initialization, just return the instance
|
|
291
|
+
# The important thing is that the top-level object is created
|
|
292
|
+
pass
|
|
293
|
+
|
|
294
|
+
return instance
|
|
@@ -48,10 +48,10 @@ class AnalyticsDevice(ONVIFService):
|
|
|
48
48
|
"CreateAnalyticsEngineControl", Configuration=Configuration
|
|
49
49
|
)
|
|
50
50
|
|
|
51
|
-
def SetAnalyticsEngineControl(self,
|
|
51
|
+
def SetAnalyticsEngineControl(self, Configuration, ForcePersistence):
|
|
52
52
|
return self.operator.call(
|
|
53
53
|
"SetAnalyticsEngineControl",
|
|
54
|
-
|
|
54
|
+
Configuration=Configuration,
|
|
55
55
|
ForcePersistence=ForcePersistence,
|
|
56
56
|
)
|
|
57
57
|
|
|
@@ -78,11 +78,11 @@ class AnalyticsDevice(ONVIFService):
|
|
|
78
78
|
ForcePersistence=ForcePersistence,
|
|
79
79
|
)
|
|
80
80
|
|
|
81
|
-
def SetAnalyticsEngineInput(self, Configuration,
|
|
81
|
+
def SetAnalyticsEngineInput(self, Configuration, ForcePersistence):
|
|
82
82
|
return self.operator.call(
|
|
83
83
|
"SetAnalyticsEngineInput",
|
|
84
84
|
Configuration=Configuration,
|
|
85
|
-
|
|
85
|
+
ForcePersistence=ForcePersistence,
|
|
86
86
|
)
|
|
87
87
|
|
|
88
88
|
def GetAnalyticsEngineInput(self, ConfigurationToken):
|
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
from .exceptions import ONVIFOperationException
|
|
4
4
|
|
|
5
5
|
|
|
6
|
+
def _is_zeep_object(obj):
|
|
7
|
+
"""Check if an object is a Zeep-generated object.
|
|
8
|
+
|
|
9
|
+
Zeep objects have the _xsd_type attribute which is the XSD type definition.
|
|
10
|
+
"""
|
|
11
|
+
return hasattr(obj, "_xsd_type")
|
|
12
|
+
|
|
13
|
+
|
|
6
14
|
class ONVIFService:
|
|
7
15
|
"""Base class for all ONVIF service implementations.
|
|
8
16
|
|
|
@@ -29,19 +37,6 @@ class ONVIFService:
|
|
|
29
37
|
3. Is not a private method (doesn't start with underscore)
|
|
30
38
|
4. Is not an internal attribute (like 'operator')
|
|
31
39
|
|
|
32
|
-
ONVIF operations that will be wrapped:
|
|
33
|
-
✓ GetDeviceInformation()
|
|
34
|
-
✓ GetProfiles()
|
|
35
|
-
✓ ContinuousMove()
|
|
36
|
-
✓ CreatePullPointSubscription()
|
|
37
|
-
✓ GetImagingSettings()
|
|
38
|
-
|
|
39
|
-
Methods that will NOT be wrapped:
|
|
40
|
-
✗ _internal_method() (starts with underscore)
|
|
41
|
-
✗ helper_function() (starts with lowercase)
|
|
42
|
-
✗ operator (internal attribute)
|
|
43
|
-
✗ non_callable_attr (not a method)
|
|
44
|
-
|
|
45
40
|
Benefits:
|
|
46
41
|
1. **DRY Principle**: No need to repeat error handling in every method
|
|
47
42
|
2. **Consistency**: All ONVIF operations behave the same way
|
|
@@ -94,9 +89,20 @@ class ONVIFService:
|
|
|
94
89
|
if not name[0].isupper():
|
|
95
90
|
return attr
|
|
96
91
|
|
|
97
|
-
# Wrap ONVIF methods with error handling
|
|
92
|
+
# Wrap ONVIF methods with error handling and Zeep object conversion
|
|
98
93
|
def wrapped_method(*args, **kwargs):
|
|
99
94
|
try:
|
|
95
|
+
# If called with 1 positional arg that is a Zeep object and no kwargs,
|
|
96
|
+
# convert the object's fields to kwargs instead of passing it as positional arg
|
|
97
|
+
if len(args) == 1 and not kwargs and _is_zeep_object(args[0]):
|
|
98
|
+
params_obj = args[0]
|
|
99
|
+
# Extract fields from Zeep object using its XSD type elements
|
|
100
|
+
if hasattr(params_obj._xsd_type, "elements"):
|
|
101
|
+
kwargs = {}
|
|
102
|
+
for elem_name, elem_obj in params_obj._xsd_type.elements:
|
|
103
|
+
kwargs[elem_name] = getattr(params_obj, elem_name)
|
|
104
|
+
return attr(**kwargs)
|
|
105
|
+
|
|
100
106
|
return attr(*args, **kwargs)
|
|
101
107
|
except ONVIFOperationException:
|
|
102
108
|
# Re-raise ONVIF exceptions as-is
|
|
@@ -106,3 +112,45 @@ class ONVIFService:
|
|
|
106
112
|
raise ONVIFOperationException(name, e)
|
|
107
113
|
|
|
108
114
|
return wrapped_method
|
|
115
|
+
|
|
116
|
+
def type(self, type_name: str):
|
|
117
|
+
"""
|
|
118
|
+
Create and return an instance of the specified ONVIF type.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
type_name (str): Name of the type to create (e.g., 'SetHostname', 'SetIPAddressFilter')
|
|
122
|
+
|
|
123
|
+
Returns:
|
|
124
|
+
Type instance that can be populated with data
|
|
125
|
+
|
|
126
|
+
Raises:
|
|
127
|
+
ONVIFOperationException: If type creation fails
|
|
128
|
+
|
|
129
|
+
Example:
|
|
130
|
+
device = client.devicemgmt()
|
|
131
|
+
|
|
132
|
+
newuser = device.type('CreateUsers')
|
|
133
|
+
newuser.User.append({"Username": 'new_user', "Password": 'new_password', "UserLevel": 'User'})
|
|
134
|
+
device.CreateUsers(newuser)
|
|
135
|
+
|
|
136
|
+
hostname = device.type('SetHostname')
|
|
137
|
+
hostname.Name = 'NewHostname'
|
|
138
|
+
device.SetHostname(hostname)
|
|
139
|
+
|
|
140
|
+
time_params = device.type('SetSystemDateAndTime')
|
|
141
|
+
time_params.DateTimeType = 'NTP'
|
|
142
|
+
time_params.DaylightSavings = True
|
|
143
|
+
time_params.TimeZone.TZ = 'UTC+02:00'
|
|
144
|
+
now = datetime.now()
|
|
145
|
+
time_params.UTCDateTime.Date.Year = now.year
|
|
146
|
+
time_params.UTCDateTime.Date.Month = now.month
|
|
147
|
+
time_params.UTCDateTime.Date.Day = now.day
|
|
148
|
+
time_params.UTCDateTime.Time.Hour = now.hour
|
|
149
|
+
time_params.UTCDateTime.Time.Minute = now.minute
|
|
150
|
+
time_params.UTCDateTime.Time.Second = now.second
|
|
151
|
+
device.SetSystemDateAndTime(time_params)
|
|
152
|
+
"""
|
|
153
|
+
try:
|
|
154
|
+
return self.operator.create_type(type_name)
|
|
155
|
+
except Exception as e:
|
|
156
|
+
raise ONVIFOperationException(f"type({type_name})", e)
|