Improve emeterstatus API, move into own module (#205)

Adds the following properties to EmeterStatus for saner API:
* voltage (in V)
* power (in W)
* current (in A)
* total (in kWh)
This commit is contained in:
Teemu R
2021-09-23 17:58:19 +02:00
committed by GitHub
parent 47a1405bd2
commit 36c412a9c2
5 changed files with 88 additions and 53 deletions

View File

@@ -19,6 +19,7 @@ from datetime import datetime, timedelta
from enum import Enum, auto
from typing import Any, Dict, List, Optional
from .emeterstatus import EmeterStatus
from .exceptions import SmartDeviceException
from .protocol import TPLinkSmartHomeProtocol
@@ -50,48 +51,6 @@ class WifiNetwork:
rssi: Optional[int] = None
class EmeterStatus(dict):
"""Container for converting different representations of emeter data.
Newer FW/HW versions postfix the variable names with the used units,
where-as the olders do not have this feature.
This class automatically converts between these two to allow
backwards and forwards compatibility.
"""
def __getitem__(self, item):
valid_keys = [
"voltage_mv",
"power_mw",
"current_ma",
"energy_wh",
"total_wh",
"voltage",
"power",
"current",
"total",
"energy",
]
# 1. if requested data is available, return it
if item in super().keys():
return super().__getitem__(item)
# otherwise decide how to convert it
else:
if item not in valid_keys:
raise KeyError(item)
if "_" in item: # upscale
return super().__getitem__(item[: item.find("_")]) * 1000
else: # downscale
for i in super().keys():
if i.startswith(item):
return self.__getitem__(i) / 1000
_LOGGER.debug(f"Unable to find value for '{item}'")
return None
def requires_update(f):
"""Indicate that `update` should be called before accessing this method.""" # noqa: D202
if inspect.iscoroutinefunction(f):
@@ -202,7 +161,7 @@ class SmartDevice:
>>> dev.has_emeter
True
>>> dev.emeter_realtime
{'current': 0.015342, 'err_code': 0, 'power': 0.983971, 'total': 32.448, 'voltage': 235.595234}
<EmeterStatus power=0.983971 voltage=235.595234 current=0.015342 total=32.448>
>>> dev.emeter_today
>>> dev.emeter_this_month