UNPKG

node-red-contrib-zigbee2mqtt-devices

Version:
97 lines (96 loc) 3.96 kB
"use strict"; /* 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); };