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.
79 lines
2.5 KiB
PHP
79 lines
2.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Belevo\EnelixEMS;
|
|
|
|
final class EnergieMessung
|
|
{
|
|
private const WATTSEKUNDEN_PRO_KWH = 3600000.0;
|
|
|
|
public static function hausleistung(float $pv, float $netz, float $batterie, float $sdl = 0.0): float
|
|
{
|
|
return max(
|
|
0.0,
|
|
self::endlich($pv) + self::endlich($netz) - self::endlich($batterie) - self::endlich($sdl)
|
|
);
|
|
}
|
|
|
|
public static function hausenergie(
|
|
float $pv,
|
|
float $netzbezug,
|
|
float $netzeinspeisung,
|
|
float $batterieLaden,
|
|
float $batterieEntladen,
|
|
float $sdlLaden = 0.0,
|
|
float $sdlEntladen = 0.0
|
|
): float {
|
|
return max(
|
|
0.0,
|
|
self::endlich($pv)
|
|
+ self::endlich($netzbezug)
|
|
+ self::endlich($batterieEntladen)
|
|
- self::endlich($netzeinspeisung)
|
|
- self::endlich($batterieLaden)
|
|
- self::endlich($sdlLaden)
|
|
+ self::endlich($sdlEntladen)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param array{PV: float, Haus: float, Netz: float, Batterie: float, SDL?: float} $leistungen
|
|
* @return array{
|
|
* PVEnergie: float,
|
|
* Hausenergie: float,
|
|
* NetzbezugEnergie: float,
|
|
* EinspeisungEnergie: float,
|
|
* BatterieLadenEnergie: float,
|
|
* BatterieEntladenEnergie: float,
|
|
* SDLLadenEnergie: float,
|
|
* SDLEntladenEnergie: float
|
|
* }
|
|
*/
|
|
public static function energieDeltas(array $leistungen, int $sekunden): array
|
|
{
|
|
$faktor = max(0, $sekunden) / self::WATTSEKUNDEN_PRO_KWH;
|
|
$pv = self::endlich($leistungen['PV']);
|
|
$haus = self::endlich($leistungen['Haus']);
|
|
$netz = self::endlich($leistungen['Netz']);
|
|
$batterie = self::endlich($leistungen['Batterie']);
|
|
$sdl = self::endlich($leistungen['SDL'] ?? 0.0);
|
|
|
|
return [
|
|
'PVEnergie' => max(0.0, $pv) * $faktor,
|
|
'Hausenergie' => max(0.0, $haus) * $faktor,
|
|
'NetzbezugEnergie' => max(0.0, $netz) * $faktor,
|
|
'EinspeisungEnergie' => max(0.0, -$netz) * $faktor,
|
|
'BatterieLadenEnergie' => max(0.0, $batterie) * $faktor,
|
|
'BatterieEntladenEnergie' => max(0.0, -$batterie) * $faktor,
|
|
'SDLLadenEnergie' => max(0.0, $sdl) * $faktor,
|
|
'SDLEntladenEnergie' => max(0.0, -$sdl) * $faktor,
|
|
];
|
|
}
|
|
|
|
private static function endlich(float $wert): float
|
|
{
|
|
return is_finite($wert) ? $wert : 0.0;
|
|
}
|
|
}
|