Skip to content

Commit 85162a2

Browse files
authored
Add state command to CLI (#2042)
1 parent a830441 commit 85162a2

3 files changed

Lines changed: 114 additions & 0 deletions

File tree

src/wled/cli/__init__.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,85 @@ async def command_reset(
310310
console.print("[green]WLED device has been rebooted!")
311311

312312

313+
@cli.command("state")
314+
async def command_state(
315+
host: Annotated[
316+
str,
317+
typer.Option(
318+
help="WLED device IP address or hostname",
319+
prompt="Host address",
320+
show_default=False,
321+
),
322+
],
323+
) -> None:
324+
"""Show the current state of the WLED device."""
325+
with console.status("[cyan]Fetching WLED device state...", spinner="toggle12"):
326+
async with WLED(host) as led:
327+
device = await led.update()
328+
329+
state = device.state
330+
331+
state_table = Table(title="\nWLED device state", show_header=False)
332+
state_table.add_column("Property", style="cyan bold")
333+
state_table.add_column("Value", style="green")
334+
335+
state_table.add_row("Power", "On" if state.on else "Off")
336+
state_table.add_row("Brightness", str(state.brightness))
337+
state_table.add_row("Transition", str(state.transition))
338+
339+
if state.preset_id is not None and device.presets:
340+
preset = device.presets.get(state.preset_id)
341+
state_table.add_row(
342+
"Preset", f"{preset.name} (#{state.preset_id})" if preset else "Unknown"
343+
)
344+
345+
if state.playlist_id is not None and device.playlists:
346+
playlist = device.playlists.get(state.playlist_id)
347+
state_table.add_row(
348+
"Playlist",
349+
f"{playlist.name} (#{state.playlist_id})" if playlist else "Unknown",
350+
)
351+
352+
state_table.add_row("Nightlight", "On" if state.nightlight.on else "Off")
353+
state_table.add_row(
354+
"Live override", state.live_data_override.name.replace("_", " ").title()
355+
)
356+
357+
console.print(state_table)
358+
359+
seg_table = Table(title="\nSegments", show_lines=True)
360+
seg_table.add_column("ID", style="cyan bold")
361+
seg_table.add_column("Name")
362+
seg_table.add_column("Power")
363+
seg_table.add_column("Brightness")
364+
seg_table.add_column("Effect")
365+
seg_table.add_column("Palette")
366+
seg_table.add_column("Range")
367+
368+
for seg in state.segments.values():
369+
effect = (
370+
device.effects.get(seg.effect_id)
371+
if isinstance(seg.effect_id, int)
372+
else None
373+
)
374+
palette = (
375+
device.palettes.get(seg.palette_id)
376+
if isinstance(seg.palette_id, int)
377+
else None
378+
)
379+
seg_table.add_row(
380+
str(seg.segment_id),
381+
seg.name or "",
382+
"On" if seg.on else "Off",
383+
str(seg.brightness),
384+
effect.name if effect else str(seg.effect_id),
385+
palette.name if palette else str(seg.palette_id),
386+
f"{seg.start}-{seg.stop}",
387+
)
388+
389+
console.print(seg_table)
390+
391+
313392
@cli.command("upgrade")
314393
async def command_upgrade(
315394
host: Annotated[

tests/__snapshots__/test_cli.ambr

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
]),
2424
'scan': list([
2525
]),
26+
'state': list([
27+
'host',
28+
]),
2629
'upgrade': list([
2730
'host',
2831
'version',
@@ -281,6 +284,27 @@
281284
└───────────┴─────────────┘
282285
'''
283286
# ---
287+
# name: test_state_command
288+
'''
289+
290+
WLED device state
291+
┌───────────────┬─────┐
292+
│ Power │ On │
293+
│ Brightness │ 128 │
294+
│ Transition │ 7 │
295+
│ Nightlight │ Off │
296+
│ Live override │ Off │
297+
└───────────────┴─────┘
298+
299+
Segments
300+
┏━━━━┳━━━━━━┳━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━┳━━━━━━━┓
301+
┃ ID ┃ Name ┃ Power ┃ Brightness ┃ Effect ┃ Palette ┃ Range ┃
302+
┡━━━━╇━━━━━━╇━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━╇━━━━━━━┩
303+
│ 0 │ │ On │ 255 │ Solid │ Default │ 0-30 │
304+
└────┴──────┴───────┴────────────┴────────┴─────────┴───────┘
305+
306+
'''
307+
# ---
284308
# name: test_unsupported_version_error_handler
285309
'''
286310
╭────────────────────── Unsupported version ───────────────────────╮

tests/test_cli.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,17 @@ def test_reset_command(
383383
mock.return_value.reset.assert_awaited_once()
384384

385385

386+
@pytest.mark.usefixtures("stable_terminal")
387+
def test_state_command(
388+
runner: CliRunner,
389+
snapshot: SnapshotAssertion,
390+
) -> None:
391+
"""State command shows device state and segments."""
392+
exit_code, output = _invoke(runner, ["state", "--host", "example.com"])
393+
assert exit_code == 0
394+
assert output == snapshot
395+
396+
386397
@pytest.mark.usefixtures("stable_terminal")
387398
def test_upgrade_command(
388399
runner: CliRunner,

0 commit comments

Comments
 (0)