zigbee-herdsman-converters
Version:
Collection of device converters to be used with zigbee-herdsman
818 lines • 41.7 kB
JavaScript
"use strict";
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 legrand_1 = require("../lib/legrand");
const m = __importStar(require("../lib/modernExtend"));
const reporting = __importStar(require("../lib/reporting"));
const e = exposes.presets;
const ea = exposes.access;
exports.definitions = [
{
zigbeeModel: [
" Pocket remote\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
" Wireless Scenes Command\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
],
model: "067755",
vendor: "Legrand",
description: "Wireless and batteryless 4 scenes control",
ota: true,
meta: { multiEndpoint: true, battery: { voltageToPercentage: { min: 2500, max: 3000 } }, publishDuplicateTransaction: true },
fromZigbee: [fz.identify, fz.battery, fz.command_recall],
toZigbee: [],
exposes: [e.battery(), e.action(["identify", "recall_1_1"])],
onEvent: legrand_1.readInitialBatteryState,
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genPowerCfg", "genOnOff", "genLevelCtrl"]);
},
},
{
zigbeeModel: [
" Dry contact\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
],
model: "412173",
vendor: "Legrand",
description: "DIN dry contactor module",
whiteLabel: [{ vendor: "BTicino", model: "FC80AC" }],
extend: [m.onOff()],
ota: true,
fromZigbee: [fz.identify, fz.electrical_measurement, legrand_1.fzLegrand.cluster_fc01, fz.ignore_basic_report, fz.ignore_genOta],
toZigbee: [tz.legrand_device_mode, legrand_1.tzLegrand.identify, tz.electrical_measurement_power],
exposes: [
e.power().withAccess(ea.STATE_GET),
e
.enum("device_mode", ea.ALL, ["switch", "auto"])
.withDescription("switch: allow on/off, auto will use wired action via C1/C2 on contactor for example with HC/HP"),
],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genIdentify", "genOnOff", "haElectricalMeasurement"]);
await reporting.onOff(endpoint);
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
await reporting.activePower(endpoint);
// Read configuration values that are not sent periodically as well as current power (activePower).
await endpoint.read("haElectricalMeasurement", ["activePower", 0xf000, 0xf001, 0xf002]);
},
},
{
zigbeeModel: [
" Contactor\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
],
model: "412171",
vendor: "Legrand",
description: "DIN contactor module",
whiteLabel: [{ vendor: "BTicino", model: "FC80CC" }],
extend: [m.onOff(), m.electricityMeter({ cluster: "electrical", voltage: false, current: false })],
ota: true,
fromZigbee: [fz.identify, legrand_1.fzLegrand.cluster_fc01, fz.ignore_basic_report, fz.ignore_genOta, fz.electrical_measurement],
toZigbee: [tz.legrand_device_mode, legrand_1.tzLegrand.identify, legrand_1.tzLegrand.auto_mode, tz.electrical_measurement_power],
exposes: [
e
.enum("device_mode", ea.ALL, ["switch", "auto"])
.withDescription("Switch: allow manual on/off, auto uses contact's C1/C2 wired actions for Peak/Off-Peak electricity rates"),
e
.enum("auto_mode", ea.STATE_SET, ["off", "auto", "on_override"])
.withDescription('Off/auto/on (override) (works only if device is set to "auto" mode)'),
],
},
{
zigbeeModel: [
" Teleruptor\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
],
model: "412170",
vendor: "Legrand",
description: "DIN smart relay for light control",
whiteLabel: [{ vendor: "BTicino", model: "FC80RC" }],
extend: [m.onOff()],
ota: true,
fromZigbee: [fz.identify, fz.electrical_measurement, legrand_1.fzLegrand.cluster_fc01, fz.ignore_basic_report, fz.ignore_genOta],
toZigbee: [tz.legrand_device_mode, legrand_1.tzLegrand.identify, tz.electrical_measurement_power],
exposes: [
e.power().withAccess(ea.STATE_GET),
e
.enum("device_mode", ea.ALL, ["switch", "auto"])
.withDescription("switch: allow on/off, auto will use wired action via C1/C2 on teleruptor with buttons"),
],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genIdentify", "haElectricalMeasurement"]);
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
await reporting.activePower(endpoint);
},
},
{
zigbeeModel: [" Shutters central remote switch"],
model: "067646",
vendor: "Legrand",
description: "Wireless shutter switch",
ota: true,
meta: { battery: { voltageToPercentage: { min: 2500, max: 3000 } }, publishDuplicateTransaction: true },
fromZigbee: [
fz.identify,
fz.ignore_basic_report,
fz.command_cover_open,
fz.command_cover_close,
fz.command_cover_stop,
fz.battery,
fz.legrand_binary_input_moving,
],
toZigbee: [],
exposes: [e.battery(), e.action(["identify", "open", "close", "stop", "moving", "stopped"])],
onEvent: async (type, data, device, options, state) => {
await (0, legrand_1.readInitialBatteryState)(type, data, device, options, state);
if (data.type === "commandCheckin" && data.cluster === "genPollCtrl") {
const endpoint = device.getEndpoint(1);
await endpoint.command("genPollCtrl", "fastPollStop", {}, legrand_1.legrandOptions);
}
},
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genPowerCfg", "genBinaryInput", "closuresWindowCovering", "genIdentify"]);
},
},
{
zigbeeModel: [" Shutter switch with neutral\u0000\u0000\u0000"],
model: "067776",
vendor: "Legrand",
description: "Netatmo wired shutter switch",
ota: true,
fromZigbee: [
fz.ignore_basic_report,
fz.cover_position_tilt,
fz.identify,
legrand_1.fzLegrand.cluster_fc01,
legrand_1.fzLegrand.calibration_mode(false),
legrand_1.fzLegrand.command_cover,
],
toZigbee: [tz.cover_state, tz.cover_position_tilt, legrand_1.tzLegrand.identify, legrand_1.tzLegrand.led_mode, legrand_1.tzLegrand.calibration_mode(false)],
exposes: (device, options) => {
return [
legrand_1.eLegrand.getCover(device),
e.action(["identify", "open", "close", "stop", "moving", "stopped"]),
legrand_1.eLegrand.identify(),
legrand_1.eLegrand.ledInDark(),
legrand_1.eLegrand.ledIfOn(),
legrand_1.eLegrand.getCalibrationModes(false),
];
},
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genBinaryInput", "closuresWindowCovering", "genIdentify"]);
let p = reporting.payload("currentPositionLiftPercentage", 1, 120, 1);
await endpoint.configureReporting("closuresWindowCovering", p, legrand_1.legrandOptions);
p = reporting.payload("currentPositionTiltPercentage", 1, 120, 1);
await endpoint.configureReporting("closuresWindowCovering", p, legrand_1.legrandOptions);
},
},
{
// Some require coverInverted:
// - https://github.com/Koenkk/zigbee2mqtt/issues/15101#issuecomment-1356787490
// - https://github.com/Koenkk/zigbee2mqtt/issues/16090
fingerprint: [
{ modelID: " Shutter switch with neutral\u0000\u0000\u0000", softwareBuildID: "001a" },
{
modelID: " Shutter switch with neutral\u0000\u0000\u0000",
softwareBuildID: "00d\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00000\u0012\u0002\u0000" +
"\t\u0007\u0000\u0018\u0002\u0003\b\u0000 \u00132\u0000\u0000\u0000\u0000X\u0002\n\u0000\u0000\u0000\u0000d" +
"\u0017\u0000\u0018\u0000",
},
],
model: "067776_inverted",
vendor: "Legrand",
description: "Netatmo wired shutter switch",
ota: true,
meta: { coverInverted: true },
fromZigbee: [fz.identify, fz.ignore_basic_report, fz.legrand_binary_input_moving, fz.cover_position_tilt, legrand_1.fzLegrand.cluster_fc01],
toZigbee: [tz.cover_state, tz.cover_position_tilt, legrand_1.tzLegrand.identify, legrand_1.tzLegrand.led_mode],
exposes: [e.cover_position()],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genBinaryInput", "closuresWindowCovering", "genIdentify"]);
await reporting.currentPositionLiftPercentage(endpoint);
},
},
{
zigbeeModel: [" Shutter SW with level control\u0000"],
model: "067776A",
vendor: "Legrand",
description: "Netatmo wired shutter switch with level control (NLLV)",
whiteLabel: [
{
model: "K4027C/L4027C/N4027C/NT4027C",
vendor: "BTicino",
description: "Shutter SW with level control",
fingerprint: [{ hardwareVersion: 9 }, { hardwareVersion: 13 }],
},
],
ota: true,
fromZigbee: [
fz.ignore_basic_report,
fz.cover_position_tilt,
fz.identify,
legrand_1.fzLegrand.cluster_fc01,
legrand_1.fzLegrand.calibration_mode(true),
legrand_1.fzLegrand.command_cover,
],
toZigbee: [tz.cover_state, tz.cover_position_tilt, legrand_1.tzLegrand.identify, legrand_1.tzLegrand.led_mode, legrand_1.tzLegrand.calibration_mode(true)],
exposes: (device, options) => {
return [
legrand_1.eLegrand.getCover(device),
e.action(["identify", "open", "close", "stop", "moving", "stopped"]),
legrand_1.eLegrand.identify(),
legrand_1.eLegrand.ledInDark(),
legrand_1.eLegrand.ledIfOn(),
legrand_1.eLegrand.getCalibrationModes(true),
];
},
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genBinaryInput", "closuresWindowCovering", "genIdentify"]);
let p = reporting.payload("currentPositionLiftPercentage", 1, 120, 1);
await endpoint.configureReporting("closuresWindowCovering", p, legrand_1.legrandOptions);
p = reporting.payload("currentPositionTiltPercentage", 1, 120, 1);
await endpoint.configureReporting("closuresWindowCovering", p, legrand_1.legrandOptions);
},
},
{
// LED blinks RED when battery is low
zigbeeModel: [" Remote switch\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"],
model: "067773",
vendor: "Legrand",
description: "Wireless remote switch",
ota: true,
meta: { battery: { voltageToPercentage: { min: 2500, max: 3000 } }, publishDuplicateTransaction: true },
fromZigbee: [fz.identify, fz.command_on, fz.command_off, fz.command_toggle, fz.command_move, fz.command_stop, fz.battery],
toZigbee: [],
exposes: [e.battery(), e.action(["identify", "on", "off", "toggle", "brightness_move_up", "brightness_move_down", "brightness_stop"])],
onEvent: legrand_1.readInitialBatteryState,
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genPowerCfg", "genOnOff", "genLevelCtrl"]);
},
},
{
zigbeeModel: [" Double gangs remote switch\u0000\u0000\u0000\u0000"],
model: "067774",
vendor: "Legrand",
description: "Wireless double remote switch",
ota: true,
meta: { multiEndpoint: true, battery: { voltageToPercentage: { min: 2500, max: 3000 } }, publishDuplicateTransaction: true },
fromZigbee: [fz.identify, fz.command_on, fz.command_off, fz.command_toggle, fz.command_move, fz.command_stop, fz.battery],
toZigbee: [],
exposes: [e.battery(), e.action(["identify", "on", "off", "toggle", "brightness_move_up", "brightness_move_down", "brightness_stop"])],
onEvent: legrand_1.readInitialBatteryState,
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genPowerCfg", "genOnOff", "genLevelCtrl"]);
const endpoint2 = device.getEndpoint(2);
await reporting.bind(endpoint2, coordinatorEndpoint, ["genOnOff", "genLevelCtrl"]);
},
endpoint: (device) => {
return { left: 1, right: 2 };
},
},
{
zigbeeModel: [" Remote toggle switch\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"],
model: "067694",
vendor: "Legrand",
description: "Remote toggle switch",
whiteLabel: [{ vendor: "BTicino", description: "Wireless control module for a traditional two-way switch or pushbutton", model: "3577C" }],
ota: true,
fromZigbee: [fz.identify, fz.command_on, fz.command_off, fz.command_toggle, fz.battery],
toZigbee: [],
exposes: [e.battery(), e.action(["identify", "on", "off", "toggle"])],
onEvent: legrand_1.readInitialBatteryState,
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genPowerCfg", "genOnOff"]);
},
},
{
zigbeeModel: [" Dimmer switch w/o neutral\u0000\u0000\u0000\u0000\u0000"],
model: "067771",
vendor: "Legrand",
description: "Wired switch without neutral",
ota: true,
fromZigbee: [fz.identify, fz.level_config, fz.lighting_ballast_configuration, legrand_1.fzLegrand.cluster_fc01],
toZigbee: [legrand_1.tzLegrand.led_mode, tz.legrand_device_mode, legrand_1.tzLegrand.identify, tz.ballast_config, tz.level_config],
exposes: [
e.numeric("ballast_minimum_level", ea.ALL).withValueMin(1).withValueMax(254).withDescription("Specifies the minimum brightness value"),
e.numeric("ballast_maximum_level", ea.ALL).withValueMin(1).withValueMax(254).withDescription("Specifies the maximum brightness value"),
e.binary("device_mode", ea.ALL, "dimmer_on", "dimmer_off").withDescription("Allow the device to change brightness"),
legrand_1.eLegrand.ledInDark(),
legrand_1.eLegrand.ledIfOn(),
],
extend: [m.light({ configureReporting: true, levelConfig: { features: ["on_level"] } })],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genIdentify", "genBinaryInput", "lightingBallastCfg"]);
},
},
{
zigbeeModel: [" Dimmer switch w/o neutral evo\u0000"],
model: "199182",
vendor: "Legrand",
description: "Wired switch without neutral",
ota: true,
fromZigbee: [fz.identify, fz.lighting_ballast_configuration, legrand_1.fzLegrand.cluster_fc01],
toZigbee: [legrand_1.tzLegrand.led_mode, tz.legrand_device_mode, legrand_1.tzLegrand.identify, tz.ballast_config],
exposes: [
e.numeric("ballast_minimum_level", ea.ALL).withValueMin(1).withValueMax(254).withDescription("Specifies the minimum brightness value"),
e.numeric("ballast_maximum_level", ea.ALL).withValueMin(1).withValueMax(254).withDescription("Specifies the maximum brightness value"),
e.binary("device_mode", ea.ALL, "dimmer_on", "dimmer_off").withDescription("Allow the device to change brightness"),
legrand_1.eLegrand.ledInDark(),
legrand_1.eLegrand.ledIfOn(),
],
extend: [m.light({ configureReporting: true })],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genIdentify", "genBinaryInput", "lightingBallastCfg"]);
},
},
{
zigbeeModel: [" Connected outlet\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"],
model: "067775/741811",
vendor: "Legrand",
description: "Power socket with power consumption monitoring",
ota: true,
fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement, fz.power_on_behavior, legrand_1.fzLegrand.cluster_fc01],
toZigbee: [tz.on_off, legrand_1.tzLegrand.led_mode, legrand_1.tzLegrand.identify, tz.power_on_behavior],
exposes: [
e.switch(),
e.action(["identify"]),
e.power(),
e.power_apparent(),
e.power_on_behavior(),
legrand_1.eLegrand.identify(),
legrand_1.eLegrand.ledInDark(),
legrand_1.eLegrand.ledIfOn(),
],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genIdentify", "genOnOff", "haElectricalMeasurement"]);
await reporting.onOff(endpoint);
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
await reporting.activePower(endpoint);
try {
await reporting.apparentPower(endpoint);
}
catch {
// Some version/firmware don't seem to support this.
// https://github.com/Koenkk/zigbee2mqtt/issues/16732
}
},
},
{
zigbeeModel: [" Micromodule switch\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"],
model: "064888",
vendor: "Legrand",
description: "Wired micromodule switch",
whiteLabel: [
{ vendor: "Legrand", description: "Micromodule switch", model: "199142" },
{ vendor: "BTicino", description: "Connected lighting micromodule", model: "3584C" },
],
extend: [m.onOff()],
ota: true,
fromZigbee: [fz.identify],
toZigbee: [legrand_1.tzLegrand.identify],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genBinaryInput"]);
},
},
{
// LED blinks RED when battery is low
zigbeeModel: [" Master remote SW Home / Away\u0000\u0000"],
model: "064873",
vendor: "Legrand",
description: "Home & away switch / master switch",
whiteLabel: [{ vendor: "BTicino", model: "LN4570CWI" }],
ota: true,
meta: { battery: { voltageToPercentage: { min: 2500, max: 3000 } } },
fromZigbee: [fz.legrand_scenes, fz.legrand_master_switch_center, fz.ignore_poll_ctrl, fz.battery],
toZigbee: [],
exposes: [e.battery(), e.action(["enter", "leave", "sleep", "wakeup", "center"])],
onEvent: async (type, data, device, options, state) => {
await (0, legrand_1.readInitialBatteryState)(type, data, device, options, state);
if (data.type === "commandCheckin" && data.cluster === "genPollCtrl") {
// TODO current solution is a work around, it would be cleaner to answer to the request
const endpoint = device.getEndpoint(1);
await endpoint.command("genPollCtrl", "fastPollStop", {}, legrand_1.legrandOptions);
}
},
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genIdentify", "genPowerCfg"]);
},
},
{
zigbeeModel: [" 3 Phases power consumption module\u0000\u0000", " DIN 3Ph power consumption module", "3ph Smart shedder module"],
model: "412175",
vendor: "Legrand",
description: "3P power consumption module",
ota: true,
fromZigbee: [
fz.identify,
fz.metering,
fz.electrical_measurement,
fz.ignore_basic_report,
fz.ignore_genOta,
fz.legrand_power_alarm,
legrand_1.fzLegrand.cluster_fc01,
],
toZigbee: [legrand_1.tzLegrand.led_mode, tz.electrical_measurement_power, tz.legrand_power_alarm, legrand_1.tzLegrand.identify],
exposes: [
e.power().withAccess(ea.STATE_GET),
e.power_phase_b().withAccess(ea.STATE_GET),
e.power_phase_c().withAccess(ea.STATE_GET),
e.power_apparent(),
e.power_apparent_phase_b().withAccess(ea.STATE_GET),
e.power_apparent_phase_c().withAccess(ea.STATE_GET),
e.binary("power_alarm_active", ea.STATE, true, false),
e.binary("power_alarm", ea.ALL, true, false).withDescription("Enable/disable the power alarm"),
],
onEvent: async (type, data, device, options, state) => {
/**
* The DIN power consumption module loses the configure reporting
* after device restart/powerloss.
*
* We reconfigure the reporting at deviceAnnounce.
*/
if (type === "deviceAnnounce") {
for (const endpoint of device.endpoints) {
for (const c of endpoint.configuredReportings) {
await endpoint.configureReporting(c.cluster.name, [
{
attribute: c.attribute.name,
minimumReportInterval: c.minimumReportInterval,
maximumReportInterval: c.maximumReportInterval,
reportableChange: c.reportableChange,
},
]);
}
}
}
},
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["haElectricalMeasurement", "genIdentify"]);
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
await reporting.activePower(endpoint);
// Read configuration values that are not sent periodically as well as current power (activePower).
await endpoint.read("haElectricalMeasurement", ["activePower"]);
try {
await reporting.apparentPower(endpoint);
await endpoint.read("haElectricalMeasurement", ["apparentPowerPhB"]);
await endpoint.read("haElectricalMeasurement", ["apparentPowerPhC"]);
await endpoint.read("haElectricalMeasurement", ["activePowerPhB"]);
await endpoint.read("haElectricalMeasurement", ["activePowerPhC"]);
}
catch {
// Some version/firmware don't seem to support this.
}
// Read configuration values that are not sent periodically.
await endpoint.read("haElectricalMeasurement", [0xf000, 0xf001, 0xf002]);
},
},
{
zigbeeModel: [" DIN power consumption module\u0000\u0000", " DIN power consumption module", "Smart shedder module"],
model: "412015",
vendor: "Legrand",
description: "DIN power consumption module",
whiteLabel: [
{ vendor: "Legrand", description: "DIN power consumption module", model: "412172", fingerprint: [{ modelID: " Smart shedder module" }] },
{ vendor: "BTicino", description: "DIN power consumption module", model: "FC80GCS", fingerprint: [{ modelID: " Smart shedder module" }] },
],
ota: true,
fromZigbee: [
fz.identify,
fz.metering,
fz.electrical_measurement,
fz.ignore_basic_report,
fz.ignore_genOta,
fz.legrand_power_alarm,
legrand_1.fzLegrand.cluster_fc01,
],
toZigbee: [legrand_1.tzLegrand.led_mode, legrand_1.tzLegrand.identify, tz.electrical_measurement_power, tz.legrand_power_alarm],
exposes: [
e.power().withAccess(ea.STATE_GET),
e.power_apparent(),
e.binary("power_alarm_active", ea.STATE, true, false),
e.binary("power_alarm", ea.ALL, true, false).withDescription("Enable/disable the power alarm"),
],
onEvent: async (type, data, device, options, state) => {
/**
* The DIN power consumption module loses the configure reporting
* after device restart/powerloss.
*
* We reconfigure the reporting at deviceAnnounce.
*/
if (type === "deviceAnnounce") {
for (const endpoint of device.endpoints) {
for (const c of endpoint.configuredReportings) {
await endpoint.configureReporting(c.cluster.name, [
{
attribute: c.attribute.name,
minimumReportInterval: c.minimumReportInterval,
maximumReportInterval: c.maximumReportInterval,
reportableChange: c.reportableChange,
},
]);
}
}
}
},
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["haElectricalMeasurement", "genIdentify"]);
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
await reporting.activePower(endpoint);
await endpoint.read("haElectricalMeasurement", ["activePower"]);
try {
await reporting.apparentPower(endpoint);
await endpoint.read("haElectricalMeasurement", ["apparentPower"]);
}
catch {
// Some version/firmware don't seem to support this.
}
// Read configuration values that are not sent periodically.
await endpoint.read("haElectricalMeasurement", [0xf000, 0xf001, 0xf002]);
},
},
{
zigbeeModel: ["Remote switch Wake up / Sleep"],
model: "752189",
vendor: "Legrand",
description: "Night/day wireless switch",
ota: true,
meta: { battery: { voltageToPercentage: { min: 2500, max: 3000 } } },
fromZigbee: [fz.legrand_scenes, fz.battery, fz.ignore_poll_ctrl, fz.legrand_master_switch_center],
toZigbee: [],
exposes: [e.battery(), e.action(["enter", "leave", "sleep", "wakeup", "center"])],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genIdentify", "genPowerCfg"]);
},
},
{
fingerprint: [{ modelID: "GreenPower_254", ieeeAddr: /^0x00000000005.....$/ }],
model: "ZLGP14/ZLGP15/ZLGP16",
vendor: "Legrand",
description: "Wireless and batteryless scenario switch (home arrival/departure, 1-4 switches, daytime day/night)",
ota: true,
fromZigbee: [fz.legrand_greenpower],
toZigbee: [],
exposes: [
e.action([
"home_arrival",
"home_departure", // ZLGP14
"press_1",
"press_2",
"press_3",
"press_4", // ZLGP15
"daytime_day",
"daytime_night", // ZLGP16
]),
],
},
{
fingerprint: [{ modelID: "GreenPower_2", ieeeAddr: /^0x00000000005.....$/ }],
model: "ZLGP17/ZLGP18",
vendor: "Legrand",
description: "Wireless and batteryless (double) lighting control",
ota: true,
fromZigbee: [fz.legrand_greenpower],
toZigbee: [],
exposes: [e.action(["press_once", "press_twice"])],
},
{
fingerprint: [{ modelID: "GreenPower_3", ieeeAddr: /^0x00000000005.....$/ }],
model: "600087L",
vendor: "Legrand",
description: "Wireless and batteryless blind control switch",
ota: true,
fromZigbee: [fz.legrand_greenpower],
toZigbee: [],
exposes: [e.action(["stop", "up", "down"])],
},
{
zigbeeModel: [" Cable outlet\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"],
model: "064882",
vendor: "Legrand",
description: "Cable outlet with pilot wire and consumption measurement",
ota: true,
fromZigbee: [legrand_1.fzLegrand.cluster_fc01, fz.legrand_pilot_wire_mode, fz.on_off, fz.electrical_measurement, fz.power_on_behavior],
toZigbee: [tz.legrand_device_mode, tz.legrand_pilot_wire_mode, tz.on_off, tz.electrical_measurement_power, tz.power_on_behavior],
exposes: [
e.binary("device_mode", ea.ALL, "pilot_on", "pilot_off"),
e.pilot_wire_mode(),
e.switch().withState("state", true, "Works only when the pilot wire is deactivated"),
e.power().withAccess(ea.STATE_GET),
e.power_apparent(),
e
.power_on_behavior()
.withDescription("Controls the behavior when the device is powered on. Works only when the pilot wire is deactivated"),
],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genOnOff", "haElectricalMeasurement", "manuSpecificLegrandDevices2"]);
await reporting.onOff(endpoint);
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
await reporting.activePower(endpoint);
await reporting.apparentPower(endpoint);
},
},
{
zigbeeModel: [" NLIS - Double light switch\u0000\u0000\u0000\u0000"],
model: "067772",
vendor: "Legrand",
description: "Double wired switch with neutral",
ota: true,
fromZigbee: [fz.identify, fz.legrand_binary_input_on_off, fz.lighting_ballast_configuration, legrand_1.fzLegrand.cluster_fc01],
toZigbee: [legrand_1.tzLegrand.identify, tz.legrand_device_mode, legrand_1.tzLegrand.led_mode, tz.ballast_config],
exposes: [
e
.numeric("ballast_minimum_level", ea.ALL)
.withValueMin(1)
.withValueMax(254)
.withDescription("Specifies the minimum brightness value")
.withEndpoint("left"),
e
.numeric("ballast_maximum_level", ea.ALL)
.withValueMin(1)
.withValueMax(254)
.withDescription("Specifies the maximum brightness value")
.withEndpoint("left"),
e
.numeric("ballast_minimum_level", ea.ALL)
.withValueMin(1)
.withValueMax(254)
.withDescription("Specifies the minimum brightness value")
.withEndpoint("right"),
e
.numeric("ballast_maximum_level", ea.ALL)
.withValueMin(1)
.withValueMax(254)
.withDescription("Specifies the maximum brightness value")
.withEndpoint("right"),
e.binary("device_mode", ea.ALL, "dimmer_on", "dimmer_off").withDescription("Allow the device to change brightness"),
e.switch().withEndpoint("left"),
e.switch().withEndpoint("right"),
legrand_1.eLegrand.ledInDark(),
legrand_1.eLegrand.ledIfOn(),
],
extend: [m.deviceEndpoints({ endpoints: { left: 2, right: 1 } }), m.light({ configureReporting: true, endpointNames: ["left", "right"] })],
},
{
zigbeeModel: [" Mobile outlet\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"],
model: "WNRR15/WNRR20",
vendor: "Legrand",
description: "Outlet with power consumption monitoring",
ota: true,
fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement, legrand_1.fzLegrand.cluster_fc01],
toZigbee: [tz.on_off, legrand_1.tzLegrand.led_mode, legrand_1.tzLegrand.identify],
exposes: [e.switch(), e.action(["identify"]), e.power()],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genIdentify", "genOnOff", "haElectricalMeasurement"]);
await reporting.onOff(endpoint);
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
await reporting.activePower(endpoint);
},
},
{
zigbeeModel: ["Hospitality on off switch"],
model: "WNAL10/WNRL10",
vendor: "Legrand",
description: "Smart switch with Netatmo",
ota: true,
fromZigbee: [fz.on_off, fz.legrand_binary_input_on_off, legrand_1.fzLegrand.cluster_fc01],
toZigbee: [tz.on_off, legrand_1.tzLegrand.led_mode],
exposes: [e.switch(), legrand_1.eLegrand.ledInDark(), legrand_1.eLegrand.ledIfOn()],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genOnOff"]);
await reporting.onOff(endpoint);
},
},
{
zigbeeModel: ["Hospitality dimmer switch"],
model: "WNAL50/WNRL50",
vendor: "Legrand",
description: "Smart dimmer switch with Netatmo",
ota: true,
fromZigbee: [fz.identify, fz.lighting_ballast_configuration, legrand_1.fzLegrand.cluster_fc01],
toZigbee: [legrand_1.tzLegrand.led_mode, tz.legrand_device_mode, legrand_1.tzLegrand.identify, tz.ballast_config],
exposes: [
e.numeric("ballast_minimum_level", ea.ALL).withValueMin(1).withValueMax(254).withDescription("Specifies the minimum brightness value"),
e.numeric("ballast_maximum_level", ea.ALL).withValueMin(1).withValueMax(254).withDescription("Specifies the maximum brightness value"),
e.binary("device_mode", ea.ALL, "dimmer_on", "dimmer_off").withDescription("Allow the device to change brightness"),
legrand_1.eLegrand.ledInDark(),
legrand_1.eLegrand.ledIfOn(),
],
extend: [m.light({ configureReporting: true })],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genIdentify", "genBinaryInput", "lightingBallastCfg"]);
},
},
{
// LED blinks RED when battery is low
zigbeeModel: ["Remote dimmer switch"],
model: "WNAL63",
vendor: "Legrand",
description: "Remote dimmer switch",
ota: true,
meta: { battery: { voltageToPercentage: { min: 2500, max: 3000 } }, publishDuplicateTransaction: true },
fromZigbee: [fz.identify, fz.command_on, fz.command_off, fz.command_toggle, fz.command_move, fz.command_stop, fz.battery],
toZigbee: [],
exposes: [e.battery(), e.action(["identify", "on", "off", "toggle", "brightness_move_up", "brightness_move_down", "brightness_stop"])],
onEvent: legrand_1.readInitialBatteryState,
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genIdentify", "genOnOff", "genLevelCtrl"]);
},
},
{
zigbeeModel: [" Centralized ventilation SW", " Centralized ventilation SW\u0000\u0000\u0000\u0000"],
model: "067766",
vendor: "Legrand",
description: "Centralized ventilation switch",
ota: true,
fromZigbee: [fz.identify, fz.on_off, fz.power_on_behavior, legrand_1.fzLegrand.cluster_fc01],
toZigbee: [tz.on_off, legrand_1.tzLegrand.led_mode, legrand_1.tzLegrand.identify, tz.power_on_behavior],
exposes: [e.switch(), e.action(["identify"]), legrand_1.eLegrand.ledInDark(), legrand_1.eLegrand.ledIfOn(), e.power_on_behavior()],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genIdentify", "genOnOff"]);
await reporting.onOff(endpoint);
},
},
{
fingerprint: [
{
modelID: " Dimmer switch with neutral\u0000\u0000\u0000\u0000",
manufacturerName: " Legrand\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
},
],
model: "067797",
vendor: "Legrand",
description: "Dimmer switch with neutral",
ota: true,
fromZigbee: [fz.identify, fz.lighting_ballast_configuration, legrand_1.fzLegrand.cluster_fc01],
toZigbee: [tz.on_off, legrand_1.tzLegrand.led_mode, tz.legrand_device_mode, legrand_1.tzLegrand.identify, tz.ballast_config],
exposes: [
e.numeric("ballast_minimum_level", ea.ALL).withValueMin(1).withValueMax(254).withDescription("Specifies the minimum brightness value"),
e.numeric("ballast_maximum_level", ea.ALL).withValueMin(1).withValueMax(254).withDescription("Specifies the maximum brightness value"),
e.binary("device_mode", ea.ALL, "dimmer_on", "dimmer_off").withDescription("Allow the device to change brightness"),
legrand_1.eLegrand.identify(),
legrand_1.eLegrand.ledInDark(),
legrand_1.eLegrand.ledIfOn(),
],
extend: [m.light({ configureReporting: true })],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ["genBinaryInput", "genOnOff", "lightingBallastCfg"]);
await reporting.onOff(endpoint);
},
},
];
//# sourceMappingURL=legrand.js.map