Skip to content

Commit

Permalink
Add support for S440 optimizers (#168)
Browse files Browse the repository at this point in the history
Tested on 2022-03-12 with a SE6K inverter
  • Loading branch information
hberntsen authored Apr 3, 2022
1 parent e1c1991 commit ad11571
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 0 deletions.
18 changes: 18 additions & 0 deletions se/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,10 @@ def parseDeviceData(data):
optDict[seId] = parseNewOptData(seId, optItems,
data[dataPtr:dataPtr + devLen])
logDevice("optimizer: ", seType, seId, devLen, optDict[seId])
elif seType == 0x0082: # s440 optimizers
optDict[seId] = parseS440OptData(seId, optItems,
data[dataPtr:dataPtr + devLen])
logDevice("optimizer: ", seType, seId, devLen, optDict[seId])
elif seType == 0x0010: # inverter data
invDict[seId] = parseInvData(seId, invItems,
data[dataPtr:dataPtr + devLen])
Expand Down Expand Up @@ -237,6 +241,20 @@ def parseNewOptData(seId, optItems, devData):
return devDataDict(seId, optItems,
[timeStamp, 0, uptime, vpan, vopt, imod, eday, temp])

def parseS440OptData(seId, optItems, devData):
data = bytearray()
data.extend(devData)
(timeStamp, uptime) = struct.unpack("<LH", devData[0:6])
vpan = 0.125 * (data[6] | (data[7] << 8 & 0x300))
vopt = 0.125 * (data[7] >> 2 | (data[8] << 6 & 0x3c0))
imod = 0.00625 * (data[9] << 4 | (data[8] >> 4 & 0xf))
# we don't have those fields
eday = 0
temp = 0
# Don't have an inverter ID in the data, substitute 0
return devDataDict(seId, optItems,
[timeStamp, 0, uptime, vpan, vopt, imod, eday, temp])

# create a dictionary of device data items
def devDataDict(seId, itemNames, itemValues):
devDict = {}
Expand Down
16 changes: 16 additions & 0 deletions se/dataparams.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,4 +167,20 @@
# voltage Panel, 10 bit (1/8 v)
# Uptime of optimiser, 16 bit (secs)
# DateTime, 32 bit (secs)

# Decode optimiser data in packet type 0x0082
# (into same order as original data)
#
# Byte index (in reverse order):
#
# 0e 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00
# ?? ?? ?? ?? ?? Cc cO o# pp Uu uu Dd dd dd dd
# # = oo|Pp
# ?? ?? ?? ?? ?? always contain the same bytes
#
# Current (panel), 12 bit (1/160 Amp)
# voltage Output, 10 bit (1/8 v)
# voltage Panel, 10 bit (1/8 v)
# Uptime of optimiser, 16 bit (secs)
# DateTime, 32 bit (secs)
#

0 comments on commit ad11571

Please sign in to comment.