From c9d9ab98f9399a73de054ffcc5ddbb7163764503 Mon Sep 17 00:00:00 2001 From: Torsten Oltmanns Date: Wed, 1 Jan 2025 13:23:26 +0800 Subject: [PATCH] added Growatt HV inverter binding --- .../can/GrowattHVInverterCANProcessor.java | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/inverter-growatt-hv-can/src/main/java/com/airepublic/bmstoinverter/inverter/growatthv/can/GrowattHVInverterCANProcessor.java b/inverter-growatt-hv-can/src/main/java/com/airepublic/bmstoinverter/inverter/growatthv/can/GrowattHVInverterCANProcessor.java index 52f4cec..7544b8e 100644 --- a/inverter-growatt-hv-can/src/main/java/com/airepublic/bmstoinverter/inverter/growatthv/can/GrowattHVInverterCANProcessor.java +++ b/inverter-growatt-hv-can/src/main/java/com/airepublic/bmstoinverter/inverter/growatthv/can/GrowattHVInverterCANProcessor.java @@ -68,7 +68,12 @@ protected List createSendFrames(final ByteBuffer requestFrame, final sendFrames.add(sendFaultAndVoltageNumbers(aggregatedPack)); // 0x3170 sendFrames.add(sendMinMaxCellTemperatures(aggregatedPack)); - + // 0x3180 + sendFrames.add(sendBatteryCodeAndQuantity(aggregatedPack)); + // 0x3190 + sendFrames.add(sendMinMaxCellVoltages(aggregatedPack)); + // 0x3200 + sendFrames.add(sendManufacturerAndMaxCellVoltage(aggregatedPack)); } catch (final Throwable e) { LOG.error("Error creating send frames: ", e); } @@ -344,4 +349,53 @@ private ByteBuffer sendMinMaxCellTemperatures(final BatteryPack pack) { return frame; } + + // 0x3180 + private ByteBuffer sendBatteryCodeAndQuantity(final BatteryPack pack) { + final ByteBuffer frame = prepareSendFrame(0x00003180); + + // Manufacturer code + frame.putChar(pack.manufacturerCode.charAt(0)); + // Number of packs in parallel + frame.putChar((char) getEnergyStorage().getBatteryPacks().size()); + // Total number of cells + frame.putChar((char) getEnergyStorage().getBatteryPacks().stream().mapToInt(p -> p.numberOfCells).sum()); + + short bics = 0x0000; + bics = BitUtil.setBit(bics, 0, true); // treat all packs as one aggregated pack + frame.putShort(bics); + + LOG.debug("Sending battery code and quantity: {}", Port.printBuffer(frame)); + + return frame; + } + + + // 0x3190 + private ByteBuffer sendMinMaxCellVoltages(final BatteryPack pack) { + final ByteBuffer frame = prepareSendFrame(0x00003190); + + // Battery status + frame.put((byte) pack.type); + // Max cell voltage (1mV) + frame.putChar((char) pack.maxCellmV); + // Min cell voltage (1mV) + frame.putChar((char) pack.minCellmV); + + LOG.debug("Sending cell min/max voltages: {}", Port.printBuffer(frame)); + return frame; + } + + + // 0x3200 + private ByteBuffer sendManufacturerAndMaxCellVoltage(final BatteryPack pack) { + final ByteBuffer frame = prepareSendFrame(0x00003200); + + frame.putInt(0); + frame.putChar((char) 0); + frame.putChar((char) pack.maxCellVoltageLimit); + + LOG.debug("Sending cell min/max voltages: {}", Port.printBuffer(frame)); + return frame; + } }