diff --git a/EaseeGateway/README.md b/EaseeGateway/README.md index 00a0960..d7151cc 100644 --- a/EaseeGateway/README.md +++ b/EaseeGateway/README.md @@ -10,3 +10,7 @@ Easee-Konto wird eine weitere Gateway-Instanz benötigt. Stromvorgaben werden von den Ladestationsinstanzen an das Gateway übergeben und von dort über die Easee-REST-API gesendet. + +Der benötigte WebSocket-Client wird nach dem Speichern der Easee-Zugangsdaten +automatisch erstellt und konfiguriert. Im WebSocket-Client muss keine URL +eingetragen werden. diff --git a/EaseeGateway/module.php b/EaseeGateway/module.php index 14213b5..cf03d59 100644 --- a/EaseeGateway/module.php +++ b/EaseeGateway/module.php @@ -37,7 +37,6 @@ class EaseeGateway extends IPSModule 'IPS_RequestAction(' . $this->InstanceID . ', "RefreshToken", 0);' ); - $this->RequireParent(self::WEBSOCKET_MODULE_ID); } public function ApplyChanges() @@ -68,6 +67,11 @@ class EaseeGateway extends IPSModule return; } + if (!$this->EnsureWebSocketParent()) { + $this->SetStatus(203); + return; + } + $this->SetTimerInterval("MaintainConnectionTimer", 10000); $this->SetTimerInterval("TokenRefreshTimer", 1800000); @@ -79,6 +83,39 @@ class EaseeGateway extends IPSModule $this->ConnectSignalR(); } + private function EnsureWebSocketParent(): bool + { + $instance = IPS_GetInstance($this->InstanceID); + $parentID = (int)$instance["ConnectionID"]; + + if ($parentID > 0) { + $parent = IPS_GetInstance($parentID); + if ($parent["ModuleInfo"]["ModuleID"] === self::WEBSOCKET_MODULE_ID) { + return true; + } + IPS_DisconnectInstance($this->InstanceID); + } + + $parentID = IPS_CreateInstance(self::WEBSOCKET_MODULE_ID); + if ($parentID <= 0) { + $this->SetLastError("WebSocket-Client konnte nicht erstellt werden"); + return false; + } + + IPS_SetName($parentID, "Easee SignalR WebSocket"); + $objectParentID = IPS_GetParent($this->InstanceID); + if ($objectParentID > 0) { + IPS_SetParent($parentID, $objectParentID); + } + + if (!IPS_ConnectInstance($this->InstanceID, $parentID)) { + $this->SetLastError("WebSocket-Client konnte nicht verbunden werden"); + return false; + } + + return true; + } + public function RequestAction($Ident, $Value) { switch ($Ident) { diff --git a/Ladestation_v2/README.md b/Ladestation_v2/README.md index 831bf83..7912c2e 100644 --- a/Ladestation_v2/README.md +++ b/Ladestation_v2/README.md @@ -29,6 +29,6 @@ Die Typen 1 bis 4 arbeiten unverändert und benötigen kein Easee-Gateway. 1. Eine Instanz `Easee SignalR Gateway` anlegen. 2. Easee-Benutzername und Passwort im Gateway eintragen. 3. In `Ladestation_v2` Typ 5 oder 6 sowie die Easee-Seriennummer wählen. -4. Die Ladestationsinstanz mit dem gewünschten Gateway verbinden. +4. Im Feld `Easee SignalR Gateway` die gewünschte Gateway-Instanz auswählen. Mehrere Easee-Ladestationen desselben Kontos verwenden gemeinsam ein Gateway. diff --git a/Ladestation_v2/form.json b/Ladestation_v2/form.json index 0e6274e..87ee376 100644 --- a/Ladestation_v2/form.json +++ b/Ladestation_v2/form.json @@ -98,6 +98,14 @@ "caption": "Variable API-Token für eCarUp", "suffix": "" }, + { + "type": "SelectInstance", + "name": "EaseeGatewayID", + "caption": "Easee SignalR Gateway", + "validModules": [ + "{7A1F1D4B-3E7D-4A3B-9E54-61C8C3B7F201}" + ] + }, { "type": "Label", "caption": "Die Typen 5 und 6 verwenden das verbundene Easee SignalR Gateway. Easee-Zugangsdaten werden im Gateway konfiguriert." diff --git a/Ladestation_v2/module.php b/Ladestation_v2/module.php index f02fd36..6394679 100644 --- a/Ladestation_v2/module.php +++ b/Ladestation_v2/module.php @@ -24,6 +24,7 @@ class Ladestation_v2 extends IPSModule $this->RegisterPropertyInteger("Ein_Zeit", 0); // Recheninterval $this->RegisterPropertyInteger("Aus_Zeit", 0); // Recheninterval $this->RegisterPropertyInteger("Token_ECarUp", 0); // Recheninterval + $this->RegisterPropertyInteger("EaseeGatewayID", 0); // Ladestationspezifische Variabeln @@ -129,10 +130,37 @@ class Ladestation_v2 extends IPSModule $parentID = (int)$instance["ConnectionID"]; if ($usesEaseeGateway) { - if ($parentID <= 0) { - $this->ConnectParent(self::EASEE_GATEWAY_MODULE_ID); + $gatewayID = $this->ReadPropertyInteger("EaseeGatewayID"); + + if ($gatewayID > 0 && IPS_InstanceExists($gatewayID)) { + $gateway = IPS_GetInstance($gatewayID); + if ($gateway["ModuleInfo"]["ModuleID"] !== self::EASEE_GATEWAY_MODULE_ID) { + IPS_LogMessage("Ladestation_v2", "Ausgewählte Instanz ist kein Easee Gateway"); + $gatewayID = 0; + } + } else { + $gatewayID = 0; + } + + if ($gatewayID > 0 && $parentID !== $gatewayID) { + if ($parentID > 0) { + IPS_DisconnectInstance($this->InstanceID); + } + IPS_ConnectInstance($this->InstanceID, $gatewayID); + $parentID = $gatewayID; + } elseif ($gatewayID === 0 && $parentID > 0) { + $parent = IPS_GetInstance($parentID); + if ($parent["ModuleInfo"]["ModuleID"] === self::EASEE_GATEWAY_MODULE_ID) { + IPS_DisconnectInstance($this->InstanceID); + $parentID = 0; + } + } + + if ($parentID > 0) { + $this->SubscribeToEaseeGateway(); + } else { + $this->SetValue("Easee_Gateway_Connected", false); } - $this->SubscribeToEaseeGateway(); } elseif ($parentID > 0) { $parent = IPS_GetInstance($parentID); if ($parent["ModuleInfo"]["ModuleID"] === self::EASEE_GATEWAY_MODULE_ID) {