112 lines
3.3 KiB
PHP
112 lines
3.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Belevo\EnelixUtils\Tests;
|
|
|
|
use Belevo\EnelixUtils\VirtuelleBatterieRegler;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
require_once __DIR__
|
|
. '/../VirtuelleBatterie/libs/VirtuelleBatterieRegler.php';
|
|
|
|
final class VirtuelleBatterieReglerTest extends TestCase
|
|
{
|
|
public function testAggregatIstKapazitaetsgewichtet(): void
|
|
{
|
|
$aggregat = VirtuelleBatterieRegler::aggregiere([
|
|
$this->batterie(0, 10.0, 20.0, 5000.0, 5000.0),
|
|
$this->batterie(1, 30.0, 80.0, 10000.0, 8000.0),
|
|
], 3000.0, 2000.0, 0.5);
|
|
|
|
self::assertSame(40.0, $aggregat['Kapazitaet_kWh']);
|
|
self::assertSame(65.0, $aggregat['Ladezustand_Prozent']);
|
|
self::assertSame(15000.0, $aggregat['MaxLaden_W']);
|
|
self::assertSame(13000.0, $aggregat['MaxEntladen_W']);
|
|
self::assertSame(2.5, $aggregat['SDLKapazitaet_kWh']);
|
|
self::assertSame(37.5, $aggregat['EigenverbrauchKapazitaet_kWh']);
|
|
}
|
|
|
|
public function testSDLHatBeiGleicherRichtungVorrang(): void
|
|
{
|
|
$aggregat = VirtuelleBatterieRegler::aggregiere([
|
|
$this->batterie(0, 20.0, 50.0, 10000.0, 10000.0),
|
|
], 6000.0, 6000.0, 0.5);
|
|
|
|
$auftrag = VirtuelleBatterieRegler::kombiniere(
|
|
8000.0,
|
|
6000.0,
|
|
$aggregat
|
|
);
|
|
|
|
self::assertSame(6000.0, $auftrag['SDL_W']);
|
|
self::assertSame(4000.0, $auftrag['Eigenverbrauch_W']);
|
|
self::assertSame(10000.0, $auftrag['Gesamt_W']);
|
|
}
|
|
|
|
public function testGegenlaeufigeAuftraegeWerdenNettoVerteilt(): void
|
|
{
|
|
$aggregat = VirtuelleBatterieRegler::aggregiere([
|
|
$this->batterie(0, 20.0, 50.0, 10000.0, 10000.0),
|
|
], 6000.0, 6000.0, 0.5);
|
|
|
|
$auftrag = VirtuelleBatterieRegler::kombiniere(
|
|
4000.0,
|
|
-3000.0,
|
|
$aggregat
|
|
);
|
|
|
|
self::assertSame(1000.0, $auftrag['Gesamt_W']);
|
|
self::assertSame(-3000.0, $auftrag['SDL_W']);
|
|
self::assertSame(4000.0, $auftrag['Eigenverbrauch_W']);
|
|
}
|
|
|
|
public function testLadenBeginntBeiNiedrigstemLadezustand(): void
|
|
{
|
|
$verteilung = VirtuelleBatterieRegler::verteile(7000.0, [
|
|
$this->batterie(0, 10.0, 80.0, 5000.0, 5000.0),
|
|
$this->batterie(1, 10.0, 20.0, 5000.0, 5000.0),
|
|
]);
|
|
|
|
self::assertSame(2000.0, $verteilung[0]);
|
|
self::assertSame(5000.0, $verteilung[1]);
|
|
}
|
|
|
|
public function testIstleistungOrdnetSDLZuerstZu(): void
|
|
{
|
|
self::assertSame(
|
|
['Eigenverbrauch_W' => 4000.0, 'SDL_W' => -3000.0],
|
|
VirtuelleBatterieRegler::ordneIstleistungZu(1000.0, -3000.0)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @return array{
|
|
* Index:int,
|
|
* Name:string,
|
|
* Kapazitaet_kWh:float,
|
|
* MaxLaden_W:float,
|
|
* MaxEntladen_W:float,
|
|
* Ladezustand_Prozent:float,
|
|
* Istleistung_W:float
|
|
* }
|
|
*/
|
|
private function batterie(
|
|
int $index,
|
|
float $kapazitaet,
|
|
float $ladezustand,
|
|
float $maxLaden,
|
|
float $maxEntladen
|
|
): array {
|
|
return [
|
|
'Index' => $index,
|
|
'Name' => 'Batterie ' . $index,
|
|
'Kapazitaet_kWh' => $kapazitaet,
|
|
'MaxLaden_W' => $maxLaden,
|
|
'MaxEntladen_W' => $maxEntladen,
|
|
'Ladezustand_Prozent' => $ladezustand,
|
|
'Istleistung_W' => 0.0,
|
|
];
|
|
}
|
|
}
|