70 lines
2.0 KiB
PHP
70 lines
2.0 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
|
|
{
|
|
return max(
|
|
0.0,
|
|
self::endlich($pv) + self::endlich($netz) - self::endlich($batterie)
|
|
);
|
|
}
|
|
|
|
public static function hausenergie(
|
|
float $pv,
|
|
float $netzbezug,
|
|
float $netzeinspeisung,
|
|
float $batterieLaden,
|
|
float $batterieEntladen
|
|
): float {
|
|
return max(
|
|
0.0,
|
|
self::endlich($pv)
|
|
+ self::endlich($netzbezug)
|
|
+ self::endlich($batterieEntladen)
|
|
- self::endlich($netzeinspeisung)
|
|
- self::endlich($batterieLaden)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param array{PV: float, Haus: float, Netz: float, Batterie: float} $leistungen
|
|
* @return array{
|
|
* PVEnergie: float,
|
|
* Hausenergie: float,
|
|
* NetzbezugEnergie: float,
|
|
* EinspeisungEnergie: float,
|
|
* BatterieLadenEnergie: float,
|
|
* BatterieEntladenEnergie: 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']);
|
|
|
|
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,
|
|
];
|
|
}
|
|
|
|
private static function endlich(float $wert): float
|
|
{
|
|
return is_finite($wert) ? $wert : 0.0;
|
|
}
|
|
}
|