132 lines
4.0 KiB
JavaScript
132 lines
4.0 KiB
JavaScript
const log = Java.type('org.slf4j.LoggerFactory').getLogger('js.utils.lib');
|
|
log.info('Load utils.lib module');
|
|
|
|
function compare(a, b, operator) {
|
|
// Hint: a = currentState, b = targetState
|
|
let logMsg = '';
|
|
let returnValue = undefined;
|
|
|
|
try {
|
|
logMsg = `Quantity comparison of ${a} and ${b} with operator ${operator}`;
|
|
switch (operator) {
|
|
case '==':
|
|
returnValue = a.equal(b);
|
|
break;
|
|
case '!=':
|
|
returnValue = !a.equal(b);
|
|
break;
|
|
case '<' :
|
|
returnValue = a.lessThan(b);
|
|
break;
|
|
case '<=':
|
|
returnValue = a.lessThanOrEqual(b);
|
|
break;
|
|
case '>' :
|
|
returnValue = a.greaterThan(b);
|
|
break;
|
|
case '>=':
|
|
returnValue = a.greaterThanOrEqual(b);
|
|
break;
|
|
default:
|
|
log.error(`${operator} is no valid operator`);
|
|
return;
|
|
}
|
|
} catch(e) {
|
|
logMsg = `Standard comparison of ${a} and ${b} with operator ${operator}`;
|
|
switch (operator) {
|
|
case '==':
|
|
returnValue = (a == b);
|
|
break;
|
|
case '!=':
|
|
returnValue = !(a == b);
|
|
break;
|
|
case '<' :
|
|
returnValue = (a < b);
|
|
break;
|
|
case '<=':
|
|
returnValue = (a <= b);
|
|
break;
|
|
case '>' :
|
|
returnValue = (a > b);
|
|
break;
|
|
case '>=':
|
|
returnValue = (a >= b);
|
|
break;
|
|
}
|
|
}
|
|
|
|
log.debug(logMsg);
|
|
return returnValue;
|
|
}
|
|
|
|
function convertValue(value) {
|
|
log.debug('Converting value ' + value + ' of type ' + typeof value);
|
|
if(typeof value === 'string') {
|
|
if(value.includes(' ')) {
|
|
let logMsg = '';
|
|
let returnValue;
|
|
try {
|
|
logMsg = 'Quantity: ' + value;
|
|
returnValue = Quantity(value);
|
|
} catch(e) {
|
|
logMsg = 'Not a Quantity but has a space, leaving as a string: ' + value;
|
|
returnValue = value;
|
|
} finally {
|
|
log.debug(logMsg);
|
|
return returnValue;
|
|
}
|
|
} else if(!isNaN(value)) {
|
|
log.debug('Number: ' + value)
|
|
return Number.parseFloat(value);
|
|
} else if(value == 'UnDefType' || value == 'NULL' || value == 'UNDEF') {
|
|
log.debug('UnDefType: ' + value);
|
|
return 'UnDefType';
|
|
}
|
|
log.debug('String: ' + value);
|
|
return value;
|
|
} else if(value instanceof DecimalType || value instanceof PercentType) {
|
|
log.debug('DecimalType or PercentType: ' + value);
|
|
return value.floatValue();
|
|
} else if(value instanceof QuantityType) {
|
|
log.debug('QuantityType: ' + value);
|
|
return Quantity(value);
|
|
} else {
|
|
log.debug('String: ' + value);
|
|
return value.toString();
|
|
}
|
|
}
|
|
|
|
function distanceFrom(locationA, locationB) {
|
|
let lat1 = (locationA.split(',')[0]) * (Math.PI / 180);
|
|
let lon1 = (locationA.split(',')[1]) * (Math.PI / 180);
|
|
let lat2 = (locationB.split(',')[0]) * (Math.PI / 180);
|
|
let lon2 = (locationB.split(',')[1]) * (Math.PI / 180);
|
|
|
|
if ((lat1 == lat2) && (lon1 == lon2)) {
|
|
return 0;
|
|
}
|
|
|
|
// Haversine formula
|
|
let dlon = lon2 - lon1;
|
|
let dlat = lat2 - lat1;
|
|
let a = Math.pow(Math.sin(dlat / 2), 2)
|
|
+ Math.cos(lat1) * Math.cos(lat2)
|
|
* Math.pow(Math.sin(dlon / 2),2);
|
|
let c = 2 * Math.asin(Math.sqrt(a));
|
|
|
|
// Radius of earth in meters
|
|
let r = 6371000;
|
|
|
|
// calculate the result
|
|
let result = `${(c * r).toFixed()} m`
|
|
|
|
log.debug(`Calculated distance between ${locationA} and ${locationB} is ${result}`);
|
|
return result;
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
compare,
|
|
convertValue,
|
|
distanceFrom
|
|
}; |