Group configured actuator overview
Some checks failed
quality / test (3.11) (push) Has been cancelled
quality / test (3.13) (push) Has been cancelled

This commit is contained in:
2026-06-16 13:51:02 +02:00
parent a7a2f8c78a
commit 8222f24ebe
5 changed files with 27 additions and 7 deletions

View File

@@ -1,5 +1,9 @@
# Changelog
## 0.7.16 - 2026-06-16
- Beobachtete Aktoren werden in der Übersicht nach Raum oder Typ gruppiert und
mit Friendly Name angezeigt.
## 0.7.15 - 2026-06-16
- Add-on-Start ist robust gegen Home-Assistant-Core-502 beim Systemboot:
API und WebSocket-Listener starten trotzdem, Reconciliation/Training werden

View File

@@ -1,5 +1,5 @@
name: SillyHome Next
version: "0.7.15"
version: "0.7.16"
slug: sillyhome_next
description: Lernt automatisch aus deinem Verhalten und steuert freigegebene Aktoren
url: http://192.168.6.31:3000/pino/sillyhome-next

View File

@@ -105,7 +105,7 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]:
app = FastAPI(
title="SillyHome Next API",
description="Lokales Smart-Home-Intelligenzsystem für Home Assistant.",
version="0.7.15",
version="0.7.16",
lifespan=lifespan,
)
app.state.settings = load_settings()

View File

@@ -465,13 +465,28 @@ async function configureActuator() {
async function loadConfiguredActuators() {
const box = document.getElementById("configured-actuators");
try {
const rows = await api("v1/actuators");
const [rows, entities] = await Promise.all([
api("v1/actuators"),
api("v1/entities"),
]);
const entityMap = new Map(entities.map(entity => [entity.entity_id, entity]));
const groups = new Map();
for (const record of rows) {
const entity = entityMap.get(record.actuator_entity_id) || {};
const group = entity.area_name || actuatorGroupLabel(record.actuator_entity_id.split(".", 1)[0]);
if (!groups.has(group)) groups.set(group, []);
groups.get(group).push({record, entity});
}
const groupedRows = [...groups.entries()].sort(([left], [right]) => left.localeCompare(right));
box.innerHTML = rows.length ? `
${groupedRows.map(([group, items]) => `
<h3>${escapeHtml(group)}</h3>
<div class="card-list">
${rows.map(record => `
${items.map(({record, entity}) => `
<article class="actuator-card ${currentActuatorId === record.actuator_entity_id ? "selected" : ""}">
<div class="card-title">
<div>
<div><strong>${escapeHtml(entity.friendly_name || record.actuator_entity_id)}</strong></div>
<div class="entity-id">${escapeHtml(record.actuator_entity_id)}</div>
<div class="${record.behavior.status === "trained" ? "ok" : "warn"}">${escapeHtml(behaviorLabel(record))}</div>
</div>
@@ -493,7 +508,8 @@ async function loadConfiguredActuators() {
</div>
</article>
`).join("")}
</div>` : "<p>Noch keine Aktoren ausgewählt.</p>";
</div>
`).join("")}` : "<p>Noch keine Aktoren ausgewählt.</p>";
} catch (error) {
box.textContent = error.message;
}

View File

@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "sillyhome-next"
version = "0.7.15"
version = "0.7.16"
description = "Lokales Smart-Home-Intelligenzsystem für Home Assistant"
requires-python = ">=3.11"
dependencies = [