= $zielLadezustand && $ladezustand <= $zielLadezustand + 1.0 ) { return 0.0; } $ziel = $ladezustand < $zielLadezustand ? abs($ladeleistung) : -abs($entladeleistung); $ziel = self::begrenzeSetpoint($geraeteart, $ziel, $maximum); return self::begrenzeNachLadezustand( $geraeteart, $ziel, $ladezustand, $minLadezustand, $maxLadezustand ); } private static function begrenzeNachLadezustand( int $geraeteart, float $zielW, float $ladezustand, float $minimum, float $maximum ): float { if ($geraeteart === self::GERAETEART_PV) { return $zielW; } if ($minimum < 0.0 || $maximum > 100.0 || $minimum > $maximum ) { throw new InvalidArgumentException( 'MinSoC und MaxSoC sind ungueltig.' ); } if (($zielW < 0.0 && $ladezustand <= $minimum) || ($zielW > 0.0 && $ladezustand >= $maximum) ) { return 0.0; } return $zielW; } private static function pruefeGeraeteart(int $geraeteart): void { if (!in_array($geraeteart, [ self::GERAETEART_PV, self::GERAETEART_BATTERIE, ], true)) { throw new InvalidArgumentException('Geraeteart ist ungueltig.'); } } }