{"id":10264,"date":"2026-08-15T00:53:15","date_gmt":"2026-08-14T22:53:15","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/narzedzia\/pv-surplus-battery-charging-calculator\/"},"modified":"2026-08-15T00:53:15","modified_gmt":"2026-08-14T22:53:15","slug":"pv-surplus-battery-charging-calculator","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/pv-surplus-battery-charging-calculator\/","title":{"rendered":"Kalkulator nadwy\u017cki PV i \u0142adowania magazynu"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">\u0141adowanie z nadwy\u017cki rozbija si\u0119 o drobiazgi: magazyn zabiera moc jako pierwszy, odbiornik minimalnie nie osi\u0105ga swojej mocy minimalnej, a przeka\u017anik zaczyna taktowa\u0107. Ten kalkulator dzieli nadwy\u017ck\u0119 tak, jak zrobi\u0142aby to automatyka, i podaje u\u017cyteczne progi.<\/p>\n<div style=\"display: flex; gap: 12px; flex-wrap: wrap;\">\n<div style=\"flex: 1; min-width: 160px;\">\n            <label for=\"pv-erzeugung\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Moc PV teraz (W)<\/label><br \/>\n            <input type=\"text\" id=\"pv-erzeugung\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"5200\">\n        <\/div>\n<div style=\"flex: 1; min-width: 160px;\">\n            <label for=\"pv-grundlast\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Obci\u0105\u017cenie podstawowe domu (W)<\/label><br \/>\n            <input type=\"text\" id=\"pv-grundlast\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"600\">\n        <\/div>\n<div style=\"flex: 1; min-width: 160px;\">\n            <label for=\"pv-kapazitaet\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Pojemno\u015b\u0107 magazynu (kWh)<\/label><br \/>\n            <input type=\"text\" id=\"pv-kapazitaet\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"10\">\n        <\/div>\n<div style=\"flex: 1; min-width: 160px;\">\n            <label for=\"pv-ladestand\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Stan na\u0142adowania (%)<\/label><br \/>\n            <input type=\"text\" id=\"pv-ladestand\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"45\">\n        <\/div>\n<\/p><\/div>\n<div style=\"display: flex; gap: 12px; flex-wrap: wrap; margin-top: 12px;\">\n<div style=\"flex: 1; min-width: 160px;\">\n            <label for=\"pv-ladeleistung\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Maksymalna moc \u0142adowania (W)<\/label><br \/>\n            <input type=\"text\" id=\"pv-ladeleistung\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"3000\">\n        <\/div>\n<div style=\"flex: 1; min-width: 160px;\">\n            <label for=\"pv-wirkungsgrad\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Sprawno\u015b\u0107 \u0142adowania (%)<\/label><br \/>\n            <input type=\"text\" id=\"pv-wirkungsgrad\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"92\">\n        <\/div>\n<div style=\"flex: 1; min-width: 160px;\">\n            <label for=\"pv-verbraucher\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Moc minimalna prze\u0142\u0105czalnego odbiornika (W)<\/label><br \/>\n            <input type=\"text\" id=\"pv-verbraucher\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"1380\">\n        <\/div>\n<div style=\"flex: 1; min-width: 160px;\">\n            <label for=\"pv-vorrang\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Pierwsze\u0144stwo<\/label><br \/>\n            <select id=\"pv-vorrang\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\"><option value=\"speicher\">najpierw magazyn<\/option><option value=\"verbraucher\">najpierw odbiornik<\/option><\/select>\n        <\/div>\n<\/p><\/div>\n<div style=\"display: flex; gap: 12px; flex-wrap: wrap; margin-top: 12px;\">\n<div style=\"flex: 1; min-width: 160px;\">\n            <label for=\"pv-strompreis\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Cena pr\u0105du (grosze za kWh)<\/label><br \/>\n            <input type=\"text\" id=\"pv-strompreis\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"32\">\n        <\/div>\n<div style=\"flex: 1; min-width: 160px;\">\n            <label for=\"pv-verguetung\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Stawka za oddanie do sieci (grosze za kWh)<\/label><br \/>\n            <input type=\"text\" id=\"pv-verguetung\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"8\">\n        <\/div>\n<\/p><\/div>\n<div style=\"display: flex; gap: 10px; flex-wrap: wrap; margin: 18px 0 0;\">\n        <button id=\"pv-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: #0b1114; border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Przelicz<\/button>\n    <\/div>\n<div id=\"pv-ergebnis\" style=\"margin-top: 22px;\"><\/div>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"\u0141adowanie z nadwy\u017cki rozbija si\u0119 o drobiazgi: magazyn zabiera moc jako pierwszy, odbiornik minimalnie nie osi\u0105ga swojej mocy minimalnej, a przeka\u017anik zaczyna taktowa\u0107. Ten kalkulator dzieli nadwy\u017ck\u0119 tak, jak zrobi\u0142aby to automatyka, i podaje u\u017cyteczne progi.\",\"label_erzeugung\":\"Moc PV teraz (W)\",\"label_grundlast\":\"Obci\u0105\u017cenie podstawowe domu (W)\",\"label_kapazitaet\":\"Pojemno\u015b\u0107 magazynu (kWh)\",\"label_ladestand\":\"Stan na\u0142adowania (%)\",\"label_ladeleistung\":\"Maksymalna moc \u0142adowania (W)\",\"label_wirkungsgrad\":\"Sprawno\u015b\u0107 \u0142adowania (%)\",\"label_verbraucher\":\"Moc minimalna prze\u0142\u0105czalnego odbiornika (W)\",\"label_vorrang\":\"Pierwsze\u0144stwo\",\"vorrang_speicher\":\"najpierw magazyn\",\"vorrang_verbraucher\":\"najpierw odbiornik\",\"label_strompreis\":\"Cena pr\u0105du (grosze za kWh)\",\"label_verguetung\":\"Stawka za oddanie do sieci (grosze za kWh)\",\"knopf\":\"Przelicz\",\"fehler_erzeugung\":\"Moc PV musi by\u0107 liczb\u0105 od 0 wzwy\u017c.\",\"fehler_grundlast\":\"Obci\u0105\u017cenie podstawowe musi by\u0107 liczb\u0105 od 0 wzwy\u017c.\",\"fehler_kapazitaet\":\"Pojemno\u015b\u0107 magazynu musi by\u0107 liczb\u0105 od 0 wzwy\u017c.\",\"fehler_ladestand\":\"Stan na\u0142adowania musi mie\u015bci\u0107 si\u0119 mi\u0119dzy 0 a 100.\",\"fehler_ladeleistung\":\"Moc \u0142adowania musi by\u0107 liczb\u0105 od 0 wzwy\u017c.\",\"fehler_wirkungsgrad\":\"Sprawno\u015b\u0107 musi mie\u015bci\u0107 si\u0119 mi\u0119dzy 0 a 100.\",\"fehler_verbraucher\":\"Moc minimalna musi by\u0107 liczb\u0105 od 0 wzwy\u017c.\",\"fehler_preis\":\"Cena i stawka musz\u0105 by\u0107 liczbami od 0 wzwy\u017c.\",\"h_verteilung\":\"Dok\u0105d trafia moc\",\"h_schwellen\":\"Progi dla automatyki\",\"h_befunde\":\"Ustalenia\",\"z_ueberschuss\":\"Nadwy\u017cka po obci\u0105\u017ceniu podstawowym\",\"z_speicher\":\"Do magazynu\",\"z_speicher_netto\":\"Z tego faktycznie zmagazynowane\",\"z_verbraucher\":\"Do prze\u0142\u0105czalnego odbiornika\",\"z_einspeisung\":\"Oddane do sieci\",\"z_netzbezug\":\"Pobrane z sieci\",\"z_fehlend\":\"Do pe\u0142nego magazynu brakuje\",\"z_dauer\":\"Czas do pe\u0142na przy tej mocy\",\"z_ein\":\"Za\u0142\u0105czy\u0107 powy\u017cej\",\"z_aus\":\"Wy\u0142\u0105czy\u0107 poni\u017cej\",\"schwellen_erklaerung\":\"Progi zawieraj\u0105 obci\u0105\u017cenie podstawowe i zostawiaj\u0105 po dziesi\u0119\u0107 procent zapasu w g\u00f3r\u0119 i w d\u00f3\u0142. Op\u00f3\u017anienie trzech do pi\u0119ciu minut na obu zboczach sprawia, \u017ce przechodz\u0105ca chmura nie prze\u0142\u0105cza odbiornika.\",\"b_kein_ueberschuss\":\"Nadwy\u017cki nie ma, dom pobiera %s W z sieci. Ze s\u0142o\u0144ca nie da si\u0119 teraz nic na\u0142adowa\u0107.\",\"b_verbraucher_reicht_nicht\":\"Odbiornik potrzebuje %s W, a zostaje tylko %r W, pozostaje wi\u0119c wy\u0142\u0105czony. Wszystko inne oznacza\u0142oby pobranie r\u00f3\u017cnicy z sieci.\",\"b_speicher_zuerst\":\"Magazyn zabiera moc jako pierwszy, a odbiornik czeka, cho\u0107 nadwy\u017cka by mu wystarczy\u0142a. Pierwsze\u0144stwo dla odbiornika nape\u0142nia magazyn p\u00f3\u017aniej, ale zu\u017cywa od razu.\",\"b_speicher_voll\":\"Magazyn jest pe\u0142ny, ca\u0142a nadwy\u017cka jest dost\u0119pna dla odbiornik\u00f3w albo idzie do sieci.\",\"b_teillast\":\"Do magazynu p\u0142ynie tylko %s W z mo\u017cliwych %m W, bo nadwy\u017cka nie daje wi\u0119cej.\",\"b_takten\":\"Nadwy\u017cka i moc odbiornika s\u0105 niemal r\u00f3wne. Bez op\u00f3\u017anienia i szerokiej histerezy przeka\u017anik zacznie taktowa\u0107.\",\"b_einspeisen_lohnt\":\"Stawka za oddanie do sieci jest co najmniej r\u00f3wna cenie pr\u0105du. W takim uk\u0142adzie oddawanie op\u0142aca si\u0119 bardziej ni\u017c zu\u017cycie w\u0142asne.\",\"b_ersparnis\":\"Ka\u017cda zu\u017cyta u siebie kilowatogodzina jest warta %s groszy.\",\"b_wirkungsgrad\":\"Straty \u0142adowania zjadaj\u0105 %s W, to ciep\u0142o, a nie magazyn.\"};<\/p>\n<p>    \/\/ --- reine Rechenlogik ---<\/p>\n<p>    function zahl(wert) {\n        const roh = String(wert === undefined || wert === null ? '' : wert).trim().replace(',', '.');\n        if (roh === '') { return NaN; }\n        if (!\/^-?[0-9]+(\\.[0-9]+)?$\/.test(roh)) { return NaN; }\n        return parseFloat(roh);\n    }<\/p>\n<p>    function runde(wert, stellen) {\n        const faktor = Math.pow(10, stellen === undefined ? 0 : stellen);\n        return Math.round(wert * faktor) \/ faktor;\n    }<\/p>\n<p>    function rechnen(e) {\n        const ergebnis = { ok: false, fehler: '', befunde: [] };\n        const eingabe = e || {};<\/p>\n<p>        const erzeugung = zahl(eingabe.erzeugung);\n        const grundlast = zahl(eingabe.grundlast);\n        const kapazitaet = zahl(eingabe.kapazitaet);\n        const ladestand = zahl(eingabe.ladestand);\n        const ladeleistung = zahl(eingabe.ladeleistung);\n        const wirkungsgrad = zahl(eingabe.wirkungsgrad);\n        const verbraucher = zahl(eingabe.verbraucher);\n        const strompreis = zahl(eingabe.strompreis);\n        const verguetung = zahl(eingabe.verguetung);<\/p>\n<p>        if (!isFinite(erzeugung) || erzeugung < 0) { ergebnis.fehler = T.fehler_erzeugung; return ergebnis; }\n        if (!isFinite(grundlast) || grundlast < 0) { ergebnis.fehler = T.fehler_grundlast; return ergebnis; }\n        if (!isFinite(kapazitaet) || kapazitaet < 0) { ergebnis.fehler = T.fehler_kapazitaet; return ergebnis; }\n        if (!isFinite(ladestand) || ladestand < 0 || ladestand > 100) { ergebnis.fehler = T.fehler_ladestand; return ergebnis; }\n        if (!isFinite(ladeleistung) || ladeleistung < 0) { ergebnis.fehler = T.fehler_ladeleistung; return ergebnis; }\n        if (!isFinite(wirkungsgrad) || wirkungsgrad <= 0 || wirkungsgrad > 100) { ergebnis.fehler = T.fehler_wirkungsgrad; return ergebnis; }\n        if (!isFinite(verbraucher) || verbraucher < 0) { ergebnis.fehler = T.fehler_verbraucher; return ergebnis; }\n        if (!isFinite(strompreis) || strompreis < 0) { ergebnis.fehler = T.fehler_preis; return ergebnis; }\n        if (!isFinite(verguetung) || verguetung < 0) { ergebnis.fehler = T.fehler_preis; return ergebnis; }\n\n        const ueberschuss = erzeugung - grundlast;\n        const fehlend = kapazitaet * (100 - ladestand) \/ 100;   \/\/ kWh, die noch hineinpassen\n        const vorrang = eingabe.vorrang === 'verbraucher' ? 'verbraucher' : 'speicher';\n\n        let anSpeicher = 0;\n        let anVerbraucher = 0;\n        let rest = Math.max(0, ueberschuss);\n\n        if (vorrang === 'speicher') {\n            anSpeicher = fehlend > 0 ? Math.min(rest, ladeleistung) : 0;\n            rest -= anSpeicher;\n            anVerbraucher = rest >= verbraucher ? verbraucher : 0;\n            rest -= anVerbraucher;\n        } else {\n            anVerbraucher = rest >= verbraucher ? verbraucher : 0;\n            rest -= anVerbraucher;\n            anSpeicher = fehlend > 0 ? Math.min(rest, ladeleistung) : 0;\n            rest -= anSpeicher;\n        }<\/p>\n<p>        \/\/ Der Wirkungsgrad frisst einen Teil dessen, was in den Speicher geht.\n        const imSpeicher = anSpeicher * (wirkungsgrad \/ 100);\n        const stunden = imSpeicher > 0 ? (fehlend * 1000) \/ imSpeicher : 0;<\/p>\n<p>        \/\/ Schwellen fuer die Schaltung, mit Abstand nach oben und unten.\n        const einschalten = Math.ceil((verbraucher * 1.1 + grundlast) \/ 50) * 50;\n        const ausschalten = Math.floor((verbraucher * 0.9 + grundlast) \/ 50) * 50;<\/p>\n<p>        ergebnis.ok = true;\n        ergebnis.ueberschuss = runde(ueberschuss);\n        ergebnis.anSpeicher = runde(anSpeicher);\n        ergebnis.imSpeicher = runde(imSpeicher);\n        ergebnis.anVerbraucher = runde(anVerbraucher);\n        ergebnis.einspeisung = runde(Math.max(0, rest));\n        ergebnis.netzbezug = runde(Math.max(0, -ueberschuss));\n        ergebnis.fehlend = runde(fehlend, 2);\n        ergebnis.stunden = runde(stunden, 2);\n        ergebnis.einschalten = einschalten;\n        ergebnis.ausschalten = ausschalten;\n        ergebnis.vorrang = vorrang;\n        ergebnis.ersparnis = runde(strompreis - verguetung, 2);\n        ergebnis.wertEigenverbrauch = runde((anVerbraucher \/ 1000) * (strompreis - verguetung), 2);<\/p>\n<p>        \/\/ --- Befunde ---\n        if (ueberschuss <= 0) {\n            ergebnis.befunde.push({ schwer: true, text: T.b_kein_ueberschuss.replace('%s', String(ergebnis.netzbezug)) });\n        }\n        if (ueberschuss > 0 && anVerbraucher === 0 && verbraucher > 0) {\n            ergebnis.befunde.push({ schwer: true, text: T.b_verbraucher_reicht_nicht.replace('%s', String(verbraucher)).replace('%r', String(runde(Math.max(0, ueberschuss - anSpeicher)))) });\n        }\n        if (vorrang === 'speicher' && anVerbraucher === 0 && ueberschuss >= verbraucher && fehlend > 0) {\n            ergebnis.befunde.push({ schwer: false, text: T.b_speicher_zuerst });\n        }\n        if (fehlend <= 0) {\n            ergebnis.befunde.push({ schwer: false, text: T.b_speicher_voll });\n        }\n        if (anSpeicher > 0 && anSpeicher < ladeleistung &#038;&#038; fehlend > 0) {\n            ergebnis.befunde.push({ schwer: false, text: T.b_teillast.replace('%s', String(ergebnis.anSpeicher)).replace('%m', String(ladeleistung)) });\n        }\n        if (ueberschuss > 0 && Math.abs(ueberschuss - verbraucher) < verbraucher * 0.15) {\n            ergebnis.befunde.push({ schwer: true, text: T.b_takten });\n        }\n        if (ergebnis.ersparnis <= 0) {\n            ergebnis.befunde.push({ schwer: true, text: T.b_einspeisen_lohnt });\n        } else {\n            ergebnis.befunde.push({ schwer: false, text: T.b_ersparnis.replace('%s', String(ergebnis.ersparnis)) });\n        }\n        if (wirkungsgrad < 100) {\n            ergebnis.befunde.push({ schwer: false, text: T.b_wirkungsgrad.replace('%s', String(runde(anSpeicher - imSpeicher))) });\n        }\n\n        return ergebnis;\n    }\n\n    if (typeof window !== 'undefined') {\n        window.LW_TEST = window.LW_TEST || {};\n        window.LW_TEST.PV = { rechnen: rechnen, zahl: zahl };\n    }\n\n    \/\/ --- Anbindung an das Dokument ---\n\n    const btn = document.getElementById('pv-btn');\n    const out = document.getElementById('pv-ergebnis');\n    if (!btn || !out) { return; }\n\n    const KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 14px; margin-bottom: 18px;';\n    const UEBERSCHRIFT = 'color: var(--text-primary, #e8e8ee); font-weight: 700; margin-bottom: 8px;';\n\n    function el(tag, css, inhalt) {\n        const knoten = document.createElement(tag);\n        if (css) { knoten.setAttribute('style', css); }\n        if (inhalt !== undefined &#038;&#038; inhalt !== null) { knoten.textContent = inhalt; }\n        return knoten;\n    }\n\n    function wert(id) {\n        const knoten = document.getElementById(id);\n        return knoten ? knoten.value : '';\n    }\n\n    function zeile(kasten, name, inhalt, hervor) {\n        const z = el('div', 'display: flex; justify-content: space-between; gap: 14px; flex-wrap: wrap; padding: 5px 0;');\n        z.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0);', name));\n        z.appendChild(el('span', 'color: ' + (hervor ? 'var(--accent, #7ee787)' : 'var(--text-primary, #e8e8ee)') + '; font-family: monospace;', inhalt));\n        kasten.appendChild(z);\n    }\n\n    btn.addEventListener('click', function () {\n        const erg = rechnen({\n            erzeugung: wert('pv-erzeugung'),\n            grundlast: wert('pv-grundlast'),\n            kapazitaet: wert('pv-kapazitaet'),\n            ladestand: wert('pv-ladestand'),\n            ladeleistung: wert('pv-ladeleistung'),\n            wirkungsgrad: wert('pv-wirkungsgrad'),\n            verbraucher: wert('pv-verbraucher'),\n            vorrang: wert('pv-vorrang'),\n            strompreis: wert('pv-strompreis'),\n            verguetung: wert('pv-verguetung')\n        });\n\n        out.textContent = '';\n        if (!erg.ok) {\n            out.appendChild(el('div', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid #ffb86c; color: var(--text-secondary, #a0a0b0); padding: 14px; border-radius: 6px;', erg.fehler));\n            return;\n        }\n\n        out.appendChild(el('div', UEBERSCHRIFT, T.h_verteilung));\n        const kasten = el('div', KASTEN);\n        zeile(kasten, T.z_ueberschuss, erg.ueberschuss + ' W', erg.ueberschuss > 0);\n        zeile(kasten, T.z_speicher, erg.anSpeicher + ' W');\n        zeile(kasten, T.z_speicher_netto, erg.imSpeicher + ' W');\n        zeile(kasten, T.z_verbraucher, erg.anVerbraucher + ' W', erg.anVerbraucher > 0);\n        zeile(kasten, T.z_einspeisung, erg.einspeisung + ' W');\n        if (erg.netzbezug > 0) { zeile(kasten, T.z_netzbezug, erg.netzbezug + ' W'); }\n        zeile(kasten, T.z_fehlend, erg.fehlend + ' kWh');\n        zeile(kasten, T.z_dauer, erg.stunden > 0 ? erg.stunden + ' h' : '-');\n        out.appendChild(kasten);<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, T.h_schwellen));\n        const schwellen = el('div', KASTEN);\n        zeile(schwellen, T.z_ein, erg.einschalten + ' W', true);\n        zeile(schwellen, T.z_aus, erg.ausschalten + ' W');\n        schwellen.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.85rem; line-height: 1.6; padding-top: 8px;', T.schwellen_erklaerung));\n        out.appendChild(schwellen);<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        const befunde = el('div', KASTEN);\n        erg.befunde.forEach(function (b) {\n            const z = el('div', 'display: flex; gap: 10px; padding: 5px 0;');\n            z.appendChild(el('span', 'color: ' + (b.schwer ? '#ffb86c' : 'var(--text-secondary, #a0a0b0)') + '; font-family: monospace;', b.schwer ? '!' : '-'));\n            z.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0); font-size: 0.9rem; line-height: 1.5;', b.text));\n            befunde.appendChild(z);\n        });\n        out.appendChild(befunde);\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dzieli bie\u017c\u0105c\u0105 nadwy\u017ck\u0119 mi\u0119dzy magazyn a prze\u0142\u0105czalny odbiornik, wylicza czas do pe\u0142nego na\u0142adowania i wyprowadza progi prze\u0142\u0105czania dla automatyki nadwy\u017ckowej.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9284,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92190,92199,92202],"class_list":["post-10264","page","type-page","status-publish","hentry","tag-energy-management-pl","tag-photovoltaics-pl","tag-smart-home-de-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Kalkulator nadwy\u017cki PV i \u0142adowania magazynu - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/pv-surplus-battery-charging-calculator\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kalkulator nadwy\u017cki PV i \u0142adowania magazynu - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Dzieli bie\u017c\u0105c\u0105 nadwy\u017ck\u0119 mi\u0119dzy magazyn a prze\u0142\u0105czalny odbiornik, wylicza czas do pe\u0142nego na\u0142adowania i wyprowadza progi prze\u0142\u0105czania dla automatyki nadwy\u017ckowej.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/pv-surplus-battery-charging-calculator\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/pv-surplus-battery-charging-calculator\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/pv-surplus-battery-charging-calculator\\\/\",\"name\":\"Kalkulator nadwy\u017cki PV i \u0142adowania magazynu - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-14T22:53:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/pv-surplus-battery-charging-calculator\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/pv-surplus-battery-charging-calculator\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/pv-surplus-battery-charging-calculator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-3\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Kalkulator nadwy\u017cki PV i \u0142adowania magazynu\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kalkulator nadwy\u017cki PV i \u0142adowania magazynu - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/pv-surplus-battery-charging-calculator\/","og_locale":"en_US","og_type":"article","og_title":"Kalkulator nadwy\u017cki PV i \u0142adowania magazynu - Lukas Wojcik - Blog","og_description":"Dzieli bie\u017c\u0105c\u0105 nadwy\u017ck\u0119 mi\u0119dzy magazyn a prze\u0142\u0105czalny odbiornik, wylicza czas do pe\u0142nego na\u0142adowania i wyprowadza progi prze\u0142\u0105czania dla automatyki nadwy\u017ckowej.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/pv-surplus-battery-charging-calculator\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/pv-surplus-battery-charging-calculator\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/pv-surplus-battery-charging-calculator\/","name":"Kalkulator nadwy\u017cki PV i \u0142adowania magazynu - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-14T22:53:15+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/pv-surplus-battery-charging-calculator\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/pv-surplus-battery-charging-calculator\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/pv-surplus-battery-charging-calculator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-3\/"},{"@type":"ListItem","position":3,"name":"Kalkulator nadwy\u017cki PV i \u0142adowania magazynu"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10264","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=10264"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10264\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9284"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10264"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10264"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}