From b251e8736bf397c9f6528ad70c4946b21431a17c Mon Sep 17 00:00:00 2001 From: slugzero <2014249+slugzero@users.noreply.github.com> Date: Sun, 5 May 2024 20:22:27 +0200 Subject: [PATCH] feat: Add `colorloop` effect for color lights (#7479) * Add colorloop to light effect expose * Adapt colorloop speed according to transition parameter * add separate key stop_colorloop --- src/converters/toZigbee.ts | 13 +++++++++++-- src/lib/modernExtend.ts | 6 +++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/converters/toZigbee.ts b/src/converters/toZigbee.ts index 4ce22213f6b1c..50f75e5ea3d7a 100644 --- a/src/converters/toZigbee.ts +++ b/src/converters/toZigbee.ts @@ -1242,8 +1242,17 @@ const converters2 = { utils.assertString(value, key); const lookup = {blink: 0, breathe: 1, okay: 2, channel_change: 11, finish_effect: 254, stop_effect: 255}; value = value.toLowerCase(); - const payload = {effectid: utils.getFromLookup(value, lookup), effectvariant: 0}; - await entity.command('genIdentify', 'triggerEffect', payload, utils.getOptions(meta.mapped, entity)); + if (value === 'colorloop') { + const transition = meta.message.transition ?? 15; + utils.assertNumber(transition, 'transition'); + const speed = Math.min(255, Math.max(1, Math.round(255 / transition))); + converters2.light_hue_saturation_move.convertSet(entity, 'hue_move', speed, meta); + } else if (value === 'stop_colorloop') { + converters2.light_hue_saturation_move.convertSet(entity, 'hue_move', 'stop', meta); + } else { + const payload = {effectid: utils.getFromLookup(value, lookup), effectvariant: 0}; + await entity.command('genIdentify', 'triggerEffect', payload, utils.getOptions(meta.mapped, entity)); + } } else if (key === 'alert' || key === 'flash') { // Deprecated let effectid = 0; const lookup = {'select': 0x00, 'lselect': 0x01, 'none': 0xFF}; diff --git a/src/lib/modernExtend.ts b/src/lib/modernExtend.ts index b097adc36157d..20a5cdbaba0eb 100644 --- a/src/lib/modernExtend.ts +++ b/src/lib/modernExtend.ts @@ -879,7 +879,11 @@ export function light(args?: LightArgs): ModernExtend { const exposes: Expose[] = lightExpose; if (args.effect) { - exposes.push(e.effect()); + const effects = e.effect(); + if (args.color) { + effects.values.push('colorloop', 'stop_colorloop'); + } + exposes.push(effects); toZigbee.push(tz.effect); }