Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Request] Different DPL strategies for handling multiple inverters #1409

Open
schlimmchen opened this issue Nov 19, 2024 · 10 comments
Open

[Request] Different DPL strategies for handling multiple inverters #1409

schlimmchen opened this issue Nov 19, 2024 · 10 comments
Labels
enhancement New feature or request

Comments

@schlimmchen
Copy link
Member

Is your feature request related to a problem? Please describe.

The implementation merged in #1216 prefers to change the limit of those inverters which promise to implement the needed change in AC output with a single limit update. If none can implement the change in one go, the inverters are sorted by the contribution they can make to the required change.

This tries to make sure that the DPL reacts as quickly as possible.

This also means that the DPL is happy to put inverters online, but hesitant to put them into standby.

However, people objected that this can lead to less than ideal situations, where multiple inverters are online producing at less efficiency while less inverters could be producing at the same total power with higher efficiency.

Describe the solution you'd like

Without too much trouble, we could implement different strategies in the DPL. The respective function implementing a particular strategy would always receive a bunch of inverters as input as well as the desired change in output, and it would be responsible to determine which of those inverters are supposed to change their limit by how much.

Describe alternatives you've considered

No response

Additional context

I am happy to help implement different strategies and make them selectable (config switch, UI changes, etc.). If you think the DPL should implement a different strategy, please see

if (diff < 0) {
uint16_t reduction = static_cast<uint16_t>(diff * -1);
uint16_t totalMaxReduction = 0;
for (auto const pInv : matchingInverters) {
totalMaxReduction += pInv->getMaxReductionWatts(false/*no standby*/);
}
// test whether we need to put at least one of the inverters into
// standby to achieve the requested reduction.
bool allowStandby = (totalMaxReduction < reduction);
std::sort(matchingInverters.begin(), matchingInverters.end(),
[allowStandby](auto const a, auto const b) {
auto aReduction = a->getMaxReductionWatts(allowStandby);
auto bReduction = b->getMaxReductionWatts(allowStandby);
return aReduction > bReduction;
});
for (auto pInv : matchingInverters) {
auto maxReduction = pInv->getMaxReductionWatts(allowStandby);
if (reduction >= hysteresis && maxReduction >= hysteresis) {
reduction -= pInv->applyReduction(reduction, allowStandby);
}
covered += pInv->getExpectedOutputAcWatts();
}
}
else {
uint16_t increase = static_cast<uint16_t>(diff);
std::sort(matchingInverters.begin(), matchingInverters.end(),
[](auto const a, auto const b) {
return a->getMaxIncreaseWatts() > b->getMaxIncreaseWatts();
});
for (auto pInv : matchingInverters) {
auto maxIncrease = pInv->getMaxIncreaseWatts();
if (increase >= hysteresis && maxIncrease >= hysteresis) {
increase -= pInv->applyIncrease(increase);
}
covered += pInv->getExpectedOutputAcWatts();
}
}

for inspiration and describe the method you would like to see the DPL using. The more technical (flow-chart, pseudo-code) and detailed, the better.

@Manos1966
Copy link

Hi @schlimmchen suchst du weiterhin nach [Tersters]?
(ich habe eine Test-Installation mit 2-3 Hoymiles online).

@schlimmchen
Copy link
Member Author

Naja, jetzt ist die Katze ja aus dem Sack. Unsere Nutzer werden das neue Release sicherlich ausprobieren und wir hören sicherlich, wenn es Probleme gibt.

@spcqike
Copy link

spcqike commented Nov 21, 2024

Ich hab aktuell nur 1 wechselrichter und viel zu wenig Sonne.

Das Feature testen werde ich dann ab April 2025 😄

@Manos1966
Copy link

Jesus! 😱 😱 😱 😱 😱
image

🥇 🥇 🥇 🥇 🥇 🥇 🥇 🥇
🥂 🥂 🥂 🥂 🥂 🥂 🥂 🥂

@andy75andreas
Copy link

andy75andreas commented Nov 26, 2024

Verschoben nach #1427 Hallo, irgendwie geht da was nicht mit der 20.11.2024.

ESP32-S3 8MB, Oled,Pylontec,Victron,SML,(W5500)

Ich habe alles so eingestellt wie in der Version vorher, aber es wird kein Strom produziert.
Was ist hier falsch?

Dump von der Konsole: ```[VE.Direct MPPT 12/11] serial input (242 Bytes): 19:36:24.441 > [VE.Direct MPPT 12/11] 3a 37 46 36 45 44 30 30 31 38 31 35 33 45 0a 3a 19:36:24.504 > [VE.Direct MPPT 12/11] 37 32 37 32 30 30 30 46 46 46 46 46 46 46 46 30 19:36:24.565 > [VE.Direct MPPT 12/11] 42 0a 3a 41 44 35 45 44 30 30 44 34 31 34 41 31 19:36:24.631 > [VE.Direct MPPT 12/11] 0a 3a 41 42 42 45 44 30 30 31 32 30 30 39 31 0a 19:36:24.682 > [VE.Direct MPPT 12/11] 0d 0a 50 49 44 09 30 78 41 30 37 33 0d 0a 46 57 19:36:24.738 > [VE.Direct MPPT 12/11] 09 31 36 34 0d 0a 53 45 52 23 09 48 51 32 32 34 19:36:24.804 > [VE.Direct MPPT 12/11] 38 48 39 41 34 33 0d 0a 56 09 35 33 33 32 30 0d 19:36:24.868 > [VE.Direct MPPT 12/11] 0a 49 09 30 0d 0a 56 50 56 09 31 39 30 0d 0a 50 19:36:24.919 > [VE.Direct MPPT 12/11] 50 56 09 30 0d 0a 43 53 09 30 0d 0a 4d 50 50 54 19:36:24.978 > [VE.Direct MPPT 12/11] 09 30 0d 0a 4f 52 09 30 78 30 30 30 30 30 30 30 19:36:25.033 > [VE.Direct MPPT 12/11] 31 0d 0a 45 52 52 09 30 0d 0a 4c 4f 41 44 09 4f 19:36:25.197 > [VE.Direct MPPT 12/11] 4e 0d 0a 48 31 39 09 35 34 38 35 0d 0a 48 32 30 19:36:25.255 > [VE.Direct MPPT 12/11] 09 39 30 0d 0a 48 32 31 09 33 30 38 0d 0a 48 32 19:36:25.327 > [VE.Direct MPPT 12/11] 32 09 37 39 0d 0a 48 32 33 09 32 36 35 0d 0a 48 19:36:25.387 > [VE.Direct MPPT 12/11] 53 44 53 09 34 37 0d 0a 43 68 65 63 6b 73 75 6d 19:36:25.437 > [VE.Direct MPPT 12/11] 09 f3 19:36:25.491 > [VE.Direct MPPT 12/11] Text Data 'PID' = '0XA073' 19:36:25.610 > [VE.Direct MPPT 12/11] Text Data 'FW' = '164' 19:36:25.656 > [VE.Direct MPPT 12/11] Text Data 'SER' = 'HQ2248------' 19:36:25.704 > [VE.Direct MPPT 12/11] Text Data 'V' = '53320' 19:36:25.749 > [VE.Direct MPPT 12/11] Text Data 'I' = '0' 19:36:25.797 > [VE.Direct MPPT 12/11] Text Data 'VPV' = '190' 19:36:25.853 > [VE.Direct MPPT 12/11] Text Data 'PPV' = '0' 19:36:25.909 > [VE.Direct MPPT 12/11] Text Data 'CS' = '0' 19:36:26.028 > [VE.Direct MPPT 12/11] Text Data 'MPPT' = '0' 19:36:26.089 > [VE.Direct MPPT 12/11] Text Data 'OR' = '0X00000001' 19:36:26.141 > [VE.Direct MPPT 12/11] Text Data 'ERR' = '0' 19:36:26.200 > [VE.Direct MPPT 12/11] Text Data 'LOAD' = 'ON' 19:36:26.283 > [VE.Direct MPPT 12/11] Text Data 'H19' = '5485' 19:36:26.346 > [VE.Direct MPPT 12/11] Text Data 'H20' = '90' 19:36:26.404 > [VE.Direct MPPT 12/11] Text Data 'H21' = '308' 19:36:26.463 > [VE.Direct MPPT 12/11] Text Data 'H22' = '79' 19:36:26.528 > [VE.Direct MPPT 12/11] Text Data 'H23' = '265' 19:36:26.604 > [VE.Direct MPPT 12/11] Text Data 'HSDS' = '47' 19:36:26.683 > [DPL::loop] ******************* ENTER ********************** 19:36:26.762 > [DPL::loop] battery interface enabled, SoC: 99.0 %, StartTH: 90 %, StopTH: 20 %, SoC age: 1 s, ignore: no 19:36:26.852 > [DPL::getBatteryVoltage] BMS: 53.25 V, MPPT: 53.32 V, inverter 1164a------------: 53.40 V, returning: 53.25V 19:36:26.913 > [DPL::loop] dcVoltage: 53.25 V, loadCorrectedVoltage: 53.25 V, StartTH: 53.00 V, StopTH: 49.00 V 19:36:26.982 > [DPL::loop] StartTH reached: yes, StopTH reached: no, SolarPT disabled, use at night: yes 19:36:27.041 > [DPL::calcHouseholdConsumption] target consumption: 0 W, base load: 10 W 19:36:27.112 > [DPL::calcHouseholdConsumption] power meter value: 405.0 W, power meter valid: yes 19:36:27.174 > [DPL::calcHouseholdConsumption] inverter 1164a------------- is behind power meter producing 1 W 19:36:27.237 > [DPL::updateInverterLimits] requested: 406 W, producing: 0 W using 0 solar-powered inverters, diff: 406 W, hysteresis: 30 W 19:36:27.297 > [DPL::calcBatteryAllowance] power requested: 406 W 19:36:27.461 > [DPL::updateInverterLimits] requested: 406 W, producing: 1 W using 1 battery-powered inverters, diff: 405 W, hysteresis: 30 W 19:36:27.520 > [DPL::updateInverterLimits] will cover 1 W using battery-powered inverters 19:36:27.587 > [DPL inverter 1164a---------]: 19:36:27.641 > battery-powered, producing 1 W 19:36:27.707 > lower/current/upper limit: 10/0/500 W, output capability: 1600 W 19:36:27.771 > sending commands enabled, reachable, disqualified 19:36:27.843 > max reduction production/standby: 0/0 W, max increase: 0 W 19:36:27.899 > target limit/output/state: -1 W (unchanged)/1 W/unchanged, 0 update timeouts 19:36:27.957 > [DPL::loop] consumption: 406 W, target output: 406 W (limited to 1500 W), solar inverters output: 0 W, battery allowance: 406 W, battery inverters output: 1 W 19:36:28.009 > [DPL::announceStatus] the system is stable, the last power limit is still valid 19:36:28.066 > [VE.Direct MPPT 12/11] Unhandled Hex Async Response, addr: 0xEDD5 (Charger Voltage), value: 0x000014D5, flags: 0x00 19:36:28.123 > [VE.Direct MPPT 12/11] Unhandled Hex Async Response, addr: 0xEDBB (Panel Voltage), value: 0x00000012, flags: 0x00 19:36:28.275 > Fetch inverter: 1164A----------- 19:36:28.323 > TX RealTimeRunData 865.00 MHz --> 15 A0 09 93 20 80 19 36 00 80 0B 00 67 46 15 29 00 00 00 00 00 00 00 00 DC 7D 97 19:36:28.381 > [PowerMeterSerialSml] decoded energy import to -0.10 19:36:28.443 > [PowerMeterSerialSml] decoded energy import to 1514999.75 19:36:28.509 > [PowerMeterSerialSml] decoded energy export to -10.00 19:36:28.626 > [PowerMeterSerialSml] decoded energy export to 462664.91 19:36:28.734 > [PowerMeterSerialSml] decoded active power total to 396.00 19:36:28.851 > [PowerMeterSerialSml] decoded active power total to 396.00 19:36:28.952 > [PowerMeterSerialSml] checksum verification failed 19:36:29.037 > Interrupt received 19:36:29.141 > RX 865.00 MHz --> 95 A0 09 93 20 80 19 36 00 01 00 01 02 16 02 16 00 01 00 00 00 07 00 04 00 00 22 | -7 dBm 19:36:29.245 > Websocket: [/livedata][16] disconnect 19:36:29.354 > Websocket: [/vedirectlivedata][14] disconnect 19:36:29.551 > Websocket: [/batterylivedata][14] disconnect 19:36:29.611 > Interrupt received 19:36:29.664 > RX 865.00 MHz --> 95 A0 09 93 20 80 19 36 00 02 32 A8 00 00 32 29 00 18 00 12 02 16 02 17 00 00 A8 | -7 dBm 19:36:29.802 > [VE.Direct MPPT 12/11] serial input (208 Bytes): 19:36:29.856 > [VE.Direct MPPT 12/11] 3a 41 44 35 45 44 30 30 44 35 31 34 41 30 0a 3a 19:36:29.918 > [VE.Direct MPPT 12/11] 41 42 42 45 44 30 30 31 32 30 30 39 31 0a 0d 0a 19:36:29.988 > [VE.Direct MPPT 12/11] 50 49 44 09 30 78 41 30 37 33 0d 0a 46 57 09 31 19:36:30.048 > [VE.Direct MPPT 12/11] 36 34 0d 0a 53 45 52 23 09 48 51 32 32 34 38 48 19:36:30.100 > [VE.Direct MPPT 12/11] 39 41 34 33 0d 0a 56 09 35 33 33 33 30 0d 0a 49 19:36:30.155 > [VE.Direct MPPT 12/11] 09 30 0d 0a 56 50 56 09 31 39 30 0d 0a 50 50 56 19:36:30.207 > [VE.Direct MPPT 12/11] 09 30 0d 0a 43 53 09 30 0d 0a 4d 50 50 54 09 30 19:36:30.266 > [VE.Direct MPPT 12/11] 0d 0a 4f 52 09 30 78 30 30 30 30 30 30 30 31 0d 19:36:30.319 > [VE.Direct MPPT 12/11] 0a 45 52 52 09 30 0d 0a 4c 4f 41 44 09 4f 4e 0d 19:36:30.364 > [VE.Direct MPPT 12/11] 0a 48 31 39 09 35 34 38 35 0d 0a 48 32 30 09 39 19:36:30.423 > [VE.Direct MPPT 12/11] 30 0d 0a 48 32 31 09 33 30 38 0d 0a 48 32 32 09 19:36:30.475 > [VE.Direct MPPT 12/11] 37 39 0d 0a 48 32 33 09 32 36 35 0d 0a 48 53 44 19:36:30.531 > [VE.Direct MPPT 12/11] 53 09 34 37 0d 0a 43 68 65 63 6b 73 75 6d 09 f2 19:36:30.595 > [VE.Direct MPPT 12/11] Text Data 'PID' = '0XA073' 19:36:30.655 > [VE.Direct MPPT 12/11] Text Data 'FW' = '164' 19:36:30.714 > [VE.Direct MPPT 12/11] Text Data 'SER' = 'HQ22-------' 19:36:30.771 > [VE.Direct MPPT 12/11] Text Data 'V' = '53330' 19:36:30.821 > [VE.Direct MPPT 12/11] Text Data 'I' = '0' 19:36:30.874 > [VE.Direct MPPT 12/11] Text Data 'VPV' = '190' 19:36:30.931 > [VE.Direct MPPT 12/11] Text Data 'PPV' = '0' 19:36:30.987 > [VE.Direct MPPT 12/11] Text Data 'CS' = '0' 19:36:31.040 > [VE.Direct MPPT 12/11] Text Data 'MPPT' = '0' 19:36:31.096 > [VE.Direct MPPT 12/11] Text Data 'OR' = '0X00000001' 19:36:31.150 > [VE.Direct MPPT 12/11] Text Data 'ERR' = '0' 19:36:31.197 > [VE.Direct MPPT 12/11] Text Data 'LOAD' = 'ON' 19:36:31.256 > [VE.Direct MPPT 12/11] Text Data 'H19' = '5485' 19:36:31.306 > [VE.Direct MPPT 12/11] Text Data 'H20' = '90' 19:36:31.354 > [VE.Direct MPPT 12/11] Text Data 'H21' = '308' 19:36:31.412 > [VE.Direct MPPT 12/11] Text Data 'H22' = '79' 19:36:31.476 > [VE.Direct MPPT 12/11] Text Data 'H23' = '265' 19:36:31.529 > [VE.Direct MPPT 12/11] Text Data 'HSDS' = '47' 19:36:31.574 > Interrupt received 19:36:31.632 > RX 865.00 MHz --> 95 A0 09 93 20 80 19 36 00 03 00 00 00 03 00 02 00 00 2A ED 00 00 28 AD 00 0B 6B | -7 dBm 19:36:31.691 > [VE.Direct MPPT 12/11] Sending Hex Command: :7ECED0075, Free FIFO-Buffer: 118 19:36:31.758 > [VE.Direct MPPT 12/11] Hex Data: Smart Battery Sense Temperature is not available 19:36:31.810 > [VE.Direct MPPT 12/11] Sending Hex Command: :727200007, Free FIFO-Buffer: 118 19:36:31.869 > [VE.Direct MPPT 12/11] Hex Data: Network total DC power value indicates non-networked controller 19:36:31.929 > RX Period End 19:36:31.981 > Last missing 19:36:32.041 > Request retransmit: 4 19:36:32.102 > TX RequestFrame 865.00 MHz --> 15 A0 09 93 20 80 19 36 00 84 24 19:36:32.156 > Interrupt received 19:36:32.212 > RX 865.00 MHz --> 95 A0 09 93 20 80 19 36 00 04 00 0B 09 44 13 89 00 03 00 00 00 00 03 E8 00 B3 A3 | -7 dBm 19:36:32.264 > RX Period End 19:36:32.311 > Last missing 19:36:32.359 > Request retransmit: 5 19:36:32.419 > TX RequestFrame 865.00 MHz --> 15 A0 09 93 20 80 19 36 00 85 25 19:36:32.482 > [VE.Direct MPPT 12/11] Sending Hex Command: :7DBED0086, Free FIFO-Buffer: 118 19:36:32.569 > Interrupt received 19:36:32.661 > RX 865.00 MHz --> 95 A0 09 93 20 80 19 36 00 85 00 01 B0 D3 C7 | -7 dBm 19:36:32.734 > [VE.Direct MPPT 12/11] Hex Data: MPPT Temperature (0xEDDB): 23.70°C 19:36:32.784 > [VE.Direct MPPT 12/11] Sending Hex Command: :7F7ED006A, Free FIFO-Buffer: 118 19:36:32.843 > [VE.Direct MPPT 12/11] Hex Data: MPPT Absorption Voltage (0xEDF7): 56.80V 19:36:32.894 > RX Period End 19:36:32.941 > Success 19:36:32.988 > [VE.Direct MPPT 12/11] Unhandled Hex Async Response, addr: 0xEDD5 (Charger Voltage), value: 0x000014D4, flags: 0x00 19:36:33.043 > [VE.Direct MPPT 12/11] Unhandled Hex Async Response, addr: 0xEDBB (Panel Voltage), value: 0x00000012, flags: 0x00 19:36:33.106 > [DPL::loop] ******************* ENTER ********************** 19:36:33.178 > [DPL::loop] battery interface enabled, SoC: 99.0 %, StartTH: 90 %, StopTH: 20 %, SoC age: 2 s, ignore: no 19:36:33.235 > [DPL::getBatteryVoltage] BMS: 53.25 V, MPPT: 53.33 V, inverter 1164a------------: 53.40 V, returning: 53.25V 19:36:33.298 > [DPL::loop] dcVoltage: 53.25 V, loadCorrectedVoltage: 53.25 V, StartTH: 53.00 V, StopTH: 49.00 V 19:36:33.361 > [DPL::loop] StartTH reached: yes, StopTH reached: no, SolarPT disabled, use at night: yes 19:36:33.422 > [DPL::calcHouseholdConsumption] target consumption: 0 W, base load: 10 W 19:36:33.486 > [DPL::calcHouseholdConsumption] power meter value: 405.0 W, power meter valid: yes 19:36:33.549 > [DPL::calcHouseholdConsumption] inverter 1164a---------- is behind power meter producing 0 W 19:36:33.634 > [PowerMeterSerialSml] decoded energy import to -0.10 19:36:33.731 > [DPL::updateInverterLimits] requested: 405 W, producing: 0 W using 0 solar-powered inverters, diff: 405 W, hysteresis: 30 W 19:36:33.811 > [PowerMeterSerialSml] decoded energy import to 1514999.75 19:36:33.929 > [DPL::calcBatteryAllowance] power requested: 405 W 19:36:34.034 > [DPL::updateInverterLimits] requested: 405 W, producing: 0 W using 1 battery-powered inverters, diff: 405 W, hysteresis: 30 W 19:36:34.094 > [PowerMeterSerialSml] decoded energy export to -10.00 19:36:34.153 > [DPL::updateInverterLimits] will cover 0 W using battery-powered inverters 19:36:34.206 > [PowerMeterSerialSml] decoded energy export to 462664.91 19:36:34.272 > [PowerMeterSerialSml] decoded active power total to 385.00 19:36:34.333 > [DPL inverter 1164a00-----------]: 19:36:34.392 > battery-powered, producing 0 W 19:36:34.494 > lower/current/upper limit: 10/0/500 W, output capability: 1600 W 19:36:34.546 > sending commands enabled, reachable, disqualified 19:36:34.591 > max reduction production/standby: 0/0 W, max increase: 0 W 19:36:34.648 > target limit/output/state: -1 W (unchanged)/0 W/unchanged, 0 update timeouts 19:36:34.714 > [PowerMeterSerialSml] decoded active power total to 385.00 19:36:34.770 > [DPL::loop] consumption: 405 W, target output: 405 W (limited to 1500 W), solar inverters output: 0 W, battery allowance: 405 W, battery inverters output: 0 W 19:36:34.828 > [PowerMeterSerialSml] TotalPower: 385.00 19:36:34.873 > [VE.Direct MPPT 12/11] serial input (272 Bytes): 19:36:34.935 > [VE.Direct MPPT 12/11] 3a 37 45 43 45 44 30 30 46 46 46 46 37 37 0a 3a 19:36:34.983 > [VE.Direct MPPT 12/11] 37 32 37 32 30 30 30 46 46 46 46 46 46 46 46 30 19:36:35.042 > [VE.Direct MPPT 12/11] 42 0a 3a 37 44 42 45 44 30 30 34 32 30 39 33 42 19:36:35.107 > [VE.Direct MPPT 12/11] 0a 3a 37 46 37 45 44 30 30 33 30 31 36 32 34 0a 19:36:35.162 > [VE.Direct MPPT 12/11] 3a 41 44 35 45 44 30 30 44 34 31 34 41 31 0a 3a 19:36:35.327 > [VE.Direct MPPT 12/11] 41 42 42 45 44 30 30 31 32 30 30 39 31 0a 0d 0a 19:36:35.385 > [VE.Direct MPPT 12/11] 50 49 44 09 30 78 41 30 37 33 0d 0a 46 57 09 31 19:36:35.539 > [VE.Direct MPPT 12/11] 36 34 0d 0a 53 45 52 23 09 48 51 32 32 34 38 48 19:36:35.634 > [VE.Direct MPPT 12/11] 39 41 34 33 0d 0a 56 09 35 33 33 32 30 0d 0a 49 19:36:35.737 > [VE.Direct MPPT 12/11] 09 30 0d 0a 56 50 56 09 31 38 30 0d 0a 50 50 56 19:36:35.796 > [VE.Direct MPPT 12/11] 09 30 0d 0a 43 53 09 30 0d 0a 4d 50 50 54 09 30 19:36:35.859 > [VE.Direct MPPT 12/11] 0d 0a 4f 52 09 30 78 30 30 30 30 30 30 30 31 0d 19:36:35.911 > [VE.Direct MPPT 12/11] 0a 45 52 52 09 30 0d 0a 4c 4f 41 44 09 4f 4e 0d 19:36:35.957 > [VE.Direct MPPT 12/11] 0a 48 31 39 09 35 34 38 35 0d 0a 48 32 30 09 39 19:36:36.005 > [VE.Direct MPPT 12/11] 30 0d 0a 48 32 31 09 33 30 38 0d 0a 48 32 32 09 19:36:36.059 > [VE.Direct MPPT 12/11] 37 39 0d 0a 48 32 33 09 32 36 35 0d 0a 48 53 44 19:36:36.146 > [VE.Direct MPPT 12/11] 53 09 34 37 0d 0a 43 68 65 63 6b 73 75 6d 09 f4 19:36:36.194 > [VE.Direct MPPT 12/11] Text Data 'PID' = '0XA073' 19:36:36.245 > [VE.Direct MPPT 12/11] Text Data 'FW' = '164' 19:36:36.353 > [VE.Direct MPPT 12/11] Text Data 'SER' = 'HQ2-------------' 19:36:36.408 > [VE.Direct MPPT 12/11] Text Data 'V' = '53320' 19:36:36.470 > [VE.Direct MPPT 12/11] Text Data 'I' = '0' 19:36:36.524 > [VE.Direct MPPT 12/11] Text Data 'VPV' = '180' 19:36:36.579 > [VE.Direct MPPT 12/11] Text Data 'PPV' = '0' 19:36:36.648 > [VE.Direct MPPT 12/11] Text Data 'CS' = '0' 19:36:36.696 > [VE.Direct MPPT 12/11] Text Data 'MPPT' = '0' 19:36:36.743 > [VE.Direct MPPT 12/11] Text Data 'OR' = '0X00000001' 19:36:36.790 > [VE.Direct MPPT 12/11] Text Data 'ERR' = '0' 19:36:36.837 > [VE.Direct MPPT 12/11] Text Data 'LOAD' = 'ON' 19:36:36.884 > [VE.Direct MPPT 12/11] Text Data 'H19' = '5485' 19:36:36.931 > [VE.Direct MPPT 12/11] Text Data 'H20' = '90' 19:36:36.992 > [VE.Direct MPPT 12/11] Text Data 'H21' = '308' 19:36:37.054 > [VE.Direct MPPT 12/11] Text Data 'H22' = '79' 19:36:37.104 > [VE.Direct MPPT 12/11] Text Data 'H23' = '265' 19:36:37.164 > [VE.Direct MPPT 12/11] Text Data 'HSDS' = '47' 19:36:37.222 > [VE.Direct MPPT 12/11] Sending Hex Command: :727200007, Free FIFO-Buffer: 118 19:36:37.280 > [VE.Direct MPPT 12/11] Hex Data: Network total DC power value indicates non-networked controller 19:36:37.334 > [VE.Direct MPPT 12/11] Unhandled Hex Async Response, addr: 0xEDD5 (Charger Voltage), value: 0x000014D5, flags: 0x00 19:36:37.393 > [VE.Direct MPPT 12/11] Unhandled Hex Async Response, addr: 0xEDBB (Panel Voltage), value: 0x00000013, flags: 0x00 19:36:37.478 > [PowerMeterSerialSml] decoded energy import to -0.10 19:36:37.540 > [PowerMeterSerialSml] decoded energy import to 1514999.88 19:36:37.601 > [PowerMeterSerialSml] decoded energy export to -10.00 19:36:37.658 > [PowerMeterSerialSml] decoded energy export to 462664.91 19:36:37.711 > [PowerMeterSerialSml] decoded active power total to 404.00 19:36:37.769 > [PowerMeterSerialSml] decoded active power total to 404.00 19:36:37.884 > [PowerMeterSerialSml] TotalPower: 404.00 19:36:37.950 > [DPL::loop] ******************* ENTER ********************** 19:36:38.001 > [DPL::loop] battery interface enabled, SoC: 99.0 %, StartTH: 90 %, StopTH: 20 %, SoC age: 3 s, ignore: no 19:36:38.048 > [DPL::getBatteryVoltage] BMS: 53.25 V, MPPT: 53.32 V, inverter 1164a-----------: 53.40 V, returning: 53.25V 19:36:38.095 > [DPL::loop] dcVoltage: 53.25 V, loadCorrectedVoltage: 53.25 V, StartTH: 53.00 V, StopTH: 49.00 V 19:36:38.152 > [DPL::loop] StartTH reached: yes, StopTH reached: no, SolarPT disabled, use at night: yes 19:36:38.214 > [DPL::calcHouseholdConsumption] target consumption: 0 W, base load: 10 W 19:36:38.282 > [DPL::calcHouseholdConsumption] power meter value: 404.0 W, power meter valid: yes 19:36:38.342 > [DPL::calcHouseholdConsumption] inverter 1164------------ is behind power meter producing 0 W 19:36:38.397 > [DPL::updateInverterLimits] requested: 404 W, producing: 0 W using 0 solar-powered inverters, diff: 404 W, hysteresis: 30 W 19:36:38.503 > [DPL::calcBatteryAllowance] power requested: 404 W 19:36:38.560 > [DPL::updateInverterLimits] requested: 404 W, producing: 0 W using 1 battery-powered inverters, diff: 404 W, hysteresis: 30 W 19:36:38.619 > [DPL::updateInverterLimits] will cover 0 W using battery-powered inverters 19:36:38.704 > [DPL inverter 1164--------------]: 19:36:38.755 > battery-powered, producing 0 W 19:36:38.814 > lower/current/upper limit: 10/0/500 W, output capability: 1600 W 19:36:38.883 > sending commands enabled, reachable, disqualified 19:36:38.958 > max reduction production/standby: 0/0 W, max increase: 0 W 19:36:39.006 > target limit/output/state: -1 W (unchanged)/0 W/unchanged, 0 update timeouts 19:36:39.061 > [DPL::loop] consumption: 404 W, target output: 404 W (limited to 1500 W), solar inverters output: 0 W, battery allowance: 404 W, battery inverters output: 0 W 19:36:39.116 > [VE.Direct MPPT 12/11] serial input (227 Bytes): 19:36:39.163 > [VE.Direct MPPT 12/11] 3a 37 32 37 32 30 30 30 46 46 46 46 46 46 46 46 19:36:39.221 > [VE.Direct MPPT 12/11] 30 42 0a 3a 41 44 35 45 44 30 30 44 35 31 34 41 19:36:39.285 > [VE.Direct MPPT 12/11] 30 0a 3a 41 42 42 45 44 30 30 31 33 30 30 39 30 19:36:39.345 > [VE.Direct MPPT 12/11] 0a 0d 0a 50 49 44 09 30 78 41 30 37 33 0d 0a 46 19:36:39.412 > [VE.Direct MPPT 12/11] 57 09 31 36 34 0d 0a 53 45 52 23 09 48 51 32 32 19:36:39.468 > [VE.Direct MPPT 12/11] 34 38 48 39 41 34 33 0d 0a 56 09 35 33 33 33 30 19:36:39.626 > [VE.Direct MPPT 12/11] 0d 0a 49 09 30 0d 0a 56 50 56 09 31 38 30 0d 0a 19:36:39.691 > [VE.Direct MPPT 12/11] 50 50 56 09 30 0d 0a 43 53 09 30 0d 0a 4d 50 50 19:36:39.749 > [VE.Direct MPPT 12/11] 54 09 30 0d 0a 4f 52 09 30 78 30 30 30 30 30 30 19:36:39.835 > [VE.Direct MPPT 12/11] 30 31 0d 0a 45 52 52 09 30 0d 0a 4c 4f 41 44 09 19:36:39.886 > [VE.Direct MPPT 12/11] 4f 4e 0d 0a 48 31 39 09 35 34 38 35 0d 0a 48 32 19:36:39.942 > [VE.Direct MPPT 12/11] 30 09 39 30 0d 0a 48 32 31 09 33 30 38 0d 0a 48 19:36:39.999 > [VE.Direct MPPT 12/11] 32 32 09 37 39 0d 0a 48 32 33 09 32 36 35 0d 0a 19:36:40.139 > [VE.Direct MPPT 12/11] 48 53 44 53 09 34 37 0d 0a 43 68 65 63 6b 73 75 19:36:40.190 > [VE.Direct MPPT 12/11] 6d 09 f3 19:36:40.256 > [VE.Direct MPPT 12/11] Text Data 'PID' = '0XA073' 19:36:40.317 > [VE.Direct MPPT 12/11] Text Data 'FW' = '164' 19:36:40.374 > [VE.Direct MPPT 12/11] Text Data 'SER' = '------------' 19:36:40.420 > [VE.Direct MPPT 12/11] Text Data 'V' = '53330' 19:36:40.469 > [VE.Direct MPPT 12/11] Text Data 'I' = '0' 19:36:40.526 > [VE.Direct MPPT 12/11] Text Data 'VPV' = '180' 19:36:40.577 > [VE.Direct MPPT 12/11] Text Data 'PPV' = '0' 19:36:40.624 > [VE.Direct MPPT 12/11] Text Data 'CS' = '0' 19:36:40.673 > [VE.Direct MPPT 12/11] Text Data 'MPPT' = '0' 19:36:40.718 > [VE.Direct MPPT 12/11] Text Data 'OR' = '0X00000001' 19:36:40.774 > [VE.Direct MPPT 12/11] Text Data 'ERR' = '0' 19:36:40.836 > [VE.Direct MPPT 12/11] Text Data 'LOAD' = 'ON' 19:36:40.891 > [VE.Direct MPPT 12/11] Text Data 'H19' = '5485' 19:36:40.938 > [VE.Direct MPPT 12/11] Text Data 'H20' = '90' 19:36:40.986 > [VE.Direct MPPT 12/11] Text Data 'H21' = '308' 19:36:41.041 > [VE.Direct MPPT 12/11] Text Data 'H22' = '79' 19:36:41.103 > [VE.Direct MPPT 12/11] Text Data 'H23' = '265' 19:36:41.163 > [VE.Direct MPPT 12/11] Text Data 'HSDS' = '47' 19:36:41.230 > [VE.Direct MPPT 12/11] Unhandled Hex Async Response, addr: 0x0201 (Device State), value: 0x00000000, flags: 0x00 19:36:41.294 > [VE.Direct MPPT 12/11] Unhandled Hex Async Response, addr: 0x0200 (Device Mode), value: 0x00000001, flags: 0x00 19:36:41.363 > [VE.Direct MPPT 12/11] Unhandled Hex Async Response, addr: 0x0202 (Remote Control Used), value: 0x00000002, flags: 0x00 19:36:41.414 > [VE.Direct MPPT 12/11] Sending Hex Command: :7F6ED006B, Free FIFO-Buffer: 118 19:36:41.582 > [VE.Direct MPPT 12/11] Hex Data: MPPT Float Voltage (0xEDF6): 54.00V 19:36:41.640 > [VE.Direct MPPT 12/11] Sending Hex Command: :727200007, Free FIFO-Buffer: 118 19:36:41.696 > [VE.Direct MPPT 12/11] Hex Data: Network total DC power value indicates non-networked controller 19:36:41.740 > [VE.Direct MPPT 12/11] Unhandled Hex Async Response, addr: 0xEDD5 (Charger Voltage), value: 0x000014D4, flags: 0x00 19:36:41.788 > [VE.Direct MPPT 12/11] Unhandled Hex Async Response, addr: 0xEDBB (Panel Voltage), value: 0x00000012, flags: 0x00 19:36:41.847 > [PowerMeterSerialSml] decoded energy import to -0.10 19:36:41.897 > [PowerMeterSerialSml] decoded energy import to 1515000.12 19:36:41.954 > [PowerMeterSerialSml] decoded energy export to -10.00 19:36:42.008 > [PowerMeterSerialSml] decoded energy export to 462664.91 19:36:42.064 > [PowerMeterSerialSml] decoded active power total to 407.00 19:36:42.124 > [PowerMeterSerialSml] decoded active power total to 407.00 19:36:42.192 > [PowerMeterSerialSml] TotalPower: 407.00 19:36:42.256 > [VE.Direct MPPT 12/11] serial input (287 Bytes): 19:36:42.306 > [VE.Direct MPPT 12/11] 3a 41 30 31 30 32 30 30 30 30 34 38 0a 3a 41 30 19:36:42.363 > [VE.Direct MPPT 12/11] 30 30 32 30 30 30 31 34 38 0a 3a 41 30 32 30 32 19:36:42.416 > [VE.Direct MPPT 12/11] 30 30 30 32 30 30 30 30 30 30 34 35 0a 3a 37 46 19:36:42.465 > [VE.Direct MPPT 12/11] 36 45 44 30 30 31 38 31 35 33 45 0a 3a 37 32 37 19:36:42.509 > [VE.Direct MPPT 12/11] 32 30 30 30 46 46 46 46 46 46 46 46 30 42 0a 3a 19:36:42.565 > [VE.Direct MPPT 12/11] 41 44 35 45 44 30 30 44 34 31 34 41 31 0a 3a 41 19:36:42.631 > [VE.Direct MPPT 12/11] 42 42 45 44 30 30 31 32 30 30 39 31 0a 0d 0a 50 19:36:42.691 > [VE.Direct MPPT 12/11] 49 44 09 30 78 41 30 37 33 0d 0a 46 57 09 31 36 19:36:42.749 > [VE.Direct MPPT 12/11] 34 0d 0a 53 45 52 23 09 48 51 32 32 34 38 48 39 19:36:42.796 > [VE.Direct MPPT 12/11] 41 34 33 0d 0a 56 09 35 33 33 33 30 0d 0a 49 09 ```
Hier meine Pin-Map: ```json [ { "name": "Inv.: HMS/T/HM; BMS: Pylon-CAN ; MPPT P: 2-3; OLED", "nrf24": { "miso": -1, "mosi": -1, "clk": -1, "irq": -1, "en": -1, "cs": -1 }, "cmt": { "clk": 6, "cs": 4, "fcs": 21, "sdio": 5, "gpio2": -1, "gpio3": -1 }, "led": { "led0": 2, "led1": 1 }, "display": { "type": 3, "data": 9, "clk": 8, "cs": -1, "reset": -1 }, "victron": { "rx": 12, "tx": 11, "rx1": 10, "tx1": 17 }, "battery": { "rx": 18, "tx": 7 }, "powermeter": { "tx": 39, "rx": 40, "dere": -1 } }, { "name": "Inv.: HMS/T/HM; BMS: Pylon-CAN ; MPPT P: 2-3; OLED; W5500", "nrf24": { "miso": -1, "mosi": -1, "clk": -1, "irq": -1, "en": -1, "cs": -1 }, "cmt": { "clk": 6, "cs": 4, "fcs": 21, "sdio": 5, "gpio2": -1, "gpio3": -1 }, "w5500": { "mosi": 35, "miso": 48, "sclk": 36, "cs": 37, "int": 47, "rst": 38 }, "led": { "led0": 2, "led1": 1 }, "display": { "type": 3, "data": 9, "clk": 8, "cs": -1, "reset": -1 }, "victron": { "rx": 12, "tx": 11, "rx1": 10, "tx1": 17 }, "battery": { "rx": 18, "tx": 7 }, "powermeter": { "tx": 39, "rx": 40, "dere": -1 } } ]```

@drahdiwaberl
Copy link

following the discussions and inputs on discord, having 3 single phase inverters (2 PV, 1 battery) at my house, several rather high single phase loads and a limit of unbalanced loads of 3.7kW ..

if it were possible (and from what i read so far i assume it is) to make the DPL work 'per phase', i.e. having meter readings per phase and set 3 inverter(phase)s according to these, then this probably would make a lot of sense to have as a strategy. esp. for the setups people are using OpenDTU for.

arguments for preferring to use as little inverters as possible for efficiency reasons for sure are valid either, but i'm not sure this needs to be first priority with the small loads/powers the majority of users are dealing with in these setups.

my2c.

@drahdiwaberl
Copy link

written it, went on thinking..

actually any strategy should prefer serving the most strained phase as directly as possible (so if phase 1 had a high load on and there's potential production there it should be used) to avoid unbalanced loads..

@stefan123t
Copy link

stefan123t commented Nov 29, 2024

So you are advocating for a per inverter phase setting for A/B/C.

Here is the same request upstream tbnobody#1936 (comment) and here discussion about it and references to more issues / threads tbnobody#1325 (comment)

@schlimmchen
Copy link
Member Author

@drahdiwaberl Your input is valuable, but I want to point out that you are mixing things here. This issue originally was about "how to I handle multiple inverters if multiple are eligible to fulfill the desired total output". That question in your scenario is only relevant if there are multiple inverters per group/phase/powermeter reading.

Right now I don't see that we will support assinging inverters to a group/phase but still allow to increase production in another group/phase to meet the total need. That would certainly have to wait until managing inverters per group/phase is implemented and works well.

I created #1428 to keep track of support for grouping of inverters per powermeter value.

@dragricola
Copy link

@schlimmchen:
Ich denke, es ist ein guter Wirkungsgrad mindestens genauso wichtig, wie eine schnellen Reaktionszeit. Zu diesem Thema habe ich daher im photovoltaikforum einen Post abgesetzt und vom Forumsinventar AusmWW folgende Antwort bekommen, die mir sehr plausibel erscheint:

Zitat:

"Die Wirkungsgradkurve sieht für alle WR ähnlich aus, da diese von den verwendeten Halbleiter abhängt.
Im unteren Teillastbereich ist der Wirkungsgrad grottig, weil dort die abgerufene Leistung in der Größenordnung des Eigenverbrauchs liegt.
Bei sehr guten verwendeten Komponenten liegt der „Knick“ im Bereich von 5-10% der Nennleistung.
Wenn du auf der sicheren Seite liegen möchtest, schalte einen WR ab, wenn die abgegebene Leistung unter 15% der Nennleistung fällt.
Im Bereich von ca. 30% bis 50% ist der Wirkungsgrad am besten, weiter höher fällt dieser leicht ab.
Der Abfall des Wirkungsgrades nach oben ist relativ schwach, da würde ich eher den Focus auf eine möglichst geringe Anzahl an Schaltvorgängen achten.
Nach meinem Wissensstand würde sich für die beschriebene Konfiguration wenn, dann nur eine Regelung zur bestmöglichen Vermeidung des unteren Teillastbereichs lohnen. Das ergäbe dann die Abschaltbedingung.
Den 2. WR würde ich zuschalten, wenn der 1. WR bei ca. 80% seiner Nennlast ist.
Das ergibt dann eine relativ breite Regelhysterese die der Reduktion von Schaltvorgängen zugute kommt."

Zitat Ende

Man kann meine Anfrage und den thread gerne auch hier nachlesen:
https://www.photovoltaikforum.com/thread/239346-wirkungsgrad-als-funktion-der-leistung-bei-hoymiles-wechselrichtern-der-hm-serie/

Man könnte die zu aktivierenden Inverter nach folgenden Kriterien bestimmen:

Wenn mehr Leistung gefordert wird (Regelabweichung positiv):

  • Wenn kein Inverter läuft, schalte den Inverter mit max. 80% ein, der die geforderte Leistung mit einer Aussteuerung <80% liefern kann (In diesem Fall wäre auch eine Aussteuerung <15% zulässig). Wenn diese Leistung nicht ausreicht, schalte weitere Inverter nach gleichem Kriterium an.
  • Wenn mehrere aber nicht alle Inverter laufen und alle eingeschalteten Inverter laufen mit 80%, schalte weiteren Inverter zu, der die geforderte Leistung mit einer Aussteuerung <80% und >15% liefern kann. Wenn diese Leistung nicht ausreicht, schalte weitere Inverter sofern vorhanden nach gleichem Kriterium an.
  • Wenn alle Inverter mit 80% laufen, lasse höhere Aussteuergrade zu.

Wenn weniger Leistung gefordert wird (Regelabweichung negativ):

  • Wenn alle Inverter laufen und ein Inverter hat weniger als 15% Aussteuerung, schalte ihn ab.
  • Wenn nicht alle Inverter laufen und mindestens ein Inverter hat weniger als 15% Aussteuerung und ein anderer Inverter könnte mit Aussteuerung >15% die Leistung liefern, schalte auf ihn um.
  • Wenn nur ein Inverter läuft, der weniger als 15% Aussteuerung hat und ein anderer Inverter könnte mit Aussteuerung >15% die Leistung liefern, schalte auf ihn um.
  • Wenn nur ein Inverter läuft der weniger als 15% Aussteuerung hat und kein anderer Inverter könnte mit Aussteuerung >15% die Leistung liefern, lasse Aussteuergrade <15% zu.

Ich hoffe, dass ich keinen Fall vergessen habe!

Der vorhandene Algorithmus zur Ermittlung der Inverteraussteuerungen könnte dann bleiben und müsste sich auf die aktivierten Inverter unter Berücksichtigung der Limits der Aussteuergrade (>80% nur wenn alle Inverter laufen, <15% nur wenn ein einzelner Inverter läuft oder laufen soll) beschränken.

Eine solche Regelung dürfte auch dafür sorgen, dass die Inverter im Mittel etwa gleich ausgelastet werden und ausreichend vermeiden, dass sich ein Inverter überhitzt, da ab einer bestimmten Aussteuerung weitere Inverter entlastend zugeschaltet werden. Da sich die Inverter beim Betrieb an einer Batterie in einer kühleren Umgebung befinden als auf dem Dach unter einem PV-Modul ist die thermische Situation ohnehin nicht so kritisch.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

7 participants