Add new cli command 'command' to execute arbitrary commands (#692)

* Add new cli command 'command' to execute arbitrary commands

This deprecates 'raw-command', which requires positional argument for module,
in favor of new 'command' that accepts '--module' option for IOT devices.

* Pull block list to the module level
This commit is contained in:
Teemu R 2024-01-24 09:10:55 +01:00 committed by GitHub
parent 5907dc763a
commit 8b566757c3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 20 additions and 5 deletions

View File

@ -1,4 +1,5 @@
"""python-kasa cli tool.""" """python-kasa cli tool."""
import ast
import asyncio import asyncio
import json import json
import logging import logging
@ -69,6 +70,9 @@ DEVICE_FAMILY_TYPES = [
device_family_type.value for device_family_type in DeviceFamilyType device_family_type.value for device_family_type in DeviceFamilyType
] ]
# Block list of commands which require no update
SKIP_UPDATE_COMMANDS = ["wifi", "raw-command", "command"]
click.anyio_backend = "asyncio" click.anyio_backend = "asyncio"
pass_dev = click.make_pass_decorator(SmartDevice) pass_dev = click.make_pass_decorator(SmartDevice)
@ -339,8 +343,9 @@ async def cli(
credentials=credentials, credentials=credentials,
) )
# Skip update for wifi & raw-command, and if factory was used to connect # Skip update on specific commands, or if device factory,
if ctx.invoked_subcommand not in ["wifi", "raw-command"] and not device_family: # that performs an update was used for the device.
if ctx.invoked_subcommand not in SKIP_UPDATE_COMMANDS and not device_family:
await dev.update() await dev.update()
ctx.obj = dev ctx.obj = dev
@ -592,13 +597,23 @@ async def alias(dev, new_alias, index):
@cli.command() @cli.command()
@pass_dev @pass_dev
@click.pass_context
@click.argument("module") @click.argument("module")
@click.argument("command") @click.argument("command")
@click.argument("parameters", default=None, required=False) @click.argument("parameters", default=None, required=False)
async def raw_command(dev: SmartDevice, module, command, parameters): async def raw_command(ctx, dev: SmartDevice, module, command, parameters):
"""Run a raw command on the device.""" """Run a raw command on the device."""
import ast logging.warning("Deprecated, use 'kasa command --module %s %s'", module, command)
return await ctx.forward(cmd_command)
@cli.command(name="command")
@pass_dev
@click.option("--module", required=False, help="Module for IOT protocol.")
@click.argument("command")
@click.argument("parameters", default=None, required=False)
async def cmd_command(dev: SmartDevice, module, command, parameters):
"""Run a raw command on the device."""
if parameters is not None: if parameters is not None:
parameters = ast.literal_eval(parameters) parameters = ast.literal_eval(parameters)

View File

@ -63,7 +63,7 @@ class Emeter(Usage):
self, self,
data: List[Dict[str, Union[int, float]]], data: List[Dict[str, Union[int, float]]],
entry_key: str, entry_key: str,
kwh: bool=True, kwh: bool = True,
key: Optional[int] = None, key: Optional[int] = None,
) -> Dict[Union[int, float], Union[int, float]]: ) -> Dict[Union[int, float], Union[int, float]]:
"""Return emeter information keyed with the day/month. """Return emeter information keyed with the day/month.