Sammelstand der offenen Arbeit im Dashboard. Einstellungen: eine Eingabemaske fuer die Energiepreise unter restricted/settings.php, dazu costs.php als Modell und ajax/settings.php als Endpunkt. Die Preise stehen jetzt in gridCosts, gasCosts und fuelCosts statt fest im Quelltext von getStats.php; die Jahresstatistik rechnet ueber LEAD() den jeweils gueltigen Zeitraum aus und schlaegt den anteiligen Grundpreis auf. Eingegeben wird in gewohnten Einheiten - l/100 km, kWh/100 km, Euro je Liter -, umgerechnet wird beim Speichern. solarLog_costs.sql beschreibt die Umstellung der Tabellen. Skoda: eigene Seite mit Live-Werten ueber MQTT und Historie ueber ajax/skoda.php, Kommandos ueber ajax/skodaCmd.php. Karte: Leaflet mit einem eigenen Kachel-Zwischenspeicher (ajax/tile.php), dessen Ablage unter tiles/ nicht ins Repository gehoert. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
67 lines
2.1 KiB
PHP
67 lines
2.1 KiB
PHP
<?php
|
|
/**
|
|
* Endpunkt der Einstellungsseite.
|
|
*
|
|
* GET ?action=list&reihe=strom Zeitraeume einer Preistabelle
|
|
* POST ?action=save {"reihe": "strom", "zeilen": [ ... ]}
|
|
*
|
|
* Ein reiner Verteiler: geprueft und geschrieben wird in
|
|
* restricted/costs.php, damit Maske und Endpunkt dieselbe Wahrheit ueber
|
|
* einen Zeitraum haben.
|
|
*/
|
|
|
|
require_once("../helper.php");
|
|
require_once("../restricted/costs.php");
|
|
|
|
if (!checkLogin()) {
|
|
http_response_code(403);
|
|
exit;
|
|
}
|
|
|
|
function jsonAntwort($data, $code = 200)
|
|
{
|
|
http_response_code($code);
|
|
header("Content-Type: application/json; charset=utf-8");
|
|
echo json_encode($data, JSON_UNESCAPED_UNICODE);
|
|
exit;
|
|
}
|
|
|
|
$action = $_GET["action"] ?? "list";
|
|
|
|
if ($_SERVER["REQUEST_METHOD"] === "POST") {
|
|
$body = json_decode(file_get_contents("php://input"), true);
|
|
if (!is_array($body)) {
|
|
jsonAntwort(["error" => "Konnte die Anfrage nicht lesen."], 400);
|
|
}
|
|
try {
|
|
switch ($action) {
|
|
case "save":
|
|
$anzahl = preiseSpeichern($body["reihe"] ?? "", $body["zeilen"] ?? []);
|
|
// Die gespeicherte Fassung zurueckgeben: die Maske zeigt danach
|
|
// die abgeleiteten Enddaten, nicht die eingetippten.
|
|
jsonAntwort([
|
|
"gespeichert" => $anzahl,
|
|
"zeilen" => preiseLaden($body["reihe"]),
|
|
]);
|
|
default:
|
|
jsonAntwort(["error" => "Unbekannte Aktion."], 400);
|
|
}
|
|
} catch (InvalidArgumentException $e) {
|
|
jsonAntwort(["error" => $e->getMessage()], 400);
|
|
} catch (Throwable $e) {
|
|
jsonAntwort(["error" => "Speichern fehlgeschlagen: " . $e->getMessage()], 500);
|
|
}
|
|
}
|
|
|
|
if ($action === "list") {
|
|
try {
|
|
jsonAntwort(["zeilen" => preiseLaden($_GET["reihe"] ?? "")]);
|
|
} catch (InvalidArgumentException $e) {
|
|
jsonAntwort(["error" => $e->getMessage()], 400);
|
|
} catch (Throwable $e) {
|
|
jsonAntwort(["error" => "Laden fehlgeschlagen: " . $e->getMessage()], 500);
|
|
}
|
|
}
|
|
|
|
jsonAntwort(["error" => "Unbekannte Aktion."], 400);
|