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, ]; } }