73 lines
2.1 KiB
Python
Executable file
73 lines
2.1 KiB
Python
Executable file
#!/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()
|
|
|