From 61470d3161bd23912920500a0665c45e4ba3acec Mon Sep 17 00:00:00 2001 From: suaveolent Date: Tue, 3 Sep 2024 14:16:27 +0200 Subject: [PATCH] begin support for meter --- hoymiles_wifi/hoymiles.py | 37 +++++++++++++++++++++++++++++++++++++ setup.py | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/hoymiles_wifi/hoymiles.py b/hoymiles_wifi/hoymiles.py index 6bbcffa..b31b564 100644 --- a/hoymiles_wifi/hoymiles.py +++ b/hoymiles_wifi/hoymiles.py @@ -120,6 +120,16 @@ type_mapping = { } +class MeterType(Enum): + """Meter type.""" + + DDSU666 = "DDSU666" + DTSU666 = "DTSU666" + + +meter_mapping = {0x1123: MeterType.DDSU666} + + def format_number(number: int) -> str: """Format number to two digits.""" @@ -302,3 +312,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 diff --git a/setup.py b/setup.py index c2ac861..5d31f3a 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ setup( name="hoymiles-wifi", packages=["hoymiles_wifi", "hoymiles_wifi.protobuf"], install_requires=["protobuf", "crcmod"], - version="0.2.2", + version="0.2.3", 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,