"Konnte die Anfrage nicht lesen."], 400); } try { if (($_GET["action"] ?? "") === "command") { $text = executeCommand(intval($body["command_id"] ?? 0), is_array($body["params"] ?? null) ? $body["params"] : [], !empty($body["probe"])); raumAntwort(["ok" => $text]); } if (($_GET["action"] ?? "") === "temp") { // Bewusst derselbe Weg wie im alten Thermostat-Modal: das Topic // Raumtemp///changeSetTemp. // Das Leerzeichen muss durch: Raumnamen wie "Carport EG" haben // eines, und ohne es findet der Vergleich weiter unten den Raum // nicht mehr. $raum = preg_replace('/[^A-Za-z0-9_ ]/', '', strval($body["room"] ?? "")); $temp = intval($body["temp"] ?? 0); if ($temp < 10 || $temp > 30) { raumAntwort(["error" => "Temperatur außerhalb 10–30 °C."], 400); } $mqtt = new Bluerhinos\phpMQTT(MQTT_BROKER, MQTT_PORT, "RoomTempSetter_" . getmypid()); if (!$mqtt->connect(true, null, "", "")) { raumAntwort(["error" => "Keine Verbindung zum MQTT-Broker."], 500); } $mqtt->publish("Raumtemp/" . str_replace("_", "/", $raum) . "/changeSetTemp", strval($temp), 0, false); $mqtt->close(); raumAntwort(["ok" => "Solltemperatur " . $temp . " °C"]); } // Eine Jalousie waehrend ihrer Fahrt nachfuehren. actor_states wird // sonst nur vom Runner fortgeschrieben, und der fragt die Box alle // fuenf Minuten ab - so lange stand nach einem Fahrbefehl der alte // Wert im Modal. Hier wird genau ein Geraet gelesen, das kostet die // Box wenig, und der frische Stand landet gleich in der Tabelle. if (($_GET["action"] ?? "") === "jalousie") { $url = tahomaAktorUrl(intval($body["actor"] ?? 0)); if ($url === null) { raumAntwort(["error" => "Kein Tahoma-Gerät mit dieser Nummer."], 404); } $zustaende = tahomaZustaende($url); if ($zustaende === null) { raumAntwort(["error" => "Tahoma-Box antwortet nicht."], 503); } tahomaZustaendeSchreiben($url, $zustaende); $zahl = function ($feld) use ($zustaende) { return isset($zustaende[$feld]) && is_numeric($zustaende[$feld]) ? intval($zustaende[$feld]) : null; }; raumAntwort([ "faehrt" => ($zustaende["core:MovingState"] ?? null) === true, "position" => $zahl("core:ClosureState"), "neigung" => $zahl("core:SlateOrientationState"), ]); } raumAntwort(["error" => "Unbekannte Aktion."], 400); } catch (InvalidArgumentException $e) { raumAntwort(["error" => $e->getMessage()], 400); } catch (Throwable $e) { raumAntwort(["error" => $e->getMessage()], 500); } } // --- Inhalt des Modals ---------------------------------------------------- // Das Leerzeichen gehoert zu den erlaubten Zeichen. Ohne es wurde aus // "AG_Carport EG" ein "AG_CarportEG", und der Vergleich gegen die // gespeicherte Zuordnung "AG/Carport EG" ging ins Leere - das Modal meldete // dann "Diesem Raum ist noch nichts zugeordnet". Aufgefallen ist es erst mit // dem Aussengelaende: dort haben sechs von neun Raeumen ein Leerzeichen im // Namen, auf den anderen Etagen keiner von achtzehn. $schluessel = preg_replace('/[^A-Za-z0-9_ ]/', '', strval($_GET["room"] ?? "")); $teile = explode("_", $schluessel, 2); $etage = $teile[0] ?? ""; $name = $teile[1] ?? ""; $raumKey = $etage . "/" . $name; // Alles im Raum, sortiert nach Bedienform. Das Thermostat selbst wird nicht // als Karte gezeichnet: es wird zum Schieberegler im Heizungs-Reiter und // braucht daneben keine zweite Bedienung - "Solltemperatur" stand sonst // zweimal im Modal. // // Ob es einen Heizungs-Reiter gibt, entscheidet genau das: haengt in diesem // Raum ein Thermostat? Frueher stand hier "hat der Raum eine Kachel" - das // stimmte, solange nur Raeume mit Thermostat eine bekamen. Seit auch Kueche // und Technik eine haben, bekamen sie einen Heizungsregler fuer eine // Heizung, die es dort nicht gibt. $katalog = deviceCatalog(); $hatThermostat = false; $gruppen = []; foreach ($katalog as $d) { if ($d["room"] !== $raumKey) { continue; } $form = bedienform($d); if ($form === "heizung") { $hatThermostat = true; continue; } $gruppen[$form][] = $d; } // Die Heizung ist eine Gruppe wie die anderen, nur baut sie sich nicht aus // einer Geraeteliste: ein Regler fuer den Raum statt einer Karte je Geraet. $fertig = []; if ($hatThermostat) { $karte = "
" . "
" . "" . "" . "
" . "" // Der Ist-Zustand kommt live ueber MQTT, nicht aus der Datenbank - // der Browser hoert ohnehin schon auf Raumtemp/#, und ein Wert von // vorhin waere neben dem Regler nur irrefuehrend. . "
" . " °C" . " %rF" . "heizt" . "
"; $fertig["heizung"] = $karte; } echo "
"; if (!$gruppen && !$fertig) { echo "

Diesem Raum ist noch nichts zugeordnet. " . "Das geht über das Haus-Symbol in der Karte „Automatismen“.

"; } echo zeichneGruppen($gruppen, $fertig); echo "
"; echo "
";