1
0
This repository has been archived on 2025-01-10. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
2024-01-07 08:16:23 +01:00

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
};