Skip to content

time sync problems #82

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 55 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
1b6f20b
Replace SOAP client suds by zeep for Python3 compatibility - first wo…
FalkTannhaeuser Jun 21, 2017
2fa9b69
First version compatible both with Python 2 and 3
FalkTannhaeuser Jun 21, 2017
ac157d5
Update setup files
FalkTannhaeuser Jun 22, 2017
611d1eb
debugging
FalkTannhaeuser Jun 22, 2017
e3550b0
Add caching; debugging (first version working both for getting and se…
FalkTannhaeuser Jun 23, 2017
fece842
Port cli.py to zeep
FalkTannhaeuser Jun 26, 2017
4a298bd
Update tests
FalkTannhaeuser Jun 27, 2017
d2c05e1
Merge upstream changes from quatanium/python-onvif, as far as applicable
FalkTannhaeuser Jun 29, 2017
c97cbe7
Update install instructions in README, fixes #2
Aug 6, 2017
b561673
Merge branch (pull request) 'hovissimo-patch-2' into zeep
FalkTannhaeuser Aug 16, 2017
be51e2a
Add explanation about 'pip' command for installation
FalkTannhaeuser Aug 16, 2017
e9ec97f
Fix formatting
FalkTannhaeuser Aug 16, 2017
22f569e
Fix warning: https://github.com/FalkTannhaeuser/python-onvif-zeep/iss…
FalkTannhaeuser Sep 21, 2017
4691372
Fix wsdl target directory for Windows Anaconda and Cygwin Python; upl…
FalkTannhaeuser Sep 22, 2017
9d3c15d
added transport capabilities
lattice0 Oct 22, 2017
5bf8551
added transports support
lattice0 Oct 23, 2017
aa4f031
Merge pull request #10 from lucaszanella/zeep
FalkTannhaeuser Dec 10, 2017
14d9b0a
fix client.py imports for python3
iomihai Jan 23, 2018
a025443
fix events pullpoint service xaddr
iomihai Jan 23, 2018
ea56212
Add HTTPS client support
iomihai Apr 2, 2018
728375f
gitignore Pipfile
iomihai Apr 2, 2018
b4df798
create_pullpoint_service() binding fix
iomihai Apr 3, 2018
beac5f1
Merge pull request #17 from iomihai/zeep
FalkTannhaeuser Apr 9, 2018
d9d8151
Bump version after merging pull request
FalkTannhaeuser Apr 9, 2018
21ae5d3
Fixed client for zeep v3.0.0
dd-alexander Jun 20, 2018
c7e784f
Merge pull request #20 from Brootux/zeep
FalkTannhaeuser Jun 20, 2018
a49e461
Bumped version to 0.2.11 (now requires zeep >= 3.0.0)
FalkTannhaeuser Jun 21, 2018
0d7f847
Allow the use of a time delta parameter between local and camera time.
FalkTannhaeuser Aug 20, 2018
3273b20
Dead code removal
FalkTannhaeuser Aug 20, 2018
1cf4cee
Bump version number
FalkTannhaeuser Aug 20, 2018
a5f3f20
This was not working. Still for Python 2. Made it into a simplistic i…
frawau Nov 8, 2018
1d22a96
Merge pull request #31 from frawau/zeep
FalkTannhaeuser Dec 13, 2018
980b579
added a notification service in order to facilitate requesting a noti…
monocongo Feb 13, 2019
fb5141b
fixed bug where we had the service name as "notifications" (plural) i…
monocongo Feb 13, 2019
de05595
added an additional subscription service to facilitate subscription r…
monocongo Feb 18, 2019
8a18caa
removed the unused `from_template` parameter from the ONVIFCamera.cre…
monocongo Feb 18, 2019
247c5bc
various minor cleanups suggested by PyCharm file inspection (PEP8 com…
monocongo Feb 19, 2019
f737db9
removed unused parameter variable `portType` from the `ONVIFService` …
monocongo Feb 19, 2019
8aba823
Allow services to be created with custom transport
GeertvanHorrik Apr 12, 2019
33f8051
Merge pull request #38 from monocongo/new_service_notifications
FalkTannhaeuser Apr 17, 2019
ed37d16
Merge branch 'zeep' into pr/async-services
FalkTannhaeuser Apr 17, 2019
d549eed
Merge pull request #44 from GeertvanHorrik/pr/async-services
FalkTannhaeuser Apr 17, 2019
88b0e29
Fix: Incorrect Onvif namespace prefix
hongquan May 10, 2019
5fae485
add the ability to rewrite the address and the port if the camera is …
davidea72 Jun 11, 2019
1ab5e9d
revised by kmjeon
lordet01 Apr 7, 2020
7a26ac1
AbsoluteMove
Ahn-HyungJun Apr 17, 2020
7908158
Prevent hangup of 50X10_32M cams on event pullpoint create
sespivak Jun 10, 2022
95e03d6
[fix] Blank Topic title in PullMessages https://github.com/FalkTannha…
Aug 18, 2023
cfdc454
Merge pull request #67 from intflow/intflow_onvif
FalkTannhaeuser May 1, 2024
85ebcf0
Merge pull request #75 from davidea72/zeep
FalkTannhaeuser Aug 8, 2024
ef27776
Merge pull request #46 from sunshine-tech/fix/ns_prefix
FalkTannhaeuser Aug 8, 2024
84987b8
Merge pull request #91 from sespivak/zeep
FalkTannhaeuser Aug 8, 2024
7c92b34
Merge pull request #114 from wanglong001/zeep
FalkTannhaeuser Aug 8, 2024
83cf9ab
wsdl installation path compatible with virtual environments
felmoreno1726 Jul 25, 2025
87a7ae9
Merge pull request #139 from Guardis-AI/fix/venv-wsdl-dir
FalkTannhaeuser Jul 25, 2025
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
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,8 @@ docs/_build/

# PyBuilder
target/

.idea
.venv
Pipfile
Pipfile.lock
19 changes: 7 additions & 12 deletions README.rst
Original file line number Diff line number Diff line change
@@ -1,29 +1,24 @@
python-onvif
python-onvif-zeep
============

ONVIF Client Implementation in Python

Dependencies
------------
`Python 2.x` (For a Python 3 compatible fork, see https://github.com/FalkTannhaeuser/python-onvif-zeep)
`zeep <http://docs.python-zeep.org>`_ >= 3.0.0

`suds <https://pypi.python.org/pypi/suds>`_ >= 0.4

`suds-passworddigest <https://pypi.python.org/pypi/suds_passworddigest>`_

Install python-onvif
--------------------
Install python-onvif-zeep
-------------------------
**From Source**

You should clone this repository and run setup.py::

cd python-onvif && python setup.py install
cd python-onvif-zeep && python setup.py install

**From PyPI**
Alternatively, you can run::

::
pip install --upgrade onvif_zeep

pip install onvif

Getting Started
---------------
Expand Down
270 changes: 270 additions & 0 deletions examples/AbsoluteMove.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,270 @@
import asyncio, sys, os
from onvif import ONVIFCamera
import time

IP="192.168.1.64" # Camera IP address
PORT=80 # Port
USER="admin" # Username
PASS="intflow3121" # Password


XMAX = 1
XMIN = -1
XNOW = 0.5
YMAX = 1
YMIN = -1
YNOW = 0.5
Move = 0.1
Velocity = 1
Zoom = 0
positionrequest = None
ptz = None
active = False
ptz_configuration_options = None
media_profile = None

def do_move(ptz, request):

global active
if active:
ptz.Stop({'ProfileToken': request.ProfileToken})
active = True
ptz.AbsoluteMove(request)

def move_up(ptz, request):

if YNOW - Move <= -1:
request.Position.PanTilt.y = YNOW
else:
request.Position.PanTilt.y = YNOW - Move


do_move(ptz, request)

def move_down(ptz, request):

if YNOW + Move >= 1:
request.Position.PanTilt.y = YNOW
else:
request.Position.PanTilt.y = YNOW + Move


do_move(ptz, request)

def move_right(ptz, request):

if XNOW - Move >= -0.99:
request.Position.PanTilt.x = XNOW - Move
elif abs(XNOW + Move) >= 0.0:
request.Position.PanTilt.x = abs(XNOW) - Move
elif abs(XNOW) <= 0.01:
request.Position.PanTilt.x = XNOW

request.Position.PanTilt.y = YNOW
do_move(ptz, request)

def move_left(ptz, request):

if XNOW + Move <= 1.0:
request.Position.PanTilt.x = XNOW + Move
elif XNOW <= 1.0 and XNOW > 0.99:
request.Position.PanTilt.x = -XNOW
elif XNOW < 0:
request.Position.PanTilt.x = XNOW + Move
elif XNOW <= -0.105556 and XNOW > -0.11:
request.Position.PanTilt.x = XNOW

request.Position.PanTilt.y = YNOW
do_move(ptz, request)


def move_upleft(ptz, request):

if YNOW == -1:
request.Position.PanTilt.y = YNOW
else:
request.Position.PanTilt.y = YNOW - Move
if XNOW + Move <= 1.0:
request.Position.PanTilt.x = XNOW + Move
elif XNOW <= 1.0 and XNOW > 0.99:
request.Position.PanTilt.x = -XNOW
elif XNOW < 0:
request.Position.PanTilt.x = XNOW + Move
elif XNOW <= -0.105556 and XNOW > -0.11:
request.Position.PanTilt.x = XNOW
do_move(ptz, request)

def move_upright(ptz, request):

if YNOW == -1:
request.Position.PanTilt.y = YNOW
else:
request.Position.PanTilt.y = YNOW - Move

if XNOW - Move >= -0.99:
request.Position.PanTilt.x = XNOW - Move
elif abs(XNOW + Move) >= 0.0:
request.Position.PanTilt.x = abs(XNOW) - Move
elif abs(XNOW) <= 0.01:
request.Position.PanTilt.x = XNOW

do_move(ptz, request)

def move_downleft(ptz, request):

if YNOW - Move == 1:
request.Position.PanTilt.y = YNOW
else:
request.Position.PanTilt.y = YNOW - Move

if XNOW + Move <= 1.0:
request.Position.PanTilt.x = XNOW + Move
elif XNOW <= 1.0 and XNOW > 0.99:
request.Position.PanTilt.x = -XNOW
elif XNOW < 0:
request.Position.PanTilt.x = XNOW + Move
elif XNOW <= -0.105556 and XNOW > -0.11:
request.Position.PanTilt.x = XNOW

do_move(ptz, request)

def move_downright(ptz, request):

if YNOW == -1:
request.Position.PanTilt.y = YNOW
else:
request.Position.PanTilt.y = YNOW - Move

if XNOW - Move >= -0.99:
request.Position.PanTilt.x = XNOW - Move
elif abs(XNOW + Move) >= 0.0:
request.Position.PanTilt.x = abs(XNOW) - Move
elif abs(XNOW) <= 0.01:
request.Position.PanTilt.x = XNOW

do_move(ptz, request)

def Zoom_in(ptz,request):

if Zoom + Move >= 1.0:
request.Position.Zoom = 1.0
else:
request.Position.Zoom = Zoom + Move
do_move(ptz, request)

def Zoom_out(ptz,request):

if Zoom - Move <= 0.0:
request.Position.Zoom = 0.0
else:
request.Position.Zoom = Zoom - Move
do_move(ptz,request)

def setup_move():
mycam = ONVIFCamera(IP, PORT, USER, PASS)
# Create media service object
media = mycam.create_media_service()

# Create ptz service object
global ptz , ptz_configuration_options, media_profile
ptz = mycam.create_ptz_service()

# Get target profile
media_profile = media.GetProfiles()[0]


request = ptz.create_type('GetConfigurationOptions')
request.ConfigurationToken = media_profile.PTZConfiguration.token
ptz_configuration_options = ptz.GetConfigurationOptions(request)

request_configuration = ptz.create_type('GetConfiguration')
request_configuration.PTZConfigurationToken = media_profile.PTZConfiguration.token
ptz_configuration = ptz.GetConfiguration(request_configuration)

request_setconfiguration = ptz.create_type('SetConfiguration')
request_setconfiguration.PTZConfiguration = ptz_configuration

global positionrequest

positionrequest = ptz.create_type('AbsoluteMove')
positionrequest.ProfileToken = media_profile.token

if positionrequest.Position is None :
positionrequest.Position = ptz.GetStatus({'ProfileToken': media_profile.token}).Position
positionrequest.Position.PanTilt.space = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].URI
positionrequest.Position.Zoom.space = ptz_configuration_options.Spaces.AbsoluteZoomPositionSpace[0].URI
if positionrequest.Speed is None :
positionrequest.Speed = ptz.GetStatus({'ProfileToken': media_profile.token}).Position
positionrequest.Speed.PanTilt.space = ptz_configuration_options.Spaces.PanTiltSpeedSpace[0].URI

def Get_Status():
# Get range of pan and tilt
global XMAX, XMIN, YMAX, YMIN, XNOW, YNOW, Velocity, Zoom
XMAX = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].XRange.Max
XMIN = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].XRange.Min
YMAX = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].YRange.Max
YMIN = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].YRange.Min
XNOW = ptz.GetStatus({'ProfileToken': media_profile.token}).Position.PanTilt.x
YNOW = ptz.GetStatus({'ProfileToken': media_profile.token}).Position.PanTilt.y
Velocity = ptz_configuration_options.Spaces.PanTiltSpeedSpace[0].XRange.Max
Zoom = ptz.GetStatus({'ProfileToken': media_profile.token}).Position.Zoom.x


def readin():
"""Reading from stdin and displaying menu"""
global positionrequest, ptz

selection = sys.stdin.readline().strip("\n")
lov=[ x for x in selection.split(" ") if x != ""]
if lov:

if lov[0].lower() in ["u","up"]:
move_up(ptz,positionrequest)
elif lov[0].lower() in ["d","do","dow","down"]:
move_down(ptz,positionrequest)
elif lov[0].lower() in ["l","le","lef","left"]:
move_left(ptz,positionrequest)
elif lov[0].lower() in ["l","le","lef","left"]:
move_left(ptz,positionrequest)
elif lov[0].lower() in ["r","ri","rig","righ","right"]:
move_right(ptz,positionrequest)
elif lov[0].lower() in ["ul"]:
move_upleft(ptz,positionrequest)
elif lov[0].lower() in ["ur"]:
move_upright(ptz,positionrequest)
elif lov[0].lower() in ["dl"]:
move_downleft(ptz,positionrequest)
elif lov[0].lower() in ["dr"]:
move_downright(ptz,positionrequest)
elif lov[0].lower() in ["s","st","sto","stop"]:
ptz.Stop({'ProfileToken': positionrequest.ProfileToken})
active = False
else:
print("What are you asking?\tI only know, 'up','down','left','right', 'ul' (up left), \n\t\t\t'ur' (up right), 'dl' (down left), 'dr' (down right) and 'stop'")

print("")
print("Your command: ", end='',flush=True)

# Test Define
# def move(ptz, request):

# request.Position.PanTilt.y = -1
# request.Position.PanTilt.x = 0

# do_move(ptz,request)

if __name__ == '__main__':

setup_move()
# Get_Status()
# Zoom_out(ptz,positionrequest)
# Get_Status()
# move(ptz,positionrequest)
while True:
if active == True:
time.sleep(1)
active = False
else:
Get_Status()

move_up(ptz, positionrequest)
Loading