361 files
This commit is contained in:
@@ -16,6 +16,7 @@ import { t, formatDate, formatDueDays, formatNumber } from "../styles";
|
||||
import { px } from "./chart-utils";
|
||||
import { daysProgress } from "../helpers/interval";
|
||||
import { stampMs } from "../helpers/ha-time";
|
||||
import { primaryTriggerEntity } from "../helpers/trigger-entities";
|
||||
import type { MaintenanceTask, TaskRow, StatisticsPoint } from "../types";
|
||||
|
||||
const MINI_SPARKLINE_W = 60;
|
||||
@@ -36,7 +37,9 @@ export function computeTrend(
|
||||
miniStatsData: Map<string, StatisticsPoint[]>,
|
||||
): TrendState | null {
|
||||
const tc = row.trigger_config;
|
||||
if (!tc?.entity_id) return null;
|
||||
const entityId = primaryTriggerEntity(tc);
|
||||
// The battery fleet's row tells "N to replace", not one battery's curve.
|
||||
if (!tc || !entityId || row.battery_fleet_task) return null;
|
||||
let toward: 1 | -1;
|
||||
const type = tc.type || "threshold";
|
||||
if (type === "threshold") {
|
||||
@@ -48,7 +51,7 @@ export function computeTrend(
|
||||
} else {
|
||||
return null; // compound: conditions may point both ways
|
||||
}
|
||||
const statsPoints = miniStatsData.get(tc.entity_id) || [];
|
||||
const statsPoints = miniStatsData.get(entityId) || [];
|
||||
// Runtime and state_change accumulate SINCE the last completion — the
|
||||
// history's trigger_value is the count at the previous trigger, a point
|
||||
// from before the reset. Falling back to it read a freshly reset task
|
||||
@@ -235,8 +238,9 @@ export function renderMiniSparkline(
|
||||
miniStatsData: Map<string, StatisticsPoint[]>,
|
||||
lang: string,
|
||||
) {
|
||||
if (!row.trigger_config?.entity_id) return nothing;
|
||||
const entityId = row.trigger_config.entity_id;
|
||||
const entityId = primaryTriggerEntity(row.trigger_config);
|
||||
// The battery fleet's row tells "N to replace", not one battery's curve.
|
||||
if (!entityId || row.battery_fleet_task) return nothing;
|
||||
|
||||
// PRIMARY: HA recorder statistics (daily, last 14 days)
|
||||
const statsPoints = miniStatsData.get(entityId) || [];
|
||||
|
||||
@@ -16,6 +16,7 @@ import { t, fireMoreInfo, formatDueDays } from "../styles";
|
||||
import { fmtNum, fmtVal } from "./chart-utils";
|
||||
import { dueDaysOf } from "./progress";
|
||||
import { stampMs } from "../helpers/ha-time";
|
||||
import { primaryTriggerEntity, triggerEntityIds } from "../helpers/trigger-entities";
|
||||
import "../components/trigger-chart";
|
||||
import type { ChartPoint, ChartEvent } from "../components/trigger-chart";
|
||||
import type { MaintenanceTask, TriggerConfig, StatisticsPoint } from "../types";
|
||||
@@ -156,9 +157,9 @@ export function renderTriggerSection(task: MaintenanceTask, ctx: SparklineContex
|
||||
const L = ctx.lang;
|
||||
const info = task.trigger_entity_info;
|
||||
const infos = task.trigger_entity_infos;
|
||||
const friendlyName = info?.friendly_name || tc.entity_id || "—";
|
||||
const entityId = tc.entity_id || "";
|
||||
const entityIds = tc.entity_ids || (entityId ? [entityId] : []);
|
||||
const entityId = primaryTriggerEntity(tc) || "";
|
||||
const friendlyName = info?.friendly_name || entityId || "—";
|
||||
const entityIds = triggerEntityIds(tc);
|
||||
const unit = info?.unit_of_measurement || "";
|
||||
const currentVal = task.trigger_current_value;
|
||||
const triggerType = tc.type || "threshold";
|
||||
@@ -215,7 +216,7 @@ export function renderTriggerSection(task: MaintenanceTask, ctx: SparklineContex
|
||||
${triggerType === "compound" ? html`
|
||||
<span class="trigger-limit-item"><span class="dot warn" aria-hidden="true"></span> ${t("compound_logic", L)}: ${tc.compound_logic || (tc as any).operator || "AND"}</span>
|
||||
${(tc.conditions || []).map((cond: any, i: number) => html`
|
||||
<span class="trigger-limit-item"><span class="dot range" aria-hidden="true"></span> ${i + 1}. ${t(cond.type === "due_date" ? "trigger_type_due_date" : cond.type || "unknown", L)}: ${cond.entity_id ? html`<span class="entity-link" @click=${(ev: Event) => fireMoreInfo(ev, cond.entity_id)}>${cond.entity_id}</span>` : ""}</span>
|
||||
<span class="trigger-limit-item"><span class="dot range" aria-hidden="true"></span> ${i + 1}. ${t(cond.type === "due_date" ? "trigger_type_due_date" : cond.type || "unknown", L)}: ${triggerEntityIds(cond).map((eid, j) => html`${j > 0 ? ", " : ""}<span class="entity-link" @click=${(ev: Event) => fireMoreInfo(ev, eid)}>${eid}</span>`)}</span>
|
||||
`)}
|
||||
` : nothing}
|
||||
</div>
|
||||
@@ -330,7 +331,7 @@ function rawStatsPoints(task: MaintenanceTask, ctx: SparklineContext): ChartPoin
|
||||
const tc = task.trigger_config;
|
||||
if (!tc) return [];
|
||||
const triggerType = tc.type || "threshold";
|
||||
const entityId = tc.entity_id || "";
|
||||
const entityId = primaryTriggerEntity(tc) || "";
|
||||
// Runtime accumulates hours DERIVED from the entity's on/off time — the
|
||||
// entity's own long-term statistics (an on/off ratio, or an unrelated raw
|
||||
// sensor value) are NOT that accumulation. Plot only the recorded per-cycle
|
||||
@@ -372,7 +373,7 @@ function renderChart(task: MaintenanceTask, unit: string, ctx: SparklineContext)
|
||||
const tc = task.trigger_config;
|
||||
if (!tc) return nothing;
|
||||
const triggerType = tc.type || "threshold";
|
||||
const entityId = tc.entity_id || "";
|
||||
const entityId = primaryTriggerEntity(tc) || "";
|
||||
// A due date only counts down — no curve to tell.
|
||||
if (triggerType === "due_date") return nothing;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user