Steuerung
v1 @@ -210,7 +213,7 @@ -Beobachtete Geräte
@@ -221,13 +224,13 @@Lernfortschritt und Freigabe
Die Freigabe erscheint erst, wenn genug eindeutig zugeordnete Handlungen gelernt wurden. Vorher bleibt das Gerät sicher im Beobachtungsmodus.
System & Cache
@@ -241,7 +244,30 @@ -Einstellungen
+Sprache und Standardwerte für die Bedienoberfläche.
+Die API speichert stabile technische Werte. Die Oberfläche übersetzt sie in die gewählte Sprache.
+Performance-Standard
+Startansichten dürfen maximal 3 Sekunden brauchen. Schwere Daten werden nur nach Menüwechsel oder bei Bearbeitung geladen.
+So gehst du vor
Systemübersicht verzögert: ${escapeHtml(error.message)}
`; + if (budget) budget.textContent = "Systemübersicht verzögert"; + } +} + function scheduleDashboardExtras() { const run = () => { void loadDashboardExtras(); @@ -974,10 +1121,15 @@ function renderConfiguredActuators() { async function showActuator(actuatorId, evaluationMessage = "") { currentActuatorId = actuatorId; + for (const section of document.querySelectorAll(".app-view")) { + section.classList.toggle("active", section.id === "detail"); + } + document.getElementById("section-jump").value = "detail"; + localStorage.setItem("sillyhome.ui.view", "detail"); const box = document.getElementById("actuator-detail"); renderActuatorDetailShell(actuatorId); try { - const record = await api(`v1/actuators/${encodeURIComponent(actuatorId)}`); + const record = await api(`v1/actuators/${encodeURIComponent(actuatorId)}/detail`); contextOptions = []; const contexts = [ record.assignment.selected_numeric_entity_id, @@ -1177,9 +1329,7 @@ async function showActuator(actuatorId, evaluationMessage = "") {Betriebsart: ${escapeHtml(behaviorLabel(record))}
Gelernte Handlungen: ${record.behavior.sample_count}
Davon eindeutig geregelt: ${record.behavior.high_confidence_sample_count}
-Davon erkannte HA-Automationen: ${learnedAutomationActions}
+Erkannte HA-Automationen: ${escapeHtml(learnedAutomationActions)}
Letztes Training: ${escapeHtml(formatDateTime(record.behavior.last_trained_at))}
Was noch passiert: ${escapeHtml(record.behavior.reason)}
Freigabestatus: ${escapeHtml(record.behavior.activation_reason)}
@@ -1304,7 +1454,6 @@ async function showActuator(actuatorId, evaluationMessage = "") { ${currentContextControls} ${manualAssignment} `; - void hydrateContextOptions(record); document.getElementById("detail").scrollIntoView({behavior: "smooth", block: "start"}); } catch (error) { box.textContent = error.message; @@ -1609,10 +1758,12 @@ async function removeActuator(actuatorId) { async function startDashboard() { document.getElementById("status").innerHTML = "Status lädt nach ...
"; - document.getElementById("configured-actuators").innerHTML = "