1- from time import sleep
2-
1+ import asyncio , sys
32from onvif import ONVIFCamera
43
4+ IP = "192.168.0.100" # Camera IP address
5+ PORT = 10080 # Port
6+ USER = "admin" # Username
7+ PASS = "password" # Password
8+
9+
510XMAX = 1
611XMIN = - 1
712YMAX = 1
813YMIN = - 1
14+ moverequest = None
15+ ptz = None
16+ active = False
917
10- def perform_move (ptz , request , timeout ):
18+ def do_move (ptz , request ):
1119 # Start continuous move
20+ global active
21+ if active :
22+ ptz .Stop ({'ProfileToken' : request .ProfileToken })
23+ active = True
1224 ptz .ContinuousMove (request )
13- # Wait a certain time
14- sleep (timeout )
15- # Stop continuous move
16- ptz .Stop ({'ProfileToken' : request .ProfileToken })
17-
18- def move_up (ptz , request , timeout = 1 ):
19- print 'move up...'
20- request .Velocity .PanTilt ._x = 0
21- request .Velocity .PanTilt ._y = YMAX
22- perform_move (ptz , request , timeout )
23-
24- def move_down (ptz , request , timeout = 1 ):
25- print 'move down...'
26- request .Velocity .PanTilt ._x = 0
27- request .Velocity .PanTilt ._y = YMIN
28- perform_move (ptz , request , timeout )
29-
30- def move_right (ptz , request , timeout = 1 ):
31- print 'move right...'
32- request .Velocity .PanTilt ._x = XMAX
33- request .Velocity .PanTilt ._y = 0
34- perform_move (ptz , request , timeout )
35-
36- def move_left (ptz , request , timeout = 1 ):
37- print 'move left...'
38- request .Velocity .PanTilt ._x = XMIN
39- request .Velocity .PanTilt ._y = 0
40- perform_move (ptz , request , timeout )
41-
42- def continuous_move ():
43- mycam = ONVIFCamera ('192.168.0.112' , 80 , 'admin' , '12345' )
25+
26+ def move_up (ptz , request ):
27+ print ('move up...' )
28+ request .Velocity .PanTilt .x = 0
29+ request .Velocity .PanTilt .y = YMAX
30+ do_move (ptz , request )
31+
32+ def move_down (ptz , request ):
33+ print ('move down...' )
34+ request .Velocity .PanTilt .x = 0
35+ request .Velocity .PanTilt .y = YMIN
36+ do_move (ptz , request )
37+
38+ def move_right (ptz , request ):
39+ print ('move right...' )
40+ request .Velocity .PanTilt .x = XMAX
41+ request .Velocity .PanTilt .y = 0
42+ do_move (ptz , request )
43+
44+ def move_left (ptz , request ):
45+ print ('move left...' )
46+ request .Velocity .PanTilt .x = XMIN
47+ request .Velocity .PanTilt .y = 0
48+ do_move (ptz , request )
49+
50+
51+ def move_upleft (ptz , request ):
52+ print ('move up left...' )
53+ request .Velocity .PanTilt .x = XMIN
54+ request .Velocity .PanTilt .y = YMAX
55+ do_move (ptz , request )
56+
57+ def move_upright (ptz , request ):
58+ print ('move up left...' )
59+ request .Velocity .PanTilt .x = XMAX
60+ request .Velocity .PanTilt .y = YMAX
61+ do_move (ptz , request )
62+
63+ def move_downleft (ptz , request ):
64+ print ('move down left...' )
65+ request .Velocity .PanTilt .x = XMIN
66+ request .Velocity .PanTilt .y = YMIN
67+ do_move (ptz , request )
68+
69+ def move_downright (ptz , request ):
70+ print ('move down left...' )
71+ request .Velocity .PanTilt .x = XMAX
72+ request .Velocity .PanTilt .y = YMIN
73+ do_move (ptz , request )
74+
75+ def setup_move ():
76+ mycam = ONVIFCamera (IP , PORT , USER , PASS )
4477 # Create media service object
4578 media = mycam .create_media_service ()
79+
4680 # Create ptz service object
81+ global ptz
4782 ptz = mycam .create_ptz_service ()
4883
4984 # Get target profile
50- media_profile = media .GetProfiles ()[0 ];
85+ media_profile = media .GetProfiles ()[0 ]
5186
5287 # Get PTZ configuration options for getting continuous move range
5388 request = ptz .create_type ('GetConfigurationOptions' )
54- request .ConfigurationToken = media_profile .PTZConfiguration ._token
89+ request .ConfigurationToken = media_profile .PTZConfiguration .token
5590 ptz_configuration_options = ptz .GetConfigurationOptions (request )
5691
57- request = ptz .create_type ('ContinuousMove' )
58- request .ProfileToken = media_profile ._token
92+ global moverequest
93+ moverequest = ptz .create_type ('ContinuousMove' )
94+ moverequest .ProfileToken = media_profile .token
95+ if moverequest .Velocity is None :
96+ moverequest .Velocity = ptz .GetStatus ({'ProfileToken' : media_profile .token }).Position
5997
60- ptz .Stop ({'ProfileToken' : media_profile ._token })
6198
6299 # Get range of pan and tilt
63100 # NOTE: X and Y are velocity vector
@@ -67,17 +104,53 @@ def continuous_move():
67104 YMAX = ptz_configuration_options .Spaces .ContinuousPanTiltVelocitySpace [0 ].YRange .Max
68105 YMIN = ptz_configuration_options .Spaces .ContinuousPanTiltVelocitySpace [0 ].YRange .Min
69106
70- # move right
71- move_right (ptz , request )
72-
73- # move left
74- move_left (ptz , request )
75-
76- # Move up
77- move_up (ptz , request )
78-
79- # move down
80- move_down (ptz , request )
81107
108+ def readin ():
109+ """Reading from stdin and displaying menu"""
110+ global moverequest , ptz
111+
112+ selection = sys .stdin .readline ().strip ("\n " )
113+ lov = [ x for x in selection .split (" " ) if x != "" ]
114+ if lov :
115+
116+ if lov [0 ].lower () in ["u" ,"up" ]:
117+ move_up (ptz ,moverequest )
118+ elif lov [0 ].lower () in ["d" ,"do" ,"dow" ,"down" ]:
119+ move_down (ptz ,moverequest )
120+ elif lov [0 ].lower () in ["l" ,"le" ,"lef" ,"left" ]:
121+ move_left (ptz ,moverequest )
122+ elif lov [0 ].lower () in ["l" ,"le" ,"lef" ,"left" ]:
123+ move_left (ptz ,moverequest )
124+ elif lov [0 ].lower () in ["r" ,"ri" ,"rig" ,"righ" ,"right" ]:
125+ move_right (ptz ,moverequest )
126+ elif lov [0 ].lower () in ["ul" ]:
127+ move_upleft (ptz ,moverequest )
128+ elif lov [0 ].lower () in ["ur" ]:
129+ move_upright (ptz ,moverequest )
130+ elif lov [0 ].lower () in ["dl" ]:
131+ move_downleft (ptz ,moverequest )
132+ elif lov [0 ].lower () in ["dr" ]:
133+ move_downright (ptz ,moverequest )
134+ elif lov [0 ].lower () in ["s" ,"st" ,"sto" ,"stop" ]:
135+ ptz .Stop ({'ProfileToken' : moverequest .ProfileToken })
136+ active = False
137+ else :
138+ print ("What are you asking?\t I only know, 'up','down','left','right', 'ul' (up left), \n \t \t \t 'ur' (up right), 'dl' (down left), 'dr' (down right) and 'stop'" )
139+
140+ print ("" )
141+ print ("Your command: " , end = '' ,flush = True )
142+
143+
82144if __name__ == '__main__' :
83- continuous_move ()
145+ setup_move ()
146+ loop = asyncio .get_event_loop ()
147+ try :
148+ loop .add_reader (sys .stdin ,readin )
149+ print ("Use Ctrl-C to quit" )
150+ print ("Your command: " , end = '' ,flush = True )
151+ loop .run_forever ()
152+ except :
153+ pass
154+ finally :
155+ loop .remove_reader (sys .stdin )
156+ loop .close ()
0 commit comments