Files
Enelix-EMS/tests/BatterieReglerTest.php
T
dh 8d83b083bf
Tests / test (push) Successful in 48s
feat(batterie): Nachladeleistung begrenzen
2026-10-01 15:56:23 +00:00

243 lines
7.2 KiB
PHP

<?php
declare(strict_types=1);
namespace Belevo\EnelixEMS\Tests;
use Belevo\EnelixEMS\BatterieRegler;
use InvalidArgumentException;
use PHPUnit\Framework\TestCase;
final class BatterieReglerTest extends TestCase
{
public function testLeistungsbereichBleibtInnerhalbDynamischerGrenzen(): void
{
self::assertSame(
[['Von_W' => -999, 'Bis_W' => 1000]],
BatterieRegler::leistungsangebot(
true, true, false, 50.0, 20.0, 10.0, false,
0.0, 0.0, 1000.9, 999.9
)
);
}
public function testHystereseSchaltetAnDenBisherigenGrenzen(): void
{
self::assertTrue(BatterieRegler::hystereseAktiv(20.0, 20.0, 2.0, false));
self::assertTrue(BatterieRegler::hystereseAktiv(21.0, 20.0, 2.0, true));
self::assertFalse(BatterieRegler::hystereseAktiv(22.1, 20.0, 2.0, true));
}
public function testPvAngebotVerwendetStufenloseBereicheMitBisherigerSocLogik(): void
{
self::assertSame(
[['Von_W' => -1000, 'Bis_W' => 1000]],
BatterieRegler::leistungsangebot(
true, true, false, 50.0, 20.0, 10.0, false,
0.0, 0.0, 1000.0, 1000.0
)
);
self::assertSame(
[1000],
BatterieRegler::leistungsangebot(
true, true, false, 19.0, 20.0, 10.0, true,
0.0, 0.0, 1000.0, 1000.0
)
);
self::assertSame(
[['Von_W' => -1000, 'Bis_W' => 0]],
BatterieRegler::leistungsangebot(
true, true, false, 100.0, 20.0, 10.0, false,
0.0, 0.0, 1000.0, 1000.0
)
);
}
public function testPeakAngebotBeruecksichtigtNetzUndAktuelleBatterieleistung(): void
{
self::assertSame(
[-500],
BatterieRegler::leistungsangebot(
true, true, true, 50.0, 20.0, 10.0, false,
700.0, 200.0, 1000.0, 1000.0
)
);
}
public function testPeakEinschraenkungenWerdenAlsBereicheGemeldet(): void
{
self::assertSame(
[['Von_W' => -1000, 'Bis_W' => 0]],
BatterieRegler::leistungsangebot(
true, true, true, 21.0, 20.0, 10.0, true,
0.0, 0.0, 1000.0, 1000.0
)
);
self::assertSame(
[['Von_W' => 0, 'Bis_W' => 1000]],
BatterieRegler::leistungsangebot(
true, true, true, 10.0, 20.0, 10.0, true,
0.0, 0.0, 1000.0, 1000.0
)
);
}
public function testNachladeleistungBegrenztNurSchutzbedingtesLaden(): void
{
self::assertSame(
[400],
BatterieRegler::leistungsangebot(
true, true, false, 19.0, 20.0, 10.0, true,
0.0, 0.0, 1000.0, 1000.0, 400.0
)
);
self::assertSame(
[['Von_W' => 0, 'Bis_W' => 400]],
BatterieRegler::leistungsangebot(
true, true, true, 10.0, 20.0, 10.0, true,
0.0, 0.0, 1000.0, 1000.0, 400.0
)
);
self::assertSame(
[['Von_W' => -1000, 'Bis_W' => 400]],
BatterieRegler::leistungsangebot(
true, true, true, 15.0, 20.0, 10.0, true,
0.0, 0.0, 1000.0, 1000.0, 400.0
)
);
self::assertSame(
[['Von_W' => -1000, 'Bis_W' => 1000]],
BatterieRegler::leistungsangebot(
true, true, false, 50.0, 20.0, 10.0, false,
0.0, 0.0, 1000.0, 1000.0, 400.0
)
);
}
public function testWechselrichtersteuerungBietetNurNull(): void
{
self::assertSame(
[0],
BatterieRegler::leistungsangebot(
true, false, false, 50.0, 20.0, 10.0, false,
0.0, 0.0, 1000.0, 1000.0
)
);
}
public function testHerstellerunabhaengigeRegisterwerte(): void
{
self::assertSame(
[
'Ladeleistung' => 1500,
'Entladeleistung' => 0,
'Modus' => 0,
'Management' => 1,
],
BatterieRegler::registerwerte(
BatterieRegler::TYP_HERSTELLERUNABHAENGIG,
BatterieRegler::STEUERUNG_ENELIX,
1500
)
);
self::assertSame(
[
'Ladeleistung' => 0,
'Entladeleistung' => 1500,
'Modus' => 1,
'Management' => 1,
],
BatterieRegler::registerwerte(
BatterieRegler::TYP_HERSTELLERUNABHAENGIG,
BatterieRegler::STEUERUNG_ENELIX,
-1500
)
);
}
public function testGoodweRegisterwerte(): void
{
self::assertSame(
['Leistung' => 750, 'Modus' => 11, 'Management' => 2],
BatterieRegler::registerwerte(
BatterieRegler::TYP_GOODWE,
BatterieRegler::STEUERUNG_ENELIX,
750
)
);
self::assertSame(
['Leistung' => 750, 'Modus' => 12, 'Management' => 2],
BatterieRegler::registerwerte(
BatterieRegler::TYP_GOODWE,
BatterieRegler::STEUERUNG_ENELIX,
-750
)
);
self::assertSame(
['Leistung' => 0, 'Management' => 1],
BatterieRegler::registerwerte(
BatterieRegler::TYP_GOODWE,
BatterieRegler::STEUERUNG_WECHSELRICHTER,
-750
)
);
}
public function testSolarEdgeRegisterwerte(): void
{
self::assertSame(
[
'Ladeleistung' => 0,
'Entladeleistung' => 500,
'Modus' => 4,
'Management' => 4,
],
BatterieRegler::registerwerte(
BatterieRegler::TYP_SOLAREDGE,
BatterieRegler::STEUERUNG_ENELIX,
-500
)
);
}
public function testSigenergySkaliertLeistungAufKilowatt(): void
{
self::assertSame(
[
'Ladeleistung' => 1.5,
'Entladeleistung' => 0.0,
'Modus' => 3,
'Management' => 1,
],
BatterieRegler::registerwerte(
BatterieRegler::TYP_SIGENERGY,
BatterieRegler::STEUERUNG_ENELIX,
1500
)
);
self::assertSame(
[
'Ladeleistung' => 0.0,
'Entladeleistung' => 1.5,
'Modus' => 6,
'Management' => 1,
],
BatterieRegler::registerwerte(
BatterieRegler::TYP_SIGENERGY,
BatterieRegler::STEUERUNG_ENELIX,
-1500
)
);
}
public function testUngueltigeGrenzenWerdenAbgewiesen(): void
{
$this->expectException(InvalidArgumentException::class);
BatterieRegler::leistungsangebot(
true, true, false, 50.0, 20.0, 10.0, false,
0.0, 0.0, -1.0, 1000.0
);
}
}