zigbee-herdsman-converters
Version:
Collection of device converters to be used with zigbee-herdsman
1,101 lines • 210 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 zigbee_herdsman_1 = require("zigbee-herdsman");
const fz = __importStar(require("../converters/fromZigbee"));
const tz = __importStar(require("../converters/toZigbee"));
const exposes = __importStar(require("../lib/exposes"));
const logger_1 = require("../lib/logger");
const lumi = __importStar(require("../lib/lumi"));
const m = __importStar(require("../lib/modernExtend"));
const reporting = __importStar(require("../lib/reporting"));
const globalStore = __importStar(require("../lib/store"));
const e = exposes.presets;
const ea = exposes.access;
const { lumiAction, lumiOperationMode, lumiPowerOnBehavior, lumiZigbeeOTA, lumiSwitchType, lumiAirQuality, lumiVoc, lumiDisplayUnit, lumiLight, lumiOutageCountRestoreBindReporting, lumiElectricityMeter, lumiPower, lumiOverloadProtection, lumiLedIndicator, lumiButtonLock, lumiMotorSpeed, lumiCurtainSpeed, lumiCurtainManualOpenClose, lumiCurtainAdaptivePullingSpeed, lumiCurtainManualStop, lumiCurtainReverse, lumiCurtainStatus, lumiCurtainLastManualOperation, lumiCurtainPosition, lumiCurtainTraverseTime, lumiCurtainCalibrationStatus, lumiCurtainCalibrated, lumiCurtainIdentifyBeep, lumiOnOff, lumiLedDisabledNight, lumiFlipIndicatorLight, lumiPreventReset, lumiClickMode, lumiSlider, lumiSetEventMode, lumiSwitchMode, lumiVibration, lumiReportInterval, lumiSensitivityAdjustment, lumiKnobRotation, lumiCommandMode, lumiBattery, lumiLockRelay, lumiMultiClick, lumiPreventLeave, lumiExternalSensor, } = lumi.modernExtend;
const NS = "zhc:lumi";
const { manufacturerCode } = lumi;
exports.definitions = [
{
zigbeeModel: ["lumi.flood.acn001"],
model: "SJCGQ13LM",
vendor: "Aqara",
description: "Water leak sensor E1",
fromZigbee: [fz.ias_water_leak_alarm_1, lumi.fromZigbee.lumi_specific, fz.battery],
toZigbee: [],
exposes: [e.water_leak(), e.battery(), e.battery_low(), e.battery_voltage(), e.device_temperature(), e.power_outage_count(false)],
meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await endpoint.read("genPowerCfg", ["batteryVoltage"]);
},
extend: [m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
},
{
zigbeeModel: ["lumi.airm.fhac01"],
model: "KQJCMB11LM",
vendor: "Aqara",
description: "Air monitoring panel S1",
fromZigbee: [fz.temperature, fz.humidity, lumi.fromZigbee.lumi_pm25, lumi.fromZigbee.lumi_co2],
toZigbee: [],
exposes: [e.temperature(), e.humidity(), e.pm25(), e.co2()],
extend: [lumiZigbeeOTA()],
},
{
zigbeeModel: ["lumi.magnet.acn001"],
model: "MCCGQ14LM",
vendor: "Aqara",
description: "Door and window sensor E1",
fromZigbee: [fz.ias_contact_alarm_1, lumi.fromZigbee.lumi_specific, fz.battery],
toZigbee: [],
meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
exposes: [e.contact(), e.battery(), e.battery_low(), e.battery_voltage()],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await endpoint.read("genPowerCfg", ["batteryVoltage"]);
},
extend: [
m.quirkCheckinInterval("1_HOUR"),
// OTA request: "fieldControl":0, "manufacturerCode":4447, "imageType":10635, no available for now
// https://github.com/Koenkk/zigbee-OTA/pull/138
// lumiZigbeeOTA(),
],
},
{
zigbeeModel: ["lumi.magnet.ac01"],
model: "MCCGQ13LM",
vendor: "Aqara",
description: "Door and window sensor P1",
fromZigbee: [lumi.fromZigbee.lumi_contact, fz.ias_contact_alarm_1, lumi.fromZigbee.lumi_specific],
toZigbee: [lumi.toZigbee.lumi_detection_distance],
meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
exposes: [
e.contact(),
e.battery(),
e.battery_voltage(),
e.tamper(),
e
.enum("detection_distance", ea.ALL, ["10mm", "20mm", "30mm"])
.withDescription('The sensor will be considered "off" within the set distance. Please press the device button before setting'),
],
extend: [m.quirkCheckinInterval("1_HOUR")],
},
{
zigbeeModel: ["lumi.dimmer.rcbac1"],
model: "ZNDDMK11LM",
vendor: "Aqara",
description: "Smart lightstrip driver",
fromZigbee: [lumi.fromZigbee.lumi_power, lumi.fromZigbee.lumi_specific, ...m.light({ colorTemp: { range: undefined }, color: true }).fromZigbee],
toZigbee: [
lumi.toZigbee.lumi_dimmer_mode,
lumi.toZigbee.lumi_switch_power_outage_memory,
...m.light({ colorTemp: { range: undefined }, color: true }).toZigbee,
],
exposes: [
e.power(),
e.energy(),
e.voltage(),
e.device_temperature(),
e.power_outage_memory(),
// When in rgbw mode, only one of color and colortemp will be valid, and l2 will be invalid
// Do not control l2 in rgbw mode
e
.light_brightness_colortemp_colorxy([153, 370])
.removeFeature("color_temp_startup")
.withEndpoint("l1"),
e.light_brightness_colortemp([153, 370]).removeFeature("color_temp_startup").withEndpoint("l2"),
e.enum("dimmer_mode", ea.ALL, ["rgbw", "dual_ct"]).withDescription("Switch between rgbw mode or dual color temperature mode"),
],
extend: [m.deviceEndpoints({ endpoints: { l1: 1, l2: 2 } }), lumiZigbeeOTA()],
},
{
zigbeeModel: ["lumi.light.aqcn02"],
model: "ZNLDP12LM",
vendor: "Aqara",
description: "Light bulb",
extend: [lumiLight({ colorTemp: true, powerOutageMemory: "light" }), lumiZigbeeOTA()],
},
{
zigbeeModel: ["lumi.light.acn003"],
model: "ZNXDD01LM",
vendor: "Aqara",
description: "Ceiling light L1-350",
extend: [lumiLight({ colorTemp: true, powerOutageMemory: "switch", levelConfig: { features: ["on_level"] } }), lumiZigbeeOTA()],
},
{
zigbeeModel: ["lumi.light.cwac02", "lumi.light.acn014"],
model: "ZNLDP13LM",
vendor: "Aqara",
description: "Light bulb T1",
whiteLabel: [{ vendor: "Aqara", model: "LEDLBT1-L01" }],
extend: [
lumiZigbeeOTA(),
lumiLight({ colorTemp: true, powerOutageMemory: "switch" }),
m.forceDeviceType({ type: "Router" }),
m.forcePowerSource({ powerSource: "Mains (single phase)" }),
],
},
{
zigbeeModel: ["lumi.light.cwopcn01"],
model: "XDD11LM",
vendor: "Aqara",
description: "Opple MX960",
meta: { turnsOffAtBrightness1: true },
extend: [lumiLight({ colorTemp: true, powerOutageMemory: "switch" }), lumiZigbeeOTA()],
},
{
zigbeeModel: ["lumi.light.cwopcn02"],
model: "XDD12LM",
vendor: "Aqara",
description: "Opple MX650",
meta: { turnsOffAtBrightness1: true },
extend: [lumiZigbeeOTA(), lumiLight({ colorTemp: true, powerOutageMemory: "switch" })],
},
{
zigbeeModel: ["lumi.light.cwopcn03"],
model: "XDD13LM",
vendor: "Aqara",
description: "Opple MX480",
meta: { turnsOffAtBrightness1: true },
extend: [lumiLight({ colorTemp: true, powerOutageMemory: "switch", colorTempRange: [175, 370] }), lumiZigbeeOTA()],
},
{
zigbeeModel: ["lumi.light.cwjwcn01"],
model: "JWSP001A",
vendor: "Aqara",
description: "Jiawen LED Driver & Dimmer",
extend: [lumiLight({ colorTemp: true, powerOutageMemory: "switch" })],
},
{
zigbeeModel: ["lumi.light.cwjwcn02"],
model: "JWDL001A",
vendor: "Aqara",
description: "Embedded spot led light",
extend: [lumiLight({ colorTemp: true, powerOutageMemory: "switch" })],
},
{
zigbeeModel: ["lumi.sensor_switch"],
model: "WXKG01LM",
vendor: "Xiaomi",
whiteLabel: [
{ vendor: "Xiaomi", model: "YTC4040GL" },
{ vendor: "Xiaomi", model: "YTC4006CN" },
{ vendor: "Xiaomi", model: "YTC4017CN" },
{ vendor: "Xiaomi", model: "ZHTZ02LM" },
],
description: "Mi wireless switch",
meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
fromZigbee: [lumi.fromZigbee.lumi_basic, lumi.fromZigbee.lumi_action_WXKG01LM],
exposes: [
e.battery(),
e.action(["single", "double", "triple", "quadruple", "hold", "release", "many"]),
e.battery_voltage(),
e.power_outage_count(false),
],
toZigbee: [],
extend: [m.quirkCheckinInterval("1_HOUR")],
},
{
zigbeeModel: ["lumi.sensor_switch.aq2", "lumi.remote.b1acn01"],
model: "WXKG11LM",
vendor: "Aqara",
description: "Wireless mini switch",
meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
exposes: [
e.battery(),
e.battery_voltage(),
e.action(["single", "double", "triple", "quadruple", "hold", "release"]),
e.device_temperature(),
e.power_outage_count(),
],
fromZigbee: [lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_action, lumi.fromZigbee.lumi_basic],
toZigbee: [],
extend: [m.quirkCheckinInterval("1_HOUR")],
},
{
zigbeeModel: ["lumi.sensor_switch.aq3", "lumi.sensor_swit"],
model: "WXKG12LM",
vendor: "Aqara",
description: "Wireless mini switch (with gyroscope)",
meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
exposes: [e.battery(), e.action(["single", "double", "hold", "release", "shake"]), e.battery_voltage()],
fromZigbee: [lumi.fromZigbee.lumi_basic, lumi.fromZigbee.lumi_action_multistate],
toZigbee: [],
extend: [m.quirkCheckinInterval("1_HOUR")],
},
{
zigbeeModel: ["lumi.sensor_86sw1"],
model: "WXKG03LM_rev1",
vendor: "Aqara",
description: "Wireless remote switch (single rocker), 2016 model",
meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
exposes: [e.battery(), e.action(["single"]), e.battery_voltage()],
fromZigbee: [lumi.fromZigbee.lumi_action, lumi.fromZigbee.lumi_basic],
toZigbee: [],
extend: [m.quirkCheckinInterval("1_HOUR"), lumiPreventReset()],
},
{
zigbeeModel: ["lumi.remote.b186acn01"],
model: "WXKG03LM_rev2",
vendor: "Aqara",
description: "Wireless remote switch (single rocker), 2018 model",
meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
exposes: [e.battery(), e.action(["single", "double", "hold"]), e.battery_voltage()],
fromZigbee: [lumi.fromZigbee.lumi_action, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_basic],
toZigbee: [],
extend: [m.quirkCheckinInterval("1_HOUR"), lumiPreventReset()],
},
{
zigbeeModel: ["lumi.remote.b186acn02"],
model: "WXKG06LM",
vendor: "Aqara",
description: "Wireless remote switch D1 (single rocker)",
fromZigbee: [lumi.fromZigbee.lumi_basic, lumi.fromZigbee.lumi_action, lumi.fromZigbee.lumi_action_multistate],
toZigbee: [],
exposes: [e.battery(), e.action(["single", "double", "hold"]), e.battery_voltage()],
meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
extend: [m.quirkCheckinInterval("1_HOUR"), lumiPreventReset()],
configure: async (device, coordinatorEndpoint) => {
try {
const endpoint = device.endpoints[1];
await reporting.bind(endpoint, coordinatorEndpoint, ["genOnOff", "genPowerCfg"]);
}
catch {
// fails for some but device works as expected: https://github.com/Koenkk/zigbee2mqtt/issues/9136
}
},
},
{
zigbeeModel: ["lumi.light.acn132"],
model: "LGYCDD01LM",
vendor: "Aqara",
whiteLabel: [{ vendor: "Aqara", model: "RLS-K01D" }],
description: "Light strip T1",
extend: [
m.light({ effect: false, powerOnBehavior: false, colorTemp: { startup: false, range: [153, 370] }, color: true }),
lumiPowerOnBehavior(),
m.numeric({
name: "length",
valueMin: 1,
valueMax: 10,
valueStep: 0.2,
scale: 5,
unit: "m",
cluster: "manuSpecificLumi",
attribute: { ID: 0x051b, type: 0x20 },
description: "LED strip length",
zigbeeCommandOptions: { manufacturerCode },
}),
m.numeric({
name: "min_brightness",
valueMin: 0,
valueMax: 99,
unit: "%",
cluster: "manuSpecificLumi",
attribute: { ID: 0x0515, type: 0x20 },
description: "Minimum brightness level",
zigbeeCommandOptions: { manufacturerCode },
}),
m.numeric({
name: "max_brightness",
valueMin: 1,
valueMax: 100,
unit: "%",
cluster: "manuSpecificLumi",
attribute: { ID: 0x0516, type: 0x20 },
description: "Maximum brightness level",
zigbeeCommandOptions: { manufacturerCode },
}),
m.binary({
name: "audio",
valueOn: ["ON", 1],
valueOff: ["OFF", 0],
cluster: "manuSpecificLumi",
attribute: { ID: 0x051c, type: 0x20 },
description: "Enabling audio",
zigbeeCommandOptions: { manufacturerCode },
}),
m.enumLookup({
name: "audio_sensitivity",
lookup: { low: 0, medium: 1, high: 2 },
cluster: "manuSpecificLumi",
attribute: { ID: 0x051e, type: 0x20 },
description: "Audio sensitivity",
zigbeeCommandOptions: { manufacturerCode },
}),
m.enumLookup({
name: "audio_effect",
lookup: { random: 0, blink: 1, rainbow: 2, wave: 3 },
cluster: "manuSpecificLumi",
attribute: { ID: 0x051d, type: 0x23 },
description: "Audio effect",
zigbeeCommandOptions: { manufacturerCode },
}),
m.numeric({
name: "preset",
valueMin: 1,
valueMax: 32,
cluster: "manuSpecificLumi",
attribute: { ID: 0x051f, type: 0x23 },
description: "Preset index (0-6 default presets)",
zigbeeCommandOptions: { manufacturerCode },
}),
m.numeric({
name: "speed",
valueMin: 1,
valueMax: 100,
cluster: "manuSpecificLumi",
attribute: { ID: 0x0520, type: 0x20 },
description: "Effect speed",
zigbeeCommandOptions: { manufacturerCode },
}),
lumiZigbeeOTA(),
],
},
{
zigbeeModel: ["lumi.sensor_86sw2", "lumi.sensor_86sw2.es1"],
model: "WXKG02LM_rev1",
vendor: "Aqara",
description: "Wireless remote switch (double rocker), 2016 model",
meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
exposes: [e.battery(), e.action(["single_left", "single_right", "single_both"]), e.battery_voltage(), e.power_outage_count(false)],
fromZigbee: [lumi.fromZigbee.lumi_action, lumi.fromZigbee.lumi_basic],
toZigbee: [],
extend: [m.quirkCheckinInterval("1_HOUR"), lumiPreventReset()],
},
{
zigbeeModel: ["lumi.remote.b286acn01"],
model: "WXKG02LM_rev2",
vendor: "Aqara",
description: "Wireless remote switch (double rocker), 2018 model",
meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
exposes: [
e.battery(),
e.action([
"single_left",
"single_right",
"single_both",
"double_left",
"double_right",
"double_both",
"hold_left",
"hold_right",
"hold_both",
]),
e.battery_voltage(),
],
fromZigbee: [lumi.fromZigbee.lumi_action, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_basic],
toZigbee: [],
extend: [m.quirkCheckinInterval("1_HOUR"), lumiPreventReset()],
},
{
zigbeeModel: ["lumi.switch.b1laus01"],
model: "WS-USC01",
vendor: "Aqara",
description: "Smart wall switch (no neutral, single rocker), US",
fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
toZigbee: [
tz.on_off,
lumi.toZigbee.lumi_switch_operation_mode_opple,
lumi.toZigbee.lumi_flip_indicator_light,
lumi.toZigbee.lumi_switch_mode_switch,
lumi.toZigbee.lumi_switch_power_outage_memory,
],
exposes: [
e.switch(),
e.action(["single", "double"]),
e.flip_indicator_light(),
e.power_outage_memory(),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode"),
e
.enum("mode_switch", ea.ALL, ["anti_flicker_mode", "quick_mode"])
.withDescription("Anti flicker mode can be used to solve blinking issues of some lights. Quick mode makes the device respond faster."),
e.power_outage_count(),
e.device_temperature().withAccess(ea.STATE),
],
configure: async (device, coordinatorEndpoint) => {
const endpoint1 = device.getEndpoint(1);
// set "event" mode
await endpoint1.write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
},
extend: [lumiZigbeeOTA(), lumiPreventReset(), m.forcePowerSource({ powerSource: "Mains (single phase)" })],
},
{
zigbeeModel: ["lumi.switch.b2laus01"],
model: "WS-USC02",
vendor: "Aqara",
description: "Smart wall switch (no neutral, double rocker), US",
fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
toZigbee: [
tz.on_off,
lumi.toZigbee.lumi_switch_operation_mode_opple,
lumi.toZigbee.lumi_flip_indicator_light,
lumi.toZigbee.lumi_switch_power_outage_memory,
lumi.toZigbee.lumi_switch_mode_switch,
],
exposes: [
e.switch().withEndpoint("top"),
e.switch().withEndpoint("bottom"),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode for top button").withEndpoint("top"),
e
.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"])
.withDescription("Decoupled mode for bottom button")
.withEndpoint("bottom"),
e
.enum("mode_switch", ea.ALL, ["anti_flicker_mode", "quick_mode"])
.withDescription("Anti flicker mode can be used to solve blinking issues of some lights. Quick mode makes the device respond faster."),
e.power_outage_count(),
e.device_temperature().withAccess(ea.STATE),
e.flip_indicator_light(),
e.power_outage_memory(),
e.action(["single_top", "single_bottom", "single_both", "double_top", "double_bottom", "double_both"]),
],
meta: { multiEndpoint: true },
endpoint: (device) => {
return { top: 1, bottom: 2 };
},
configure: async (device, coordinatorEndpoint) => {
await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
},
extend: [lumiZigbeeOTA(), lumiPreventReset()],
},
{
zigbeeModel: ["lumi.switch.b1naus01"],
model: "WS-USC03",
vendor: "Aqara",
description: "Smart wall switch (with neutral, single rocker), US",
fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_power, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
toZigbee: [
tz.on_off,
lumi.toZigbee.lumi_power,
lumi.toZigbee.lumi_switch_operation_mode_opple,
lumi.toZigbee.lumi_switch_power_outage_memory,
lumi.toZigbee.lumi_flip_indicator_light,
],
exposes: [
e.switch(),
e.action(["single", "double"]),
e.flip_indicator_light(),
e.power_outage_count(),
e.device_temperature().withAccess(ea.STATE),
e.power().withAccess(ea.STATE_GET),
e.energy(),
e.voltage(),
e.power_outage_memory(),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode"),
],
configure: async (device, coordinatorEndpoint) => {
const endpoint1 = device.getEndpoint(1);
// set "event" mode
await endpoint1.write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
},
extend: [lumiZigbeeOTA(), lumiPreventReset()],
},
{
zigbeeModel: ["lumi.switch.b2naus01"],
model: "WS-USC04",
vendor: "Aqara",
description: "Smart wall switch (with neutral, double rocker), US",
fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_power, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
toZigbee: [
tz.on_off,
lumi.toZigbee.lumi_power,
lumi.toZigbee.lumi_switch_operation_mode_opple,
lumi.toZigbee.lumi_switch_power_outage_memory,
lumi.toZigbee.lumi_flip_indicator_light,
],
exposes: [
e.switch().withEndpoint("top"),
e.switch().withEndpoint("bottom"),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode for top button").withEndpoint("top"),
e
.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"])
.withDescription("Decoupled mode for bottom button")
.withEndpoint("bottom"),
e.power_outage_count(),
e.device_temperature().withAccess(ea.STATE),
e.flip_indicator_light(),
e.power().withAccess(ea.STATE_GET),
e.energy(),
e.voltage(),
e.power_outage_memory(),
e.action(["single_top", "single_bottom", "single_both", "double_top", "double_bottom", "double_both"]),
],
meta: { multiEndpoint: true, multiEndpointSkip: ["power", "energy"] },
endpoint: (device) => {
return { top: 1, bottom: 2 };
},
configure: async (device, coordinatorEndpoint) => {
await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
},
extend: [lumiZigbeeOTA(), lumiPreventReset()],
},
{
zigbeeModel: ["lumi.switch.l1acn1"],
model: "QBKG27LM",
vendor: "Aqara",
description: "Smart wall switch H1 (no neutral, single rocker)",
fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_specific, lumi.fromZigbee.lumi_action_multistate],
toZigbee: [
tz.on_off,
lumi.toZigbee.lumi_switch_operation_mode_opple,
lumi.toZigbee.lumi_switch_power_outage_memory,
lumi.toZigbee.lumi_led_disabled_night,
lumi.toZigbee.lumi_flip_indicator_light,
lumi.toZigbee.lumi_switch_mode_switch,
],
exposes: [
e.switch(),
e.device_temperature(),
e.power_outage_memory(),
e.led_disabled_night(),
e.flip_indicator_light(),
e.action(["single", "double"]),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode"),
e.power_outage_count(),
e
.enum("mode_switch", ea.ALL, ["anti_flicker_mode", "quick_mode"])
.withDescription("Anti flicker mode can be used to solve blinking issues of some lights. Quick mode makes the device respond faster."),
],
configure: async (device, coordinatorEndpoint) => {
await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
},
extend: [lumiZigbeeOTA(), lumiPreventReset()],
},
{
zigbeeModel: ["lumi.switch.l2acn1"],
model: "QBKG28LM",
vendor: "Aqara",
description: "Smart wall switch H1 (no neutral, double rocker)",
fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
toZigbee: [
tz.on_off,
lumi.toZigbee.lumi_switch_operation_mode_opple,
lumi.toZigbee.lumi_switch_power_outage_memory,
lumi.toZigbee.lumi_flip_indicator_light,
lumi.toZigbee.lumi_led_disabled_night,
lumi.toZigbee.lumi_switch_mode_switch,
],
meta: { multiEndpoint: true },
endpoint: (device) => {
return { left: 1, right: 2 };
},
exposes: [
e.switch().withEndpoint("left"),
e.switch().withEndpoint("right"),
e.device_temperature(),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode for left button").withEndpoint("left"),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode for right button").withEndpoint("right"),
e.action(["single_left", "double_left", "single_right", "double_right", "single_both", "double_both"]),
e.power_outage_memory(),
e.flip_indicator_light(),
e.led_disabled_night(),
e
.enum("mode_switch", ea.ALL, ["anti_flicker_mode", "quick_mode"])
.withDescription("Anti flicker mode can be used to solve blinking issues of some lights. Quick mode makes the device respond faster."),
],
configure: async (device, coordinatorEndpoint) => {
await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
},
extend: [lumiZigbeeOTA(), lumiPreventReset()],
},
{
zigbeeModel: ["lumi.switch.l3acn1"],
model: "QBKG29LM",
vendor: "Aqara",
description: "Smart wall switch H1 (no neutral, triple rocker)",
fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
toZigbee: [
tz.on_off,
lumi.toZigbee.lumi_switch_operation_mode_opple,
lumi.toZigbee.lumi_switch_power_outage_memory,
lumi.toZigbee.lumi_flip_indicator_light,
lumi.toZigbee.lumi_led_disabled_night,
lumi.toZigbee.lumi_switch_mode_switch,
],
meta: { multiEndpoint: true },
endpoint: (device) => ({ left: 1, center: 2, right: 3 }),
exposes: [
e.switch().withEndpoint("left"),
e.switch().withEndpoint("center"),
e.switch().withEndpoint("right"),
e.power_outage_memory(),
e.flip_indicator_light(),
e.led_disabled_night(),
e.power_outage_count(),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode for left button").withEndpoint("left"),
e
.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"])
.withDescription("Decoupled mode for center button")
.withEndpoint("center"),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode for right button").withEndpoint("right"),
e
.enum("mode_switch", ea.ALL, ["anti_flicker_mode", "quick_mode"])
.withDescription("Anti flicker mode can be used to solve blinking issues of some lights. Quick mode makes the device respond faster."),
e.device_temperature().withAccess(ea.STATE),
e.action([
"single_left",
"double_left",
"single_center",
"double_center",
"single_right",
"double_right",
"single_left_center",
"double_left_center",
"single_left_right",
"double_left_right",
"single_center_right",
"double_center_right",
"single_all",
"double_all",
]),
],
configure: async (device, coordinatorEndpoint) => {
await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
},
extend: [lumiPreventReset()],
},
{
zigbeeModel: ["lumi.switch.n1acn1"],
model: "QBKG30LM",
vendor: "Aqara",
description: "Smart wall switch H1 Pro (with neutral, single rocker)",
fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_power, lumi.fromZigbee.lumi_specific, lumi.fromZigbee.lumi_action_multistate],
toZigbee: [
tz.on_off,
lumi.toZigbee.lumi_switch_operation_mode_opple,
lumi.toZigbee.lumi_switch_power_outage_memory,
lumi.toZigbee.lumi_led_disabled_night,
lumi.toZigbee.lumi_flip_indicator_light,
],
exposes: [
e.switch(),
e.power(),
e.energy(),
e.voltage(),
e.device_temperature(),
e.power_outage_memory(),
e.led_disabled_night(),
e.flip_indicator_light(),
e.action(["single", "double"]),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode"),
e.power_outage_count(),
],
extend: [lumiZigbeeOTA(), lumiPreventReset()],
},
{
zigbeeModel: ["lumi.switch.n2acn1"],
model: "QBKG31LM",
vendor: "Aqara",
description: "Smart wall switch H1 Pro (with neutral, double rocker)",
meta: { multiEndpoint: true, multiEndpointSkip: ["power", "energy"] },
endpoint: (device) => {
return { left: 1, right: 2 };
},
fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_power, lumi.fromZigbee.lumi_specific, lumi.fromZigbee.lumi_action_multistate],
toZigbee: [
tz.on_off,
lumi.toZigbee.lumi_switch_operation_mode_opple,
lumi.toZigbee.lumi_switch_power_outage_memory,
lumi.toZigbee.lumi_led_disabled_night,
lumi.toZigbee.lumi_flip_indicator_light,
],
exposes: [
e.switch().withEndpoint("left"),
e.switch().withEndpoint("right"),
e.power(),
e.energy(),
e.voltage(),
e.device_temperature(),
e.power_outage_memory(),
e.led_disabled_night(),
e.flip_indicator_light(),
e.action(["single_left", "single_right", "single_both", "double_left", "double_right", "double_both"]),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode for left button").withEndpoint("left"),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode for right button").withEndpoint("right"),
e.power_outage_count(),
],
extend: [lumiZigbeeOTA(), lumiPreventReset()],
},
{
zigbeeModel: ["lumi.switch.n3acn1"],
model: "QBKG32LM",
vendor: "Aqara",
description: "Smart wall switch H1 Pro (with neutral, triple rocker)",
meta: { multiEndpoint: true },
endpoint: (device) => {
return { left: 1, center: 2, right: 3 };
},
fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_power, lumi.fromZigbee.lumi_specific, lumi.fromZigbee.lumi_action_multistate],
toZigbee: [
tz.on_off,
lumi.toZigbee.lumi_switch_operation_mode_opple,
lumi.toZigbee.lumi_switch_power_outage_memory,
lumi.toZigbee.lumi_led_disabled_night,
lumi.toZigbee.lumi_flip_indicator_light,
],
exposes: [
e.switch().withEndpoint("left"),
e.switch().withEndpoint("right"),
e.switch().withEndpoint("center"),
e.power(),
e.energy(),
e.voltage(),
e.device_temperature(),
e.power_outage_memory(),
e.led_disabled_night(),
e.flip_indicator_light(),
e.action([
"single_left",
"double_left",
"single_center",
"double_center",
"single_right",
"double_right",
"single_left_center",
"double_left_center",
"single_left_right",
"double_left_right",
"single_center_right",
"double_center_right",
"single_all",
"double_all",
]),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode for left button").withEndpoint("left"),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode for right button").withEndpoint("right"),
e
.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"])
.withDescription("Decoupled mode for center button")
.withEndpoint("center"),
e.power_outage_count(),
],
extend: [lumiZigbeeOTA(), lumiPreventReset()],
},
{
zigbeeModel: ["lumi.switch.l1aeu1"],
model: "WS-EUK01",
vendor: "Aqara",
description: "Smart wall switch H1 EU (no neutral, single rocker)",
fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
toZigbee: [
tz.on_off,
lumi.toZigbee.lumi_switch_operation_mode_opple,
lumi.toZigbee.lumi_switch_power_outage_memory,
lumi.toZigbee.lumi_flip_indicator_light,
lumi.toZigbee.lumi_led_disabled_night,
lumi.toZigbee.lumi_switch_mode_switch,
],
exposes: [
e.switch(),
e.action(["single", "double"]),
e.power_outage_memory(),
e.flip_indicator_light(),
e.led_disabled_night(),
e.power_outage_count(),
e.device_temperature().withAccess(ea.STATE),
e.operation_mode_select(["control_relay", "decoupled"]).withDescription("Switches between direct relay control and action sending only"),
e
.mode_switch_select(["anti_flicker_mode", "quick_mode"])
.withDescription("Features. Anti flicker mode can be used to solve blinking issues of some lights." +
"Quick mode makes the device respond faster."),
],
configure: async (device, coordinatorEndpoint) => {
const endpoint1 = device.getEndpoint(1);
// set "event" mode
await endpoint1.write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
},
extend: [lumiPreventReset()],
},
{
zigbeeModel: ["lumi.switch.l2aeu1"],
model: "WS-EUK02",
vendor: "Aqara",
description: "Smart wall switch H1 EU (no neutral, double rocker)",
fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
toZigbee: [
tz.on_off,
lumi.toZigbee.lumi_switch_operation_mode_opple,
lumi.toZigbee.lumi_switch_power_outage_memory,
lumi.toZigbee.lumi_flip_indicator_light,
lumi.toZigbee.lumi_led_disabled_night,
lumi.toZigbee.lumi_switch_mode_switch,
],
meta: { multiEndpoint: true },
endpoint: (_device) => {
return { left: 1, right: 2 };
},
exposes: [
e.switch().withEndpoint("left"),
e.switch().withEndpoint("right"),
e.power_outage_memory(),
e.flip_indicator_light(),
e.led_disabled_night(),
e.power_outage_count(),
e.device_temperature().withAccess(ea.STATE),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode for left button").withEndpoint("left"),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode for right button").withEndpoint("right"),
e
.enum("mode_switch", ea.ALL, ["anti_flicker_mode", "quick_mode"])
.withDescription("Anti flicker mode can be used to solve blinking issues of some lights. Quick mode makes the device respond faster."),
e.action(["single_left", "double_left", "single_right", "double_right", "single_both", "double_both"]),
],
configure: async (device, coordinatorEndpoint) => {
await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
},
extend: [lumiPreventReset()],
},
{
zigbeeModel: ["lumi.switch.n1aeu1"],
model: "WS-EUK03",
vendor: "Aqara",
description: "Smart wall switch H1 EU (with neutral, single rocker)",
fromZigbee: [fz.on_off, fz.electrical_measurement, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
toZigbee: [
tz.on_off,
tz.electrical_measurement_power,
lumi.toZigbee.lumi_switch_operation_mode_opple,
lumi.toZigbee.lumi_switch_power_outage_memory,
lumi.toZigbee.lumi_flip_indicator_light,
lumi.toZigbee.lumi_led_disabled_night,
],
exposes: [
e.switch(),
e.action(["single", "double"]),
e.power().withAccess(ea.STATE_GET),
e.energy(),
e.flip_indicator_light(),
e.power_outage_memory(),
e.device_temperature().withAccess(ea.STATE),
e.led_disabled_night(),
e.power_outage_count(),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode"),
],
configure: async (device, coordinatorEndpoint) => {
const endpoint1 = device.getEndpoint(1);
// set "event" mode
await endpoint1.write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
},
extend: [lumiZigbeeOTA(), lumiPreventReset()],
},
{
zigbeeModel: ["lumi.switch.n2aeu1"],
model: "WS-EUK04",
vendor: "Aqara",
description: "Smart wall switch H1 EU (with neutral, double rocker)",
fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_power, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
toZigbee: [
tz.on_off,
lumi.toZigbee.lumi_power,
lumi.toZigbee.lumi_switch_operation_mode_opple,
lumi.toZigbee.lumi_switch_power_outage_memory,
lumi.toZigbee.lumi_flip_indicator_light,
lumi.toZigbee.lumi_led_disabled_night,
],
meta: { multiEndpoint: true, multiEndpointSkip: ["power", "energy"] },
endpoint: (device) => {
return { left: 1, right: 2 };
},
exposes: [
e.switch().withEndpoint("left"),
e.switch().withEndpoint("right"),
e.power().withAccess(ea.STATE_GET),
e.energy(),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode for left button").withEndpoint("left"),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode for right button").withEndpoint("right"),
e.action(["single_left", "double_left", "single_right", "double_right", "single_both", "double_both"]),
e.device_temperature().withAccess(ea.STATE),
e.power_outage_memory(),
e.flip_indicator_light(),
e.led_disabled_night(),
e.power_outage_count(),
],
configure: async (device, coordinatorEndpoint) => {
const endpoint1 = device.getEndpoint(1);
// set "event" mode
await endpoint1.write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
},
extend: [lumiPreventReset()],
},
{
zigbeeModel: ["lumi.ctrl_neutral1"],
model: "QBKG04LM",
vendor: "Aqara",
description: "Smart wall switch (no neutral, single rocker)",
fromZigbee: [lumi.fromZigbee.lumi_on_off, lumi.fromZigbee.lumi_action, lumi.fromZigbee.lumi_operation_mode_basic],
exposes: [
e.switch(),
e.action(["release", "hold", "double", "single", "hold_release"]),
e.enum("operation_mode", ea.STATE_SET, ["control_relay", "decoupled"]).withDescription("Decoupled mode"),
],
toZigbee: [tz.on_off, { ...lumi.toZigbee.lumi_switch_operation_mode_basic, convertGet: null }],
endpoint: (device) => {
return { system: 1, default: 2 };
},
extend: [lumiZigbeeOTA(), lumiPreventReset(), m.forceDeviceType({ type: "EndDevice" })],
},
{
zigbeeModel: ["lumi.ctrl_ln1.aq1", "lumi.ctrl_ln1"],
model: "QBKG11LM",
vendor: "Aqara",
description: "Smart wall switch (with neutral, single rocker)",
fromZigbee: [
lumi.fromZigbee.lumi_action,
lumi.fromZigbee.lumi_action_multistate,
lumi.fromZigbee.lumi_on_off,
lumi.fromZigbee.lumi_basic,
lumi.fromZigbee.lumi_operation_mode_basic,
fz.ignore_multistate_report,
lumi.fromZigbee.lumi_power,
],
exposes: [
e.switch(),
e.power().withAccess(ea.STATE_GET),
e.device_temperature(),
e.energy(),
e.action(["single", "double", "release", "hold"]),
e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode"),
],
toZigbee: [tz.on_off, lumi.toZigbee.lumi_switch_operation_mode_basic, lumi.toZigbee.lumi_power],
endpoint: (device) => {
return { system: 1 };
},
extend: [lumiZigbeeOTA(), lumiPreventReset(), m.forcePowerSource({ powerSource: "Mains (single phase)" })],
},
{
zigbeeModel: ["lumi.ctrl_neutral2"],
model: "QBKG03LM",
vendor: "Aqara",
description: "Smart wall switch (no neutral, double rocker)",
fromZigbee: [lumi.fromZigbee.lumi_action, lumi.fromZigbee.lumi_on_off, lumi.fromZigbee.lumi_operation_mode_basic, lumi.fromZigbee.lumi_basic],
exposes: [
e.switch().withEndpoint("left"),
e.switch().withEndpoint("right"),
e.device_temperature(),
e.action([
"release_left",
"release_right",
"release_both",
"double_left",
"double_right",
"single_left",
"single_right",
"hold_release_left",
"hold_release_left",
]),
e
.enum("operation_mode", ea.STATE_SET, ["control_left_relay", "control_right_relay", "decoupled"])
.withDescription("Operation mode for left button")
.withEndpoint("left")
.withCategory("config"),
e
.enum("operation_mode", ea.STATE_SET, ["control_left_relay", "control_right_relay", "decoupled"])
.withDescription("Operation mode for right button")
.withEndpoint("right")
.withCategory("config"),
],
toZigbee: [tz.on_off, { ...lumi.toZigbee.lumi_switch_operation_mode_basic, convertGet: null }, lumi.toZigbee.lumi_power],
meta: { multiEndpoint: true },
endpoint: (device) => {
return { system: 1, left: 2, right: 3 };
},
extend: [lumiZigbeeOTA(), lumiPreventReset(), m.forceDeviceType({ type: "EndDevice" })],
},
{
zigbeeModel: ["lumi.ctrl_ln2.aq1", "lumi.ctrl_ln2"],
model: "QBKG12LM",
vendor: "Aqara",
description: "Smart wall switch (with neutral, double rocker)",
fromZigbee: [
lumi.fromZigbee.lumi_action,
lumi.fromZigbee.lumi_action_multistate,
lumi.fromZigbee.lumi_on_off,
lumi.fromZigbee.lumi_basic,
lumi.fromZigbee.lumi_operation_mode_basic,
lumi.fromZigbee.lumi_power,
],
exposes: [
e.switch().withEndpoint("left"),
e.switch().withEndpoint("right"),
e.device_temperature(),
e.energy(),
e.power().withAccess(ea.STATE_GET),
e.action([
"single_left",
"single_right",
"single_both",
"double_left",
"double_right",
"double_both",
"hold_left",
"hold_right",
"hold_both",
"release_left",
"release_right",
"release_both",
]),
e
.enum("operation_mode", ea.ALL, ["control_left_relay", "control_right_relay", "decoupled"])
.withDescription("Operation mode for left button")
.withEndpoint("left"),
e
.enum("operation_mode", ea.ALL, ["control_left_relay", "control_right_relay", "decoupled"])
.withDescription("Operation mode for right button")
.withEndpoint("right"),
],
meta: { multiEndpoint: true, multiEndpointSkip: ["power", "energy"] },
toZigbee: [tz.on_off, lumi.toZigbee.lumi_switch_operation_mode_basic, lumi.toZigbee.lumi_power],
endpoint: (device) => {
return { left: 1, right: 2, system: 1 };
},
extend: [lumiZigbeeOTA(), lumiPreventReset(), m.forcePowerSource({ powerSource: "Mains (single phase)" })],
},
{
zigbeeModel: ["lumi.remote.b286acn02"],
model: "WXKG07LM",
vendor: "Aqara",
description: "Wireless remote switch D1 (double rocker)",
meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
fromZigbee: [lumi.fromZigbee.lumi_basic, lumi.fromZigbee.lumi_action, lumi.fromZigbee.lumi_action_multistate],
toZigbee: [],
endpoint: (device) => {
return { left: 1, right: 2, both: 3 };
},
exposes: [
e.battery(),
e.battery_voltage(),
e.action([
"single_left",
"s