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.
Files changed (130) hide show
  1. {onvif_python-0.1.8/onvif_python.egg-info → onvif_python-0.1.9}/PKG-INFO +6 -4
  2. {onvif_python-0.1.8 → onvif_python-0.1.9}/README.md +5 -3
  3. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/cli/interactive.py +10 -2
  4. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/cli/main.py +2 -2
  5. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/operator.py +101 -0
  6. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/analyticsdevice.py +4 -4
  7. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/service.py +62 -14
  8. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/wsdl.py +40 -44
  9. onvif_python-0.1.9/onvif/wsdl/LICENSE.md +232 -0
  10. {onvif_python-0.1.8 → onvif_python-0.1.9/onvif_python.egg-info}/PKG-INFO +6 -4
  11. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif_python.egg-info/SOURCES.txt +1 -0
  12. {onvif_python-0.1.8 → onvif_python-0.1.9}/pyproject.toml +1 -1
  13. {onvif_python-0.1.8 → onvif_python-0.1.9}/LICENSE.md +0 -0
  14. {onvif_python-0.1.8 → onvif_python-0.1.9}/MANIFEST.in +0 -0
  15. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/__init__.py +0 -0
  16. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/cli/__init__.py +0 -0
  17. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/cli/__main__.py +0 -0
  18. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/cli/utils.py +0 -0
  19. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/client.py +0 -0
  20. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/__init__.py +0 -0
  21. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/accesscontrol.py +0 -0
  22. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/accessrules.py +0 -0
  23. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/actionengine.py +0 -0
  24. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/analytics/analytics.py +0 -0
  25. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/analytics/ruleengine.py +0 -0
  26. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/appmgmt.py +0 -0
  27. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/authenticationbehavior.py +0 -0
  28. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/credential.py +0 -0
  29. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/deviceio.py +0 -0
  30. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/devicemgmt.py +0 -0
  31. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/display.py +0 -0
  32. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/doorcontrol.py +0 -0
  33. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/events/events.py +0 -0
  34. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/events/notification.py +0 -0
  35. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/events/pullpoint.py +0 -0
  36. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/events/subscription.py +0 -0
  37. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/imaging.py +0 -0
  38. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/media.py +0 -0
  39. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/media2.py +0 -0
  40. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/provisioning.py +0 -0
  41. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/ptz.py +0 -0
  42. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/receiver.py +0 -0
  43. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/recording.py +0 -0
  44. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/replay.py +0 -0
  45. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/schedule.py +0 -0
  46. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/search.py +0 -0
  47. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/security/advancedsecurity.py +0 -0
  48. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/security/authorizationserver.py +0 -0
  49. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/security/dot1x.py +0 -0
  50. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/security/jwt.py +0 -0
  51. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/security/keystore.py +0 -0
  52. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/security/mediasigning.py +0 -0
  53. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/security/tlsserver.py +0 -0
  54. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/thermal.py +0 -0
  55. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/services/uplink.py +0 -0
  56. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/__init__.py +0 -0
  57. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/discovery.py +0 -0
  58. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/error_handlers.py +0 -0
  59. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/exceptions.py +0 -0
  60. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/xml_capture.py +0 -0
  61. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/utils/zeep.py +0 -0
  62. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/accesscontrol/wsdl/index.html +0 -0
  63. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/accessrules/wsdl/accessrules.wsdl +0 -0
  64. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/accessrules/wsdl/index.html +0 -0
  65. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/actionengine.wsdl +0 -0
  66. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl +0 -0
  67. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/advancedsecurity/wsdl/index.html +0 -0
  68. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/analyticsdevice.wsdl +0 -0
  69. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/appmgmt/wsdl/appmgmt.wsdl +0 -0
  70. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/appmgmt/wsdl/index.html +0 -0
  71. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/authenticationbehavior/wsdl/authenticationbehavior.wsdl +0 -0
  72. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/authenticationbehavior/wsdl/index.html +0 -0
  73. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/credential/wsdl/credential.wsdl +0 -0
  74. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/credential/wsdl/index.html +0 -0
  75. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/device/wsdl/devicemgmt.wsdl +0 -0
  76. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/deviceio.wsdl +0 -0
  77. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/display/display.wsdl +0 -0
  78. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/display/wsdl/index.htm +0 -0
  79. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/display.wsdl +0 -0
  80. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/doorcontrol/wsdl/index.html +0 -0
  81. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/events/wsdl/bw-2-vs-mod.wsdl +0 -0
  82. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/events/wsdl/event-vs.wsdl +0 -0
  83. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/events/wsdl/event.wsdl +0 -0
  84. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/events/wsdl/index.html +0 -0
  85. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/federatedsearch.wsdl +0 -0
  86. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/media/wsdl/media.wsdl +0 -0
  87. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/pacs/accesscontrol.wsdl +0 -0
  88. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/pacs/doorcontrol.wsdl +0 -0
  89. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/pacs/types.xsd +0 -0
  90. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/provisioning/wsdl/provisioning.wsdl +0 -0
  91. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/receiver.wsdl +0 -0
  92. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/recording.wsdl +0 -0
  93. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/replay.wsdl +0 -0
  94. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/schedule/wsdl/index.html +0 -0
  95. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/schedule/wsdl/schedule.wsdl +0 -0
  96. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/schema/common.xsd +0 -0
  97. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/schema/metadatastream.xsd +0 -0
  98. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/schema/onvif.xsd +0 -0
  99. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/search.wsdl +0 -0
  100. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/thermal/wsdl/index.html +0 -0
  101. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/thermal/wsdl/thermal.wsdl +0 -0
  102. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/topics/topicns.xml +0 -0
  103. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/uplink/wsdl/index.html +0 -0
  104. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver10/uplink/wsdl/uplink.wsdl +0 -0
  105. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/analytics/humanbody.xsd +0 -0
  106. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/analytics/humanface.xsd +0 -0
  107. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/analytics/index.html +0 -0
  108. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/analytics/radiometry.xsd +0 -0
  109. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/analytics/rules.xsd +0 -0
  110. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/analytics/wsdl/analytics.wsdl +0 -0
  111. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/analytics/wsdl/index.html +0 -0
  112. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/imaging/wsdl/imaging.wsdl +0 -0
  113. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/media/wsdl/index.html +0 -0
  114. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/media/wsdl/media.wsdl +0 -0
  115. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/ptz/wsdl/ptz.wsdl +0 -0
  116. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/util/federated_search_documentation.html +0 -0
  117. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/util/fedsearch-docu-viewer.xsl +0 -0
  118. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/util/onvif-wsdl-viewer.xsl +0 -0
  119. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif/wsdl/ver20/util/operationIndex.html +0 -0
  120. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif_python.egg-info/dependency_links.txt +0 -0
  121. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif_python.egg-info/entry_points.txt +0 -0
  122. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif_python.egg-info/requires.txt +0 -0
  123. {onvif_python-0.1.8 → onvif_python-0.1.9}/onvif_python.egg-info/top_level.txt +0 -0
  124. {onvif_python-0.1.8 → onvif_python-0.1.9}/setup.cfg +0 -0
  125. {onvif_python-0.1.8 → onvif_python-0.1.9}/setup.py +0 -0
  126. {onvif_python-0.1.8 → onvif_python-0.1.9}/tests/test_client.py +0 -0
  127. {onvif_python-0.1.8 → onvif_python-0.1.9}/tests/test_core.py +0 -0
  128. {onvif_python-0.1.8 → onvif_python-0.1.9}/tests/test_error_handlers.py +0 -0
  129. {onvif_python-0.1.8 → onvif_python-0.1.9}/tests/test_exceptions.py +0 -0
  130. {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.8
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
  [![Codacy grade](https://img.shields.io/codacy/grade/bff08a94e4d447b690cea49c6594826d?label=Code%20Quality&logo=codacy)](https://app.codacy.com/gh/nirsimetri/onvif-python/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
49
49
  [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/nirsimetri/onvif-python)
50
- [![PyPI](https://img.shields.io/badge/PyPI-0.1.8-orange?logo=archive)](https://pypi.org/project/onvif-python/)
50
+ [![PyPI](https://img.shields.io/badge/PyPI-0.1.9-orange?logo=archive)](https://pypi.org/project/onvif-python/)
51
51
  [![Downloads](https://img.shields.io/pypi/dm/onvif-python?label=Downloads&color=red)](https://clickpy.clickhouse.com/dashboard/onvif-python)
52
52
  <br>
53
53
  [![Build](https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml/badge.svg?branch=main)](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.8
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.8
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
  [![Codacy grade](https://img.shields.io/codacy/grade/bff08a94e4d447b690cea49c6594826d?label=Code%20Quality&logo=codacy)](https://app.codacy.com/gh/nirsimetri/onvif-python/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
6
6
  [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/nirsimetri/onvif-python)
7
- [![PyPI](https://img.shields.io/badge/PyPI-0.1.8-orange?logo=archive)](https://pypi.org/project/onvif-python/)
7
+ [![PyPI](https://img.shields.io/badge/PyPI-0.1.9-orange?logo=archive)](https://pypi.org/project/onvif-python/)
8
8
  [![Downloads](https://img.shields.io/pypi/dm/onvif-python?label=Downloads&color=red)](https://clickpy.clickhouse.com/dashboard/onvif-python)
9
9
  <br>
10
10
  [![Build](https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml/badge.svg?branch=main)](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.8
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.8
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.8",
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.8', 'cyan')}\n{colorize('https://github.com/nirsimetri/onvif-python', 'white')}
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.8\nhttps://github.com/nirsimetri/onvif-python",
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.8", "yellow"))
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, SetAnalyticsEngineControl, ForcePersistence):
51
+ def SetAnalyticsEngineControl(self, Configuration, ForcePersistence):
52
52
  return self.operator.call(
53
53
  "SetAnalyticsEngineControl",
54
- SetAnalyticsEngineControl=SetAnalyticsEngineControl,
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, InputToken):
81
+ def SetAnalyticsEngineInput(self, Configuration, ForcePersistence):
82
82
  return self.operator.call(
83
83
  "SetAnalyticsEngineInput",
84
84
  Configuration=Configuration,
85
- InputToken=InputToken,
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)