mirror of
https://github.com/suaveolent/hoymiles-wifi.git
synced 2024-09-20 03:10:11 +00:00
Compare commits
12 Commits
d87e990e48
...
560cf5ef2b
Author | SHA1 | Date | |
---|---|---|---|
|
560cf5ef2b | ||
|
8d5a1b7130 | ||
|
1d77eccedf | ||
|
d8dd357488 | ||
|
413886b8b0 | ||
|
c9aa65bf37 | ||
|
5bfecfdfc6 | ||
|
523b84132a | ||
|
1fae169c29 | ||
|
be21769efc | ||
|
d0c296b556 | ||
|
61470d3161 |
@ -47,7 +47,8 @@ commands:
|
|||||||
get-version-info,
|
get-version-info,
|
||||||
heartbeat,
|
heartbeat,
|
||||||
identify-dtu,
|
identify-dtu,
|
||||||
identify-inverters
|
identify-inverters,
|
||||||
|
identify-meters,
|
||||||
|
|
||||||
The `--as-json` option is optional and allows formatting the output as JSON.
|
The `--as-json` option is optional and allows formatting the output as JSON.
|
||||||
```
|
```
|
||||||
|
@ -20,6 +20,7 @@ from hoymiles_wifi.hoymiles import (
|
|||||||
generate_version_string,
|
generate_version_string,
|
||||||
get_dtu_model_name,
|
get_dtu_model_name,
|
||||||
get_inverter_model_name,
|
get_inverter_model_name,
|
||||||
|
get_meter_model_name,
|
||||||
)
|
)
|
||||||
from hoymiles_wifi.protobuf import (
|
from hoymiles_wifi.protobuf import (
|
||||||
AppGetHistPower_pb2,
|
AppGetHistPower_pb2,
|
||||||
@ -294,6 +295,20 @@ async def async_identify_inverters(dtu: DTU) -> list[str]:
|
|||||||
return inverter_models
|
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:
|
async def async_get_alarm_list(dtu: DTU) -> None:
|
||||||
"""Get alarm list from the dtu asynchronously."""
|
"""Get alarm list from the dtu asynchronously."""
|
||||||
|
|
||||||
@ -347,6 +362,7 @@ async def main() -> None:
|
|||||||
"heartbeat",
|
"heartbeat",
|
||||||
"identify-dtu",
|
"identify-dtu",
|
||||||
"identify-inverters",
|
"identify-inverters",
|
||||||
|
"identify-meters",
|
||||||
"get-alarm-list",
|
"get-alarm-list",
|
||||||
],
|
],
|
||||||
help="Command to execute",
|
help="Command to execute",
|
||||||
@ -374,6 +390,7 @@ async def main() -> None:
|
|||||||
"heartbeat": async_heatbeat,
|
"heartbeat": async_heatbeat,
|
||||||
"identify-dtu": async_identify_dtu,
|
"identify-dtu": async_identify_dtu,
|
||||||
"identify-inverters": async_identify_inverters,
|
"identify-inverters": async_identify_inverters,
|
||||||
|
"identify-meters": async_identify_meters,
|
||||||
"get-alarm-list": async_get_alarm_list,
|
"get-alarm-list": async_get_alarm_list,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,10 +408,18 @@ async def main() -> None:
|
|||||||
else:
|
else:
|
||||||
print(f"{args.command.capitalize()} Response: \n{response}") # noqa: T201
|
print(f"{args.command.capitalize()} Response: \n{response}") # noqa: T201
|
||||||
else:
|
else:
|
||||||
print( # noqa: T201
|
if args.as_json:
|
||||||
f"No response or unable to retrieve response for "
|
print( # noqa: T201
|
||||||
f"{args.command.replace('_', ' ')}",
|
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 "
|
||||||
|
f"{args.command.replace('_', ' ')}",
|
||||||
|
)
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
||||||
|
|
||||||
|
@ -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:
|
def format_number(number: int) -> str:
|
||||||
"""Format number to two digits."""
|
"""Format number to two digits."""
|
||||||
|
|
||||||
@ -299,3 +309,30 @@ def get_dtu_model_name(serial_number: str) -> str:
|
|||||||
return "Unknown"
|
return "Unknown"
|
||||||
else:
|
else:
|
||||||
return dtu_type.value
|
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
|
||||||
|
2
setup.py
2
setup.py
@ -6,7 +6,7 @@ setup(
|
|||||||
name="hoymiles-wifi",
|
name="hoymiles-wifi",
|
||||||
packages=["hoymiles_wifi", "hoymiles_wifi.protobuf"],
|
packages=["hoymiles_wifi", "hoymiles_wifi.protobuf"],
|
||||||
install_requires=["protobuf", "crcmod"],
|
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.",
|
description="A python library for interfacing with the Hoymiles DTUs and the HMS-XXXXW-2T series of micro-inverters using protobuf messages.",
|
||||||
author="suaveolent",
|
author="suaveolent",
|
||||||
include_package_data=True,
|
include_package_data=True,
|
||||||
|
Loading…
Reference in New Issue
Block a user