Heizkörper berechnen: Größe und Leistung für jeden Raum
Mit dem kostenlosen UNIDOMO Heizkörperrechner können Sie Ihren Heizkörper berechnen und die passende Heizkörpergröße für jeden Raum finden. Der Rechner ermittelt aus Raumgröße, Baujahr und Vorlauftemperatur die benötigte Heizleistung und schlägt Ihnen Typ und Maße vor.
Planen Sie den Umstieg auf eine Wärmepumpe? Dann prüfen Sie im zweiten Modus, ob Ihre vorhandenen Heizkörper auch mit 45 oder 55 °C Vorlauftemperatur noch ausreichen.
Ergebnis mit Typ und Maßen
Wärmepumpen-Check
Kostenlos und ohne Anmeldung
Heizkörper berechnen in fünf Schritten
Mit diesem Rechner können Sie Ihren Heizkörper berechnen: Sie erfahren, wie viel Heizleistung ein Raum braucht und welche Heizkörpergröße passt. Planen Sie eine Wärmepumpe, prüfen Sie hier auch, ob Ihre vorhandenen Heizkörper bei niedriger Vorlauftemperatur noch ausreichen.
Ziel
Raum
Gebäude
Heizung
Heizkörper
Ergebnis
Was möchten Sie berechnen?
Um welchen Raum geht es?
m²
Bitte geben Sie eine Fläche zwischen 2 und 150 m² ein.
Vorgeschlagen nach DIN EN 12831 für die gewählte Raumart. Sie können den Wert anpassen.
Bitte wählen Sie eine Temperatur zwischen 15 und 26 °C.
Wie ist das Gebäude gebaut?
Mit welcher Vorlauftemperatur heizen Sie?
Wo finde ich das? Im Menü Ihres Heizungsreglers, in der Bedienungsanleitung oder im Wartungsprotokoll. Gemeint ist die Temperatur an sehr kalten Wintertagen. Planen Sie eine Wärmepumpe, wählen Sie 45 oder 55 °C.
°C
Bitte einen Wert zwischen 28 und 90 °C eingeben.
°C
Unbekannt? Lassen Sie das Feld leer, dann schätzen wir den Wert.
Der Rücklauf muss unter dem Vorlauf und über der Raumtemperatur liegen.
Wo soll der Heizkörper hin?
Unter einem Fenster: Abstand Boden bis Fensterbank minus etwa 150 mm.
mm
Freie Wandbreite, zum Beispiel die Fensterbreite.
Bitte einen Wert zwischen 400 und 3000 mm eingeben.
Die Leistung wird gleichmäßig aufgeteilt.
Welche Heizkörper hängen im Raum?
So erkennen Sie den Typ: Schauen Sie von oben durch das Abdeckgitter. Die erste Ziffer steht für die Anzahl der Platten, die zweite für die Lamellenreihen (Konvektoren) dazwischen. Zwei Platten mit zwei Lamellenreihen sind also Typ 22.
(function () {
'use strict';
var root = document.getElementById('uni-hkr');
if (!root || root.getAttribute('data-ready') === '1') return;
root.setAttribute('data-ready', '1');
/* ---------- Einstellungen ---------- */
var CONFIG = {
email: 'info@unidomo.com',
outdoorTemp: -12,
links: {
heizkoerper: 'https://www.unidomo.de/marke/buderus/heizkoerper/',
badheizkoerper: '',
abgleich: '/heizung/ratgeber/hydraulischer-abgleich-heizung/',
heizlastrechner: '',
waermepumpenrechner: ''
}
};
/* ---------- Daten ---------- */
var ROOMS = {
wohnen: { label: 'Wohnzimmer', t: 20 },
schlafen: { label: 'Schlafzimmer', t: 20 },
kind: { label: 'Kinderzimmer', t: 20 },
kueche: { label: 'Küche', t: 20 },
arbeit: { label: 'Arbeitszimmer', t: 20 },
bad: { label: 'Badezimmer', t: 24 },
flur: { label: 'Flur oder Diele', t: 15 }
};
/* spezifische Raumheizlast in W/m² bei 20 °C innen, -12 °C außen, 2,50 m, eine Außenwand */
var AGES = {
a1: { label: 'vor 1978, unsaniert', w: 120 },
a2: { label: 'vor 1978, teilsaniert', w: 95 },
a3: { label: 'Altbau, umfassend saniert', w: 60 },
a4: { label: '1978 bis 1994', w: 90 },
a5: { label: '1995 bis 2001', w: 75 },
a6: { label: '2002 bis 2015', w: 60 },
a7: { label: 'ab 2016 oder Effizienzhaus', w: 45 }
};
var WALLS = { '1': 1, '2': 1.10, '3': 1.18 };
var WALL_LABEL = { '1': 'eine Außenwand', '2': 'zwei Außenwände', '3': 'drei oder mehr Außenwände' };
var WINDOWS = { klein: 0.95, normal: 1, gross: 1.08 };
var WIN_LABEL = { klein: 'wenig Fenster', normal: 'normale Fensterfläche', gross: 'große Fensterfront' };
var POSITION = { mitte: 1, eg: 1.05, dg: 1.08, beides: 1.12 };
var POS_LABEL = { mitte: 'Zwischengeschoss', eg: 'Erdgeschoss', dg: 'Dachgeschoss', beides: 'Bungalow' };
var SYSTEMS = {
s35: { vl: 35, rl: 30 },
s45: { vl: 45, rl: 38 },
s55: { vl: 55, rl: 45 },
s70: { vl: 70, rl: 55 },
s75: { vl: 75, rl: 65 }
};
var COMPARE = ['s35', 's45', 's55', 's70', 's75'];
/* Flachheizkörper: Normwärmeleistung je Meter Baulänge bei 75/65/20 °C (EN 442), typische Herstellerwerte */
var PANEL_H = [300, 400, 500, 600, 900];
var PANEL = {
'10': { n: 1.28, depth: 47, q: [340, 440, 530, 620, 880] },
'11': { n: 1.30, depth: 63, q: [540, 690, 840, 980, 1380] },
'21': { n: 1.31, depth: 66, q: [720, 920, 1110, 1290, 1810] },
'22': { n: 1.33, depth: 100, q: [990, 1260, 1510, 1730, 2420] },
'33': { n: 1.34, depth: 155, q: [1420, 1810, 2140, 2400, 3330] }
};
var PANEL_PARTS = {
'10': 'P', '11': 'PK', '21': 'PKP', '22': 'PKKP', '33': 'PKPKKP'
};
/* Gliederheizkörper: Leistung je Glied bei 75/65/20 °C, Bautiefe 160 mm */
var SECT_H = [430, 580, 680, 980];
var SECT_Q = [75, 98, 113, 160];
var SECT_DEPTH = { '110': 0.72, '160': 1, '220': 1.3 };
var DT_NORM = 10 / Math.log(55 / 45);
var MAX_RADS = 4;
var TOTAL_STEPS = 6;
/* ---------- Hilfsfunktionen ---------- */
function $(sel, ctx) { return (ctx || root).querySelector(sel); }
function $all(sel, ctx) { return Array.prototype.slice.call((ctx || root).querySelectorAll(sel)); }
function radioVal(name) { var r = $('input[name="' + name + '"]:checked'); return r ? r.value : ''; }
function num(v) { if (v === null || v === undefined) return NaN; return parseFloat(String(v).replace(',', '.')); }
function fmt(n, d) { return Number(n).toLocaleString('de-DE', { minimumFractionDigits: d || 0, maximumFractionDigits: d || 0 }); }
function roundTo(n, step) { return Math.round(n / step) * step; }
function clamp(v, a, b) { return Math.min(b, Math.max(a, v)); }
function el(tag, attrs, kids) {
var e = document.createElement(tag);
if (attrs) {
Object.keys(attrs).forEach(function (k) {
var v = attrs[k];
if (v === null || v === undefined || v === false) return;
if (k === 'text') e.textContent = v;
else if (k === 'cls') e.className = v;
else if (k.indexOf('on') === 0 && typeof v === 'function') e.addEventListener(k.slice(2), v);
else e.setAttribute(k, v === true ? '' : v);
});
}
append(e, kids);
return e;
}
function append(parent, kids) {
if (kids === null || kids === undefined) return;
if (!Array.isArray(kids)) kids = [kids];
kids.forEach(function (k) {
if (k === null || k === undefined || k === false) return;
parent.appendChild(typeof k === 'string' ? document.createTextNode(k) : k);
});
}
var SVGNS = 'http://www.w3.org/2000/svg';
function sv(tag, attrs, text) {
var e = document.createElementNS(SVGNS, tag);
Object.keys(attrs || {}).forEach(function (k) { e.setAttribute(k, attrs[k]); });
if (text !== undefined) e.textContent = text;
return e;
}
function interp(xs, ys, x) {
if (xs[0] >= x) return ys[0] * x / xs[0];
for (var i = 1; xs.length > i; i++) {
if (xs[i] >= x) {
var t = (x - xs[i - 1]) / (xs[i] - xs[i - 1]);
return ys[i - 1] + t * (ys[i] - ys[i - 1]);
}
}
var last = xs.length - 1;
return ys[last] * x / xs[last];
}
/* logarithmische Übertemperatur */
function dtLog(vl, rl, ti) {
var a = vl - ti, b = rl - ti;
if (0 >= a) return 0;
if (0.5 >= b) return Math.max(0, (a + b) / 2);
if (Math.abs(a - b) > 0.01) return (a - b) / Math.log(a / b);
return a;
}
function factor(vl, rl, ti, n) {
var dt = dtLog(vl, rl, ti);
if (0 >= dt) return 0;
return Math.pow(dt / DT_NORM, n);
}
function spreadFor(vl) { return Math.max(5, (vl - 25) / 3); }
/* ---------- Zustand ---------- */
var step = 1;
var radSeq = 0;
var lastResult = null;
function readState() {
var roomKey = radioVal('hkr-room') || 'wohnen';
var sysKey = radioVal('hkr-sys') || 's55';
var s = {
mode: radioVal('hkr-mode') || 'neu',
room: roomKey,
area: num($('#hkr-area').value),
h: num($('#hkr-height').value),
ti: num($('#hkr-temp').value),
age: radioVal('hkr-age'),
walls: radioVal('hkr-walls') || '1',
win: radioVal('hkr-win') || 'normal',
pos: radioVal('hkr-pos') || 'mitte',
sysKey: sysKey,
bh: num($('#hkr-bh').value),
maxlen: num($('#hkr-maxlen').value),
count: parseInt($('#hkr-count').value, 10) || 1
};
if (sysKey === 'custom') {
var vl = num($('#hkr-vl').value);
var rl = num($('#hkr-rl').value);
if (isNaN(rl)) rl = Math.round(vl - spreadFor(vl));
s.sys = { vl: vl, rl: rl };
} else {
s.sys = SYSTEMS[sysKey];
}
s.rads = readRads();
return s;
}
/* ---------- Raumheizlast ---------- */
function demand(s) {
var base = AGES[s.age].w;
var ft = (s.ti - CONFIG.outdoorTemp) / (20 - CONFIG.outdoorTemp);
var fh = 0.4 + 0.6 * s.h / 2.5;
var q = s.area * base * ft * fh * WALLS[s.walls] * WINDOWS[s.win] * POSITION[s.pos];
return Math.max(50, roundTo(q, 10));
}
/* ---------- Heizkörper (Prüfen) ---------- */
function radNorm(r) {
if (r.kind === 'flach') {
var p = PANEL[r.type];
return { qn: interp(PANEL_H, p.q, r.h) * r.l / 1000, n: p.n };
}
if (r.kind === 'glied') {
return { qn: interp(SECT_H, SECT_Q, r.h) * SECT_DEPTH[r.d] * r.count, n: 1.3 };
}
var basis = r.basis === '90' ? factor(90, 70, 20, 1.3) : (r.basis === '70' ? factor(70, 55, 20, 1.3) : 1);
return { qn: r.q / basis, n: 1.3 };
}
function radsOutput(rads, vl, rl, ti) {
return rads.reduce(function (sum, r) {
var nm = radNorm(r);
return sum + nm.qn * factor(vl, rl, ti, nm.n);
}, 0);
}
function neededFlow(rads, ti, q) {
function out(vl) { return radsOutput(rads, vl, vl - spreadFor(vl), ti); }
if (q > out(90)) return null;
var lo = Math.max(ti + 8, 28), hi = 90;
if (out(lo) >= q) return lo;
for (var i = 0; 40 > i; i++) {
var mid = (lo + hi) / 2;
if (out(mid) >= q) hi = mid; else lo = mid;
}
return Math.ceil(hi);
}
/* ---------- Heizkörper (Neu) ---------- */
function sizeFor(type, h, qPer, sys, ti) {
var p = PANEL[type];
var qm = interp(PANEL_H, p.q, h) * factor(sys.vl, sys.rl, ti, p.n);
if (0 >= qm) return null;
var l = Math.max(400, Math.ceil(qPer / qm * 10) * 100);
return { type: type, h: h, l: l, q: qm * l / 1000, fits: 3000 >= l };
}
function pickSize(cands, maxlen) {
var i;
if (maxlen) {
for (i = 0; cands.length > i; i++) if (maxlen >= cands[i].l) return cands[i];
return null;
}
var t22 = cands.filter(function (c) { return c.type === '22'; })[0];
if (t22 && 2000 >= t22.l) return t22;
var t33 = cands.filter(function (c) { return c.type === '33'; })[0];
if (t33 && 2000 >= t33.l) return t33;
return null;
}
/* ---------- Zeichnung ---------- */
function drawRadiator(type, h, l) {
var W = 440, H = 248;
var svg = sv('svg', { viewBox: '0 0 ' + W + ' ' + H, role: 'img', 'aria-label': 'Maßskizze Heizkörper Typ ' + type + ', ' + h + ' mm hoch, ' + l + ' mm lang' });
var maxW = 270, maxH = 160;
var sc = Math.min(maxW / l, maxH / h, 0.3);
var w = l * sc, hh = h * sc;
var x0 = 40, y0 = 22 + (maxH - hh) / 2;
svg.appendChild(sv('rect', { x: x0, y: y0, width: w, height: hh, rx: 4, 'class': 'hkr-panel' }));
var gap = Math.max(9, 50 * sc);
for (var gx = x0 + gap; x0 + w - 4 > gx; gx += gap) {
svg.appendChild(sv('line', { x1: gx, y1: y0 + 6, x2: gx, y2: y0 + hh - 6, 'class': 'hkr-groove' }));
}
svg.appendChild(sv('rect', { x: x0 + w - 14, y: y0 - 9, width: 8, height: 10, rx: 1, 'class': 'hkr-valve' }));
var yd = y0 + hh + 18;
svg.appendChild(sv('path', { d: 'M' + x0 + ' ' + (yd - 6) + 'V' + (yd + 6) + 'M' + (x0 + w) + ' ' + (yd - 6) + 'V' + (yd + 6) + 'M' + x0 + ' ' + yd + 'H' + (x0 + w), 'class': 'hkr-dim' }));
svg.appendChild(sv('text', { x: x0 + w / 2, y: yd + 18, 'text-anchor': 'middle', 'class': 'hkr-dimtext' }, fmt(l) + ' mm'));
var xd = x0 - 16;
svg.appendChild(sv('path', { d: 'M' + (xd - 6) + ' ' + y0 + 'H' + (xd + 6) + 'M' + (xd - 6) + ' ' + (y0 + hh) + 'H' + (xd + 6) + 'M' + xd + ' ' + y0 + 'V' + (y0 + hh), 'class': 'hkr-dim' }));
svg.appendChild(sv('text', { x: xd - 8, y: y0 + hh / 2, 'text-anchor': 'middle', transform: 'rotate(-90 ' + (xd - 8) + ' ' + (y0 + hh / 2) + ')', 'class': 'hkr-dimtext' }, fmt(h) + ' mm'));
/* Seitenansicht */
var parts = PANEL_PARTS[type] || 'PKKP';
var sx = 335, sTop = 26, sH = 150, x = sx;
var g = sv('g', {});
var widths = 0;
parts.split('').forEach(function (c) { widths += c === 'P' ? 7 : 15; });
x = sx + (100 - widths) / 2;
parts.split('').forEach(function (c) {
if (c === 'P') {
g.appendChild(sv('rect', { x: x, y: sTop, width: 5, height: sH, rx: 1, 'class': 'hkr-plate' }));
x += 7;
} else {
var d = 'M' + (x + 1) + ' ' + (sTop + 8);
for (var yy = sTop + 8, k = 0; sTop + sH - 8 > yy; yy += 10, k++) {
d += 'L' + (x + (k % 2 === 0 ? 12 : 1)) + ' ' + (yy + 10);
}
g.appendChild(sv('path', { d: d, 'class': 'hkr-conv' }));
x += 15;
}
});
svg.appendChild(g);
var plates = (parts.match(/P/g) || []).length;
var convs = (parts.match(/K/g) || []).length;
svg.appendChild(sv('text', { x: sx + 50, y: sTop + sH + 24, 'text-anchor': 'middle', 'class': 'hkr-sidelabel' }, 'Seitenansicht'));
svg.appendChild(sv('text', { x: sx + 50, y: sTop + sH + 44, 'text-anchor': 'middle', 'class': 'hkr-sidelabel' }, plates + ' Platte' + (plates === 1 ? '' : 'n')));
svg.appendChild(sv('text', { x: sx + 50, y: sTop + sH + 62, 'text-anchor': 'middle', 'class': 'hkr-sidelabel' }, convs + ' Konvektor' + (convs === 1 ? '' : 'en')));
return svg;
}
/* ---------- Ergebnis ---------- */
function sysLabel(sys) { return fmt(sys.vl) + '/' + fmt(Math.round(sys.rl)) + ' °C'; }
function tag(cls, text) { return el('span', { cls: 'uni-hkr__tag ' + cls, text: text }); }
function link(href, text, ghost) {
return el('a', { href: href, cls: 'uni-hkr__btn' + (ghost ? ' uni-hkr__btn--ghost' : ''), text: text });
}
function renderResult() {
var s = readState();
var q = demand(s);
var box = $('[data-result]');
box.textContent = '';
var lines = [];
var room = ROOMS[s.room];
lines.push('Raum: ' + room.label + ', ' + fmt(s.area, s.area % 1 ? 1 : 0) + ' m², ' + fmt(s.h, 2) + ' m hoch, ' + fmt(s.ti) + ' °C');
lines.push('Gebäude: ' + AGES[s.age].label + ', ' + WALL_LABEL[s.walls] + ', ' + WIN_LABEL[s.win] + ', ' + POS_LABEL[s.pos]);
lines.push('Systemtemperatur: ' + sysLabel(s.sys));
lines.push('Geschätzte Raumheizlast: ca. ' + fmt(q) + ' W');
var left = el('div', { cls: 'uni-hkr__res-text' }, [
el('p', { cls: 'uni-hkr__kicker', text: room.label + ' mit ' + fmt(s.area, s.area % 1 ? 1 : 0) + ' m² braucht etwa' }),
el('p', { cls: 'uni-hkr__big' }, [fmt(q) + ' ', el('small', { text: 'Watt' })]),
el('p', { cls: 'uni-hkr__range', text: 'Orientierungsbereich etwa ' + fmt(roundTo(q * 0.85, 10)) + ' bis ' + fmt(roundTo(q * 1.15, 10)) + ' W bei ' + fmt(s.ti) + ' °C Raumtemperatur. Wegen der vereinfachten Gebäudedaten kann die tatsächliche Raumheizlast auch außerhalb dieses Bereichs liegen.' })
]);
if (s.mode === 'neu') renderNew(s, q, box, left, lines);
else renderCheck(s, q, box, left, lines);
lastResult = { lines: lines, mode: s.mode };
box.appendChild(leadBox());
box.appendChild(el('div', { cls: 'uni-hkr__note' }, [
el('p', { text: 'Der Rechner liefert einen Orientierungswert für die Vorauswahl. Die Raumheizlast beruht auf statistischen Näherungswerten je Baujahr. Die Berechnung verwendet vereinfachend eine Normaußentemperatur von ' + fmt(CONFIG.outdoorTemp) + ' °C, die tatsächliche Normaußentemperatur hängt vom Standort des Gebäudes ab. Die Heizkörperleistung beruht auf typischen Herstellerwerten nach EN 442 (75/65/20 °C), umgerechnet über die logarithmische Übertemperatur.' }),
el('p', { text: 'Eine raumweise Heizlastberechnung nach DIN EN 12831 durch einen Fachbetrieb ersetzt er nicht. Maßgeblich sind die Leistungsdaten im Datenblatt des gewählten Modells.' })
]));
track('hkr_result', { hkr_mode: s.mode, hkr_load_w: q });
}
function renderNew(s, q, box, left, lines) {
var qPer = q / s.count;
var types = ['11', '21', '22', '33'];
var cands = types.map(function (t) { return sizeFor(t, s.bh, qPer, s.sys, s.ti); }).filter(Boolean);
var maxlen = isNaN(s.maxlen) ? 0 : s.maxlen;
var pick = pickSize(cands, maxlen);
var perText = s.count > 1 ? ' je Heizkörper' : '';
var pickBox;
if (pick) {
pickBox = el('div', { cls: 'uni-hkr__pick' }, [
el('p', { cls: 'uni-hkr__kicker', text: s.count > 1 ? 'Unsere Empfehlung, ' + s.count + ' Stück' : 'Unsere Empfehlung' }),
el('p', { cls: 'uni-hkr__pick-name', text: 'Typ ' + pick.type + ', ' + fmt(pick.h) + ' × ' + fmt(pick.l) + ' mm' }),
el('p', { text: 'Leistung ca. ' + fmt(roundTo(pick.q, 10)) + ' W' + perText + ' bei ' + sysLabel(s.sys) + '. Bautiefe etwa ' + PANEL[pick.type].depth + ' mm.' })
]);
lines.push('Empfehlung: ' + (s.count > 1 ? s.count + ' x ' : '') + 'Typ ' + pick.type + ', ' + pick.h + ' x ' + pick.l + ' mm, ca. ' + fmt(roundTo(pick.q, 10)) + ' W' + perText);
} else {
pickBox = el('div', { cls: 'uni-hkr__pick' }, [
el('p', { cls: 'uni-hkr__verdict is-warn', text: 'Passt so nicht' }),
el('p', { text: maxlen ? 'Bei ' + fmt(s.bh) + ' mm Bauhöhe reicht keine Bauform mit höchstens ' + fmt(maxlen) + ' mm Länge.' : 'Bei ' + fmt(s.bh) + ' mm Bauhöhe wäre der Heizkörper sehr lang.' }),
el('p', { text: 'Diese Varianten würden passen:' }),
el('ul', { cls: 'uni-hkr__list' }, alternatives(s, q, maxlen || 2000).map(function (t) { return el('li', { text: t }); }))
]);
lines.push('Empfehlung: keine passende Standardgröße, Beratung gewünscht');
}
left.appendChild(pickBox);
var fig = el('figure', { cls: 'uni-hkr__drawing' });
var show = pick || cands.filter(function (c) { return c.type === '33'; })[0];
fig.appendChild(drawRadiator(show.type, show.h, Math.min(show.l, 3000)));
fig.appendChild(el('figcaption', { text: pick ? 'Maßskizze der Empfehlung. Die Seitenansicht zeigt, was hinter der Typnummer steckt.' : 'Zum Größenvergleich: Ein einzelner Typ 33 müsste ' + (show.fits ? fmt(show.l) + ' mm' : 'über 3.000 mm') + ' lang sein.' }));
box.appendChild(el('div', { cls: 'uni-hkr__res-top' }, [left, fig]));
/* Alternativen */
var rows = cands.map(function (c) {
var isPick = pick && pick.type === c.type;
var status;
if (!c.fits) status = tag('is-bad', 'zu lang');
else if (maxlen && c.l > maxlen) status = tag('is-warn', 'länger als ' + fmt(maxlen) + ' mm');
else if (isPick) status = tag('is-ok', 'Empfehlung');
else if (c.l > 2000) status = tag('is-warn', 'sehr lang');
else status = '';
return el('tr', { cls: isPick ? 'is-pick' : '' }, [
el('td', { text: 'Typ ' + c.type }),
el('td', { cls: 'num', text: fmt(c.h) + ' × ' + fmt(c.l) + ' mm' }),
el('td', { cls: 'num', text: 'ca. ' + PANEL[c.type].depth + ' mm' }),
el('td', { cls: 'num', text: fmt(roundTo(c.q, 10)) + ' W' }),
el('td', {}, status)
]);
});
box.appendChild(el('div', { cls: 'uni-hkr__section' }, [
el('h4', { cls: 'uni-hkr__h', text: 'Alle Bauformen im Vergleich' }),
el('p', { text: 'Benötigt werden ' + fmt(roundTo(qPer, 10)) + ' W' + perText + ' bei ' + sysLabel(s.sys) + ' und ' + fmt(s.bh) + ' mm Bauhöhe. Mehr Platten und Konvektoren bedeuten mehr Leistung auf weniger Länge, aber auch mehr Bautiefe.' }),
table(['Typ', 'Höhe × Länge', 'Bautiefe', 'Leistung', ''], rows)
]));
/* Vorlauftemperatur-Vergleich */
var ref = pick ? pick.type : '22';
var vrows = COMPARE.map(function (k) {
var c = sizeFor(ref, s.bh, qPer, SYSTEMS[k], s.ti);
var cur = s.sysKey === k;
return el('tr', { cls: cur ? 'is-pick' : '' }, [
el('td', { text: sysLabel(SYSTEMS[k]) + (cur ? ' (Ihre Auswahl)' : '') }),
el('td', { cls: 'num', text: c && c.fits ? fmt(c.l) + ' mm' : 'über 3.000 mm' })
]);
});
box.appendChild(el('div', { cls: 'uni-hkr__section' }, [
el('h4', { cls: 'uni-hkr__h', text: 'Länge je nach Vorlauftemperatur' }),
el('p', { text: 'So lang müsste ein Typ ' + ref + ' mit ' + fmt(s.bh) + ' mm Bauhöhe sein, um denselben Raum zu heizen. Wer heute für eine Wärmepumpe plant, legt die Heizkörper gleich für 45 oder 55 °C aus.' }),
table(['Systemtemperatur', 'Benötigte Baulänge'], vrows)
]));
box.appendChild(ctaRow(s));
}
function alternatives(s, q, limit) {
var out = [];
var n, t, c, i;
for (n = s.count + 1; s.count + 3 > n && 2 > out.length; n++) {
for (i = 0; 2 > i; i++) {
t = ['22', '33'][i];
c = sizeFor(t, s.bh, q / n, s.sys, s.ti);
if (c && limit >= c.l) { out.push(n + ' Heizkörper Typ ' + t + ' mit je ' + fmt(c.h) + ' × ' + fmt(c.l) + ' mm'); break; }
}
}
if (s.bh !== 900) {
for (i = 0; 2 > i; i++) {
t = ['22', '33'][i];
c = sizeFor(t, 900, q / s.count, s.sys, s.ti);
if (c && limit >= c.l) { out.push((s.count > 1 ? s.count + ' × ' : '') + 'Typ ' + t + ' mit 900 mm Bauhöhe: ' + fmt(c.h) + ' × ' + fmt(c.l) + ' mm'); break; }
}
}
if (55 > s.sys.vl) {
c = sizeFor('22', s.bh, q / s.count, SYSTEMS.s55, s.ti);
if (c && limit >= c.l) out.push('Bei 55/45 °C Vorlauf reicht ' + (s.count > 1 ? 'je ' : '') + 'ein Typ 22 mit ' + fmt(c.h) + ' × ' + fmt(c.l) + ' mm');
}
out.push('Wärmepumpenheizkörper mit Gebläse leisten bei niedriger Vorlauftemperatur deutlich mehr auf kleiner Fläche.');
return out;
}
function renderCheck(s, q, box, left, lines) {
var out = radsOutput(s.rads, s.sys.vl, s.sys.rl, s.ti);
var cov = q > 0 ? out / q : 0;
var cls = cov >= 1 ? 'is-ok' : (cov >= 0.9 ? 'is-warn' : 'is-bad');
var verdict = cov >= 1 ? 'Rechnerisch ausreichend' : (cov >= 0.9 ? 'Rechnerisch knapp, genauere Prüfung empfohlen' : 'Rechnerisch nicht ausreichend');
var flow = neededFlow(s.rads, s.ti, q);
var meterMax = Math.max(1.5, cov * 1.05);
var meter = el('div', { cls: 'uni-hkr__meter', role: 'img', 'aria-label': 'Abdeckung ' + fmt(cov * 100) + ' Prozent des Wärmebedarfs' }, [
el('div', { cls: 'uni-hkr__meter-fill ' + cls, style: 'width:' + clamp(cov / meterMax * 100, 2, 100) + '%' }),
el('div', { cls: 'uni-hkr__meter-mark', style: 'left:' + (1 / meterMax * 100) + '%' }, el('span', { text: 'Bedarf' }))
]);
var flowText;
if (flow === null) flowText = 'Selbst mit 90 °C Vorlauftemperatur reichen die Heizkörper rechnerisch nicht aus.';
else if (flow > 55) flowText = 'Rechnerisch erforderliche Vorlauftemperatur: ca. ' + flow + ' °C. Das liegt über 55 °C, dem üblichen Richtwert für den Betrieb einer Wärmepumpe mit Heizkörpern.';
else if (flow > 45) flowText = 'Rechnerisch erforderliche Vorlauftemperatur: ca. ' + flow + ' °C. Das liegt im Bereich, den Wärmepumpen mit Heizkörpern üblicherweise abdecken. Größere Heizflächen würden eine niedrigere Vorlauftemperatur erlauben.';
else flowText = 'Rechnerisch erforderliche Vorlauftemperatur: ca. ' + Math.max(flow, 30) + ' °C. Das ist eine gute Ausgangslage für den Betrieb mit einer Wärmepumpe.';
left.appendChild(el('div', { cls: 'uni-hkr__pick' }, [
el('p', { cls: 'uni-hkr__verdict ' + cls, text: verdict }),
el('p', { text: 'Ihre Heizkörper liefern bei ' + sysLabel(s.sys) + ' etwa ' + fmt(roundTo(out, 10)) + ' W. Das deckt ' + fmt(cov * 100) + ' % des Bedarfs.' }),
meter,
el('div', { cls: 'uni-hkr__meter-legend' }, [el('span', { text: '0 W' }), el('span', { text: fmt(roundTo(q * meterMax, 10)) + ' W' })]),
el('p', { style: 'margin-top:14px', text: flowText })
]));
lines.push('Vorhandene Heizkörper: ' + s.rads.map(radText).join('; '));
lines.push('Leistung bei ' + sysLabel(s.sys) + ': ca. ' + fmt(roundTo(out, 10)) + ' W (' + fmt(cov * 100) + ' % des Bedarfs)');
lines.push('Rechnerisch erforderliche Vorlauftemperatur: ' + (flow === null ? 'über 90 °C' : 'ca. ' + flow + ' °C'));
var first = s.rads[0];
var fig = el('figure', { cls: 'uni-hkr__drawing' });
if (first.kind === 'flach') {
fig.appendChild(drawRadiator(first.type, first.h, first.l));
fig.appendChild(el('figcaption', { text: 'Ihr ' + (s.rads.length > 1 ? 'erster ' : '') + 'Heizkörper: Typ ' + first.type + ', ' + fmt(first.h) + ' × ' + fmt(first.l) + ' mm.' }));
} else {
fig.appendChild(drawRadiator('22', 600, 1200));
fig.appendChild(el('figcaption', { text: 'Zum Vergleich: ein Flachheizkörper Typ 22 mit 600 × 1.200 mm. Die Seitenansicht zeigt, was hinter der Typnummer steckt.' }));
}
box.appendChild(el('div', { cls: 'uni-hkr__res-top' }, [left, fig]));
/* Tabelle Systemtemperaturen */
var rows = COMPARE.map(function (k) {
var sy = SYSTEMS[k];
var o = radsOutput(s.rads, sy.vl, sy.rl, s.ti);
var c = o / q;
var st = c >= 1 ? tag('is-ok', 'ausreichend') : (c >= 0.9 ? tag('is-warn', 'knapp') : tag('is-bad', 'nicht ausreichend'));
return el('tr', { cls: s.sysKey === k ? 'is-pick' : '' }, [
el('td', { text: sysLabel(sy) }),
el('td', { cls: 'num', text: fmt(roundTo(o, 10)) + ' W' }),
el('td', { cls: 'num', text: fmt(c * 100) + ' %' }),
el('td', {}, st)
]);
});
box.appendChild(el('div', { cls: 'uni-hkr__section' }, [
el('h4', { cls: 'uni-hkr__h', text: 'Leistung bei verschiedenen Vorlauftemperaturen' }),
el('p', { text: 'Bedarf des Raums: ca. ' + fmt(q) + ' W. Je niedriger die Vorlauftemperatur, desto weniger Wärme gibt derselbe Heizkörper ab.' }),
table(['Systemtemperatur', 'Leistung', 'Abdeckung', ''], rows)
]));
/* Maßnahmen */
if (cov >= 1) {
box.appendChild(el('div', { cls: 'uni-hkr__section' }, [
el('h4', { cls: 'uni-hkr__h', text: 'Was Sie noch tun können' }),
el('ul', { cls: 'uni-hkr__list' }, [
el('li', { text: 'Ein hydraulischer Abgleich stellt sicher, dass jeder Heizkörper die erforderliche Wassermenge bekommt.' }),
el('li', { text: 'Prüfen Sie die übrigen Räume genauso. Der ungünstigste Raum bestimmt die Vorlauftemperatur des ganzen Hauses.' })
])
]));
} else {
var target = s.rads.filter(function (r) { return r.kind === 'flach'; })[0];
var h = target ? target.h : 600;
var opts = ['22', '33'].map(function (t) { return sizeFor(t, PANEL_H.indexOf(h) > -1 ? h : 600, q, s.sys, s.ti); }).filter(function (c) { return c && 2400 >= c.l; });
var items = [];
opts.forEach(function (c) {
items.push(el('li', { text: 'Ein Heizkörper Typ ' + c.type + ' mit ' + fmt(c.h) + ' × ' + fmt(c.l) + ' mm würde den Raum allein bei ' + sysLabel(s.sys) + ' heizen (ca. ' + fmt(roundTo(c.q, 10)) + ' W).' }));
});
items.push(el('li', { text: 'Alternativ einen zusätzlichen Heizkörper mit etwa ' + fmt(roundTo(q - out, 10)) + ' W Leistung ergänzen.' }));
items.push(el('li', { text: 'Ein hydraulischer Abgleich kann helfen, die erforderliche Wassermenge am Heizkörper sicherzustellen. Verkleidungen oder Vorhänge können die Wärmeabgabe beeinträchtigen und sollten bei der Bewertung berücksichtigt werden.' }));
if (cov >= 0.9 && flow !== null) items.push(el('li', { text: 'Rechnerisch würde auch eine Vorlauftemperatur von ca. ' + flow + ' °C genügen.' }));
box.appendChild(el('div', { cls: 'uni-hkr__section' }, [
el('h4', { cls: 'uni-hkr__h', text: 'So bekommen Sie den Raum warm' }),
el('ul', { cls: 'uni-hkr__list' }, items)
]));
if (opts[0]) lines.push('Mögliche Lösung: Typ ' + opts[0].type + ', ' + opts[0].h + ' x ' + opts[0].l + ' mm');
}
box.appendChild(ctaRow(s));
}
function radText(r) {
if (r.kind === 'flach') return 'Flachheizkörper Typ ' + r.type + ', ' + r.h + ' x ' + r.l + ' mm';
if (r.kind === 'glied') return 'Gliederheizkörper ' + r.h + ' mm hoch, ' + r.d + ' mm tief, ' + r.count + ' Glieder';
return 'Normleistung ' + r.q + ' W (' + (r.basis === '90' ? '90/70/20' : (r.basis === '70' ? '70/55/20' : '75/65/20')) + ')';
}
function table(head, rows) {
return el('div', { cls: 'uni-hkr__tablewrap' }, el('table', { cls: 'uni-hkr__table' }, [
el('thead', {}, el('tr', {}, head.map(function (h) { return el('th', { scope: 'col', text: h }); }))),
el('tbody', {}, rows)
]));
}
function ctaRow(s) {
var row = el('div', { cls: 'uni-hkr__cta' });
var L = CONFIG.links;
if (s.room === 'bad' && L.badheizkoerper) row.appendChild(link(L.badheizkoerper, 'Badheizkörper ansehen'));
if (L.heizkoerper) row.appendChild(link(L.heizkoerper, 'Passende Heizkörper ansehen', s.room === 'bad' && L.badheizkoerper));
if (L.abgleich) row.appendChild(link(L.abgleich, 'Ratgeber hydraulischer Abgleich', true));
if (L.waermepumpenrechner && s.mode === 'pruefen') row.appendChild(link(L.waermepumpenrechner, 'Zum Wärmepumpenrechner', true));
return row;
}
/* ---------- Anfrage per E-Mail ---------- */
function leadBox() {
var det = el('details', { cls: 'uni-hkr__lead-box' });
det.appendChild(el('summary', { text: 'Fragen zur Auswahl? Ergebnis an unser Team senden' }));
var body = el('div', { cls: 'uni-hkr__lead-body' });
body.appendChild(el('p', { text: 'Unsere Heizungsexperten prüfen Ihre Angaben und melden sich mit einem passenden Vorschlag. Beim Absenden öffnet sich Ihr E-Mail-Programm mit dem Ergebnis, über dieses Formular werden keine Daten gespeichert.' }));
var fields = el('div', { cls: 'uni-hkr__fields' }, [
field('hkr-l-name', 'Name', 'text', 'name', true, 'Bitte geben Sie Ihren Namen ein.'),
field('hkr-l-plz', 'Postleitzahl', 'text', 'postal-code', true, 'Bitte geben Sie eine fünfstellige Postleitzahl ein.'),
field('hkr-l-tel', 'Telefon (optional)', 'tel', 'tel', false, '')
]);
body.appendChild(fields);
var msgField = el('div', { cls: 'uni-hkr__field', style: 'margin-bottom:16px' }, [
el('label', { cls: 'uni-hkr__flabel', 'for': 'hkr-l-msg', text: 'Nachricht (optional)' }),
el('textarea', { cls: 'uni-hkr__input', id: 'hkr-l-msg', rows: '3', placeholder: 'z. B. gewünschte Farbe, Anschlussart oder Fragen' })
]);
body.appendChild(msgField);
var status = el('p', { cls: 'uni-hkr__status', hidden: true, role: 'status' });
var row = el('div', { cls: 'uni-hkr__cta', style: 'margin-top:0' }, [
el('button', { type: 'button', cls: 'uni-hkr__btn', text: 'E-Mail mit Ergebnis öffnen', onclick: function () { sendLead(body, status); } }),
el('button', { type: 'button', cls: 'uni-hkr__btn uni-hkr__btn--ghost', text: 'Ergebnis kopieren', onclick: function () { copyResult(status); } })
]);
body.appendChild(row);
body.appendChild(status);
det.appendChild(body);
return det;
}
function field(id, label, type, ac, req, err) {
return el('div', { cls: 'uni-hkr__field', 'data-lead': id }, [
el('label', { cls: 'uni-hkr__flabel', 'for': id, text: label }),
el('input', { cls: 'uni-hkr__input', id: id, type: type, autocomplete: ac, inputmode: id === 'hkr-l-plz' ? 'numeric' : null, maxlength: id === 'hkr-l-plz' ? '5' : null, required: req ? true : null }),
err ? el('p', { cls: 'uni-hkr__error', text: err }) : null
]);
}
function resultText(extra) {
var t = ['Heizkörper berechnen: Ergebnis aus dem UNIDOMO-Rechner', ''].concat(lastResult ? lastResult.lines : []);
if (extra) t = t.concat([''], extra);
return t.join('\n');
}
function sendLead(body, status) {
var name = $('#hkr-l-name', body).value.trim();
var plz = $('#hkr-l-plz', body).value.trim();
var tel = $('#hkr-l-tel', body).value.trim();
var msg = $('#hkr-l-msg', body).value.trim();
var ok = true;
setErr($('[data-lead="hkr-l-name"]', body), name.length === 0);
if (name.length === 0) ok = false;
var plzOk = /^\d{5}$/.test(plz);
setErr($('[data-lead="hkr-l-plz"]', body), !plzOk);
if (!plzOk) ok = false;
if (!ok) { var f = $('.has-error input', body); if (f) f.focus(); return; }
var extra = ['Name: ' + name, 'PLZ: ' + plz];
if (tel) extra.push('Telefon: ' + tel);
if (msg) extra.push('', 'Nachricht:', msg);
var subject = 'Heizkörper berechnen: Anfrage aus PLZ ' + plz;
var text = resultText(extra);
var href = 'mailto:' + CONFIG.email + '?subject=' + encodeURIComponent(subject) + '&body=' + encodeURIComponent(text);
if (href.length > 1900) {
copyText(text);
href = 'mailto:' + CONFIG.email + '?subject=' + encodeURIComponent(subject) + '&body=' + encodeURIComponent('Das Ergebnis liegt in meiner Zwischenablage und wird hier eingefügt:\n\n');
status.textContent = 'Das Ergebnis ist in Ihrer Zwischenablage. Bitte fügen Sie es in die E-Mail ein.';
} else {
status.textContent = 'Ihr E-Mail-Programm wird geöffnet. Öffnet sich nichts, schreiben Sie uns an ' + CONFIG.email + '.';
}
status.hidden = false;
track('hkr_lead', { hkr_mode: lastResult ? lastResult.mode : '' });
window.location.href = href;
}
function copyText(text) {
if (navigator.clipboard && navigator.clipboard.writeText) return navigator.clipboard.writeText(text);
var ta = el('textarea', { style: 'position:fixed;left:-9999px;top:0' });
ta.value = text;
document.body.appendChild(ta);
ta.select();
try { document.execCommand('copy'); } catch (e) { /* ignorieren */ }
document.body.removeChild(ta);
return Promise.resolve();
}
function copyResult(status) {
Promise.resolve(copyText(resultText())).then(function () {
status.textContent = 'Ergebnis kopiert.';
status.hidden = false;
});
}
/* ---------- Heizkörperliste ---------- */
function radItem() {
radSeq++;
var id = 'hkr-r' + radSeq;
var wrap = el('div', { cls: 'uni-hkr__rad', 'data-rad': id });
var head = el('div', { cls: 'uni-hkr__rad-head' }, [
el('strong', { cls: 'uni-hkr__rad-title', text: 'Heizkörper' }),
el('button', { type: 'button', cls: 'uni-hkr__link', 'data-remove': '1', text: 'Entfernen', onclick: function () { wrap.parentNode.removeChild(wrap); updateRads(); } })
]);
wrap.appendChild(head);
var kind = el('select', { cls: 'uni-hkr__input', id: id + '-kind', 'data-k': 'kind' }, [
el('option', { value: 'flach', text: 'Flachheizkörper (Plattenheizkörper)' }),
el('option', { value: 'glied', text: 'Gliederheizkörper (Rippen, Guss oder Stahl)' }),
el('option', { value: 'norm', text: 'Leistung aus dem Datenblatt bekannt' })
]);
var top = el('div', { cls: 'uni-hkr__fields', style: 'margin-bottom:18px' }, [
el('div', { cls: 'uni-hkr__field' }, [el('label', { cls: 'uni-hkr__flabel', 'for': id + '-kind', text: 'Bauart' }), kind])
]);
wrap.appendChild(top);
var gFlach = el('div', { cls: 'uni-hkr__fields', 'data-g': 'flach' }, [
selectField(id + '-type', 'Typ', 'type', [['10', 'Typ 10 (1 Platte)'], ['11', 'Typ 11 (1 Platte, 1 Konvektor)'], ['21', 'Typ 21 (2 Platten, 1 Konvektor)'], ['22', 'Typ 22 (2 Platten, 2 Konvektoren)'], ['33', 'Typ 33 (3 Platten, 3 Konvektoren)']], '22'),
selectField(id + '-h', 'Bauhöhe', 'h', [300, 350, 400, 450, 500, 550, 600, 700, 750, 900].map(function (v) { return [String(v), v + ' mm']; }), '600', 'Gesamthöhe des Heizkörpers ohne Ventil.'),
numField(id + '-l', 'Baulänge', 'l', 'mm', '400', '3000', '100', 'z. B. 1200', 'Bitte eine Länge zwischen 300 und 3000 mm eingeben.')
]);
var gGlied = el('div', { cls: 'uni-hkr__fields', 'data-g': 'glied', hidden: true }, [
selectField(id + '-gh', 'Bauhöhe', 'gh', [430, 580, 680, 980].map(function (v) { return [String(v), 'ca. ' + v + ' mm']; }), '580', 'Gesamthöhe, nächstliegenden Wert wählen.'),
selectField(id + '-gd', 'Bautiefe', 'gd', [['110', 'ca. 110 mm (schmal)'], ['160', 'ca. 160 mm (mittel)'], ['220', 'ca. 220 mm (tief)']], '160'),
numField(id + '-gc', 'Anzahl Glieder', 'gc', 'Stück', '2', '60', '1', 'z. B. 12', 'Bitte eine Anzahl zwischen 2 und 60 eingeben.')
]);
var gNorm = el('div', { cls: 'uni-hkr__fields', 'data-g': 'norm', hidden: true }, [
numField(id + '-q', 'Normwärmeleistung', 'q', 'W', '100', '10000', '10', 'z. B. 1730', 'Bitte einen Wert zwischen 100 und 10.000 W eingeben.'),
selectField(id + '-b', 'Bezieht sich auf', 'b', [['75', '75/65/20 °C (Datenblätter seit 1997)'], ['90', '90/70/20 °C (ältere Datenblätter)'], ['70', '70/55/20 °C']], '75')
]);
wrap.appendChild(gFlach);
wrap.appendChild(gGlied);
wrap.appendChild(gNorm);
kind.addEventListener('change', function () {
gFlach.hidden = kind.value !== 'flach';
gGlied.hidden = kind.value !== 'glied';
gNorm.hidden = kind.value !== 'norm';
});
return wrap;
}
function selectField(id, label, key, opts, sel, help) {
return el('div', { cls: 'uni-hkr__field' }, [
el('label', { cls: 'uni-hkr__flabel', 'for': id, text: label }),
el('select', { cls: 'uni-hkr__input', id: id, 'data-k': key }, opts.map(function (o) {
return el('option', { value: o[0], text: o[1], selected: o[0] === sel ? true : null });
})),
help ? el('p', { cls: 'uni-hkr__help', text: help }) : null
]);
}
function numField(id, label, key, unit, min, max, stepv, ph, err) {
return el('div', { cls: 'uni-hkr__field', 'data-nf': key }, [
el('label', { cls: 'uni-hkr__flabel', 'for': id, text: label }),
el('div', { cls: 'uni-hkr__unit' }, [
el('input', { cls: 'uni-hkr__input', id: id, type: 'number', inputmode: 'numeric', min: min, max: max, step: stepv, placeholder: ph, 'data-k': key }),
el('span', { text: unit })
]),
el('p', { cls: 'uni-hkr__error', text: err })
]);
}
function updateRads() {
var items = $all('[data-rad]');
items.forEach(function (it, i) {
$('.uni-hkr__rad-title', it).textContent = items.length > 1 ? 'Heizkörper ' + (i + 1) : 'Heizkörper';
$('[data-remove]', it).hidden = items.length === 1;
});
$('[data-add-rad]').hidden = items.length >= MAX_RADS;
}
function readRads() {
return $all('[data-rad]').map(function (it) {
function v(k) { return $('[data-k="' + k + '"]', it).value; }
var kind = v('kind');
if (kind === 'flach') return { kind: kind, type: v('type'), h: num(v('h')), l: num(v('l')) };
if (kind === 'glied') return { kind: kind, h: num(v('gh')), d: v('gd'), count: num(v('gc')) };
return { kind: 'norm', q: num(v('q')), basis: v('b') };
});
}
/* ---------- Validierung ---------- */
function setErr(fieldEl, on) { if (fieldEl) fieldEl.classList.toggle('has-error', !!on); }
function inRange(v, a, b) { return !isNaN(v) && v >= a && b >= v; }
function validate(n) {
var bad = [];
if (n === 2) {
var a = num($('#hkr-area').value);
var t = num($('#hkr-temp').value);
setErr($('[data-field="area"]'), !inRange(a, 2, 150)); if (!inRange(a, 2, 150)) bad.push('#hkr-area');
setErr($('[data-field="temp"]'), !inRange(t, 15, 26)); if (!inRange(t, 15, 26)) bad.push('#hkr-temp');
}
if (n === 3) {
var ag = radioVal('hkr-age');
setErr($('[data-field="age"]'), !ag); if (!ag) bad.push('input[name="hkr-age"]');
}
if (n === 4 && radioVal('hkr-sys') === 'custom') {
var ti = num($('#hkr-temp').value);
var vl = num($('#hkr-vl').value);
var rlRaw = $('#hkr-rl').value;
var rl = num(rlRaw);
var vlOk = inRange(vl, 28, 90) && vl > ti + 5;
var rlOk = rlRaw === '' || (!isNaN(rl) && vl > rl && rl > ti);
setErr($('[data-field="vl"]'), !vlOk); if (!vlOk) bad.push('#hkr-vl');
setErr($('[data-field="rl"]'), !rlOk); if (!rlOk) bad.push('#hkr-rl');
}
if (n === 5) {
if (radioVal('hkr-mode') === 'neu') {
var ml = $('#hkr-maxlen').value;
var mlOk = ml === '' || inRange(num(ml), 400, 3000);
setErr($('[data-field="maxlen"]'), !mlOk); if (!mlOk) bad.push('#hkr-maxlen');
} else {
$all('[data-rad]').forEach(function (it) {
var kind = $('[data-k="kind"]', it).value;
var checks = kind === 'flach' ? [['l', 300, 3000]] : (kind === 'glied' ? [['gc', 2, 60]] : [['q', 100, 10000]]);
checks.forEach(function (c) {
var inp = $('[data-k="' + c[0] + '"]', it);
var ok = inRange(num(inp.value), c[1], c[2]);
setErr($('[data-nf="' + c[0] + '"]', it), !ok);
if (!ok) bad.push(inp);
});
});
}
}
if (bad.length) {
var f = typeof bad[0] === 'string' ? $(bad[0]) : bad[0];
if (f) f.focus();
return false;
}
return true;
}
/* ---------- Navigation ---------- */
function go(n, silent) {
step = n;
$all('.uni-hkr__step').forEach(function (sec) {
sec.classList.toggle('is-active', parseInt(sec.getAttribute('data-step'), 10) === n);
});
$all('.uni-hkr__progress li').forEach(function (li) {
var p = parseInt(li.getAttribute('data-p'), 10);
li.classList.toggle('is-done', n > p);
li.classList.toggle('is-current', p === n);
if (p === n) li.setAttribute('aria-current', 'step'); else li.removeAttribute('aria-current');
});
$('[data-back]').hidden = n === 1;
$('[data-next]').hidden = n === TOTAL_STEPS;
$('[data-restart]').hidden = n !== TOTAL_STEPS;
$('[data-next]').textContent = n === 5 ? 'Berechnen' : 'Weiter';
var mode = radioVal('hkr-mode');
$('[data-panel="neu"]').hidden = mode !== 'neu';
$('[data-panel="pruefen"]').hidden = mode !== 'pruefen';
if (n === TOTAL_STEPS) renderResult();
if (silent) return;
var top = root.getBoundingClientRect().top;
if (0 > top) root.scrollIntoView({ block: 'start' });
var sec = $('.uni-hkr__step.is-active');
if (sec) sec.focus({ preventScroll: true });
track('hkr_step', { hkr_step: n });
}
function track(ev, data) {
try {
window.dataLayer = window.dataLayer || [];
var o = { event: ev };
Object.keys(data || {}).forEach(function (k) { o[k] = data[k]; });
window.dataLayer.push(o);
} catch (e) { /* ignorieren */ }
}
/* ---------- Ereignisse ---------- */
$('[data-next]').addEventListener('click', function () { if (validate(step)) go(step + 1); });
$('[data-back]').addEventListener('click', function () { go(Math.max(1, step - 1)); });
$('[data-restart]').addEventListener('click', function () {
$('#hkr-area').value = '';
$('#hkr-maxlen').value = '';
$all('.has-error').forEach(function (e) { e.classList.remove('has-error'); });
go(1);
});
$all('input[name="hkr-room"]').forEach(function (r) {
r.addEventListener('change', function () { $('#hkr-temp').value = ROOMS[r.value].t; setErr($('[data-field="temp"]'), false); });
});
$all('[data-pm]').forEach(function (b) {
b.addEventListener('click', function () {
var t = num($('#hkr-temp').value);
if (isNaN(t)) t = 20;
$('#hkr-temp').value = clamp(t + parseInt(b.getAttribute('data-pm'), 10), 15, 26);
setErr($('[data-field="temp"]'), false);
});
});
$all('input[name="hkr-sys"]').forEach(function (r) {
r.addEventListener('change', function () { $('[data-custom-sys]').hidden = radioVal('hkr-sys') !== 'custom'; });
});
$all('input[name="hkr-age"]').forEach(function (r) {
r.addEventListener('change', function () { setErr($('[data-field="age"]'), false); });
});
root.addEventListener('input', function (e) {
var f = e.target.closest ? e.target.closest('.has-error') : null;
if (f && f.hasAttribute('data-field') && f.getAttribute('data-field') !== 'age') f.classList.remove('has-error');
if (f && f.hasAttribute('data-nf')) f.classList.remove('has-error');
if (f && f.hasAttribute('data-lead')) f.classList.remove('has-error');
});
root.addEventListener('keydown', function (e) {
if (e.key === 'Enter' && e.target.tagName === 'INPUT' && e.target.type !== 'radio' && step !== TOTAL_STEPS) {
e.preventDefault();
if (validate(step)) go(step + 1);
}
});
$('[data-add-rad]').addEventListener('click', function () {
var item = radItem();
$('[data-rads]').appendChild(item);
updateRads();
var k = $('select', item); if (k) k.focus();
});
$('[data-rads]').appendChild(radItem());
updateRads();
go(1, true);
/* Für Tests */
root.__hkr = { demand: demand, factor: factor, sizeFor: sizeFor, radsOutput: radsOutput, neededFlow: neededFlow, readState: readState };
})();
Kurz erklärt
So berechnen Sie einen Heizkörper
Um einen Heizkörper zu berechnen, multiplizieren Sie die Raumfläche mit dem Wärmebedarf pro Quadratmeter. Der liegt je nach Baujahr und Dämmung zwischen etwa 45 und 120 Watt. Das Ergebnis ist die Heizleistung, die der Heizkörper bei Ihrer Vorlauftemperatur liefern muss.
20 m²Raumfläche
×
90 W/m²Wärmebedarf, Baujahr 1990
=
1.800 Wbenötigte Heizleistung
Beispiel: Wohnzimmer mit 20 m² in einem Haus von 1990.
Schritt für Schritt
Heizkörper berechnen in drei Schritten
Die Heizleistung allein reicht für die Auswahl nicht aus. Herstellerangaben gelten für eine Vorlauftemperatur von 75 °C, die heute kaum noch eine Heizung fährt. Deshalb gehören drei Schritte zur Berechnung.
01
Heizlast des Raums
Raumfläche mal Wärmebedarf pro Quadratmeter. Eckräume, große Fenster und Räume unter dem Dach brauchen einen Zuschlag.
02
Vorlauftemperatur
Die Normleistung aus dem Datenblatt wird auf Ihre Systemtemperatur umgerechnet. Je niedriger die Temperatur, desto größer muss der Heizkörper sein.
03
Typ und Maße
Mit der Bauhöhe, die unter das Fenster passt, ergibt sich die nötige Länge. Reicht der Platz nicht, wählen Sie einen Typ mit mehr Platten.
Richtwerte
Wie viel Watt Heizleistung pro Quadratmeter?
Ein Raum braucht je nach Baujahr und Dämmzustand etwa 45 bis 120 Watt pro Quadratmeter. Ältere, unsanierte Häuser liegen am oberen Ende, Neubauten ab 2016 am unteren. Die Tabelle zeigt, was das für einen Raum mit 20 m² bedeutet.
Tabelle zur Seite wischen, um alle Spalten zu sehen.
Baujahr und Zustand
Wärmebedarf
Heizlast bei 20 m²
Typ 22, 600 mm hoch, bei 70/55 °C
Typ 22, 600 mm hoch, bei 55/45 °C
Vor 1978, unsaniert
ca. 120 W/m²
2.400 W
1.800 mm lang
2.800 mm lang
Vor 1978, teilsaniert
ca. 95 W/m²
1.900 W
1.400 mm lang
2.200 mm lang
1978 bis 1994
ca. 90 W/m²
1.800 W
1.400 mm lang
2.100 mm lang
1995 bis 2001
ca. 75 W/m²
1.500 W
1.100 mm lang
1.800 mm lang
2002 bis 2015 oder Altbau umfassend saniert
ca. 60 W/m²
1.200 W
900 mm lang
1.400 mm lang
Ab 2016 oder Effizienzhaus
ca. 45 W/m²
900 W
700 mm lang
1.100 mm lang
Statistische Richtwerte für einen Raum mit einer Außenwand, 2,50 m Raumhöhe und 20 °C Raumtemperatur. Vereinfachend gilt eine Normaußentemperatur von −12 °C, die tatsächliche Normaußentemperatur hängt vom Standort ab. Längen auf volle 100 mm aufgerundet.
Für viele Räume müssen Sie die Werte anpassen. Unser Rechner berücksichtigt diese Zuschläge automatisch:
+10 %Eckraum mit zwei Außenwänden
+8 %Große Fensterfront oder bodentiefe Fenster
+5 bis 8 %Erdgeschoss über Keller oder Dachgeschoss
+12 %Raumhöhe 3 m statt 2,50 m
+12 %Badezimmer mit 24 °C statt 20 °C
Vorlauftemperatur
Heizkörperleistung umrechnen: Warum die Vorlauftemperatur entscheidet
Die Leistung im Datenblatt gilt fast immer für 75/65/20 °C nach EN 442: 75 °C Vorlauf, 65 °C Rücklauf, 20 °C Raumtemperatur. Arbeitet Ihre Heizung mit niedrigeren Temperaturen, gibt derselbe Heizkörper deutlich weniger Wärme ab. So viel leistet ein Flachheizkörper Typ 22 mit 600 × 1.000 mm:
75/65 °C
1.730 W (100 %)
70/55 °C
1.380 W (80 %)
55/45 °C
870 W (50 %)
45/38 °C
560 W (32 %)
35/30 °C
270 W (16 %)
Hellblau: typische Vorlauftemperaturen einer Wärmepumpe.
Die Leistung sinkt nicht linear, sondern mit dem Heizkörperexponenten von etwa 1,3. Deshalb halbiert sie sich schon, wenn die Vorlauftemperatur von 75 auf 55 °C sinkt. Gehen Sie beim Heizkörper berechnen also immer von Ihrer echten Vorlauftemperatur aus und nicht von der Zahl im Datenblatt.
Bauformen
Heizkörpertypen: Was bedeuten 10, 11, 21, 22 und 33?
Die Typnummer beschreibt den Aufbau eines Flachheizkörpers. Die erste Ziffer steht für die Anzahl der Heizplatten, die zweite für die Lamellenreihen (Konvektoren), die zusätzlich Wärme an die Luft abgeben. Mehr Platten und Konvektoren bedeuten mehr Leistung bei gleicher Länge, aber auch mehr Bautiefe.
Typ 10
1 Platte, kein Konvektor, ca. 47 mm tief
Sehr flach und leistungsschwach. Für Flure, Abstellräume oder als Ergänzung.
ca. 620 W je Meter
Typ 11
1 Platte, 1 Konvektor, ca. 63 mm tief
Schlank, für kleine Räume, gut gedämmte Häuser und Nischen.
ca. 980 W je Meter
Typ 21
2 Platten, 1 Konvektor, ca. 66 mm tief
Spürbar mehr Leistung als Typ 11 bei fast gleicher Bautiefe.
ca. 1.290 W je Meter
Standard
Typ 22
2 Platten, 2 Konvektoren, ca. 100 mm tief
Der Standard in Wohnräumen. Guter Kompromiss aus Leistung, Tiefe und Preis.
ca. 1.730 W je Meter
Typ 33
3 Platten, 3 Konvektoren, ca. 155 mm tief
Die meiste Leistung pro Meter. Sinnvoll bei wenig freier Wandfläche oder niedriger Vorlauftemperatur.
ca. 2.400 W je Meter
HeizplatteKonvektor (Lamellen)Leistung bei 600 mm Bauhöhe und 75/65 °C, Werte je nach Hersteller leicht abweichend
Wärmepumpe
Heizkörper für die Wärmepumpe berechnen
Wärmepumpen werden auf möglichst niedrige Vorlauftemperaturen ausgelegt. Für den Betrieb mit Heizkörpern gelten 55 °C als üblicher Richtwert. Bei 45/38 °C liefert ein Heizkörper aber nur noch etwa ein Drittel seiner Normleistung. Derselbe Raum braucht dann rund zweieinhalbmal so viel Heizfläche wie bei 70/55 °C.
Das heißt nicht, dass alle Heizkörper raus müssen. Oft reicht es, einzelne Räume nachzurüsten. So gehen Sie vor:
Jeden Raum prüfenWählen Sie im Rechner oben „Vorhandene Heizkörper prüfen“ und tragen Sie die Heizkörper Raum für Raum ein. Das Ergebnis zeigt die rechnerisch erforderliche Vorlauftemperatur.
Den ungünstigsten Raum findenDer Raum mit der höchsten nötigen Vorlauftemperatur bestimmt, wie warm die Wärmepumpe für das ganze Haus heizen muss.
Nur die Engpässe tauschenHäufig genügt es, in zwei oder drei Räumen einen Typ 22 gegen einen Typ 33 oder einen längeren Heizkörper zu tauschen. Wo der Platz fehlt, helfen Wärmepumpenheizkörper mit leisem Gebläse.
Hydraulischen Abgleich machenErst der hydraulische Abgleich sorgt dafür, dass jeder Heizkörper die Wassermenge bekommt, die er für seine Leistung braucht.
Förderung für neue Heizkörper
Der Austausch gegen Niedertemperaturheizkörper für maximal 55 °C Vorlauftemperatur wird über die BAFA-Heizungsoptimierung mit 15 % gefördert. Voraussetzung: Die Heizungsanlage ist älter als zwei Jahre, eine Gas- oder Ölheizung höchstens 20 Jahre alt. Kommen die Heizkörper zusammen mit einer neuen Wärmepumpe, läuft der Tausch über die KfW-Heizungsförderung (Zuschuss 458).
Für das Bad rechnen Sie mit 24 °C statt 20 °C. Das erhöht den Wärmebedarf um etwa 12 %. Gleichzeitig sinkt die Leistung des Heizkörpers, weil der Abstand zwischen Wasser- und Raumtemperatur kleiner wird. Der Rechner berücksichtigt beides, wenn Sie „Badezimmer“ wählen.
Soll ein Handtuchheizkörper das Bad allein beheizen, planen Sie Reserve ein. Aufgehängte Handtücher bremsen die Wärmeabgabe spürbar. Passende Modelle finden Sie bei unseren Badheizkörpern.
Genaue Planung
Wann Sie einen Fachbetrieb brauchen
Der Rechner liefert einen Orientierungswert für die Vorauswahl einzelner Heizkörper. Eine raumweise Heizlastberechnung nach DIN EN 12831 ersetzt er nicht.
Die ist sinnvoll, wenn Sie eine Wärmepumpe planen, mehrere Heizkörper gleichzeitig tauschen oder einen hydraulischen Abgleich nach Verfahren B durchführen lassen. Mehr dazu im Ratgeber zur Heizungsoptimierung.
FAQ
Häufige Fragen zum Heizkörper berechnen
Wie berechne ich die richtige Heizkörpergröße?
Multiplizieren Sie die Raumfläche mit dem Wärmebedarf pro Quadratmeter (45 bis 120 W/m² je nach Baujahr). Rechnen Sie die Normleistung aus dem Datenblatt dann auf Ihre Vorlauftemperatur um. Bei 55/45 °C liefert ein Heizkörper nur etwa die Hälfte seiner Normleistung. Aus Bauhöhe und Typ ergibt sich schließlich die nötige Länge.
Wie viel Watt Heizkörper pro Quadratmeter brauche ich?
Im Neubau ab 2016 reichen etwa 45 W/m², in Häusern von 2002 bis 2015 etwa 60 W/m². Häuser von 1978 bis 1994 brauchen etwa 90 W/m², unsanierte Altbauten vor 1978 bis zu 120 W/m². Eckräume, große Fensterflächen und Dachgeschosse liegen etwas darüber.
Wie groß muss ein Heizkörper für 20 m² sein?
Ein Raum mit 20 m² braucht je nach Baujahr 900 bis 2.400 W. In einem Haus von 1990 sind es etwa 1.800 W. Dafür reicht bei 70/55 °C ein Typ 22 mit 600 × 1.400 mm. Bei 55/45 °C, etwa mit einer Wärmepumpe, wären es 600 × 2.100 mm oder ein Typ 33 mit 600 × 1.500 mm.
Welcher Heizkörper eignet sich für eine Wärmepumpe?
Geeignet ist jeder Heizkörper, der bei 55 °C Vorlauf oder weniger genug Leistung für den Raum liefert. In der Praxis sind das großflächige Flachheizkörper vom Typ 22 oder 33. Wo wenig Platz ist, bieten Wärmepumpenheizkörper mit Gebläse viel Leistung auf kleiner Fläche.
Ist ein zu großer Heizkörper ein Problem?
Nein. Das Thermostatventil begrenzt die Wärmeabgabe, der Raum wird also nicht zu warm. Ein großzügiger Heizkörper kostet beim Kauf etwas mehr, kommt aber mit einer niedrigeren Vorlauftemperatur aus.
Was bedeutet 75/65/20 im Datenblatt?
Die drei Zahlen beschreiben die Prüfbedingungen nach EN 442: 75 °C Vorlauf, 65 °C Rücklauf und 20 °C Raumtemperatur. Unter diesen Bedingungen wird die Normleistung gemessen. Ältere Datenblätter nennen oft 90/70/20 °C. Diese Werte liegen höher und sind nicht direkt vergleichbar.
Nächster Schritt
Heizkörper berechnet? Jetzt passenden Heizkörper finden
Nutzen Sie das Ergebnis als Orientierung für Ihre Auswahl. Bei UNIDOMO finden Sie Flach-, Bad- und Designheizkörper namhafter Hersteller. Sind Sie bei Typ, Größe oder Anschluss unsicher, berät Sie unser Team aus dem Meisterbetrieb gerne persönlich.