Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 63 additions & 20 deletions src/devices/lumi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,13 @@ export const definitions: DefinitionWithExtend[] = [
vendor: "Aqara",
whiteLabel: [{vendor: "Aqara", model: "RLS-K01D"}],
description: "Light strip T1",
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await endpoint.read("manuSpecificLumi", [0x0515], {manufacturerCode});
await endpoint.read("manuSpecificLumi", [0x0516], {manufacturerCode});
await endpoint.read("genLevelCtrl", [0x0012], {});
await endpoint.read("genLevelCtrl", [0x0013], {});
},
extend: [
m.light({effect: false, powerOnBehavior: false, colorTemp: {startup: false, range: [153, 370]}, color: true}),
lumiPowerOnBehavior(),
Expand All @@ -334,26 +341,6 @@ export const definitions: DefinitionWithExtend[] = [
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],
Expand Down Expand Up @@ -397,6 +384,10 @@ export const definitions: DefinitionWithExtend[] = [
description: "Effect speed",
zigbeeCommandOptions: {manufacturerCode},
}),
lumi.lumiModernExtend.lumiDimmingRangeMin(),
lumi.lumiModernExtend.lumiDimmingRangeMax(),
lumi.lumiModernExtend.lumiOffOnDuration(),
lumi.lumiModernExtend.lumiOnOffDuration(),
lumiZigbeeOTA(),
],
},
Expand Down Expand Up @@ -4348,18 +4339,36 @@ export const definitions: DefinitionWithExtend[] = [
model: "HCXDD12LM",
vendor: "Aqara",
description: "Ceiling light T1",
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await endpoint.read("manuSpecificLumi", [0x0515], {manufacturerCode});
await endpoint.read("manuSpecificLumi", [0x0516], {manufacturerCode});
await endpoint.read("genLevelCtrl", [0x0012], {});
await endpoint.read("genLevelCtrl", [0x0013], {});
},
extend: [
m.deviceEndpoints({endpoints: {white: 1, rgb: 2}}),
lumiLight({colorTemp: true, powerOutageMemory: "light", endpointNames: ["white"]}),
lumiLight({colorTemp: true, deviceTemperature: false, powerOutageCount: false, color: {modes: ["xy", "hs"]}, endpointNames: ["rgb"]}),
lumiZigbeeOTA(),
lumi.lumiModernExtend.lumiDimmingRangeMin(),
lumi.lumiModernExtend.lumiDimmingRangeMax(),
lumi.lumiModernExtend.lumiOffOnDuration(),
lumi.lumiModernExtend.lumiOnOffDuration(),
],
},
{
zigbeeModel: ["lumi.light.acn032"],
model: "CL-L02D",
vendor: "Aqara",
description: "Ceiling light T1M",
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await endpoint.read("manuSpecificLumi", [0x0515], {manufacturerCode});
await endpoint.read("manuSpecificLumi", [0x0516], {manufacturerCode});
await endpoint.read("genLevelCtrl", [0x0012], {});
await endpoint.read("genLevelCtrl", [0x0013], {});
},
extend: [
m.deviceEndpoints({endpoints: {white: 1, rgb: 2}}),
lumiLight({colorTemp: true, endpointNames: ["white"]}),
Expand All @@ -4373,6 +4382,10 @@ export const definitions: DefinitionWithExtend[] = [
description: "Controls the behavior when the device is powered on after power loss",
zigbeeCommandOptions: {manufacturerCode},
}),
lumi.lumiModernExtend.lumiDimmingRangeMin(),
lumi.lumiModernExtend.lumiDimmingRangeMax(),
lumi.lumiModernExtend.lumiOffOnDuration(),
lumi.lumiModernExtend.lumiOnOffDuration(),
],
},
{
Expand Down Expand Up @@ -4441,25 +4454,55 @@ export const definitions: DefinitionWithExtend[] = [
fingerprint: [{modelID: "lumi.light.agl001"}, {modelID: "lumi.light.agl002"}],
},
],
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await endpoint.read("manuSpecificLumi", [0x0528], {manufacturerCode});
await endpoint.read("manuSpecificLumi", [0x052c], {manufacturerCode});
await endpoint.read("manuSpecificLumi", [0x0515], {manufacturerCode});
await endpoint.read("manuSpecificLumi", [0x0516], {manufacturerCode});
await endpoint.read("genLevelCtrl", [0x0012], {});
await endpoint.read("genLevelCtrl", [0x0013], {});
},
extend: [
lumiLight({colorTemp: true, color: true, colorTempRange: [111, 500]}),
lumiPowerOnBehavior({lookup: {off: 0, on: 1, reverse: 2, restore: 3}}),
m.identify(),
m.forcePowerSource({powerSource: "Mains (single phase)"}),
lumiZigbeeOTA(),
lumi.lumiModernExtend.lumiDimmingRangeMin(),
lumi.lumiModernExtend.lumiDimmingRangeMax(),
lumi.lumiModernExtend.lumiOffOnDuration(),
lumi.lumiModernExtend.lumiOnOffDuration(),
lumi.lumiModernExtend.lumiTransitionCurveCurvature(),
lumi.lumiModernExtend.lumiTransitionInitialBrightness(),
],
},
{
zigbeeModel: ["lumi.light.agl004"],
model: "T2_E27_CCT",
vendor: "Aqara",
description: "E27 led bulb",
configure: async (device, coordinatorEndpoint) => {
const endpoint = device.getEndpoint(1);
await endpoint.read("manuSpecificLumi", [0x0528], {manufacturerCode});
await endpoint.read("manuSpecificLumi", [0x052c], {manufacturerCode});
await endpoint.read("manuSpecificLumi", [0x0515], {manufacturerCode});
await endpoint.read("manuSpecificLumi", [0x0516], {manufacturerCode});
await endpoint.read("genLevelCtrl", [0x0012], {});
await endpoint.read("genLevelCtrl", [0x0013], {});
},
extend: [
lumiLight({colorTemp: true, colorTempRange: [153, 370]}),
lumiPowerOnBehavior({lookup: {off: 0, on: 1, reverse: 2, restore: 3}}),
m.identify(),
m.forcePowerSource({powerSource: "Mains (single phase)"}),
lumiZigbeeOTA(),
lumi.lumiModernExtend.lumiDimmingRangeMin(),
lumi.lumiModernExtend.lumiDimmingRangeMax(),
lumi.lumiModernExtend.lumiOffOnDuration(),
lumi.lumiModernExtend.lumiOnOffDuration(),
lumi.lumiModernExtend.lumiTransitionCurveCurvature(),
lumi.lumiModernExtend.lumiTransitionInitialBrightness(),
],
},
{
Expand Down
83 changes: 83 additions & 0 deletions src/lib/lumi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1521,6 +1521,89 @@ export const lumiModernExtend = {

return result;
},
lumiDimmingRangeMin: (args?: Partial<modernExtend.NumericArgs<"manuSpecificLumi">>) =>
modernExtend.numeric({
name: "dimming_range_minimum",
cluster: "manuSpecificLumi",
attribute: {ID: 0x0515, type: 0x20},
description: "Minimum allowed dimming value",
zigbeeCommandOptions: {manufacturerCode},
unit: "%",
valueMin: 1,
valueMax: 99,
valueStep: 1,
entityCategory: "config",
...args,
}),
lumiDimmingRangeMax: (args?: Partial<modernExtend.NumericArgs<"manuSpecificLumi">>) =>
modernExtend.numeric({
name: "dimming_range_maximum",
cluster: "manuSpecificLumi",
attribute: {ID: 0x0516, type: 0x20},
description: "Maximum allowed dimming value",
zigbeeCommandOptions: {manufacturerCode},
unit: "%",
valueMin: 2,
valueMax: 100,
valueStep: 1,
entityCategory: "config",
...args,
}),
lumiOffOnDuration: (args?: Partial<modernExtend.NumericArgs<"genLevelCtrl">>) =>
modernExtend.numeric({
name: "off_on_duration",
cluster: "genLevelCtrl",
attribute: {ID: 0x0012, type: 0x21},
description: "Duration for light to gradually brighten when turning on",
unit: "s",
valueMin: 0,
valueMax: 10,
valueStep: 0.5,
scale: 10,
entityCategory: "config",
...args,
}),
lumiOnOffDuration: (args?: Partial<modernExtend.NumericArgs<"genLevelCtrl">>) =>
modernExtend.numeric({
name: "on_off_duration",
cluster: "genLevelCtrl",
attribute: {ID: 0x0013, type: 0x21},
description: "Duration for light to gradually dim when turning off",
unit: "s",
valueMin: 0,
valueMax: 10,
valueStep: 0.5,
scale: 10,
entityCategory: "config",
...args,
}),
lumiTransitionCurveCurvature: (args?: Partial<modernExtend.NumericArgs<"manuSpecificLumi">>) =>
modernExtend.numeric({
name: "transition_curve_curvature",
cluster: "manuSpecificLumi",
attribute: {ID: 0x0528, type: 0x39},
description: "Transition curve shape: 0.2-1 (fast to slow), 1 (uniform), 1-6 (slow to fast)",
zigbeeCommandOptions: {manufacturerCode},
valueMin: 0.2,
valueMax: 6,
valueStep: 0.01,
entityCategory: "config",
...args,
}),
lumiTransitionInitialBrightness: (args?: Partial<modernExtend.NumericArgs<"manuSpecificLumi">>) =>
modernExtend.numeric({
name: "transition_initial_brightness",
cluster: "manuSpecificLumi",
attribute: {ID: 0x052c, type: 0x20},
description: "Starting brightness level when light turns on before transition",
zigbeeCommandOptions: {manufacturerCode},
unit: "%",
valueMin: 0,
valueMax: 50,
valueStep: 1,
entityCategory: "config",
...args,
}),
lumiOnOff: (args?: modernExtend.OnOffArgs & {operationMode?: boolean; powerOutageMemory?: "binary" | "enum"; lockRelay?: boolean}) => {
// biome-ignore lint/style/noParameterAssign: ignored using `--suppress`
args = {operationMode: false, lockRelay: false, ...args};
Expand Down