From ad1157173283090d3200a0af2fd1a424a342fd98 Mon Sep 17 00:00:00 2001 From: Harm Berntsen Date: Sun, 3 Apr 2022 00:27:41 +0000 Subject: [PATCH] Add support for S440 optimizers (#168) Tested on 2022-03-12 with a SE6K inverter --- se/data.py | 18 ++++++++++++++++++ se/dataparams.py | 16 ++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/se/data.py b/se/data.py index 1611f25..6976d04 100644 --- a/se/data.py +++ b/se/data.py @@ -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]) @@ -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("> 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 = {} diff --git a/se/dataparams.py b/se/dataparams.py index 463cd8a..5f24f09 100644 --- a/se/dataparams.py +++ b/se/dataparams.py @@ -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) #