'hybrid-1', 'Name' => 'Hybrid Ost', 'Typ' => 'hybrid', 'ACNennleistung_kW' => 10.0, 'ACEinspeisegrenze_kW' => 8.0, 'ACBezugsgrenze_kW' => 0.0, ]], JSON_THROW_ON_ERROR), json_encode([ [ 'ID' => 'pv-ost', 'Name' => 'Ostdach', 'DCLeistung_kWp' => 6.4, 'Neigung_Grad' => 25.0, 'Azimut_Grad' => -90.0, 'WechselrichterID' => 'hybrid-1', 'MPPT' => 'A', 'Modulanzahl' => 16, 'Modulleistung_Wp' => 400.0, ], [ 'ID' => 'pv-west', 'Name' => 'Westdach', 'DCLeistung_kWp' => 6.4, 'Neigung_Grad' => 25.0, 'Azimut_Grad' => 90.0, 'WechselrichterID' => 'hybrid-1', 'MPPT' => 'B', 'Modulanzahl' => 16, 'Modulleistung_Wp' => 400.0, ], ], JSON_THROW_ON_ERROR), json_encode([[ 'ID' => 'bat-1', 'Name' => 'Hausspeicher', 'Nennkapazitaet_kWh' => 13.5, 'Nutzkapazitaet_kWh' => 12.8, 'MaxLadeleistung_kW' => 5.0, 'MaxEntladeleistung_kW' => 5.0, 'WechselrichterID' => 'hybrid-1', 'Kopplung' => 'hybrid', ]], JSON_THROW_ON_ERROR), '2a518707-8d62-4d97-82ce-606c95726500' ); self::assertSame(Anlagentopologie::VERSION, $topologie['version']); self::assertSame(12.8, $topologie['summary']['pvDcKwp']); self::assertSame(10.0, $topologie['summary']['pvAcKw']); self::assertSame(12.8, $topologie['summary']['usableBatteryKwh']); self::assertSame([[ 'inverterId' => 'hybrid-1', 'acRatedKw' => 10.0, 'pvArrayIds' => ['pv-ost', 'pv-west'], 'batteryIds' => ['bat-1'], ]], $topologie['sharedAcLimits']); } public function testLeereTopologieBleibtFuerBestandsinstallationenGueltig(): void { $topologie = Anlagentopologie::ausJson( '[]', '[]', '[]', '2a518707-8d62-4d97-82ce-606c95726500' ); self::assertSame([], $topologie['inverters']); self::assertSame([], $topologie['pvArrays']); self::assertSame([], $topologie['batteries']); self::assertSame(0.0, $topologie['summary']['pvDcKwp']); } public function testPvFlaecheBenoetigtEinenVorhandenenPassendenWechselrichter(): void { $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('referenzierter Wechselrichter ist nicht vorhanden'); Anlagentopologie::ausJson( '[]', json_encode([[ 'ID' => 'pv-1', 'DCLeistung_kWp' => 5.0, 'Neigung_Grad' => 30.0, 'Azimut_Grad' => 0.0, 'WechselrichterID' => 'wr-fehlt', ]], JSON_THROW_ON_ERROR), '[]', '2a518707-8d62-4d97-82ce-606c95726500' ); } public function testDcBatterieBenoetigtEinenHybridwechselrichter(): void { $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('DC- und Hybridkopplung'); Anlagentopologie::ausJson( json_encode([[ 'ID' => 'bat-wr', 'Typ' => 'battery', 'ACNennleistung_kW' => 5.0, ]], JSON_THROW_ON_ERROR), '[]', json_encode([[ 'ID' => 'bat-1', 'Nennkapazitaet_kWh' => 10.0, 'Nutzkapazitaet_kWh' => 9.0, 'MaxLadeleistung_kW' => 4.0, 'MaxEntladeleistung_kW' => 4.0, 'WechselrichterID' => 'bat-wr', 'Kopplung' => 'dc', ]], JSON_THROW_ON_ERROR), '2a518707-8d62-4d97-82ce-606c95726500' ); } public function testModuldatenMuessenGemeinsamGesetztWerden(): void { $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Modulanzahl und Modulleistung'); Anlagentopologie::ausJson( json_encode([[ 'ID' => 'pv-wr', 'Typ' => 'pv', 'ACNennleistung_kW' => 5.0, ]], JSON_THROW_ON_ERROR), json_encode([[ 'ID' => 'pv-1', 'DCLeistung_kWp' => 6.0, 'Neigung_Grad' => 30.0, 'Azimut_Grad' => 0.0, 'WechselrichterID' => 'pv-wr', 'Modulanzahl' => 15, 'Modulleistung_Wp' => 0.0, ]], JSON_THROW_ON_ERROR), '[]', '2a518707-8d62-4d97-82ce-606c95726500' ); } }