diff --git a/Ladestation/README.md b/Ladestation/README.md index 8140d3b..1c74294 100644 --- a/Ladestation/README.md +++ b/Ladestation/README.md @@ -31,6 +31,9 @@ und zusätzlich durch `Max_Current_abs` begrenzt. Die Typen 1 bis 4 verwenden weiterhin unverändert die bisherige zeit- und leistungsbasierte Erkennung. Die Fahrzeugphasen werden anhand der tatsächlich gemessenen Leiterströme erkannt; alte Phasenwerte werden beim Trennen oder Neuverbinden verworfen. +Während einer Ladepause mit 0 W bleibt die zuletzt erkannte Phasenanzahl +erhalten. Sie ändert sich erst bei einer eindeutigen Strommessung oder beim +Abstecken des Fahrzeugs. Stromvorgaben von 0 bis 32 A werden ebenfalls über das Gateway gesendet. @@ -59,8 +62,9 @@ Ladestrom fließt. Beim Abstecken werden die erkannten Phasen zurückgesetzt. Typ 4 bleibt unverändert. Beim Update bestehender Instanzen wird die frühere Eigenschaft `Token_Easee` -automatisch entfernt und durch die Gateway-Zuordnung ersetzt. Die vorhandene -Modul- und Instanzidentität bleibt erhalten. +aus Kompatibilitätsgründen intern beibehalten, aber nicht mehr verwendet oder +im Formular angezeigt. Auch der frühere Token-Timer wird deaktiviert. Die +vorhandene Modul- und Instanzidentität bleibt erhalten. ## Einrichtung diff --git a/Ladestation/module.php b/Ladestation/module.php index fcfc46a..904c1b7 100644 --- a/Ladestation/module.php +++ b/Ladestation/module.php @@ -103,6 +103,12 @@ class Ladestation extends IPSModule IPS_SetHidden($this->GetIDForIdent("Easee_Gateway_Connected"), true); $this->SetBuffer("EaseeGatewayState", "{}"); + // Kompatibilität mit bestehenden Instanzen der ursprünglichen Version. + // Der Inhalt wird nicht mehr verwendet; die Easee-Anmeldung übernimmt + // ausschließlich das SignalR-Gateway. + $this->RegisterVariableString("Token_Intern", "Internes Token Easee"); + IPS_SetHidden($this->GetIDForIdent("Token_Intern"), true); + // Hilfsvariabeln für Idle zustand $this->RegisterPropertyInteger("IdleCounterMax", 2); $this->RegisterVariableInteger("IdleCounter", "IdleCounter", "", 0); @@ -113,44 +119,12 @@ class Ladestation extends IPSModule $this->SetValue("Idle", true); $this->RegisterTimer("Timer_Do_UserCalc_EVC",$this->ReadPropertyInteger("Interval")*1000,"IPS_RequestAction(" .$this->InstanceID .', "Do_UserCalc", "");'); + $this->RegisterTimer("Timer_Refresh_Token", 0, "IPS_RequestAction(" .$this->InstanceID .', "Refresh_Token", "");'); $this->RegisterVariableInteger("Mindestaldestrom", "Mindestaldestrom", "", 0); $this->EnableAction("Mindestaldestrom"); } - public function Migrate($JSONData) - { - parent::Migrate($JSONData); - - $data = json_decode($JSONData, true); - if (!is_array($data)) { - return ""; - } - - if (!isset($data["configuration"]) || !is_array($data["configuration"])) { - $data["configuration"] = []; - } - - $changed = false; - - // Nur das frühere Ladestation-Modul besaß diese Easee-Eigenschaft. - // Sie muss vor dem Aufbau der neuen V2-kompatiblen Instanz entfernt - // werden, weil die Zugangsdaten jetzt ausschließlich im Gateway liegen. - if (array_key_exists("Token_Easee", $data["configuration"])) { - unset($data["configuration"]["Token_Easee"]); - $changed = true; - } - - if (!array_key_exists("EaseeGatewayID", $data["configuration"])) { - // In Migrate keine Instanzfunktionen aufrufen: Die - // Instanzschnittstelle wird zu diesem Zeitpunkt erst aufgebaut. - $data["configuration"]["EaseeGatewayID"] = 0; - $changed = true; - } - - return $changed ? json_encode($data) : ""; - } - public function GetConfigurationForm() { $form = json_decode(file_get_contents(__DIR__ . "/form.json"), true); @@ -294,6 +268,8 @@ class Ladestation extends IPSModule false ); $this->SetTimerInterval("Timer_Do_UserCalc_EVC",$this->ReadPropertyInteger("Interval")*1000); + // Einen noch vorhandenen Token-Timer aus Altinstanzen sicher stilllegen. + $this->SetTimerInterval("Timer_Refresh_Token", 0); $stationType = $this->ReadPropertyInteger("Ladestation"); $usesEaseeGateway = $this->UsesEaseeGateway($stationType); IPS_SetHidden( @@ -365,6 +341,10 @@ class Ladestation extends IPSModule $this->ResetNullTimer(); break; + case "Refresh_Token": + $this->Refresh_Token(); + break; + case "Mindestaldestrom": $this->SetValue("Mindestaldestrom", (int)$Value); break; @@ -637,10 +617,12 @@ class Ladestation extends IPSModule { $outputPhase = (int)($state["110"] ?? 0); - // Ein explizit einphasiger Easee-Ausgang ist auch in IT-Netzen - // einphasig, obwohl dort Strom auf zwei Leitern gemessen wird. - if ($outputPhase >= 10 && $outputPhase <= 15) { - $this->SetValue("Is_1_ph", true); + // Bei Ladepause bzw. 0 W die zuletzt erkannte Fahrzeugphase behalten. + // Die Phasenvariable darf erst durch eine echte Strommessung wechseln. + if ( + array_key_exists("120", $state) && + abs((float)$state["120"]) < 0.1 + ) { return; } @@ -651,6 +633,17 @@ class Ladestation extends IPSModule } } + if ($activePhaseConductors === 0) { + return; + } + + // Ein explizit einphasiger Easee-Ausgang ist auch in IT-Netzen + // einphasig, obwohl dort Strom auf zwei Leitern gemessen wird. + if ($outputPhase >= 10 && $outputPhase <= 15) { + $this->SetValue("Is_1_ph", true); + return; + } + // Bei einem dreiphasig freigegebenen Ausgang kann ein einphasiges Auto // trotzdem nur auf einem Leiter Strom beziehen. Observation 110 allein // kann diesen Fahrzeugwechsel deshalb nicht erkennen. @@ -658,11 +651,6 @@ class Ladestation extends IPSModule $this->SetValue("Is_1_ph", true); } elseif ($activePhaseConductors >= 2) { $this->SetValue("Is_1_ph", false); - } elseif ( - ($outputPhase >= 20 && $outputPhase <= 22) || - $outputPhase === 30 - ) { - $this->SetValue("Is_1_ph", false); } } @@ -1068,6 +1056,13 @@ class Ladestation extends IPSModule // Timer-Status auf false setzen $this->SetValue("IsTimerActive_Null_Timer", false); } + + public function Refresh_Token() + { + // Kompatibilitätsfunktion für bestehende Instanzen. Das Gateway + // verwaltet die Easee-Anmeldung und benötigt diesen Timer nicht mehr. + $this->SetTimerInterval("Timer_Refresh_Token", 0); + } diff --git a/Ladestation_v2/README.md b/Ladestation_v2/README.md index c2c3a82..75ef068 100644 --- a/Ladestation_v2/README.md +++ b/Ladestation_v2/README.md @@ -31,6 +31,9 @@ und zusätzlich durch `Max_Current_abs` begrenzt. Die Typen 1 bis 4 verwenden weiterhin unverändert die bisherige zeit- und leistungsbasierte Erkennung. Die Fahrzeugphasen werden anhand der tatsächlich gemessenen Leiterströme erkannt; alte Phasenwerte werden beim Trennen oder Neuverbinden verworfen. +Während einer Ladepause mit 0 W bleibt die zuletzt erkannte Phasenanzahl +erhalten. Sie ändert sich erst bei einer eindeutigen Strommessung oder beim +Abstecken des Fahrzeugs. Stromvorgaben von 0 bis 32 A werden ebenfalls über das Gateway gesendet. diff --git a/Ladestation_v2/module.php b/Ladestation_v2/module.php index 5dfe2ea..2681e8b 100644 --- a/Ladestation_v2/module.php +++ b/Ladestation_v2/module.php @@ -635,10 +635,12 @@ class Ladestation_v2 extends IPSModule { $outputPhase = (int)($state["110"] ?? 0); - // Ein explizit einphasiger Easee-Ausgang ist auch in IT-Netzen - // einphasig, obwohl dort Strom auf zwei Leitern gemessen wird. - if ($outputPhase >= 10 && $outputPhase <= 15) { - $this->SetValue("Is_1_ph", true); + // Bei Ladepause bzw. 0 W die zuletzt erkannte Fahrzeugphase behalten. + // Die Phasenvariable darf erst durch eine echte Strommessung wechseln. + if ( + array_key_exists("120", $state) && + abs((float)$state["120"]) < 0.1 + ) { return; } @@ -649,6 +651,17 @@ class Ladestation_v2 extends IPSModule } } + if ($activePhaseConductors === 0) { + return; + } + + // Ein explizit einphasiger Easee-Ausgang ist auch in IT-Netzen + // einphasig, obwohl dort Strom auf zwei Leitern gemessen wird. + if ($outputPhase >= 10 && $outputPhase <= 15) { + $this->SetValue("Is_1_ph", true); + return; + } + // Bei einem dreiphasig freigegebenen Ausgang kann ein einphasiges Auto // trotzdem nur auf einem Leiter Strom beziehen. Observation 110 allein // kann diesen Fahrzeugwechsel deshalb nicht erkennen. @@ -656,11 +669,6 @@ class Ladestation_v2 extends IPSModule $this->SetValue("Is_1_ph", true); } elseif ($activePhaseConductors >= 2) { $this->SetValue("Is_1_ph", false); - } elseif ( - ($outputPhase >= 20 && $outputPhase <= 22) || - $outputPhase === 30 - ) { - $this->SetValue("Is_1_ph", false); } }