knxultimate
Version:
KNX IP protocol implementation for Node. This is the ENGINE of Node-Red KNX-Ultimate node.
189 lines • 5.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const KnxLog_1 = require("../KnxLog");
const utils_1 = require("../utils");
const logger = (0, KnxLog_1.module)('DPT9');
const config = {
id: 'DPT9',
formatAPDU: (value) => {
const apdu_data = Buffer.alloc(2);
value = Number(value);
if (!isFinite(value)) {
logger.warn('cannot write non-numeric or undefined value');
}
else {
value = (0, utils_1.round)(value, 2);
const arr = (0, utils_1.frexp)(value);
const mantissa = arr[0];
const exponent = arr[1];
let max_mantissa = 0;
let e;
for (e = exponent; e >= -15; e--) {
max_mantissa = (0, utils_1.ldexp)(100 * mantissa, e);
if (max_mantissa > -2048 && max_mantissa < 2047)
break;
}
const sign = mantissa < 0 ? 1 : 0;
const mant = mantissa < 0 ? ~(max_mantissa ^ 2047) : max_mantissa;
const exp = exponent - e;
apdu_data[0] = (sign << 7) + (exp << 3) + (mant >> 8);
apdu_data[1] = mant % 256;
}
return apdu_data;
},
fromBuffer: (buf) => {
if (buf.length !== 2) {
logger.warn('fromBuffer: buf should be 2 bytes long (got %d bytes)', buf.length);
return null;
}
const sign = buf[0] >> 7;
const exponent = (buf[0] & 0b01111000) >> 3;
let mantissa = 256 * (buf[0] & 0b00000111) + buf[1];
mantissa = sign === 1 ? ~(mantissa ^ 2047) : mantissa;
return parseFloat((0, utils_1.ldexp)(0.01 * mantissa, exponent).toPrecision(15));
},
basetype: {
bitlength: 16,
valuetype: 'basic',
desc: '16-bit floating point value',
help: `// Send 16-bit floating point value.
msg.payload = 25;
return msg;`,
},
subtypes: {
'001': {
name: 'Temperature (°C)',
desc: 'temperature',
unit: '°C',
range: [-273, 670760],
},
'002': {
name: 'Temperature difference (°C)',
desc: 'temperature difference',
unit: '°C',
range: [-670760, 670760],
},
'003': {
name: 'Kelvin/hour (K/h)',
desc: 'kelvin/hour',
unit: '°K/h',
range: [-670760, 670760],
},
'004': {
name: 'Lux (lux)',
desc: 'lux',
unit: 'lux',
range: [0, 670760],
},
'005': {
name: 'Speed (m/s)',
desc: 'wind speed',
unit: 'm/s',
range: [0, 670760],
},
'006': {
name: 'Pressure (Pa)',
desc: 'pressure',
unit: 'Pa',
range: [0, 670760],
},
'007': {
name: 'Humidity (%)',
desc: 'humidity',
unit: '%',
range: [0, 670760],
},
'008': {
name: 'Parts/million (ppm)',
desc: 'air quality',
unit: 'ppm',
range: [0, 670760],
},
'009': {
name: 'Airflow (m3/h)',
desc: 'Airflow',
unit: 'm3/h',
range: [-671088.64, 670433.28],
},
'010': {
name: 'Time (s)',
desc: 'time(sec)',
unit: 's',
range: [-670760, 670760],
},
'011': {
name: 'Time (ms)',
desc: 'time(msec)',
unit: 'ms',
range: [-670760, 670760],
},
'020': {
name: 'Voltage (mV)',
desc: 'voltage',
unit: 'mV',
range: [-670760, 670760],
},
'021': {
name: 'Current (mA)',
desc: 'current',
unit: 'mA',
range: [-670760, 670760],
},
'022': {
name: 'Power density (W/m²)',
desc: 'power density',
unit: 'W/m²',
range: [-670760, 670760],
},
'023': {
name: 'Kelvin/percent (K/%)',
desc: 'Kelvin / %',
unit: 'K/%',
range: [-670760, 670760],
},
'024': {
name: 'Power (kW)',
desc: 'power (kW)',
unit: 'kW',
range: [-670760, 670760],
},
'025': {
name: 'Volume flow (l/h)',
desc: 'volume flow',
unit: 'l/h',
range: [-670760, 670760],
},
'026': {
name: 'Rain amount (l/m²)',
desc: 'rain amount',
unit: 'l/m²',
range: [-670760, 670760],
},
'027': {
name: 'Temperature (Fahrenheit)',
desc: 'temperature (F)',
unit: '°F',
range: [-459.6, 670760],
},
'028': {
name: 'Wind speed (km/h)',
desc: 'wind speed (km/h)',
unit: 'km/h',
range: [0, 670760],
},
'029': {
name: 'Absolute humidity (g/m3)',
desc: 'absolute humidity (g/m3)',
unit: 'g/m3',
range: [0, 670760],
},
'030': {
name: 'Concentration (ug/m3)',
desc: 'concentration (ug/m3)',
unit: 'ug/m3',
range: [0, 670760],
},
},
};
exports.default = config;
//# sourceMappingURL=dpt9.js.map