no message

This commit is contained in:
mh
2026-08-19 14:07:43 +02:00
parent 6dd38afdc2
commit d254eaa60f
4 changed files with 202 additions and 14 deletions
+5
View File
@@ -48,6 +48,11 @@ Go-e-Fahrzeugstatus. Die tatsächlich verwendeten Phasen werden aus den drei
gemessenen Strömen des `nrg`-Arrays bestimmt. Der maximale Ladestrom wird durch
die Stations-, Kabel- und Modulgrenze begrenzt.
`Auto fertig geladen` wird bei Go-E erst gesetzt, wenn die Ladung freigegeben
ist, der Fahrzeugstatus 4 anliegt und während 90 Sekunden weniger als 100 W
fließen. Bei einer durch das Modul angeforderten 0-W-Pause wird der
`Pending_Counter` zurückgesetzt. Die Easee-Erkennung bleibt davon unberührt.
### Smart-Me Pico
Typ 3 erkennt ein verbundenes Fahrzeug über den Pico-Ladestatus. Die
+96 -7
View File
@@ -711,15 +711,19 @@ class Ladestation extends IPSModule
bool $carDetected,
bool $carIsFull,
$isOnePhase,
float $maxCurrent
float $maxCurrent,
bool $resetPendingCounter = true
): bool {
$wasDetected = $this->GetValue("Car_detected");
$wasOnePhase = $this->GetValue("Is_1_ph");
$this->SetValue("Pending_Counter", 0);
if ($resetPendingCounter) {
$this->SetValue("Pending_Counter", 0);
}
$this->SetValue("Max_Current", $maxCurrent);
if (!$carDetected) {
$this->SetValue("Pending_Counter", 0);
$this->SetValue("Car_detected", false);
$this->SetValue("Car_is_full", false);
$this->SetValue("Leistung_Delta", 0);
@@ -777,6 +781,70 @@ class Ladestation extends IPSModule
return $maxCurrent;
}
private function IsGoEChargingEnabled(array $data, int $stationType): bool
{
if ($stationType === 1 && array_key_exists("alw", $data)) {
return (int)$data["alw"] === 1;
}
if ($stationType === 2 && array_key_exists("frc", $data)) {
return (int)$data["frc"] === 2;
}
if (array_key_exists("alw", $data)) {
return (int)$data["alw"] === 1;
}
return $this->GetBuffer("GoEChargingEnabled") === "1";
}
private function DetectGoEFullCharge(
array $data,
int $stationType,
int $carState,
$chargingPowerWatts
): bool {
$wasFull = $this->GetValue("Car_is_full");
// Ein einmal sicher erkanntes Ladeende bleibt bis zum Abstecken oder
// bis zu einer tatsächlich wieder aufgenommenen Ladung erhalten.
if ($wasFull) {
if (
is_numeric($chargingPowerWatts) &&
abs((float)$chargingPowerWatts) >= 100
) {
$this->SetValue("Pending_Counter", 0);
return false;
}
return true;
}
// car=4 alleine ist nicht ausreichend: Go-E meldet diesen Status auch,
// wenn die Regelung die Ladung absichtlich unterbricht.
if (
$carState !== 4 ||
!$this->IsGoEChargingEnabled($data, $stationType) ||
!is_numeric($chargingPowerWatts) ||
abs((float)$chargingPowerWatts) >= 100
) {
$this->SetValue("Pending_Counter", 0);
return false;
}
$counter = $this->GetValue("Pending_Counter") + 1;
$this->SetValue("Pending_Counter", $counter);
$interval = max(1, $this->ReadPropertyInteger("Interval"));
$requiredCycles = max(1, (int)ceil(90 / $interval));
if ($counter < $requiredCycles) {
return false;
}
$this->SetValue("Pending_Counter", 0);
return true;
}
private function DetectGoECar(int $stationType): bool
{
$path = $stationType === 1 ? "/mqtt?payload=" : "/api/status";
@@ -796,6 +864,7 @@ class Ladestation extends IPSModule
$this->SetValue("Fahrzeugstatus", $carState);
$isOnePhase = null;
$chargingPowerWatts = null;
if (isset($data["nrg"]) && is_array($data["nrg"])) {
$currentFactor = $stationType === 1 ? 0.1 : 1.0;
$phaseCurrents = [];
@@ -809,18 +878,28 @@ class Ladestation extends IPSModule
if (isset($data["nrg"][11]) && is_numeric($data["nrg"][11])) {
$powerFactor = $stationType === 1 ? 10 : 1;
$chargingPowerWatts = (float)$data["nrg"][11] * $powerFactor;
$this->SetValue(
"Ladeleistung_Effektiv",
round((float)$data["nrg"][11] * $powerFactor)
round($chargingPowerWatts)
);
}
}
$carDetected = in_array($carState, [2, 3, 4, 5], true);
$carIsFull = $carDetected && $this->DetectGoEFullCharge(
$data,
$stationType,
$carState,
$chargingPowerWatts
);
return $this->ApplyDirectStationDetection(
in_array($carState, [2, 3, 4, 5], true),
$carState === 4,
$carDetected,
$carIsFull,
$isOnePhase,
$this->GetGoEMaxCurrent($data)
$this->GetGoEMaxCurrent($data),
false
);
}
@@ -1428,7 +1507,11 @@ class Ladestation extends IPSModule
}
}
} else {
} elseif (!in_array(
$this->ReadPropertyInteger("Ladestation"),
[1, 2],
true
)) {
$this->SetValue("Pending_Counter", 0);
}
@@ -1490,6 +1573,9 @@ class Ladestation extends IPSModule
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (($stationType === 1 || $stationType === 2) && $response !== false) {
$this->SetBuffer("GoEChargingEnabled", "0");
}
curl_close($ch);
return $response;
} elseif ($value >= 1 && $value <= 32) {
@@ -1531,6 +1617,9 @@ class Ladestation extends IPSModule
curl_close($ch);
return "Error:" . curl_error($ch);
}
if ($stationType === 1 || $stationType === 2) {
$this->SetBuffer("GoEChargingEnabled", "1");
}
curl_close($ch);
return;
} else {
+5
View File
@@ -48,6 +48,11 @@ Go-e-Fahrzeugstatus. Die tatsächlich verwendeten Phasen werden aus den drei
gemessenen Strömen des `nrg`-Arrays bestimmt. Der maximale Ladestrom wird durch
die Stations-, Kabel- und Modulgrenze begrenzt.
`Auto fertig geladen` wird bei Go-E erst gesetzt, wenn die Ladung freigegeben
ist, der Fahrzeugstatus 4 anliegt und während 90 Sekunden weniger als 100 W
fließen. Bei einer durch das Modul angeforderten 0-W-Pause wird der
`Pending_Counter` zurückgesetzt. Die Easee-Erkennung bleibt davon unberührt.
### Smart-Me Pico
Typ 3 erkennt ein verbundenes Fahrzeug über den Pico-Ladestatus. Die
+96 -7
View File
@@ -729,15 +729,19 @@ class Ladestation_v2 extends IPSModule
bool $carDetected,
bool $carIsFull,
$isOnePhase,
float $maxCurrent
float $maxCurrent,
bool $resetPendingCounter = true
): bool {
$wasDetected = $this->GetValue("Car_detected");
$wasOnePhase = $this->GetValue("Is_1_ph");
$this->SetValue("Pending_Counter", 0);
if ($resetPendingCounter) {
$this->SetValue("Pending_Counter", 0);
}
$this->SetValue("Max_Current", $maxCurrent);
if (!$carDetected) {
$this->SetValue("Pending_Counter", 0);
$this->SetValue("Car_detected", false);
$this->SetValue("Car_is_full", false);
$this->SetValue("Leistung_Delta", 0);
@@ -795,6 +799,70 @@ class Ladestation_v2 extends IPSModule
return $maxCurrent;
}
private function IsGoEChargingEnabled(array $data, int $stationType): bool
{
if ($stationType === 1 && array_key_exists("alw", $data)) {
return (int)$data["alw"] === 1;
}
if ($stationType === 2 && array_key_exists("frc", $data)) {
return (int)$data["frc"] === 2;
}
if (array_key_exists("alw", $data)) {
return (int)$data["alw"] === 1;
}
return $this->GetBuffer("GoEChargingEnabled") === "1";
}
private function DetectGoEFullCharge(
array $data,
int $stationType,
int $carState,
$chargingPowerWatts
): bool {
$wasFull = $this->GetValue("Car_is_full");
// Ein einmal sicher erkanntes Ladeende bleibt bis zum Abstecken oder
// bis zu einer tatsächlich wieder aufgenommenen Ladung erhalten.
if ($wasFull) {
if (
is_numeric($chargingPowerWatts) &&
abs((float)$chargingPowerWatts) >= 100
) {
$this->SetValue("Pending_Counter", 0);
return false;
}
return true;
}
// car=4 alleine ist nicht ausreichend: Go-E meldet diesen Status auch,
// wenn die Regelung die Ladung absichtlich unterbricht.
if (
$carState !== 4 ||
!$this->IsGoEChargingEnabled($data, $stationType) ||
!is_numeric($chargingPowerWatts) ||
abs((float)$chargingPowerWatts) >= 100
) {
$this->SetValue("Pending_Counter", 0);
return false;
}
$counter = $this->GetValue("Pending_Counter") + 1;
$this->SetValue("Pending_Counter", $counter);
$interval = max(1, $this->ReadPropertyInteger("Interval"));
$requiredCycles = max(1, (int)ceil(90 / $interval));
if ($counter < $requiredCycles) {
return false;
}
$this->SetValue("Pending_Counter", 0);
return true;
}
private function DetectGoECar(int $stationType): bool
{
$path = $stationType === 1 ? "/mqtt?payload=" : "/api/status";
@@ -814,6 +882,7 @@ class Ladestation_v2 extends IPSModule
$this->SetValue("Fahrzeugstatus", $carState);
$isOnePhase = null;
$chargingPowerWatts = null;
if (isset($data["nrg"]) && is_array($data["nrg"])) {
$currentFactor = $stationType === 1 ? 0.1 : 1.0;
$phaseCurrents = [];
@@ -827,18 +896,28 @@ class Ladestation_v2 extends IPSModule
if (isset($data["nrg"][11]) && is_numeric($data["nrg"][11])) {
$powerFactor = $stationType === 1 ? 10 : 1;
$chargingPowerWatts = (float)$data["nrg"][11] * $powerFactor;
$this->SetValue(
"Ladeleistung_Effektiv",
round((float)$data["nrg"][11] * $powerFactor)
round($chargingPowerWatts)
);
}
}
$carDetected = in_array($carState, [2, 3, 4, 5], true);
$carIsFull = $carDetected && $this->DetectGoEFullCharge(
$data,
$stationType,
$carState,
$chargingPowerWatts
);
return $this->ApplyDirectStationDetection(
in_array($carState, [2, 3, 4, 5], true),
$carState === 4,
$carDetected,
$carIsFull,
$isOnePhase,
$this->GetGoEMaxCurrent($data)
$this->GetGoEMaxCurrent($data),
false
);
}
@@ -1439,7 +1518,11 @@ class Ladestation_v2 extends IPSModule
}
}
} else {
} elseif (!in_array(
$this->ReadPropertyInteger("Ladestation"),
[1, 2],
true
)) {
$this->SetValue("Pending_Counter", 0);
}
@@ -1501,6 +1584,9 @@ class Ladestation_v2 extends IPSModule
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (($stationType === 1 || $stationType === 2) && $response !== false) {
$this->SetBuffer("GoEChargingEnabled", "0");
}
curl_close($ch);
return $response;
} elseif ($value >= 1 && $value <= 32) {
@@ -1542,6 +1628,9 @@ class Ladestation_v2 extends IPSModule
curl_close($ch);
return "Error:" . curl_error($ch);
}
if ($stationType === 1 || $stationType === 2) {
$this->SetBuffer("GoEChargingEnabled", "1");
}
curl_close($ch);
return;
} else {