8000 Update cli energy command to use energy module (#1252) · python-kasa/python-kasa@157ad8e · GitHub
[go: up one dir, main page]

Skip to content

Commit 157ad8e

Browse files
authored
Update cli energy command to use energy module (#1252)
1 parent 9efe871 commit 157ad8e

File tree

2 files changed

+25
-27
lines changed

2 files changed

+25
-27
lines changed

kasa/cli/usage.py

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@
99

1010
from kasa import (
1111
Device,
12+
Module,
1213
)
13-
from kasa.iot import (
14-
IotDevice,
15-
)
16-
from kasa.iot.iotstrip import IotStripPlug
14+
from kasa.interfaces import Energy
1715
from kasa.iot.modules import Usage
1816

1917
from .common import (
@@ -49,42 +47,39 @@ async def energy(dev: Device, year, month, erase):
4947
Daily and monthly data provided in CSV format.
5048
"""
5149
echo("[bold]== Emeter ==[/bold]")
52-
if not dev.has_emeter:
53-
error("Device has no emeter")
50+
if not (energy := dev.modules.get(Module.Energy)):
51+
error("Device has no energy module.")
5452
return
5553

56-
if (year or month or erase) and not isinstance(dev, IotDevice):
57-
error("Device has no historical statistics")
54+
if (year or month or erase) and not energy.supports(
55+
Energy.ModuleFeature.PERIODIC_STATS
56+
):
57+
error("Device does not support historical statistics")
5858
return
59-
else:
60-
dev = cast(IotDevice, dev)
6159

6260
if erase:
6361
echo("Erasing emeter statistics..")
64-
return await dev.erase_emeter_stats()
62+
return await energy.erase_stats()
6563

6664
if year:
6765
echo(f"== For year {year.year} ==")
6866
echo("Month, usage (kWh)")
69-
usage_data = await dev.get_emeter_monthly(year=year.year)
67+
usage_data = await energy.get_monthly_stats(year=year.year)
7068
elif month:
7169
echo(f"== For month {month.month} of {month.year} ==")
7270
echo("Day, usage (kWh)")
73-
usage_data = await dev.get_emeter_daily(year=month.year, month=month.month)
71+
usage_data = await energy.get_daily_stats(year=month.year, month=month.month)
7472
else:
7573
# Call with no argument outputs summary data and returns
76-
if isinstance(dev, IotStripPlug):
77-
emeter_status = await dev.get_emeter_realtime()
78-
else:
79-
emeter_status = dev.emeter_realtime
74+
emeter_status = await energy.get_status()
8075

8176
echo("Current: {} A".format(emeter_status["current"]))
8277
echo("Voltage: {} V".format(emeter_status["voltage"]))
8378
echo("Power: {} W".format(emeter_status["power"]))
8479
echo("Total consumption: {} kWh".format(emeter_status["total"]))
8580

86-
echo(f"Today: {dev.emeter_today} kWh")
87-
echo(f"This month: {dev.emeter_this_month} kWh")
81+
echo(f"Today: {energy.consumption_today} kWh")
82+
echo(f"This month: {energy.consumption_this_month} kWh")
8883

8984
return emeter_status
9085

tests/test_cli.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
Credentials,
1616
Device,
1717
DeviceError,
18+
DeviceType,
1819
EmeterStatus,
1920
KasaException,
2021
Module,
@@ -424,20 +425,22 @@ async def test_time_set(dev: Device, mocker, runner):
424425

425426
async def test_emeter(dev: Device, mocker, runner):
426427
res = await runner.invoke(emeter, obj=dev)
427-
if not dev.has_emeter:
428-
assert "Device has no emeter" in res.output
428+
if not (energy := dev.modules.get(Module.Energy)):
429+
assert "Device has no energy module." in res.output
429430
return
430431

431432
assert "== Emeter ==" in res.output
432433

433-
if not dev.is_strip:
434+
if dev.device_type is not DeviceType.Strip:
434435
res = await runner.invoke(emeter, ["--index", "0"], obj=dev)
435436
assert f"Device: {dev.host} does not have children" in res.output
436437
res = await runner.invoke(emeter, ["--name", "mock"], obj=dev)
437438
assert f"Device: {dev.host} does not have children" in res.output
438439

439-
if dev.is_strip and len(dev.children) > 0:
440-
realtime_emeter = mocker.patch.object(dev.children[0], "get_emeter_realtime")
440+
if dev.device_type is DeviceType.Strip and len(dev.children) > 0:
441+
child_energy = dev.children[0].modules.get(Module.Energy)
442+
assert child_energy
443+
realtime_emeter = mocker.patch.object(child_energy, "get_status")
441444
realtime_emeter.return_value = EmeterStatus({"voltage_mv": 122066})
442445

443446
res = await runner.invoke(emeter, ["--index", "0"], obj=dev)
@@ -450,18 +453,18 @@ async def test_emeter(dev: Device, mocker, runner):
450453
assert realtime_emeter.call_count == 2
451454

452455
if isinstance(dev, IotDevice):
453-
monthly = mocker.patch.object(dev, "get_emeter_monthly")
456+
monthly = mocker.patch.object(energy, "get_monthly_stats")
454457
monthly.return_value = {1: 1234}
455458
res = await runner.invoke(emeter, ["--year", "1900"], obj=dev)
456459
if not isinstance(dev, IotDevice):
457-
assert "Device has no historical statistics" in res.output
460+
assert "Device does not support historical statistics" in res.output
458461
return
459462
assert "For year" in res.output
460463
assert "1, 1234" in res.output
461464
monthly.assert_called_with(year=1900)
462465

463466
if isinstance(dev, IotDevice):
464-
daily = mocker.patch.object(dev, "get_emeter_daily")
467+
daily = mocker.patch.object(energy, "get_daily_stats")
465468
daily.return_value = {1: 1234}
466469
res = await runner.invoke(emeter, ["--month", "1900-12"], obj=dev)
467470
if not isinstance(dev, IotDevice):

0 commit comments

Comments
 (0)
0