<?php

class Ladestation_v2 extends IPSModule
{
    public function Create()
    {
    
        parent::Create();

        // Ladestationspezifische Properties
        $this->RegisterPropertyString("IP_Adresse", "0.0.0.0");
        $this->RegisterPropertyInteger("Ladestation", 2);
        $this->RegisterPropertyString("ID", "");
        $this->RegisterPropertyString("Seriennummer", "");
        $this->RegisterPropertyString("Username", "");
        $this->RegisterPropertyString("Password", "");
        $this->RegisterPropertyInteger("Interval", 5); // Recheninterval
        $this->RegisterPropertyInteger("Max_Current_abs", 32); // Recheninterval
        $this->RegisterPropertyInteger("Zeit_Zwischen_Zustandswechseln", 1);
        $this->RegisterPropertyInteger("Ein_Zeit", 0); // Recheninterval
        $this->RegisterPropertyInteger("Aus_Zeit", 0); // Recheninterval
        $this->RegisterPropertyInteger("Token_Easee", 0); // Recheninterval
        $this->RegisterPropertyInteger("Token_ECarUp", 0); // Recheninterval


        // Ladestationspezifische Variabeln
        $this->RegisterVariableFloat("Max_Current","Maximaler Ladestrom","", 0);
        IPS_SetHidden($this->GetIDForIdent("Max_Current"), true);
        $this->RegisterVariableBoolean("Is_1_ph", "Auto lädt 1-Phasig", "~Switch", false);
        $this->RegisterVariableBoolean("Car_detected", "Auto erkannt","~Switch", false);
        $this->RegisterVariableInteger("Pending_Counter", "Pending_Counter", "", 0);
        IPS_SetHidden($this->GetIDForIdent("Pending_Counter"), true);
        $this->RegisterVariableBoolean("Car_is_full", "Auto fertig geladen", "~Switch", false);
        $this->RegisterVariableBoolean("Ladebereit", "Ladestation ein", "~Switch", true);
        $this->EnableAction("Ladebereit");
        $this->RegisterVariableBoolean("Solarladen", "Solarladen ein", "~Switch", false);
        $this->EnableAction("Solarladen");
        $this->RegisterVariableInteger("Fahrzeugstatus", "Fahrzeugstatus", "", 0);
        IPS_SetHidden($this->GetIDForIdent("Fahrzeugstatus"), true);

        $this->RegisterVariableFloat("Ladeleistung_Effektiv", "Aktuelle Ladeleistung", "", 0);
        $this->RegisterVariableBoolean("Peak", "Peak", "", 0);
        IPS_SetHidden($this->GetIDForIdent("Peak"), true);

        $this->RegisterVariableBoolean("IsTimerActive", "IsTimerActive", "", false);
        IPS_SetHidden($this->GetIDForIdent("IsTimerActive"), true);

        $this->RegisterTimer("ZustandswechselTimer",0,"IPS_RequestAction(" .$this->InstanceID .', "ResetTimer", "");');

        $this->RegisterVariableBoolean("IsTimerActive_Null_Timer", "IsTimerActive_Null_Timer", "", false);
        IPS_SetHidden($this->GetIDForIdent("IsTimerActive_Null_Timer"), true);

        $this->RegisterTimer("Null_Timer",0,"IPS_RequestAction(" .$this->InstanceID .', "ResetNullTimer", "");');

        $this->RegisterVariableString("Letzer_User", "Letzter registrierter Benutzer");
        IPS_SetHidden($this->GetIDForIdent("Letzer_User"), true);


        
        // Variabeln für Kommunkation mit Manager
        $this->RegisterVariableInteger("Sperre_Prio", "Priorität Sperre", "", 0);
        $this->EnableAction("Sperre_Prio");
        IPS_SetHidden($this->GetIDForIdent("Sperre_Prio"), true);

        $this->RegisterVariableInteger("PV_Prio", "Priorität Solarladen", "", 0);
        $this->EnableAction("PV_Prio");
        IPS_SetHidden($this->GetIDForIdent("PV_Prio"), true);

        $this->RegisterVariableBoolean("Idle", "Idle", "", 0);
        IPS_SetHidden($this->GetIDForIdent("Idle"), true);

        $this->RegisterVariableInteger("Aktuelle_Leistung", "Aktuelle_Leistung", "", 0);
        IPS_SetHidden($this->GetIDForIdent("Aktuelle_Leistung"), true);

        $this->RegisterVariableFloat("Bezogene_Energie", "Gesamter Energiebezug", "", 0);
        IPS_SetHidden($this->GetIDForIdent("Bezogene_Energie"), true);

        $this->RegisterVariableString("PowerSteps", "Leistungsschritte");
        IPS_SetHidden($this->GetIDForIdent("PowerSteps"), true);

        $this->RegisterVariableInteger("Power", "Power");
        IPS_SetHidden($this->GetIDForIdent("Power"), true);

        $this->RegisterVariableBoolean("Is_Peak_Shaving", "Is_Peak_Shaving");
        IPS_SetHidden($this->GetIDForIdent("Is_Peak_Shaving"), true);

        $this->RegisterVariableInteger("Leistung_Delta", "Leistung_Delta", "", 0);
        IPS_SetHidden($this->GetIDForIdent("Leistung_Delta"), true);

        $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);
        IPS_SetHidden($this->GetIDForIdent("IdleCounter"), true);
        $this->SetValue("IdleCounter", 0);

        // Initialisiere Idle
        $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 ApplyChanges()
    {
        parent::ApplyChanges();
        $this->SetTimerInterval("Timer_Do_UserCalc_EVC",$this->ReadPropertyInteger("Interval")*1000); 

        // erstelle einen Timer der das Request token aktualisiert wenn die station dies braucht. 
        if($this->ReadPropertyInteger("Ladestation")==6){

                $this->Refresh_Token(); 
                $this->SetTimerInterval("Timer_Refresh_Token",1800000); 

        }

        // Zusätzliche Anpassungen nach Bedarf
    }


    public function RequestAction($Ident, $Value)
    {
        switch ($Ident) {

            case "SetAktuelle_Leistung":
                $this->SetValue("Power", (int)$Value);
                break;
    
            case "GetCurrentData":
                $this->SetValue("Is_Peak_Shaving", (bool)$Value);
                break;
                
            case "Do_UserCalc":


                if($this->Detect_Car($this->ReadPropertyInteger("Ladestation"))){
                    $this->SetAktuelle_Leistung($this->GetValue("Power"));
                    $this->GetCurrentData($this->GetValue("Is_Peak_Shaving"));
                }
                else{
                    SetValue($this->GetIDForIdent("PowerSteps"), json_encode([0]));
                    $this->SetValue("PowerSteps", json_encode([0]));

                
                }
                break; 

            case "Sperre_Prio":
                $this->SetValue("Sperre_Prio", (bool)$Value);
                break;
                
            case "PV_Prio":
                $this->SetValue("PV_Prio", (bool)$Value);
                break;
                        
            case "Solarladen":
                $this->SetValue("Solarladen", (bool)$Value);
                break;
                                    
            case "Ladebereit":
                $this->SetValue("Ladebereit", (bool)$Value);
                break;
            
            case "ResetTimer":
                $this->ResetTimer(); 
                break;

            case "ResetNullTimer":
                $this->ResetNullTimer(); 
                break; 

            case "Refresh_Token":
                $this->Refresh_Token(); 
                break; 
                
            case "Mindestaldestrom":
                $this->SetValue("Mindestaldestrom", (int)$Value); 
                break; 

            default:
                throw new Exception("Invalid Ident");
        }
    }


    public function Detect_Car(int $carType)
    {   

        if($this->GetValue("Car_detected")==true){
            if($this->Get_Car_Status($carType)==true){
                $this->SetValue("Car_detected", true);
                if($this->GetValue("Max_Current")<6){
                    $this->SetValue("Car_is_full", true);
                    $this->ResetTimer(); 
                    $this->ResetNullTimer(); 

                }

            }else{
                $this->SetValue("Car_detected", false);
                $this->SetValue("Pending_Counter", 0);
                $this->SetValue("Leistung_Delta", 0);
                $this->SetValue("Car_is_full", false);
                $this->ResetTimer(); 
                $this->ResetNullTimer(); 
                $this->SetValue("Is_1_ph", false);
                $this->SetValue("Aktuelle_Leistung", 0);
                $this->SetValue("IdleCounter", 0);
                $this->SetValue("Idle", true);
            }
        }
        else{
            if($this->Get_Car_Status($carType)==true){

                $this->sendPowerToStation($this->ReadPropertyInteger("Max_Current_abs")); 

                $counter = $this->GetValue("Pending_Counter"); 

                if($counter>(60/($this->ReadPropertyInteger("Interval")))){

                    $this->SetValue("Pending_Counter", 0);
                    if($this->GetValue("Ladeleistung_Effektiv")>7500){
                        $this->SetValue("Is_1_ph", false);
                        $this->Calc_Max_Current(false); 

                    }
                    else{
                        $this->SetValue("Is_1_ph", true);
                        $this->Calc_Max_Current(true); 

                    }

                    $this->SetValue("Car_detected", true);
                            
                    if ($this->GetValue("Is_1_ph")) {
                                $power = $this->GetValue("Mindestaldestrom") * 230;
                            } 
                            else {
                                    $power = $this->GetValue("Mindestaldestrom") * 400 * 1.71;
                                }
                            
                    $this->SetValue("Power", $power);


                }
                else{
                    $this->SetValue("Pending_Counter", $counter+1);
                    $this->SetValue("Car_detected", false);

                }                

            }else{
                $this->SetValue("Car_detected", false);
                $this->SetValue("Leistung_Delta", 0);
                $this->sendPowerToStation($this->ReadPropertyInteger("Max_Current_abs")); 
            }
        }

        return $this->GetValue("Car_detected"); 

    }


    // Methode zum Setzen der PowerSteps und Timer starten
    public function SetTimerOn()
    {
        // Timer setzen, der nach "Zeit_Zwischen_Zustandswechseln" abläuft
        $zeitZwischenZustandswechseln = $this->ReadPropertyInteger("Zeit_Zwischen_Zustandswechseln");

        if($zeitZwischenZustandswechseln>0){
            $this->SetTimerInterval("ZustandswechselTimer", $zeitZwischenZustandswechseln * 60000); // Timer in Millisekunden
            // Timer-Status auf true setzen
            $this->SetValue("IsTimerActive", true);
        }else{
            $this->SetValue("IsTimerActive", false);

        }
    }


    // Methode zum Setzen der PowerSteps und Timer starten
    public function SetTimerNullMindestlast($time)
    {
        if($time>0){
            $this->SetTimerInterval("Null_Timer", $time * 60000); // Timer in Millisekunden
            // Timer-Status auf true setzen
            $this->SetValue("IsTimerActive_Null_Timer", true);
        }else{
            $this->SetValue("IsTimerActive_Null_Timer", false);

        }
    }


    // Methode zum Zurücksetzen von PowerSteps nach Ablauf des Timers
    public function ResetTimer()
    {
        // Timer stoppen
        $this->SetTimerInterval("ZustandswechselTimer", 0);

        // Timer-Status auf false setzen
        $this->SetValue("IsTimerActive", false);
    }

        // Methode zum Zurücksetzen von PowerSteps nach Ablauf des Timers
    public function ResetNullTimer()
    {
        // Timer stoppen
        $this->SetTimerInterval("Null_Timer", 0);

        // Timer-Status auf false setzen
        $this->SetValue("IsTimerActive_Null_Timer", false);
    }
    


    public function Get_Car_Status(int $carType)
    {
        $ch = curl_init();
        $car_on_station = $this->GetValue("Car_detected"); 
        switch ($carType) {
            case 1:
                curl_setopt($ch, CURLOPT_URL, "http://" . $this->ReadPropertyString("IP_Adresse") . "/mqtt?payload=");
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                $response = curl_exec($ch);
                curl_close($ch);
                $data = json_decode($response, true);
    
                if (json_last_error() === JSON_ERROR_NONE && isset($data["car"])) {
                    /*if ($data["car"] != 1) {
                        $this->SetValue("Car_detected", true);
                    }
                    else{
                        $this->SetValue("Car_detected", false);
                    }*/
                    if ($data["car"] != 1) {
                        $car_on_station = true; 
                    }
                    else{
                        $car_on_station = false; 
                    }
                    $this->SetValue("Ladeleistung_Effektiv", $data["nrg"][11]*10);
                    $this->SetValue("Fahrzeugstatus", $data["car"]);
                }
                break;
    
            case 2:
                curl_setopt($ch, CURLOPT_URL, "http://" . $this->ReadPropertyString("IP_Adresse") . "/api/status");
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                $response = curl_exec($ch);
                curl_close($ch);
                $data = json_decode($response, true);
    
                if (json_last_error() === JSON_ERROR_NONE && isset($data["car"])) {
                    /*if ($data["car"] != 1) {
                        $this->SetValue("Car_detected", true);
                    }
                    else{
                        $this->SetValue("Car_detected", false);
                    }*/
                    if ($data["car"] != 1) {
                        $car_on_station = true; 
                    }
                    else{
                        $car_on_station = false; 
                    }
                    $this->SetValue("Ladeleistung_Effektiv", $data["nrg"][11]);
                    $this->SetValue("Fahrzeugstatus", $data["car"]);
                }
                break;
    
            case 3:
                curl_setopt($ch, CURLOPT_URL, "https://api.smart-me.com/pico/charging/" . $this->ReadPropertyString("ID"));
                curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
                curl_setopt($ch, CURLOPT_USERPWD, $this->ReadPropertyString("Username") . ":" . $this->ReadPropertyString("Password"));
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                $response = curl_exec($ch);
                curl_close($ch);
                $data = json_decode($response, true);
    
                if (json_last_error() === JSON_ERROR_NONE && isset($data["State"])) {
                    /*if ($data["car"] != 1) {
                        $this->SetValue("Car_detected", true);
                    }
                    else{
                        $this->SetValue("Car_detected", false);
                    }*/
                    if ($data["State"] != 1) {
                        $car_on_station = true; 
                    }
                    else{
                        $car_on_station = false; 
                    }
                    $this->SetValue("Ladeleistung_Effektiv", round($data["ActiveChargingPower"]*1000));
                    $this->SetValue("Fahrzeugstatus", $data["State"]);

                }
                break;
    
            case 4:
                $car_on_station = true; 
                break;
    
            case 5:

                // Benutzer eCarUp abfragen

                $authToken = GetValue($this->ReadPropertyInteger("Token_ECarUp"));
                $ID = $this->ReadPropertyString("ID");
                $apiUrl = 'https://public-api.ecarup.com/v1/station/' . $ID . '/conn'.'ectors/'. $ID . '/active-charging';
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $apiUrl);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_HTTPHEADER, [
                    'accept: application/json',
                    'Authorization: Bearer ' . $authToken
                ]);
                
                $response = curl_exec($ch);
                $data = json_decode($response, true);

                curl_close($ch);

                if (json_last_error() === JSON_ERROR_NONE && isset($data["driverIdentifier"])) {

                    $this->SetValue("Letzer_User", $data["driverIdentifier"]);
                    
                    if($this->ReadPropertyString("Username") === $data["driverIdentifier"]){
                        $this->SetValue("Solarladen", true);
                    }else{
                        $this->SetValue("Solarladen", false);
                    }
                }

                //Aktueller Zustand Ladestation abfragen (Leistung, auto eingesteckt?)
                $ch2 = curl_init();

                $url2 = "https://api.easee.com/api/chargers/".$this->ReadPropertyString("Seriennummer")."/state";
                    curl_setopt_array($ch2, [
                        CURLOPT_ENCODING => "",
                        CURLOPT_MAXREDIRS => 10,
                        CURLOPT_TIMEOUT => 30,
                        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                        CURLOPT_CUSTOMREQUEST => "GET",
                        CURLOPT_HTTPHEADER => [
                          "Authorization: Bearer ".GetValue($this->ReadPropertyInteger("Token_Easee"))."",
                          "content-type: application/*+json"
                        ],
                      ]);

                curl_setopt($ch2, CURLOPT_URL, $url2);
                curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
                $response_easee = curl_exec($ch2);
                curl_close($ch2);    

                $easee_data = json_decode($response_easee, true);


                if (json_last_error() === JSON_ERROR_NONE && isset($easee_data["chargerOpMode"])) {
 
                    if ($easee_data["chargerOpMode"] != 1 && (($easee_data["chargerOpMode"] != 6)||($this->GetValue("Car_detected")==true)) && $easee_data["chargerOpMode"] != 7) {
                        $car_on_station = true; 
                    }
                    else{
                        $car_on_station = false; 
                    }
                    $this->SetValue("Ladeleistung_Effektiv", round($easee_data["totalPower"]*1000));
                    $this->SetValue("Fahrzeugstatus", $easee_data["chargerOpMode"]);
                }

                break;

                case 6:



                //Aktueller Zustand Ladestation abfragen (Leistung, auto eingesteckt?)
                $ch2 = curl_init();

                $url2 = "https://api.easee.com/api/chargers/".$this->ReadPropertyString("Seriennummer")."/state";
                    curl_setopt_array($ch2, [
                        CURLOPT_ENCODING => "",
                        CURLOPT_MAXREDIRS => 10,
                        CURLOPT_TIMEOUT => 30,
                        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                        CURLOPT_CUSTOMREQUEST => "GET",
                        CURLOPT_HTTPHEADER => [
                          "Authorization: Bearer ".$this->GetBuffer("Token_Intern")."",
                          "content-type: application/*+json"
                        ],
                      ]);

                curl_setopt($ch2, CURLOPT_URL, $url2);
                curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
                $response_easee = curl_exec($ch2);
                curl_close($ch2);    

                $easee_data = json_decode($response_easee, true);


                if (json_last_error() === JSON_ERROR_NONE && isset($easee_data["chargerOpMode"])) {
 
                    if ($easee_data["chargerOpMode"] != 1 && (($easee_data["chargerOpMode"] != 6)||($this->GetValue("Car_detected")==true)) && $easee_data["chargerOpMode"] != 7) {
                        $car_on_station = true; 
                    }
                    else{
                        $car_on_station = false; 
                    }
                    $this->SetValue("Ladeleistung_Effektiv", round($easee_data["totalPower"]*1000));
                    $this->SetValue("Fahrzeugstatus", $easee_data["chargerOpMode"]);
                }

                break;

            default:
                $this->SetValue("Car_detected", false);
                $this->SetValue("Fahrzeugstatus", -1);
                break;
        }
    
        
        return $car_on_station;
    }

    public function Calc_Max_Current(bool $is_1_ph)  
    {
        $maxCurrent = 32; 
        if($is_1_ph){

            $maxCurrent = 2.5 + ($this->GetValue("Ladeleistung_Effektiv") / 230); 
        }
        else{

            $maxCurrent = 2.5 + ($this->GetValue("Ladeleistung_Effektiv") / (1.71*400)); 
        }
        if($maxCurrent>$this->ReadPropertyInteger("Max_Current_abs")){
            $maxCurrent = $this->ReadPropertyInteger("Max_Current_abs"); 
        }
            $this->SetValue("Max_Current", $maxCurrent); 
    }

    public function Get_Current_From_Power(bool $is_1_ph, int $power)
    {
        if ($is_1_ph) {
            $current = round($power / 230);
        } else {
            $current = round($power / (400 * 1.71));
        }
    
        return $current;
    }

    public function Get_Array_From_Current(bool $is_1_ph, float $current, int $power, bool $timer)
    {
        $resultArray = [];

        if ($timer) {
            // Timer an
            if ($power === 0) {
                // power == 0: nur eine 0 zurückgeben
                $resultArray[] = 0;
                return $resultArray;

            }else{
        // Schleife wie gehabt
        for ($i = (max($this->GetValue("Mindestaldestrom") + 1, 6)); $i <= $current; $i++) {
            if ($is_1_ph) {
                $resultArray[] = $i * 230;
            } else {
                $resultArray[] = $i * 400 * 1.71;
            }
        }

        }
            
            // power > 0: keine 0 am Anfang, Schleife normal durchlaufen
        } else {
            // Timer aus: wie bisher, 0 am Anfang
           
        if ($is_1_ph) {
                $resultArray[] = $this->GetValue("Mindestaldestrom") * 230;
            } else {
                $resultArray[] = $this->GetValue("Mindestaldestrom") * 400 * 1.71;
            }
        
        

        // Schleife wie gehabt
        for ($i = (max($this->GetValue("Mindestaldestrom") + 1, 6)); $i <= $current; $i++) {
            if ($is_1_ph) {
                $resultArray[] = $i * 230;
            } else {
                $resultArray[] = $i * 400 * 1.71;
            }
        }
}
        return $resultArray;
    }




    public function SetAktuelle_Leistung(int $power)
    {
                // Hier eine Leistungsänderung detektieren für Idle und interne Mindestlaufzeiten
        $this->CheckIdle($power);
        if ($this->GetValue("Aktuelle_Leistung") != $power) {
            $this->SetTimerOn();
        }
        
        if (($this->GetValue("Aktuelle_Leistung") == 0) && ($power>0)) {
            $this->SetTimerNullMindestlast($this->ReadPropertyInteger("Ein_Zeit"));
        }
        elseif(($this->GetValue("Aktuelle_Leistung") > 0) && ($power==0)){
            $this->SetTimerNullMindestlast($this->ReadPropertyInteger("Aus_Zeit"));

        }

        $internalPower = GetValue($this->GetIDForIdent("Aktuelle_Leistung"));

        // Aktuelle Leistungsvorgabe setzen
        SetValue($this->GetIDForIdent("Aktuelle_Leistung"), $power);
        if($power <= 0){
            $this->SetValue("Pending_Counter", 0); 
        }

        $this->SetValue("Bezogene_Energie", ($this->GetValue("Bezogene_Energie") + ($this->GetValue("Aktuelle_Leistung")*($this->ReadPropertyInteger("Interval")/3600))));

        if ($power != $internalPower) {
            // Setze die interne Leistungsvorgabe

            // Idle für x Zyklen auf false setzen
            SetValue($this->GetIDForIdent("Idle"), false);
            SetValue(
                $this->GetIDForIdent("IdleCounter"),
                $this->ReadPropertyInteger("IdleCounterMax")
            );
        } else {
            // IdleCallCounter herunterzählen, wenn power == interne Leistungsvorgabe
            $idleCounter = GetValue($this->GetIDForIdent("IdleCounter"));
            if ($idleCounter > 0) {
                $idleCounter--;
                $this->SetValue("Pending_Counter", 0); 
                SetValue($this->GetIDForIdent("IdleCounter"), $idleCounter);
                if ($idleCounter == 0) {
                    SetValue($this->GetIDForIdent("Idle"), true);
                }
            }
        }

        // Ladeleistung setzen
        $peak = GetValue($this->GetIDForIdent("Peak"));
        $solarladen = GetValue($this->GetIDForIdent("Solarladen"));
        $Ladebereit = GetValue($this->GetIDForIdent("Ladebereit"));
        if (!$Ladebereit) {

            $this->sendPowerToStation(0);

        } elseif (!$peak && !$solarladen) {
            // Wenn weder Peak noch Solarladen aktiv sind, setze Ladeleistung auf MaxLeistung
            $this->sendPowerToStation($this->Get_Current_From_Power($this->GetValue("Is_1_ph"), $power));

        } else {
            // Ansonsten setze Ladeleistung auf die aktuelle Leistungsvorgabe (Aktuelle_Leistung)
            $this->sendPowerToStation($this->Get_Current_From_Power($this->GetValue("Is_1_ph"), $power));
        }
    }

    // Methode zum Abrufen der aktuellen Daten
    public function GetCurrentData(bool $Peak)
    {

        // Überprüfen, ob der Timer aktiv ist
        if ($this->GetValue("IsTimerActive")) {
            // Timer ist aktiv, PowerSteps setzen
            $this->SetValue("PowerSteps", json_encode([$this->GetValue("Aktuelle_Leistung")]));
            $this->SetValue("Leistung_Delta", $this->GetValue("Aktuelle_Leistung")-$this->GetValue("Ladeleistung_Effektiv"));

            return; 
        }else{
            $this->SetValue("Leistung_Delta", 0);
        }

        // Aktuelle Properties abrufen
        $ladebereit = GetValue($this->GetIDForIdent("Ladebereit"));
        $solarladen = GetValue($this->GetIDForIdent("Solarladen"));


        // Peak-Wert speichern
        $this->SetValue("Peak", $Peak);

        // Array für die Powersteps initialisieren
        $powerSteps = [];

            // Konfiguration des powerSteps-Arrays basierend auf den Properties
            if (!$ladebereit || $this->GetValue("Car_is_full")) {
                $powerSteps = [0];
            } elseif (!$Peak && !$solarladen) {
                $powerSteps = [max($this->Get_Array_From_Current($this->GetValue("Is_1_ph"),$this->GetValue("Max_Current"), $this->GetValue("Aktuelle_Leistung"), $this->GetValue("IsTimerActive_Null_Timer")))];
            } elseif (!$Peak && $solarladen) {
                $powerSteps = $this->Get_Array_From_Current($this->GetValue("Is_1_ph"),$this->GetValue("Max_Current"), $this->GetValue("Aktuelle_Leistung"), $this->GetValue("IsTimerActive_Null_Timer"));
            } elseif ($solarladen && $Peak) {
                        if ($is_1_ph) {
                $powerSteps = [$this->GetValue("Mindestaldestrom") * 230];
            } else {
                $powerSteps = [$this->GetValue("Mindestaldestrom") * 400 * 1.71];
            }
        
            } else {       
                $powerSteps = $this->Get_Array_From_Current($this->GetValue("Is_1_ph"),$this->GetValue("Max_Current"), $this->GetValue("Aktuelle_Leistung"), $this->GetValue("IsTimerActive_Null_Timer"));
            }
        
        // PowerSteps in der RegisterVariable speichern
        SetValue($this->GetIDForIdent("PowerSteps"), json_encode($powerSteps));
        // Rückgabe der Powersteps
        $counter = $this->GetValue("Pending_Counter"); 

            if($this->GetValue("Aktuelle_Leistung")>(1.11*$this->GetValue("Ladeleistung_Effektiv"))){
             $this->SetValue("Pending_Counter", $counter+1); 

            }elseif(max($this->Get_Array_From_Current($this->GetValue("Is_1_ph"),$this->GetValue("Max_Current"), $this->GetValue("Aktuelle_Leistung"), $this->GetValue("IsTimerActive_Null_Timer")))<(1.11*$this->GetValue("Ladeleistung_Effektiv"))){  // diesen elseif ggf wieder rauslöschen
                $this->SetValue("Pending_Counter", $counter+1); 

            }
            else{

                $this->SetValue("Pending_Counter", 0); 

            }

            if($counter>(90/($this->ReadPropertyInteger("Interval")))){

                $this->SetValue("Pending_Counter", 0);
                
                if((max(json_decode($this->GetValue("PowerSteps"))))  >0){

                    if($this->GetValue("Aktuelle_Leistung")>(1.11*$this->GetValue("Ladeleistung_Effektiv"))) {
                    
                        $this->Calc_Max_Current($this->GetValue("Is_1_ph")); 


                    }

                }
               
            }
        
        return $powerSteps;
    }

    public function sendPowerToStation(float $value)
    {
        $baseUrl = "";
        $stationType = $this->ReadPropertyInteger("Ladestation");
    
        switch ($stationType) {
            case 1:
                $baseUrl = "http://" . $this->ReadPropertyString("IP_Adresse") . "/mqtt?payload=";
                break;
            case 2:
                $baseUrl = "http://" . $this->ReadPropertyString("IP_Adresse") . "/api/set?";
                break;
            case 3:
                $baseUrl = "https://api.smart-me.com/pico/loadmanagementgroup/current/" . $this->ReadPropertyString("Seriennummer") . "?current=";
                break;
            case 4:
                // Nichts zu tun für Dummy station
                return;
            case 5:
                // Keine base Url nötig
                break;
            case 6:
                // Keine base Url nötig
                break;
        }
    
        $ch = curl_init(); 
        IPS_LogMessage("value", "nach konvertierung" . $value);
    
        if ($value == 0) {
            switch ($stationType) {
                case 1:
                    $url = $baseUrl . "alw=0";
                    break;
                case 2:
                    $url = $baseUrl . "frc=1&sua=false";
                    
                    break;
                case 3:
                    $url = $baseUrl . "0";
                    curl_setopt($ch, CURLOPT_POST, true);
                    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
                    curl_setopt($ch, CURLOPT_USERPWD, $this->ReadPropertyString("Username") . ":" . $this->ReadPropertyString("Password"));
                    break;
                case 4:
                    // Nichts zu tun für Dummy station
                    return;
                case 5: 
                    if($this->ReadPropertyString("Username") != $this->GetValue("Letzer_User")){
                        return;
                    }
                    $url = "https://api.easee.com/api/chargers/".$this->ReadPropertyString("Seriennummer")."/commands/set_dynamic_charger_current";
                    curl_setopt_array($ch, [
                        CURLOPT_ENCODING => "",
                        CURLOPT_MAXREDIRS => 10,
                        CURLOPT_TIMEOUT => 30,
                        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                        CURLOPT_CUSTOMREQUEST => "POST",
                        CURLOPT_POSTFIELDS => "{\"amps\":". $value .",\"minutes\":0}",
                        CURLOPT_HTTPHEADER => [
                          "Authorization: Bearer ".GetValue($this->ReadPropertyInteger("Token_Easee"))."",
                          "content-type: application/*+json"
                        ],
                      ]);
                    break; 

                case 6: 

                    $url = "https://api.easee.com/api/chargers/".$this->ReadPropertyString("Seriennummer")."/commands/set_dynamic_charger_current";
                    curl_setopt_array($ch, [
                        CURLOPT_ENCODING => "",
                        CURLOPT_MAXREDIRS => 10,
                        CURLOPT_TIMEOUT => 30,
                        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                        CURLOPT_CUSTOMREQUEST => "POST",
                        CURLOPT_POSTFIELDS => "{\"amps\":". $value .",\"minutes\":0}",
                        CURLOPT_HTTPHEADER => [
                          "Authorization: Bearer ".$this->GetBuffer("Token_Intern")."",
                          "content-type: application/*+json"
                        ],
                      ]);
                    break; 

                default:
                    return "Invalid station type.";
            }
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $response = curl_exec($ch);
            curl_close($ch);
            return $response;
        } elseif ($value >= 1 && $value <= 32) {
            switch ($stationType) {
                case 1:
                    $url1 = $baseUrl . "alw=1";
                    $url2 = $baseUrl . "amp=$value";
                    break;
                case 2:
                    $url1 = $baseUrl . "frc=2";
                    $url2 = $baseUrl . "amp=$value";
                    break;
                case 3:
                    $url2 = $baseUrl . ($value * 1000);
                    curl_setopt($ch, CURLOPT_POST, true);
                    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
                    curl_setopt($ch, CURLOPT_USERPWD, $this->ReadPropertyString("Username") . ":" . $this->ReadPropertyString("Password"));
                    break;
                case 4:
                    // Nichts zu tun für Dummy station
                    return;
                case 5:
                    if($this->ReadPropertyString("Username") != $this->GetValue("Letzer_User")){
                        return;
                    }
                    $url2 = "https://api.easee.com/api/chargers/".$this->ReadPropertyString("Seriennummer")."/commands/set_dynamic_charger_current";
                    curl_setopt_array($ch, [
                        CURLOPT_ENCODING => "",
                        CURLOPT_MAXREDIRS => 10,
                        CURLOPT_TIMEOUT => 30,
                        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                        CURLOPT_CUSTOMREQUEST => "POST",
                        CURLOPT_POSTFIELDS => "{\"amps\":". $value .",\"minutes\":0}",
                        CURLOPT_HTTPHEADER => [
                          "Authorization: Bearer ".GetValue($this->ReadPropertyInteger("Token_Easee"))."",
                          "content-type: application/*+json"
                        ],
                      ]);
                    break; 

                case 6:

                    $url2 = "https://api.easee.com/api/chargers/".$this->ReadPropertyString("Seriennummer")."/commands/set_dynamic_charger_current";
                    curl_setopt_array($ch, [
                        CURLOPT_ENCODING => "",
                        CURLOPT_MAXREDIRS => 10,
                        CURLOPT_TIMEOUT => 30,
                        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                        CURLOPT_CUSTOMREQUEST => "POST",
                        CURLOPT_POSTFIELDS => "{\"amps\":". $value .",\"minutes\":0}",
                        CURLOPT_HTTPHEADER => [
                          "Authorization: Bearer ".$this->GetBuffer("Token_Intern")."",
                          "content-type: application/*+json"
                        ],
                      ]);
                    break; 

                default:
                    return "Invalid station type.";
            }
    
            if (isset($url1)) {
                curl_setopt($ch, CURLOPT_URL, $url1);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                $response1 = curl_exec($ch);
                if (curl_errno($ch)) {
                    curl_close($ch);
                    return "Error:" . curl_error($ch);
                }
            }
    
            curl_setopt($ch, CURLOPT_URL, $url2);
            $response2 = curl_exec($ch);
            if (curl_errno($ch)) {
                curl_close($ch);
                return "Error:" . curl_error($ch);
            }
            curl_close($ch);
            return;
        } else {
            return "Invalid value. Must be between 0 and 32.";
        }
    }

    public function Refresh_Token(){

        $payload = json_encode([
            'userName' => $this->ReadPropertyString("Username"),
            'password' => $this->ReadPropertyString("Password"),
        ]);

        // cURL-Handle initialisieren
        $ch = curl_init('https://api.easee.com/api/accounts/login');

        // cURL-Optionen setzen
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,    // Antwort als String zurückgeben
            CURLOPT_POST           => true,    // POST-Methode verwenden
            CURLOPT_HTTPHEADER     => [
                'Accept: application/json',
                'Content-Type: application/json',
            ],
            CURLOPT_POSTFIELDS     => $payload, // JSON-Body übergeben
        ]);

        // Anfrage ausführen und Antwort speichern
        $response = curl_exec($ch);

        // Auf Fehler prüfen
        if ($response === false) {
            echo 'cURL-Fehler: ' . curl_error($ch);
            curl_close($ch);
            exit;
        }

        // cURL-Handle schließen
        curl_close($ch);
        $this->SetBuffer("Token_Intern", (json_decode($response, true)['accessToken']));

    }

    public function CheckIdle($power)
    {
        $lastpower = GetValue($this->GetIDForIdent("Aktuelle_Leistung"));
        if ($lastpower != $power) {
            $this->SetValue("Idle", false);
            $this->SetValue("IdleCounter",$this->ReadPropertyInteger("IdleCounterMax"));
        }
        // IdleCounter auslesen und verarbeiten
        $idleCounter = $this->GetValue("IdleCounter");
        if ($idleCounter > 0) {
            $this->SetValue("Idle", false);
            $this->SetValue("IdleCounter", $idleCounter - 1);
        } else {
            $this->SetValue("Idle", true);
        }
    }


}
?>
