Group configured actuator overview

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

@@ -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;
}