Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions examples/add_media_profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,26 @@
7. Verify the profile was created successfully
"""

from onvif import ONVIFClient
import sys

from onvif import ONVIFClient, ONVIFOperationException

HOST = "192.168.1.3"
PORT = 80
USERNAME = "admin"
PASSWORD = "admin123"
PASSWORD = "password"

try:
# Initialize ONVIF client
client = ONVIFClient(HOST, PORT, USERNAME, PASSWORD)
client = ONVIFClient(host=HOST, port=PORT, username=USERNAME, password=PASSWORD)
media = client.media()

# Get available video sources
print("Getting video sources...")
video_sources = media.GetVideoSources()
if not video_sources:
print("No video sources available")
exit(1)
sys.exit()

print(f"Found {len(video_sources)} video source(s)")
video_source_token = video_sources[0].token
Expand All @@ -45,7 +47,7 @@
video_source_configs = media.GetVideoSourceConfigurations()
if not video_source_configs:
print("No video source configurations available")
exit(1)
sys.exit()

video_source_config_token = video_source_configs[0].token
print(f"Using video source configuration token: {video_source_config_token}")
Expand All @@ -55,7 +57,7 @@
video_encoder_configs = media.GetVideoEncoderConfigurations()
if not video_encoder_configs:
print("No video encoder configurations available")
exit(1)
sys.exit()

video_encoder_config_token = video_encoder_configs[0].token
print(f"Using video encoder configuration token: {video_encoder_config_token}")
Expand Down Expand Up @@ -112,7 +114,7 @@
)
print(f"Stream URI: {stream_uri.Uri}")

except Exception as e: # pylint: disable=broad-exception-caught
except (ONVIFOperationException, KeyError, AttributeError) as e:
print(f"Error: {e}")
import traceback

Expand Down
8 changes: 4 additions & 4 deletions examples/add_onvif_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,21 @@
a new user using the Core (Device Management) service.
"""

from onvif import ONVIFClient
from onvif import ONVIFClient, ONVIFOperationException

HOST = "192.168.1.3"
PORT = 80
USERNAME = "admin"
PASSWORD = "admin123"
PASSWORD = "password"

try:
client = ONVIFClient(HOST, PORT, USERNAME, PASSWORD)
client = ONVIFClient(host=HOST, port=PORT, username=USERNAME, password=PASSWORD)
device = client.devicemgmt()
device.CreateUsers(
User=[{"Username": "newuser", "Password": "newpassword", "UserLevel": "User"}]
)

# print current users to verify addition
print(device.GetUsers())
except Exception as e: # pylint: disable=broad-exception-caught
except ONVIFOperationException as e:
print(e)
10 changes: 6 additions & 4 deletions examples/check_all_capabilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,18 @@
capabilities using the Core (Device Management) service.
"""

from onvif import CacheMode, ONVIFClient
from onvif import CacheMode, ONVIFClient, ONVIFOperationException

HOST = "192.168.1.3"
PORT = 80
USERNAME = "admin"
PASSWORD = "admin123"
PASSWORD = "password"

try:
client = ONVIFClient(HOST, PORT, USERNAME, PASSWORD, cache=CacheMode.NONE)
client = ONVIFClient(
host=HOST, port=PORT, username=USERNAME, password=PASSWORD, cache=CacheMode.NONE
)
capabilities = client.devicemgmt().GetCapabilities(Category="All")
print(capabilities)
except Exception as e: # pylint: disable=broad-exception-caught
except ONVIFOperationException as e:
print(e)
8 changes: 4 additions & 4 deletions examples/check_all_services.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@
of all available services using the Core (Device Management) service.
"""

from onvif import ONVIFClient
from onvif import ONVIFClient, ONVIFOperationException

HOST = "192.168.1.3"
PORT = 80
USERNAME = "admin"
PASSWORD = "admin123"
PASSWORD = "password"

try:
client = ONVIFClient(HOST, PORT, USERNAME, PASSWORD)
client = ONVIFClient(host=HOST, port=PORT, username=USERNAME, password=PASSWORD)
services = client.devicemgmt().GetServices(IncludeCapability=True)
print(services)
except Exception as e: # pylint: disable=broad-exception-caught
except ONVIFOperationException as e:
print(e)
8 changes: 4 additions & 4 deletions examples/check_device.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,21 @@

import json

from onvif import ONVIFClient
from onvif import ONVIFClient, ONVIFOperationException

HOST = "192.168.1.3"
PORT = 8000
USERNAME = "admin"
PASSWORD = "admin123"
PASSWORD = "password"

try:
client = ONVIFClient(HOST, PORT, USERNAME, PASSWORD)
client = ONVIFClient(host=HOST, port=PORT, username=USERNAME, password=PASSWORD)
device = client.devicemgmt()

# print device information
print(json.dumps(device.to_dict(device.GetDeviceInformation()), indent=4))

# print device scopes
print(json.dumps(device.to_dict(device.GetScopes()), indent=4))
except Exception as e: # pylint: disable=broad-exception-caught
except ONVIFOperationException as e:
print(e)
8 changes: 4 additions & 4 deletions examples/check_ptz.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@

from time import sleep

from onvif import ONVIFClient
from onvif import ONVIFClient, ONVIFOperationException

HOST = "192.168.1.3"
PORT = 80
USERNAME = "admin"
PASSWORD = "admin123"
PASSWORD = "password"

try:
client = ONVIFClient(HOST, PORT, USERNAME, PASSWORD)
client = ONVIFClient(host=HOST, port=PORT, username=USERNAME, password=PASSWORD)
media = client.media()
profile = media.GetProfiles()[0] # use first profile
ptz = client.ptz()
Expand All @@ -33,5 +33,5 @@
)
sleep(2.5)
ptz.Stop(ProfileToken=profile.token)
except Exception as e: # pylint: disable=broad-exception-caught
except (ONVIFOperationException, KeyError) as e:
print(e)
9 changes: 4 additions & 5 deletions examples/device_discovery_raw.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import socket
import struct
import sys
import traceback
import uuid

from lxml import etree
Expand Down Expand Up @@ -55,14 +56,14 @@ def get_network_interface():
local_ip = s.getsockname()[0]
s.close()
return local_ip
except Exception:
except OSError:
# Try alternative method to get local IP
try:
hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)
if local_ip and not local_ip.startswith("127."):
return local_ip
except Exception:
except OSError:
pass

# Return empty string instead of "0.0.0.0"
Expand Down Expand Up @@ -158,7 +159,6 @@ def send_probe_and_get_responses(network_interface=None, timeout=WS_DISCOVERY_TI

except Exception as e:
print(f"Error during discovery: {e}")
import traceback

traceback.print_exc()

Expand Down Expand Up @@ -346,9 +346,8 @@ def print_device_info(device, is_onvif=True):
except KeyboardInterrupt:
print("\n\nDiscovery interrupted by user.")
sys.exit(0)
except Exception as e:
except Exception as e: # pylint: disable=broad-exception-caught
print(f"\nUnexpected error: {e}")
import traceback

traceback.print_exc()
sys.exit(1)
75 changes: 75 additions & 0 deletions examples/direct_zeep.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
"""
Path: examples/direct_zeep.py
Author: @kaburagisec
Created: October 21, 2026

This script demonstrates how to invoke ONVIF operations using
the `zeep` library directly, without relying on the `onvif-python` module.
"""

from requests import Session
from requests.auth import HTTPDigestAuth
from zeep import Client, Settings
from zeep.plugins import HistoryPlugin
from zeep.transports import Transport

HOST = "192.168.69.249"
PORT = 80
USERNAME = "admin"
PASSWORD = "password"

WSDL = "https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl"
ADDRESS = f"http://{HOST}:{PORT}/devicemgmt"

session = Session()
session.auth = HTTPDigestAuth(USERNAME, PASSWORD)

history = HistoryPlugin()

client = Client(
wsdl=WSDL,
transport=Transport(session=session, timeout=15),
settings=Settings(strict=True, xml_huge_tree=True),
plugins=[history],
)

service = client.create_service(
"{http://www.onvif.org/ver10/device/wsdl}DeviceBinding",
ADDRESS,
)

for schema_type in client.wsdl.types.types:
if getattr(schema_type, "name", None) == "SystemCapabilities":
print("Type:", schema_type)
print("Attributes:")

for attribute in schema_type.attributes:
print(" ", attribute)

try:
result = service.GetServiceCapabilities()

print("=== Zeep parsed result ===")
print(result)

print("\n=== System capabilities ===")
system = result.Capabilities.System

print("FirmwareUpgrade:", system.FirmwareUpgrade)
print("HttpFirmwareUpgrade:", system.HttpFirmwareUpgrade)

except Exception as exc:
print(f"{type(exc).__name__}: {exc}")

finally:
if history.last_received:
print("\n=== Raw SOAP response ===")
print(
client.transport.binding_options
if False
else __import__("lxml.etree", fromlist=["etree"]).tostring(
history.last_received["envelope"],
pretty_print=True,
encoding="unicode",
)
)
22 changes: 16 additions & 6 deletions examples/error_handling.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
HOST = "192.168.1.14"
PORT = 2020
USERNAME = "admintapo"
PASSWORD = "admin123"
PASSWORD = "password"


def example_1_safe_call():
Expand All @@ -40,7 +40,9 @@ def example_1_safe_call():
print("Example 1: Using safe_call")
print("=" * 60)

client = ONVIFClient(HOST, PORT, USERNAME, PASSWORD, cache=CacheMode.NONE)
client = ONVIFClient(
host=HOST, port=PORT, username=USERNAME, password=PASSWORD, cache=CacheMode.NONE
)
device = client.devicemgmt()

# Returns None if operation is not supported
Expand Down Expand Up @@ -68,7 +70,9 @@ def example_2_decorator():
print("Example 2: Using @ignore_unsupported decorator")
print("=" * 60)

client = ONVIFClient(HOST, PORT, USERNAME, PASSWORD, cache=CacheMode.NONE)
client = ONVIFClient(
host=HOST, port=PORT, username=USERNAME, password=PASSWORD, cache=CacheMode.NONE
)
device = client.devicemgmt()

@ignore_unsupported
Expand Down Expand Up @@ -105,7 +109,9 @@ def example_3_manual_handling():
print("Example 3: Manual exception handling")
print("=" * 60)

client = ONVIFClient(HOST, PORT, USERNAME, PASSWORD, cache=CacheMode.NONE)
client = ONVIFClient(
host=HOST, port=PORT, username=USERNAME, password=PASSWORD, cache=CacheMode.NONE
)
device = client.devicemgmt()

# Try GetSystemUris (not always supported), fallback to alternative
Expand Down Expand Up @@ -167,7 +173,9 @@ def example_4_batch_operations():
print("Example 4: Batch operations with graceful degradation")
print("=" * 60)

client = ONVIFClient(HOST, PORT, USERNAME, PASSWORD, cache=CacheMode.NONE)
client = ONVIFClient(
host=HOST, port=PORT, username=USERNAME, password=PASSWORD, cache=CacheMode.NONE
)
device = client.devicemgmt()

# Define operations to try
Expand Down Expand Up @@ -214,7 +222,9 @@ def example_5_critical_operations():
print("Example 5: Critical operations (don't ignore errors)")
print("=" * 60)

client = ONVIFClient(HOST, PORT, USERNAME, PASSWORD, cache=CacheMode.NONE)
client = ONVIFClient(
host=HOST, port=PORT, username=USERNAME, password=PASSWORD, cache=CacheMode.NONE
)
device = client.devicemgmt()

# Critical operation - must succeed
Expand Down
8 changes: 4 additions & 4 deletions examples/get_analytics_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@
analytics modules using the Analytics service.
"""

from onvif import ONVIFClient
from onvif import ONVIFClient, ONVIFOperationException

HOST = "192.168.1.3"
PORT = 80
USERNAME = "admin"
PASSWORD = "admin123"
PASSWORD = "password"

try:
client = ONVIFClient(HOST, PORT, USERNAME, PASSWORD)
client = ONVIFClient(host=HOST, port=PORT, username=USERNAME, password=PASSWORD)
profile = client.media().GetProfiles()[0] # use the first profile
analytics = client.analytics()

Expand All @@ -29,5 +29,5 @@
ConfigurationToken=profile.VideoAnalyticsConfiguration.token
)
print("Supported Analytics Modules:\n{}".format(supported_analytics_modules))
except Exception as e:
except (ONVIFOperationException, KeyError) as e:
print(e)
Loading
Loading