This commit is contained in:
2023-12-11 17:40:10 +01:00
parent f67e794931
commit d9f947a5f4
3 changed files with 441 additions and 0 deletions

105
definitions.py Normal file
View File

@@ -0,0 +1,105 @@
"""Sunsynk hybrid inverter sensor definitions."""
CELSIUS = "C"
KWH = "kWh"
AMPS = "A"
VOLT = "V"
WATT = "W"
_SENSORS = []
##########
# Battery
##########
#################
# Inverter Power
#################
#############
# Grid Power
#############
#_SENSORS += (
# (169, "Grid power", WATT, -1), # L1(167) + L2(168)
# (167, "Grid LD power", WATT, -1), # L1 seems to be LD
# (168, "Grid L2 power", WATT, -1),
# (150, "Grid voltage", VOLT, 0.1),
# (598, "Grid voltage L1", VOLT, 0.1),
# (599, "Grid voltage L2", VOLT, 0.1),
# (600, "Grid voltage L3", VOLT, 0.1),
# ((160, 161), "Grid current", AMPS, (0.01, 0.01)),
# (172, "Grid CT power", WATT, -1),
#)
#############
# Load Power
#############
################
# Solar Power 1
################
################
# Solar Power 2
################
###################
# Power on Outputs
###################
_SENSORS += (
(609, "Grid frequency", "Hz", 0.01),
(640, "UPS Load Power L1", "W", 1),
(641, "UPS Load Power L2", "W", 1),
(642, "UPS Load Power L3", "W", 1),
(643, "UPS Load Power Total", "W", 1),
(644, "Load Voltage L1", "V", 1),
(645, "Load Voltage L2", "V", 1),
(646, "Load Voltage L3", "V", 1),
(650, "Load Power L1", "W", 1),
(651, "Load Power L2", "W", 1),
(652, "Load Power L3", "W", 1),
(653, "Load Power Total", "W", 1),
(654, "Load Power Appearent", "W", 1),
(655, "Load Frequency", "Hz", 1),
(661, "Gen Port Voltage L1", "V", 1),
(662, "Gen Port Voltage L1", "V", 1),
(663, "Gen Port Voltage L1", "V", 1),
(664, "Gen Port Power L1", "W", 1),
(665, "Gen Port Power L2", "W", 1),
(666, "Gen Port Power L3", "W", 1),
(667, "Gen Port Power Total", "W", 1),
(133, "Gen Port Usage ", "", 1),
(134, "Smart Load Off Bat Voltage ", "V", 1),
(135, "Smart Load Off Bat SOC ", "V", 1),
(136, "Smart Load On Bat Voltage ", "V", 1),
(137, "Smart Load On Bat SOC ", "V", 1),
(552, "AC Relay State ", "", 1),
(604, "InnerGrid Power L1 ", "", 1),
(605, "InnerGrid Power L2 ", "", 1),
(606, "InnerGrid Power L3 ", "", 1),
(607, "Act Power Side To Side ", "", 1),
(616, "Out-Of-Grid Power L1 ", "W", 1),
(617, "Out-Of-Grid Power L2 ", "W", 1),
(618, "Out-Of-Grid Power L3 ", "W", 1),
(619, "Out-Of-Grid Power Total ", "W", 1),
(622, "Grid-Side Power L1 ", "W", 1),
(623, "Grid-Side Power L2 ", "W", 1),
(624, "Grid-Side Power L3 ", "W", 1),
(625, "Grid-Side Power Total ", "W", 1),
(633, "Inv Output Power L1 ", "W", 1),
(634, "Inv Output Power L2 ", "W", 1),
(635, "Inv Output Power L3 ", "W", 1),
(636, "Inv Output Power Total ", "W", 1),
)
###################
# Energy
###################
##########
# General
##########
###########
# Settings
###########

300
definitions.save Normal file
View File

@@ -0,0 +1,300 @@
"""Sunsynk hybrid inverter sensor definitions."""
CELSIUS = "°C"
KWH = "kWh"
AMPS = "A"
VOLT = "V"
WATT = "W"
_SENSORS = []
##########
# Battery
##########
_SENSORS += (
(182, "Battery temperature", CELSIUS, 0.1),
(183, "Battery voltage", VOLT, 0.01),
(184, "Battery SOC", "%"),
(190, "Battery power", WATT, -1),
(191, "Battery current", AMPS, -0.01),
)
#################
# Inverter Power
#################
_SENSORS += (
(175, "Inverter power", WATT, -1),
(154, "Inverter voltage", VOLT, 0.1),
(193, "Inverter frequency", "Hz", 0.01),
)
#############
# Grid Power
#############
_SENSORS += (
(609, "Grid frequency", "Hz", 0.01),
(169, "Grid power", WATT, -1), # L1(167) + L2(168)
(167, "Grid LD power", WATT, -1), # L1 seems to be LD
(168, "Grid L2 power", WATT, -1),
(150, "Grid voltage", VOLT, 0.1),
(598, "Grid voltage L1", VOLT, 0.1),
(599, "Grid voltage L2", VOLT, 0.1),
(600, "Grid voltage L3", VOLT, 0.1),
((160, 161), "Grid current", AMPS, (0.01, 0.01)),
(172, "Grid CT power", WATT, -1),
)
#############
# Load Power
#############
_SENSORS += (
(178, "Load power", WATT, -1), # L1(176) + L2(177)
(176, "Load L1 power", WATT, -1),
(177, "Load L2 power", WATT, -1),
)
################
# Solar Power 1
################
_SENSORS += (
(186, "PV1 power", WATT, -1),
(109, "PV1 voltage", VOLT, 0.1),
(110, "PV1 current", AMPS, 0.1),
)
################
# Solar Power 2
################
_SENSORS += (
(187, "PV2 power", WATT, -1),
(111, "PV2 voltage", VOLT, 0.1),
(112, "PV2 current", AMPS, 0.1),
)
###################
# Power on Outputs
###################
_SENSORS += (
(166, "AUX power", WATT, -1),
(175, "Essential power 1", WATT, (1, 1, -1)),
(167, "Essential power 1", WATT, (1, 1, -1)),
(166, "Essential power 1", WATT, (1, 1, -1)),
(172, "Non-Essential power", WATT, (1, -1)),
(167, "Non-Essential power", WATT, (1, -1)),
)
###################
# Energy
###################
_SENSORS += (
(60, "Day Active Energy", KWH, -0.1),
(70, "Day Battery Charge", KWH, 0.1),
(71, "Day Battery discharge", KWH, 0.1),
(77, "Day Grid Export", KWH, 0.1),
(76, "Day Grid Import", KWH, 0.1),
# Sensor (200, "Day Load Power", KWH, 0.01),
(84, "Day Load Energy", KWH, 0.1),
(108, "Day PV Energy", KWH, 0.1),
(61, "Day Reactive Energy", "kVarh", -0.1),
# Sensor ((201, 202), "History Load Power", KWH, 0.1),
(67, "Month Grid Energy", KWH, 0.1),
(66, "Month Load Energy", KWH, 0.1),
(65, "Month PV Energy", KWH, 0.1),
((63, 64), "Total Active Energy", KWH, 0.1), # signed?
((72, 73), "Total Battery Charge", KWH, 0.1),
((74, 75), "Total Battery Discharge", KWH, 0.1),
((81, 82), "Total Grid Export", KWH, 0.1),
((78, 80), "Total Grid Import", KWH, 0.1),
((85, 86), "Total Load Energy", KWH, 0.1),
((96, 97), "Total PV Energy", KWH, 0.1),
((98, 99), "Year Grid Export", KWH, 0.1),
((87, 88), "Year Load Energy", KWH, 0.1),
((68, 69), "Year PV Energy", KWH, 0.1),
)
##########
# General
##########
RATED_POWER = ((16, 17), "Rated power", WATT, 0.1)
_SENSORS.append(RATED_POWER)
_SENSORS += (
(0, "Device Type"),
((103, 104, 105, 106, 107), "Fault"),
(59, "Overall state"),
(92, "SD Status", ""), # type: ignore
((3, 4, 5, 6, 7), "Serial"),
(90, "DC transformer temperature", CELSIUS, 0.1),
(95, "Environment temperature", CELSIUS, 0.1),
(91, "Radiator temperature", CELSIUS, 0.1),
(194, "Grid Connected Status"),
)
###########
# Settings
###########
_SENSORS += (
(200, "Control Mode"),
(230, "Grid Charge Battery current", AMPS, -1),
(232, "Grid Charge enabled", "", -1),
(312, "Battery charging voltage", VOLT, 0.01),
(603, "Bat1 SOC", "%"),
(611, "Bat1 Cycle"),
)
#BATTERY_EQUALIZATION_VOLTAGE = NumberRWSensor (
# 201, "Battery Equalization voltage", VOLT, 0.01, min=MIN_VOLTAGE, max=MAX_VOLTAGE
#)
#BATTERY_ABSORPTION_VOLTAGE = NumberRWSensor (
# 202, "Battery Absorption voltage", VOLT, 0.01, min=MIN_VOLTAGE, max=MAX_VOLTAGE
#)
#BATTERY_FLOAT_VOLTAGE = NumberRWSensor (
# 203, "Battery Float voltage", VOLT, 0.01, min=MIN_VOLTAGE, max=MAX_VOLTAGE
#)
#BATTERY_SHUTDOWN_CAPACITY = NumberRWSensor (217, "Battery Shutdown Capacity", "%")
#BATTERY_RESTART_CAPACITY = NumberRWSensor (218, "Battery Restart Capacity", "%")
#BATTERY_LOW_CAPACITY = NumberRWSensor (
# 219,
# "Battery Low Capacity",
# "%",
# min=BATTERY_SHUTDOWN_CAPACITY,
# max=BATTERY_RESTART_CAPACITY,
#)
#BATTERY_SHUTDOWN_CAPACITY.max = BATTERY_LOW_CAPACITY
#BATTERY_RESTART_CAPACITY.min = BATTERY_LOW_CAPACITY
#BATTERY_SHUTDOWN_VOLTAGE = NumberRWSensor (
# 220, "Battery Shutdown voltage", VOLT, 0.01, min=MIN_VOLTAGE
#)
#BATTERY_RESTART_VOLTAGE = NumberRWSensor (
# 221, "Battery Restart voltage", VOLT, 0.01, max=MAX_VOLTAGE
#)
#BATTERY_LOW_VOLTAGE = NumberRWSensor (
# 222,
# "Battery Low voltage",
# VOLT,
# 0.01,
# min=BATTERY_SHUTDOWN_VOLTAGE,
# max=BATTERY_RESTART_VOLTAGE,
#)
#BATTERY_SHUTDOWN_VOLTAGE.max = BATTERY_LOW_VOLTAGE
#BATTERY_RESTART_VOLTAGE.min = BATTERY_LOW_VOLTAGE
#
#_SENSORS += (
# BATTERY_EQUALIZATION_VOLTAGE,
# BATTERY_ABSORPTION_VOLTAGE,
# BATTERY_FLOAT_VOLTAGE,
# BATTERY_SHUTDOWN_CAPACITY,
# BATTERY_RESTART_CAPACITY,
# BATTERY_LOW_CAPACITY,
# BATTERY_SHUTDOWN_VOLTAGE,
# BATTERY_RESTART_VOLTAGE,
# BATTERY_LOW_VOLTAGE,
#)
#################
# System program
#################
#_SENSORS.append(
# SelectRWSensor (243, "Priority Mode", options={0: "Battery first", 1: "Load first"})
#)
"""
PROG1_TIME = (250, "Prog1 Time")
PROG2_TIME = (251, "Prog2 Time", min=PROG1_TIME)
PROG3_TIME = (252, "Prog3 Time", min=PROG2_TIME)
PROG4_TIME = (253, "Prog4 Time", min=PROG3_TIME)
PROG5_TIME = (254, "Prog5 Time", min=PROG4_TIME)
PROG6_TIME = (255, "Prog6 Time", min=PROG5_TIME)
PROG1_TIME.min = PROG6_TIME
PROG1_TIME.max = PROG2_TIME
PROG2_TIME.max = PROG3_TIME
PROG3_TIME.max = PROG4_TIME
PROG4_TIME.max = PROG5_TIME
PROG5_TIME.max = PROG6_TIME
PROG6_TIME.max = PROG1_TIME
PROG_CHARGE_OPTIONS = {
4: "No Grid or Gen",
5: "Allow Grid",
6: "Allow Gen",
7: "Allow Grid & Gen",
}
PROGRAM = (
PROG1_TIME,
PROG2_TIME,
PROG3_TIME,
PROG4_TIME,
PROG5_TIME,
PROG6_TIME,
(256, "Prog1 power", WATT, max=RATED_POWER),
(257, "Prog2 power", WATT, max=RATED_POWER),
(258, "Prog3 power", WATT, max=RATED_POWER),
(259, "Prog4 power", WATT, max=RATED_POWER),
(260, "Prog5 power", WATT, max=RATED_POWER),
(261, "Prog6 power", WATT, max=RATED_POWER),
(268, "Prog1 Capacity", "%", min=BATTERY_LOW_CAPACITY),
(269, "Prog2 Capacity", "%", min=BATTERY_LOW_CAPACITY),
(270, "Prog3 Capacity", "%", min=BATTERY_LOW_CAPACITY),
(271, "Prog4 Capacity", "%", min=BATTERY_LOW_CAPACITY),
(272, "Prog5 Capacity", "%", min=BATTERY_LOW_CAPACITY),
(273, "Prog6 Capacity", "%", min=BATTERY_LOW_CAPACITY),
(274, "Prog1 Charge", options=PROG_CHARGE_OPTIONS),
(275, "Prog2 Charge", options=PROG_CHARGE_OPTIONS),
(276, "Prog3 Charge", options=PROG_CHARGE_OPTIONS),
(277, "Prog4 Charge", options=PROG_CHARGE_OPTIONS),
(278, "Prog5 Charge", options=PROG_CHARGE_OPTIONS),
SelectRWSensor (279, "Prog6 Charge", options=PROG_CHARGE_OPTIONS),
)
#_SENSORS.extend(PROGRAM)
PROG_VOLT = (
NumberRWSensor (
262,
"Prog1 voltage",
VOLT,
0.01,
min=BATTERY_LOW_VOLTAGE,
max=BATTERY_FLOAT_VOLTAGE,
),
NumberRWSensor (
263,
"Prog2 voltage",
VOLT,
0.01,
min=BATTERY_LOW_VOLTAGE,
max=BATTERY_FLOAT_VOLTAGE,
),
NumberRWSensor (
264,
"Prog3 voltage",
VOLT,
0.01,
min=BATTERY_LOW_VOLTAGE,
max=BATTERY_FLOAT_VOLTAGE,
),
NumberRWSensor (
265,
"Prog4 voltage",
VOLT,
0.01,
min=BATTERY_LOW_VOLTAGE,
max=BATTERY_FLOAT_VOLTAGE,
),
NumberRWSensor (
266,
"Prog5 voltage",
VOLT,
0.01,
min=BATTERY_LOW_VOLTAGE,
max=BATTERY_FLOAT_VOLTAGE,
),
NumberRWSensor (
267,
"Prog6 voltage",
VOLT,
0.01,
min=BATTERY_LOW_VOLTAGE,
max=BATTERY_FLOAT_VOLTAGE,
),
)
#_SENSORS.extend(PROG_VOLT)
"""

36
deye.py Executable file
View File

@@ -0,0 +1,36 @@
import minimalmodbus
from definitions import _SENSORS
PORT='/dev/ttyRS485'
TESTREG = 150
#Set up instrument
instrument = minimalmodbus.Instrument( PORT, 1) #, mode = minimalmodbus.MODE_RTU)
#Make the settings explicit
instrument.serial.baudrate = 9600 # Baud
instrument.serial.bytesize = 8
instrument.serial.parity = minimalmodbus.serial.PARITY_NONE
instrument.serial.stopbits = 1
instrument.serial.timeout = 1 # seconds
# Good practice
instrument.close_port_after_each_call = True
instrument.clear_buffers_before_each_transaction = True
# Read temperatureas a float
# if you need to read a 16 bit register use instrument.read_register()
instrument.write_register (135, 0, 1)
instrument.write_register (137, 0, 1)
for i in _SENSORS:
try:
reg, name, unit, scale = i
print (name)
if type (reg) == type (1):
val = instrument.read_register (reg, 1)
print (" ", val)
else:
print (reg)
except:
print (i)