onvif-python 0.1.8__tar.gz → 0.2.0__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 (135) hide show
  1. {onvif_python-0.1.8/onvif_python.egg-info → onvif_python-0.2.0}/PKG-INFO +195 -23
  2. {onvif_python-0.1.8 → onvif_python-0.2.0}/README.md +194 -22
  3. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/cli/interactive.py +26 -11
  4. onvif_python-0.2.0/onvif/cli/main.py +736 -0
  5. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/cli/utils.py +2 -9
  6. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/client.py +90 -8
  7. onvif_python-0.2.0/onvif/db/companies.db +0 -0
  8. onvif_python-0.2.0/onvif/db/products.db +0 -0
  9. onvif_python-0.2.0/onvif/operator.py +348 -0
  10. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/analyticsdevice.py +4 -4
  11. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/utils/discovery.py +38 -6
  12. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/utils/error_handlers.py +26 -9
  13. onvif_python-0.2.0/onvif/utils/service.py +307 -0
  14. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/utils/wsdl.py +53 -44
  15. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/utils/xml_capture.py +33 -5
  16. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/utils/zeep.py +11 -0
  17. onvif_python-0.2.0/onvif/wsdl/LICENSE.md +232 -0
  18. {onvif_python-0.1.8 → onvif_python-0.2.0/onvif_python.egg-info}/PKG-INFO +195 -23
  19. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif_python.egg-info/SOURCES.txt +3 -0
  20. {onvif_python-0.1.8 → onvif_python-0.2.0}/pyproject.toml +4 -4
  21. onvif_python-0.1.8/onvif/cli/main.py +0 -416
  22. onvif_python-0.1.8/onvif/operator.py +0 -193
  23. onvif_python-0.1.8/onvif/utils/service.py +0 -108
  24. {onvif_python-0.1.8 → onvif_python-0.2.0}/LICENSE.md +0 -0
  25. {onvif_python-0.1.8 → onvif_python-0.2.0}/MANIFEST.in +0 -0
  26. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/__init__.py +0 -0
  27. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/cli/__init__.py +0 -0
  28. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/cli/__main__.py +0 -0
  29. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/__init__.py +0 -0
  30. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/accesscontrol.py +0 -0
  31. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/accessrules.py +0 -0
  32. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/actionengine.py +0 -0
  33. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/analytics/analytics.py +0 -0
  34. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/analytics/ruleengine.py +0 -0
  35. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/appmgmt.py +0 -0
  36. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/authenticationbehavior.py +0 -0
  37. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/credential.py +0 -0
  38. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/deviceio.py +0 -0
  39. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/devicemgmt.py +0 -0
  40. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/display.py +0 -0
  41. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/doorcontrol.py +0 -0
  42. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/events/events.py +0 -0
  43. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/events/notification.py +0 -0
  44. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/events/pullpoint.py +0 -0
  45. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/events/subscription.py +0 -0
  46. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/imaging.py +0 -0
  47. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/media.py +0 -0
  48. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/media2.py +0 -0
  49. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/provisioning.py +0 -0
  50. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/ptz.py +0 -0
  51. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/receiver.py +0 -0
  52. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/recording.py +0 -0
  53. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/replay.py +0 -0
  54. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/schedule.py +0 -0
  55. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/search.py +0 -0
  56. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/security/advancedsecurity.py +0 -0
  57. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/security/authorizationserver.py +0 -0
  58. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/security/dot1x.py +0 -0
  59. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/security/jwt.py +0 -0
  60. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/security/keystore.py +0 -0
  61. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/security/mediasigning.py +0 -0
  62. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/security/tlsserver.py +0 -0
  63. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/thermal.py +0 -0
  64. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/services/uplink.py +0 -0
  65. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/utils/__init__.py +0 -0
  66. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/utils/exceptions.py +0 -0
  67. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/accesscontrol/wsdl/index.html +0 -0
  68. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/accessrules/wsdl/accessrules.wsdl +0 -0
  69. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/accessrules/wsdl/index.html +0 -0
  70. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/actionengine.wsdl +0 -0
  71. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl +0 -0
  72. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/advancedsecurity/wsdl/index.html +0 -0
  73. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/analyticsdevice.wsdl +0 -0
  74. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/appmgmt/wsdl/appmgmt.wsdl +0 -0
  75. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/appmgmt/wsdl/index.html +0 -0
  76. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/authenticationbehavior/wsdl/authenticationbehavior.wsdl +0 -0
  77. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/authenticationbehavior/wsdl/index.html +0 -0
  78. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/credential/wsdl/credential.wsdl +0 -0
  79. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/credential/wsdl/index.html +0 -0
  80. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/device/wsdl/devicemgmt.wsdl +0 -0
  81. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/deviceio.wsdl +0 -0
  82. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/display/display.wsdl +0 -0
  83. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/display/wsdl/index.htm +0 -0
  84. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/display.wsdl +0 -0
  85. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/doorcontrol/wsdl/index.html +0 -0
  86. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/events/wsdl/bw-2-vs-mod.wsdl +0 -0
  87. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/events/wsdl/event-vs.wsdl +0 -0
  88. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/events/wsdl/event.wsdl +0 -0
  89. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/events/wsdl/index.html +0 -0
  90. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/federatedsearch.wsdl +0 -0
  91. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/media/wsdl/media.wsdl +0 -0
  92. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/pacs/accesscontrol.wsdl +0 -0
  93. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/pacs/doorcontrol.wsdl +0 -0
  94. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/pacs/types.xsd +0 -0
  95. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/provisioning/wsdl/provisioning.wsdl +0 -0
  96. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/receiver.wsdl +0 -0
  97. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/recording.wsdl +0 -0
  98. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/replay.wsdl +0 -0
  99. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/schedule/wsdl/index.html +0 -0
  100. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/schedule/wsdl/schedule.wsdl +0 -0
  101. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/schema/common.xsd +0 -0
  102. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/schema/metadatastream.xsd +0 -0
  103. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/schema/onvif.xsd +0 -0
  104. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/search.wsdl +0 -0
  105. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/thermal/wsdl/index.html +0 -0
  106. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/thermal/wsdl/thermal.wsdl +0 -0
  107. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/topics/topicns.xml +0 -0
  108. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/uplink/wsdl/index.html +0 -0
  109. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver10/uplink/wsdl/uplink.wsdl +0 -0
  110. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver20/analytics/humanbody.xsd +0 -0
  111. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver20/analytics/humanface.xsd +0 -0
  112. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver20/analytics/index.html +0 -0
  113. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver20/analytics/radiometry.xsd +0 -0
  114. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver20/analytics/rules.xsd +0 -0
  115. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver20/analytics/wsdl/analytics.wsdl +0 -0
  116. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver20/analytics/wsdl/index.html +0 -0
  117. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver20/imaging/wsdl/imaging.wsdl +0 -0
  118. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver20/media/wsdl/index.html +0 -0
  119. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver20/media/wsdl/media.wsdl +0 -0
  120. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver20/ptz/wsdl/ptz.wsdl +0 -0
  121. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver20/util/federated_search_documentation.html +0 -0
  122. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver20/util/fedsearch-docu-viewer.xsl +0 -0
  123. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver20/util/onvif-wsdl-viewer.xsl +0 -0
  124. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif/wsdl/ver20/util/operationIndex.html +0 -0
  125. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif_python.egg-info/dependency_links.txt +0 -0
  126. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif_python.egg-info/entry_points.txt +0 -0
  127. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif_python.egg-info/requires.txt +0 -0
  128. {onvif_python-0.1.8 → onvif_python-0.2.0}/onvif_python.egg-info/top_level.txt +0 -0
  129. {onvif_python-0.1.8 → onvif_python-0.2.0}/setup.cfg +0 -0
  130. {onvif_python-0.1.8 → onvif_python-0.2.0}/setup.py +0 -0
  131. {onvif_python-0.1.8 → onvif_python-0.2.0}/tests/test_client.py +0 -0
  132. {onvif_python-0.1.8 → onvif_python-0.2.0}/tests/test_core.py +0 -0
  133. {onvif_python-0.1.8 → onvif_python-0.2.0}/tests/test_error_handlers.py +0 -0
  134. {onvif_python-0.1.8 → onvif_python-0.2.0}/tests/test_exceptions.py +0 -0
  135. {onvif_python-0.1.8 → onvif_python-0.2.0}/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.2.0
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.2.0-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)
@@ -55,7 +55,7 @@ Dynamic: license-file
55
55
  </div>
56
56
 
57
57
  <h1 align="center">
58
- <img src="https://raw.githubusercontent.com/nirsimetri/onvif-python/refs/heads/main/assets/carbon_onvif.png" alt="onvif" width="700px">
58
+ <img src="https://raw.githubusercontent.com/nirsimetri/onvif-python/refs/heads/main/assets/images/carbon_onvif.png" alt="onvif" width="700px">
59
59
  <br>
60
60
  </h1>
61
61
 
@@ -193,6 +193,109 @@ print(stream)
193
193
 
194
194
  Explore more advanced usage and service-specific operations in the [`examples/`](./examples/) folder.
195
195
 
196
+ ## Helper Methods
197
+
198
+ Every ONVIF service provides three essential helper methods to improve the development experience and make working with ONVIF operations more intuitive:
199
+
200
+ **1. `type(type_name)`**
201
+
202
+ Creates and returns an instance of the specified ONVIF type for building complex request parameters (applied at [`>=v0.1.9`](https://github.com/nirsimetri/onvif-python/releases/tag/v0.1.9)).
203
+
204
+ **Usage:**
205
+ ```python
206
+ device = client.devicemgmt()
207
+
208
+ # Create a new user object
209
+ new_user = device.type('CreateUsers')
210
+ new_user.User.append({
211
+ "Username": 'new_user',
212
+ "Password": 'new_password',
213
+ "UserLevel": 'User'
214
+ })
215
+ device.CreateUsers(new_user)
216
+
217
+ # Set hostname
218
+ hostname = device.type('SetHostname')
219
+ hostname.Name = 'NewHostname'
220
+ device.SetHostname(hostname)
221
+
222
+ # Configure system time
223
+ time_params = device.type('SetSystemDateAndTime')
224
+ time_params.DateTimeType = 'NTP'
225
+ time_params.DaylightSavings = True
226
+ time_params.TimeZone.TZ = 'UTC+02:00'
227
+ now = datetime.now()
228
+ time_params.UTCDateTime.Date.Year = now.year
229
+ time_params.UTCDateTime.Date.Month = now.month
230
+ time_params.UTCDateTime.Date.Day = now.day
231
+ time_params.UTCDateTime.Time.Hour = now.hour
232
+ time_params.UTCDateTime.Time.Minute = now.minute
233
+ time_params.UTCDateTime.Time.Second = now.second
234
+ device.SetSystemDateAndTime(time_params)
235
+ ```
236
+
237
+ **2. `operations()`**
238
+
239
+ Lists all available operations for the current service (applied at [`>=v0.2.0`](https://github.com/nirsimetri/onvif-python/releases/tag/v0.2.0)).
240
+
241
+ **Returns:**
242
+ - List of operation names that can be called on the service
243
+
244
+ **Usage:**
245
+ ```python
246
+ device = client.devicemgmt()
247
+ media = client.media()
248
+ ptz = client.ptz()
249
+
250
+ # List all available operations for each service
251
+ print("Device Management Operations:")
252
+ for op in device.operations():
253
+ print(f" - {op}")
254
+
255
+ print("\nMedia Operations:")
256
+ for op in media.operations():
257
+ print(f" - {op}")
258
+
259
+ print("\nPTZ Operations:")
260
+ for op in ptz.operations():
261
+ print(f" - {op}")
262
+
263
+ # Check if specific operation is supported
264
+ if 'ContinuousMove' in ptz.operations():
265
+ print("PTZ continuous movement is supported")
266
+ ```
267
+
268
+ **3. `desc(method_name)`**
269
+
270
+ Provides comprehensive documentation and parameter information for any ONVIF operation (applied at [`>=v0.2.0`](https://github.com/nirsimetri/onvif-python/releases/tag/v0.2.0)).
271
+
272
+ **Returns:**
273
+ - `doc`: Method documentation from WSDL
274
+ - `required`: List of required parameter names
275
+ - `optional`: List of optional parameter names
276
+ - `method_name`: The method name
277
+ - `service_name`: The service name
278
+
279
+ **Usage:**
280
+ ```python
281
+ device = client.devicemgmt()
282
+
283
+ # Get detailed information about a method
284
+ info = device.desc('GetDeviceInformation')
285
+ print(info['doc'])
286
+ print("Required params:", info['required'])
287
+ print("Optional params:", info['optional'])
288
+
289
+ # Explore available methods first
290
+ methods = device.operations()
291
+ for method in methods[:5]: # Show first 5 methods
292
+ info = device.desc(method)
293
+ print(f"{method}: {len(info['required'])} required, {len(info['optional'])} optional")
294
+ ```
295
+
296
+ > [!TIP]
297
+ > These helper methods are available on **all** ONVIF services (`devicemgmt()`, `media()`, `ptz()`, `events()`, `imaging()`, `analytics()`, etc.) and provide a consistent API for exploring and using ONVIF capabilities across different device types and manufacturers.
298
+
196
299
  > [!IMPORTANT]
197
300
  > 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-notice) for details.
198
301
 
@@ -224,12 +327,12 @@ This library includes a powerful command-line interface (CLI) for interacting wi
224
327
  <tr>
225
328
  <td width="34.2%">
226
329
  <a href="https://github.com/nirsimetri/onvif-python">
227
- <img src="https://raw.githubusercontent.com/nirsimetri/onvif-python/refs/heads/main/assets/onvif_cli.png" />
330
+ <img src="https://raw.githubusercontent.com/nirsimetri/onvif-python/refs/heads/main/assets/images/onvif_cli.png" />
228
331
  </a>
229
332
  </td>
230
333
  <td width="65.8%">
231
334
  <a href="https://github.com/nirsimetri/onvif-python">
232
- <img src="https://raw.githubusercontent.com/nirsimetri/onvif-python/refs/heads/main/assets/onvif_operations.png" />
335
+ <img src="https://raw.githubusercontent.com/nirsimetri/onvif-python/refs/heads/main/assets/images/onvif_operations.png" />
233
336
  </a>
234
337
  </td>
235
338
  </tr>
@@ -249,12 +352,11 @@ This library includes a powerful command-line interface (CLI) for interacting wi
249
352
  <summary><b>1. Direct CLI</b></summary>
250
353
 
251
354
  ```bash
252
- usage: onvif [-h] [--host HOST] [--port PORT] [--username USERNAME] [--password PASSWORD] [--discover] [--search SEARCH] [--timeout TIMEOUT] [--https]
253
- [--no-verify] [--no-patch] [--interactive] [--debug] [--wsdl WSDL] [--cache {all,db,mem,none}]
254
- [--health-check-interval HEALTH_CHECK_INTERVAL] [--version]
355
+ usage: onvif [-h] [--host HOST] [--port PORT] [--username USERNAME] [--password PASSWORD] [--discover] [--filter FILTER] [--search SEARCH] [--page PAGE] [--per-page PER_PAGE] [--timeout TIMEOUT] [--https]
356
+ [--no-verify] [--no-patch] [--interactive] [--debug] [--wsdl WSDL] [--cache {all,db,mem,none}] [--health-check-interval HEALTH_CHECK_INTERVAL] [--version]
255
357
  [service] [method] [params ...]
256
358
 
257
- ONVIF Terminal Client — v0.1.8
359
+ ONVIF Terminal Client — v0.2.0
258
360
  https://github.com/nirsimetri/onvif-python
259
361
 
260
362
  positional arguments:
@@ -271,8 +373,12 @@ options:
271
373
  --password PASSWORD, -p PASSWORD
272
374
  Password for authentication
273
375
  --discover, -d Discover ONVIF devices on the network using WS-Discovery
274
- --search SEARCH, -s SEARCH
376
+ --filter FILTER, -f FILTER
275
377
  Filter discovered devices by types or scopes (case-insensitive substring match)
378
+ --search SEARCH, -s SEARCH
379
+ Search ONVIF products database by model or company (e.g., 'c210', 'hikvision')
380
+ --page PAGE Page number for search results (default: 1)
381
+ --per-page PER_PAGE Number of results per page (default: 20)
276
382
  --timeout TIMEOUT Connection timeout in seconds (default: 10)
277
383
  --https Use HTTPS instead of HTTP
278
384
  --no-verify Disable SSL certificate verification
@@ -287,15 +393,20 @@ options:
287
393
  --version, -v Show ONVIF CLI version and exit
288
394
 
289
395
  Examples:
396
+ # Product search
397
+ onvif --search c210
398
+ onvif -s "axis camera"
399
+ onvif --search hikvision --page 2 --per-page 5
400
+
290
401
  # Discover ONVIF devices on network
291
402
  onvif --discover --username admin --password admin123 --interactive
292
403
  onvif media GetProfiles --discover --username admin
293
404
  onvif -d -i
294
405
 
295
406
  # Discover with filtering
296
- onvif --discover --search ptz --interactive
297
- onvif -d -s "C210" -i
298
- onvif -d -s "audio_encoder" -u admin -p admin123 -i
407
+ onvif --discover --filter ptz --interactive
408
+ onvif -d -f "C210" -i
409
+ onvif -d -f "audio_encoder" -u admin -p admin123 -i
299
410
 
300
411
  # Direct command execution
301
412
  onvif devicemgmt GetCapabilities Category=All --host 192.168.1.17 --port 8000 --username admin --password admin123
@@ -318,7 +429,7 @@ Examples:
318
429
  <summary><b>2. Interactive Shell</b></summary>
319
430
 
320
431
  ```bash
321
- ONVIF Interactive Shell — v0.1.8
432
+ ONVIF Interactive Shell — v0.2.0
322
433
  https://github.com/nirsimetri/onvif-python
323
434
 
324
435
  Basic Commands:
@@ -441,7 +552,7 @@ This feature is particularly useful for:
441
552
 
442
553
  **2. Device Discovery (WS-Discovery)**
443
554
 
444
- The CLI includes automatic ONVIF device discovery using the WS-Discovery protocol. This feature allows you to find all ONVIF-compliant devices on your local network without knowing their IP addresses beforehand.
555
+ The CLI includes automatic ONVIF device discovery using the WS-Discovery protocol. 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`](https://github.com/nirsimetri/onvif-python/releases/tag/v0.1.2)).
445
556
 
446
557
  **Discover and Connect Interactively:**
447
558
  ```bash
@@ -452,8 +563,8 @@ onvif --discover --username admin --password admin123 --interactive
452
563
  onvif -d -u admin -p admin123 -i
453
564
 
454
565
  # Discover with search filter
455
- onvif --discover --search "C210" --interactive
456
- onvif -d -s ptz -u admin -p admin123 -i
566
+ onvif --discover --filter "C210" --interactive
567
+ onvif -d -f ptz -u admin -p admin123 -i
457
568
 
458
569
  # Discover and interactive (will prompt for credentials)
459
570
  onvif -d -i
@@ -488,15 +599,15 @@ Timeout: 4s
488
599
  Found 2 ONVIF device(s):
489
600
 
490
601
  [1] 192.168.1.14:2020
491
- [id] uuid:3fa1fe68-b915-4053-a3e1-a8294833fe3c
492
- [xaddrs] http://192.168.1.14:2020/onvif/device_service
493
- [types] tdn:NetworkVideoTransmitter
602
+ [id] 3fa1fe68-b915-4053-a3e1-a8294833fe3c
603
+ [xaddrs] [http://192.168.1.14:2020/onvif/device_service]
604
+ [types] [tdn:NetworkVideoTransmitter]
494
605
  [scopes] [name/C210] [hardware/C210] [Profile/Streaming] [location/Hong Kong]
495
606
 
496
607
  [2] 192.168.1.17:8000
497
- [id] urn:uuid:7d04ff31-61e6-11f0-a00c-6056eef47207
498
- [xaddrs] http://192.168.1.17:8000/onvif/device_service
499
- [types] dn:NetworkVideoTransmitter tds:Device
608
+ [id] 7d04ff31-61e6-11f0-a00c-6056eef47207
609
+ [xaddrs] [http://192.168.1.17:8000/onvif/device_service]
610
+ [types] [dn:NetworkVideoTransmitter] [tds:Device]
500
611
  [scopes] [type/NetworkVideoTransmitter] [location/unknown] [name/IPC_123465959]
501
612
 
502
613
  Select device number 1-2 or q to quit: 1
@@ -529,6 +640,65 @@ onvif devicemgmt GetCapabilities Category=All -H 192.168.1.17 -P 8000 -u admin -
529
640
  onvif ptz ContinuousMove ProfileToken=Profile_1 Velocity='{"PanTilt": {"x": 0.1}}' -H 192.168.1.17 -P 8000 -u admin -p admin123
530
641
  ```
531
642
 
643
+ **4. ONVIF Product Search**
644
+
645
+ The CLI includes a built-in database of ONVIF-compatible products that can be searched to help identify and research devices before connecting (applied at [`>=v0.2.0`](https://github.com/nirsimetri/onvif-python/releases/tag/v0.2.0)).
646
+
647
+ **Basic Search:**
648
+ ```bash
649
+ # Search by model name
650
+ onvif --search "C210"
651
+ onvif -s "axis camera"
652
+
653
+ # Search by manufacturer
654
+ onvif --search "hikvision"
655
+ onvif -s "dahua"
656
+
657
+ # Search by any keyword
658
+ onvif --search "ptz"
659
+ onvif -s "thermal"
660
+ ```
661
+
662
+ **Paginated Results:**
663
+ ```bash
664
+ # Navigate through multiple pages of results
665
+ onvif --search "hikvision" --page 2 --per-page 5
666
+ onvif -s "axis" --page 1 --per-page 10
667
+
668
+ # Adjust results per page (1-100)
669
+ onvif --search "camera" --per-page 20
670
+ ```
671
+
672
+ **Search Database Information:**
673
+
674
+ The product database contains comprehensive information about tested ONVIF devices:
675
+
676
+ | Field | Description |
677
+ |-------|-------------|
678
+ | **ID** | Unique product identifier |
679
+ | **Test Date** | When the device was last tested/verified |
680
+ | **Model** | Device model name and number |
681
+ | **Firmware** | Tested firmware version |
682
+ | **Profiles** | Supported ONVIF profiles (S, G, T, C, A, etc.) |
683
+ | **Category** | Device type (Camera, NVR, etc.) |
684
+ | **Type** | Specific device classification |
685
+ | **Company** | Manufacturer name |
686
+
687
+ **Example Output:**
688
+ ```
689
+ Found 15 product(s) matching: hikvision
690
+ Showing 1-10 of 15 results
691
+
692
+ ID | Test Date | Model | Firmware | Profiles | Category | Type | Company
693
+ ----|---------------------|-------------------|----------|----------|----------|---------|---------
694
+ 342 | 2024-08-15 17:53:12 | DS-2CD2143G2-IU | V5.7.3 | S,G,T | Camera | device | Hikvision
695
+ 341 | 2024-08-14 14:22:05 | DS-2DE2A404IW-DE3 | V5.6.15 | S,G,T | Camera | device | Hikvision
696
+ ...
697
+
698
+ Page 1 of 2
699
+ Navigation: Next: --page 2
700
+ ```
701
+
532
702
  ### CLI Parameters
533
703
 
534
704
  All `ONVIFClient` parameters (like `--timeout`, `--https`, `--cache`, etc.) are available as command-line arguments. Use `onvif --help` to see all available options.
@@ -863,6 +1033,7 @@ Below is a list of ONVIF services implemented and supported by this library, alo
863
1033
  | 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
1034
  | 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
1035
  | 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 |
1036
+ | 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
1037
  | 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
1038
  | 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
1039
  | 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 +1194,7 @@ This project is an **independent open-source implementation** of the [ONVIF](htt
1023
1194
  - Use of the ONVIF trademark in this repository is solely nominative and does not imply any partnership, certification, or official status.
1024
1195
  - This project includes WSDL/XSD/HTML files from the official ONVIF specifications.
1025
1196
  - These files are © ONVIF and are redistributed here for interoperability purposes.
1197
+ - 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
1198
  - All rights to the ONVIF specifications are reserved by ONVIF.
1027
1199
 
1028
1200
  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.2.0-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)
@@ -12,7 +12,7 @@
12
12
  </div>
13
13
 
14
14
  <h1 align="center">
15
- <img src="https://raw.githubusercontent.com/nirsimetri/onvif-python/refs/heads/main/assets/carbon_onvif.png" alt="onvif" width="700px">
15
+ <img src="https://raw.githubusercontent.com/nirsimetri/onvif-python/refs/heads/main/assets/images/carbon_onvif.png" alt="onvif" width="700px">
16
16
  <br>
17
17
  </h1>
18
18
 
@@ -150,6 +150,109 @@ print(stream)
150
150
 
151
151
  Explore more advanced usage and service-specific operations in the [`examples/`](./examples/) folder.
152
152
 
153
+ ## Helper Methods
154
+
155
+ Every ONVIF service provides three essential helper methods to improve the development experience and make working with ONVIF operations more intuitive:
156
+
157
+ **1. `type(type_name)`**
158
+
159
+ Creates and returns an instance of the specified ONVIF type for building complex request parameters (applied at [`>=v0.1.9`](https://github.com/nirsimetri/onvif-python/releases/tag/v0.1.9)).
160
+
161
+ **Usage:**
162
+ ```python
163
+ device = client.devicemgmt()
164
+
165
+ # Create a new user object
166
+ new_user = device.type('CreateUsers')
167
+ new_user.User.append({
168
+ "Username": 'new_user',
169
+ "Password": 'new_password',
170
+ "UserLevel": 'User'
171
+ })
172
+ device.CreateUsers(new_user)
173
+
174
+ # Set hostname
175
+ hostname = device.type('SetHostname')
176
+ hostname.Name = 'NewHostname'
177
+ device.SetHostname(hostname)
178
+
179
+ # Configure system time
180
+ time_params = device.type('SetSystemDateAndTime')
181
+ time_params.DateTimeType = 'NTP'
182
+ time_params.DaylightSavings = True
183
+ time_params.TimeZone.TZ = 'UTC+02:00'
184
+ now = datetime.now()
185
+ time_params.UTCDateTime.Date.Year = now.year
186
+ time_params.UTCDateTime.Date.Month = now.month
187
+ time_params.UTCDateTime.Date.Day = now.day
188
+ time_params.UTCDateTime.Time.Hour = now.hour
189
+ time_params.UTCDateTime.Time.Minute = now.minute
190
+ time_params.UTCDateTime.Time.Second = now.second
191
+ device.SetSystemDateAndTime(time_params)
192
+ ```
193
+
194
+ **2. `operations()`**
195
+
196
+ Lists all available operations for the current service (applied at [`>=v0.2.0`](https://github.com/nirsimetri/onvif-python/releases/tag/v0.2.0)).
197
+
198
+ **Returns:**
199
+ - List of operation names that can be called on the service
200
+
201
+ **Usage:**
202
+ ```python
203
+ device = client.devicemgmt()
204
+ media = client.media()
205
+ ptz = client.ptz()
206
+
207
+ # List all available operations for each service
208
+ print("Device Management Operations:")
209
+ for op in device.operations():
210
+ print(f" - {op}")
211
+
212
+ print("\nMedia Operations:")
213
+ for op in media.operations():
214
+ print(f" - {op}")
215
+
216
+ print("\nPTZ Operations:")
217
+ for op in ptz.operations():
218
+ print(f" - {op}")
219
+
220
+ # Check if specific operation is supported
221
+ if 'ContinuousMove' in ptz.operations():
222
+ print("PTZ continuous movement is supported")
223
+ ```
224
+
225
+ **3. `desc(method_name)`**
226
+
227
+ Provides comprehensive documentation and parameter information for any ONVIF operation (applied at [`>=v0.2.0`](https://github.com/nirsimetri/onvif-python/releases/tag/v0.2.0)).
228
+
229
+ **Returns:**
230
+ - `doc`: Method documentation from WSDL
231
+ - `required`: List of required parameter names
232
+ - `optional`: List of optional parameter names
233
+ - `method_name`: The method name
234
+ - `service_name`: The service name
235
+
236
+ **Usage:**
237
+ ```python
238
+ device = client.devicemgmt()
239
+
240
+ # Get detailed information about a method
241
+ info = device.desc('GetDeviceInformation')
242
+ print(info['doc'])
243
+ print("Required params:", info['required'])
244
+ print("Optional params:", info['optional'])
245
+
246
+ # Explore available methods first
247
+ methods = device.operations()
248
+ for method in methods[:5]: # Show first 5 methods
249
+ info = device.desc(method)
250
+ print(f"{method}: {len(info['required'])} required, {len(info['optional'])} optional")
251
+ ```
252
+
253
+ > [!TIP]
254
+ > These helper methods are available on **all** ONVIF services (`devicemgmt()`, `media()`, `ptz()`, `events()`, `imaging()`, `analytics()`, etc.) and provide a consistent API for exploring and using ONVIF capabilities across different device types and manufacturers.
255
+
153
256
  > [!IMPORTANT]
154
257
  > 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-notice) for details.
155
258
 
@@ -181,12 +284,12 @@ This library includes a powerful command-line interface (CLI) for interacting wi
181
284
  <tr>
182
285
  <td width="34.2%">
183
286
  <a href="https://github.com/nirsimetri/onvif-python">
184
- <img src="https://raw.githubusercontent.com/nirsimetri/onvif-python/refs/heads/main/assets/onvif_cli.png" />
287
+ <img src="https://raw.githubusercontent.com/nirsimetri/onvif-python/refs/heads/main/assets/images/onvif_cli.png" />
185
288
  </a>
186
289
  </td>
187
290
  <td width="65.8%">
188
291
  <a href="https://github.com/nirsimetri/onvif-python">
189
- <img src="https://raw.githubusercontent.com/nirsimetri/onvif-python/refs/heads/main/assets/onvif_operations.png" />
292
+ <img src="https://raw.githubusercontent.com/nirsimetri/onvif-python/refs/heads/main/assets/images/onvif_operations.png" />
190
293
  </a>
191
294
  </td>
192
295
  </tr>
@@ -206,12 +309,11 @@ This library includes a powerful command-line interface (CLI) for interacting wi
206
309
  <summary><b>1. Direct CLI</b></summary>
207
310
 
208
311
  ```bash
209
- usage: onvif [-h] [--host HOST] [--port PORT] [--username USERNAME] [--password PASSWORD] [--discover] [--search SEARCH] [--timeout TIMEOUT] [--https]
210
- [--no-verify] [--no-patch] [--interactive] [--debug] [--wsdl WSDL] [--cache {all,db,mem,none}]
211
- [--health-check-interval HEALTH_CHECK_INTERVAL] [--version]
312
+ usage: onvif [-h] [--host HOST] [--port PORT] [--username USERNAME] [--password PASSWORD] [--discover] [--filter FILTER] [--search SEARCH] [--page PAGE] [--per-page PER_PAGE] [--timeout TIMEOUT] [--https]
313
+ [--no-verify] [--no-patch] [--interactive] [--debug] [--wsdl WSDL] [--cache {all,db,mem,none}] [--health-check-interval HEALTH_CHECK_INTERVAL] [--version]
212
314
  [service] [method] [params ...]
213
315
 
214
- ONVIF Terminal Client — v0.1.8
316
+ ONVIF Terminal Client — v0.2.0
215
317
  https://github.com/nirsimetri/onvif-python
216
318
 
217
319
  positional arguments:
@@ -228,8 +330,12 @@ options:
228
330
  --password PASSWORD, -p PASSWORD
229
331
  Password for authentication
230
332
  --discover, -d Discover ONVIF devices on the network using WS-Discovery
231
- --search SEARCH, -s SEARCH
333
+ --filter FILTER, -f FILTER
232
334
  Filter discovered devices by types or scopes (case-insensitive substring match)
335
+ --search SEARCH, -s SEARCH
336
+ Search ONVIF products database by model or company (e.g., 'c210', 'hikvision')
337
+ --page PAGE Page number for search results (default: 1)
338
+ --per-page PER_PAGE Number of results per page (default: 20)
233
339
  --timeout TIMEOUT Connection timeout in seconds (default: 10)
234
340
  --https Use HTTPS instead of HTTP
235
341
  --no-verify Disable SSL certificate verification
@@ -244,15 +350,20 @@ options:
244
350
  --version, -v Show ONVIF CLI version and exit
245
351
 
246
352
  Examples:
353
+ # Product search
354
+ onvif --search c210
355
+ onvif -s "axis camera"
356
+ onvif --search hikvision --page 2 --per-page 5
357
+
247
358
  # Discover ONVIF devices on network
248
359
  onvif --discover --username admin --password admin123 --interactive
249
360
  onvif media GetProfiles --discover --username admin
250
361
  onvif -d -i
251
362
 
252
363
  # Discover with filtering
253
- onvif --discover --search ptz --interactive
254
- onvif -d -s "C210" -i
255
- onvif -d -s "audio_encoder" -u admin -p admin123 -i
364
+ onvif --discover --filter ptz --interactive
365
+ onvif -d -f "C210" -i
366
+ onvif -d -f "audio_encoder" -u admin -p admin123 -i
256
367
 
257
368
  # Direct command execution
258
369
  onvif devicemgmt GetCapabilities Category=All --host 192.168.1.17 --port 8000 --username admin --password admin123
@@ -275,7 +386,7 @@ Examples:
275
386
  <summary><b>2. Interactive Shell</b></summary>
276
387
 
277
388
  ```bash
278
- ONVIF Interactive Shell — v0.1.8
389
+ ONVIF Interactive Shell — v0.2.0
279
390
  https://github.com/nirsimetri/onvif-python
280
391
 
281
392
  Basic Commands:
@@ -398,7 +509,7 @@ This feature is particularly useful for:
398
509
 
399
510
  **2. Device Discovery (WS-Discovery)**
400
511
 
401
- The CLI includes automatic ONVIF device discovery using the WS-Discovery protocol. This feature allows you to find all ONVIF-compliant devices on your local network without knowing their IP addresses beforehand.
512
+ The CLI includes automatic ONVIF device discovery using the WS-Discovery protocol. 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`](https://github.com/nirsimetri/onvif-python/releases/tag/v0.1.2)).
402
513
 
403
514
  **Discover and Connect Interactively:**
404
515
  ```bash
@@ -409,8 +520,8 @@ onvif --discover --username admin --password admin123 --interactive
409
520
  onvif -d -u admin -p admin123 -i
410
521
 
411
522
  # Discover with search filter
412
- onvif --discover --search "C210" --interactive
413
- onvif -d -s ptz -u admin -p admin123 -i
523
+ onvif --discover --filter "C210" --interactive
524
+ onvif -d -f ptz -u admin -p admin123 -i
414
525
 
415
526
  # Discover and interactive (will prompt for credentials)
416
527
  onvif -d -i
@@ -445,15 +556,15 @@ Timeout: 4s
445
556
  Found 2 ONVIF device(s):
446
557
 
447
558
  [1] 192.168.1.14:2020
448
- [id] uuid:3fa1fe68-b915-4053-a3e1-a8294833fe3c
449
- [xaddrs] http://192.168.1.14:2020/onvif/device_service
450
- [types] tdn:NetworkVideoTransmitter
559
+ [id] 3fa1fe68-b915-4053-a3e1-a8294833fe3c
560
+ [xaddrs] [http://192.168.1.14:2020/onvif/device_service]
561
+ [types] [tdn:NetworkVideoTransmitter]
451
562
  [scopes] [name/C210] [hardware/C210] [Profile/Streaming] [location/Hong Kong]
452
563
 
453
564
  [2] 192.168.1.17:8000
454
- [id] urn:uuid:7d04ff31-61e6-11f0-a00c-6056eef47207
455
- [xaddrs] http://192.168.1.17:8000/onvif/device_service
456
- [types] dn:NetworkVideoTransmitter tds:Device
565
+ [id] 7d04ff31-61e6-11f0-a00c-6056eef47207
566
+ [xaddrs] [http://192.168.1.17:8000/onvif/device_service]
567
+ [types] [dn:NetworkVideoTransmitter] [tds:Device]
457
568
  [scopes] [type/NetworkVideoTransmitter] [location/unknown] [name/IPC_123465959]
458
569
 
459
570
  Select device number 1-2 or q to quit: 1
@@ -486,6 +597,65 @@ onvif devicemgmt GetCapabilities Category=All -H 192.168.1.17 -P 8000 -u admin -
486
597
  onvif ptz ContinuousMove ProfileToken=Profile_1 Velocity='{"PanTilt": {"x": 0.1}}' -H 192.168.1.17 -P 8000 -u admin -p admin123
487
598
  ```
488
599
 
600
+ **4. ONVIF Product Search**
601
+
602
+ The CLI includes a built-in database of ONVIF-compatible products that can be searched to help identify and research devices before connecting (applied at [`>=v0.2.0`](https://github.com/nirsimetri/onvif-python/releases/tag/v0.2.0)).
603
+
604
+ **Basic Search:**
605
+ ```bash
606
+ # Search by model name
607
+ onvif --search "C210"
608
+ onvif -s "axis camera"
609
+
610
+ # Search by manufacturer
611
+ onvif --search "hikvision"
612
+ onvif -s "dahua"
613
+
614
+ # Search by any keyword
615
+ onvif --search "ptz"
616
+ onvif -s "thermal"
617
+ ```
618
+
619
+ **Paginated Results:**
620
+ ```bash
621
+ # Navigate through multiple pages of results
622
+ onvif --search "hikvision" --page 2 --per-page 5
623
+ onvif -s "axis" --page 1 --per-page 10
624
+
625
+ # Adjust results per page (1-100)
626
+ onvif --search "camera" --per-page 20
627
+ ```
628
+
629
+ **Search Database Information:**
630
+
631
+ The product database contains comprehensive information about tested ONVIF devices:
632
+
633
+ | Field | Description |
634
+ |-------|-------------|
635
+ | **ID** | Unique product identifier |
636
+ | **Test Date** | When the device was last tested/verified |
637
+ | **Model** | Device model name and number |
638
+ | **Firmware** | Tested firmware version |
639
+ | **Profiles** | Supported ONVIF profiles (S, G, T, C, A, etc.) |
640
+ | **Category** | Device type (Camera, NVR, etc.) |
641
+ | **Type** | Specific device classification |
642
+ | **Company** | Manufacturer name |
643
+
644
+ **Example Output:**
645
+ ```
646
+ Found 15 product(s) matching: hikvision
647
+ Showing 1-10 of 15 results
648
+
649
+ ID | Test Date | Model | Firmware | Profiles | Category | Type | Company
650
+ ----|---------------------|-------------------|----------|----------|----------|---------|---------
651
+ 342 | 2024-08-15 17:53:12 | DS-2CD2143G2-IU | V5.7.3 | S,G,T | Camera | device | Hikvision
652
+ 341 | 2024-08-14 14:22:05 | DS-2DE2A404IW-DE3 | V5.6.15 | S,G,T | Camera | device | Hikvision
653
+ ...
654
+
655
+ Page 1 of 2
656
+ Navigation: Next: --page 2
657
+ ```
658
+
489
659
  ### CLI Parameters
490
660
 
491
661
  All `ONVIFClient` parameters (like `--timeout`, `--https`, `--cache`, etc.) are available as command-line arguments. Use `onvif --help` to see all available options.
@@ -820,6 +990,7 @@ Below is a list of ONVIF services implemented and supported by this library, alo
820
990
  | 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
991
  | 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
992
  | 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 |
993
+ | 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
994
  | 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
995
  | 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
996
  | 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 +1151,7 @@ This project is an **independent open-source implementation** of the [ONVIF](htt
980
1151
  - Use of the ONVIF trademark in this repository is solely nominative and does not imply any partnership, certification, or official status.
981
1152
  - This project includes WSDL/XSD/HTML files from the official ONVIF specifications.
982
1153
  - These files are © ONVIF and are redistributed here for interoperability purposes.
1154
+ - 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
1155
  - All rights to the ONVIF specifications are reserved by ONVIF.
984
1156
 
985
1157
  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/).