zigbee-herdsman-converters
Version:
Collection of device converters to be used with zigbee-herdsman
449 lines • 20.2 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.definitions = void 0;
const fz = __importStar(require("../converters/fromZigbee"));
const tz = __importStar(require("../converters/toZigbee"));
const exposes = __importStar(require("../lib/exposes"));
const reporting = __importStar(require("../lib/reporting"));
const utils = __importStar(require("../lib/utils"));
const e = exposes.presets;
const ea = exposes.access;
const zigfredEndpoint = 5;
const buttonLookup = {
0: "button_1",
1: "button_2",
2: "button_3",
3: "button_4",
};
const actionLookup = {
0: "release",
1: "single",
2: "double",
3: "hold",
};
const zifgredFromZigbeeButtonEvent = {
cluster: "manuSpecificSiglisZigfred",
type: ["commandSiglisZigfredButtonEvent"],
convert: (model, msg, publish, options, meta) => {
const button = msg.data.button;
const type = msg.data.type;
const buttonName = utils.getFromLookup(button, buttonLookup);
const typeName = utils.getFromLookup(type, actionLookup);
if (buttonName && typeName) {
const action = `${buttonName}_${typeName}`;
return { action };
}
},
};
const coverAndLightToZigbee = {
key: ["state", "brightness", "brightness_percent", "on_time", "position", "tilt"],
options: [exposes.options.transition()],
convertSet: async (entity, key, value, meta) => {
utils.assertEndpoint(entity);
const isCover = entity.ID === 0x0b || entity.ID === 0x0c;
if (isCover) {
if (key === "state") {
return await tz.cover_state.convertSet(entity, key, value, meta);
}
if (key === "position" || key === "tilt") {
return await tz.cover_position_tilt.convertSet(entity, key, value, meta);
}
}
else {
if (key === "state" || key === "brightness" || key === "brightness_percent" || key === "on_time") {
return await tz.light_onoff_brightness.convertSet(entity, key, value, meta);
}
}
},
convertGet: async (entity, key, meta) => {
utils.assertEndpoint(entity);
if (key === "state" && (entity.ID === 0x0b || entity.ID === 0x0c)) {
await tz.cover_position_tilt.convertGet(entity, "position", meta);
}
else if (key === "brightness") {
await entity.read("genLevelCtrl", ["currentLevel"]);
}
else if (key === "state") {
await tz.on_off.convertGet(entity, key, meta);
}
},
};
const buttonEventExposes = e.action([
"button_1_single",
"button_1_double",
"button_1_hold",
"button_1_release",
"button_2_single",
"button_2_double",
"button_2_hold",
"button_2_release",
"button_3_single",
"button_3_double",
"button_3_hold",
"button_3_release",
"button_4_single",
"button_4_double",
"button_4_hold",
"button_4_release",
]);
function checkOption(device, options, key) {
if (options != null && options[key] != null) {
if (options[key] === "true") {
return true;
}
if (options[key] === "false") {
return false;
}
}
return checkMetaOption(device, key);
}
function checkMetaOption(device, key) {
if (device != null) {
const enabled = device.meta[key];
if (enabled === undefined) {
return false;
}
return !!enabled;
}
return false;
}
function setMetaOption(device, key, enabled) {
if (device != null && key != null) {
device.meta[key] = enabled;
}
}
exports.definitions = [
{
zigbeeModel: ["zigfred uno"],
model: "ZFU-1D-CH",
vendor: "Siglis",
description: "zigfred uno smart in-wall switch",
options: [
e.enum("front_surface_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Front Surface LED enabled"),
e.enum("relay_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Relay enabled"),
e.enum("dimmer_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer enabled"),
e.enum("dimmer_dimming_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer dimmable"),
],
exposes: (device, options) => {
const expose = [];
expose.push(buttonEventExposes);
if (checkOption(device, options, "front_surface_enabled")) {
expose.push(e.light_brightness_colorxy().withEndpoint("l1"));
}
if (checkOption(device, options, "relay_enabled")) {
expose.push(e.switch().withEndpoint("l2"));
}
if (checkOption(device, options, "dimmer_enabled")) {
if (checkOption(device, options, "dimmer_dimming_enabled")) {
expose.push(e.light_brightness().withEndpoint("l3"));
}
else {
expose.push(e.switch().withEndpoint("l3"));
}
}
return expose;
},
fromZigbee: [
zifgredFromZigbeeButtonEvent,
fz.color_colortemp,
fz.on_off,
fz.brightness,
fz.level_config,
fz.power_on_behavior,
fz.ignore_basic_report,
],
toZigbee: [
tz.light_onoff_brightness,
tz.light_color,
tz.ignore_transition,
tz.ignore_rate,
tz.light_brightness_move,
tz.light_brightness_step,
tz.level_config,
tz.power_on_behavior,
tz.light_hue_saturation_move,
tz.light_hue_saturation_step,
tz.light_color_options,
tz.light_color_mode,
],
meta: { multiEndpoint: true },
endpoint: (device) => {
return {
l1: zigfredEndpoint,
l2: 6,
l3: 7,
};
},
configure: async (device, coordinatorEndpoint) => {
if (device != null) {
const controlEp = device.getEndpoint(zigfredEndpoint);
const relayEp = device.getEndpoint(6);
const dimmerEp = device.getEndpoint(7);
// Bind Control EP (LED)
setMetaOption(device, "front_surface_enabled", (await controlEp.read("genBasic", ["deviceEnabled"])).deviceEnabled);
if (checkMetaOption(device, "front_surface_enabled")) {
await reporting.bind(controlEp, coordinatorEndpoint, ["genOnOff", "genLevelCtrl", "manuSpecificSiglisZigfred"]);
await reporting.onOff(controlEp);
await reporting.brightness(controlEp);
}
// Bind Relay EP
setMetaOption(device, "relay_enabled", (await relayEp.read("genBasic", ["deviceEnabled"])).deviceEnabled);
if (checkMetaOption(device, "relay_enabled")) {
await reporting.bind(relayEp, coordinatorEndpoint, ["genOnOff"]);
await reporting.onOff(relayEp);
}
// Bind Dimmer EP
setMetaOption(device, "dimmer_enabled", (await dimmerEp.read("genBasic", ["deviceEnabled"])).deviceEnabled);
if (checkMetaOption(device, "dimmer_enabled")) {
await reporting.bind(dimmerEp, coordinatorEndpoint, ["genOnOff", "genLevelCtrl"]);
await reporting.onOff(dimmerEp);
await reporting.brightness(dimmerEp);
}
setMetaOption(device, "dimmer_dimming_enabled", true);
device.save();
}
},
},
{
zigbeeModel: ["zigfred plus"],
model: "ZFP-1A-CH",
vendor: "Siglis",
description: "zigfred plus smart in-wall switch",
options: [
e.enum("front_surface_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Front Surface LED enabled"),
e.enum("dimmer_1_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 1 enabled"),
e.enum("dimmer_1_dimming_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 1 dimmable"),
e.enum("dimmer_2_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 2 enabled"),
e.enum("dimmer_2_dimming_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 2 dimmable"),
e.enum("dimmer_3_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 3 enabled"),
e.enum("dimmer_3_dimming_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 3 dimmable"),
e.enum("dimmer_4_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 4 enabled"),
e.enum("dimmer_4_dimming_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Dimmer 4 dimmable"),
e.enum("cover_1_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Cover 1 enabled"),
e.enum("cover_1_tilt_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Cover 1 tiltable"),
e.enum("cover_2_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Cover 2 enabled"),
e.enum("cover_2_tilt_enabled", ea.SET, ["auto", "true", "false"]).withDescription("Cover 2 tiltable"),
],
exposes: (device, options) => {
const expose = [];
expose.push(buttonEventExposes);
if (checkOption(device, options, "front_surface_enabled")) {
expose.push(e.light_brightness_colorxy().withEndpoint("l1"));
}
if (checkOption(device, options, "dimmer_1_enabled")) {
if (checkOption(device, options, "dimmer_1_dimming_enabled")) {
expose.push(e.light_brightness().withEndpoint("l2"));
}
else {
expose.push(e.switch().withEndpoint("l2"));
}
}
if (checkOption(device, options, "dimmer_2_enabled")) {
if (checkOption(device, options, "dimmer_2_dimming_enabled")) {
expose.push(e.light_brightness().withEndpoint("l3"));
}
else {
expose.push(e.switch().withEndpoint("l3"));
}
}
if (checkOption(device, options, "dimmer_3_enabled")) {
if (checkOption(device, options, "dimmer_3_dimming_enabled")) {
expose.push(e.light_brightness().withEndpoint("l4"));
}
else {
expose.push(e.switch().withEndpoint("l4"));
}
}
if (checkOption(device, options, "dimmer_4_enabled")) {
if (checkOption(device, options, "dimmer_4_dimming_enabled")) {
expose.push(e.light_brightness().withEndpoint("l5"));
}
else {
expose.push(e.switch().withEndpoint("l5"));
}
}
if (checkOption(device, options, "cover_1_enabled")) {
if (checkOption(device, options, "cover_1_tilt_enabled")) {
expose.push(e
.cover()
.setAccess("state", exposes.access.STATE_SET | exposes.access.STATE_GET)
.withPosition()
.withTilt()
.withEndpoint("l6"));
}
else {
expose.push(e
.cover()
.setAccess("state", exposes.access.STATE_SET | exposes.access.STATE_GET)
.withPosition()
.withEndpoint("l6"));
}
}
if (checkOption(device, options, "cover_2_enabled")) {
if (checkOption(device, options, "cover_2_tilt_enabled")) {
expose.push(e
.cover()
.setAccess("state", exposes.access.STATE_SET | exposes.access.STATE_GET)
.withPosition()
.withTilt()
.withEndpoint("l7"));
}
else {
expose.push(e
.cover()
.setAccess("state", exposes.access.STATE_SET | exposes.access.STATE_GET)
.withPosition()
.withEndpoint("l7"));
}
}
return expose;
},
fromZigbee: [
zifgredFromZigbeeButtonEvent,
fz.color_colortemp,
fz.on_off,
fz.brightness,
fz.level_config,
fz.power_on_behavior,
fz.ignore_basic_report,
fz.cover_position_tilt,
],
toZigbee: [
tz.light_color,
tz.ignore_transition,
tz.ignore_rate,
tz.light_brightness_move,
tz.light_brightness_step,
tz.level_config,
tz.power_on_behavior,
tz.light_hue_saturation_move,
tz.light_hue_saturation_step,
tz.light_color_options,
tz.light_color_mode,
coverAndLightToZigbee,
],
meta: { multiEndpoint: true },
endpoint: (device) => {
return {
l1: zigfredEndpoint,
l2: 7,
l3: 8,
l4: 9,
l5: 10,
l6: 11,
l7: 12,
};
},
configure: async (device, coordinatorEndpoint) => {
if (device != null) {
// Bind Control EP (LED)
const controlEp = device.getEndpoint(zigfredEndpoint);
setMetaOption(device, "front_surface_enabled", (await controlEp.read("genBasic", ["deviceEnabled"])).deviceEnabled);
if (checkMetaOption(device, "front_surface_enabled")) {
await reporting.bind(controlEp, coordinatorEndpoint, ["genOnOff", "genLevelCtrl", "manuSpecificSiglisZigfred"]);
await reporting.onOff(controlEp);
await reporting.brightness(controlEp);
}
// Bind Dimmer 1 EP
const dimmer1Ep = device.getEndpoint(7);
setMetaOption(device, "dimmer_1_enabled", (await dimmer1Ep.read("genBasic", ["deviceEnabled"])).deviceEnabled);
if (checkMetaOption(device, "dimmer_1_enabled")) {
await reporting.bind(dimmer1Ep, coordinatorEndpoint, ["genOnOff", "genLevelCtrl"]);
await reporting.onOff(dimmer1Ep);
await reporting.brightness(dimmer1Ep);
}
setMetaOption(device, "dimmer_1_dimming_enabled", true);
// Bind Dimmer 2 EP
const dimmer2Ep = device.getEndpoint(8);
setMetaOption(device, "dimmer_2_enabled", (await dimmer2Ep.read("genBasic", ["deviceEnabled"])).deviceEnabled);
if (checkMetaOption(device, "dimmer_2_enabled")) {
await reporting.bind(dimmer2Ep, coordinatorEndpoint, ["genOnOff", "genLevelCtrl"]);
await reporting.onOff(dimmer2Ep);
await reporting.brightness(dimmer2Ep);
}
setMetaOption(device, "dimmer_2_dimming_enabled", true);
// Bind Dimmer 3 EP
const dimmer3Ep = device.getEndpoint(9);
setMetaOption(device, "dimmer_3_enabled", (await dimmer3Ep.read("genBasic", ["deviceEnabled"])).deviceEnabled);
if (checkMetaOption(device, "dimmer_3_enabled")) {
await reporting.bind(dimmer3Ep, coordinatorEndpoint, ["genOnOff", "genLevelCtrl"]);
await reporting.onOff(dimmer3Ep);
await reporting.brightness(dimmer3Ep);
}
setMetaOption(device, "dimmer_3_dimming_enabled", true);
// Bind Dimmer 4 EP
const dimmer4Ep = device.getEndpoint(10);
setMetaOption(device, "dimmer_4_enabled", (await dimmer4Ep.read("genBasic", ["deviceEnabled"])).deviceEnabled);
if (checkMetaOption(device, "dimmer_4_enabled")) {
await reporting.bind(dimmer4Ep, coordinatorEndpoint, ["genOnOff", "genLevelCtrl"]);
await reporting.onOff(dimmer4Ep);
await reporting.brightness(dimmer4Ep);
}
setMetaOption(device, "dimmer_4_dimming_enabled", true);
// Bind Cover 1 EP
const cover1Ep = device.getEndpoint(11);
setMetaOption(device, "cover_1_enabled", (await cover1Ep.read("genBasic", ["deviceEnabled"])).deviceEnabled);
if (checkMetaOption(device, "cover_1_enabled")) {
await reporting.bind(cover1Ep, coordinatorEndpoint, ["closuresWindowCovering"]);
await reporting.currentPositionLiftPercentage(cover1Ep);
setMetaOption(device, "cover_1_tilt_enabled", (await cover1Ep.read("closuresWindowCovering", ["windowCoveringType"])).windowCoveringType === 0x08);
if (checkMetaOption(device, "cover_1_tilt_enabled")) {
await reporting.currentPositionTiltPercentage(cover1Ep);
}
}
else {
setMetaOption(device, "cover_1_tilt_enabled", false);
}
// Bind Cover 2 EP
const cover2Ep = device.getEndpoint(12);
setMetaOption(device, "cover_2_enabled", (await cover2Ep.read("genBasic", ["deviceEnabled"])).deviceEnabled);
if (checkMetaOption(device, "cover_2_enabled")) {
await reporting.bind(cover2Ep, coordinatorEndpoint, ["closuresWindowCovering"]);
await reporting.currentPositionLiftPercentage(cover2Ep);
setMetaOption(device, "cover_2_tilt_enabled", (await cover2Ep.read("closuresWindowCovering", ["windowCoveringType"])).windowCoveringType === 0x08);
if (checkMetaOption(device, "cover_2_tilt_enabled")) {
await reporting.currentPositionTiltPercentage(cover2Ep);
}
}
else {
setMetaOption(device, "cover_2_tilt_enabled", false);
}
device.save();
}
},
},
];
//# sourceMappingURL=siglis.js.map
;