3, // Default: volle Leistung, auch aus dem Netz "sonne" => 4, // Eco (Awattar): Überschuss "plan" => 5, // Next Trip (AutomaticStop): Energie bis Uhrzeit ]; function ladeAntwort($daten, $code = 200) { http_response_code($code); header("Content-Type: application/json; charset=utf-8"); echo json_encode($daten, JSON_UNESCAPED_UNICODE); exit; } if (!checkLogin()) { if ($_SERVER["REQUEST_METHOD"] === "POST") { ladeAntwort(["error" => "Nicht angemeldet."], 403); } exit; } if ($_SERVER["REQUEST_METHOD"] !== "POST") { include __DIR__ . "/carForm.php"; exit; } $konf = wallboxen()[$wallbox]; $body = json_decode(file_get_contents("php://input"), true); if (!is_array($body)) { ladeAntwort(["error" => "Konnte die Anfrage nicht lesen."], 400); } switch ($body["aktion"] ?? "") { case "frc": $wert = intval($body["wert"] ?? -1); if (!in_array($wert, [0, 1, 2], true)) { ladeAntwort(["error" => "Unbekannte Freigabe."], 400); } $werte = ["frc" => $wert]; break; case "modus": $modus = CAR_MODI[$body["modus"] ?? ""] ?? null; if ($modus === null || $modus === CAR_MODI["plan"]) { // Die Planung braucht Energie und Uhrzeit - siehe "plan". ladeAntwort(["error" => "Unbekannter Modus."], 400); } $werte = ["fup" => true, "lmo" => $modus]; break; case "strom": $werte = ["amp" => min(16, max(6, intval($body["ampere"] ?? 6)))]; break; case "plan": // Die Uhrzeit ging früher in eine Kommandozeile und ließ sich mit // "12:00; befehl" missbrauchen - deshalb bleibt die Prüfung streng. if (!preg_match('/^([01][0-9]|2[0-3]):([0-5][0-9])$/', (string)($body["zeit"] ?? ""), $teile)) { ladeAntwort(["error" => "Die Uhrzeit ist ungültig."], 400); } $wh = intval($body["wh"] ?? 0); $max = (int) round(fahrzeuge()[$wallbox]["akkuKWh"] * 1000); if ($wh < 100 || $wh > $max) { ladeAntwort(["error" => "Die Energiemenge liegt außerhalb dessen, was der Akku fasst."], 400); } // Reihenfolge zählt: Uhr, Ziel, dann der Modus. $werte = []; if (!empty($konf["uhrStellen"])) { $werte["utc"] = gmdate("Y-m-d\TH:i:s") . ".000"; } $werte["fte"] = $wh; $werte["ftt"] = intval($teile[1]) * 3600 + intval($teile[2]) * 60; $werte["fup"] = true; $werte["lmo"] = CAR_MODI["plan"]; break; default: ladeAntwort(["error" => "Unbekannte Aktion."], 400); } if (!wallboxSetzen($wallbox, $werte)) { ladeAntwort(["error" => "Der MQTT-Broker ist nicht erreichbar."], 502); } ladeAntwort(["ok" => true]);