Regenbasierte automatische Gartenbewässerung + homeMesh-Anbindung für AutoAction-Regeleditor
- Neues stündliches Python-Script (restricted/gartenbewaesserung/auto_watering.py): holt Niederschlags- und Sonnenuntergangsdaten von Open-Meteo, wertet je Zone (Hochbeete/Tröge/Garten vorn) individuelle Regen-Schwellenwerte und Mindest-Bewässerungsdauern aus und startet bei Bedarf per MQTT den passenden Automatik-Modus der Ventilsteuerung im Zeitraum vor Sonnenuntergang; veröffentlicht den Regen-Status zusätzlich stündlich als retained MQTT-Nachricht je Zone. - Web-UI: neue Bewässerungs-Steuerung/-Anzeige (ajax/watering.php, js/solar/solarMQTT.js, assets/img/realtime.svg) inkl. Live-Status-Icons (aus/geplant/pausiert/aktiv per Farbe und Symbol). - AutoAction-Regeleditor (ajax/actorDetails.php, sensorDetails.php, fillActorDD.php, fillSensorDD.php, tahoma.php, AutoAction.php) liest Actor-/Sensor-Parameter jetzt live aus der homeMesh-Datenbank statt aus stark vereinfachten Altfeldern, inkl. zugehöriger Anpassungen am Device-Discovery-Tooling (restricted/deviceDiscovery/*, neues logic_module.py). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
<?php
|
||||
|
||||
require_once("./phpMQTT.php");
|
||||
require_once("../helper.php");
|
||||
|
||||
if ($_SERVER["REQUEST_METHOD"] === "POST") {
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
|
||||
if (!checkLogin()) {
|
||||
http_response_code(401);
|
||||
echo json_encode(["success" => 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;
|
||||
}
|
||||
|
||||
echo <<<HTML
|
||||
<div class="table-responsive p-3">
|
||||
<div id="watering-feedback" class="alert d-none mb-3" role="status"></div>
|
||||
<div class="mb-3">
|
||||
<h6>Automatik</h6>
|
||||
<div class="d-flex flex-wrap gap-2">
|
||||
<button type="button" class="btn btn-outline-primary" data-watering-auto-toggle data-watering-auto="Trog,Hoch" data-watering-topics="Gartenwasser/vorn,Gartenwasser/hinten" data-watering-label="Tröge und Hochbeete">Tröge und Hochbeete</button>
|
||||
<button type="button" class="btn btn-outline-primary" data-watering-auto-toggle data-watering-auto="Trog" data-watering-topic="Gartenwasser/vorn" data-watering-label="Tröge">Tröge</button>
|
||||
<button type="button" class="btn btn-outline-primary" data-watering-auto-toggle data-watering-auto="Hoch" data-watering-topic="Gartenwasser/hinten" data-watering-label="Hochbeete">Hochbeete</button>
|
||||
<button type="button" class="btn btn-outline-primary" data-watering-auto-toggle data-watering-auto="Vorn" data-watering-topic="Gartenwasser/vorn" data-watering-label="Garten vorn">Garten vorn</button>
|
||||
</div>
|
||||
</div>
|
||||
<h6>Manuell</h6>
|
||||
<table class="table align-middle mb-3">
|
||||
<thead><tr><th>Zone</th><th>Dauer (Min.)</th><th>Letzte Bewässerung</th><th>Dauer</th><th>Steuerung</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>Tröge</td><td><input class="form-control" type="number" min="1" max="120" value="5" data-watering-timer="troughs"></td><td data-watering-last="troughs">--</td><td data-watering-duration="troughs">--</td><td><button type="button" class="btn btn-success" data-watering-toggle data-watering-zone="troughs">Ein</button></td></tr>
|
||||
<tr><td>Beete</td><td><input class="form-control" type="number" min="1" max="120" value="30" data-watering-timer="raisedBeds"></td><td data-watering-last="raisedBeds">--</td><td data-watering-duration="raisedBeds">--</td><td><button type="button" class="btn btn-success" data-watering-toggle data-watering-zone="raisedBeds">Ein</button></td></tr>
|
||||
<tr><td>Vorn</td><td><input class="form-control" type="number" min="1" max="120" value="30" data-watering-timer="frontGarden"></td><td data-watering-last="frontGarden">--</td><td data-watering-duration="frontGarden">--</td><td><button type="button" class="btn btn-success" data-watering-toggle data-watering-zone="frontGarden">Ein</button></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
HTML;
|
||||
Reference in New Issue
Block a user