Tests / test (push) Failing after 1m12s
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.
152 lines
6.1 KiB
PHP
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|