De basisversie van de verdeelfunctie (nb: het duiveltje is 2 sluit acculades):
function distributePower(batteries, targetPower, gridPower, mode) {
// Accu's compenseren de gridPower binnen toegestane targetPower limiet
let remainingPower = 0;
let totalPower = 0;
let buySell = 0;
let totalAvailable = Math.min(targetPower, batteries.reduce((sum, b) => sum + (mode === 'charge' ? b.maxCharge : b.maxDischarge), 0));
let powerPlan = batteries.map(battery => ({ battery: battery.id, power: 0, soc: battery.soc
);
for (let i = 0; i < batteries.length && totalAvailable > 0; i++) {
let battery = batteries[i];
let maxPossible = Math.min((mode === 'charge' ? battery.maxCharge : battery.maxDischarge), totalAvailable);
powerPlan[i].power = maxPossible;
totalAvailable -= maxPossible;
}
for (let i = 0; i < batteries.length ; i++) {
totalPower += powerPlan[i].power;
}
// laden/ontladen
totalPower = (mode === 'charge' ? totalPower : -1 * totalPower);
// buy of sell
buySell = gridPower + totalPower;
//remaining power
remainingPower = gridPower + totalPower;
//mode idle als totalPower == 0
mode = (totalPower === 0 ? 'idle' : mode);
//powerPlan: per accu
//buySell: kopen/verkopen
//remainingPower: hoofdmeter na charge/discharge
//totalPower: geladen/ontladen
//Mode: charge/discharge/idle
// waardes kunnen positief en negatief zijn
totalPower = Math.abs(totalPower);
//buySell = Math.abs(buySell);
return { powerPlan, gridPower, remainingPower, mode, totalPower, buySell};
object als resultaat:
function distributePower(batteries, targetPower, gridPower, mode) {
// Accu's compenseren de gridPower binnen toegestane targetPower limiet
let remainingPower = 0;
let totalPower = 0;
let buySell = 0;
let totalAvailable = Math.min(targetPower, batteries.reduce((sum, b) => sum + (mode === 'charge' ? b.maxCharge : b.maxDischarge), 0));
let powerPlan = batteries.map(battery => ({ battery: battery.id, power: 0, soc: battery.soc
for (let i = 0; i < batteries.length && totalAvailable > 0; i++) {
let battery = batteries[i];
let maxPossible = Math.min((mode === 'charge' ? battery.maxCharge : battery.maxDischarge), totalAvailable);
powerPlan[i].power = maxPossible;
totalAvailable -= maxPossible;
}
for (let i = 0; i < batteries.length ; i++) {
totalPower += powerPlan[i].power;
}
// laden/ontladen
totalPower = (mode === 'charge' ? totalPower : -1 * totalPower);
// buy of sell
buySell = gridPower + totalPower;
//remaining power
remainingPower = gridPower + totalPower;
//mode idle als totalPower == 0
mode = (totalPower === 0 ? 'idle' : mode);
//powerPlan: per accu
//buySell: kopen/verkopen
//remainingPower: hoofdmeter na charge/discharge
//totalPower: geladen/ontladen
//Mode: charge/discharge/idle
// waardes kunnen positief en negatief zijn
totalPower = Math.abs(totalPower);
//buySell = Math.abs(buySell);
return { powerPlan, gridPower, remainingPower, mode, totalPower, buySell};
object als resultaat:
[ Voor 16% gewijzigd door JanAllElectric op 07-06-2025 14:47 ]
Panasonic TCAP 12kW J-versie + Heishamon/HA/Node-Red/Grafana/InfluxDB; Atlantic v3 200L; 5* jaga strada 21 & zelfbouw DBE; 3*2400Wp (O,Z,W); KIA EV6 77kWh RWD + EVCC/cFos Wallbox solar; 3* Marstek 5kWh (v151)+CT003 (v114)+ modbus/lilygo/node-red/HA
:strip_exif()/f/image/drLw1EUTmufp64ajSCc0j2XS.jpg?f=fotoalbum_large)
:strip_exif()/f/image/UkQ4earKXTJQvr7xNyGbDQgF.jpg?f=fotoalbum_large)
:strip_exif()/f/image/gDpzojka6vG9ux89J0GRFouG.jpg?f=fotoalbum_large)
:strip_exif()/f/image/s3bh04u3bLZozP5fsOLWvysp.jpg?f=fotoalbum_large)
/f/image/zKsygLgfETrRJQ8PWx6OdYlF.png?f=fotoalbum_large)
/f/image/r37ZsZoeIN6lzetKByewV80h.png?f=fotoalbum_large)
:strip_exif()/f/image/MKngcb83kMoMwltVc6SuKzN0.jpg?f=fotoalbum_large)
:strip_exif()/f/image/AtFqW2OXH02ZpqMq3YuDWSmL.jpg?f=fotoalbum_large)
:strip_exif()/f/image/feUU5rCQPnNz1E1kuYiolO8L.jpg?f=fotoalbum_large)
:strip_exif()/f/image/C5tfxByK1mivc3IlrkDEukn5.jpg?f=fotoalbum_large)
:strip_exif()/f/image/b4Pyno2Fhjc23tSfKysOa9Dv.jpg?f=fotoalbum_large)
:strip_exif()/f/image/pK5M7Pety75dL8C6pB004sQ4.jpg?f=fotoalbum_large)
:strip_exif()/f/image/n80khoFIlPPUWrOyx959W3e7.jpg?f=fotoalbum_large)
:strip_exif()/f/image/tGpQ8MmnwrcBuvsJOGqk1JLX.jpg?f=fotoalbum_large)
:strip_exif()/f/image/O4rv8bQDzBBPzcDcjj3Y25LP.jpg?f=fotoalbum_large)
:strip_exif()/f/image/MmdH71imdXAUct8GUz5sh2j8.png?f=user_large)
:strip_exif()/f/image/QFlvwOe811kfa0yH3d9H7mRW.jpg?f=fotoalbum_large)
:strip_exif()/f/image/NdeNaTIMm9fNKi6oM3GObyOG.jpg?f=fotoalbum_large)
:strip_exif()/f/image/jTgZImIoeCBxLwX0hvaDXeyI.jpg?f=fotoalbum_large)
:strip_exif()/f/image/U76u24tOr1Br2PVme7aTrx1O.jpg?f=fotoalbum_large)
/f/image/WXsOhJs7edduVnbXKAjDUqNK.png?f=fotoalbum_large)
/f/image/VJisfUrEXYee8OVawgyq5Rhk.png?f=fotoalbum_large)
/f/image/s6UurvvwvYPVqPhXbnazOeUv.png?f=fotoalbum_large)
:strip_exif()/f/image/tJBp9A5rSdRVWFyTmJR9TGpp.png?f=user_large)
/f/image/lXn9pGCyY6HwK7LK8nxBtDbb.png?f=fotoalbum_large)
:strip_exif()/f/image/ryGakSPVSNlvlcFizM0mIaYp.png?f=user_large)
/f/image/BWrkgFiUhzv21H3ZEBLvYzU7.png?f=fotoalbum_large)
:strip_exif()/f/image/OPJ63maWlxUHAd8p6MLWGpPR.png?f=user_large)
:strip_exif()/f/image/XMuynZ0ng728X6WzW1xyIF2z.png?f=user_large)
:strip_exif()/f/image/cDJNJ9fv0FCtG3yQwVfVJr3T.png?f=user_large)
:strip_exif()/f/image/paZg0bfd2o3YQ72cMNx9O1JX.png?f=user_large)
/f/image/GQaoRj7b9PYXSxTP5AxFhsrp.png?f=fotoalbum_large)
/f/image/OFmsm0trHSTuv0SJ2iW2XH49.png?f=fotoalbum_large)
/f/image/xhWdA4nCbIqatIz9nZgI9hLk.png?f=fotoalbum_large)
/f/image/idV5sHgV2a3BZSFd9HocSLeF.png?f=fotoalbum_large)
:strip_exif()/f/image/p45vb37wAZZRGaS5P4PTRNF4.jpg?f=fotoalbum_large)
:strip_exif()/f/image/qS9k7FID5h0QLswD6SwP55AT.jpg?f=fotoalbum_large)
:strip_exif()/f/image/uaXjLPYEndLNV6DldXa0RZzj.jpg?f=fotoalbum_large)
:strip_exif()/f/image/rQVtEqiO6MZPIjemFV0WqtXj.jpg?f=fotoalbum_large)
/f/image/Vxtc6pec1694RbxHAowl2kmX.png?f=fotoalbum_large)
/f/image/Tb3a9790PNsfgQa5lpdkNnhs.png?f=fotoalbum_large)
/f/image/7zutPKJcZYw3weF7pYBHYNrA.png?f=fotoalbum_large)
/f/image/fIE7JFelX87PjEiSEseKqkh4.png?f=fotoalbum_large)
/f/image/TQmRgT6PWxpgzlU6GTnXL3O7.png?f=fotoalbum_large)
/f/image/34Kp9M0U5dbifUjVjzis7Bo6.png?f=fotoalbum_large)
:strip_exif()/f/image/QActyMs86mW9GbmXF6NG2HRL.png?f=user_large)
/f/image/QVLkYc6ADjSBd58KIRLpZXvy.png?f=fotoalbum_large)
:no_upscale():strip_icc():strip_exif()/f/image/taci9AhV5dxBWLwk1jMyM0HS.jpg?f=user_large)
/f/image/xc7prqf86ozx1SiS72Zc7gjM.png?f=fotoalbum_large)
/f/image/aak43yGX5nmSqL33mhrneKrP.png?f=fotoalbum_large)
/f/image/z9j4vwZQW5Gzss1wSa65gbpF.png?f=fotoalbum_large)
:strip_exif()/f/image/d25uGabAMasRLwwTFmhPfYrF.png?f=user_large)
/f/image/PPjjmq9dWL0WE7ZzGqfx1bVd.png?f=fotoalbum_large)
