/** 계통의 한 구간(수전·분기·구역) — 자리 하나가 곧 구간이다. */ export interface TopologySegment { id: string; /** 카탈로그 자리 타입(`incoming`·`feeder`·`submeter-zone`). */ type: string; label?: string; /** 이 자리에 달린 계량 지점 id 들 — 비어 있으면 **어두운 구간**이다(값을 알 길이 없다). */ meters: string[]; /** 이 구간의 전력량과 근거 — 폴드가 낸 것만 싣는다(우리가 다시 계산하지 않는다). */ kWh?: number; basis?: 'measured' | 'apportioned'; /** * **피크가 찍힌 순간** 이 구간이 얼마였나(kW) — 요금이 걸린 수다. * * 전력량이 큰 구간과 피크를 만든 구간은 다를 수 있다(하루 종일 조금씩 쓰는 부하 vs 잠깐 크게 쓰는 부하). * 그림에 둘을 함께 두면 「어느 분기를 깎아야 피크가 내려가나」가 바로 읽힌다. */ peakKW?: number; /** 이 자리에 매달린 부하(설비) — 종류를 그대로 싣는다. */ loads: { id: string; kind: string; }[]; /** * 계통 설비(차단기·태양광·축전지) — 부하가 아니라 계통의 일부다. * * `live` 는 **지금 값**이다(구간 값이 아니다): 태양광이 지금 몇 kW 를 만들고, 축전지가 얼마를 내보내며 * 충전율이 얼마인가. 원천이 보내 주는 사실이라 우리가 만들지 않는다 — 보내지 않은 필드는 없다. * * 시각(`measuredAt`)을 함께 나른다: 계측이 끊기면 **멈춘 값을 지금 값으로 그리게** 되고, 그것이 화면이 * 낼 수 있는 가장 나쁜 거짓이다(값이 그럴듯할수록 위험하다). */ gear: { id: string; kind: string; live?: { generatedKW?: number; exportKW?: number; chargeKW?: number; dischargeKW?: number; soc?: number; measuredAt?: string; }; }[]; children: TopologySegment[]; } export interface EnergyTopology { roots: TopologySegment[]; /** * 자리를 모르는 설비 — 집이 없거나, 없는 자리를 가리킨다. 숨기면 그림의 설비 수가 모델과 달라진다. */ unplaced: { id: string; kind: string; }[]; /** 계량기가 없는 자리 id 들 — 「여기에 달면 무엇을 알 수 있나」의 답이 되는 목록이다. */ unmetered: string[]; /** * 결선을 모르는 부하가 매달린 자리 — 커넥터가 「어느 분기가 이 설비에 전기를 주는지 모른다」고 판단해 * 수전에 매단 경우다. 그 자리의 몫이 분기로 내려가지 않는 이유가 이것이다. */ loadsOnIncoming: number; } /** * 모델 + 폴드 결과 → 계통 트리. * * @param model 트윈 모델(자리 계층 `parentId`, 설비 소속 `homeLocation`). * @param energy 폴드가 낸 분기별 몫(있으면 노드에 싣는다 — 없으면 값 없이 구조만 그린다). */ export declare function buildEnergyTopology(model: { locations?: any[]; equipment?: any[]; } | undefined | null, energy?: { byFeeder?: { key: string; kWh: number; basis?: 'measured' | 'apportioned'; peakKW?: number; }[]; } | null, /** * 지금의 설비 상태(스냅샷의 `equipment`) — 발전·저장의 **지금 값**을 기호 옆에 적기 위해서다. * * 없으면 값 없이 구조만 그린다. 여기서 값을 만들지 않는다: 원천이 보내지 않은 것은 모르는 것이다. */ equipmentState?: readonly any[] | null): EnergyTopology;