leistungsbilanz-ts/docs/cable-sizing-module.md
Grovy311 49488f4e1b Add optional cable-sizing module
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>
2026-09-26 11:16:18 +02:00

8.3 KiB
Raw Blame History

Leitungsberechnung (Cable-Sizing-Modul)

Optionales, abgegrenztes Rechenmodul für die Querschnittsempfehlung eines Stromkreises. Es wurde als eigenständiges Modul vereinbart, das an die Stromkreisliste angedockt ist. Es schreibt keine Projektdaten selbst: Ein Ergebnis wird erst durch ausdrückliches „Übernehmen“ über den bestehenden Befehl circuit.update in den Stromkreis geschrieben. Revisionen und Undo/Redo bleiben damit unverändert gültig.

Die vollständige, automatische Bemessung aller Stromkreise (siehe docs/spec/06-future-sizing-and-calculations.md) ist weiterhin nicht Teil dieses Moduls.

Aufbau und Andockpunkte

src/cable-sizing/domain/cable-sizing-calculation.ts   reine Berechnung + Tabellen
src/cable-sizing/domain/cable-sizing-contracts.ts     Zod-Schema der API
src/server/controllers/cable-sizing.controller.ts     zustandslose Endpunkte
src/server/routes/cable-sizing.routes.ts              Router unter /api/cable-sizing
src/frontend/components/cable-sizing-api.ts           Fetch-Client
src/frontend/components/cable-sizing-defaults.ts      Vorbelegung aus dem Stromkreis
src/frontend/components/cable-sizing-modal.tsx        Dialog
tests/cable-sizing-calculation.test.ts                Tabellen, Rechnung, Vorbelegung

Das Domänenmodul importiert nichts aus db/, server/ oder frontend/. Außerhalb dieser Dateien gibt es genau zwei Andockpunkte:

  1. src/server/index.ts: app.use("/api/cable-sizing", cableSizingRouter).
  2. src/frontend/components/circuit-tree-editor.tsx: Zustand für den geöffneten Dialog, ein Button Leitungsberechnung (Rechner-Icon) in der Aktionsspalte jeder Stromkreiszeile, der Dialog selbst und handleApplyCableSizing, das über updateCircuitById den regulären circuit.update-Befehl ausführt.

Der Aufruf liegt bewusst nicht auf einer Tabellenzelle: Klick, Doppelklick, Enter, F2 und Tippen in den Kabelspalten verhalten sich wie in jeder anderen Zelle (Spreadsheet-Regel in AGENTS.md). Es gibt keine eigene Datenbanktabelle und keine Migration.

Eingaben und Vorbelegung

Eingabe Vorbelegung
Leistung circuitTotalPower des Stromkreises (mit Geräte-GZF), nicht editierbar
Phasen 3~, wenn die Stromkreisgruppe 3-phasig ist oder eine Gerätezeile three_phase hat, sonst 1~
Spannung circuit.voltage (aus den Projekteinstellungen abgeleitet); bei manuell abweichender Phasenzahl die jeweilige Projektspannung
cos φ leistungsgewichtet aus den Gerätezeilen: P / Σ(P_Zeile / cos φ_Zeile), fehlendes cos φ = 1; änderbar
Länge cableLength des Stromkreises
Schutzorgan Schutzgerät des Stromkreises: LS, FI/LS, AFDD = Leitungsschutzschalter; D0/NH = Sicherung gG; FI ohne Überstromauslöser wird nicht berücksichtigt
Verlegeart, Isolierstoff, Leitermaterial, Temperatur, Häufung, max. ΔU, Oberschwingungen Planereingaben

Kabeltyp und Querschnitt lassen sich im Dialog auch ohne Berechnung direkt eintragen. Weicht der Eintrag von der Empfehlung oder dem Praxis-Mindestquerschnitt ab, erscheint nur ein Hinweis.

Rechenweg

  1. Betriebsstrom I_B aus Leistung, Spannung, cos φ und Phasenzahl.
  2. Erforderliche Belastbarkeit: ohne Schutzorgan I_B; mit Schutzorgan max(I_B, I_n, I₂/1,45) nach IEC 60364-4-43 (I_n ≤ I_z und I₂ ≤ 1,45 · I_z). I₂/I_n: Leitungsschutzschalter 1,45; Sicherung gG 2,1 (I_n ≤ 4 A), 1,9 (4 A < I_n < 16 A), 1,6 (I_n ≥ 16 A).
  3. Tabellenwert I_z je Querschnitt × Temperaturfaktor × Häufungsfaktor (× 0,86 bei 15–33 % 3. Harmonischer im Drehstromkreis).
  4. Spannungsfall ΔU = k · L · I_B · cos φ / (κ · A · U) mit k = 2 (1~) bzw. √3 (3~), κ = 48 (Cu) bzw. 30 (Al) m/(Ω·mm²) bei Betriebstemperatur; Reaktanz wird vernachlässigt.
  5. Empfehlung = größerer Querschnitt aus Belastbarkeit und Spannungsfall; 1-phasige Stromkreise werden auf den Praxis-Mindestquerschnitt 2,5 mm² angehoben (Planungskonvention aus docs/spec/06-…, keine Rechenanforderung).
  6. Zusätzlich: maximale Länge für den zulässigen Spannungsfall.

Temperaturen und Häufungen zwischen Tabellenwerten werden auf den nächsten ungünstigeren Tabellenwert gerundet (höhere Temperatur, mehr Stromkreise). Werte außerhalb der Tabellen liefern kein Ergebnis und eine Meldung – es wird nie stillschweigend mit Faktor 1 gerechnet.

Datenbasis und Prüfnachweis

Grundlage ist IEC 60364-5-52:2009, Anhang B. Alle Werte wurden am 26.09.2026 zeilenweise mit öffentlich zugänglichen Wiedergaben abgeglichen: TiSoft ElectricalDesign-Hilfe zu IEC 60364-5-52 (ti-soft.com/en/support/help/electricaldesign/standards/iec-60364-5-52/…) und ECalPro (ecalpro.com/standards/iec-60364/…). Wo die Quellen voneinander abweichen, ist der kleinere, sichere Wert eingetragen.

Tabelle Inhalt Abgleich Abweichungen
B.52.2 PVC, 2 belastete Adern, Cu/Al, A1–D2 TiSoft; Cu A1–C zusätzlich ECalPro Cu A1 240 mm²: 321 / 320 → 320
B.52.3 VPE, 2 belastete Adern, Cu/Al, A1–D2 TiSoft –
B.52.4 PVC, 3 belastete Adern, Cu/Al, A1–D2 TiSoft –
B.52.5 VPE, 3 belastete Adern, Cu/Al, A1–D2 TiSoft –
B.52.10 / .11 PVC, Verlegeart E, mehradrig, Cu / Al TiSoft; Cu 2 Adern zusätzlich ECalPro Cu 3 Adern 70 / 120 mm²: 198 / 278 bzw. 196 / 276 → 196 / 276
B.52.12 / .13 VPE, Verlegeart E, mehradrig, Cu / Al TiSoft –
B.52.14 Temperatur Luft, PVC / VPE TiSoft, ECalPro –
B.52.15 Temperatur Erde, PVC / VPE TiSoft –
B.52.17 Häufung Luft, Zeile 1 (gebündelt) TiSoft, ECalPro –
B.52.18 Häufung Erde direkt, Kabel berührend TiSoft –
B.52.19 A Häufung mehradrige Kabel in berührenden Rohren im Erdreich TiSoft –

Anwendung der Tabellen:

  • Verlegearten A1, A2, B1, B2, C, E in Luft (Bezug 30 °C), D1 und D2 im Erdreich (Bezug 20 °C, Bodenwärmewiderstand 2,5 K·m/W). Nach Tabelle B.52.1 ist D1 = Leitung im Rohr/Kabelschutzrohr im Erdreich und D2 = Kabel direkt im Erdreich.
  • Häufung in Luft immer nach B.52.17 Zeile 1, auch für Verlegeart E; das ist die ungünstigste Anordnung (einlagig auf Pritschen wären höhere Faktoren zulässig). D1 nach B.52.19 A, D2 nach B.52.18 jeweils „berührend“.
  • Aluminium nur mit den echten Aluminiumwerten (ab 2,5 mm², D2 ab 16 mm²); Querschnitte ohne Tabellenwert werden nie empfohlen.
  • Die Verlegearten F und G (Einzeladern mit Abstand) sind nicht enthalten.

Vor produktivem Einsatz: Die nationalen Tabellen der DIN VDE 0298-4 können in einzelnen Werten abweichen. Der Planer muss die Tabellen gegen den Normtext prüfen. Die Prüfung ist in tests/cable-sizing-calculation.test.ts über Stichwerte und eine Monotonieprüfung jeder Tabellenzeile abgesichert.

Nicht enthalten

  • Kurzschlussfestigkeit, Abschaltbedingungen (Schleifenimpedanz) und Selektivität
  • Bodenwärmewiderstand ≠ 2,5 K·m/W, Häufung mit Abstand, Verlegearten F/G
  • Bemessung des Neutralleiters bei > 33 % 3. Harmonischer (nur Hinweis)
  • automatische Bemessung oder Prüfung aller Stromkreise

API

POST /api/cable-sizing/calculate – zustandslos, liest und schreibt keine Projektdaten.

{
  "phase": 1,                       // 1 | 3
  "mode": "power",                  // "power" | "current"
  "powerKw": 4.2,                   // bei mode "power"
  "currentA": 18.3,                 // bei mode "current"
  "cosPhi": 0.95,                   // 0,1 … 1
  "voltage": 230,
  "lengthM": 23.5,
  "layingMethod": "C",              // A1 | A2 | B1 | B2 | C | D1 | D2 | E
  "conductorMaterial": "copper",    // copper | aluminum
  "insulation": "pvc",              // pvc | xlpe
  "ambientTemperatureC": 30,        // Luft; bei D1/D2 Bodentemperatur
  "groupingCircuits": 1,            // 1 … 100, Tabellen bis 20
  "maxVoltageDropPercent": 3,
  "harmonicNeutralLoad": "none",    // none | 15to33Percent | over33Percent
  "existingProtection": { "ratedCurrentA": 16, "kind": "breaker" }, // optional; kind: breaker | fuse
  "circuitCategory": "single_phase" // optional
}

Antwort: { "result": CableSizingResult, "alerts": CableSizingAlert[] }. result.supported = false mit unsupportedReason (temperature oder grouping), wenn die Eingaben außerhalb der Tabellen liegen. GET /api/cable-sizing/laying-methods und GET /api/cable-sizing/insulation-materials liefern die Auswahllisten.