"""Provide utilities for reading prostar solar panels.""" from utilities import int_to_float16 from Channel import ModbusChannel def charge_state(inp_state): """Map function for charge state.""" states = { 0: "Start", 1: "Night Check", 2: "Disconnect", 3: "Night", 4: "Fault", 5: "Bulk", 6: "Absorption", 7: "Float", 8: "Equalize" } if inp_state in range(0, 9): return states[inp_state] else: return inp_state def array_faults(inp_array_faults): """Form a string for the array_faults.""" fault_string = "" faults = { 0: "Overcurrent Phase 1", 1: "FETs Shorted", 2: "Software Bug", 3: "Battery HVD (High Voltage Disconnect)", 4: "Array HVD (High Voltage Disconnect)", 5: "EEPROM Setting Edit (reset required)", 6: "RTS Shorted", 7: "RTS was valid now disconnected", 8: "Local temp. sensor failed", 9: "Battery LVD (Low Voltage Disconect)", 10: "DIP Switch Changed (excl. DIP 8)", 11: "Processor Supply Fault" } bit_string = ("0" * 16 + "{0:b}".format(inp_array_faults))[-16:] for i in range(0, 12): if int(bit_string[i]) == 1: fault_string += faults[i] + ", " if fault_string: return fault_string[:-2] else: return "None" CHANNELS = [ ModbusChannel("adc_ia", 17, "REAL", 0.5, 3600, transformFn=int_to_float16), ModbusChannel("adc_vbterm", 18, "REAL", 0.5, 3600, transformFn=int_to_float16), ModbusChannel("adc_va", 19, "REAL", 0.5, 3600, transformFn=int_to_float16), ModbusChannel("adc_vl", 20, "REAL", 0.5, 3600, transformFn=int_to_float16), ModbusChannel("adc_il", 22, "REAL", 0.5, 3600, transformFn=int_to_float16), ModbusChannel("t_amb", 28, "REAL", 2.0, 3600, transformFn=int_to_float16), ModbusChannel("vb_min_daily", 65, "REAL", 2.0, 3600, transformFn=int_to_float16), ModbusChannel("vb_max_daily", 66, "REAL", 2.0, 3600, transformFn=int_to_float16), ModbusChannel('charge_state', 33, "STRING", 1, 3600, transformFn=charge_state), ModbusChannel('array_fault', 34, "STRING", 1, 3600, transformFn=array_faults) ] NODEADDRESS = 21 # Default node address BAUDRATE = 9600 # Default Baud Rate