mysensors-handlers
Version:
Encode / decode MQTT stream from Devices using MySensors protocol
66 lines (61 loc) • 2 kB
JavaScript
const mqttPattern = require('mqtt-pattern');
const logger = require('aloes-logger');
const {
protocolRef,
labelsPresentation,
labelsSet,
labelsInternal,
} = require('./common');
/**
* Check incoming MQTT packet against [MySensors Serial API]{@link /mysensors/#mysensorsapi}
* pattern - "+prefixedDevEui/+nodeId/+sensorId/+method/+ack/+type"
* @mthod mySensorsPatternDetector
* @param {object} packet - The MQTT packet.
* @returns {object | null} pattern
*/
const mySensorsPatternDetector = (packet) => {
try {
const pattern = {name: 'empty', params: {}};
if (
packet.topic &&
mqttPattern.matches(protocolRef.pattern, packet.topic)
) {
logger(4, 'mysensors-handlers', 'patternDetector:res', 'reading API ...');
const mysensorsProtocol = mqttPattern.exec(
protocolRef.pattern,
packet.topic,
);
logger(3, 'mysensors-handlers', 'patternDetector:res', mysensorsProtocol);
let typeExists = false;
const method = Number(mysensorsProtocol.method);
const type = Number(mysensorsProtocol.type);
const methodExists = protocolRef.validators.methods.some(
(meth) => meth === method,
);
if (method === 0) {
typeExists = labelsPresentation.some(({value}) => value === type);
} else if (method > 0 && method < 3) {
typeExists = labelsSet.some(({value}) => value === type);
} else if (method === 3) {
typeExists = labelsInternal.some(({value}) => value === type);
}
logger(3, 'mysensors-handlers', 'patternDetector:res', {
methodExists,
typeExists,
});
if (methodExists && typeExists) {
pattern.name = 'mySensors';
pattern.params = mysensorsProtocol;
return pattern;
}
return pattern;
}
return pattern;
} catch (error) {
logger(2, 'mysensors-handlers', 'patternDetector:err', error);
return null;
}
};
module.exports = {
mySensorsPatternDetector,
};