node-red-contrib-mysensors
Version:
Mysensors related nodes, for decoding / encoding mysensors serial protocol and MQTT topic, and wrapping arbitrary messages into mysensors compatible messages
64 lines (56 loc) • 1.93 kB
text/typescript
import { NodeAPI } from 'node-red';
import { MysensorsController } from '../lib/mysensors-controller';
import { IMysensorsMsg } from '../lib/mysensors-msg';
import {
IControllerConfig,
IControllerProperties,
IDbConfigNode,
} from './common';
/* istanbul ignore next */
export = (RED: NodeAPI): void => {
RED.nodes.registerType(
'myscontroller',
function (this: IControllerConfig, props: IControllerProperties): void {
RED.nodes.createNode(this, props);
if (!props.database) {
return;
}
this.database = RED.nodes.getNode(
props.database,
) as IDbConfigNode;
this.controller = new MysensorsController(
this.database.database,
props.handleid ?? false,
props.timeresponse ?? true,
props.timezone ?? 'UTC',
props.measurementsystem ?? 'M',
props.mqttroot ?? 'mys-out',
props.addSerialNewline ?? false,
);
this.on('input', async (msg: IMysensorsMsg, send, done) => {
try {
const msgOut = await this.controller.messageHandler(msg);
if (msgOut) {
send(msgOut);
}
done();
} catch (err) {
done(err as Error);
}
});
},
);
RED.httpAdmin.get(
'/mysensornodes/:database',
RED.auth.needsPermission(''),
async (req, res) => {
const dbNode = RED.nodes.getNode(
req.params.database,
) as IDbConfigNode;
if (dbNode.database) {
const x = await dbNode.database.getNodeList();
res.json(JSON.stringify({ data: x }));
}
},
);
}