Raum-Modal Licht: Preset als Chips, Effekt als durchsuchbarer Picker, WLED-Zustand live

Die native Auswahlliste zeichnete Chrome hell auf hell. Welcher Effekt und
welches Preset gerade laufen, liest room.php?action=wled direkt von der Lampe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 22:27:40 +02:00
co-authored by Claude Opus 5
parent d5d2d8f336
commit 0eb01403c5
5 changed files with 173 additions and 42 deletions
+33
View File
@@ -168,6 +168,39 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
"myNeigung" => $zahl("core:Memorized1OrientationState"),
]);
}
// Den Zustand einer WLED-Lampe live lesen: an/aus, Helligkeit, Farbe,
// Effekt und Preset. In actor_states stehen nur die ersten drei, und
// ohne Effekt und Preset koennte das Raum-Modal nicht zeigen, was
// gerade laeuft.
if (($_GET["action"] ?? "") === "wled") {
$db = commandDb();
$stmt = $db->prepare("SELECT url FROM actors WHERE id = ?");
$id = intval($body["actor"] ?? 0);
$stmt->bind_param("i", $id);
$stmt->execute();
$zeile = $stmt->get_result()->fetch_assoc();
$stmt->close();
if (!$zeile || strpos(strval($zeile["url"]), "wled://") !== 0) {
raumAntwort(["error" => "Keine WLED-Lampe mit dieser Nummer."], 404);
}
$ch = curl_init("http://" . rtrim(substr($zeile["url"], strlen("wled://")), "/") . "/json/state");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
$stand = json_decode(strval(curl_exec($ch)), true);
curl_close($ch);
if (!is_array($stand)) {
raumAntwort(["error" => "Die Lampe antwortet nicht."], 503);
}
$segment = $stand["seg"][0] ?? [];
$farbe = $segment["col"][0] ?? null;
raumAntwort([
"an" => !empty($stand["on"]),
"bri" => isset($stand["bri"]) ? intval($stand["bri"]) : null,
"farbe" => is_array($farbe) && count($farbe) >= 3 ? array_map("intval", array_slice($farbe, 0, 3)) : null,
"effect" => isset($segment["fx"]) ? intval($segment["fx"]) : null,
"preset" => isset($stand["ps"]) ? intval($stand["ps"]) : null,
]);
}
// Den Stand, auf dem die Jalousie gerade steht, als my-Position in den
// Motor schreiben. Die Box kennt dafuer setMemorized1Position und bei
// Raffstores zusaetzlich setMemorized1Orientation; die Geraetesuche