false, "message" => "Nicht angemeldet."]); exit; } $topic = $_POST["topic"] ?? ""; $payload = $_POST["payload"] ?? ""; $allowedTopics = [ "Gartenwasser/vorn/set", "Gartenwasser/vorn/auto", "Gartenwasser/hinten/set", "Gartenwasser/hinten/auto" ]; if (!in_array($topic, $allowedTopics, true)) { http_response_code(400); echo json_encode(["success" => false, "message" => "Nicht erlaubtes MQTT-Topic."]); exit; } if (str_ends_with($topic, "/set")) { $command = json_decode($payload, true); $validValve = is_array($command) && isset($command["valve"], $command["set"]) && in_array((int) $command["valve"], [1, 6], true) && in_array($command["set"], ["open", "close"], true); if ($validValve && $command["set"] === "open") { $validValve = isset($command["timer"]) && is_numeric($command["timer"]) && (int) $command["timer"] >= 1 && (int) $command["timer"] <= 120; } if (!$validValve) { http_response_code(400); echo json_encode(["success" => false, "message" => "Ungültiger Ventilbefehl."]); exit; } $payload = json_encode($command, JSON_THROW_ON_ERROR); } elseif (!in_array($payload, ["Hoch", "Vorn", "Trog", "Stop"], true)) { http_response_code(400); echo json_encode(["success" => false, "message" => "Ungültiger Automatikbefehl."]); exit; } try { $mqtt = new Bluerhinos\phpMQTT("localhost", 1883, "WateringWeb-" . bin2hex(random_bytes(4))); if (!$mqtt->connect(true, null, "", "")) { http_response_code(503); echo json_encode(["success" => false, "message" => "MQTT-Broker nicht erreichbar."]); exit; } $mqtt->publish($topic, $payload, 0, false); $mqtt->close(); } catch (Throwable $error) { http_response_code(503); echo json_encode(["success" => false, "message" => "MQTT-Fehler: " . $error->getMessage()]); exit; } echo json_encode(["success" => true, "topic" => $topic, "payload" => $payload]); exit; } if (!checkLogin()) { exit; } // Zonen des Fensters. Die Reihenfolge bestimmt die Reihenfolge der Karten; // die Keys muessen zu wateringZones in js/solar/bewaesserungAnzeige.js passen, // "bild" zu ZONENBILDER in js/solar/energiefluss.js. "dauern" sind die // Schnellwahlen in Minuten, die erste ist die Vorgabe. $zonen = [ ["key" => "troughs", "label" => "Tröge", "bild" => "kuebel", "dauern" => [5, 10, 15, 30]], ["key" => "raisedBeds", "label" => "Beete", "bild" => "hochbeet", "dauern" => [30, 15, 45, 60]], ["key" => "frontGarden", "label" => "Vorn", "bild" => "garten", "dauern" => [30, 15, 45, 60]], ]; // Die Abläufe der Ventilsteuerung (Topic .../auto). Mehrere Einträge in // "modi" starten bzw. stoppen gemeinsam. $ablaeufe = [ ["label" => "Tröge + Beete", "modi" => ["Gartenwasser/vorn" => "Trog", "Gartenwasser/hinten" => "Hoch"]], ["label" => "Tröge", "modi" => ["Gartenwasser/vorn" => "Trog"]], ["label" => "Beete", "modi" => ["Gartenwasser/hinten" => "Hoch"]], ["label" => "Vorn", "modi" => ["Gartenwasser/vorn" => "Vorn"]], ]; ?>

Abläufe

Ein Ablauf gießt die Zonen nacheinander – antippen startet, nochmal antippen stoppt. Die Regenautomatik läuft davon unabhängig zum Sonnenaufgang.
" data-dauer="">
" aria-hidden="true">
">
Befehle gehen sofort an die Ventilsteuerung