45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
import argparse
|
|
|
|
from hopi.data_handler import PowerMeterDataHandler
|
|
from hopi.serial_client import ModbusRtuSerialClient, SerialConfig
|
|
|
|
|
|
SLAVE_ID = 1
|
|
START_REG = 0
|
|
NUM_WORDS = 20
|
|
READ_MAX_BYTES = 5 + (2 * NUM_WORDS)
|
|
|
|
|
|
def build_arg_parser() -> argparse.ArgumentParser:
|
|
parser = argparse.ArgumentParser(description="Read and print power meter values over Modbus RTU.")
|
|
parser.add_argument("--port", default="/dev/ttyUSB0")
|
|
parser.add_argument("--baud", type=int, default=9600)
|
|
parser.add_argument("--timeout", type=float, default=0.1)
|
|
return parser
|
|
|
|
|
|
def main() -> None:
|
|
args = build_arg_parser().parse_args()
|
|
|
|
config = SerialConfig(port=args.port, baudrate=args.baud, timeout=args.timeout)
|
|
client = ModbusRtuSerialClient(config)
|
|
handler = PowerMeterDataHandler()
|
|
|
|
with client:
|
|
response = client.read_holding_registers(
|
|
slave_id=SLAVE_ID,
|
|
start_register=START_REG,
|
|
register_count=NUM_WORDS,
|
|
read_max_bytes=READ_MAX_BYTES,
|
|
exact_response_length=True,
|
|
)
|
|
|
|
registers = handler.parse_read_holding_registers_response(response)
|
|
readings = handler.decode_readings(registers)
|
|
|
|
handler.print_readings_json(readings)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|