Compare commits

...

12 Commits

Author SHA1 Message Date
suaveolent
560cf5ef2b version bump 2024-09-13 11:14:47 +02:00
suaveolent
8d5a1b7130 update readme 2024-09-13 11:14:31 +02:00
suaveolent
1d77eccedf
Merge pull request #29 from suaveolent/meter
Add support for meters
2024-09-13 11:13:22 +02:00
suaveolent
d8dd357488 add support for meters 2024-09-13 11:10:03 +02:00
suaveolent
413886b8b0 add identify_meters call 2024-09-13 11:10:03 +02:00
suaveolent
c9aa65bf37 update readme 2024-09-13 11:10:03 +02:00
suaveolent
5bfecfdfc6 update readme 2024-09-13 11:10:03 +02:00
suaveolent
523b84132a version bump 2024-09-13 11:10:03 +02:00
suaveolent
1fae169c29 add local_addr parameter to allow to bind to specific interface 2024-09-13 11:10:03 +02:00
suaveolent
be21769efc fix as json for identitfy requests, fixes #19 2024-09-13 11:10:03 +02:00
suaveolent
d0c296b556 fixes #55 2024-09-13 11:10:03 +02:00
suaveolent
61470d3161 begin support for meter 2024-09-03 14:16:27 +02:00
4 changed files with 69 additions and 6 deletions

View File

@ -47,7 +47,8 @@ commands:
get-version-info,
heartbeat,
identify-dtu,
identify-inverters
identify-inverters,
identify-meters,
The `--as-json` option is optional and allows formatting the output as JSON.
```

View File

@ -20,6 +20,7 @@ from hoymiles_wifi.hoymiles import (
generate_version_string,
get_dtu_model_name,
get_inverter_model_name,
get_meter_model_name,
)
from hoymiles_wifi.protobuf import (
AppGetHistPower_pb2,
@ -294,6 +295,20 @@ async def async_identify_inverters(dtu: DTU) -> list[str]:
return inverter_models
async def async_identify_meters(dtu: DTU) -> list[str]:
"""Identify the meters asynchronously."""
meter_models = {}
real_data = await async_get_real_data_new(dtu)
if real_data:
for meter_model in real_data.meter_data:
serial_number = generate_inverter_serial_number(meter_model.serial_number)
meter_model = get_meter_model_name(serial_number)
meter_models[serial_number] = meter_model
return meter_models
async def async_get_alarm_list(dtu: DTU) -> None:
"""Get alarm list from the dtu asynchronously."""
@ -347,6 +362,7 @@ async def main() -> None:
"heartbeat",
"identify-dtu",
"identify-inverters",
"identify-meters",
"get-alarm-list",
],
help="Command to execute",
@ -374,6 +390,7 @@ async def main() -> None:
"heartbeat": async_heatbeat,
"identify-dtu": async_identify_dtu,
"identify-inverters": async_identify_inverters,
"identify-meters": async_identify_meters,
"get-alarm-list": async_get_alarm_list,
}
@ -390,6 +407,14 @@ async def main() -> None:
print(json.dumps(asdict(response), indent=4)) # noqa: T201
else:
print(f"{args.command.capitalize()} Response: \n{response}") # noqa: T201
else:
if args.as_json:
print( # noqa: T201
json.dumps(
{"error": f"No response for {args.command.replace('_', ' ')}"},
indent=4,
)
)
else:
print( # noqa: T201
f"No response or unable to retrieve response for "

View File

@ -117,6 +117,16 @@ type_mapping = {
}
class MeterType(Enum):
"""Meter type."""
DDSU666 = "DDSU666"
DTSU666 = "DTSU666"
meter_mapping = {0x10C0: MeterType.DDSU666}
def format_number(number: int) -> str:
"""Format number to two digits."""
@ -299,3 +309,30 @@ def get_dtu_model_name(serial_number: str) -> str:
return "Unknown"
else:
return dtu_type.value
def get_meter_model_type(serial_bytes: bytes) -> MeterType:
"""Get Meter model type."""
dtu_type_bytes = struct.unpack(">H", serial_bytes[:2])[0]
meter_type = meter_mapping.get(dtu_type_bytes)
if meter_type is None:
raise ValueError(f"Unknown Meter: {serial_bytes[:2]}!")
return meter_type
def get_meter_model_name(serial_number: str) -> str:
"""Get Meter model name."""
serial_bytes = bytes.fromhex(serial_number)
try:
meter_type = get_meter_model_type(serial_bytes)
except Exception as e:
logger.error(e)
return "Unknown"
else:
return meter_type.value

View File

@ -6,7 +6,7 @@ setup(
name="hoymiles-wifi",
packages=["hoymiles_wifi", "hoymiles_wifi.protobuf"],
install_requires=["protobuf", "crcmod"],
version="0.2.4",
version="0.2.5",
description="A python library for interfacing with the Hoymiles DTUs and the HMS-XXXXW-2T series of micro-inverters using protobuf messages.",
author="suaveolent",
include_package_data=True,