node-red-contrib-zigbee2mqtt-devices
Version:
Nodes to interact with zigbee2mqtt for Node-RED
137 lines (136 loc) • 4.46 kB
JavaScript
;
function setConnectionState(bridgeNode, node) {
if (bridgeNode.isConnected() === true) {
node.status({ fill: "green", text: "connected" });
}
else {
node.status({ fill: "blue", text: "not connected" });
}
}
function createButtonOutput(output, name, type, payload) {
return {
index: output,
button_name: name,
button_type: type,
button_payload: payload,
};
}
function sendAt(node, index, msg) {
var output = [];
for (var i = 0; i < index; i++) {
output.push(null);
}
output.push(msg);
node.send(output);
}
function createAction(property, type, value) {
return {
payload: {
override: {
action: {
name: `${property}_${type}`,
value: value
}
}
}
};
}
function createSceneCommand(command, value) {
return {
command: command,
scene: value
};
}
function createStateOverride(value) {
var convertedValue = convertToOnOff(value);
var override = createOverride("state", convertedValue);
if (convertedValue === "ON") {
override.brightness = 254;
}
return override;
}
function createOverride(name, value) {
var override = {};
override[name] = value;
return override;
}
function convertToOnOff(value) {
switch (value) {
case "on":
case "ON":
case 1:
case true:
return "ON";
case "off":
case "OFF":
case 0:
case false:
return "OFF";
}
}
function propertyExists(obj, name) {
return obj !== undefined && Object.prototype.hasOwnProperty.call(obj, name);
}
const bavaria = require("node-red-ext-bavaria-black");
module.exports = {
createButtonOutput: createButtonOutput,
bavaria: () => bavaria,
sendAt: sendAt,
propertyExists: propertyExists,
setConnectionState: setConnectionState,
payloads: {
createColorTempStep: (value) => { return createAction("color_temp", "step", value); },
createColorTempMove: (value) => { return createAction("color_temp", "move", value == 0 ? "stop" : value); },
createBrightnessStep: (value) => { return createAction("brightness", "step_onoff", value); },
createBrightnessMove: (value) => { return createAction("brightness", "move_onoff", value); },
createHueStep: (value) => { return createAction("hue", "step", value); },
createHueMove: (value) => { return createAction("hue", "move", value); },
createSaturationStep: (value) => { return createAction("saturation", "step", value); },
createSaturationMove: (value) => { return createAction("saturation", "move", value); },
createNextSceneCommand: () => { return createSceneCommand("next", undefined); },
createPreviousSceneCommand: () => { return createSceneCommand("previous", undefined); },
createSetSceneCommand: (value) => { return createSceneCommand("set", value); },
convertToOnOff: convertToOnOff,
overrides: {
createStateOverride: (value) => { return { override: createStateOverride(value) }; },
createBrightnessOverride: (value) => { return { override: createOverride("brightness", value) }; },
},
devices: {
addDevice: (msg, device) => {
if (msg.payload === undefined || typeof msg.payload != "object") {
msg.payload = {};
}
if (msg.payload.devices === undefined) {
msg.payload.devices = [];
}
msg.payload.devices.push(device);
return msg;
}
}
},
outputs: {
preapreOutputFor: (index, payload) => {
var output = [];
for (var i = 0; i < index; i++) {
output.push(null);
}
output.push(payload);
return output;
}
},
ui: {
input: {
getPayload: function (data, type) {
switch (type) {
case "num":
return Number.parseFloat(data);
case "bool":
return data == true;
case "json":
return JSON.parse(data);
}
return data;
}
}
}
};