no message

This commit is contained in:
belevo\mh
2026-02-09 09:00:49 +01:00
parent f89ff7f200
commit e12c192e2d

View File

@@ -97,46 +97,74 @@ class Batterie extends IPSModule
} }
private function GeneratePowerSteps($additionalValue) private function GeneratePowerSteps($additionalValue)
{ {
$maxleistung = GetValue($this->ReadPropertyInteger("MaxBatterieleistung")); $maxleistung_raw = GetValue($this->ReadPropertyInteger("MaxBatterieleistung"));
$stepSize = 250; // Schrittgröße $nachladen_raw = GetValue($this->ReadPropertyInteger("MaxNachladen"));
$stepSizeSmall = 50; // Kleine Schrittgröße
// Array direkt als Range erzeugen (schneller als Schleife) $stepSize = 250; // Grobe Schrittgröße
$array_powersteps = range(-$maxleistung, $maxleistung, $stepSize); $stepSizeSmall = 50; // Feine Schrittgröße
// Nächstgelegenen Wert direkt bestimmen (rundet auf den nächsten Step) // Grenzen auf 50er abrunden (floor)
$closestValue = round($additionalValue / $stepSize) * $stepSize; $maxleistung = (int)(floor($maxleistung_raw / $stepSizeSmall) * $stepSizeSmall);
$minleistung = (int)(-floor($nachladen_raw / $stepSizeSmall) * $stepSizeSmall); // negativ!
// Falls der Wert nicht im Bereich liegt, abbrechen // Sicherheitscheck: falls Werte komisch sind
if (!in_array($closestValue, $array_powersteps)) { if ($maxleistung < 0) $maxleistung = 0;
return $array_powersteps; if ($minleistung > 0) $minleistung = 0;
// Grundarray: von min bis max in 250er Schritten
$array_powersteps = range($minleistung, $maxleistung, $stepSize);
// Zusätzlichen Wert auf 50er abrunden (floor, nicht round!)
// (wichtig: floor bei negativen Zahlen geht "weiter runter", daher extra Logik)
$closestValue = (int)(floor($additionalValue / $stepSizeSmall) * $stepSizeSmall);
// Clamp in den Bereich
if ($closestValue < $minleistung) $closestValue = $minleistung;
if ($closestValue > $maxleistung) $closestValue = $maxleistung;
// Prüfen ob der Wert im Array existiert (bei 250er Raster oft NICHT)
$index = array_search($closestValue, $array_powersteps, true);
// Wenn nicht vorhanden: an der richtigen Stelle einsortieren
if ($index === false) {
$index = 0;
$count = count($array_powersteps);
while ($index < $count && $array_powersteps[$index] < $closestValue) {
$index++;
}
// $index ist jetzt Einfügeposition
} }
// Index des gefundenen Werts suchen // Feine Werte um closestValue herum (±4 * 50)
$index = array_search($closestValue, $array_powersteps); $newValues = [];
for ($i = -4; $i <= 4; $i++) {
$v = $closestValue + ($i * $stepSizeSmall);
if ($v >= $minleistung && $v <= $maxleistung) {
$newValues[] = $v;
}
}
// Zusätzliche Werte berechnen und auf MaxLeistung begrenzen // Duplikate vermeiden (falls schon Werte vorhanden sind)
$newValues = array_filter([ $newValues = array_values(array_unique($newValues));
$closestValue - 4 * $stepSizeSmall,
$closestValue - 3 * $stepSizeSmall,
$closestValue - 2 * $stepSizeSmall,
$closestValue - $stepSizeSmall,
$closestValue,
$closestValue + $stepSizeSmall,
$closestValue + 2 * $stepSizeSmall,
$closestValue + 3 * $stepSizeSmall,
$closestValue + 4 * $stepSizeSmall,
], function ($value) use ($maxleistung) {
return $value >= -$maxleistung && $value <= $maxleistung;
});
// Effizienteres Einfügen der Werte (direkt an der Stelle) // Wenn closestValue exakt im Grundarray war: diesen einen ersetzen
array_splice($array_powersteps, $index, 1, $newValues); // sonst: feinwerte einfach an der Einfügestelle einfügen
if (array_search($closestValue, $array_powersteps, true) !== false) {
$existingIndex = array_search($closestValue, $array_powersteps, true);
array_splice($array_powersteps, $existingIndex, 1, $newValues);
} else {
array_splice($array_powersteps, $index, 0, $newValues);
}
// Am Ende sortieren + Duplikate killen (sicher ist sicher)
$array_powersteps = array_values(array_unique($array_powersteps));
sort($array_powersteps, SORT_NUMERIC);
return $array_powersteps; return $array_powersteps;
} }