Merge pull request #16 from themoosman/moos-add-ptz

Add PTZ Functionality
This commit is contained in:
Alano Terblanche
2020-10-20 15:30:08 +02:00
committed by GitHub
4 changed files with 144 additions and 2 deletions

View File

@@ -25,6 +25,7 @@ This project intends to stick with [PEP8](https://www.python.org/dev/peps/pep-00
GET: GET:
- [X] Login - [X] Login
- [X] Logout
- [ ] Display -> OSD - [ ] Display -> OSD
- [ ] Recording -> Encode (Clear and Fluent Stream) - [ ] Recording -> Encode (Clear and Fluent Stream)
- [ ] Recording -> Advance (Scheduling) - [ ] Recording -> Advance (Scheduling)
@@ -73,6 +74,7 @@ SET:
- [ ] User -> Add User - [ ] User -> Add User
- [ ] User -> Manage User - [ ] User -> Manage User
- [ ] Device -> HDD/SD Card - [ ] Device -> HDD/SD Card
- [x] PTZ
- [x] Zoom - [x] Zoom
- [x] Focus - [x] Focus
- [ ] Image (Brightness, Contrass, Saturation, Hue, Sharp, Mirror, Rotate) - [ ] Image (Brightness, Contrass, Saturation, Hue, Sharp, Mirror, Rotate)

View File

@@ -5,6 +5,7 @@ from .display import DisplayAPIMixin
from .network import NetworkAPIMixin from .network import NetworkAPIMixin
from .system import SystemAPIMixin from .system import SystemAPIMixin
from .user import UserAPIMixin from .user import UserAPIMixin
from .ptz import PtzAPIMixin
from resthandle import Request from resthandle import Request
@@ -14,7 +15,8 @@ class APIHandler(SystemAPIMixin,
DeviceAPIMixin, DeviceAPIMixin,
DisplayAPIMixin, DisplayAPIMixin,
RecordingAPIMixin, RecordingAPIMixin,
ZoomAPIMixin): ZoomAPIMixin,
PtzAPIMixin):
""" """
The APIHandler class is the backend part of the API, the actual API calls The APIHandler class is the backend part of the API, the actual API calls
are implemented in Mixins. are implemented in Mixins.
@@ -69,6 +71,20 @@ class APIHandler(SystemAPIMixin,
print("Error Login\n", e) print("Error Login\n", e)
raise raise
def logout(self) -> bool:
"""
Logout of the camera
:return: bool
"""
try:
data = [{"cmd": "Logout", "action": 0}]
ret = self._execute_command('Logout', data)
print(ret)
return True
except Exception as e:
print("Error Logout\n", e)
return False
def _execute_command(self, command, data, multi=False): def _execute_command(self, command, data, multi=False):
""" """
Send a POST request to the IP camera with given data. Send a POST request to the IP camera with given data.

120
api/ptz.py Normal file
View File

@@ -0,0 +1,120 @@
class PtzAPIMixin:
"""
API for PTZ functions.
"""
def _send_operation(self, operation, speed, index=None):
if index is None:
data = [{"cmd": "PtzCtrl", "action": 0, "param": {"channel": 0, "op": operation, "speed": speed}}]
else:
data = [{"cmd": "PtzCtrl", "action": 0, "param": {
"channel": 0, "op": operation, "speed": speed, "id": index}}]
return self._execute_command('PtzCtrl', data)
def _send_noparm_operation(self, operation):
data = [{"cmd": "PtzCtrl", "action": 0, "param": {"channel": 0, "op": operation}}]
return self._execute_command('PtzCtrl', data)
def _send_set_preset(self, operation, enable, preset=1, name='pos1'):
data = [{"cmd": "SetPtzPreset", "action": 0, "param": {
"channel": 0, "enable": enable, "id": preset, "name": name}}]
return self._execute_command('PtzCtrl', data)
def go_to_preset(self, speed=60, index=1):
"""
Move the camera to a preset location
:return: response json
"""
return self._send_operation('ToPos', speed=speed, index=index)
def add_preset(self, preset=1, name='pos1'):
"""
Adds the current camera position to the specified preset.
:return: response json
"""
return self._send_set_preset('PtzPreset', enable=1, preset=preset, name=name)
def remove_preset(self, preset=1, name='pos1'):
"""
Removes the specified preset
:return: response json
"""
return self._send_set_preset('PtzPreset', enable=0, preset=preset, name=name)
def move_right(self, speed=25):
"""
Move the camera to the right
The camera moves self.stop_ptz() is called.
:return: response json
"""
return self._send_operation('Right', speed=speed)
def move_right_up(self, speed=25):
"""
Move the camera to the right and up
The camera moves self.stop_ptz() is called.
:return: response json
"""
return self._send_operation('RightUp', speed=speed)
def move_right_down(self, speed=25):
"""
Move the camera to the right and down
The camera moves self.stop_ptz() is called.
:return: response json
"""
return self._send_operation('RightDown', speed=speed)
def move_left(self, speed=25):
"""
Move the camera to the left
The camera moves self.stop_ptz() is called.
:return: response json
"""
return self._send_operation('Left', speed=speed)
def move_left_up(self, speed=25):
"""
Move the camera to the left and up
The camera moves self.stop_ptz() is called.
:return: response json
"""
return self._send_operation('LeftUp', speed=speed)
def move_left_down(self, speed=25):
"""
Move the camera to the left and down
The camera moves self.stop_ptz() is called.
:return: response json
"""
return self._send_operation('LeftDown', speed=speed)
def move_up(self, speed=25):
"""
Move the camera up.
The camera moves self.stop_ptz() is called.
:return: response json
"""
return self._send_operation('Up', speed=speed)
def move_down(self, speed=25):
"""
Move the camera down.
The camera moves self.stop_ptz() is called.
:return: response json
"""
return self._send_operation('Down', speed=speed)
def stop_ptz(self):
"""
Stops the cameras current action.
:return: response json
"""
return self._send_noparm_operation('Stop')
def auto_movement(self, speed=25):
"""
Move the camera in a clockwise rotation.
The camera moves self.stop_ptz() is called.
:return: response json
"""
return self._send_operation('Auto', speed=speed)

4
requirements.txt Normal file
View File

@@ -0,0 +1,4 @@
requests
opencv-python
numpy
socks