8000 Update cli modify presets to support smart devices (#1295) · python-kasa/python-kasa@879aca7 · GitHub
[go: up one dir, main page]

Skip to content

Commit 879aca7

Browse files
authored
Update cli modify presets to support smart devices (#1295)
1 parent dab64e5 commit 879aca7

File tree

2 files changed

+78
-18
lines changed

2 files changed

+78
-18
lines changed

kasa/cli/light.py

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -127,46 +127,60 @@ async def presets(ctx, dev):
127127
def presets_list(dev: Device):
128128
"""List presets."""
129129
if not (light_preset := dev.modules.get(Module.LightPreset)):
130-
error("Presets not supported o 8000 n device")
130+
error("Device does not support light presets")
131131
return
132132

133133
for idx, preset in enumerate(light_preset.preset_states_list):
134134
echo(
135-
f"[{idx}] Hue: {preset.hue:3} Saturation: {preset.saturation:3} "
136-
f"Brightness/Value: {preset.brightness:3} Temp: {preset.color_temp:4}"
135+
f"[{idx}] Hue: {preset.hue or '':3} "
136+
f"Saturation: {preset.saturation or '':3} "
137+
f"Brightness/Value: {preset.brightness or '':3} "
138+
f"Temp: {preset.color_temp or '':4}"
137139
)
138140

139141
return light_preset.preset_states_list
140142

141143

142144
@presets.command(name="modify")
143145
@click.argument("index", type=int)
144-
@click.option("--brightness", type=int)
145-
@click.option("--hue", type=int)
146-
@click.option("--saturation", type=int)
147-
@click.option("--temperature", type=int)
146+
@click.option("--brightness", type=int, required=False, default=None)
147+
@click.option("--hue", type=int, required=False, default=None)
148+
@click.option("--saturation", type=int, required=False, default=None)
149+
@click.option("--temperature", type=int, required=False, default=None)
148150
@pass_dev_or_child
149151
async def presets_modify(dev: Device, index, brightness, hue, saturation, temperature):
150152
"""Modify a preset."""
151-
for preset in dev.presets:
152-
if preset.index == index:
153-
break
154-
else:
155-
error(f"No preset found for index {index}")
153+
if not (light_preset := dev.modules.get(Module.LightPreset)):
154+
error("Device does not support light presets")
155+
return
156+
157+
max_index = len(light_preset.preset_states_list) - 1
158+
if index > len(light_preset.preset_states_list) - 1:
159+
error(f"Invalid index, must be between 0 and {max_index}")
156160
return
157161

158-
if brightness is not None:
162+
if all([val is None for val in {brightness, hue, saturation, temperature}]):
163+
error("Need to supply at least one option to modify.")
164+
return
165+
166+
# Preset names have `Not set`` as the first value
167+
preset_name = light_preset.preset_list[index + 1]
168+
preset = light_preset.preset_states_list[index]
169+
170+
echo(f"Preset {preset_name} currently: {preset}")
171+
172+
if brightness is not None and preset.brightness is not None:
159173
preset.brightness = brightness
160-
if hue is not None:
174+
if hue is not None and preset.hue is not None:
161175
preset.hue = hue
162-
if saturation is not None:
176+
if saturation is not None and preset.saturation is not None:
163177
preset.saturation = saturation
164-
if temperature is not None:
178+
if temperature is not None and preset.temperature is not None:
165179
preset.color_temp = temperature
166180

167-
echo(f"Going to save preset: {preset}")
181+
echo(f"Updating preset {preset_name} to: {preset}")
168182

169-
return await dev.save_preset(preset)
183+
return await light_preset.save_preset(preset_name, preset)
170184

171185

172186
@light.command()

tests/test_cli.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
brightness,
3535
effect,
3636
hsv,
37+
presets,
38+
presets_modify,
3739
temperature,
3840
)
3941
from kasa.cli.main import TYPES, _legacy_type_to_class, cli, cmd_command, raw_command
@@ -575,6 +577,50 @@ async def test_light_effect(dev: Device, runner: CliRunner):
575577
assert res.exit_code == 2
576578

577579

580+
async def test_light_preset(dev: Device, runner: CliRunner):
581+
res = await runner.invoke(presets, obj=dev)
582+
if not (light_preset := dev.modules.get(Module.LightPreset)):
583+
assert "Device does not support light presets" in res.output
584+
return
585+
586+
if len(light_preset.preset_states_list) == 0:
587+
pytest.skip(
588+
"Some fixtures do not have presets and"
589+
" the api doesn'tsupport creating them"
590+
)
591+
# Start off with a known state
592+
first_name = light_preset.preset_list[1]
593+
await light_preset.set_preset(first_name)
594+
await dev.update()
595+
assert light_preset.preset == first_name
596+
597+
res = await runner.invoke(presets, obj=dev)
598+
assert "Brightness" in res.output
599+
assert res.exit_code == 0
600+
601+
res = await runner.invoke(
602+
presets_modify,
603+
[
604+
"0",
605+
"--brightness",
606+
"12",
607+
],
608+
obj=dev,
609+
)
610+
await dev.update()
611+
assert light_preset.preset_states_list[0].brightness == 12
612+
613+
res = await runner.invoke(
614+
presets_modify,
615+
[
616+
"0",
617+
],
618+
obj=dev,
619+
)
620+
await dev.update()
621+
assert "Need to supply at least one option to modify." in res.output
622+
623+
578624
async def test_led(dev: Device, runner: CliRunner):
579625
res = await runner.invoke(led, obj=dev)
580626
if not (led_module := dev.modules.get(Module.Led)):

0 commit comments

Comments
 (0)
0