node-onvif
Version:
The node-onvif is a Node.js module which allows you to communicate with the network camera which supports the ONVIF specifications.
998 lines (910 loc) • 30.8 kB
JavaScript
/* ------------------------------------------------------------------
* node-onvif - service-ptz.js
*
* Copyright (c) 2016 - 2017, Futomi Hatano, All rights reserved.
* Released under the MIT license
* Date: 2017-08-30
* ---------------------------------------------------------------- */
;
const mUrl = require('url');
const mOnvifSoap = require('./soap.js');
/* ------------------------------------------------------------------
* Constructor: OnvifServicePtz(params)
* - params:
* - xaddr : URL of the entry point for the media service
* (Required)
* - user : User name (Optional)
* - pass : Password (Optional)
* - time_diff: ms
* ---------------------------------------------------------------- */
function OnvifServicePtz(params) {
this.xaddr = '';
this.user = '';
this.pass = '';
let err_msg = '';
if(err_msg = mOnvifSoap.isInvalidValue(params, 'object')) {
throw new Error('The value of "params" was invalid: ' + err_msg);
}
if('xaddr' in params) {
if(err_msg = mOnvifSoap.isInvalidValue(params['xaddr'], 'string')) {
throw new Error('The "xaddr" property was invalid: ' + err_msg);
} else {
this.xaddr = params['xaddr'];
}
} else {
throw new Error('The "xaddr" property is required.');
}
if('user' in params) {
if(err_msg = mOnvifSoap.isInvalidValue(params['user'], 'string', true)) {
throw new Error('The "user" property was invalid: ' + err_msg);
} else {
this.user = params['user'] || '';
}
}
if('pass' in params) {
if(err_msg = mOnvifSoap.isInvalidValue(params['pass'], 'string', true)) {
throw new Error('The "pass" property was invalid: ' + err_msg);
} else {
this.pass = params['pass'] || '';
}
}
this.oxaddr = mUrl.parse(this.xaddr);
if(this.user) {
this.oxaddr.auth = this.user + ':' + this.pass;
}
this.time_diff = params['time_diff'];
this.name_space_attr_list = [
'xmlns:ter="http://www.onvif.org/ver10/error"',
'xmlns:xs="http://www.w3.org/2001/XMLSchema"',
'xmlns:tt="http://www.onvif.org/ver10/schema"',
'xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl"'
];
}
OnvifServicePtz.prototype._createRequestSoap = function(body) {
let soap = mOnvifSoap.createRequestSoap({
'body': body,
'xmlns': this.name_space_attr_list,
'diff': this.time_diff,
'user': this.user,
'pass': this.pass
});
return soap;
};
/* ------------------------------------------------------------------
* Method: setAuth(user, pass)
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.setAuth = function(user, pass) {
this.user = user || '';
this.pass = pass || '';
if(this.user) {
this.oxaddr.auth = this.user + ':' + this.pass;
} else {
this.oxaddr.auth = '';
}
};
/* ------------------------------------------------------------------
* Method: getNodes([callback])
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.getNodes = function(callback) {
let promise = new Promise((resolve, reject) => {
let soap_body = '<tptz:GetNodes/>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'GetNodes', soap).then((result) => {
try {
let d = result['data']['PTZNode'];
if(!Array.isArray(d)) {
result['data']['PTZNode'] = [d];
}
} catch(e) {}
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
/* ------------------------------------------------------------------
* Method: getNode(params[, callback])
* - params:
* - NodeToken | String | required | a token of the targeted PTZ node
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.getNode = function(params, callback) {
let promise = new Promise((resolve, reject) => {
let err_msg = '';
if(err_msg = mOnvifSoap.isInvalidValue(params, 'object')) {
reject(new Error('The value of "params" was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['NodeToken'], 'string')) {
reject(new Error('The "NodeToken" property was invalid: ' + err_msg));
return;
}
let soap_body = '';
soap_body += '<tptz:GetNode>';
soap_body += '<tptz:NodeToken>' + params['NodeToken'] + '</tptz:NodeToken>';
soap_body += '</tptz:GetNode>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'GetNode', soap).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
/* ------------------------------------------------------------------
* Method: getConfigurations([callback])
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.getConfigurations = function(callback) {
let promise = new Promise((resolve, reject) => {
let soap_body = '<tptz:GetConfigurations/>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'GetConfigurations', soap).then((result) => {
try {
let d = result['data']['PTZConfiguration'];
if(!Array.isArray(d)) {
result['data']['PTZConfiguration'] = [d];
}
} catch(e) {}
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
/* ------------------------------------------------------------------
* Method: getConfiguration(params[, callback])
* - params:
* - ConfigurationToken | String | required | a token of the targeted PTZ node
*
* No device I own does not work well for now.
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.getConfiguration = function(params, callback) {
let promise = new Promise((resolve, reject) => {
let err_msg = '';
if(err_msg = mOnvifSoap.isInvalidValue(params, 'object')) {
reject(new Error('The value of "params" was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['ConfigurationToken'], 'string')) {
reject(new Error('The "ConfigurationToken" property was invalid: ' + err_msg));
return;
}
let soap_body = '';
soap_body += '<tptz:GetConfiguration>';
soap_body += '<tptz:PTZConfigurationToken>' + params['ConfigurationToken'] + '</tptz:PTZConfigurationToken>';
soap_body += '</tptz:GetConfiguration>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'GetConfiguration', soap).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
/* ------------------------------------------------------------------
* Method: getConfigurationOptions(params[, callback])
* - params:
* - ConfigurationToken | String | required | a token of the targeted PTZ node
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.getConfigurationOptions = function(params, callback) {
let promise = new Promise((resolve, reject) => {
let err_msg = '';
if(err_msg = mOnvifSoap.isInvalidValue(params, 'object')) {
reject(new Error('The value of "params" was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['ConfigurationToken'], 'string')) {
reject(new Error('The "ConfigurationToken" property was invalid: ' + err_msg));
return;
}
let soap_body = '';
soap_body += '<tptz:GetConfigurationOptions>';
soap_body += '<tptz:ConfigurationToken>' + params['ConfigurationToken'] + '</tptz:ConfigurationToken>';
soap_body += '</tptz:GetConfigurationOptions>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'GetConfigurationOptions', soap).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
/* ------------------------------------------------------------------
* Method: getStatus(params[, callback])
* - params:
* - ProfileToken | String | required |
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.getStatus = function(params, callback) {
let promise = new Promise((resolve, reject) => {
let err_msg = '';
if(err_msg = mOnvifSoap.isInvalidValue(params, 'object')) {
reject(new Error('The value of "params" was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['ProfileToken'], 'string')) {
reject(new Error('The "ProfileToken" property was invalid: ' + err_msg));
return;
}
let soap_body = '';
soap_body += '<tptz:GetStatus>';
soap_body += '<tptz:ProfileToken>' + params['ProfileToken'] + '</tptz:ProfileToken>';
soap_body += '</tptz:GetStatus>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'GetStatus', soap).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
/* ------------------------------------------------------------------
* Method: continuousMove(params[, callback])
* - params:
* - ProfileToken | String | required |
* - Velocity | Object | required | pan, tilt and zoom
* - x | Float | required |
* - y | Float | required |
* - x | Float | required |
* - Timeout | Integer | optional | timeout (seconds)
*
* {
* 'ProfileToken': 'Profile1',
* 'Velocity': {'x': 0.5, 'y': 1.0, 'z': 1.0},
* 'Timeout': 5
* }
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.continuousMove = function(params, callback) {
let promise = new Promise((resolve, reject) => {
let err_msg = '';
if(err_msg = mOnvifSoap.isInvalidValue(params, 'object')) {
reject(new Error('The value of "params" was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['ProfileToken'], 'string')) {
reject(new Error('The "ProfileToken" property was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['Velocity'], 'object')) {
reject(new Error('The "Velocity" property was invalid: ' + err_msg));
return;
}
let klist = ['x', 'y', 'z'];
for(let i=0; i<klist.length; i++) {
let k = klist[i];
let v = params['Velocity'][k];
if(err_msg = mOnvifSoap.isInvalidValue(v, 'float')) {
reject(new Error('The "' + k + '" property was invalid: ' + err_msg));
return;
}
}
if('Timeout' in params) {
if(err_msg = mOnvifSoap.isInvalidValue(params['Timeout'], 'integer')) {
reject(new Error('The "Timeout" property was invalid: ' + err_msg));
return;
}
}
let soap_body = '';
soap_body += '<tptz:ContinuousMove>';
soap_body += '<tptz:ProfileToken>' + params['ProfileToken'] + '</tptz:ProfileToken>';
soap_body += '<tptz:Velocity>';
soap_body += '<tt:PanTilt x="' + params['Velocity']['x'] + '" y="' + params['Velocity']['y'] + '"></tt:PanTilt>';
if(params['Velocity']['z']) {
soap_body += '<tt:Zoom x="' + params['Velocity']['z'] + '"></tt:Zoom>';
}
soap_body += '</tptz:Velocity>';
if(params['Timeout']) {
soap_body += '<tptz:Timeout>PT' + params['Timeout'] + 'S</tptz:Timeout>';
}
soap_body += '</tptz:ContinuousMove>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'ContinuousMove', soap).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
/* ------------------------------------------------------------------
* Method: absoluteMove(params[, callback])
* - params:
* - ProfileToken | String | required |
* - Position | Object | required | pan, tilt and zoom
* - x | Float | required |
* - y | Float | required |
* - x | Float | required |
* - Speed | Object | optional | pan, tilt and zoom
* - x | Float | required |
* - y | Float | required |
* - x | Float | required |
*
* {
* 'ProfileToken': cam['ProfileToken'],
* 'Position' : {'x': 0.5, 'y': -1, 'z': 0.5},
* 'Speed' : {'x': 1, 'y': 1, 'z': 1}
* }
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.absoluteMove = function(params, callback) {
let promise = new Promise((resolve, reject) => {
let err_msg = '';
if(err_msg = mOnvifSoap.isInvalidValue(params, 'object')) {
reject(new Error('The value of "params" was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['ProfileToken'], 'string')) {
reject(new Error('The "ProfileToken" property was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['Position'], 'object')) {
reject(new Error('The "Position" property was invalid: ' + err_msg));
return;
}
let klist = ['x', 'y', 'z'];
for(let i=0; i<klist.length; i++) {
let k = klist[i];
let v = params['Position'][k];
if(err_msg = mOnvifSoap.isInvalidValue(v, 'float')) {
reject(new Error('The "' + k + '" property was invalid: ' + err_msg));
return;
}
}
if('Speed' in params) {
if(err_msg = mOnvifSoap.isInvalidValue(params['Speed'], 'object')) {
reject(new Error('The "Speed" property was invalid: ' + err_msg));
return;
}
for(let i=0; i<klist.length; i++) {
let k = klist[i];
let v = params['Speed'][k];
if(err_msg = mOnvifSoap.isInvalidValue(v, 'float')) {
reject(new Error('The "' + k + '" property was invalid: ' + err_msg));
return;
}
}
}
let soap_body = '';
soap_body += '<tptz:AbsoluteMove>';
soap_body += '<tptz:ProfileToken>' + params['ProfileToken'] + '</tptz:ProfileToken>';
soap_body += '<tptz:Position>';
soap_body += '<tt:PanTilt x="' + params['Position']['x'] + '" y="' + params['Position']['y'] + '" />';
soap_body += '<tt:Zoom x="' + params['Position']['z'] + '"/>';
soap_body += '</tptz:Position>';
if(params['Speed']) {
soap_body += '<tptz:Speed>';
soap_body += '<tt:PanTilt x="' + params['Speed']['x'] + '" y="' + params['Speed']['y'] + '" />';
soap_body += '<tt:Zoom x="' + params['Speed']['z'] + '"/>';
soap_body += '</tptz:Speed>';
}
soap_body += '</tptz:AbsoluteMove>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'AbsoluteMove', soap).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
/* ------------------------------------------------------------------
* Method: relativeMove(params[, callback])
* - params:
* - ProfileToken | String | required |
* - Translation | Object | required | pan, tilt and zoom
* - x | Float | required |
* - y | Float | required |
* - x | Float | required |
* - Speed | Object | optional | pan, tilt and zoom
* - x | Float | required |
* - y | Float | required |
* - x | Float | required |
*
* {
* 'ProfileToken': 'Profile1',
* 'Translation' : {'x': 0.5, 'y': 1.0, 'z': 1.0},
* 'Speed' : {'x': 1, 'y': 1, 'z': 1}
* }
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.relativeMove = function(params, callback) {
let promise = new Promise((resolve, reject) => {
let err_msg = '';
if(err_msg = mOnvifSoap.isInvalidValue(params, 'object')) {
reject(new Error('The value of "params" was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['ProfileToken'], 'string')) {
reject(new Error('The "ProfileToken" property was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['Translation'], 'object')) {
reject(new Error('The "Translation" property was invalid: ' + err_msg));
return;
}
let klist = ['x', 'y', 'z'];
for(let i=0; i<klist.length; i++) {
let k = klist[i];
let v = params['Translation'][k];
if(err_msg = mOnvifSoap.isInvalidValue(v, 'float')) {
reject(new Error('The "' + k + '" property was invalid: ' + err_msg));
return;
}
}
let soap_body = '';
soap_body += '<tptz:RelativeMove>';
soap_body += '<tptz:ProfileToken>' + params['ProfileToken'] + '</tptz:ProfileToken>';
soap_body += '<tptz:Translation>';
soap_body += '<tt:PanTilt x="' + params['Translation']['x'] + '" y="' + params['Translation']['y'] + '"/>';
soap_body += '<tt:Zoom x="' + params['Translation']['z'] + '"/>';
soap_body += '</tptz:Translation>';
soap_body += '</tptz:RelativeMove>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'RelativeMove', soap).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
/* ------------------------------------------------------------------
* Method: stop(params[, callback])
* - params:
* - ProfileToken | String | required | a token of the targeted PTZ node
* - PanTilt | Boolean | optional | true or false
* - Zoom | Boolean | optional | true or false
*
* {
* 'ProfileToken': 'Profile1',
* 'PanTilt': true,
* 'Zoom': true
* }
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.stop = function(params, callback) {
let promise = new Promise((resolve, reject) => {
let err_msg = '';
if(err_msg = mOnvifSoap.isInvalidValue(params, 'object')) {
reject(new Error('The value of "params" was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['ProfileToken'], 'string')) {
reject(new Error('The "ProfileToken" property was invalid: ' + err_msg));
return;
}
if('PanTilt' in params) {
if(err_msg = mOnvifSoap.isInvalidValue(params['PanTilt'], 'boolean')) {
reject(new Error('The "PanTilt" property was invalid: ' + err_msg));
return;
}
}
if('Zoom' in params) {
if(err_msg = mOnvifSoap.isInvalidValue(params['Zoom'], 'boolean')) {
reject(new Error('The "Zoom" property was invalid: ' + err_msg));
return;
}
}
let soap_body = '';
soap_body += '<tptz:Stop>';
soap_body += '<tptz:ProfileToken>' + params['ProfileToken'] + '</tptz:ProfileToken>';
if('PanTilt' in params) {
soap_body += '<tptz:PanTilt>' + params['PanTilt'] + '</tptz:PanTilt>';
}
if('Zoom' in params) {
soap_body += '<tptz:Zoom>' + params['Zoom'] + '</tptz:Zoom>';
}
soap_body += '</tptz:Stop>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'Stop', soap).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
/* ------------------------------------------------------------------
* Method: gotoHomePosition(params[, callback])
* - params:
* - ProfileToken | String | required |
* - Speed | Float | optional |
*
* {
* 'ProfileToken': 'Profile1',
* 'Speed': 0.5
* }
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.gotoHomePosition = function(params, callback) {
let promise = new Promise((resolve, reject) => {
let err_msg = '';
if(err_msg = mOnvifSoap.isInvalidValue(params, 'object')) {
reject(new Error('The value of "params" was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['ProfileToken'], 'string')) {
reject(new Error('The "ProfileToken" property was invalid: ' + err_msg));
return;
}
if('Speed' in params) {
if(err_msg = mOnvifSoap.isInvalidValue(params['Speed'], 'float')) {
reject(new Error('The "Speed" property was invalid: ' + err_msg));
return;
}
}
let soap_body = '';
soap_body += '<tptz:GotoHomePosition>';
soap_body += '<tptz:ProfileToken>' + params['ProfileToken'] + '</tptz:ProfileToken>';
if('Speed' in params) {
soap_body += '<tptz:Speed>' + params['Speed'] + '</tptz:Speed>';
}
soap_body += '</tptz:GotoHomePosition>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'GotoHomePosition', soap).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
/* ------------------------------------------------------------------
* Method: setHomePosition(params[, callback])
* - params:
* - ProfileToken | String | required |
*
* {
* 'ProfileToken': 'Profile1'
* }
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.setHomePosition = function(params, callback) {
let promise = new Promise((resolve, reject) => {
let err_msg = '';
if(err_msg = mOnvifSoap.isInvalidValue(params, 'object')) {
reject(new Error('The value of "params" was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['ProfileToken'], 'string')) {
reject(new Error('The "ProfileToken" property was invalid: ' + err_msg));
return;
}
let soap_body = '';
soap_body += '<tptz:SetHomePosition>';
soap_body += '<tptz:ProfileToken>' + params['ProfileToken'] + '</tptz:ProfileToken>';
soap_body += '</tptz:SetHomePosition>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'SetHomePosition', soap).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
/* ------------------------------------------------------------------
* Method: setPreset(params[, callback])
* - params:
* - ProfileToken | String | required | a token of the targeted PTZ node
* - PresetToken | String | optional |
* - PresetName | String | optional |
*
* {
* 'ProfileToken': 'Profile1',
* 'PresetName' : 'Preset1'
* }
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.setPreset = function(params, callback) {
let promise = new Promise((resolve, reject) => {
let err_msg = '';
if(err_msg = mOnvifSoap.isInvalidValue(params, 'object')) {
reject(new Error('The value of "params" was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['ProfileToken'], 'string')) {
reject(new Error('The "ProfileToken" property was invalid: ' + err_msg));
return;
}
if('PresetToken' in params) {
if(err_msg = mOnvifSoap.isInvalidValue(params['PresetToken'], 'string')) {
reject(new Error('The "PresetToken" property was invalid: ' + err_msg));
return;
}
}
if('PresetName' in params) {
if(err_msg = mOnvifSoap.isInvalidValue(params['PresetName'], 'string')) {
reject(new Error('The "PresetName" property was invalid: ' + err_msg));
return;
}
}
if(!('PresetToken' in params) && !('PresetName' in params)) {
reject('Either the "ProfileToken" or the "PresetName" property must be specified.');
return;
}
let soap_body = '';
soap_body += '<tptz:SetPreset>';
soap_body += '<tptz:ProfileToken>' + params['ProfileToken'] + '</tptz:ProfileToken>';
if('PresetToken' in params) {
soap_body += '<tptz:PresetToken>' + params['PresetToken'] + '</tptz:PresetToken>';
}
if('PresetName' in params) {
soap_body += '<tptz:PresetName>' + params['PresetName'] + '</tptz:PresetName>';
}
soap_body += '</tptz:SetPreset>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'SetPreset', soap).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
/* ------------------------------------------------------------------
* Method: getPresets(params[, callback])
* - params:
* - ProfileToken | String | required | a token of the targeted PTZ node
*
* {
* 'ProfileToken': 'Profile1'
* }
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.getPresets = function(params, callback) {
let promise = new Promise((resolve, reject) => {
let err_msg = '';
if(err_msg = mOnvifSoap.isInvalidValue(params, 'object')) {
reject(new Error('The value of "params" was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['ProfileToken'], 'string')) {
reject(new Error('The "ProfileToken" property was invalid: ' + err_msg));
return;
}
let soap_body = '';
soap_body += '<tptz:GetPresets>';
soap_body += '<tptz:ProfileToken>' + params['ProfileToken'] + '</tptz:ProfileToken>';
soap_body += '</tptz:GetPresets>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'GetPresets', soap).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
/* ------------------------------------------------------------------
* Method: gotoPreset(params[, callback])
* - params:
* - ProfileToken | String | required |
* - PresetToken | String | required |
* - Speed | Object | optional | pan, tilt and zoom
* - x | Float | required |
* - y | Float | required |
* - x | Float | required |
*
* {
* 'ProfileToken': 'Profile1',
* 'PresetToken' : 'Preset1',
* 'Speed' : {'x': 0.5, 'y': 1.0, 'z': 0.5}
* }
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.gotoPreset = function(params, callback) {
let promise = new Promise((resolve, reject) => {
let err_msg = '';
if(err_msg = mOnvifSoap.isInvalidValue(params, 'object')) {
reject(new Error('The value of "params" was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['ProfileToken'], 'string')) {
reject(new Error('The "ProfileToken" property was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['PresetToken'], 'string')) {
reject(new Error('The "PresetToken" property was invalid: ' + err_msg));
return;
}
let klist = ['x', 'y', 'z'];
if('Speed' in params) {
if(err_msg = mOnvifSoap.isInvalidValue(params['Speed'], 'object')) {
reject(new Error('The "Speed" property was invalid: ' + err_msg));
return;
}
for(let i=0; i<klist.length; i++) {
let k = klist[i];
let v = params['Speed'][k];
if(err_msg = mOnvifSoap.isInvalidValue(v, 'float')) {
reject(new Error('The "' + k + '" property was invalid: ' + err_msg));
return;
}
}
}
let soap_body = '';
soap_body += '<tptz:GotoPreset>';
soap_body += '<tptz:ProfileToken>' + params['ProfileToken'] + '</tptz:ProfileToken>';
soap_body += '<tptz:PresetToken>' + params['PresetToken'] + '</tptz:PresetToken>';
if(params['Speed']) {
soap_body += '<tptz:Speed>';
soap_body += '<tt:PanTilt x="' + params['Speed']['x'] + '" y="' + params['Speed']['y'] + '" />';
soap_body += '<tt:Zoom x="' + params['Speed']['z'] + '"/>';
soap_body += '</tptz:Speed>';
}
soap_body += '</tptz:GotoPreset>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'GotoPreset', soap).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
/* ------------------------------------------------------------------
* Method: removePreset(params[, callback])
* - params:
* - ProfileToken | String | required | a token of the targeted PTZ node
* - PresetToken | String | required |
*
* {
* 'ProfileToken': 'Profile1',
* 'PresetToken' : 'Preset1'
* }
* ---------------------------------------------------------------- */
OnvifServicePtz.prototype.removePreset = function(params, callback) {
let promise = new Promise((resolve, reject) => {
let err_msg = '';
if(err_msg = mOnvifSoap.isInvalidValue(params, 'object')) {
reject(new Error('The value of "params" was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['ProfileToken'], 'string')) {
reject(new Error('The "ProfileToken" property was invalid: ' + err_msg));
return;
}
if(err_msg = mOnvifSoap.isInvalidValue(params['PresetToken'], 'string')) {
reject(new Error('The "PresetToken" property was invalid: ' + err_msg));
return;
}
let soap_body = '';
soap_body += '<tptz:RemovePreset>';
soap_body += '<tptz:ProfileToken>' + params['ProfileToken'] + '</tptz:ProfileToken>';
soap_body += '<tptz:PresetToken>' + params['PresetToken'] + '</tptz:PresetToken>';
soap_body += '</tptz:RemovePreset>';
let soap = this._createRequestSoap(soap_body);
mOnvifSoap.requestCommand(this.oxaddr, 'RemovePreset', soap).then((result) => {
resolve(result);
}).catch((error) => {
reject(error);
});
});
if(callback) {
promise.then((result) => {
callback(null, result);
}).catch((error) => {
callback(error);
});
} else {
return promise;
}
};
module.exports = OnvifServicePtz;