node-red-contrib-zigbee2mqtt-devices
Version:
Nodes to interact with zigbee2mqtt for Node-RED
97 lines (96 loc) • 3.96 kB
JavaScript
;
/* eslint-disable quotes */
module.exports = function (RED) {
const utils = require("../lib/utils.js");
const bavaria = utils.bavaria();
function contactSensor(config) {
RED.nodes.createNode(this, config);
var bridgeNode = RED.nodes.getNode(config.bridge);
var node = this;
utils.setConnectionState(bridgeNode, node);
const regId = bavaria.observer.register(bridgeNode.id + "_connected", function (message) {
node.status({ fill: "green", text: "connected" });
bridgeNode.subscribeDevice(node.id, config.deviceName, function (message) {
if (message.contact) {
node.send({ payload: message });
}
else {
node.send([null, { payload: message }]);
}
});
});
node.on("close", () => {
bavaria.observer.unregister(regId);
});
}
RED.nodes.registerType("contact-sensor", contactSensor);
function occupancySensor(config) {
RED.nodes.createNode(this, config);
var bridgeNode = RED.nodes.getNode(config.bridge);
var node = this;
utils.setConnectionState(bridgeNode, node);
const regId = bavaria.observer.register(bridgeNode.id + "_connected", function (message) {
node.status({ fill: "green", text: "connected" });
bridgeNode.subscribeDevice(node.id, config.deviceName, function (message) {
if (message.occupancy) {
node.send({ payload: message });
}
else {
node.send([null, { payload: message }]);
}
});
});
node.on("close", () => {
bavaria.observer.unregister(regId);
});
}
RED.nodes.registerType("occupancy-sensor", occupancySensor);
function climateSensor(config) {
RED.nodes.createNode(this, config);
var bridgeNode = RED.nodes.getNode(config.bridge);
var node = this;
utils.setConnectionState(bridgeNode, node);
function messageReceived(message) {
var outputs = [message];
var text = "";
if (config.temperature === true) {
text += "T: " + message.temperature + "C° ";
outputs.push({ payload: message.temperature, device_name: config.deviceName });
}
if (config.pressure === true) {
text += "P: " + message.pressure + "mBar ";
outputs.push({ payload: message.pressure, device_name: config.deviceName });
}
if (config.humidity === true) {
text += "H: " + message.humidity + "%";
outputs.push({ payload: message.humidity, device_name: config.deviceName });
}
if (config.co2 === true) {
text += "CO2: " + message.co2 + "ppm";
outputs.push({ payload: message.co2, device_name: config.deviceName });
}
node.status({ fill: "green", text: text });
if (config.separateOutputs === true) {
node.send(outputs);
}
else {
node.send({ payload: message, device_name: config.deviceName });
}
}
function subscribe() {
node.status({ fill: "green", text: "connected" });
bridgeNode.subscribeDevice(node.id, config.deviceName, messageReceived);
}
if (bridgeNode.isConnected() === true) {
subscribe();
}
const regId = bavaria.observer.register(bridgeNode.id + "_connected", function (message) {
subscribe();
});
node.on('close', function () {
bridgeNode.unsubscribe(node.id);
bavaria.observer.unregister(regId);
});
}
RED.nodes.registerType("climate-sensor", climateSensor);
};