forked from jappel/leistungsbilanz-ts
Per-circuit cross-section recommendation as a separate module attached to the circuit list. It never writes project data itself: "Übernehmen" applies cable type, cross-section and length through the regular circuit.update command, so revisions and Undo/Redo stay intact. - Pure domain module (src/cable-sizing) with IEC 60364-5-52:2009 Annex B tables for PVC and XLPE, copper and aluminium, methods A1, A2, B1, B2, C, D1, D2 and E. Every value was cross-checked against public reproductions; where sources differ the lower value is used (docs/cable-sizing-module.md). - Temperature and grouping between table values round to the safer value; values outside the tables return no result instead of a factor of 1. Ground methods use B.52.18 (D2) and B.52.19 A (D1). - Overload protection: circuit-breakers In <= Iz; gG fuses additionally I2 <= 1.45 Iz with I2 = 1.6/1.9/2.1 In. - Inputs prefilled from the circuit: power, phase (group or device rows), project voltage, power-weighted cos phi, length and protective device. - Opened from a "Leitungsberechnung" button in the row actions, not from a grid cell, so cable cells keep the spreadsheet behavior. - Stateless API under /api/cable-sizing; no database table or migration. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
37 lines
1.1 KiB
TypeScript
37 lines
1.1 KiB
TypeScript
// Thin fetch client for the cable-sizing module, kept separate from
|
|
// ../utils/api.ts so the module stays self-contained (see
|
|
// docs/cable-sizing-module.md).
|
|
import type {
|
|
CableSizingAlert,
|
|
CableSizingInput,
|
|
CableSizingResult,
|
|
} from "../../cable-sizing/domain/cable-sizing-calculation";
|
|
|
|
export interface CalculateCableSizingResponse {
|
|
result: CableSizingResult;
|
|
alerts: CableSizingAlert[];
|
|
}
|
|
|
|
export async function calculateCableSizing(
|
|
input: CableSizingInput
|
|
): Promise<CalculateCableSizingResponse> {
|
|
const response = await fetch("/api/cable-sizing/calculate", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(input),
|
|
cache: "no-store",
|
|
});
|
|
if (!response.ok) {
|
|
let details = await response.text();
|
|
try {
|
|
const parsed = JSON.parse(details) as { error?: unknown };
|
|
if (typeof parsed.error === "string") {
|
|
details = parsed.error;
|
|
}
|
|
} catch {
|
|
// keep raw text
|
|
}
|
|
throw new Error(details || `Anfrage fehlgeschlagen (Status ${response.status})`);
|
|
}
|
|
return response.json() as Promise<CalculateCableSizingResponse>;
|
|
}
|