#!/usr/bin/env python3 """ This is meant to take the fronius provided spreadsheet and munge it into a list of FroniusRegisters and ScaledFroniusRegisters """ import pandas import argparse from pathlib import Path def main(): parser = argparse.ArgumentParser( prog="create_from_spreadsheet", description="Generate python registers from the given spreadsheet") parser.add_argument('filename') parser.add_argument('-o', '--output') args = parser.parse_args() input_file = Path(args.filename) if args.output is None: output_file = Path("./" + input_file.stem.lower() + ".py") else: output_file = Path(args.output) input_df = pandas.read_excel(open(input_file, 'rb'), header=0, skiprows=2) # Coerce 'Start' strings to ints so we can sort input_df = input_df[input_df["Start"].apply(lambda x: isinstance(x, (int)))] # sort on Start register input_df = input_df.sort_values(["Start"]) with open(output_file, 'w') as f: f.write("from pyfroniusreg import froniusreg\n\n") # Output the direct registers for index, row in input_df.iterrows(): if row["Type"] == "string": data_type = f'string{row["Size"]}' else: data_type = row["Type"] # TODO: determine proper way of defining the modbus unit modbus_unit = 1 f.write('%s = froniusreg.FroniusReg(%d, froniusreg.%s, %d, """%s""")\n' % (row["Name"].replace('/', '_'), row["Start"], data_type, modbus_unit, row["Description"])) # output the scaled registers for index, row in input_df.iterrows(): if not pandas.isna(row["Scale Factor"]): f.write("scaled%s = froniusreg.ScaledFroniusReg(%s, %s)\n" % ( row["Name"].replace('/', '_'), row["Name"].replace('/', '_'), row["Scale Factor"])) if __name__ == '__main__': main()