Files
Enelix-EMS/tests/EnergieMessungTest.php
dh ebec355c96
Tests / test (push) Failing after 1m12s
feat(manager): account for SDL power and SOC separately
Add opt-in SDL measurement sources and independent visualization toggles. Exclude balancing power from household telemetry and new household energy. Preserve custom views and cover measurement, migration and Symcon 8.0 behavior.
2026-10-06 13:35:17 +00:00

152 lines
6.1 KiB
PHP

<?php
declare(strict_types=1);
namespace Belevo\EnelixEMS\Tests;
use Belevo\EnelixEMS\EnergieMessung;
use PHPUnit\Framework\TestCase;
final class EnergieMessungTest extends TestCase
{
public function testIntegriertVierLeistungenMitVorzeichenrichtung(): void
{
$werte = EnergieMessung::energieDeltas([
'PV' => 7200.0,
'Haus' => 3600.0,
'Netz' => -1800.0,
'Batterie' => 900.0,
], 300);
self::assertEqualsWithDelta(0.6, $werte['PVEnergie'], 0.000001);
self::assertEqualsWithDelta(0.3, $werte['Hausenergie'], 0.000001);
self::assertSame(0.0, $werte['NetzbezugEnergie']);
self::assertEqualsWithDelta(0.15, $werte['EinspeisungEnergie'], 0.000001);
self::assertEqualsWithDelta(0.075, $werte['BatterieLadenEnergie'], 0.000001);
self::assertSame(0.0, $werte['BatterieEntladenEnergie']);
self::assertSame(0.0, $werte['SDLLadenEnergie']);
self::assertSame(0.0, $werte['SDLEntladenEnergie']);
}
public function testTrenntBezugUndBatterieentladung(): void
{
$werte = EnergieMessung::energieDeltas([
'PV' => -10.0,
'Haus' => -10.0,
'Netz' => 1000.0,
'Batterie' => -2000.0,
], 3600);
self::assertSame(0.0, $werte['PVEnergie']);
self::assertSame(0.0, $werte['Hausenergie']);
self::assertSame(1.0, $werte['NetzbezugEnergie']);
self::assertSame(0.0, $werte['EinspeisungEnergie']);
self::assertSame(0.0, $werte['BatterieLadenEnergie']);
self::assertSame(2.0, $werte['BatterieEntladenEnergie']);
}
public function testBerechnetHausverbrauchAusDerAnlagenbilanz(): void
{
self::assertSame(2700.0, EnergieMessung::hausleistung(4200.0, -800.0, 700.0));
self::assertSame(3500.0, EnergieMessung::hausleistung(2000.0, 500.0, -1000.0));
self::assertSame(0.0, EnergieMessung::hausleistung(500.0, -1200.0, 0.0));
}
public function testBeruecksichtigtSDLVorDerBegrenzungDerHausleistung(): void
{
self::assertSame(1700.0, EnergieMessung::hausleistung(4200.0, -800.0, 700.0, 1000.0));
self::assertSame(3700.0, EnergieMessung::hausleistung(4200.0, -800.0, 700.0, -1000.0));
self::assertSame(1000.0, EnergieMessung::hausleistung(0.0, -1000.0, 0.0, -2000.0));
self::assertSame(0.0, EnergieMessung::hausleistung(500.0, 0.0, 0.0, 1000.0));
self::assertSame(
EnergieMessung::hausleistung(4200.0, -800.0, 700.0),
EnergieMessung::hausleistung(4200.0, -800.0, 700.0, 0.0)
);
}
public function testBerechnetHausenergieAusDenZaehlerdeltas(): void
{
self::assertSame(8.5, EnergieMessung::hausenergie(10.0, 2.0, 4.0, 1.5, 2.0));
self::assertSame(0.0, EnergieMessung::hausenergie(1.0, 0.0, 5.0, 0.0, 0.0));
}
public function testBereinigtHausenergieUmSDLLadungUndEntladung(): void
{
self::assertSame(5.5, EnergieMessung::hausenergie(10.0, 2.0, 4.0, 1.5, 2.0, 3.0, 0.0));
self::assertSame(11.5, EnergieMessung::hausenergie(10.0, 2.0, 4.0, 1.5, 2.0, 0.0, 3.0));
self::assertSame(7.5, EnergieMessung::hausenergie(10.0, 2.0, 4.0, 1.5, 2.0, 3.0, 2.0));
self::assertSame(1.0, EnergieMessung::hausenergie(0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 2.0));
self::assertSame(0.0, EnergieMessung::hausenergie(1.0, 0.0, 0.0, 0.0, 0.0, 2.0, 0.0));
self::assertSame(
EnergieMessung::hausenergie(10.0, 2.0, 4.0, 1.5, 2.0),
EnergieMessung::hausenergie(10.0, 2.0, 4.0, 1.5, 2.0, 0.0, 0.0)
);
}
public function testIntegriertSDLGetrenntVonBatterieUndHaus(): void
{
$leistungen = [
'PV' => 7200.0,
'Haus' => 3600.0,
'Netz' => -1800.0,
'Batterie' => 900.0,
'SDL' => 1800.0,
];
$laden = EnergieMessung::energieDeltas($leistungen, 300);
self::assertEqualsWithDelta(0.15, $laden['SDLLadenEnergie'], 0.000001);
self::assertSame(0.0, $laden['SDLEntladenEnergie']);
self::assertEqualsWithDelta(0.075, $laden['BatterieLadenEnergie'], 0.000001);
self::assertEqualsWithDelta(0.3, $laden['Hausenergie'], 0.000001);
$leistungen['SDL'] = -1800.0;
$entladen = EnergieMessung::energieDeltas($leistungen, 300);
self::assertSame(0.0, $entladen['SDLLadenEnergie']);
self::assertEqualsWithDelta(0.15, $entladen['SDLEntladenEnergie'], 0.000001);
self::assertSame($laden['Hausenergie'], $entladen['Hausenergie']);
self::assertSame($laden['BatterieLadenEnergie'], $entladen['BatterieLadenEnergie']);
$leistungen['SDL'] = 0.0;
$mitNull = EnergieMessung::energieDeltas($leistungen, 300);
unset($leistungen['SDL']);
self::assertSame($mitNull, EnergieMessung::energieDeltas($leistungen, 300));
}
public function testIgnoriertNichtEndlicheSDLWerte(): void
{
foreach ([INF, -INF, NAN] as $ungueltig) {
self::assertSame(2700.0, EnergieMessung::hausleistung(4200.0, -800.0, 700.0, $ungueltig));
self::assertSame(8.5, EnergieMessung::hausenergie(10.0, 2.0, 4.0, 1.5, 2.0, $ungueltig, $ungueltig));
$werte = EnergieMessung::energieDeltas([
'PV' => 0.0,
'Haus' => 1000.0,
'Netz' => 1000.0,
'Batterie' => 0.0,
'SDL' => $ungueltig,
], 3600);
self::assertSame(0.0, $werte['SDLLadenEnergie']);
self::assertSame(0.0, $werte['SDLEntladenEnergie']);
self::assertSame(1.0, $werte['Hausenergie']);
}
}
public function testIgnoriertUngueltigeDauerUndNichtEndlicheWerte(): void
{
foreach ([-1, 0] as $dauer) {
foreach ([-1000.0, 1000.0] as $sdl) {
$werte = EnergieMessung::energieDeltas([
'PV' => INF,
'Haus' => NAN,
'Netz' => 1000.0,
'Batterie' => -1000.0,
'SDL' => $sdl,
], $dauer);
foreach ($werte as $wert) {
self::assertSame(0.0, $wert);
}
}
}
}
}