Nach dem Fahrbefehl liest der Server nach, nicht der Browser
Wer das Raum-Modal gleich nach einem Fahrbefehl zumachte, nahm den einzigen Zuschauer mit: die Verfolgung im Browser endet mit dem Modal, und niemand hielt fest, wo die Jalousie stehen blieb. In actor_states stand bis zum naechsten Poll des Runners der alte Wert - genau die fuenf Minuten, die eigentlich weg sein sollten. ajax/room.php schickt die Antwort auf ein Tahoma-Kommando jetzt ab, schliesst die Verbindung und wartet danach selbst auf das Ende der Fahrt (fastcgi_finish_request, dieselbe Bauart wie in ajax/tahoma.php). Ob der Browser noch da ist, spielt keine Rolle mehr; ignore_user_abort deckt auch den Fall ab, dass er mitten im Aufruf verschwindet. Die Verfolgung im Modal bleibt, sie ist jetzt aber nur noch fuer die Anzeige zustaendig, solange jemand hinsieht. Das Aufschreiben haengt nicht mehr daran. Geprueft an der Wozi-Schiebetuer: Kommando auf Position 70, 0,7 Sekunden spaeter die Seite neu geladen. 48 Sekunden danach zeigte das frisch geoeffnete Modal 70 - und eine Neigung von 59 statt 62, die sich beim Fahren von selbst verstellt hatte und die nur die Box kannte. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+44
-2
@@ -46,6 +46,38 @@ function raumAntwort($data, $code = 200)
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Die Antwort abschicken, aber weiterarbeiten.
|
||||
*
|
||||
* Nach einem Fahrbefehl muss noch jemand abwarten, wo die Jalousie stehen
|
||||
* bleibt, und das aufschreiben - sonst steht in actor_states bis zum
|
||||
* naechsten Poll des Runners der alte Wert. Das dem Browser zu ueberlassen
|
||||
* ging schief: wer das Modal gleich nach dem Fahrbefehl zumachte, nahm den
|
||||
* einzigen Zuschauer mit.
|
||||
*
|
||||
* Dieselbe Bauart wie in ajax/tahoma.php: Content-Length setzen, ausliefern,
|
||||
* die Verbindung schliessen, weiterlaufen. Ohne FPM bleibt nur, die Puffer zu
|
||||
* leeren - dann hat der Browser seine Daten zwar, wartet aber trotzdem.
|
||||
*/
|
||||
function raumAntwortUndWeiter($data)
|
||||
{
|
||||
http_response_code(200);
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
$text = json_encode($data, JSON_UNESCAPED_UNICODE);
|
||||
header("Content-Length: " . strlen($text));
|
||||
echo $text;
|
||||
// Der Aufrufer ist weg, das Skript soll trotzdem zu Ende kommen.
|
||||
ignore_user_abort(true);
|
||||
if (function_exists("fastcgi_finish_request")) {
|
||||
fastcgi_finish_request();
|
||||
return;
|
||||
}
|
||||
while (ob_get_level() > 0) {
|
||||
ob_end_flush();
|
||||
}
|
||||
flush();
|
||||
}
|
||||
|
||||
// --- Schaltende Aufrufe ---------------------------------------------------
|
||||
if ($_SERVER["REQUEST_METHOD"] === "POST") {
|
||||
$body = json_decode(file_get_contents("php://input"), true);
|
||||
@@ -54,10 +86,20 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
|
||||
}
|
||||
try {
|
||||
if (($_GET["action"] ?? "") === "command") {
|
||||
$text = executeCommand(intval($body["command_id"] ?? 0),
|
||||
$id = intval($body["command_id"] ?? 0);
|
||||
$text = executeCommand($id,
|
||||
is_array($body["params"] ?? null) ? $body["params"] : [],
|
||||
!empty($body["probe"]));
|
||||
raumAntwort(["ok" => $text]);
|
||||
// Bei einem Tahoma-Geraet ist mit dem Absenden noch nichts
|
||||
// festgehalten: die Box meldet die neue Stellung erst, wenn die
|
||||
// Fahrt zu Ende ist. Also Antwort raus und in Ruhe nachsehen.
|
||||
$url = empty($body["probe"]) ? tahomaUrlZuKommando($id) : null;
|
||||
if ($url === null) {
|
||||
raumAntwort(["ok" => $text]);
|
||||
}
|
||||
raumAntwortUndWeiter(["ok" => $text]);
|
||||
tahomaNachlesen($url);
|
||||
exit;
|
||||
}
|
||||
if (($_GET["action"] ?? "") === "temp") {
|
||||
// Bewusst derselbe Weg wie im alten Thermostat-Modal: das Topic
|
||||
|
||||
Reference in New Issue
Block a user