no message

This commit is contained in:
dh
2026-08-25 13:32:32 +02:00
parent 4491e244fb
commit 7c1b992729
2 changed files with 168 additions and 20 deletions
+84 -10
View File
@@ -278,7 +278,7 @@ class Ladestation extends IPSModule
// zurückgesetzt. // zurückgesetzt.
if ( if (
$stationType === 3 && $stationType === 3 &&
$this->GetBuffer("SmartMeFullDetectionVersion") !== "3" $this->GetBuffer("SmartMeFullDetectionVersion") !== "4"
) { ) {
$this->SetValue("Car_is_full", false); $this->SetValue("Car_is_full", false);
$this->SetValue("Pending_Counter", 0); $this->SetValue("Pending_Counter", 0);
@@ -287,7 +287,13 @@ class Ladestation extends IPSModule
(float)$this->ReadPropertyInteger("Max_Current_abs") (float)$this->ReadPropertyInteger("Max_Current_abs")
); );
$this->SetBuffer("SmartMeChargingEnabled", "0"); $this->SetBuffer("SmartMeChargingEnabled", "0");
$this->SetBuffer("SmartMeFullDetectionVersion", "3"); $this->SetBuffer("SmartMeLearnedMaxCurrent", "0");
$this->SetBuffer(
"SmartMeStationMaxCurrent",
(string)$this->ReadPropertyInteger("Max_Current_abs")
);
$this->SetBuffer("SmartMeMinStationCurrent", "6");
$this->SetBuffer("SmartMeFullDetectionVersion", "4");
} }
$usesEaseeGateway = $this->UsesEaseeGateway($stationType); $usesEaseeGateway = $this->UsesEaseeGateway($stationType);
@@ -987,6 +993,10 @@ class Ladestation extends IPSModule
$minStationCurrent = is_numeric($minStationCurrent) $minStationCurrent = is_numeric($minStationCurrent)
? max(1.0, (float)$minStationCurrent) ? max(1.0, (float)$minStationCurrent)
: 6.0; : 6.0;
$this->SetBuffer(
"SmartMeMinStationCurrent",
(string)$minStationCurrent
);
$maxDynamicCurrent = $chargingData["MaxDynamicCurrent"] ?? $maxDynamicCurrent = $chargingData["MaxDynamicCurrent"] ??
$chargingData["maxDynamicCurrent"] ?? null; $chargingData["maxDynamicCurrent"] ?? null;
@@ -1037,24 +1047,44 @@ class Ladestation extends IPSModule
} }
} }
$this->SetBuffer("SmartMeStationMaxCurrent", (string)$maxCurrent);
$carDetected = in_array($stationState, [2, 3, 4, 6], true); $carDetected = in_array($stationState, [2, 3, 4, 6], true);
$wasDetected = $this->GetValue("Car_detected");
$wasOnePhase = $this->GetValue("Is_1_ph");
$phaseChanged = is_bool($isOnePhase) &&
$wasDetected &&
$wasOnePhase !== $isOnePhase;
// Beim Abstecken, bei einem neuen Fahrzeug oder bei einem echten
// Phasenwechsel wird die zuvor gelernte Fahrzeug-/Kabelgrenze verworfen.
if (!$carDetected || !$wasDetected || $phaseChanged) {
$this->SetBuffer("SmartMeLearnedMaxCurrent", "0");
}
$learnedMaxCurrent = (float)$this->GetBuffer(
"SmartMeLearnedMaxCurrent"
);
$effectiveMaxCurrent = $maxCurrent;
if ($learnedMaxCurrent >= $minStationCurrent) {
$effectiveMaxCurrent = min($maxCurrent, $learnedMaxCurrent);
}
$wasFull = $this->GetValue("Car_is_full"); $wasFull = $this->GetValue("Car_is_full");
$carIsCharging = is_numeric($chargingPowerWatts) && $carIsCharging = is_numeric($chargingPowerWatts) &&
abs((float)$chargingPowerWatts) >= 100; abs((float)$chargingPowerWatts) >= 100;
$carIsFull = $carDetected && $wasFull && !$carIsCharging; $carIsFull = $carDetected && $wasFull && !$carIsCharging;
// Pico liefert die verfügbare Stations-/Gruppenobergrenze direkt über // Die API-Grenze bleibt die absolute Obergrenze. Eine bestätigte
// die API. Ein zuvor über den Soll-/Istvergleich gelernter Fahrzeugwert // Fahrzeug-/Kabelgrenze darf darunter liegen und bleibt erhalten,
// darf deshalb den möglichen Ladestrom nicht dauerhaft begrenzen. // solange dasselbe Fahrzeug mit derselben Phasenart angeschlossen ist.
if (!$carIsFull) { $this->SetValue("Max_Current", $effectiveMaxCurrent);
$this->SetValue("Max_Current", $maxCurrent);
}
return $this->ApplyDirectStationDetection( return $this->ApplyDirectStationDetection(
$carDetected, $carDetected,
$carIsFull, $carIsFull,
$isOnePhase, $isOnePhase,
$maxCurrent, $effectiveMaxCurrent,
false false
); );
} }
@@ -1572,6 +1602,14 @@ class Ladestation extends IPSModule
? max($availableSteps) ? max($availableSteps)
: 0; : 0;
$maxPowerStep = count($powerSteps) > 0 ? max($powerSteps) : 0; $maxPowerStep = count($powerSteps) > 0 ? max($powerSteps) : 0;
$picoAtMaximumRequest = $stationType !== 3 ||
(
$maxAvailablePower > 0 &&
$requestedPower >= (0.95 * $maxAvailablePower)
);
$picoCanEvaluate = $stationType !== 3 ||
$actualPower < 100 ||
$picoAtMaximumRequest;
$goEEnabled = !in_array($stationType, [1, 2], true) || $goEEnabled = !in_array($stationType, [1, 2], true) ||
$this->GetBuffer("GoEChargingEnabledFromStatus") === "1"; $this->GetBuffer("GoEChargingEnabledFromStatus") === "1";
$smartMeEnabled = $stationType !== 3 || $smartMeEnabled = $stationType !== 3 ||
@@ -1582,7 +1620,8 @@ class Ladestation extends IPSModule
$requestedPower > 0 && $requestedPower > 0 &&
$maxPowerStep > 0 && $maxPowerStep > 0 &&
$goEEnabled && $goEEnabled &&
$smartMeEnabled; $smartMeEnabled &&
$picoCanEvaluate;
$requestedMismatch = $requestedPower > (1.11 * $actualPower); $requestedMismatch = $requestedPower > (1.11 * $actualPower);
$availableMismatch = $maxAvailablePower < (1.11 * $actualPower); $availableMismatch = $maxAvailablePower < (1.11 * $actualPower);
@@ -1614,6 +1653,41 @@ class Ladestation extends IPSModule
$this->SetValue("Car_is_full", true); $this->SetValue("Car_is_full", true);
$this->ResetTimer(); $this->ResetTimer();
$this->ResetNullTimer(); $this->ResetNullTimer();
} elseif ($picoAtMaximumRequest) {
$minStationCurrent = max(
1.0,
(float)$this->GetBuffer(
"SmartMeMinStationCurrent"
)
);
$phaseDivisor = $this->GetValue("Is_1_ph")
? 230
: 1.71 * 400;
$actualCurrent = $actualPower / $phaseDivisor;
// Erst eine stabile Stromaufnahme mindestens
// nahe dem Stationsminimum darf als Kabel- oder
// Fahrzeuggrenze gespeichert werden.
if ($actualCurrent >= 0.9 * $minStationCurrent) {
$stationMaxCurrent = max(
$minStationCurrent,
(float)$this->GetBuffer(
"SmartMeStationMaxCurrent"
)
);
$learnedMaxCurrent = min(
$stationMaxCurrent,
$learnedMaxCurrent
);
$this->SetBuffer(
"SmartMeLearnedMaxCurrent",
(string)$learnedMaxCurrent
);
$this->SetValue(
"Max_Current",
$learnedMaxCurrent
);
}
} }
} else { } else {
$this->Calc_Max_Current($this->GetValue("Is_1_ph")); $this->Calc_Max_Current($this->GetValue("Is_1_ph"));
+84 -10
View File
@@ -288,7 +288,7 @@ class Ladestation_v2 extends IPSModule
// zurückgesetzt. // zurückgesetzt.
if ( if (
$stationType === 3 && $stationType === 3 &&
$this->GetBuffer("SmartMeFullDetectionVersion") !== "3" $this->GetBuffer("SmartMeFullDetectionVersion") !== "4"
) { ) {
$this->SetValue("Car_is_full", false); $this->SetValue("Car_is_full", false);
$this->SetValue("Pending_Counter", 0); $this->SetValue("Pending_Counter", 0);
@@ -297,7 +297,13 @@ class Ladestation_v2 extends IPSModule
(float)$this->ReadPropertyInteger("Max_Current_abs") (float)$this->ReadPropertyInteger("Max_Current_abs")
); );
$this->SetBuffer("SmartMeChargingEnabled", "0"); $this->SetBuffer("SmartMeChargingEnabled", "0");
$this->SetBuffer("SmartMeFullDetectionVersion", "3"); $this->SetBuffer("SmartMeLearnedMaxCurrent", "0");
$this->SetBuffer(
"SmartMeStationMaxCurrent",
(string)$this->ReadPropertyInteger("Max_Current_abs")
);
$this->SetBuffer("SmartMeMinStationCurrent", "6");
$this->SetBuffer("SmartMeFullDetectionVersion", "4");
} }
$usesEaseeGateway = $this->UsesEaseeGateway($stationType); $usesEaseeGateway = $this->UsesEaseeGateway($stationType);
@@ -1007,6 +1013,10 @@ class Ladestation_v2 extends IPSModule
$minStationCurrent = is_numeric($minStationCurrent) $minStationCurrent = is_numeric($minStationCurrent)
? max(1.0, (float)$minStationCurrent) ? max(1.0, (float)$minStationCurrent)
: 6.0; : 6.0;
$this->SetBuffer(
"SmartMeMinStationCurrent",
(string)$minStationCurrent
);
$maxDynamicCurrent = $chargingData["MaxDynamicCurrent"] ?? $maxDynamicCurrent = $chargingData["MaxDynamicCurrent"] ??
$chargingData["maxDynamicCurrent"] ?? null; $chargingData["maxDynamicCurrent"] ?? null;
@@ -1057,24 +1067,44 @@ class Ladestation_v2 extends IPSModule
} }
} }
$this->SetBuffer("SmartMeStationMaxCurrent", (string)$maxCurrent);
$carDetected = in_array($stationState, [2, 3, 4, 6], true); $carDetected = in_array($stationState, [2, 3, 4, 6], true);
$wasDetected = $this->GetValue("Car_detected");
$wasOnePhase = $this->GetValue("Is_1_ph");
$phaseChanged = is_bool($isOnePhase) &&
$wasDetected &&
$wasOnePhase !== $isOnePhase;
// Beim Abstecken, bei einem neuen Fahrzeug oder bei einem echten
// Phasenwechsel wird die zuvor gelernte Fahrzeug-/Kabelgrenze verworfen.
if (!$carDetected || !$wasDetected || $phaseChanged) {
$this->SetBuffer("SmartMeLearnedMaxCurrent", "0");
}
$learnedMaxCurrent = (float)$this->GetBuffer(
"SmartMeLearnedMaxCurrent"
);
$effectiveMaxCurrent = $maxCurrent;
if ($learnedMaxCurrent >= $minStationCurrent) {
$effectiveMaxCurrent = min($maxCurrent, $learnedMaxCurrent);
}
$wasFull = $this->GetValue("Car_is_full"); $wasFull = $this->GetValue("Car_is_full");
$carIsCharging = is_numeric($chargingPowerWatts) && $carIsCharging = is_numeric($chargingPowerWatts) &&
abs((float)$chargingPowerWatts) >= 100; abs((float)$chargingPowerWatts) >= 100;
$carIsFull = $carDetected && $wasFull && !$carIsCharging; $carIsFull = $carDetected && $wasFull && !$carIsCharging;
// Pico liefert die verfügbare Stations-/Gruppenobergrenze direkt über // Die API-Grenze bleibt die absolute Obergrenze. Eine bestätigte
// die API. Ein zuvor über den Soll-/Istvergleich gelernter Fahrzeugwert // Fahrzeug-/Kabelgrenze darf darunter liegen und bleibt erhalten,
// darf deshalb den möglichen Ladestrom nicht dauerhaft begrenzen. // solange dasselbe Fahrzeug mit derselben Phasenart angeschlossen ist.
if (!$carIsFull) { $this->SetValue("Max_Current", $effectiveMaxCurrent);
$this->SetValue("Max_Current", $maxCurrent);
}
return $this->ApplyDirectStationDetection( return $this->ApplyDirectStationDetection(
$carDetected, $carDetected,
$carIsFull, $carIsFull,
$isOnePhase, $isOnePhase,
$maxCurrent, $effectiveMaxCurrent,
false false
); );
} }
@@ -1585,6 +1615,14 @@ class Ladestation_v2 extends IPSModule
? max($availableSteps) ? max($availableSteps)
: 0; : 0;
$maxPowerStep = count($powerSteps) > 0 ? max($powerSteps) : 0; $maxPowerStep = count($powerSteps) > 0 ? max($powerSteps) : 0;
$picoAtMaximumRequest = $stationType !== 3 ||
(
$maxAvailablePower > 0 &&
$requestedPower >= (0.95 * $maxAvailablePower)
);
$picoCanEvaluate = $stationType !== 3 ||
$actualPower < 100 ||
$picoAtMaximumRequest;
$goEEnabled = !in_array($stationType, [1, 2], true) || $goEEnabled = !in_array($stationType, [1, 2], true) ||
$this->GetBuffer("GoEChargingEnabledFromStatus") === "1"; $this->GetBuffer("GoEChargingEnabledFromStatus") === "1";
$smartMeEnabled = $stationType !== 3 || $smartMeEnabled = $stationType !== 3 ||
@@ -1595,7 +1633,8 @@ class Ladestation_v2 extends IPSModule
$requestedPower > 0 && $requestedPower > 0 &&
$maxPowerStep > 0 && $maxPowerStep > 0 &&
$goEEnabled && $goEEnabled &&
$smartMeEnabled; $smartMeEnabled &&
$picoCanEvaluate;
$requestedMismatch = $requestedPower > (1.11 * $actualPower); $requestedMismatch = $requestedPower > (1.11 * $actualPower);
$availableMismatch = $maxAvailablePower < (1.11 * $actualPower); $availableMismatch = $maxAvailablePower < (1.11 * $actualPower);
@@ -1627,6 +1666,41 @@ class Ladestation_v2 extends IPSModule
$this->SetValue("Car_is_full", true); $this->SetValue("Car_is_full", true);
$this->ResetTimer(); $this->ResetTimer();
$this->ResetNullTimer(); $this->ResetNullTimer();
} elseif ($picoAtMaximumRequest) {
$minStationCurrent = max(
1.0,
(float)$this->GetBuffer(
"SmartMeMinStationCurrent"
)
);
$phaseDivisor = $this->GetValue("Is_1_ph")
? 230
: 1.71 * 400;
$actualCurrent = $actualPower / $phaseDivisor;
// Erst eine stabile Stromaufnahme mindestens
// nahe dem Stationsminimum darf als Kabel- oder
// Fahrzeuggrenze gespeichert werden.
if ($actualCurrent >= 0.9 * $minStationCurrent) {
$stationMaxCurrent = max(
$minStationCurrent,
(float)$this->GetBuffer(
"SmartMeStationMaxCurrent"
)
);
$learnedMaxCurrent = min(
$stationMaxCurrent,
$learnedMaxCurrent
);
$this->SetBuffer(
"SmartMeLearnedMaxCurrent",
(string)$learnedMaxCurrent
);
$this->SetValue(
"Max_Current",
$learnedMaxCurrent
);
}
} }
} else { } else {
$this->Calc_Max_Current($this->GetValue("Is_1_ph")); $this->Calc_Max_Current($this->GetValue("Is_1_ph"));