Group configured actuator overview
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 ? `
|
||||
<div class="card-list">
|
||||
${rows.map(record => `
|
||||
${groupedRows.map(([group, items]) => `
|
||||
<h3>${escapeHtml(group)}</h3>
|
||||
<div class="card-list">
|
||||
${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;
|
||||
}
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
Reference in New Issue
Block a user