"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"]), ]); case "kacheln-save": /* * Fehlt "werte" oder steht dort null, faellt die Kachel auf * ihre Vorgabe zurueck - dann kommt diese zurueck, damit die * Maske zeigt, was jetzt gilt, statt zu leeren Zeilen. */ $floor = $body["floor"] ?? ""; $room = $body["room"] ?? ""; $werte = array_key_exists("werte", $body) ? $body["werte"] : null; $gespeichert = kachelWerteSpeichern($floor, $room, $werte); $vorgabe = []; foreach (allRooms() as $r) { if ($r["floor"] === $floor && $r["id"] === $room) { $vorgabe = kachelVorgabe($r); } } jsonAntwort([ "eigen" => $gespeichert !== null, "werte" => $gespeichert !== null ? $gespeichert : $vorgabe, ]); case "geraete-raeume": jsonAntwort(["gespeichert" => saveRooms($body["rooms"] ?? [])]); case "geraet-loeschen": /* * Loeschen ist endgueltig - abgelehnt wird es, wenn eine * Automatik auf das Geraet zeigt (siehe geraetLoeschen()). * Zurueck kommt die neue Liste, damit die Maske nicht raten * muss, was jetzt gilt. */ $name = geraetLoeschen($body["id"] ?? 0); jsonAntwort(["geloescht" => $name, "geraete" => geraeteListe()]); 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 === "kacheln") { try { jsonAntwort([ "kacheln" => kachelListe(), // Alle Symbolnamen - die üblichen zuerst und mit Beschriftung. "symbole" => kachelIconNamen(), // Auswahlliste je Geraet - dieselbe Quelle wie im Automatik-Editor. "katalog" => kachelKatalog(), // Fuer die Eingabe von Hand, wenn etwas nicht im Katalog steht. "topics" => kachelTopicVorschlaege(), "tabelleDa" => kachelTabelleDa(), "max" => KACHEL_MAX, ]); } catch (Throwable $e) { jsonAntwort(["error" => "Kacheln nicht abrufbar: " . $e->getMessage()], 500); } } if ($action === "geraete") { try { jsonAntwort(["geraete" => geraeteListe(), "raeume" => raumListe()]); } catch (Throwable $e) { jsonAntwort(["error" => "Geräte nicht abrufbar: " . $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);