mirror of
https://github.com/python-kasa/python-kasa.git
synced 2024-12-22 19:23:34 +00:00
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:
parent
5907dc763a
commit
8b566757c3
23
kasa/cli.py
23
kasa/cli.py
@ -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)
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user