Skip to content

Commit 985a318

Browse files
authored
implemented get_powermeters() (#80)
* implemented get_powermeters()
1 parent 3a9ce6e commit 985a318

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

e3dc/_e3dc.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
)
2323
from ._e3dc_rscp_web import E3DC_RSCP_web
2424
from ._rscpLib import rscpFindTag, rscpFindTagIndex
25+
from ._rscpTags import getPowermeterType
2526

2627
REMOTE_ADDRESS = "https://s10.e3dc.com/s10/phpcmd/cmd.php"
2728
REQUEST_INTERVAL_SEC = 10 # minimum interval between requests
@@ -1746,6 +1747,50 @@ def get_pvis_data(self, pvis=None, keepAlive=False):
17461747

17471748
return outObj
17481749

1750+
def get_powermeters(self, keepAlive=False):
1751+
"""Scans for installed power meters via rscp protocol locally.
1752+
1753+
Args:
1754+
keepAlive (Optional[bool]): True to keep connection alive
1755+
1756+
Returns:
1757+
dict: Dictionary containing the found powermeters as follows.::
1758+
1759+
"powermeters": [
1760+
{'index': 0, 'type': 1, 'typeName': 'PM_TYPE_ROOT'},
1761+
{'index': 1, 'type': 4, 'typeName': 'PM_TYPE_ADDITIONAL_CONSUMPTION'}
1762+
]
1763+
"""
1764+
maxPowermeters = 8
1765+
outObj = []
1766+
for pmIndex in range(
1767+
maxPowermeters
1768+
): # max 8 powermeters according to E3DC spec
1769+
res = self.sendRequest(
1770+
(
1771+
"PM_REQ_DATA",
1772+
"Container",
1773+
[
1774+
("PM_INDEX", "Uint16", pmIndex),
1775+
("PM_REQ_TYPE", "None", None),
1776+
],
1777+
),
1778+
keepAlive=True if pmIndex < (maxPowermeters - 1) else keepAlive,
1779+
)
1780+
1781+
pmType = rscpFindTagIndex(res, "PM_TYPE")
1782+
1783+
if pmType is not None:
1784+
outObj.append(
1785+
{
1786+
"index": pmIndex,
1787+
"type": pmType,
1788+
"typeName": getPowermeterType(pmType),
1789+
}
1790+
)
1791+
1792+
return outObj
1793+
17491794
def get_powermeter_data(self, pmIndex=None, keepAlive=False):
17501795
"""Polls the power meter data via rscp protocol locally.
17511796

e3dc/_rscpTags.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2101,6 +2101,18 @@ def getTag(tag_hex):
21012101
0xFFFFFFFF: "UNEXPECTED ERROR", # happens for example in get_db_data if time and span is invalid (not available)
21022102
}
21032103

2104+
powermeterTypes = {
2105+
0x00: "PM_TYPE_UNDEFINED",
2106+
0x01: "PM_TYPE_ROOT",
2107+
0x02: "PM_TYPE_ADDITIONAL",
2108+
0x03: "PM_TYPE_ADDITIONAL_PRODUCTION",
2109+
0x04: "PM_TYPE_ADDITIONAL_CONSUMPTION",
2110+
0x05: "PM_TYPE_FARM",
2111+
0x06: "PM_TYPE_UNUSED",
2112+
0x07: "PM_TYPE_WALLBOX",
2113+
0x08: "PM_TYPE_FARM_ADDITIONAL",
2114+
}
2115+
21042116

21052117
def getHexDatatype(type_str):
21062118
"""Get data type as hex.
@@ -2139,3 +2151,15 @@ def getErrorcode(error_hex):
21392151
str: String representation of the given error_hex
21402152
"""
21412153
return rscpErrorCodes[error_hex]
2154+
2155+
2156+
def getPowermeterType(powermetertype_hex):
2157+
"""Get powermeter type as string.
2158+
2159+
Attributes:
2160+
powermeterType_hex (int): type of the powermeter as hex
2161+
2162+
Returns:
2163+
str: String representation of the given powermeterType_hex
2164+
"""
2165+
return powermeterTypes[powermetertype_hex]

0 commit comments

Comments
 (0)