{"id":844,"date":"2026-10-18T11:39:25","date_gmt":"2026-10-18T03:39:25","guid":{"rendered":"https:\/\/luminvolt.com\/"},"modified":"2026-10-19T10:46:24","modified_gmt":"2026-10-19T02:46:24","slug":"solar-project-planning-tools","status":"publish","type":"page","link":"https:\/\/luminvolt.com\/nl\/solar-project-planning-tools\/","title":{"rendered":"Zonne-energie Projectplanningstools: Capaciteit, Opbrengst, Kosten &amp; Engineering"},"content":{"rendered":"\n<style>body.page-id-844 #right-sidebar,body.page-id-844 #left-sidebar,body.page-id-844 .entry-header{display:none!important}body.page-id-844 #primary{float:none!important;width:100%!important}body.page-id-844 #page.site{max-width:none!important}body.page-id-844 .site-content{display:block!important;padding:0!important}body.page-id-844 .site-main,body.page-id-844 .entry-content{margin:0!important}body.page-id-844 .inside-article{padding:0!important;background:transparent!important}\n.lvp{--ink:#102d24;--text:#52665d;--green:#167554;--line:#dbe5df;--mint:#e7f2eb;background:#f4f7f3;color:var(--ink);font-family:inherit;font-size:15px;line-height:1.65;padding:0 0 35px}.lvp,.lvp *{box-sizing:border-box}.lvp [hidden]{display:none!important}.lvp h1,.lvp h2,.lvp h3,.lvp p{margin:0}.lvp h1,.lvp h2,.lvp h3{color:var(--ink);font-weight:650;letter-spacing:-.035em;line-height:1.15}.lvp h1{font-size:clamp(35px,4.2vw,60px);max-width:740px}.lvp h1 em{font-style:normal;color:var(--green)}.lvp h2{font-size:30px}.lvp h3{font-size:21px}.lvp p{color:var(--text)}.lvp a{color:var(--green);text-decoration:none}.lvp a:hover{text-decoration:underline}.lvp button,.lvp input,.lvp select{font:inherit}.lvp :focus-visible{outline:3px solid #d4a248;outline-offset:3px}.lvp-wrap{width:min(1280px,100% - 72px);margin:auto}.lvp-bread{display:flex;gap:12px;font-size:11px;color:#607568;padding-top:25px}.lvp-hero{display:flex;justify-content:space-between;align-items:center;gap:50px;padding:48px 0 35px}.lvp-eyebrow{font-size:10px!important;font-weight:700;letter-spacing:.15em;color:var(--green)!important;margin-bottom:17px!important}.lvp-intro{max-width:610px;margin-top:20px!important;font-size:15px}.lvp-seal{width:185px;flex-shrink:0;border:1px solid #cbdcd0;border-radius:50%;aspect-ratio:1;display:grid;place-content:center;text-align:center;background:radial-gradient(circle,#e5f1e4,transparent 70%)}.lvp-seal strong{font-size:55px;font-weight:500;line-height:1.15;letter-spacing:-.06em}.lvp-seal span{font-size:10px;letter-spacing:.13em;color:#62806d}.lvp-project{background:#e7eee5;border:1px solid #d7e2d4;border-radius:12px;margin-bottom:26px;padding:21px 25px}.lvp-project-head{display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:15px}.lvp-project-head h2{font-size:17px}.lvp-project-head p{font-size:10px}.lvp-project-grid{display:grid;grid-template-columns:1fr 1.25fr .9fr 1fr 1fr 1fr;gap:16px}.lvp label{display:block;font-size:11px;color:#3c5647;font-weight:600;margin-bottom:6px}.lvp label small{font-weight:400;color:#718274;font-size:10px}.lvp input,.lvp select{display:block;width:100%;max-width:100%;height:43px;padding:9px 10px;border:1px solid #cbd8ce;border-radius:6px;background:#fcfdfb;color:var(--ink);font-size:13px;box-shadow:none}.lvp input:focus,.lvp select:focus{border-color:var(--green);background:#fff}.lvp-layout{display:grid;grid-template-columns:220px minmax(0,1fr);gap:25px;align-items:start}.lvp-nav{background:#103d2c;color:#c5dbcd;border-radius:12px;padding:15px 12px 21px;position:sticky;top:25px}.lvp-nav>p{font-size:9px;letter-spacing:.14em;color:#85ad96;margin:9px 13px 12px}.lvp-nav a{display:flex;align-items:center;gap:13px;font-size:12px;color:#c5dbcd;padding:13px;border-radius:6px;margin-bottom:3px}.lvp-nav a:hover{background:#1c4e39;text-decoration:none}.lvp-nav a[aria-current=page]{background:#d6eacf;color:#164632;font-weight:700}.lvp-nav svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.5;flex-shrink:0}.lvp-nav .lvp-nav-resource{border-top:1px solid #365e48;padding-top:20px;margin-top:15px;font-size:11px}.lvp-main{min-width:0;background:white;border:1px solid var(--line);border-radius:12px;overflow:hidden}.lvp-panel-heading{padding:29px 30px 24px;border-bottom:1px solid #e6ece6}.lvp-panel-heading p:not(.lvp-eyebrow){font-size:12px;margin-top:12px;max-width:700px}.lvp-panel-heading .lvp-eyebrow{margin-bottom:10px!important}.lvp-form{padding:26px 30px 30px}.lvp-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:19px 16px}.lvp-field{min-width:0}.lvp-field .lvp-note{font-size:9px;margin-top:5px}.lvp-subhead{font-size:12px;font-weight:700;letter-spacing:0!important;grid-column:1\/-1;border-top:1px solid #e2eae2;padding-top:17px;margin-top:3px!important}.lvp-form-actions{display:flex;align-items:center;gap:20px;margin-top:25px}.lvp button,.lvp .lvp-button{border:1px solid var(--green);border-radius:7px;background:var(--green);color:#fff;cursor:pointer;font-weight:600;font-size:12px;padding:12px 19px;display:inline-flex;align-items:center;justify-content:center;gap:22px;min-height:45px;line-height:1.4}.lvp button:hover,.lvp .lvp-button:hover{background:#105739;text-decoration:none}.lvp .lvp-secondary{background:transparent;color:var(--green)}.lvp .lvp-secondary:hover{background:#e9f3e8}.lvp-form-actions>span{font-size:10px;color:#7b897d}.lvp-output{border-top:1px solid #dce7dc;padding:27px 30px;background:#fbfdf9;min-width:0}.lvp-output:empty{display:none}.lvp-primary-result{display:flex;align-items:center;justify-content:space-between;gap:20px;background:#103d2c;color:#fff;border-radius:9px;padding:22px 25px;margin-bottom:23px}.lvp-primary-result p{color:#bad3c1;font-size:11px}.lvp-primary-result strong{display:block;font-size:clamp(28px,3.4vw,43px);letter-spacing:-.05em;line-height:1.2;margin-top:7px;overflow-wrap:anywhere;font-weight:600;font-variant-numeric:tabular-nums}.lvp-primary-result small{font-size:10px;color:#bad3c1;font-weight:400;letter-spacing:0}.lvp-primary-result svg{flex:0 0 60px;width:60px;height:60px;stroke:#75a87e;fill:none;stroke-width:1.3}.lvp-metrics{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px;margin:20px 0}.lvp-metric{min-width:0;border-left:1px solid #d8e5d9;padding-left:16px}.lvp-metric:first-child{border:0;padding:0}.lvp-metric span{font-size:10px;color:#627967;display:block}.lvp-metric strong{font-size:23px;letter-spacing:-.04em;font-weight:600;display:block;margin:6px 0;overflow-wrap:anywhere;line-height:1.2}.lvp-metric small{font-size:9px;color:#718372}.lvp-caption,.lvp-note{font-size:11px;line-height:1.8;color:#607467!important}.lvp-caption{margin-top:16px!important}.lvp-banner{padding:14px 17px;border-radius:7px;background:#eaf3e7;font-size:11px;margin:15px 0;color:#3c6547}.lvp-error{border-left:3px solid #ad5839;background:#fff2ed;padding:15px 17px;color:#85412b!important;font-size:12px}.lvp-method{border-top:1px solid #e0e9df;padding:18px 30px;font-size:11px;background:#f8faf6}.lvp-method summary{cursor:pointer;font-weight:600;color:#42624c}.lvp-method p{margin-top:12px;line-height:1.85}.lvp-method a{text-decoration:underline}.lvp-table{width:100%;border-collapse:collapse;border:0;margin:0;font-size:11px}.lvp-table th,.lvp-table td{border:0;border-bottom:1px solid #e2ebe1;padding:11px 10px;text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}.lvp-table th{font-weight:600;color:#5a705e;background:#eef5ea;font-size:10px}.lvp-table th:first-child,.lvp-table td:first-child{text-align:left}.lvp-table-scroll{overflow:auto;max-height:420px;margin:17px 0 20px}.lvp-table thead th{position:sticky;top:0}.lvp-bars{display:flex;align-items:flex-end;gap:5px;height:130px;margin:25px 0 8px;border-bottom:1px solid #bccfbc;padding:0 6px}.lvp-bars>span{display:block;flex:1;background:#3a8d60;border-radius:3px 3px 0 0;min-height:2px}.lvp-bars>span:nth-child(2n){background:#91b38a}.lvp-chart-labels{display:flex;justify-content:space-between;font-size:9px;color:#7c8c7b}.lvp-drawing{background:#f0f6ed;border:1px solid #e0ebda;border-radius:8px;margin-top:23px;overflow:hidden}.lvp-drawing svg{display:block;width:100%;max-height:250px}.lvp-stack{padding:28px 30px}.lvp-stack details{border-bottom:1px solid var(--line);padding:18px 0}.lvp-stack details:first-child{padding-top:0}.lvp-stack summary{font-weight:600;font-size:15px;cursor:pointer;color:var(--ink)}.lvp-stack details>p{font-size:11px;margin-top:12px}.lvp-stack .lvp-form{padding:20px 0}.lvp-stack .lvp-output{padding:20px;border:1px solid #e1eadc;border-radius:8px}.lvp-resource-list{padding:7px 30px 30px}.lvp-resource{display:grid;grid-template-columns:45px minmax(0,1fr) auto;align-items:center;gap:16px;padding:24px 0;border-bottom:1px solid #dfe8dd}.lvp-resource>span{font-size:10px;color:#7c9e80}.lvp-resource h3{font-size:19px}.lvp-resource p{font-size:11px;margin-top:8px;max-width:480px}.lvp-resource>a{font-size:12px;font-weight:600}.lvp-service-brief{padding:24px 30px 30px}.lvp-service-brief ul{font-size:12px;color:#526c58;line-height:1.9;margin:15px 0 25px 18px;padding:0}.lvp-footer{display:flex;gap:30px;justify-content:space-between;border-top:1px solid #d7e2d5;padding:25px 0 0;margin-top:37px;font-size:10px;color:#657e69}.lvp-footer p{max-width:650px}.lvp-empty{padding:19px 20px;background:#eef4e9;border:1px dashed #bdcfb7;border-radius:8px;font-size:12px;color:#5c735a}.lvp-result-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:20px}.lvp-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}\n@media(min-width:1500px){.lvp-wrap{width:min(1400px,100% - 100px)}}@media(max-width:1050px){.lvp-layout{grid-template-columns:185px minmax(0,1fr);gap:18px}.lvp-wrap{width:calc(100% - 40px)}.lvp-fields{grid-template-columns:1fr 1fr}.lvp-project-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.lvp-seal{width:145px}.lvp-panel-heading,.lvp-form,.lvp-output{padding-left:24px;padding-right:24px}.lvp-nav a{font-size:11px;padding:12px 9px;gap:10px}.lvp-metric strong{font-size:20px}}\n@media(max-width:750px){.lvp-hero{padding:32px 0 27px;gap:25px}.lvp-seal{display:none}.lvp-layout{display:block}.lvp-nav{position:static;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:4px;padding:10px;margin-bottom:16px}.lvp-nav>p,.lvp-nav .lvp-nav-resource{display:none}.lvp-nav a{margin:0;padding:11px 8px;justify-content:flex-start;font-size:10px;gap:8px}.lvp-nav svg{width:15px;height:15px}.lvp-fields{grid-template-columns:repeat(3,minmax(0,1fr))}.lvp-project{padding:18px}.lvp-hero h1{font-size:40px}.lvp-project-head{align-items:flex-start;flex-direction:column;gap:4px}.lvp-footer{display:block}.lvp-footer>a{display:inline-block;margin-top:14px}.lvp-primary-result strong{font-size:34px}.lvp-form-actions{align-items:flex-start;flex-direction:column;gap:10px}}\n@media(max-width:520px){.lvp-wrap{width:calc(100% - 28px)}.lvp h1{font-size:35px!important}.lvp h2{font-size:25px}.lvp-intro{font-size:13px}.lvp-project-grid{grid-template-columns:1fr 1fr;gap:14px 12px}.lvp-project{padding:16px}.lvp-fields{grid-template-columns:1fr 1fr;gap:17px 12px}.lvp-panel-heading,.lvp-form,.lvp-output,.lvp-stack,.lvp-service-brief{padding:22px 18px}.lvp-method{padding:17px 18px}.lvp-primary-result{padding:20px 17px}.lvp-primary-result svg{display:none}.lvp-metrics{gap:10px}.lvp-metric{padding-left:9px}.lvp-metric strong{font-size:19px}.lvp-metric span{font-size:9px}.lvp-metric small{font-size:8px}.lvp-nav a{font-size:10px;gap:6px}.lvp-nav svg{width:13px}.lvp-nav{gap:2px;padding:7px}.lvp-resource-list{padding:0 18px 22px}.lvp-resource{grid-template-columns:25px minmax(0,1fr);gap:9px}.lvp-resource>a{grid-column:2}.lvp-resource h3{font-size:19px}.lvp button,.lvp .lvp-button{font-size:11px;padding:12px 15px}.lvp-stack .lvp-output{padding:15px}.lvp input,.lvp select{font-size:14px;min-width:0}.lvp-project-head p{font-size:9px}.lvp-primary-result strong{font-size:30px}}\n@media(prefers-reduced-motion:no-preference){.lvp-nav a{transition:background .15s}.lvp button{transition:background .15s}}\n.lvp-label-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.lvp-label-row label{margin-bottom:0!important}.lvp-tooltip-wrap{position:relative;display:inline-flex;align-items:center}.lvp-tooltip-icon{display:inline-flex!important;align-items:center!important;justify-content:center!important;width:16px!important;height:16px!important;min-height:16px!important;padding:0!important;border-radius:50%!important;border:1px solid #9db8a5!important;background:#f4f8f4!important;color:#275239!important;font-size:10px!important;font-weight:700!important;font-family:inherit!important;line-height:1!important;cursor:help!important;transition:all .15s ease!important}.lvp-tooltip-icon:hover,.lvp-tooltip-wrap:hover .lvp-tooltip-icon,.lvp-tooltip-icon:focus-visible{background:var(--green)!important;color:#fff!important;border-color:var(--green)!important}.lvp-tooltip-content{position:absolute;top:calc(100% + 8px);right:-4px;width:310px;max-width:calc(100vw - 36px);background:#fff;border:1px solid #cbdad0;border-radius:8px;box-shadow:0 12px 28px -4px rgba(16,45,36,0.18),0 2px 6px rgba(16,45,36,0.06);padding:13px 15px;font-size:11px;line-height:1.55;color:var(--ink);z-index:150;pointer-events:none;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .18s ease,transform .18s ease,visibility .18s;text-align:left}.lvp-tooltip-wrap:hover .lvp-tooltip-content,.lvp-tooltip-wrap:focus-within .lvp-tooltip-content{opacity:1;visibility:visible;pointer-events:auto;transform:translateY(0)}.lvp-tooltip-content::before{content:'';position:absolute;top:-6px;right:7px;width:10px;height:10px;background:#fff;border-left:1px solid #cbdad0;border-top:1px solid #cbdad0;transform:rotate(45deg)}.lvp-tip-title{font-weight:700;color:var(--ink);font-size:11px;border-bottom:1px solid #e7eee5;padding-bottom:6px;margin-bottom:8px}.lvp-tip-item{font-size:10.5px;color:var(--text);margin-bottom:6px;line-height:1.5}.lvp-tip-foot{font-size:9.5px;color:#607568;border-top:1px dashed #dbe5df;padding-top:7px;margin-top:8px;font-style:italic}\n\n<\/style>\n<div id=\"lv-planning-tool\" class=\"lvp\"><div class=\"lvp-wrap\"><nav class=\"lvp-bread\" aria-label=\"Breadcrumb\"><a href=\"\/\">Home<\/a><span>\/<\/span><span>Solar planning tools<\/span><\/nav><header class=\"lvp-hero\"><div><p class=\"lvp-eyebrow\">LUMINVOLT \/ PROJECT WORKBENCH<\/p><h1>From available space<br>to <em>a clearer solar plan.<\/em><\/h1><p class=\"lvp-intro\">Size your array, explore its economics, and check the details. Nine connected tools for the first decisions in your PV project.<\/p><\/div><div class=\"lvp-seal\" aria-hidden=\"true\"><strong>09<\/strong><span>PLANNING TOOLS<\/span><\/div><\/header><section class=\"lvp-project\" aria-labelledby=\"lvp-project-title\"><div class=\"lvp-project-head\"><h2 id=\"lvp-project-title\">Your project<\/h2><p id=\"lvp-project-origin\">Editable example capacity &#038; yield. Enter your own tariffs.<\/p><\/div><div class=\"lvp-project-grid\"><div class=\"lvp-field\"><label for=\"lvp-kw\">DC capacity <small>kWp<\/small><\/label><input id=\"lvp-kw\" name=\"kw\" type=\"number\" value=\"10\" min=\".001\" max=\"1000000\" step=\"any\" required><\/div><div class=\"lvp-field\"><div class=\"lvp-label-row\"><label for=\"lvp-yield\">First-year specific yield <small>kWh\/kWp<\/small><\/label><div class=\"lvp-tooltip-wrap\"><button type=\"button\" class=\"lvp-tooltip-icon\" aria-label=\"Reference values\" aria-describedby=\"lvp-tip-yield\">?<\/button><div class=\"lvp-tooltip-content\" id=\"lvp-tip-yield\" role=\"tooltip\"><div class=\"lvp-tip-title\">Typical Regional Specific Yield (kWh\/kWp)<\/div><div class=\"lvp-tip-item\">800 \u2013 1,000 kWh\/kWp: Low sun or frequent rain (e.g. Northern Europe, overcast basins)<\/div><div class=\"lvp-tip-item\">1,100 \u2013 1,300 kWh\/kWp: Moderate to good sun (e.g. Southern Europe, Coastal East Asia; typical default)<\/div><div class=\"lvp-tip-item\">1,400 \u2013 1,700+ kWh\/kWp: High irradiation (e.g. Southern Spain, Australia, desert highlands)<\/div><div class=\"lvp-tip-foot\">Formula: Year-1 generation (kWh) = Capacity (kWp) \u00d7 Specific yield<\/div><\/div><\/div><\/div><input id=\"lvp-yield\" name=\"yield\" type=\"number\" value=\"1200\" min=\".001\" max=\"10000\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-currency\">Currency<\/label><select id=\"lvp-currency\" name=\"currency\"><option value=\"USD\">USD<\/option><option value=\"EUR\">EUR<\/option><option value=\"CNY\">CNY<\/option><option value=\"GBP\">GBP<\/option><option value=\"AUD\">AUD<\/option><option value=\"CAD\">CAD<\/option><option value=\"INR\">INR<\/option><option value=\"AED\">AED<\/option><option value=\"CLP\">CLP<\/option><option value=\"Local\">Local<\/option><\/select><\/div><div class=\"lvp-field\"><label for=\"lvp-retail\">Avoided import price <small>\/kWh<\/small><\/label><input id=\"lvp-retail\" name=\"retail\" type=\"number\" value=\"\" min=\"0\" max=\"1000000\" step=\"any\"><\/div><div class=\"lvp-field\"><label for=\"lvp-export\">Export price <small>\/kWh<\/small><\/label><input id=\"lvp-export\" name=\"export\" type=\"number\" value=\"\" min=\"0\" max=\"1000000\" step=\"any\"><\/div><div class=\"lvp-field\"><label for=\"lvp-self\">Self-consumption <small>%<\/small><\/label><input id=\"lvp-self\" name=\"self\" type=\"number\" value=\"70\" min=\"0\" max=\"100\" step=\"any\" required><\/div><\/div><\/section><div class=\"lvp-layout\"><nav class=\"lvp-nav\" aria-label=\"Solar tools\"><p>PROJECT TOOLS<\/p><a href=\"#capacity\" data-nav=\"capacity\" aria-current=\"page\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M3 19V8h5v11m3 0V3h5v16m3 0v-7h3v7\"\/><\/svg><span>Capacity estimate<\/span><\/a><a href=\"#energy\" data-nav=\"energy\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m13 2-9 12h7l-1 8 10-13h-8z\"\/><\/svg><span>Energy yield<\/span><\/a><a href=\"#cost\" data-nav=\"cost\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M15 8h-5a2 2 0 0 0 0 4h4a2 2 0 0 1 0 4H9m3-11v14\"\/><\/svg><span>Project cost<\/span><\/a><a href=\"#returns\" data-nav=\"returns\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M3 3v18h18M6 16l5-5 4 2 6-8m-5 0h5v5\"\/><\/svg><span>Financial returns<\/span><\/a><a href=\"#services\" data-nav=\"services\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M5 3h14v18l-3-2-4 2-4-2-3 2zM8 8h8M8 12h8\"\/><\/svg><span>Services &#038; resources<\/span><\/a><a href=\"#spacing\" data-nav=\"spacing\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M2 16 5 5l8 11M13 16l3-11 6 11M3 21h18m-18-2v4m18-4v4\"\/><\/svg><span>Row spacing<\/span><\/a><a href=\"#shading\" data-nav=\"shading\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"6\" cy=\"6\" r=\"3\"\/><path d=\"M12 7h3v14h-3zM15 21h7L15 9M2 12l-1 2m10-13 1-1\"\/><\/svg><span>Shadow calculator<\/span><\/a><a href=\"#cable\" data-nav=\"cable\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M4 3v10a4 4 0 0 0 8 0V9a4 4 0 0 1 8 0v12M1 3h6m10 18h6\"\/><\/svg><span>Cable sizing<\/span><\/a><a href=\"#utilities\" data-nav=\"utilities\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 6v6l4 3\"\/><\/svg><span>Small tools<\/span><\/a><a class=\"lvp-nav-resource\" href=\"\/solar-irradiation-calculator\/?view=tariffs\">Irradiation &#038; monthly data \u2197<\/a><\/nav><main class=\"lvp-main\" aria-label=\"Calculator workspace\"><section id=\"lvp-panel-capacity\" data-panel=\"capacity\"><header class=\"lvp-panel-heading\"><p class=\"lvp-eyebrow\">01 \/ SOLAR PLANNING<\/p><h2>How much solar can fit?<\/h2><p>Count full modules on a rectangular roof, with explicit setbacks and row gaps. Add identical roofs to scale the estimate.<\/p><\/header><form class=\"lvp-form\" data-tool=\"capacity\"><div class=\"lvp-fields\"><div class=\"lvp-field\"><label for=\"lvp-roof-length\">Roof depth <small>m<\/small><\/label><input id=\"lvp-roof-length\" name=\"roof-length\" type=\"number\" value=\"20\" min=\".01\" max=\"10000\" step=\"any\" required><p class=\"lvp-note\">Direction from one row to the next.<\/p><\/div><div class=\"lvp-field\"><label for=\"lvp-roof-width\">Roof width <small>m<\/small><\/label><input id=\"lvp-roof-width\" name=\"roof-width\" type=\"number\" value=\"12\" min=\".01\" max=\"10000\" step=\"any\" required><p class=\"lvp-note\">Direction along each row.<\/p><\/div><div class=\"lvp-field\"><label for=\"lvp-setback\">Perimeter setback <small>m<\/small><\/label><input id=\"lvp-setback\" name=\"setback\" type=\"number\" value=\"1\" min=\"0\" max=\"1000\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-module-length\">Module length <small>m<\/small><\/label><input id=\"lvp-module-length\" name=\"module-length\" type=\"number\" value=\"2.278\" min=\".01\" max=\"20\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-module-width\">Module width <small>m<\/small><\/label><input id=\"lvp-module-width\" name=\"module-width\" type=\"number\" value=\"1.134\" min=\".01\" max=\"20\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-module-w\">Module power <small>Wp<\/small><\/label><input id=\"lvp-module-w\" name=\"module-w\" type=\"number\" value=\"550\" min=\"1\" max=\"5000\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-orientation\">Module orientation<\/label><select id=\"lvp-orientation\" name=\"orientation\"><option value=\"portrait\">Portrait<\/option><option value=\"landscape\">Landscape<\/option><\/select><\/div><div class=\"lvp-field\"><label for=\"lvp-roof-tilt\">Module tilt <small>\u00b0<\/small><\/label><input id=\"lvp-roof-tilt\" name=\"roof-tilt\" type=\"number\" value=\"15\" min=\"0\" max=\"85\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-roof-gap\">Clear gap between rows <small>m<\/small><\/label><input id=\"lvp-roof-gap\" name=\"roof-gap\" type=\"number\" value=\"1\" min=\"0\" max=\"1000\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-roofs\">Identical roofs <small>count<\/small><\/label><input id=\"lvp-roofs\" name=\"roofs\" type=\"number\" value=\"1\" min=\"1\" max=\"1000\" step=\"1\" required><\/div><\/div><div class=\"lvp-form-actions\"><button type=\"submit\">Estimate capacity <span aria-hidden=\"true\">\u2197<\/span><\/button><span>Module dimensions are an editable example.<\/span><\/div><\/form><div class=\"lvp-output\" id=\"lvp-output-capacity\" aria-live=\"polite\"><\/div><details class=\"lvp-method\"><summary>Calculation method &#038; assumptions<\/summary><p>Full rows only: modules per row \u00d7 rows \u00d7 module Wp \/ 1,000. The row depth is the module slope length \u00d7 cos(tilt); gaps occupy horizontal space. Setbacks apply to all four edges. No inter-module gaps, obstacles, roof slope, aisle rules, structural limits or automatic shading allowances are included. Use row spacing below to choose a gap; actual layout may fit fewer modules.<\/p><\/details><\/section><section id=\"lvp-panel-energy\" data-panel=\"energy\" hidden><header class=\"lvp-panel-heading\"><p class=\"lvp-eyebrow\">02 \/ SOLAR PLANNING<\/p><h2>Turn capacity into energy.<\/h2><p>Use your first-year specific yield to explore annual generation and lifetime degradation. For a location-based estimate, start with our NASA POWER irradiation tool.<\/p><\/header><form class=\"lvp-form\" data-tool=\"energy\"><div class=\"lvp-fields\"><div class=\"lvp-field\"><label for=\"lvp-energy-years\">Operating life <small>years<\/small><\/label><input id=\"lvp-energy-years\" name=\"energy-years\" type=\"number\" value=\"25\" min=\"1\" max=\"50\" step=\"1\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-energy-deg\">Annual degradation <small>%<\/small><\/label><input id=\"lvp-energy-deg\" name=\"energy-deg\" type=\"number\" value=\"0.5\" min=\"0\" max=\"20\" step=\"any\" required><\/div><\/div><div class=\"lvp-form-actions\"><button type=\"submit\">Calculate energy <span aria-hidden=\"true\">\u2197<\/span><\/button><a href=\"\/solar-irradiation-calculator\/?view=tariffs\">Get a location-based yield \u2197<\/a><\/div><\/form><div class=\"lvp-output\" id=\"lvp-output-energy\" aria-live=\"polite\"><\/div><details class=\"lvp-method\"><summary>Calculation method &#038; assumptions<\/summary><p>Year 1 energy = DC capacity \u00d7 first-year specific yield. Year n = year 1 \u00d7 (1 \u2212 annual degradation)^(n \u2212 1). The input yield already includes year-one system losses. This is a fixed-yield projection; it does not model hourly weather, tracking, clipping or annual variability. The irradiation calculator supplies monthly climate-based estimates and CSV export.<\/p><\/details><\/section><section id=\"lvp-panel-cost\" data-panel=\"cost\" hidden><header class=\"lvp-panel-heading\"><p class=\"lvp-eyebrow\">03 \/ SOLAR PLANNING<\/p><h2>Build your project budget.<\/h2><p>Enter current quotations in the selected project currency. Nothing here is an automatic market price.<\/p><\/header><form class=\"lvp-form\" data-tool=\"cost\"><div class=\"lvp-fields\"><div class=\"lvp-field\"><label for=\"lvp-cost-modules\">PV modules <small>\/Wp<\/small><\/label><input id=\"lvp-cost-modules\" name=\"cost-modules\" type=\"number\" value=\"\" min=\"0\" max=\"100000\" step=\"any\"><\/div><div class=\"lvp-field\"><label for=\"lvp-cost-inverters\">Inverters <small>\/Wp<\/small><\/label><input id=\"lvp-cost-inverters\" name=\"cost-inverters\" type=\"number\" value=\"\" min=\"0\" max=\"100000\" step=\"any\"><\/div><div class=\"lvp-field\"><label for=\"lvp-cost-mounting\">Mounting structure <small>\/Wp<\/small><\/label><input id=\"lvp-cost-mounting\" name=\"cost-mounting\" type=\"number\" value=\"\" min=\"0\" max=\"100000\" step=\"any\"><\/div><div class=\"lvp-field\"><label for=\"lvp-cost-electrical\">Electrical BOS <small>\/Wp<\/small><\/label><input id=\"lvp-cost-electrical\" name=\"cost-electrical\" type=\"number\" value=\"\" min=\"0\" max=\"100000\" step=\"any\"><\/div><div class=\"lvp-field\"><label for=\"lvp-cost-labour\">Installation labour <small>\/Wp<\/small><\/label><input id=\"lvp-cost-labour\" name=\"cost-labour\" type=\"number\" value=\"\" min=\"0\" max=\"100000\" step=\"any\"><\/div><div class=\"lvp-field\"><label for=\"lvp-cost-fixed\">Other fixed costs <small>total<\/small><\/label><input id=\"lvp-cost-fixed\" name=\"cost-fixed\" type=\"number\" value=\"0\" min=\"0\" max=\"1e12\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-contingency\">Contingency <small>%<\/small><\/label><input id=\"lvp-contingency\" name=\"contingency\" type=\"number\" value=\"5\" min=\"0\" max=\"100\" step=\"any\" required><\/div><\/div><div class=\"lvp-form-actions\"><button type=\"submit\">Estimate project cost <span aria-hidden=\"true\">\u2197<\/span><\/button><span>Blank line items are excluded.<\/span><\/div><\/form><div class=\"lvp-output\" id=\"lvp-output-cost\" aria-live=\"polite\"><\/div><details class=\"lvp-method\"><summary>Calculation method &#038; assumptions<\/summary><p>Each unit-price item = project kWp \u00d7 1,000 \u00d7 quoted price per Wp. Subtotal = line items + other fixed costs; contingency applies to that subtotal. Tax is included only if included in your quotations. Annual roof rent and operating costs belong in the returns tool. A budget is not a supplier quotation.<\/p><\/details><\/section><section id=\"lvp-panel-returns\" data-panel=\"returns\" hidden><header class=\"lvp-panel-heading\"><p class=\"lvp-eyebrow\">04 \/ SOLAR PLANNING<\/p><h2>Explore the project cash flow.<\/h2><p>Compare project and financed-equity cash flows using your tariffs, costs, degradation and loan terms. Expand the annual table to see what drives the result.<\/p><\/header><form class=\"lvp-form\" data-tool=\"returns\"><div class=\"lvp-fields\"><div class=\"lvp-field\"><label for=\"lvp-capex\">Initial investment <small>total<\/small><\/label><input id=\"lvp-capex\" name=\"capex\" type=\"number\" value=\"\" min=\".01\" max=\"1e12\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-finance-years\">Analysis period <small>years<\/small><\/label><input id=\"lvp-finance-years\" name=\"finance-years\" type=\"number\" value=\"25\" min=\"1\" max=\"50\" step=\"1\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-finance-deg\">Annual degradation <small>%<\/small><\/label><input id=\"lvp-finance-deg\" name=\"finance-deg\" type=\"number\" value=\"0.5\" min=\"0\" max=\"20\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-escalation\">Annual tariff change <small>%<\/small><\/label><input id=\"lvp-escalation\" name=\"escalation\" type=\"number\" value=\"0\" min=\"-20\" max=\"30\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-opex\">Year-one operating cost <small>\/year<\/small><\/label><input id=\"lvp-opex\" name=\"opex\" type=\"number\" value=\"0\" min=\"0\" max=\"1e12\" step=\"any\" required><p class=\"lvp-note\">Include maintenance, insurance and roof rent.<\/p><\/div><div class=\"lvp-field\"><label for=\"lvp-opex-escalation\">Annual cost change <small>%<\/small><\/label><input id=\"lvp-opex-escalation\" name=\"opex-escalation\" type=\"number\" value=\"0\" min=\"-20\" max=\"30\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-discount\">Discount rate <small>%<\/small><\/label><input id=\"lvp-discount\" name=\"discount\" type=\"number\" value=\"6\" min=\"0\" max=\"100\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-replacement-year\">Replacement year <small>0 = none<\/small><\/label><input id=\"lvp-replacement-year\" name=\"replacement-year\" type=\"number\" value=\"0\" min=\"0\" max=\"50\" step=\"1\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-replacement-cost\">Replacement expense <small>total<\/small><\/label><input id=\"lvp-replacement-cost\" name=\"replacement-cost\" type=\"number\" value=\"0\" min=\"0\" max=\"1e12\" step=\"any\" required><\/div><h3 class=\"lvp-subhead\">Optional financing<\/h3><div class=\"lvp-field\"><label for=\"lvp-loan-share\">Debt share <small>%<\/small><\/label><input id=\"lvp-loan-share\" name=\"loan-share\" type=\"number\" value=\"0\" min=\"0\" max=\"95\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-interest\">Annual loan interest <small>%<\/small><\/label><input id=\"lvp-interest\" name=\"interest\" type=\"number\" value=\"5\" min=\"0\" max=\"100\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-loan-years\">Loan term <small>years<\/small><\/label><input id=\"lvp-loan-years\" name=\"loan-years\" type=\"number\" value=\"10\" min=\"1\" max=\"50\" step=\"1\" required><\/div><\/div><div class=\"lvp-form-actions\"><button type=\"submit\">Calculate returns <span aria-hidden=\"true\">\u2197<\/span><\/button><span>Purchase\/export prices come from \u201cYour project\u201d.<\/span><\/div><\/form><div class=\"lvp-output\" id=\"lvp-output-returns\" aria-live=\"polite\"><\/div><details class=\"lvp-method\"><summary>Calculation method &#038; assumptions<\/summary><p>Annual value = generation \u00d7 [self-use share \u00d7 avoided import tariff + exported share \u00d7 export tariff]. Tariffs and operating costs escalate independently; energy degrades after year 1. Project cash flow deducts operating and replacement costs. Equity cash flow additionally deducts annual end-of-year level-payment debt service; year 0 is the equity contribution. NPV discounts each end-of-year cash flow; IRR is shown only for a conventional investment with a unique root. Payback interpolates the cumulative recovery that remains nonnegative through the modeled horizon, including later replacement expenses. No taxes, subsidies, depreciation, salvage value, transaction fees, time-of-use matching or fixed bill charges. Self-use is an input, not an hourly simulation. <a href=\"https:\/\/sam.nlr.gov\/financial-models.html\" target=\"_blank\" rel=\"noopener\">NREL SAM financial models<\/a> cover more detailed project structures.<\/p><\/details><\/section><section id=\"lvp-panel-services\" data-panel=\"services\" hidden><header class=\"lvp-panel-heading\"><p class=\"lvp-eyebrow\">05 \/ SOLAR PLANNING<\/p><h2>Bring the plan to your project team.<\/h2><p>Use LuminVolt\u2019s existing product and engineering resources, and prepare the information needed for a project-specific proposal.<\/p><\/header><div class=\"lvp-resource-list\"><article class=\"lvp-resource\"><span>01<\/span><div><h3>Solar mounting systems<\/h3><p>Explore roof and ground structures for your mounting configuration.<\/p><\/div><a href=\"\/solar-mounting-system\/\">Explore systems \u2197<\/a><\/article><article class=\"lvp-resource\"><span>02<\/span><div><h3>Single-axis solar trackers<\/h3><p>Review the tracker product information before discussing the site configuration.<\/p><\/div><a href=\"\/solar-tracker\/\">View trackers \u2197<\/a><\/article><article class=\"lvp-resource\"><span>03<\/span><div><h3>Structural load calculator<\/h3><p>Continue to the existing structural calculator for its stated loading assumptions.<\/p><\/div><a href=\"\/solar-mounting-structural-load-calculator\/\">Open calculator \u2197<\/a><\/article><article class=\"lvp-resource\"><span>04<\/span><div><h3>Wind &#038; snow load calculator<\/h3><p>Review site wind and snow inputs in the existing load tool.<\/p><\/div><a href=\"\/solar-panel-wind-snow-load-calculator\/\">Open calculator \u2197<\/a><\/article><article class=\"lvp-resource\"><span>05<\/span><div><h3>Climate &#038; irradiation data<\/h3><p>Use NASA POWER monthly climate data in the companion solar resource calculator.<\/p><\/div><a href=\"\/solar-irradiation-calculator\/?view=tariffs\">Open solar data \u2197<\/a><\/article><\/div><div class=\"lvp-service-brief\"><h3>Before you request a proposal<\/h3><ul><li>Site location, roof or ground survey, usable dimensions and obstruction photos.<\/li><li>Module and inverter datasheets, array configuration and proposed cable routes.<\/li><li>Local wind, snow, structural and electrical requirements.<\/li><li>Electricity bill, export contract and current equipment quotations.<\/li><\/ul><a class=\"lvp-button\" href=\"\/contact\/\">Discuss your project <span aria-hidden=\"true\">\u2197<\/span><\/a><p class=\"lvp-caption\">This section links to LuminVolt resources. It is not a third-party installer directory or an endorsement of an external contractor. No project information is sent automatically.<\/p><\/div><\/section><section id=\"lvp-panel-spacing\" data-panel=\"spacing\" hidden><header class=\"lvp-panel-heading\"><p class=\"lvp-eyebrow\">06 \/ SOLAR PLANNING<\/p><h2>Leave room for the winter sun.<\/h2><p>Estimate a clear row gap and front-to-front pitch on level ground over a chosen solar-time window. Bearings are clockwise from true north.<\/p><\/header><form class=\"lvp-form\" data-tool=\"spacing\"><div class=\"lvp-fields\"><div class=\"lvp-field\"><label for=\"lvp-latitude\">Latitude <small>\u00b0<\/small><\/label><input id=\"lvp-latitude\" name=\"latitude\" type=\"number\" value=\"32\" min=\"-65\" max=\"65\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-date\">Design date <small><\/small><\/label><input id=\"lvp-date\" name=\"date\" type=\"date\" value=\"2026-12-22\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-start\">Start solar time <small><\/small><\/label><input id=\"lvp-start\" name=\"start\" type=\"time\" value=\"09:00\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-end\">End solar time <small><\/small><\/label><input id=\"lvp-end\" name=\"end\" type=\"time\" value=\"15:00\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-row-width\">Row slope length <small>m<\/small><\/label><input id=\"lvp-row-width\" name=\"row-width\" type=\"number\" value=\"3.3\" min=\".01\" max=\"100\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-row-tilt\">Row tilt <small>\u00b0<\/small><\/label><input id=\"lvp-row-tilt\" name=\"row-tilt\" type=\"number\" value=\"20\" min=\"0\" max=\"85\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-azimuth\">Array facing azimuth <small>\u00b0 N=0, E=90<\/small><\/label><input id=\"lvp-azimuth\" name=\"azimuth\" type=\"number\" value=\"180\" min=\"0\" max=\"360\" step=\"any\" required><\/div><\/div><div class=\"lvp-form-actions\"><button type=\"submit\">Calculate row spacing <span aria-hidden=\"true\">\u2197<\/span><\/button><\/div><\/form><div class=\"lvp-output\" id=\"lvp-output-spacing\" aria-live=\"polite\"><\/div><details class=\"lvp-method\"><summary>Calculation method &#038; assumptions<\/summary><p>On level ground, projection = row slope length \u00d7 cos(tilt), height difference = row slope length \u00d7 sin(tilt). Gap = the largest shadow component normal to the rows while the sun is in front of the array, sampled every 5 minutes over your solar-time window. Pitch = projection + gap. Only the selected date and time window are checked; below-horizon times are flagged. No terrain slope, finite-row edge effects, diffuse shading or energy-loss model. Solar position uses a simplified declination model, not a surveying ephemeris. <a href=\"https:\/\/gml.noaa.gov\/grad\/solcalc\/solareqns.PDF\" target=\"_blank\" rel=\"noopener\">NOAA solar geometry reference<\/a>.<\/p><\/details><\/section><section id=\"lvp-panel-shading\" data-panel=\"shading\" hidden><header class=\"lvp-panel-heading\"><p class=\"lvp-eyebrow\">07 \/ SOLAR PLANNING<\/p><h2>Trace an obstacle\u2019s shadow.<\/h2><p>Explore the flat-ground shadow from a vertical object. East and north coordinates show where the tip falls relative to the object.<\/p><\/header><form class=\"lvp-form\" data-tool=\"shading\"><div class=\"lvp-fields\"><div class=\"lvp-field\"><label for=\"lvp-shade-latitude\">Latitude <small>\u00b0<\/small><\/label><input id=\"lvp-shade-latitude\" name=\"shade-latitude\" type=\"number\" value=\"32\" min=\"-65\" max=\"65\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-shade-date\">Design date <small><\/small><\/label><input id=\"lvp-shade-date\" name=\"shade-date\" type=\"date\" value=\"2026-12-22\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-shade-start\">Start solar time <small><\/small><\/label><input id=\"lvp-shade-start\" name=\"shade-start\" type=\"time\" value=\"09:00\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-shade-end\">End solar time <small><\/small><\/label><input id=\"lvp-shade-end\" name=\"shade-end\" type=\"time\" value=\"15:00\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-obstacle-height\">Obstacle height <small>m<\/small><\/label><input id=\"lvp-obstacle-height\" name=\"obstacle-height\" type=\"number\" value=\"2\" min=\".01\" max=\"1000\" step=\"any\" required><\/div><\/div><div class=\"lvp-form-actions\"><button type=\"submit\">Calculate shadow path <span aria-hidden=\"true\">\u2197<\/span><\/button><\/div><\/form><div class=\"lvp-output\" id=\"lvp-output-shading\" aria-live=\"polite\"><\/div><details class=\"lvp-method\"><summary>Calculation method &#038; assumptions<\/summary><p>Shadow tip east = \u2212height \u00d7 sun east \/ sun up; north = \u2212height \u00d7 sun north \/ sun up. Coordinates are relative to the obstacle\u2019s base; shadow direction is opposite the sun. The diagram and 30-minute table describe a vertical point object on horizontal ground. Width, terrain, panel-plane intersections, vegetation, obstructions and resulting energy loss are not modeled. Times are local apparent solar time, not civil clock time.<\/p><\/details><\/section><section id=\"lvp-panel-cable\" data-panel=\"cable\" hidden><header class=\"lvp-panel-heading\"><p class=\"lvp-eyebrow\">08 \/ SOLAR PLANNING<\/p><h2>Check cable voltage drop.<\/h2><p>Compare conductor sections for a known circuit. Keep voltage-drop screening separate from the cable\u2019s installation-specific current rating.<\/p><\/header><form class=\"lvp-form\" data-tool=\"cable\"><div class=\"lvp-fields\"><div class=\"lvp-field\"><label for=\"lvp-circuit\">Circuit type<\/label><select id=\"lvp-circuit\" name=\"circuit\"><option value=\"dc\">DC, two conductors<\/option><option value=\"single\">Single-phase AC<\/option><option value=\"three\">Three-phase AC<\/option><\/select><\/div><div class=\"lvp-field\"><label for=\"lvp-material\">Conductor<\/label><select id=\"lvp-material\" name=\"material\"><option value=\"copper\">Copper<\/option><option value=\"aluminium\">Aluminium<\/option><\/select><\/div><div class=\"lvp-field\"><label for=\"lvp-cable-length\">One-way route length <small>m<\/small><\/label><input id=\"lvp-cable-length\" name=\"cable-length\" type=\"number\" value=\"30\" min=\".01\" max=\"100000\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-current\">Operating current <small>A<\/small><\/label><input id=\"lvp-current\" name=\"current\" type=\"number\" value=\"13\" min=\".001\" max=\"100000\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-voltage\">Operating voltage <small>V<\/small><\/label><input id=\"lvp-voltage\" name=\"voltage\" type=\"number\" value=\"600\" min=\".001\" max=\"100000\" step=\"any\" required><p class=\"lvp-note\">Three-phase: line-to-line voltage.<\/p><\/div><div class=\"lvp-field\"><label for=\"lvp-section\">Conductor section (mm\u00b2)<\/label><select id=\"lvp-section\" name=\"section\"><option value=\"4\">4<\/option><option value=\"6\">6<\/option><option value=\"10\">10<\/option><option value=\"16\">16<\/option><option value=\"25\">25<\/option><option value=\"35\">35<\/option><option value=\"50\">50<\/option><option value=\"70\">70<\/option><option value=\"95\">95<\/option><option value=\"120\">120<\/option><option value=\"150\">150<\/option><option value=\"185\">185<\/option><option value=\"240\">240<\/option><option value=\"300\">300<\/option><option value=\"400\">400<\/option><option value=\"630\">630<\/option><\/select><\/div><div class=\"lvp-field\"><label for=\"lvp-conductor-temp\">Conductor temperature <small>\u00b0C<\/small><\/label><input id=\"lvp-conductor-temp\" name=\"conductor-temp\" type=\"number\" value=\"70\" min=\"-20\" max=\"120\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-power-factor\">AC power factor <small>cos \u03c6<\/small><\/label><input id=\"lvp-power-factor\" name=\"power-factor\" type=\"number\" value=\"1\" min=\".1\" max=\"1\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-max-drop\">Voltage-drop limit <small>%<\/small><\/label><input id=\"lvp-max-drop\" name=\"max-drop\" type=\"number\" value=\"1.5\" min=\".01\" max=\"20\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-ampacity\">Derated cable ampacity <small>A<\/small><\/label><input id=\"lvp-ampacity\" name=\"ampacity\" type=\"number\" value=\"\" min=\".001\" max=\"100000\" step=\"any\"><p class=\"lvp-note\">From the cable datasheet and applicable installation rules.<\/p><\/div><\/div><div class=\"lvp-form-actions\"><button type=\"submit\">Check voltage drop <span aria-hidden=\"true\">\u2197<\/span><\/button><\/div><\/form><div class=\"lvp-output\" id=\"lvp-output-cable\" aria-live=\"polite\"><\/div><details class=\"lvp-method\"><summary>Calculation method &#038; assumptions<\/summary><p>Resistance uses conductor resistivity at 20\u00b0C corrected to the entered conductor temperature. DC\/single-phase loop length is twice the one-way route; three-phase drop uses \u221a3 \u00d7 one-way resistance \u00d7 current \u00d7 power factor. AC reactance is set to zero. Loss is I\u00b2R for each loaded conductor. Candidate sections meet only the entered voltage-drop limit. A supplied derated ampacity is compared to operating current separately; no automatic ampacity table, protective-device coordination, fault withstand, harmonics or local-code verification is provided. <a href=\"https:\/\/www.electrical-installation.org\/enwiki\/Calculation_of_voltage_drop_in_steady_load_conditions\" target=\"_blank\" rel=\"noopener\">Schneider Electric voltage-drop equations<\/a>.<\/p><\/details><\/section><section id=\"lvp-panel-utilities\" data-panel=\"utilities\" hidden><header class=\"lvp-panel-heading\"><p class=\"lvp-eyebrow\">09 \/ SOLAR PLANNING<\/p><h2>The details that make a difference.<\/h2><p>A compact collection of PV electrical checks, geometry conversions and project comparisons. All factors and assumptions stay visible.<\/p><\/header><div class=\"lvp-stack\"><details data-utility=\"strings\" open><summary>PV string voltage range<\/summary><p>Enter module voltage coefficients from the actual datasheet. Coefficients are percent per \u00b0C, not fractions.<\/p><form class=\"lvp-form\" data-tool=\"strings\"><div class=\"lvp-fields\"><div class=\"lvp-field\"><label for=\"lvp-voc\">Module Voc <small>V<\/small><\/label><input id=\"lvp-voc\" name=\"voc\" type=\"number\" value=\"49.9\" min=\".01\" max=\"500\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-vmp\">Module Vmp <small>V<\/small><\/label><input id=\"lvp-vmp\" name=\"vmp\" type=\"number\" value=\"41.9\" min=\".01\" max=\"500\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-voc-coeff\">Voc temperature coefficient <small>%\/\u00b0C<\/small><\/label><input id=\"lvp-voc-coeff\" name=\"voc-coeff\" type=\"number\" value=\"-0.28\" min=\"-2\" max=\"2\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-vmp-coeff\">Vmp temperature coefficient <small>%\/\u00b0C<\/small><\/label><input id=\"lvp-vmp-coeff\" name=\"vmp-coeff\" type=\"number\" value=\"-0.35\" min=\"-2\" max=\"2\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-min-temp\">Lowest cell temperature <small>\u00b0C<\/small><\/label><input id=\"lvp-min-temp\" name=\"min-temp\" type=\"number\" value=\"-10\" min=\"-80\" max=\"150\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-max-temp\">Highest cell temperature <small>\u00b0C<\/small><\/label><input id=\"lvp-max-temp\" name=\"max-temp\" type=\"number\" value=\"70\" min=\"-80\" max=\"150\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-max-dc\">Inverter maximum DC <small>V<\/small><\/label><input id=\"lvp-max-dc\" name=\"max-dc\" type=\"number\" value=\"1000\" min=\".01\" max=\"10000\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-mppt-min\">MPPT lower voltage <small>V<\/small><\/label><input id=\"lvp-mppt-min\" name=\"mppt-min\" type=\"number\" value=\"250\" min=\".01\" max=\"10000\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-mppt-max\">MPPT upper voltage <small>V<\/small><\/label><input id=\"lvp-mppt-max\" name=\"mppt-max\" type=\"number\" value=\"850\" min=\".01\" max=\"10000\" step=\"any\" required><\/div><\/div><div class=\"lvp-form-actions\"><button type=\"submit\">Calculate <span aria-hidden=\"true\">\u2197<\/span><\/button><\/div><\/form><div class=\"lvp-output\" id=\"lvp-output-strings\" aria-live=\"polite\"><\/div><p class=\"lvp-caption\">V(T) = V(25\u00b0C) \u00d7 [1 + coefficient \/ 100 \u00d7 (T \u2212 25)]. Both temperature endpoints constrain the range. The result checks operating MPPT and absolute DC voltage only; inverter start voltage, current, optimizers and cold-weather design margins still need separate checks. Example voltages are not a named product specification.<\/p><\/details><details data-utility=\"solar-time\"><summary>Solar time \u2194 clock time<\/summary><p>Enter the UTC offset actually in effect, including daylight saving if applicable.<\/p><form class=\"lvp-form\" data-tool=\"solar-time\"><div class=\"lvp-fields\"><div class=\"lvp-field\"><label for=\"lvp-solar-date\">Date <small><\/small><\/label><input id=\"lvp-solar-date\" name=\"solar-date\" type=\"date\" value=\"2026-12-22\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-longitude\">Longitude <small>\u00b0 east +<\/small><\/label><input id=\"lvp-longitude\" name=\"longitude\" type=\"number\" value=\"116.28\" min=\"-180\" max=\"180\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-timezone\">Civil UTC offset <small>hours<\/small><\/label><input id=\"lvp-timezone\" name=\"timezone\" type=\"number\" value=\"8\" min=\"-12\" max=\"14\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-clock-hour\">Clock \/ solar input <small><\/small><\/label><input id=\"lvp-clock-hour\" name=\"clock-hour\" type=\"time\" value=\"12:00\" required><\/div><\/div><div class=\"lvp-form-actions\"><button type=\"submit\">Calculate <span aria-hidden=\"true\">\u2197<\/span><\/button><\/div><\/form><div class=\"lvp-output\" id=\"lvp-output-solar-time\" aria-live=\"polite\"><\/div><p class=\"lvp-caption\">NOAA equation-of-time approximation: solar minutes = clock minutes + 4 \u00d7 longitude \u2212 60 \u00d7 UTC offset + equation of time. Both conversion directions use the same entered time. Results wrap over midnight with a day-offset label. <a href=\"https:\/\/gml.noaa.gov\/grad\/solcalc\/solareqns.PDF\" target=\"_blank\" rel=\"noopener\">NOAA equations<\/a>.<\/p><\/details><details data-utility=\"slope\"><summary>Slope \u2194 tilt angle<\/summary><p>Convert a percentage grade to an angle, and an angle to grade.<\/p><form class=\"lvp-form\" data-tool=\"slope\"><div class=\"lvp-fields\"><div class=\"lvp-field\"><label for=\"lvp-grade\">Slope grade <small>%<\/small><\/label><input id=\"lvp-grade\" name=\"grade\" type=\"number\" value=\"10\" min=\"0\" max=\"100000\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-slope-angle\">Slope angle <small>\u00b0<\/small><\/label><input id=\"lvp-slope-angle\" name=\"slope-angle\" type=\"number\" value=\"5.71\" min=\"0\" max=\"89.9\" step=\"any\" required><\/div><\/div><div class=\"lvp-form-actions\"><button type=\"submit\">Calculate <span aria-hidden=\"true\">\u2197<\/span><\/button><\/div><\/form><div class=\"lvp-output\" id=\"lvp-output-slope\" aria-live=\"polite\"><\/div><p class=\"lvp-caption\">Grade (%) = 100 \u00d7 tan(angle). The two input values are converted independently.<\/p><\/details><details data-utility=\"components\"><summary>Tilt components \u2194 full tilt<\/summary><p>Azimuth is the surface facing direction measured clockwise from north.<\/p><form class=\"lvp-form\" data-tool=\"components\"><div class=\"lvp-fields\"><div class=\"lvp-field\"><label for=\"lvp-component-tilt\">Full tilt <small>\u00b0<\/small><\/label><input id=\"lvp-component-tilt\" name=\"component-tilt\" type=\"number\" value=\"30\" min=\"0\" max=\"85\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-component-az\">Facing azimuth <small>\u00b0<\/small><\/label><input id=\"lvp-component-az\" name=\"component-az\" type=\"number\" value=\"120\" min=\"0\" max=\"360\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-component-north\">North component <small>\u00b0<\/small><\/label><input id=\"lvp-component-north\" name=\"component-north\" type=\"number\" value=\"-16.1\" min=\"-85\" max=\"85\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-component-east\">East component <small>\u00b0<\/small><\/label><input id=\"lvp-component-east\" name=\"component-east\" type=\"number\" value=\"26.6\" min=\"-85\" max=\"85\" step=\"any\" required><\/div><\/div><div class=\"lvp-form-actions\"><button type=\"submit\">Calculate <span aria-hidden=\"true\">\u2197<\/span><\/button><\/div><\/form><div class=\"lvp-output\" id=\"lvp-output-components\" aria-live=\"polite\"><\/div><p class=\"lvp-caption\">North component = atan[tan(tilt) \u00d7 cos(azimuth)]; east = atan[tan(tilt) \u00d7 sin(azimuth)]. The second pair is independently inverted to tilt and azimuth. Signs refer to the facing-vector components.<\/p><\/details><details data-utility=\"emissions\"><summary>Avoided emissions estimate<\/summary><p>Use an emission factor appropriate to your grid, period and accounting method.<\/p><form class=\"lvp-form\" data-tool=\"emissions\"><div class=\"lvp-fields\"><div class=\"lvp-field\"><label for=\"lvp-emission-energy\">Annual displaced electricity <small>kWh<\/small><\/label><input id=\"lvp-emission-energy\" name=\"emission-energy\" type=\"number\" value=\"12000\" min=\"0\" max=\"1e12\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-emission-factor\">Grid emission factor <small>kg CO\u2082e\/kWh<\/small><\/label><input id=\"lvp-emission-factor\" name=\"emission-factor\" type=\"number\" value=\"\" min=\"0\" max=\"100\" step=\"any\" required><\/div><\/div><div class=\"lvp-form-actions\"><button type=\"submit\">Calculate <span aria-hidden=\"true\">\u2197<\/span><\/button><\/div><\/form><div class=\"lvp-output\" id=\"lvp-output-emissions\" aria-live=\"polite\"><\/div><p class=\"lvp-caption\">Avoided emissions = displaced kWh \u00d7 entered kg CO\u2082e\/kWh. This excludes lifecycle emissions and does not establish additionality or a certified carbon credit. No default grid factor is assumed.<\/p><\/details><details data-utility=\"comparison\"><summary>Compare two investment options<\/summary><p>Enter the incremental cost and first-year benefit of option B versus option A.<\/p><form class=\"lvp-form\" data-tool=\"comparison\"><div class=\"lvp-fields\"><div class=\"lvp-field\"><label for=\"lvp-increment-cost\">Extra initial cost <small>total<\/small><\/label><input id=\"lvp-increment-cost\" name=\"increment-cost\" type=\"number\" value=\"1000\" min=\".01\" max=\"1e12\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-increment-benefit\">Extra first-year benefit <small>\/year<\/small><\/label><input id=\"lvp-increment-benefit\" name=\"increment-benefit\" type=\"number\" value=\"100\" min=\"0\" max=\"1e12\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-increment-opex\">Extra first-year operating cost <small>\/year<\/small><\/label><input id=\"lvp-increment-opex\" name=\"increment-opex\" type=\"number\" value=\"0\" min=\"0\" max=\"1e12\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-increment-years\">Comparison period <small>years<\/small><\/label><input id=\"lvp-increment-years\" name=\"increment-years\" type=\"number\" value=\"25\" min=\"1\" max=\"50\" step=\"1\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-increment-deg\">Annual benefit degradation <small>%<\/small><\/label><input id=\"lvp-increment-deg\" name=\"increment-deg\" type=\"number\" value=\"0.5\" min=\"0\" max=\"20\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-increment-discount\">Discount rate <small>%<\/small><\/label><input id=\"lvp-increment-discount\" name=\"increment-discount\" type=\"number\" value=\"6\" min=\"0\" max=\"100\" step=\"any\" required><\/div><\/div><div class=\"lvp-form-actions\"><button type=\"submit\">Calculate <span aria-hidden=\"true\">\u2197<\/span><\/button><\/div><\/form><div class=\"lvp-output\" id=\"lvp-output-comparison\" aria-live=\"polite\"><\/div><p class=\"lvp-caption\">Incremental cash flow = benefit \u00d7 (1 \u2212 degradation)^(year \u2212 1) \u2212 additional operating cost, with the extra investment at year 0. The same project currency is used for both alternatives; no financing, taxes, escalation or residual value.<\/p><\/details><details data-utility=\"bifacial\"><summary>Bifacial irradiation contribution<\/summary><p>Enter modeled front and rear irradiation and the module bifaciality from its datasheet.<\/p><form class=\"lvp-form\" data-tool=\"bifacial\"><div class=\"lvp-fields\"><div class=\"lvp-field\"><label for=\"lvp-front\">Front-plane irradiation <small>kWh\/m\u00b2<\/small><\/label><input id=\"lvp-front\" name=\"front\" type=\"number\" value=\"1500\" min=\".001\" max=\"10000\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-rear\">Rear-plane irradiation <small>kWh\/m\u00b2<\/small><\/label><input id=\"lvp-rear\" name=\"rear\" type=\"number\" value=\"150\" min=\"0\" max=\"10000\" step=\"any\" required><\/div><div class=\"lvp-field\"><label for=\"lvp-bifaciality\">Module bifaciality <small>%<\/small><\/label><input id=\"lvp-bifaciality\" name=\"bifaciality\" type=\"number\" value=\"70\" min=\"0\" max=\"100\" step=\"any\" required><\/div><\/div><div class=\"lvp-form-actions\"><button type=\"submit\">Calculate <span aria-hidden=\"true\">\u2197<\/span><\/button><\/div><\/form><div class=\"lvp-output\" id=\"lvp-output-bifacial\" aria-live=\"polite\"><\/div><p class=\"lvp-caption\">Irradiance contribution gain = rear \/ front \u00d7 bifaciality. This screening ratio excludes spectral, mismatch, thermal and electrical losses. It does not infer rear irradiation from albedo, clearance or row pitch; use a rear-irradiance model for those geometry effects.<\/p><\/details><\/div><\/section><\/main><\/div><footer class=\"lvp-footer\"><p>Early-stage estimates. Use verified site measurements, datasheets, tariffs and quotations before committing to a design. Calculations run in your browser; project inputs are not submitted to LuminVolt.<\/p><a href=\"\/contact\/\">Project-specific engineering \u2197<\/a><\/footer><noscript><p>Enable JavaScript to use these calculators. You can still open the service and data links above.<\/p><\/noscript><\/div><\/div>\n<script>\n(function (scope) {\n  'use strict';\n\n  function number(value, name, min, max) {\n    if (typeof value !== 'number' || !Number.isFinite(value) || value < min || value > max) {\n      throw new RangeError(name + ' must be a finite number from ' + min + ' to ' + max + '.');\n    }\n    return value;\n  }\n\n  function integer(value, name, min, max) {\n    number(value, name, min, max);\n    if (!Number.isInteger(value)) throw new RangeError(name + ' must be a whole number.');\n    return value;\n  }\n\n  function sum(values) { return values.reduce(function (a, b) { return a + b; }, 0); }\n  function finiteResult(value) {\n    if (!Number.isFinite(value)) throw new RangeError('These inputs produce a result outside the supported range.');\n    return value;\n  }\n\n  function capacity(input) {\n    var length = number(input.length, 'Roof length', 0.01, 100000);\n    var width = number(input.width, 'Roof width', 0.01, 100000);\n    var setback = number(input.setback, 'Perimeter setback', 0, 100000);\n    var moduleLength = number(input.moduleLength, 'Module length', 0.01, 100);\n    var moduleWidth = number(input.moduleWidth, 'Module width', 0.01, 100);\n    var moduleW = number(input.moduleW, 'Module power', 0.01, 100000);\n    var tilt = number(input.tilt, 'Module tilt', 0, 89.9);\n    var gap = number(input.gap, 'Clear row gap', 0, 100000);\n    var roofs = integer(input.roofs === undefined ? 1 : input.roofs, 'Identical roofs', 1, 10000);\n    var orientation = input.orientation || 'portrait';\n    if (orientation !== 'portrait' && orientation !== 'landscape') throw new RangeError('Orientation must be portrait or landscape.');\n    var slopeLength = orientation === 'portrait' ? moduleLength : moduleWidth;\n    var acrossWidth = orientation === 'portrait' ? moduleWidth : moduleLength;\n    var projectedLength = slopeLength * Math.cos(tilt * Math.PI \/ 180);\n    var usableLength = Math.max(0, length - 2 * setback);\n    var usableWidth = Math.max(0, width - 2 * setback);\n    \/\/ The final row needs no trailing gap. Tolerance only absorbs binary rounding at exact fits.\n    var rows = Math.max(0, Math.floor((usableLength + gap) \/ (projectedLength + gap) + 1e-10));\n    var perRow = Math.max(0, Math.floor(usableWidth \/ acrossWidth + 1e-10));\n    if (!usableLength || !usableWidth) rows = perRow = 0;\n    var modulesPerRoof = rows * perRow;\n    var modules = modulesPerRoof * roofs;\n    if (!Number.isSafeInteger(modules)) throw new RangeError('Module count exceeds the supported range.');\n    return {\n      modules: modules, modulesPerRoof: modulesPerRoof, kw: modules * moduleW \/ 1000,\n      rows: rows, perRow: perRow, roofs: roofs, orientation: orientation,\n      usableLength: usableLength, usableWidth: usableWidth,\n      usableArea: usableLength * usableWidth * roofs,\n      roofArea: length * width * roofs,\n      moduleArea: modules * moduleLength * moduleWidth,\n      projectedLength: projectedLength, rowPitch: projectedLength + gap,\n      occupiedLength: rows ? rows * projectedLength + (rows - 1) * gap : 0,\n      occupiedWidth: perRow * acrossWidth\n    };\n  }\n\n  function generation(input) {\n    var kw = number(input.kw, 'System capacity', 0, 1000000000);\n    var yieldKwh = number(input.yieldKwh, 'First-year specific yield', 0, 100000);\n    var years = integer(input.years, 'Analysis years', 1, 100);\n    var degradation = number(input.degradation, 'Annual degradation', 0, 1);\n    var firstYearEnergy = finiteResult(kw * yieldKwh);\n    var rows = Array.from({ length: years }, function (_, i) {\n      return { year: i + 1, energy: firstYearEnergy * Math.pow(1 - degradation, i) };\n    });\n    return { firstYearEnergy: firstYearEnergy, totalEnergy: sum(rows.map(function (r) { return r.energy; })), rows: rows, years: years };\n  }\n\n  function cost(input) {\n    var kw = number(input.kw, 'System capacity', 0, 1000000000);\n    if (!Array.isArray(input.rates) || input.rates.length > 100) throw new RangeError('Cost rates must be an array with up to 100 items.');\n    var fixed = number(input.fixed, 'Fixed costs', 0, 1000000000000);\n    var contingency = number(input.contingency, 'Contingency', 0, 1);\n    var items = input.rates.map(function (item, i) {\n      var perW = number(item.perW, 'Cost rate ' + (i + 1), 0, 1000000);\n      return { name: String(item.name || 'Item ' + (i + 1)).slice(0, 200), perW: perW, amount: finiteResult(kw * 1000 * perW) };\n    });\n    var variable = sum(items.map(function (item) { return item.amount; }));\n    var subtotal = finiteResult(variable + fixed);\n    var contingencyAmount = subtotal * contingency;\n    var total = finiteResult(subtotal + contingencyAmount);\n    return { items: items, variable: variable, fixed: fixed, subtotal: subtotal, contingencyAmount: contingencyAmount, total: total, perW: kw ? total \/ (kw * 1000) : null };\n  }\n\n  function validateCashflows(cashflows) {\n    if (!Array.isArray(cashflows) || cashflows.length < 1 || cashflows.length > 101) throw new RangeError('Provide 1 to 101 annual cash flows, starting with year zero.');\n    cashflows.forEach(function (value) { number(value, 'Cash flow', -1e30, 1e30); });\n  }\n\n  function npv(cashflows, discount) {\n    validateCashflows(cashflows);\n    number(discount, 'Discount rate', -0.999999999999, 1000000000);\n    return sum(cashflows.map(function (value, i) { return value \/ Math.pow(1 + discount, i); }));\n  }\n\n  function irr(cashflows) {\n    validateCashflows(cashflows);\n    var nonzero = cashflows.filter(function (value) { return value !== 0; });\n    if (cashflows[0] >= 0 || nonzero.length < 2) return null;\n    \/\/ An IRR is deliberately withheld for nonconventional flows, which may have several roots.\n    var positiveSeen = false;\n    for (var i = 1; i < cashflows.length; i++) {\n      if (cashflows[i] < 0) return null;\n      if (cashflows[i] > 0) positiveSeen = true;\n    }\n    if (!positiveSeen) return null;\n    \/\/ Evaluate NPV in log(1+r) space, scaling positive exponents to avoid overflow near r=-1.\n    var lastNonzero = cashflows.length - 1;\n    while (cashflows[lastNonzero] === 0) lastNonzero--;\n    var activeFlows = cashflows.slice(0, lastNonzero + 1);\n    function scaledNpv(logRate) {\n      var scale = logRate < 0 ? -lastNonzero * logRate : 0;\n      return sum(activeFlows.map(function (value, year) { return value * Math.exp(-year * logRate - scale); }));\n    }\n    var low = -700, high = 700;\n    var lowValue = scaledNpv(low), highValue = scaledNpv(high);\n    if (lowValue < 0 || highValue > 0) return null;\n    for (var step = 0; step < 160; step++) {\n      var middle = (low + high) \/ 2;\n      var value = scaledNpv(middle);\n      if (value > 0) low = middle;\n      else high = middle;\n    }\n    var answer = Math.expm1((low + high) \/ 2);\n    return Number.isFinite(answer) && answer > -1 ? answer : null;\n  }\n\n  function payback(cashflows) {\n    if (cashflows[0] >= 0) return null;\n    var cumulative = cashflows[0];\n    \/\/ A later replacement can undo a first crossing. Report recovery that remains recovered.\n    var suffixMinimum = new Array(cashflows.length);\n    var running = 0;\n    var balances = cashflows.map(function (value) { running += value; return running; });\n    var minimum = Infinity;\n    for (var j = balances.length - 1; j >= 0; j--) {\n      minimum = Math.min(minimum, balances[j]); suffixMinimum[j] = minimum;\n    }\n    for (var i = 1; i < cashflows.length; i++) {\n      var previous = cumulative;\n      cumulative += cashflows[i];\n      if (previous < 0) { if (cumulative >= 0) { if (suffixMinimum[i] >= 0) return i - 1 + (-previous \/ cashflows[i]); } }\n    }\n    return null;\n  }\n\n  function finance(input) {\n    var capex = number(input.capex, 'Initial project cost', 0, 1e15);\n    var firstYearEnergy = number(input.firstYearEnergy, 'First-year generation', 0, 1e15);\n    var selfUse = number(input.selfUse, 'Self-use share', 0, 1);\n    var retail = number(input.retail, 'Purchase electricity rate', 0, 1e6);\n    var exportRate = number(input.exportRate, 'Export electricity rate', 0, 1e6);\n    var years = integer(input.years, 'Analysis years', 1, 100);\n    var degradation = number(input.degradation, 'Annual degradation', 0, 1);\n    var escalation = number(input.escalation, 'Electricity price escalation', -1, 1);\n    var opex = number(input.opex, 'First-year operating cost', 0, 1e15);\n    var opexEscalation = number(input.opexEscalation, 'Operating cost escalation', -1, 1);\n    var discount = number(input.discount, 'Discount rate', 0, 1);\n    var loanShare = number(input.loanShare, 'Debt share', 0, 1);\n    var interest = number(input.interest, 'Annual loan interest', 0, 1);\n    var loanYears = integer(input.loanYears, 'Loan term', 0, 100);\n    var replacementYear = integer(input.replacementYear, 'Replacement year (0 for none)', 0, years);\n    var replacementCost = number(input.replacementCost, 'Replacement cost', 0, 1e15);\n    var principal = capex * loanShare;\n    if (principal && (!loanYears || loanYears > years)) throw new RangeError('A funded loan needs a term from 1 through the analysis period.');\n    if (!replacementYear && replacementCost) throw new RangeError('Choose a replacement year for the replacement cost, or set the cost to zero.');\n    var annualDebtService = 0;\n    if (principal) {\n      annualDebtService = interest ? principal * interest \/ (1 - Math.pow(1 + interest, -loanYears)) : principal \/ loanYears;\n    }\n    var balance = principal;\n    var projectCashflows = [-capex];\n    var equityCashflows = [-(capex - principal)];\n    var cumulativeProject = -capex, cumulativeEquity = -(capex - principal);\n    var rows = [];\n    for (var year = 1; year <= years; year++) {\n      var energy = firstYearEnergy * Math.pow(1 - degradation, year - 1);\n      var selfConsumed = energy * selfUse;\n      var exported = energy - selfConsumed;\n      var priceFactor = Math.pow(1 + escalation, year - 1);\n      var savings = selfConsumed * retail * priceFactor;\n      var revenue = exported * exportRate * priceFactor;\n      var operatingCost = opex * Math.pow(1 + opexEscalation, year - 1);\n      var replacement = year === replacementYear ? replacementCost : 0;\n      var debtInterest = 0, debtPrincipal = 0, debtService = 0;\n      if (!(!principal || year > loanYears)) {\n        debtInterest = balance * interest;\n        debtPrincipal = year === loanYears ? balance : Math.min(balance, Math.max(0, annualDebtService - debtInterest));\n        debtService = debtInterest + debtPrincipal;\n        balance = Math.max(0, balance - debtPrincipal);\n      }\n      var projectCashflow = finiteResult(savings + revenue - operatingCost - replacement);\n      var equityCashflow = finiteResult(projectCashflow - debtService);\n      projectCashflows.push(projectCashflow);\n      equityCashflows.push(equityCashflow);\n      cumulativeProject += projectCashflow;\n      cumulativeEquity += equityCashflow;\n      rows.push({ year: year, energy: energy, selfConsumed: selfConsumed, exported: exported,\n        savings: savings, revenue: revenue, grossValue: savings + revenue,\n        operatingCost: operatingCost, replacement: replacement,\n        debtInterest: debtInterest, debtPrincipal: debtPrincipal, debtService: debtService, debtBalance: balance,\n        projectCashflow: projectCashflow, equityCashflow: equityCashflow,\n        cumulativeProject: cumulativeProject, cumulativeEquity: cumulativeEquity });\n    }\n    return { rows: rows, projectCashflows: projectCashflows, equityCashflows: equityCashflows,\n      npvProject: npv(projectCashflows, discount), npvEquity: npv(equityCashflows, discount),\n      irrProject: irr(projectCashflows), irrEquity: irr(equityCashflows),\n      paybackProject: payback(projectCashflows), paybackEquity: payback(equityCashflows),\n      lifetimeProjectNet: cumulativeProject, lifetimeEquityNet: cumulativeEquity,\n      totalEnergy: sum(rows.map(function (row) { return row.energy; })),\n      totalSavings: sum(rows.map(function (row) { return row.savings; })),\n      totalRevenue: sum(rows.map(function (row) { return row.revenue; })),\n      totalOpex: sum(rows.map(function (row) { return row.operatingCost; })),\n      loanPrincipal: principal, annualDebtService: annualDebtService,\n      initialEquity: capex - principal, remainingDebt: balance };\n  }\n\n  var api = { capacity: capacity, generation: generation, cost: cost, finance: finance, npv: npv, irr: irr };\n  if (typeof module !== 'undefined') {\n    if (module.exports) module.exports = api;\n    else scope.LVProject = api;\n  } else scope.LVProject = api;\n})(typeof globalThis !== 'undefined' ? globalThis : this);\n\n(function (scope) {\n  'use strict';\n  var D = Math.PI \/ 180;\n  var SECTIONS = [1.5, 2.5, 4, 6, 10, 16, 25, 35, 50, 70, 95, 120, 150, 185, 240, 300, 400, 500, 630];\n  function number(v, name, min, max) {\n    if (typeof v !== 'number' || !Number.isFinite(v) || v < min || v > max) throw new Error(name + ' must be a finite number between ' + min + ' and ' + max + '.');\n    return v;\n  }\n  function positive(v, name) { number(v, name, 0, 1e12); if (v === 0) throw new Error(name + ' must be greater than zero.'); return v; }\n  function dayValue(day) { number(day, 'Day of year', 1, 365); if (!Number.isInteger(day)) throw new Error('Day of year must be an integer.'); return day; }\n  function clamp(v, lo, hi) { return Math.min(hi, Math.max(lo, v)); }\n  function wrap(v) { return ((v % 24) + 24) % 24; }\n  function sun(p) {\n    var lat = number(p.latitude, 'Latitude', -90, 90) * D;\n    var day = dayValue(p.day), hour = number(p.hour, 'Solar hour', 0, 24);\n    var declination = 23.45 * Math.sin(2 * Math.PI * (284 + day) \/ 365) * D;\n    var h = (hour - 12) * 15 * D;\n    var east = -Math.cos(declination) * Math.sin(h);\n    var north = Math.cos(lat) * Math.sin(declination) - Math.sin(lat) * Math.cos(declination) * Math.cos(h);\n    var up = Math.sin(lat) * Math.sin(declination) + Math.cos(lat) * Math.cos(declination) * Math.cos(h);\n    return {east:east, north:north, up:up, elevation:Math.asin(clamp(up, -1, 1))\/D, azimuth:(Math.atan2(east, north)\/D + 360)%360, declination:declination\/D, hour:hour};\n  }\n  function timeRange(p, step) {\n    number(p.start, 'Start solar hour', 0, 24); number(p.end, 'End solar hour', 0, 24);\n    if (p.end <= p.start) throw new Error('End solar hour must be after start solar hour.');\n    var times = [], count = Math.floor((p.end - p.start) \/ step + 1e-8);\n    for (var i = 0; i <= count; i++) times.push(p.start + i * step);\n    if (p.end - times[times.length - 1] > 1e-8) times.push(p.end);\n    return times;\n  }\n  function spacing(p) {\n    number(p.latitude, 'Latitude', -90, 90); dayValue(p.day);\n    positive(p.width, 'Row slope length'); number(p.tilt, 'Tilt', 0, 90); number(p.azimuth, 'Azimuth', 0, 360);\n    var height = p.width * Math.sin(p.tilt * D), projection = p.width * Math.cos(p.tilt * D);\n    var times = timeRange(p, 1\/12), samples = [], night = 0, near = false, worst = null;\n    times.forEach(function (hour) {\n      var s = sun({latitude:p.latitude, day:p.day, hour:hour});\n      if (s.up <= 1e-6) { night++; return; }\n      if (s.elevation < 0.5) near = true;\n      var cross = s.east * Math.sin(p.azimuth * D) + s.north * Math.cos(p.azimuth * D);\n      var front = Math.max(0, cross);\n      var gap = height * front \/ s.up;\n      var row = {hour:hour, gap:gap, elevation:s.elevation, azimuth:s.azimuth, profileAngle:Math.atan2(s.up, front)\/D, frontLit:cross > 0};\n      samples.push(row); if (!worst || row.gap > worst.gap) worst = row;\n    });\n    return {gap:worst ? worst.gap : null, pitch:worst ? projection + worst.gap : null, projection:projection, height:height, worstTime:worst ? worst.hour : null, elevation:worst ? worst.elevation : null, profileAngle:worst ? worst.profileAngle : null, samples:samples, daylightSamples:samples.length, nightSamples:night, nearHorizon:near, available:!!worst, frontBeamOnly:true, sampleMinutes:5};\n  }\n  function shadow(p) {\n    number(p.latitude, 'Latitude', -90, 90); dayValue(p.day); number(p.height, 'Object height', 0, 1e6);\n    var rows = [], night = 0, near = false, longest = null;\n    timeRange(p, 0.5).forEach(function (hour) {\n      var s = sun({latitude:p.latitude, day:p.day, hour:hour});\n      if (s.up <= 1e-6) { night++; return; }\n      if (s.elevation < 0.5) near = true;\n      var x = -p.height*s.east\/s.up, y = -p.height*s.north\/s.up;\n      var row = {hour:hour, xEast:x, yNorth:y, length:Math.hypot(x, y), elevation:s.elevation, azimuth:s.azimuth};\n      rows.push(row); if (!longest || row.length > longest.length) longest = row;\n    });\n    return {rows:rows, maxLength:longest ? longest.length : null, longest:longest, nightSamples:night, nearHorizon:near, available:!!longest, sampleMinutes:30};\n  }\n  function cable(p) {\n    if (['dc','single','three'].indexOf(p.type) < 0) throw new Error('Circuit must be dc, single or three.');\n    if (['copper','aluminium'].indexOf(p.material) < 0) throw new Error('Material must be copper or aluminium.');\n    number(p.length, 'One-way length', 0, 1e6); number(p.current, 'Current', 0, 1e6);\n    positive(p.voltage, 'Voltage'); positive(p.section, 'Cable section'); number(p.temperature, 'Conductor temperature', -50, 150);\n    number(p.maxDrop, 'Maximum voltage drop (%)', 0.000001, 100);\n    var pf = p.type === 'dc' ? 1 : number(p.powerFactor, 'Power factor', 0.01, 1);\n    var rho20 = p.material === 'copper' ? 0.017241 : 0.028264;\n    var alpha = p.material === 'copper' ? 0.00393 : 0.00403;\n    var rho = rho20 * (1 + alpha * (p.temperature - 20));\n    var r = rho * p.length \/ p.section;\n    var k = p.type === 'three' ? Math.sqrt(3) : 2;\n    var drop = k * p.current * r * pf;\n    var loss = (p.type === 'three' ? 3 : 2) * p.current * p.current * r;\n    var loadPower = (p.type === 'three' ? Math.sqrt(3) : 1) * p.voltage * p.current * pf;\n    var minSection = k * p.current * rho * p.length * pf \/ (p.voltage * p.maxDrop \/ 100);\n    var ampacityStatus = 'notchecked';\n    if (!(p.ampacity === undefined || p.ampacity === null)) { number(p.ampacity, 'Derated ampacity', 0, 1e6); ampacityStatus = p.current <= p.ampacity ? 'pass' : 'fail'; }\n    return {dropV:drop, dropPercent:100*drop\/p.voltage, lossW:loss, lossPercent:loadPower > 0 ? 100*loss\/loadPower : 0, loadPower:loadPower, minSectionDrop:minSection, candidates:SECTIONS.filter(function (s) { return s >= minSection - 1e-10; }), voltageStatus:100*drop\/p.voltage <= p.maxDrop + 1e-10 ? 'pass' : 'fail', ampacityStatus:ampacityStatus, resistance:r, rho:rho, rho20:rho20, alpha:alpha, powerFactor:pf, reactanceIncluded:false};\n  }\n  function stringRange(p) {\n    positive(p.voc, 'Module Voc'); positive(p.vmp, 'Module Vmp');\n    if (p.vmp > p.voc) throw new Error('Module Vmp cannot exceed Voc.');\n    number(p.vocCoeff, 'Voc temperature coefficient (%\/C)', -5, 5); number(p.vmpCoeff, 'Vmp temperature coefficient (%\/C)', -5, 5);\n    number(p.minTemp, 'Minimum cell temperature', -100, 150); number(p.maxTemp, 'Maximum cell temperature', -100, 150);\n    if (p.maxTemp < p.minTemp) throw new Error('Maximum cell temperature must not be below minimum cell temperature.');\n    positive(p.maxDc, 'Maximum DC voltage'); positive(p.mpptMin, 'MPPT minimum'); positive(p.mpptMax, 'MPPT maximum');\n    if (p.mpptMax < p.mpptMin) throw new Error('MPPT maximum must be at least its minimum.');\n    var coldVoc = p.voc*(1 + p.vocCoeff\/100*(p.minTemp-25));\n    var hotVoc = p.voc*(1 + p.vocCoeff\/100*(p.maxTemp-25));\n    var coldVmp = p.vmp*(1 + p.vmpCoeff\/100*(p.minTemp-25));\n    var hotVmp = p.vmp*(1 + p.vmpCoeff\/100*(p.maxTemp-25));\n    if (Math.min(coldVoc,hotVoc,coldVmp,hotVmp) <= 0) throw new Error('Temperature-adjusted module voltages must be positive.');\n    var maxVoc = Math.max(coldVoc, hotVoc), minVmp = Math.min(coldVmp, hotVmp), maxVmp = Math.max(coldVmp, hotVmp);\n    var min = Math.max(1, Math.ceil(p.mpptMin\/minVmp - 1e-12));\n    var max = Math.floor(Math.min(p.maxDc\/maxVoc, p.mpptMax\/maxVmp) + 1e-12);\n    return {min:min,max:max,feasible:max>=min,coldVoc:coldVoc,hotVoc:hotVoc,coldVmp:coldVmp,hotVmp:hotVmp,minVmp:minVmp,maxVmp:maxVmp,maxVoc:maxVoc};\n  }\n  function slope(p) {\n    if (p.angle !== undefined) { number(p.angle, 'Slope angle', -89.9, 89.9); return {angle:p.angle,grade:100*Math.tan(p.angle*D)}; }\n    number(p.grade, 'Slope grade (%)', -1e6, 1e6); return {grade:p.grade,angle:Math.atan(p.grade\/100)\/D};\n  }\n  function tiltComponents(p) {\n    number(p.tilt, 'Tilt', 0, 89.9); number(p.azimuth, 'Azimuth', 0, 360);\n    return {north:Math.atan(Math.tan(p.tilt*D)*Math.cos(p.azimuth*D))\/D,east:Math.atan(Math.tan(p.tilt*D)*Math.sin(p.azimuth*D))\/D};\n  }\n  function inverseTilt(p) {\n    number(p.north, 'North tilt component', -89.9, 89.9); number(p.east, 'East tilt component', -89.9, 89.9);\n    var n = Math.tan(p.north*D), e = Math.tan(p.east*D);\n    return {tilt:Math.atan(Math.hypot(n,e))\/D,azimuth:Math.hypot(n,e)<1e-12?0:(Math.atan2(e,n)\/D+360)%360};\n  }\n  function solarTime(p) {\n    var day = dayValue(p.day); number(p.longitude, 'Longitude', -180, 180); number(p.timezone, 'UTC offset', -14, 14); number(p.hour, 'Input hour', 0, 24);\n    var g = 2*Math.PI\/365*(day-1);\n    var eot = 229.18*(0.000075 + 0.001868*Math.cos(g) - 0.032077*Math.sin(g) - 0.014615*Math.cos(2*g) - 0.040849*Math.sin(2*g));\n    var offset = 4*p.longitude - 60*p.timezone + eot;\n    var solar = p.hour+offset\/60, clock = p.hour-offset\/60;\n    return {equationOfTime:eot,offsetMinutes:offset,solarHour:wrap(solar),solarDayOffset:Math.floor(solar\/24),clockHourFromSolar:wrap(clock),clockDayOffset:Math.floor(clock\/24)};\n  }\n  function emissions(p) { number(p.energy,'Annual energy',0,1e12); number(p.factor,'Avoided emissions factor (kg\/kWh)',0,100); return {kg:p.energy*p.factor,tonnes:p.energy*p.factor\/1000}; }\n  function bifacial(p) {\n    positive(p.front,'Front irradiation'); number(p.rear,'Rear irradiation',0,1e9); number(p.bifaciality,'Bifaciality (%)',0,100);\n    var extra = p.rear*p.bifaciality\/100;\n    return {gainPercent:100*extra\/p.front,total:p.front+extra,equivalentIrradiation:p.front+extra};\n  }\n  var api = {sun:sun,spacing:spacing,shadow:shadow,cable:cable,stringRange:stringRange,slope:slope,tiltComponents:tiltComponents,inverseTilt:inverseTilt,solarTime:solarTime,emissions:emissions,bifacial:bifacial};\n  if (typeof module !== 'undefined') {\n    if (module.exports) module.exports = api;\n    else scope.LVEngineering = api;\n  } else scope.LVEngineering = api;\n})(typeof window !== 'undefined' ? window : globalThis);\n\n(function () {\n  'use strict';\n  const root = document.getElementById('lv-planning-tool');\n  if (!root || root.dataset.ready === 'true') return;\n  const P = window.LVProject, E = window.LVEngineering;\n  if (!P || !E) return;\n\n  const I18N = {\"zh\": {\"Estimated DC capacity\": \"\u9810\u4f30\u76f4\u6d41\u88dd\u6a5f\u5bb9\u91cf\", \"First-year generation\": \"\u9996\u5e74\u9810\u4f30\u767c\u96fb\u91cf\", \"Estimated initial investment\": \"\u9810\u4f30\u521d\u59cb\u7e3d\u6295\u8cc7\u984d\", \"Project net present value\": \"\u5c08\u6848\u6de8\u73fe\u503c (NPV)\", \"Front-to-front row pitch\": \"\u524d\u5f8c\u9663\u5217\u6392\u8ddd (Pitch)\", \"Longest sampled shadow\": \"\u6700\u9577\u63a1\u6a23\u9670\u5f71\u9577\u5ea6\", \"Calculated voltage drop\": \"\u7dda\u8def\u96fb\u58d3\u964d\u8a08\u7b97\u503c\", \"Voltage-compatible modules per string\": \"\u7d44\u4e32\u96fb\u58d3\u9069\u914d\u7d44\u4ef6\u6578\u7bc4\u570d\", \"Estimated avoided emissions\": \"\u5e74\u5ea6\u4e8c\u6c27\u5316\u78b3\u6e1b\u6392\u91cf\", \"Incremental net present value\": \"\u589e\u91cf\u6de8\u73fe\u503c (Incremental NPV)\", \"Rear-side irradiation contribution\": \"\u80cc\u9762\u8f3b\u7167\u589e\u76ca\u8ca2\u737b\", \"Total modules\": \"\u7d44\u4ef6\u7e3d\u6578\", \"all identical roofs\": \"\u6240\u6709\u76f8\u540c\u5c4b\u9802\u5408\u8a08\", \"Rows per roof\": \"\u55ae\u500b\u5c4b\u9802\u6392\u6578\", \"modules per row\": \"\u584a\u7d44\u4ef6\/\u6392\", \"Usable roof area\": \"\u53ef\u7528\u5c4b\u9802\u9762\u7a4d\", \"after perimeter setbacks\": \"\u6263\u9664\u56db\u5468\u908a\u8ddd\u5f8c\", \"Lifetime generation\": \"\u5168\u751f\u547d\u9031\u671f\u7d2f\u8a08\u767c\u96fb\u91cf\", \"years\": \"\u5e74\", \"Annual average\": \"\u5e74\u5747\u767c\u96fb\u91cf\", \"Final year\": \"\u8a55\u4f30\u7d42\u671f\u5e74\u4efd\u767c\u96fb\u91cf\", \"Installed cost\": \"\u6bcf\u74e6\u7d9c\u5408\u88dd\u6a5f\u6210\u672c\", \"Subtotal\": \"\u9810\u7b97\u5c0f\u8a08\", \"before contingency\": \"\u672a\u8a08\u4e0d\u53ef\u9810\u898b\u8cbb\", \"Contingency\": \"\u4e0d\u53ef\u9810\u898b\u8cbb\", \"of subtotal\": \"\u4e4b\u5c0f\u8a08\u6bd4\u4f8b\", \"Project IRR\": \"\u5c08\u6848\u5167\u90e8\u6536\u76ca\u7387 (IRR)\", \"pre-tax, annual cash flow\": \"\u7a05\u524d\u5e74\u73fe\u91d1\u6d41\u53e3\u5f91\", \"Project payback\": \"\u975c\u614b\u6295\u8cc7\u56de\u6536\u671f\", \"durable undiscounted recovery\": \"\u7d2f\u8a08\u6de8\u73fe\u91d1\u6d41\u6301\u7e8c\u56de\u6b63\u6642\u9593\", \"Not recovered\": \"\u8a55\u4f30\u671f\u5167\u672a\u6536\u56de\", \"Lifetime project net\": \"\u751f\u547d\u9031\u671f\u6de8\u6536\u76ca\u7e3d\u984d\", \"after initial investment\": \"\u5df2\u6263\u9664\u521d\u59cb\u6295\u8cc7\", \"Equity NPV\": \"\u81ea\u6709\u8cc7\u672c\u6de8\u73fe\u503c (Equity NPV)\", \"discount\": \"\u6298\u73fe\u7387\", \"Equity IRR\": \"\u81ea\u6709\u8cc7\u672c\u5167\u90e8\u6536\u76ca\u7387 (Equity IRR)\", \"after annual debt service\": \"\u6263\u9664\u6bcf\u5e74\u9084\u672c\u4ed8\u606f\u5f8c\", \"Initial equity\": \"\u521d\u59cb\u81ea\u6709\u8cc7\u91d1\u6295\u5165\", \"debt\": \"\u878d\u8cc7\u8cb8\u6b3e\u984d\", \"Clear row gap\": \"\u6392\u9593\u6de8\u9593\u8ddd\", \"horizontal edge-to-edge\": \"\u524d\u5f8c\u7d44\u4ef6\u6c34\u5e73\u908a\u7de3\u6de8\u8ddd\", \"Projected row depth\": \"\u7d44\u4ef6\u6392\u6c34\u5e73\u6295\u5f71\u9577\u5ea6\", \"level-ground footprint\": \"\u5e73\u5730\u4f54\u5730\u6df1\u5ea6\", \"Controlling solar time\": \"\u63a7\u5236\u81e8\u754c\u592a\u967d\u6642\", \"sun elevation\": \"\u592a\u967d\u9ad8\u5ea6\u89d2\", \"Solar time\": \"\u592a\u967d\u6642\", \"at maximum sampled length\": \"\u8655\u65bc\u6700\u5927\u63a1\u6a23\u9670\u5f71\u9577\u5ea6\u6642\", \"Tip east coordinate\": \"\u9670\u5f71\u9802\u9ede\u6771\u5411\u5750\u6a19\", \"negative = west\": \"\u8ca0\u503c\u8868\u793a\u504f\u897f\", \"Tip north coordinate\": \"\u9670\u5f71\u9802\u9ede\u5317\u5411\u5750\u6a19\", \"negative = south\": \"\u8ca0\u503c\u8868\u793a\u504f\u5357\", \"Voltage difference\": \"\u7dda\u8def\u96fb\u58d3\u5dee\", \"circuit\": \"\u96fb\u8def\", \"Resistive cable loss\": \"\u96fb\u7e9c\u96fb\u963b\u640d\u8017 (I\u00b2R)\", \"at the entered operating current\": \"\u5728\u8f38\u5165\u904b\u884c\u96fb\u6d41\u4e0b\", \"Loss \/ load power\": \"\u96fb\u963b\u640d\u8017\u4f54\u6709\u529f\u8ca0\u8377\u6bd4\u4f8b\", \"not annual energy loss\": \"\u975e\u5168\u5e74\u96fb\u91cf\u640d\u5931\", \"Highest module Voc\": \"\u6700\u9ad8\u7d44\u4ef6\u958b\u8def\u96fb\u58d3 (Voc)\", \"across temperature endpoints\": \"\u8986\u84cb\u6975\u9650\u4f4e\u6eab\u9ede\", \"Lowest module Vmp\": \"\u6700\u4f4e\u7d44\u4ef6\u5de5\u4f5c\u96fb\u58d3 (Vmp)\", \"sets minimum string count\": \"\u6c7a\u5b9a\u7d44\u4e32\u7d44\u4ef6\u6578\u4e0b\u9650\", \"Highest module Vmp\": \"\u6700\u9ad8\u7d44\u4ef6\u5de5\u4f5c\u96fb\u58d3 (Vmp)\", \"sets MPPT upper count\": \"\u6c7a\u5b9a MPPT \u7d44\u4ef6\u6578\u4e0a\u9650\", \"Clock \u2192 solar time\": \"\u9418\u9336\u6642 \u2192 \u592a\u967d\u6642\", \"input interpreted as civil time\": \"\u8f38\u5165\u6642\u9593\u6309\u884c\u653f\u6642\u8a08\u7b97\", \"Solar \u2192 clock time\": \"\u592a\u967d\u6642 \u2192 \u9418\u9336\u6642\", \"input interpreted as solar time\": \"\u8f38\u5165\u6642\u9593\u6309\u771f\u592a\u967d\u6642\u8a08\u7b97\", \"Equation of time\": \"\u6642\u5dee (Equation of Time)\", \"net offset\": \"\u6de8\u504f\u5dee\", \"Grade \u2192 angle\": \"\u5761\u5ea6 \u2192 \u50be\u89d2\", \"Angle \u2192 grade\": \"\u50be\u89d2 \u2192 \u5761\u5ea6\", \"input\": \"\u8f38\u5165\u503c\", \"North component\": \"\u5317\u5411\u5206\u91cf\", \"East component\": \"\u6771\u5411\u5206\u91cf\", \"from full tilt + azimuth\": \"\u4f86\u81ea\u7e3d\u50be\u89d2\u8207\u65b9\u4f4d\u89d2\u5206\u89e3\", \"Inverse result\": \"\u53cd\u63a8\u7a7a\u9593\u50be\u89d2\u7d50\u679c\", \"tilt\": \"\u50be\u89d2\", \"facing azimuth\": \"\u671d\u5411\u65b9\u4f4d\u89d2\", \"Incremental IRR\": \"\u589e\u91cf\u5167\u90e8\u6536\u76ca\u7387 (Incremental IRR)\", \"conventional flows only\": \"\u50c5\u9650\u5e38\u898f\u6295\u8cc7\u73fe\u91d1\u6d41\u7d50\u69cb\", \"Lifetime incremental net\": \"\u751f\u547d\u9031\u671f\u7d2f\u8a08\u589e\u91cf\u6de8\u6536\u76ca\", \"including extra initial investment\": \"\u5df2\u8a08\u5165\u8ffd\u52a0\u521d\u59cb\u6295\u8cc7\", \"of front-only equivalent\": \"\u6b63\u9762\u55ae\u9762\u767c\u96fb\u7b49\u6548\u6bd4\u4f8b\", \"Use capacity in this project \u2192\": \"\u5c07\u6b64\u5bb9\u91cf\u4ee3\u5165\u5168\u57df\u5c08\u6848 \u2192\", \"Use budget in financial returns \u2192\": \"\u5c07\u9810\u7b97\u4ee3\u5165\u8ca1\u52d9\u56de\u5831\u5206\u6790 \u2192\", \"Use clear gap in capacity estimate \u2192\": \"\u5c07\u6de8\u6392\u8ddd\u4ee3\u5165\u5c4b\u9802\u5bb9\u91cf\u4f30\u7b97 \u2192\", \"Download CSV \u2193\": \"\u4e0b\u8f09 CSV \u5831\u8868 \u2193\", \"One roof \u2022 \": \"\u55ae\u500b\u5c4b\u9802 \u2022 \", \" rows \u00d7 \": \" \u6392 \u00d7 \", \" modules\": \" \u584a\u7d44\u4ef6\", \"Clear gap \": \"\u6de8\u6392\u8ddd \", \" \u2022 Front-to-front pitch \": \" \u2022 \u524d\u5f8c\u4e2d\u5fc3\u6392\u8ddd \", \"Object at origin \u2022 Scale \": \"\u969c\u7919\u7269\u4f4d\u65bc\u539f\u9ede \u2022 \u5750\u6a19\u8ef8\u6a19\u5c3a \", \" m per axis arm\": \" \u7c73\/\u8ef8\u7dda\", \"Year \": \"\u7b2c \", \"Year\": \"\u5e74\u5ea6\", \"Energy kWh\": \"\u767c\u96fb\u91cf kWh\", \"Savings\": \"\u81ea\u7528\u7bc0\u7701\u96fb\u8cbb\", \"Export income\": \"\u4e0a\u7db2\u552e\u96fb\u6536\u76ca\", \"Operating cost\": \"\u904b\u7dad\u8207\u79df\u91d1\u652f\u51fa\", \"Replacement\": \"\u8a2d\u5099\u7f6e\u63db\u91cd\u7f6e\u652f\u51fa\", \"Debt payment\": \"\u8cb8\u6b3e\u672c\u606f\u511f\u9084\", \"Project cash\": \"\u5168\u6295\u8cc7\u5c08\u6848\u6de8\u73fe\u91d1\u6d41\", \"Equity cash\": \"\u81ea\u6709\u8cc7\u672c\u6b0a\u76ca\u73fe\u91d1\u6d41\", \"Equity cumulative\": \"\u7d2f\u8a08\u81ea\u6709\u8cc7\u91d1\u73fe\u91d1\u6d41\", \"East (m)\": \"\u6771\u5411 (m)\", \"North (m)\": \"\u5317\u5411 (m)\", \"Length (m)\": \"\u9670\u5f71\u9577\u5ea6 (m)\", \"Sun elevation\": \"\u592a\u967d\u9ad8\u5ea6\u89d2\", \"Budget item\": \"\u9810\u7b97\u5206\u9805\", \"Price \/Wp\": \"\u6bcf\u74e6\u55ae\u50f9\", \"Amount\": \"\u91d1\u984d\", \"Additional net cash\": \"\u8ffd\u52a0\u6de8\u73fe\u91d1\u6d41\", \"Generation (kWh)\": \"\u767c\u96fb\u91cf (kWh)\", \"PV modules\": \"\u5149\u4f0f\u7d44\u4ef6\", \"Inverters\": \"\u9006\u8b8a\u5668\", \"Mounting\": \"\u652f\u67b6\u7cfb\u7d71\", \"Electrical BOS\": \"\u96fb\u6c23\u7cfb\u7d71 (BOS)\", \"Installation labour\": \"\u5b89\u88dd\u65bd\u5de5\u4eba\u5de5\", \"Other fixed costs\": \"\u5176\u4ed6\u56fa\u5b9a\u8cbb\u7528\", \"Total\": \"\u7e3d\u8a08\", \"Voltage-drop check\": \"\u96fb\u58d3\u964d\u9650\u5236\u6821\u6838\", \"Within entered limit\": \"\u7b26\u5408\u8a2d\u5b9a\u4e0a\u9650\u8981\u6c42 (Pass)\", \"Exceeds entered limit\": \"\u8d85\u51fa\u8a2d\u5b9a\u4e0a\u9650\u8981\u6c42 (Exceed)\", \"Derated current-rating check\": \"\u6821\u6b63\u5f8c\u5b89\u5168\u8f09\u6d41\u91cf\u6821\u6838\", \"Not checked \u2014 enter derated ampacity\": \"\u672a\u6821\u6838 \u2014 \u8acb\u8f38\u5165\u6821\u6b63\u5f8c\u8f09\u6d41\u91cf\", \"Within supplied ampacity\": \"\u7b26\u5408\u96fb\u7e9c\u8f09\u6d41\u91cf\u8981\u6c42 (Pass)\", \"Exceeds supplied ampacity\": \"\u8d85\u904e\u96fb\u7e9c\u8f09\u6d41\u91cf (Exceed)\", \"Theoretical minimum for voltage drop\": \"\u6eff\u8db3\u58d3\u964d\u8981\u6c42\u7684\u7406\u8ad6\u6700\u5c0f\u622a\u9762\u7a4d\", \"Standard sections meeting voltage drop\": \"\u6eff\u8db3\u58d3\u964d\u8981\u6c42\u7684\u6a19\u7a31\u5c0e\u9ad4\u622a\u9762\u898f\u683c\", \"No listed section up to 630 mm\u00b2\": \"\u5728630 mm\u00b2\u4ee5\u5167\u672a\u6aa2\u7d22\u5230\u5408\u9069\u6a19\u7a31\u622a\u9762\", \"Inputs changed. Calculate again to update this result.\": \"\u8f38\u5165\u53c3\u6578\u5df2\u8b8a\u66f4\uff0c\u8acb\u91cd\u65b0\u9ede\u64ca\u8a08\u7b97\u4ee5\u66f4\u65b0\u7d50\u679c\u3002\", \"Enter your quotations to build a project budget.\": \"\u8acb\u8f38\u5165\u7576\u524d\u8a2d\u5099\u8207\u5de5\u7a0b\u5831\u50f9\u4ee5\u751f\u6210\u5c08\u6848\u9810\u7b97\u3002\", \"Enter investment and project tariffs, then calculate your cash-flow scenario.\": \"\u8acb\u8f38\u5165\u6295\u8cc7\u91d1\u984d\u53ca\u5c08\u6848\u96fb\u50f9\uff0c\u96a8\u5f8c\u8a08\u7b97\u73fe\u91d1\u6d41\u8207\u6295\u8cc7\u6536\u76ca\u3002\", \"User-edited capacity or yield. Verify these assumptions for this site.\": \"\u7528\u6236\u81ea\u5b9a\u7fa9\u8f38\u5165\u7684\u88dd\u6a5f\u5bb9\u91cf\u6216\u767c\u96fb\u91cf\u3002\u8acb\u7d50\u5408\u5834\u5730\u5be6\u969b\u60c5\u6cc1\u9a57\u8b49\u9019\u4e9b\u5047\u8a2d\u3002\", \"Capacity from the rectangular roof estimate. Yield and tariffs remain your assumptions.\": \"\u88dd\u6a5f\u5bb9\u91cf\u5df2\u4ee3\u5165\u81ea\u5c4b\u9802\u4f30\u7b97\u7d50\u679c\u3002\u767c\u96fb\u91cf\u5c0f\u6642\u6578\u53ca\u96fb\u50f9\u4ecd\u63a1\u7528\u60a8\u7684\u81ea\u5b9a\u7fa9\u5047\u8a2d\u3002\", \"Yield imported from the companion NASA POWER climate estimate. Review its model assumptions.\": \"\u767c\u96fb\u91cf\u6578\u64da\u5df2\u7531\u914d\u5957\u7684 NASA POWER \u6c23\u8c61\u8a08\u7b97\u5668\u5c0e\u5165\u3002\u8acb\u67e5\u95b1\u76f8\u61c9\u6a21\u578b\u5047\u8a2d\u3002\", \"Yield imported from user-supplied irradiation in the companion calculator.\": \"\u767c\u96fb\u91cf\u6578\u64da\u5df2\u7531\u914d\u5957\u8a08\u7b97\u5668\u4e2d\u81ea\u5b9a\u7fa9\u8f3b\u7167\u5ea6\u5c0e\u5165\u3002\", \"Imported project inputs. Verify the yield source and tariff assumptions before use.\": \"\u5df2\u5c0e\u5165\u5c08\u6848\u53c3\u6578\u3002\u5728\u6c7a\u7b56\u524d\u8acb\u52d9\u5fc5\u9a57\u8b49\u767c\u96fb\u91cf\u4f86\u6e90\u53ca\u96fb\u50f9\u5047\u8a2d\u3002\", \"below-horizon sample(s) excluded. This is a daylight-only result.\": \"\u500b\u4f4e\u65bc\u5730\u5e73\u7dda\u7684\u63a1\u6a23\u9ede\u5df2\u88ab\u5254\u9664\u3002\u6b64\u8655\u50c5\u8a08\u7b97\u65e5\u9593\u6709\u5149\u7167\u6642\u6bb5\u3002\", \"Sun is close to the horizon. Very long shadows and this approximation become especially sensitive to terrain and atmospheric refraction.\": \"\u592a\u967d\u9ad8\u5ea6\u89d2\u63a5\u8fd1\u5730\u5e73\u7dda\u3002\u8d85\u9577\u9670\u5f71\u53ca\u6b64\u8fd1\u4f3c\u7b97\u6cd5\u5c0d\u5730\u5f62\u8d77\u4f0f\u8207\u5927\u6c23\u6298\u5c04\u6975\u70ba\u654f\u611f\u3002\", \"Not reported\": \"\u4e0d\u9069\u7528\/\u672a\u56de\u5831\", \"No feasible range\": \"\u7121\u53ef\u884c\u5340\u9593\", \"Candidate sections satisfy voltage drop only. \": \"\u63a8\u85a6\u622a\u9762\u50c5\u6eff\u8db3\u96fb\u58d3\u964d\u9650\u5236\u3002 \", \"Ampacity has not been checked.\": \"\u8f09\u6d41\u91cf\u5c1a\u672a\u6821\u6838\u3002\", \"Ampacity is assessed only against the derated rating you supplied.\": \"\u8f09\u6d41\u91cf\u50c5\u4f9d\u64da\u60a8\u8f38\u5165\u7684\u6821\u6b63\u6578\u503c\u9032\u884c\u6bd4\u5c0d\u3002\", \"Conceptual packing only. Clearances and row gaps are entered assumptions; obstacles and required access lanes may reduce capacity.\": \"\u50c5\u70ba\u6982\u5ff5\u6027\u9663\u5217\u6392\u5e03\u4f30\u7b97\u3002\u908a\u754c\u9000\u7e2e\u8207\u6392\u8ddd\u5747\u70ba\u8f38\u5165\u5047\u8a2d\uff1b\u5be6\u969b\u73fe\u5834\u969c\u7919\u7269\u8207\u904b\u7dad\u901a\u9053\u53ef\u80fd\u6e1b\u5c11\u5be6\u969b\u7d44\u4ef6\u5bb9\u91cf\u3002\", \"Yield source: \": \"\u767c\u96fb\u91cf\u4f86\u6e90\uff1a\", \"Only the entered line items are included. Request current quotes for a complete procurement budget.\": \"\u50c5\u8a08\u5165\u5df2\u8f38\u5165\u91d1\u984d\u7684\u5206\u9805\u3002\u5982\u9700\u7372\u53d6\u5b8c\u6574\u5de5\u7a0b\u63a1\u8cfc\u9810\u7b97\uff0c\u8acb\u7d22\u53d6\u6700\u65b0\u4f9b\u61c9\u5546\u5831\u50f9\u3002\", \"Year-one savings \": \"\u9996\u5e74\u7bc0\u7701\u96fb\u8cbb \", \"export income \": \"\u4e0a\u7db2\u552e\u96fb\u6536\u76ca \", \"Self-use is a fixed \": \"\u81ea\u767c\u81ea\u7528\u6bd4\u4f8b\u56fa\u5b9a\u70ba \", \"assumption.\": \"\u5047\u8a2d\u3002\", \"\u201cNot reported\u201d IRR means there is no conventional, uniquely reportable investment root. A negative later cash flow (for example a replacement) suppresses IRR; use NPV and the full cash-flow table to assess the scenario.\": \"\u201c\u672a\u56de\u5831\u201d IRR \u8868\u793a\u73fe\u91d1\u6d41\u975e\u6a19\u6e96\u6295\u8cc7\u7d50\u69cb\u6216\u7121\u552f\u4e00\u89e3\u3002\u5f8c\u7e8c\u5e74\u4efd\u51fa\u73fe\u8ca0\u73fe\u91d1\u6d41\uff08\u5982\u91cd\u5927\u8a2d\u5099\u7f6e\u63db\uff09\u6703\u6291\u5236 IRR \u8a08\u7b97\uff1b\u8acb\u53c3\u8003 NPV \u53ca\u5b8c\u6574\u73fe\u91d1\u6d41\u8868\u7d9c\u5408\u8a55\u4f30\u3002\", \"Equity payback: \": \"\u81ea\u6709\u8cc7\u91d1\u56de\u6536\u671f\uff1a\", \"not recovered in the analysis period\": \"\u5728\u5206\u6790\u671f\u5167\u672a\u6536\u56de\", \"Payback is the first cumulative recovery that remains nonnegative through the modeled horizon. No taxes, subsidies or residual value included.\": \"\u56de\u6536\u671f\u662f\u6307\u7d2f\u8a08\u6de8\u73fe\u91d1\u6d41\u6301\u7e8c\u70ba\u6b63\u4e14\u8986\u84cb\u5f8c\u7e8c\u7f6e\u63db\u652f\u51fa\u7684\u5e74\u9650\u3002\u672a\u8a08\u5165\u7a05\u8cbb\u3001\u88dc\u8cbc\u6216\u8cc7\u7522\u6b98\u503c\u3002\", \"For the selected date and front-of-array direct sun only, with 5-minute sampling. Check every relevant seasonal condition for the final layout.\": \"\u50c5\u91dd\u5c0d\u6307\u5b9a\u65e5\u671f\u53ca\u9663\u5217\u524d\u65b9\u76f4\u5c04\u65e5\u5149\uff0c\u6bcf5\u5206\u9418\u63a1\u6a23\u4e00\u6b21\u3002\u6700\u7d42\u4f48\u5c40\u8acb\u6838\u7b97\u5404\u5b63\u7bc0\u6975\u7aef\u5149\u7167\u689d\u4ef6\u3002\", \"Voltage screening only. Check maximum input current, startup requirements, tolerances and applicable safety margins separately.\": \"\u50c5\u4f9b\u96fb\u58d3\u7bc4\u570d\u521d\u6b65\u6821\u6838\u3002\u6700\u5927\u8f38\u5165\u96fb\u6d41\u3001\u555f\u52d5\u96fb\u58d3\u9580\u6abb\u3001\u6eab\u5ea6\u6975\u503c\u9918\u91cf\u7b49\u9700\u53e6\u884c\u7368\u7acb\u8a55\u4f30\u3002\", \"Based solely on your entered displaced electricity and grid emission factor. Record the factor source and accounting period with the project.\": \"\u50c5\u6839\u64da\u60a8\u8f38\u5165\u7684\u6e05\u6f54\u767c\u96fb\u91cf\u53ca\u96fb\u7db2\u6392\u653e\u56e0\u5b50\u8a08\u7b97\u3002\u8acb\u65bc\u5c08\u6848\u6587\u6a94\u4e2d\u8a18\u9304\u56e0\u5b50\u4f86\u6e90\u8207\u6838\u7b97\u9031\u671f\u3002\", \"This is an irradiation ratio, not a full electrical yield model.\": \"\u6b64\u6578\u503c\u70ba\u8f3b\u7167\u5149\u5b78\u5c64\u9762\u589e\u76ca\uff0c\u975e\u5b8c\u6574\u7cfb\u7d71\u767c\u96fb\u91cf\u6a21\u578b\u3002\", \"LuminVolt solar planning tools\": \"LuminVolt \u5149\u4f0f\u898f\u5283\u5de5\u5177\u7d44\", \"Model\": \"\u8a08\u7b97\u6a21\u578b\", \"Independent preliminary estimate\": \"\u7368\u7acb\u524d\u671f\u5de5\u7a0b\u4f30\u7b97\", \"Assumptions\": \"\u5de5\u7a0b\u5047\u8a2d\", \"See calculation method on the tool page\": \"\u8a73\u898b\u5de5\u5177\u9801\u9762\u5167\u8a08\u7b97\u65b9\u6cd5\u8aaa\u660e\", \"Currency\": \"\u8ca8\u5e63\u55ae\u4f4d\", \"Project assumptions source\": \"\u5c08\u6848\u5047\u8a2d\u4f86\u6e90\", \"Enter \": \"\u8acb\u8f38\u5165 \", \"Enter a valid date.\": \"\u8acb\u8f38\u5165\u6709\u6548\u65e5\u671f\u3002\", \"Enter at least one equipment quotation, unit cost or fixed expense. Blank items are excluded.\": \"\u8acb\u81f3\u5c11\u8f38\u5165\u4e00\u9805\u8a2d\u5099\u5831\u50f9\u3001\u55ae\u50f9\u6216\u56fa\u5b9a\u8cbb\u7528\u3002\u672a\u586b\u5beb\u9805\u5c07\u81ea\u52d5\u6392\u9664\u3002\", \"No above-horizon sun was found in this time window. Change the date, latitude or solar hours.\": \"\u5728\u9078\u5b9a\u6642\u9593\u7a97\u53e3\u5167\u592a\u967d\u672a\u5347\u51fa\u5730\u5e73\u7dda\u3002\u8acb\u8abf\u6574\u65e5\u671f\u3001\u7def\u5ea6\u6216\u592a\u967d\u6642\u7bc4\u570d\u3002\", \"No above-horizon sun was found in this time window.\": \"\u5728\u9078\u5b9a\u6642\u9593\u7a97\u53e3\u5167\u672a\u627e\u5230\u5730\u5e73\u7dda\u4ee5\u4e0a\u7684\u6709\u6548\u592a\u967d\u4f4d\u7f6e\u3002\"}, \"es\": {\"Estimated DC capacity\": \"Capacidad CC estimada\", \"First-year generation\": \"Generaci\u00f3n del primer a\u00f1o\", \"Estimated initial investment\": \"Inversi\u00f3n inicial estimada\", \"Project net present value\": \"Valor actual neto (VAN) del proyecto\", \"Front-to-front row pitch\": \"Paso entre filas (pitch)\", \"Longest sampled shadow\": \"Mayor longitud de sombra muestreada\", \"Calculated voltage drop\": \"Ca\u00edda de tensi\u00f3n calculada\", \"Voltage-compatible modules per string\": \"M\u00f3dulos compatibles por string\", \"Estimated avoided emissions\": \"Emisiones evitadas estimadas\", \"Incremental net present value\": \"Valor actual neto incremental\", \"Rear-side irradiation contribution\": \"Contribuci\u00f3n de radiaci\u00f3n trasera\", \"Total modules\": \"M\u00f3dulos totales\", \"all identical roofs\": \"todos los tejados id\u00e9nticos\", \"Rows per roof\": \"Filas por tejado\", \"modules per row\": \"m\u00f3dulos por fila\", \"Usable roof area\": \"\u00c1rea \u00fatil de cubierta\", \"after perimeter setbacks\": \"tras retranqueos perimetrales\", \"Lifetime generation\": \"Generaci\u00f3n en vida \u00fatil\", \"years\": \"a\u00f1os\", \"Annual average\": \"Promedio anual\", \"Final year\": \"\u00daltimo a\u00f1o\", \"Installed cost\": \"Coste instalado\", \"Subtotal\": \"Subtotal\", \"before contingency\": \"antes de imprevistos\", \"Contingency\": \"Imprevistos\", \"of subtotal\": \"del subtotal\", \"Project IRR\": \"TIR del proyecto\", \"pre-tax, annual cash flow\": \"antes de impuestos, flujo anual\", \"Project payback\": \"Recuperaci\u00f3n del proyecto\", \"durable undiscounted recovery\": \"recuperaci\u00f3n no descontada durable\", \"Not recovered\": \"No recuperado\", \"Lifetime project net\": \"Beneficio neto en vida \u00fatil\", \"after initial investment\": \"tras inversi\u00f3n inicial\", \"Equity NPV\": \"VAN del capital propio\", \"discount\": \"descuento\", \"Equity IRR\": \"TIR del capital propio\", \"after annual debt service\": \"tras servicio anual de la deuda\", \"Initial equity\": \"Capital propio inicial\", \"debt\": \"deuda\", \"Clear row gap\": \"Distancia libre entre filas\", \"horizontal edge-to-edge\": \"borde a borde horizontal\", \"Projected row depth\": \"Profundidad proyectada de fila\", \"level-ground footprint\": \"ocupaci\u00f3n en terreno plano\", \"Controlling solar time\": \"Hora solar determinante\", \"sun elevation\": \"elevaci\u00f3n solar\", \"Solar time\": \"Hora solar\", \"at maximum sampled length\": \"en la longitud m\u00e1xima muestreada\", \"Tip east coordinate\": \"Coordenada este del v\u00e9rtice\", \"negative = west\": \"negativo = oeste\", \"Tip north coordinate\": \"Coordenada norte del v\u00e9rtice\", \"negative = south\": \"negativo = sur\", \"Voltage difference\": \"Diferencia de tensi\u00f3n\", \"circuit\": \"circuito\", \"Resistive cable loss\": \"P\u00e9rdida resistiva en cable\", \"at the entered operating current\": \"a la corriente de funcionamiento\", \"Loss \/ load power\": \"P\u00e9rdida \/ potencia de carga\", \"not annual energy loss\": \"no es p\u00e9rdida anual de energ\u00eda\", \"Highest module Voc\": \"Voc m\u00e1x. del m\u00f3dulo\", \"across temperature endpoints\": \"en extremos de temperatura\", \"Lowest module Vmp\": \"Vmp m\u00edn. del m\u00f3dulo\", \"sets minimum string count\": \"fija el m\u00ednimo por string\", \"Highest module Vmp\": \"Vmp m\u00e1x. del m\u00f3dulo\", \"sets MPPT upper count\": \"fija el l\u00edmite de MPPT\", \"Clock \u2192 solar time\": \"Hora reloj \u2192 solar\", \"input interpreted as civil time\": \"entrada como hora oficial\", \"Solar \u2192 clock time\": \"Hora solar \u2192 reloj\", \"input interpreted as solar time\": \"entrada como hora solar\", \"Equation of time\": \"Ecuaci\u00f3n del tiempo\", \"net offset\": \"desfase neto\", \"Grade \u2192 angle\": \"Pendiente \u2192 \u00c1ngulo\", \"Angle \u2192 grade\": \"\u00c1ngulo \u2192 Pendiente\", \"input\": \"entrada\", \"North component\": \"Componente norte\", \"East component\": \"Componente este\", \"from full tilt + azimuth\": \"a partir de inclinaci\u00f3n y acimut\", \"Inverse result\": \"Resultado inverso\", \"tilt\": \"inclinaci\u00f3n\", \"facing azimuth\": \"acimut de orientaci\u00f3n\", \"Incremental IRR\": \"TIR incremental\", \"conventional flows only\": \"solo para flujos convencionales\", \"Lifetime incremental net\": \"Beneficio neto incremental en vida \u00fatil\", \"including extra initial investment\": \"incluye sobrecoste inicial\", \"of front-only equivalent\": \"del equivalente frontal\", \"Use capacity in this project \u2192\": \"Usar capacidad en este proyecto \u2192\", \"Use budget in financial returns \u2192\": \"Usar presupuesto en rentabilidad \u2192\", \"Use clear gap in capacity estimate \u2192\": \"Usar distancia libre en estimaci\u00f3n de capacidad \u2192\", \"Download CSV \u2193\": \"Descargar CSV \u2193\", \"One roof \u2022 \": \"Un tejado \u2022 \", \" rows \u00d7 \": \" filas \u00d7 \", \" modules\": \" m\u00f3dulos\", \"Clear gap \": \"Distancia libre \", \" \u2022 Front-to-front pitch \": \" \u2022 Paso entre filas (pitch) \", \"Object at origin \u2022 Scale \": \"Objeto en el origen \u2022 Escala \", \" m per axis arm\": \" m por eje\", \"Year \": \"A\u00f1o \", \"Year\": \"A\u00f1o\", \"Energy kWh\": \"Energ\u00eda kWh\", \"Savings\": \"Ahorro\", \"Export income\": \"Ingresos exportaci\u00f3n\", \"Operating cost\": \"Coste operativo\", \"Replacement\": \"Reemplazo\", \"Debt payment\": \"Servicio deuda\", \"Project cash\": \"Caja proyecto\", \"Equity cash\": \"Caja capital propio\", \"Equity cumulative\": \"Capital acumulado\", \"East (m)\": \"Este (m)\", \"North (m)\": \"Norte (m)\", \"Length (m)\": \"Longitud (m)\", \"Sun elevation\": \"Elevaci\u00f3n solar\", \"Budget item\": \"Partida\", \"Price \/Wp\": \"Precio \/Wp\", \"Amount\": \"Importe\", \"Additional net cash\": \"Flujo neto adicional\", \"Generation (kWh)\": \"Generaci\u00f3n (kWh)\", \"PV modules\": \"M\u00f3dulos FV\", \"Inverters\": \"Inversores\", \"Mounting\": \"Estructuras\", \"Electrical BOS\": \"BOS el\u00e9ctrico\", \"Installation labour\": \"Mano de obra\", \"Other fixed costs\": \"Otros costes fijos\", \"Total\": \"Total\", \"Voltage-drop check\": \"Comprobaci\u00f3n de ca\u00edda de tensi\u00f3n\", \"Within entered limit\": \"Dentro del l\u00edmite establecido\", \"Exceeds entered limit\": \"Supera el l\u00edmite establecido\", \"Derated current-rating check\": \"Comprobaci\u00f3n de corriente admisible\", \"Not checked \u2014 enter derated ampacity\": \"No comprobado \u2014 introduzca corriente admisible\", \"Within supplied ampacity\": \"Dentro de la capacidad admisible\", \"Exceeds supplied ampacity\": \"Supera la capacidad admisible\", \"Theoretical minimum for voltage drop\": \"M\u00ednimo te\u00f3rico para ca\u00edda de tensi\u00f3n\", \"Standard sections meeting voltage drop\": \"Secciones normalizadas conformes\", \"No listed section up to 630 mm\u00b2\": \"Ninguna secci\u00f3n listada hasta 630 mm\u00b2\", \"Inputs changed. Calculate again to update this result.\": \"Par\u00e1metros modificados. Calcule de nuevo para actualizar este resultado.\", \"Enter your quotations to build a project budget.\": \"Introduzca cotizaciones para generar el presupuesto del proyecto.\", \"Enter investment and project tariffs, then calculate your cash-flow scenario.\": \"Introduzca la inversi\u00f3n y tarifas, luego calcule su flujo de caja.\", \"User-edited capacity or yield. Verify these assumptions for this site.\": \"Capacidad o rendimiento editados por el usuario. Verifique estos supuestos para su ubicaci\u00f3n.\", \"Capacity from the rectangular roof estimate. Yield and tariffs remain your assumptions.\": \"Capacidad importada de la estimaci\u00f3n de cubierta. Rendimiento y tarifas siguen siendo sus supuestos.\", \"Yield imported from the companion NASA POWER climate estimate. Review its model assumptions.\": \"Rendimiento importado de la estimaci\u00f3n clim\u00e1tica NASA POWER complementaria. Revise los supuestos del modelo.\", \"Yield imported from user-supplied irradiation in the companion calculator.\": \"Rendimiento importado a partir de la radiaci\u00f3n personalizada en la calculadora complementaria.\", \"Imported project inputs. Verify the yield source and tariff assumptions before use.\": \"Par\u00e1metros de proyecto importados. Verifique el origen del rendimiento y tarifas antes de su uso.\", \"below-horizon sample(s) excluded. This is a daylight-only result.\": \"muestra(s) bajo el horizonte excluidas. Este resultado es solo para horas de luz.\", \"Sun is close to the horizon. Very long shadows and this approximation become especially sensitive to terrain and atmospheric refraction.\": \"El sol est\u00e1 muy cerca del horizonte. Las sombras largas y esta aproximaci\u00f3n son sensibles al terreno y refracci\u00f3n.\", \"Not reported\": \"No reportado\", \"No feasible range\": \"Sin rango viable\", \"Candidate sections satisfy voltage drop only. \": \"Las secciones candidatas solo cumplen el l\u00edmite de ca\u00edda de tensi\u00f3n. \", \"Ampacity has not been checked.\": \"La corriente admisible no ha sido comprobada.\", \"Ampacity is assessed only against the derated rating you supplied.\": \"La corriente admisible se eval\u00faa \u00fanicamente contra el valor suministrado.\", \"Conceptual packing only. Clearances and row gaps are entered assumptions; obstacles and required access lanes may reduce capacity.\": \"Disposici\u00f3n conceptual \u00fanicamente. Pasillos y obst\u00e1culos pueden reducir la capacidad real.\", \"Yield source: \": \"Origen del rendimiento: \", \"Only the entered line items are included. Request current quotes for a complete procurement budget.\": \"Solo se incluyen las partidas ingresadas. Solicite cotizaciones formales para un presupuesto definitivo.\", \"Year-one savings \": \"Ahorro a\u00f1o 1 \", \"export income \": \"ingresos exportaci\u00f3n \", \"Self-use is a fixed \": \"El autoconsumo es un \", \"assumption.\": \"de supuesto.\", \"\u201cNot reported\u201d IRR means there is no conventional, uniquely reportable investment root. A negative later cash flow (for example a replacement) suppresses IRR; use NPV and the full cash-flow table to assess the scenario.\": \"TIR no reportada indica flujos no convencionales. Flujos negativos posteriores suprimen la TIR; utilice el VAN.\", \"Equity payback: \": \"Recuperaci\u00f3n de capital propio: \", \"not recovered in the analysis period\": \"no recuperado en el per\u00edodo de an\u00e1lisis\", \"Payback is the first cumulative recovery that remains nonnegative through the modeled horizon. No taxes, subsidies or residual value included.\": \"El plazo de recuperaci\u00f3n es el primer a\u00f1o con flujo acumulado positivo duradero. No incluye impuestos ni subsidios.\", \"For the selected date and front-of-array direct sun only, with 5-minute sampling. Check every relevant seasonal condition for the final layout.\": \"V\u00e1lido para la fecha seleccionada con sol frontal, muestreo cada 5 min. Compruebe condiciones estacionales.\", \"Voltage screening only. Check maximum input current, startup requirements, tolerances and applicable safety margins separately.\": \"Comprobaci\u00f3n de tensi\u00f3n \u00fanicamente. Compruebe corriente m\u00e1xima y arranque por separado.\", \"Based solely on your entered displaced electricity and grid emission factor. Record the factor source and accounting period with the project.\": \"Basado \u00fanicamente en la energ\u00eda desplazada y factor ingresados.\", \"This is an irradiation ratio, not a full electrical yield model.\": \"Es una relaci\u00f3n de radiaci\u00f3n, no un modelo de generaci\u00f3n el\u00e9ctrica completo.\", \"LuminVolt solar planning tools\": \"Herramientas de planificaci\u00f3n solar LuminVolt\", \"Model\": \"Modelo\", \"Independent preliminary estimate\": \"Estimaci\u00f3n preliminar independiente\", \"Assumptions\": \"Supuestos\", \"See calculation method on the tool page\": \"Ver m\u00e9todo de c\u00e1lculo en la p\u00e1gina de la herramienta\", \"Currency\": \"Moneda\", \"Project assumptions source\": \"Origen de supuestos del proyecto\", \"Enter \": \"Introduzca \", \"Enter a valid date.\": \"Introduzca una fecha v\u00e1lida.\", \"Enter at least one equipment quotation, unit cost or fixed expense. Blank items are excluded.\": \"Introduzca al menos una cotizaci\u00f3n de equipo o gasto fijo.\", \"No above-horizon sun was found in this time window. Change the date, latitude or solar hours.\": \"No se encontr\u00f3 sol sobre el horizonte en esta ventana de tiempo. Modifique fecha o latitud.\", \"No above-horizon sun was found in this time window.\": \"No se encontr\u00f3 sol sobre el horizonte en esta franja horaria.\"}, \"fr\": {\"Estimated DC capacity\": \"Puissance CC estim\u00e9e\", \"First-year generation\": \"Production de 1re ann\u00e9e\", \"Estimated initial investment\": \"Investissement initial estim\u00e9\", \"Project net present value\": \"Valeur actuelle nette (VAN) du projet\", \"Front-to-front row pitch\": \"Entraxe entre rang\u00e9es (pitch)\", \"Longest sampled shadow\": \"Plus longue ombre \u00e9chantillonn\u00e9e\", \"Calculated voltage drop\": \"Chute de tension calcul\u00e9e\", \"Voltage-compatible modules per string\": \"Modules compatibles par cha\u00eene\", \"Estimated avoided emissions\": \"\u00c9missions \u00e9vit\u00e9es estim\u00e9es\", \"Incremental net present value\": \"Valeur actuelle nette diff\u00e9rentielle\", \"Rear-side irradiation contribution\": \"Gain d'irradiation face arri\u00e8re\", \"Total modules\": \"Modules totaux\", \"all identical roofs\": \"toutes toitures identiques\", \"Rows per roof\": \"Rang\u00e9es par toiture\", \"modules per row\": \"modules par rang\u00e9e\", \"Usable roof area\": \"Surface utile de toiture\", \"after perimeter setbacks\": \"apr\u00e8s marges p\u00e9riph\u00e9riques\", \"Lifetime generation\": \"Production cumul\u00e9e sur la dur\u00e9e de vie\", \"years\": \"ans\", \"Annual average\": \"Moyenne annuelle\", \"Final year\": \"Derni\u00e8re ann\u00e9e\", \"Installed cost\": \"Co\u00fbt install\u00e9\", \"Subtotal\": \"Sous-total\", \"before contingency\": \"avant impr\u00e9vus\", \"Contingency\": \"Impr\u00e9vus\", \"of subtotal\": \"du sous-total\", \"Project IRR\": \"TRI du projet\", \"pre-tax, annual cash flow\": \"avant imp\u00f4ts, flux annuel\", \"Project payback\": \"Retour sur investissement\", \"durable undiscounted recovery\": \"retour sur investissement simple\", \"Not recovered\": \"Non r\u00e9cup\u00e9r\u00e9\", \"Lifetime project net\": \"B\u00e9n\u00e9fice net cumul\u00e9\", \"after initial investment\": \"apr\u00e8s investissement initial\", \"Equity NPV\": \"VAN sur fonds propres\", \"discount\": \"actualisation\", \"Equity IRR\": \"TRI sur fonds propres\", \"after annual debt service\": \"apr\u00e8s service annuel de la dette\", \"Initial equity\": \"Fonds propres initiaux\", \"debt\": \"dette\", \"Clear row gap\": \"\u00c9cartement libre entre rang\u00e9es\", \"horizontal edge-to-edge\": \"bord \u00e0 bord horizontal\", \"Projected row depth\": \"Profondeur projet\u00e9e de rang\u00e9e\", \"level-ground footprint\": \"emprise sur sol plat\", \"Controlling solar time\": \"Heure solaire critique\", \"sun elevation\": \"hauteur du soleil\", \"Solar time\": \"Heure solaire\", \"at maximum sampled length\": \"\u00e0 la longueur maximale \u00e9chantillonn\u00e9e\", \"Tip east coordinate\": \"Coordonn\u00e9e est de l'ombre\", \"negative = west\": \"n\u00e9gatif = ouest\", \"Tip north coordinate\": \"Coordonn\u00e9e nord de l'ombre\", \"negative = south\": \"n\u00e9gatif = sud\", \"Voltage difference\": \"Diff\u00e9rence de tension\", \"circuit\": \"circuit\", \"Resistive cable loss\": \"Pertes ohmiques c\u00e2ble (I\u00b2R)\", \"at the entered operating current\": \"au courant de fonctionnement\", \"Loss \/ load power\": \"Perte \/ puissance de charge\", \"not annual energy loss\": \"non annuel\", \"Highest module Voc\": \"Voc max. du module\", \"across temperature endpoints\": \"sur plage thermique\", \"Lowest module Vmp\": \"Vmp min. du module\", \"sets minimum string count\": \"d\u00e9finit le min. par cha\u00eene\", \"Highest module Vmp\": \"Vmp max. du module\", \"sets MPPT upper count\": \"d\u00e9finit le max. MPPT\", \"Clock \u2192 solar time\": \"Heure l\u00e9gale \u2192 solaire\", \"input interpreted as civil time\": \"entr\u00e9e comme heure l\u00e9gale\", \"Solar \u2192 clock time\": \"Heure solaire \u2192 l\u00e9gale\", \"input interpreted as solar time\": \"entr\u00e9e comme heure solaire\", \"Equation of time\": \"\u00c9quation du temps\", \"net offset\": \"d\u00e9calage net\", \"Grade \u2192 angle\": \"Pente \u2192 Angle\", \"Angle \u2192 grade\": \"Angle \u2192 Pente\", \"input\": \"saisie\", \"North component\": \"Composante nord\", \"East component\": \"Composante est\", \"from full tilt + azimuth\": \"depuis inclinaison et azimut\", \"Inverse result\": \"R\u00e9sultat inverse\", \"tilt\": \"inclinaison\", \"facing azimuth\": \"azimut d'orientation\", \"Incremental IRR\": \"TRI diff\u00e9rentiel\", \"conventional flows only\": \"flux conventionnels uniquement\", \"Lifetime incremental net\": \"Gain net diff\u00e9rentiel cumul\u00e9\", \"including extra initial investment\": \"surco\u00fbt initial inclus\", \"of front-only equivalent\": \"de l'\u00e9quivalent face avant\", \"Use capacity in this project \u2192\": \"Appliquer cette puissance au projet \u2192\", \"Use budget in financial returns \u2192\": \"Appliquer ce budget \u00e0 la rentabilit\u00e9 \u2192\", \"Use clear gap in capacity estimate \u2192\": \"Appliquer cet espacement \u00e0 la puissance \u2192\", \"Download CSV \u2193\": \"T\u00e9l\u00e9charger CSV \u2193\", \"One roof \u2022 \": \"Une toiture \u2022 \", \" rows \u00d7 \": \" rang\u00e9es \u00d7 \", \" modules\": \" modules\", \"Clear gap \": \"\u00c9cartement libre \", \" \u2022 Front-to-front pitch \": \" \u2022 Entraxe entre rang\u00e9es \", \"Object at origin \u2022 Scale \": \"Objet \u00e0 l'origine \u2022 \u00c9chelle \", \" m per axis arm\": \" m par axe\", \"Year \": \"Ann\u00e9e \", \"Year\": \"Ann\u00e9e\", \"Energy kWh\": \"\u00c9nergie kWh\", \"Savings\": \"\u00c9conomies\", \"Export income\": \"Revenus export\", \"Operating cost\": \"Charges d'exploitation\", \"Replacement\": \"Remplacement\", \"Debt payment\": \"Remboursement emprunt\", \"Project cash\": \"Tr\u00e9sorerie projet\", \"Equity cash\": \"Tr\u00e9sorerie fonds propres\", \"Equity cumulative\": \"Fonds propres cumul\u00e9s\", \"East (m)\": \"Est (m)\", \"North (m)\": \"Nord (m)\", \"Length (m)\": \"Longueur (m)\", \"Sun elevation\": \"Hauteur soleil\", \"Budget item\": \"Poste\", \"Price \/Wp\": \"Prix \/Wc\", \"Amount\": \"Montant\", \"Additional net cash\": \"Flux net additionnel\", \"Generation (kWh)\": \"Production (kWh)\", \"PV modules\": \"Modules PV\", \"Inverters\": \"Onduleurs\", \"Mounting\": \"Structures\", \"Electrical BOS\": \"BOS \u00e9lectrique\", \"Installation labour\": \"Main-d'\u0153uvre\", \"Other fixed costs\": \"Autres co\u00fbts fixes\", \"Total\": \"Total\", \"Voltage-drop check\": \"Contr\u00f4le de chute de tension\", \"Within entered limit\": \"Conforme \u00e0 la limite saisie\", \"Exceeds entered limit\": \"D\u00e9passe la limite saisie\", \"Derated current-rating check\": \"Contr\u00f4le de l'intensit\u00e9 admissible\", \"Not checked \u2014 enter derated ampacity\": \"Non contr\u00f4l\u00e9 \u2014 saisissez l'intensit\u00e9 admissible\", \"Within supplied ampacity\": \"Conforme \u00e0 l'intensit\u00e9 admissible\", \"Exceeds supplied ampacity\": \"D\u00e9passe l'intensit\u00e9 admissible\", \"Theoretical minimum for voltage drop\": \"Minimum th\u00e9orique pour la chute de tension\", \"Standard sections meeting voltage drop\": \"Sections standard conformes\", \"No listed section up to 630 mm\u00b2\": \"Aucune section standard jusqu'\u00e0 630 mm\u00b2\", \"Inputs changed. Calculate again to update this result.\": \"Param\u00e8tres modifi\u00e9s. Relancez le calcul pour mettre \u00e0 jour ce r\u00e9sultat.\", \"Enter your quotations to build a project budget.\": \"Saisissez vos devis pour \u00e9tablir le budget du projet.\", \"Enter investment and project tariffs, then calculate your cash-flow scenario.\": \"Saisissez l'investissement et les tarifs, puis calculez votre tr\u00e9sorerie.\", \"User-edited capacity or yield. Verify these assumptions for this site.\": \"Puissance ou productible modifi\u00e9s par l'utilisateur. V\u00e9rifiez ces hypoth\u00e8ses pour ce site.\", \"Capacity from the rectangular roof estimate. Yield and tariffs remain your assumptions.\": \"Puissance import\u00e9e de l'estimation en toiture. Le productible et les tarifs restent vos hypoth\u00e8ses.\", \"Yield imported from the companion NASA POWER climate estimate. Review its model assumptions.\": \"Productible import\u00e9 depuis l'outil NASA POWER associ\u00e9. Consultez les hypoth\u00e8ses du mod\u00e8le.\", \"Yield imported from user-supplied irradiation in the companion calculator.\": \"Productible import\u00e9 \u00e0 partir de l'irradiation personnalis\u00e9e dans le calculateur associ\u00e9.\", \"Imported project inputs. Verify the yield source and tariff assumptions before use.\": \"Param\u00e8tres de projet import\u00e9s. V\u00e9rifiez la source du productible et les tarifs avant utilisation.\", \"below-horizon sample(s) excluded. This is a daylight-only result.\": \"\u00e9chantillon(s) sous l'horizon exclus. Ce r\u00e9sultat s'applique uniquement aux heures de jour.\", \"Sun is close to the horizon. Very long shadows and this approximation become especially sensitive to terrain and atmospheric refraction.\": \"Le soleil est proche de l'horizon. Les ombres tr\u00e8s allong\u00e9es sont particuli\u00e8rement sensibles au relief et \u00e0 la r\u00e9fraction.\", \"Not reported\": \"Non communiqu\u00e9\", \"No feasible range\": \"Aucune plage viable\", \"Candidate sections satisfy voltage drop only. \": \"Les sections retenues respectent uniquement la chute de tension. \", \"Ampacity has not been checked.\": \"L'intensit\u00e9 admissible n'a pas \u00e9t\u00e9 contr\u00f4l\u00e9e.\", \"Ampacity is assessed only against the derated rating you supplied.\": \"L'intensit\u00e9 admissible est \u00e9valu\u00e9e uniquement sur la valeur saisie.\", \"Conceptual packing only. Clearances and row gaps are entered assumptions; obstacles and required access lanes may reduce capacity.\": \"Implantation th\u00e9orique. Obstacles et acc\u00e8s peuvent r\u00e9duire la capacit\u00e9 r\u00e9elle.\", \"Yield source: \": \"Origine du productible : \", \"Only the entered line items are included. Request current quotes for a complete procurement budget.\": \"Seules les lignes renseign\u00e9es sont incluses. Demandez des devis r\u00e9els pour un budget complet.\", \"Year-one savings \": \"\u00c9conomies An 1 \", \"export income \": \"revenus export \", \"Self-use is a fixed \": \"L'autoconsommation est une hypoth\u00e8se de \", \"assumption.\": \"fixe.\", \"\u201cNot reported\u201d IRR means there is no conventional, uniquely reportable investment root. A negative later cash flow (for example a replacement) suppresses IRR; use NPV and the full cash-flow table to assess the scenario.\": \"TRI non communiqu\u00e9 pour flux non conventionnels. Consultez la VAN et le tableau complet.\", \"Equity payback: \": \"Retour sur fonds propres : \", \"not recovered in the analysis period\": \"non amorti sur la p\u00e9riode d'analyse\", \"Payback is the first cumulative recovery that remains nonnegative through the modeled horizon. No taxes, subsidies or residual value included.\": \"L'amortissement correspond \u00e0 la premi\u00e8re ann\u00e9e de tr\u00e9sorerie cumul\u00e9e positive durable. Hors taxes et aides.\", \"For the selected date and front-of-array direct sun only, with 5-minute sampling. Check every relevant seasonal condition for the final layout.\": \"Valable pour la date choisie et soleil frontal, pas de 5 min.\", \"Voltage screening only. Check maximum input current, startup requirements, tolerances and applicable safety margins separately.\": \"Pr\u00e9dimensionnement en tension. V\u00e9rifiez courants et tension de d\u00e9marrage s\u00e9par\u00e9ment.\", \"Based solely on your entered displaced electricity and grid emission factor. Record the factor source and accounting period with the project.\": \"Bas\u00e9 sur les kWh substitu\u00e9s et le facteur d'\u00e9mission saisis.\", \"This is an irradiation ratio, not a full electrical yield model.\": \"Ratio d'irradiation indicatif, pas une mod\u00e9lisation \u00e9lectrique compl\u00e8te.\", \"LuminVolt solar planning tools\": \"Outils de planification solaire LuminVolt\", \"Model\": \"Mod\u00e8le\", \"Independent preliminary estimate\": \"Estimation pr\u00e9liminaire ind\u00e9pendante\", \"Assumptions\": \"Hypoth\u00e8ses\", \"See calculation method on the tool page\": \"Voir la m\u00e9thode de calcul sur la page de l'outil\", \"Currency\": \"Devise\", \"Project assumptions source\": \"Source des hypoth\u00e8ses du projet\", \"Enter \": \"Veuillez saisir \", \"Enter a valid date.\": \"Veuillez saisir une date valide.\", \"Enter at least one equipment quotation, unit cost or fixed expense. Blank items are excluded.\": \"Veuillez saisir au moins un devis ou co\u00fbt fixe.\", \"No above-horizon sun was found in this time window. Change the date, latitude or solar hours.\": \"Aucun soleil au-dessus de l'horizon sur cette plage. Modifiez la date ou latitude.\", \"No above-horizon sun was found in this time window.\": \"Aucun soleil au-dessus de l'horizon sur cette plage horaire.\"}, \"de\": {\"Estimated DC capacity\": \"Gesch\u00e4tzte DC-Leistung\", \"First-year generation\": \"Erzeugung im 1. Jahr\", \"Estimated initial investment\": \"Gesch\u00e4tzte Gesamtinvestition\", \"Project net present value\": \"Projekt-Kapitalwert (NPV)\", \"Front-to-front row pitch\": \"Reihenabstand (Pitch)\", \"Longest sampled shadow\": \"L\u00e4ngster erfasster Schatten\", \"Calculated voltage drop\": \"Berechneter Spannungsabfall\", \"Voltage-compatible modules per string\": \"Spannungskompatible Module pro String\", \"Estimated avoided emissions\": \"Gesch\u00e4tzte CO\u2082-Einsparung\", \"Incremental net present value\": \"Differenz-Kapitalwert (NPV)\", \"Rear-side irradiation contribution\": \"Bifazialer Einstrahlungsgewinn\", \"Total modules\": \"Module gesamt\", \"all identical roofs\": \"alle identischen D\u00e4cher\", \"Rows per roof\": \"Reihen pro Dach\", \"modules per row\": \"Module pro Reihe\", \"Usable roof area\": \"Nutzbare Dachfl\u00e4che\", \"after perimeter setbacks\": \"nach Randabst\u00e4nden\", \"Lifetime generation\": \"Gesamterzeugung \u00fcber Lebensdauer\", \"years\": \"Jahre\", \"Annual average\": \"Jahresdurchschnitt\", \"Final year\": \"Letztes Betriebsjahr\", \"Installed cost\": \"Installationskosten\", \"Subtotal\": \"Zwischensumme\", \"before contingency\": \"vor Unvorhergesehenem\", \"Contingency\": \"Unvorhergesehenes\", \"of subtotal\": \"der Zwischensumme\", \"Project IRR\": \"Projekt-IRR\", \"pre-tax, annual cash flow\": \"vor Steuern, j\u00e4hrlicher Cashflow\", \"Project payback\": \"Projekt-Amortisationszeit\", \"durable undiscounted recovery\": \"dauerhafte ungedeckte Amortisation\", \"Not recovered\": \"Nicht amortisiert\", \"Lifetime project net\": \"Kumulierter Netto-Projektgewinn\", \"after initial investment\": \"nach Anfangsinvestition\", \"Equity NPV\": \"Eigenkapital-Kapitalwert (NPV)\", \"discount\": \"Diskontsatz\", \"Equity IRR\": \"Eigenkapital-IRR\", \"after annual debt service\": \"nach j\u00e4hrlichem Schuldendienst\", \"Initial equity\": \"Anf\u00e4ngliches Eigenkapital\", \"debt\": \"Kredit\", \"Clear row gap\": \"Lichter Reihenabstand\", \"horizontal edge-to-edge\": \"horizontal von Kante zu Kante\", \"Projected row depth\": \"Projizierte Reihentiefe\", \"level-ground footprint\": \"Grundfl\u00e4che auf ebenem Boden\", \"Controlling solar time\": \"Ma\u00dfgebliche Sonnenzeit\", \"sun elevation\": \"Sonnenh\u00f6he\", \"Solar time\": \"Sonnenzeit\", \"at maximum sampled length\": \"bei maximal erfasster L\u00e4nge\", \"Tip east coordinate\": \"Ost-Koordinate der Schattenspitze\", \"negative = west\": \"negativ = West\", \"Tip north coordinate\": \"Nord-Koordinate der Schattenspitze\", \"negative = south\": \"negativ = S\u00fcd\", \"Voltage difference\": \"Spannungsdifferenz\", \"circuit\": \"Stromkreis\", \"Resistive cable loss\": \"Leitungsverlust (I\u00b2R)\", \"at the entered operating current\": \"beim angegebenen Betriebsstrom\", \"Loss \/ load power\": \"Verlust \/ Lastleistung\", \"not annual energy loss\": \"kein Jahresenergieverlust\", \"Highest module Voc\": \"H\u00f6chste Modul-Voc\", \"across temperature endpoints\": \"bei tiefster Temperatur\", \"Lowest module Vmp\": \"Niedrigste Modul-Vmp\", \"sets minimum string count\": \"definiert Mindestmodulzahl\", \"Highest module Vmp\": \"H\u00f6chste Modul-Vmp\", \"sets MPPT upper count\": \"definiert MPPT-Obergrenze\", \"Clock \u2192 solar time\": \"Zivilzeit \u2192 Sonnenzeit\", \"input interpreted as civil time\": \"Eingabe als Zivilzeit\", \"Solar \u2192 clock time\": \"Sonnenzeit \u2192 Zivilzeit\", \"input interpreted as solar time\": \"Eingabe als Sonnenzeit\", \"Equation of time\": \"Zeitgleichung\", \"net offset\": \"Netto-Abweichung\", \"Grade \u2192 angle\": \"Steigung \u2192 Winkel\", \"Angle \u2192 grade\": \"Winkel \u2192 Steigung\", \"input\": \"Eingabe\", \"North component\": \"Nord-Komponente\", \"East component\": \"Ost-Komponente\", \"from full tilt + azimuth\": \"aus Gesamtwinkel und Azimut\", \"Inverse result\": \"Invertiertes Ergebnis\", \"tilt\": \"Neigung\", \"facing azimuth\": \"Ausrichtungsazimut\", \"Incremental IRR\": \"Differenz-IRR\", \"conventional flows only\": \"nur f\u00fcr konventionelle Zahlungsreihen\", \"Lifetime incremental net\": \"Kumulierter Differenz-Nettogewinn\", \"including extra initial investment\": \"inklusive Mehrinvestition\", \"of front-only equivalent\": \"des Vorderseiten-\u00c4quivalents\", \"Use capacity in this project \u2192\": \"Leistung f\u00fcr dieses Projekt \u00fcbernehmen \u2192\", \"Use budget in financial returns \u2192\": \"Budget in Wirtschaftlichkeitsrechnung \u00fcbernehmen \u2192\", \"Use clear gap in capacity estimate \u2192\": \"Reihenabstand in Kapazit\u00e4tssch\u00e4tzung \u00fcbernehmen \u2192\", \"Download CSV \u2193\": \"CSV herunterladen \u2193\", \"One roof \u2022 \": \"Ein Dach \u2022 \", \" rows \u00d7 \": \" Reihen \u00d7 \", \" modules\": \" Module\", \"Clear gap \": \"Lichter Abstand \", \" \u2022 Front-to-front pitch \": \" \u2022 Reihenabstand (Pitch) \", \"Object at origin \u2022 Scale \": \"Objekt im Ursprung \u2022 Skalierung \", \" m per axis arm\": \" m pro Achsenschenkel\", \"Year \": \"Jahr \", \"Year\": \"Jahr\", \"Energy kWh\": \"Energie kWh\", \"Savings\": \"Kosteneinsparung\", \"Export income\": \"Einspeiseerl\u00f6s\", \"Operating cost\": \"Betriebskosten\", \"Replacement\": \"Ersatzinvestition\", \"Debt payment\": \"Schuldendienst\", \"Project cash\": \"Projekt-Cashflow\", \"Equity cash\": \"Eigenkapital-Cashflow\", \"Equity cumulative\": \"Kumuliertes Eigenkapital\", \"East (m)\": \"Ost (m)\", \"North (m)\": \"Nord (m)\", \"Length (m)\": \"L\u00e4nge (m)\", \"Sun elevation\": \"Sonnenh\u00f6he\", \"Budget item\": \"Position\", \"Price \/Wp\": \"Preis \/Wp\", \"Amount\": \"Betrag\", \"Additional net cash\": \"Zus\u00e4tzlicher Netto-Cashflow\", \"Generation (kWh)\": \"Erzeugung (kWh)\", \"PV modules\": \"PV-Module\", \"Inverters\": \"Wechselrichter\", \"Mounting\": \"Montagesystem\", \"Electrical BOS\": \"Elektrische BOS\", \"Installation labour\": \"Installation\", \"Other fixed costs\": \"Sonstige Fixkosten\", \"Total\": \"Gesamt\", \"Voltage-drop check\": \"Spannungsfall-Pr\u00fcfung\", \"Within entered limit\": \"Innerhalb des Grenzwerts\", \"Exceeds entered limit\": \"Grenzwert \u00fcberschritten\", \"Derated current-rating check\": \"Pr\u00fcfung der Strombelastbarkeit\", \"Not checked \u2014 enter derated ampacity\": \"Nicht gepr\u00fcft \u2014 bitte Belastbarkeit eingeben\", \"Within supplied ampacity\": \"Innerhalb der angegebenen Belastbarkeit\", \"Exceeds supplied ampacity\": \"Belastbarkeit \u00fcberschritten\", \"Theoretical minimum for voltage drop\": \"Theoretischer Mindestquerschnitt f\u00fcr Spannungsfall\", \"Standard sections meeting voltage drop\": \"Normquerschnitte, die den Spannungsfall erf\u00fcllen\", \"No listed section up to 630 mm\u00b2\": \"Kein Normquerschnitt bis 630 mm\u00b2 ausreichend\", \"Inputs changed. Calculate again to update this result.\": \"Eingaben ge\u00e4ndert. Erneut berechnen, um das Ergebnis zu aktualisieren.\", \"Enter your quotations to build a project budget.\": \"Geben Sie Angebote ein, um ein Projektbudget zu erstellen.\", \"Enter investment and project tariffs, then calculate your cash-flow scenario.\": \"Geben Sie Investition und Tarife ein und berechnen Sie Ihren Cashflow.\", \"User-edited capacity or yield. Verify these assumptions for this site.\": \"Manuell angepasste Leistung oder Ertrag. Bitte Annahmen f\u00fcr diesen Standort pr\u00fcfen.\", \"Capacity from the rectangular roof estimate. Yield and tariffs remain your assumptions.\": \"Leistung aus der Dachentwurfsberechnung \u00fcbernommen. Ertrag und Strompreise bleiben Ihre Annahmen.\", \"Yield imported from the companion NASA POWER climate estimate. Review its model assumptions.\": \"Ertrag aus dem erg\u00e4nzenden NASA POWER Klimarechner importiert. Bitte Modellannahmen pr\u00fcfen.\", \"Yield imported from user-supplied irradiation in the companion calculator.\": \"Ertrag aus benutzerdefinierter Einstrahlung des erg\u00e4nzenden Rechners importiert.\", \"Imported project inputs. Verify the yield source and tariff assumptions before use.\": \"Projektparameter importiert. \u00dcberpr\u00fcfen Sie Ertragsquelle und Strompreise vor der Verwendung.\", \"below-horizon sample(s) excluded. This is a daylight-only result.\": \"Messpunkt(e) unter dem Horizont ausgeschlossen. Ergebnis gilt nur f\u00fcr Tageslicht.\", \"Sun is close to the horizon. Very long shadows and this approximation become especially sensitive to terrain and atmospheric refraction.\": \"Die Sonne steht tief am Horizont. Sehr lange Schatten und diese N\u00e4herung reagieren sensibel auf Gel\u00e4ndeunebenheiten und Lichtbrechung.\", \"Not reported\": \"Nicht ausgewiesen\", \"No feasible range\": \"Kein realisierbarer Bereich\", \"Candidate sections satisfy voltage drop only. \": \"Vorgeschlagene Querschnitte erf\u00fcllen nur das Spannungsfallkriterium. \", \"Ampacity has not been checked.\": \"Strombelastbarkeit wurde nicht gepr\u00fcft.\", \"Ampacity is assessed only against the derated rating you supplied.\": \"Strombelastbarkeit wird nur mit dem eingegebenen Wert verglichen.\", \"Conceptual packing only. Clearances and row gaps are entered assumptions; obstacles and required access lanes may reduce capacity.\": \"Reine Konzeptbelegung. Hindernisse und G\u00e4nge k\u00f6nnen die Kapazit\u00e4t mindern.\", \"Yield source: \": \"Ertragsquelle: \", \"Only the entered line items are included. Request current quotes for a complete procurement budget.\": \"Nur ausgef\u00fcllte Positionen enthalten. Angebote f\u00fcr verbindliches Budget einholen.\", \"Year-one savings \": \"Einsparung Jahr 1 \", \"export income \": \"Einspeiseerl\u00f6s \", \"Self-use is a fixed \": \"Eigenverbrauch ist eine Annahme von \", \"assumption.\": \"fest.\", \"\u201cNot reported\u201d IRR means there is no conventional, uniquely reportable investment root. A negative later cash flow (for example a replacement) suppresses IRR; use NPV and the full cash-flow table to assess the scenario.\": \"Keine eindeutige IRR bei nicht-konventionellen Zahlungsreihen. Nutzen Sie den Kapitalwert (NPV).\", \"Equity payback: \": \"Eigenkapital-Amortisation: \", \"not recovered in the analysis period\": \"nicht amortisiert im Betrachtungszeitraum\", \"Payback is the first cumulative recovery that remains nonnegative through the modeled horizon. No taxes, subsidies or residual value included.\": \"Amortisation ist der erste Zeitpunkt mit dauerhaft positivem kumuliertem Cashflow. Ohne Steuern und F\u00f6rderung.\", \"For the selected date and front-of-array direct sun only, with 5-minute sampling. Check every relevant seasonal condition for the final layout.\": \"Nur f\u00fcr gew\u00e4hltes Datum und Frontalstrahlung, 5-Minuten-Raster.\", \"Voltage screening only. Check maximum input current, startup requirements, tolerances and applicable safety margins separately.\": \"Nur Spannungspr\u00fcfung. Str\u00f6me und Startspannung separat pr\u00fcfen.\", \"Based solely on your entered displaced electricity and grid emission factor. Record the factor source and accounting period with the project.\": \"Basiert ausschlie\u00dflich auf verdr\u00e4ngtem Strom und Emissionsfaktor.\", \"This is an irradiation ratio, not a full electrical yield model.\": \"Strahlungsverh\u00e4ltnis, kein vollst\u00e4ndiges Ertragsmodell.\", \"LuminVolt solar planning tools\": \"LuminVolt Solar-Planungstools\", \"Model\": \"Modell\", \"Independent preliminary estimate\": \"Unabh\u00e4ngige Vorabsch\u00e4tzung\", \"Assumptions\": \"Annahmen\", \"See calculation method on the tool page\": \"Siehe Berechnungsmethode auf der Werkzeugseite\", \"Currency\": \"W\u00e4hrung\", \"Project assumptions source\": \"Quelle der Projektannahmen\", \"Enter \": \"Bitte eingeben: \", \"Enter a valid date.\": \"Bitte ein g\u00fcltiges Datum eingeben.\", \"Enter at least one equipment quotation, unit cost or fixed expense. Blank items are excluded.\": \"Geben Sie mindestens ein Angebot oder Fixkosten ein.\", \"No above-horizon sun was found in this time window. Change the date, latitude or solar hours.\": \"Keine Sonne \u00fcber dem Horizont in diesem Zeitfenster. Datum oder Breite \u00e4ndern.\", \"No above-horizon sun was found in this time window.\": \"Keine Sonne \u00fcber dem Horizont in diesem Zeitfenster gefunden.\"}, \"nl\": {\"Estimated DC capacity\": \"Geschatte DC-capaciteit\", \"First-year generation\": \"Opwekking eerste jaar\", \"Estimated initial investment\": \"Geschatte initi\u00eble investering\", \"Project net present value\": \"Netto contante waarde (NCW\/NPV)\", \"Front-to-front row pitch\": \"Hart-op-hart rijafstand (pitch)\", \"Longest sampled shadow\": \"Langste gemeten schaduw\", \"Calculated voltage drop\": \"Berekende spanningsval\", \"Voltage-compatible modules per string\": \"Compatibele panelen per string\", \"Estimated avoided emissions\": \"Geschatte vermeden uitstoot\", \"Incremental net present value\": \"Incrementele netto contante waarde\", \"Rear-side irradiation contribution\": \"Bifaciale instralingsbijdrage\", \"Total modules\": \"Totaal aantal panelen\", \"all identical roofs\": \"alle identieke daken\", \"Rows per roof\": \"Rijen per dak\", \"modules per row\": \"panelen per rij\", \"Usable roof area\": \"Bruikbaar dakoppervlak\", \"after perimeter setbacks\": \"na randafstanden\", \"Lifetime generation\": \"Totale levensduur-opwekking\", \"years\": \"jaar\", \"Annual average\": \"Jaarlijks gemiddelde\", \"Final year\": \"Laatste jaar\", \"Installed cost\": \"Installatiekosten per Wp\", \"Subtotal\": \"Subtotaal\", \"before contingency\": \"v\u00f3\u00f3r onvoorzien\", \"Contingency\": \"Onvoorzien\", \"of subtotal\": \"van subtotaal\", \"Project IRR\": \"Project-IRR\", \"pre-tax, annual cash flow\": \"v\u00f3\u00f3r belastingen, jaarlijkse kasstroom\", \"Project payback\": \"Projectterugverdientijd\", \"durable undiscounted recovery\": \"duurzame onverdisconteerde terugverdientijd\", \"Not recovered\": \"Niet terugverdiend\", \"Lifetime project net\": \"Totale netto projectwinst\", \"after initial investment\": \"na initi\u00eble investering\", \"Equity NPV\": \"Eigen vermogen NCW\/NPV\", \"discount\": \"discontovoet\", \"Equity IRR\": \"Eigen vermogen IRR\", \"after annual debt service\": \"na jaarlijkse schuldendienst\", \"Initial equity\": \"Aanvankelijk eigen vermogen\", \"debt\": \"lening\", \"Clear row gap\": \"Vrije rijafstand\", \"horizontal edge-to-edge\": \"horizontaal van rand tot rand\", \"Projected row depth\": \"Geprojecteerde rijdiepte\", \"level-ground footprint\": \"grondoppervlak op vlak terrein\", \"Controlling solar time\": \"Bepalende zonnetijd\", \"sun elevation\": \"zonshoogte\", \"Solar time\": \"Zonnetijd\", \"at maximum sampled length\": \"bij maximaal gemeten lengte\", \"Tip east coordinate\": \"Oostco\u00f6rdinaat schaduwpunt\", \"negative = west\": \"negatief = west\", \"Tip north coordinate\": \"Noordco\u00f6rdinaat schaduwpunt\", \"negative = south\": \"negatief = zuid\", \"Voltage difference\": \"Spanningsverschil\", \"circuit\": \"circuit\", \"Resistive cable loss\": \"Kabelverlies (I\u00b2R)\", \"at the entered operating current\": \"bij opgegeven bedrijfsstroom\", \"Loss \/ load power\": \"Verlies \/ belastingsvermogen\", \"not annual energy loss\": \"geen jaarlijks energieverlies\", \"Highest module Voc\": \"Hoogste module Voc\", \"across temperature endpoints\": \"bij laagste temperatuur\", \"Lowest module Vmp\": \"Laagste module Vmp\", \"sets minimum string count\": \"bepaalt minimum per string\", \"Highest module Vmp\": \"Hoogste module Vmp\", \"sets MPPT upper count\": \"bepaalt MPPT-bovengrens\", \"Clock \u2192 solar time\": \"Kloktijd \u2192 zonnetijd\", \"input interpreted as civil time\": \"invoer als kloktijd\", \"Solar \u2192 clock time\": \"Zonnetijd \u2192 kloktijd\", \"input interpreted as solar time\": \"invoer als zonnetijd\", \"Equation of time\": \"Tijdvereffening\", \"net offset\": \"netto afwijking\", \"Grade \u2192 angle\": \"Helling \u2192 Hoek\", \"Angle \u2192 grade\": \"Hoek \u2192 Helling\", \"input\": \"invoer\", \"North component\": \"Noord-component\", \"East component\": \"Oost-component\", \"from full tilt + azimuth\": \"uit totale helling en azimut\", \"Inverse result\": \"Omgekeerd resultaat\", \"tilt\": \"helling\", \"facing azimuth\": \"ori\u00ebntatie-azimut\", \"Incremental IRR\": \"Incrementele IRR\", \"conventional flows only\": \"alleen voor conventionele kasstromen\", \"Lifetime incremental net\": \"Totale incrementele nettowinst\", \"including extra initial investment\": \"inclusief extra initi\u00eble investering\", \"of front-only equivalent\": \"van equivalent voorzijde\", \"Use capacity in this project \u2192\": \"Gebruik capaciteit in dit project \u2192\", \"Use budget in financial returns \u2192\": \"Gebruik budget in financieel rendement \u2192\", \"Use clear gap in capacity estimate \u2192\": \"Gebruik vrije ruimte in capaciteitsschatting \u2192\", \"Download CSV \u2193\": \"Download CSV \u2193\", \"One roof \u2022 \": \"E\u00e9n dak \u2022 \", \" rows \u00d7 \": \" rijen \u00d7 \", \" modules\": \" panelen\", \"Clear gap \": \"Vrije ruimte \", \" \u2022 Front-to-front pitch \": \" \u2022 Hart-op-hart afstand \", \"Object at origin \u2022 Scale \": \"Obstakel op oorsprong \u2022 Schaal \", \" m per axis arm\": \" m per as\", \"Year \": \"Jaar \", \"Year\": \"Jaar\", \"Energy kWh\": \"Energie kWh\", \"Savings\": \"Besparing\", \"Export income\": \"Terugleveropbrengst\", \"Operating cost\": \"Operationele kosten\", \"Replacement\": \"Vervanging\", \"Debt payment\": \"Leningaflossing &#038; rente\", \"Project cash\": \"Projectcashflow\", \"Equity cash\": \"Eigen-vermogenscashflow\", \"Equity cumulative\": \"Cumulatief eigen vermogen\", \"East (m)\": \"Oost (m)\", \"North (m)\": \"Noord (m)\", \"Length (m)\": \"Lengte (m)\", \"Sun elevation\": \"Zonshoogte\", \"Budget item\": \"Post\", \"Price \/Wp\": \"Prijs \/Wp\", \"Amount\": \"Bedrag\", \"Additional net cash\": \"Extra netto kasstroom\", \"Generation (kWh)\": \"Opwekking (kWh)\", \"PV modules\": \"PV-panelen\", \"Inverters\": \"Omvormers\", \"Mounting\": \"Montagesysteem\", \"Electrical BOS\": \"Elektrische BOS\", \"Installation labour\": \"Installatiearbeid\", \"Other fixed costs\": \"Overige vaste kosten\", \"Total\": \"Totaal\", \"Voltage-drop check\": \"Controle spanningsval\", \"Within entered limit\": \"Binnen de gestelde limiet\", \"Exceeds entered limit\": \"Overschrijdt de gestelde limiet\", \"Derated current-rating check\": \"Controle toelaatbare stroomsterkte\", \"Not checked \u2014 enter derated ampacity\": \"Niet gecontroleerd \u2014 voer toelaatbare stroom in\", \"Within supplied ampacity\": \"Binnen de opgegeven toelaatbare stroom\", \"Exceeds supplied ampacity\": \"Overschrijdt toelaatbare stroom\", \"Theoretical minimum for voltage drop\": \"Theoretisch minimum voor spanningsval\", \"Standard sections meeting voltage drop\": \"Standaard doorsnedes die voldoen aan de spanningsval\", \"No listed section up to 630 mm\u00b2\": \"Geen standaard doorsnede tot 630 mm\u00b2 voldoet\", \"Inputs changed. Calculate again to update this result.\": \"Invoer gewijzigd. Bereken opnieuw om dit resultaat bij te werken.\", \"Enter your quotations to build a project budget.\": \"Voer offertes in om een projectbudget op te stellen.\", \"Enter investment and project tariffs, then calculate your cash-flow scenario.\": \"Voer investering en tarieven in en bereken uw cashflow.\", \"User-edited capacity or yield. Verify these assumptions for this site.\": \"Door gebruiker aangepaste capaciteit of opbrengst. Controleer aannames voor deze locatie.\", \"Capacity from the rectangular roof estimate. Yield and tariffs remain your assumptions.\": \"Capaciteit overgenomen uit de dakberekening. Opbrengst en tarieven blijven uw aannames.\", \"Yield imported from the companion NASA POWER climate estimate. Review its model assumptions.\": \"Opbrengst ge\u00efmporteerd uit de bijbehorende NASA POWER tool. Controleer de aannames van het model.\", \"Yield imported from user-supplied irradiation in the companion calculator.\": \"Opbrengst ge\u00efmporteerd uit handmatig ingevoerde instraling in de bijbehorende tool.\", \"Imported project inputs. Verify the yield source and tariff assumptions before use.\": \"Ge\u00efmporteerde projectparameters. Controleer opbrengstbron en tarieven voor gebruik.\", \"below-horizon sample(s) excluded. This is a daylight-only result.\": \"meetpunt(en) onder de horizon uitgesloten. Dit resultaat geldt alleen bij daglicht.\", \"Sun is close to the horizon. Very long shadows and this approximation become especially sensitive to terrain and atmospheric refraction.\": \"De zon staat dicht bij de horizon. Zeer lange schaduwen en deze benadering zijn gevoelig voor terrein en atmosferische refractie.\", \"Not reported\": \"Niet gerapporteerd\", \"No feasible range\": \"Geen haalbaar bereik\", \"Candidate sections satisfy voltage drop only. \": \"Geschikte doorsnedes voldoen uitsluitend aan de spanningsvaleis. \", \"Ampacity has not been checked.\": \"Toelaatbare stroomsterkte is niet gecontroleerd.\", \"Ampacity is assessed only against the derated rating you supplied.\": \"Stroomsterkte wordt alleen getoetst aan de ingevoerde waarde.\", \"Conceptual packing only. Clearances and row gaps are entered assumptions; obstacles and required access lanes may reduce capacity.\": \"Alleen conceptuele beleging. Obstakels en paden kunnen de capaciteit verminderen.\", \"Yield source: \": \"Bron van opbrengst: \", \"Only the entered line items are included. Request current quotes for a complete procurement budget.\": \"Alleen ingevulde posten zijn meegenomen. Vraag offertes voor een definitief budget.\", \"Year-one savings \": \"Besparing jaar 1 \", \"export income \": \"terugleveropbrengst \", \"Self-use is a fixed \": \"Zelfconsumptie is een aanname van \", \"assumption.\": \"vast.\", \"\u201cNot reported\u201d IRR means there is no conventional, uniquely reportable investment root. A negative later cash flow (for example a replacement) suppresses IRR; use NPV and the full cash-flow table to assess the scenario.\": \"IRR niet gerapporteerd bij niet-conventionele kasstromen. Raadpleeg de NCW\/NPV.\", \"Equity payback: \": \"Terugverdientijd eigen vermogen: \", \"not recovered in the analysis period\": \"niet terugverdiend binnen analyseperiode\", \"Payback is the first cumulative recovery that remains nonnegative through the modeled horizon. No taxes, subsidies or residual value included.\": \"Terugverdientijd is het eerste jaar met blijvend positieve cumulatieve kasstroom. Exclusief belastingen en subsidies.\", \"For the selected date and front-of-array direct sun only, with 5-minute sampling. Check every relevant seasonal condition for the final layout.\": \"Alleen voor gekozen datum en zon aan voorzijde, 5-minuten interval.\", \"Voltage screening only. Check maximum input current, startup requirements, tolerances and applicable safety margins separately.\": \"Alleen spanningscontrole. Controleer stroomsterkte en startspanning afzonderlijk.\", \"Based solely on your entered displaced electricity and grid emission factor. Record the factor source and accounting period with the project.\": \"Uitsluitend gebaseerd op ingevoerde stroom en emissiefactor.\", \"This is an irradiation ratio, not a full electrical yield model.\": \"Instralingsverhouding, geen compleet elektrotechnisch opbrengstmodel.\", \"LuminVolt solar planning tools\": \"LuminVolt zonne-energie planningstools\", \"Model\": \"Model\", \"Independent preliminary estimate\": \"Onafhankelijke voorlopige schatting\", \"Assumptions\": \"Aannames\", \"See calculation method on the tool page\": \"Zie berekeningsmethode op de toolpagina\", \"Currency\": \"Valuta\", \"Project assumptions source\": \"Bron van projectaannames\", \"Enter \": \"Voer \", \"Enter a valid date.\": \"Voer een geldige datum in.\", \"Enter at least one equipment quotation, unit cost or fixed expense. Blank items are excluded.\": \"Voer minimaal \u00e9\u00e9n offerte of vaste kostenpost in.\", \"No above-horizon sun was found in this time window. Change the date, latitude or solar hours.\": \"Geen zon boven horizon gevonden in dit tijdsvenster. Wijzig datum of breedtegraad.\", \"No above-horizon sun was found in this time window.\": \"Geen zon boven de horizon gevonden in dit tijdsvenster.\"}};\n  const langAttr = (document.documentElement.lang || '').toLowerCase();\n  const pathLang = ['zh', 'es', 'fr', 'de', 'nl'].find(function(l) { return location.pathname.indexOf('\/' + l + '\/') === 0 || location.pathname === '\/' + l; });\n  const lang = pathLang || (langAttr.startsWith('zh') ? 'zh' : langAttr.startsWith('es') ? 'es' : langAttr.startsWith('fr') ? 'fr' : langAttr.startsWith('de') ? 'de' : langAttr.startsWith('nl') ? 'nl' : 'en');\n  const locale = { zh: 'zh-TW', es: 'es-ES', fr: 'fr-FR', de: 'de-DE', nl: 'nl-NL', en: 'en-US' }[lang] || 'en-US';\n  const t = k => (I18N[lang] && I18N[lang][k]) || k;\n\n  const $ = k => root.querySelector('#lvp-' + k);\n  const val = k => { const el = $(k); return el ? el.value : ''; };\n  const num = k => { if (val(k).trim() === '') { const lbl = root.querySelector('label[for=\"lvp-' + k + '\"]'); const name = lbl ? lbl.textContent.trim() : k; throw new Error(t('Enter ') + name + '.'); } return Number(val(k)); };\n  const optional = k => val(k).trim() === '' ? 0 : Number(val(k));\n  const esc = v => String(v).replace(\/[&<>\"']\/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]));\n  const fmt = (v,d=0) => Number.isFinite(v) ? new Intl.NumberFormat(locale,{maximumFractionDigits:d,minimumFractionDigits:d}).format(v) : '\u2014';\n  const money = (v,d=0) => esc(val('currency')) + ' ' + fmt(v,d);\n  const percent = v => v === null ? t('Not reported') : fmt(v*100,2)+'%';\n  const clock = (hour,day=0) => { let minutes=Math.round(hour*60); day+=Math.floor(minutes\/1440); minutes=((minutes%1440)+1440)%1440; return String(Math.floor(minutes\/60)).padStart(2,'0')+':'+String(minutes%60).padStart(2,'0')+(day ? ' ('+(day>0?'+':'')+day+' day)' : ''); };\n  const hour = k => {const parts=val(k).split(':');return Number(parts[0])+Number(parts[1])\/60;};\n  function day(k) {const s=val(k).split('-').map(Number); if(s.length!==3 || !s[0]) throw new Error(t('Enter a valid date.')); const date=new Date(Date.UTC(s[0],s[1]-1,s[2])); let n=Math.round((date-Date.UTC(s[0],0,0))\/86400000); const leap=new Date(Date.UTC(s[0],1,29)).getUTCMonth()===1; if(leap && n>59)n--; return Math.min(365,n);}\n  const sunIcon='<svg viewBox=\"0 0 70 70\" aria-hidden=\"true\"><circle cx=\"35\" cy=\"35\" r=\"13\"\/><path d=\"M35 2v12m0 42v12M2 35h12m42 0h12M12 12l9 9m28 28 9 9M12 58l9-9m28-28 9-9\"\/><\/svg>';\n  const hero=(label,value,unit='')=>'<div class=\"lvp-primary-result\"><div><p>'+esc(label)+'<\/p><strong>'+value+(unit?' <small>'+esc(unit)+'<\/small>':'')+'<\/strong><\/div>'+sunIcon+'<\/div>';\n  const metrics=items=>'<div class=\"lvp-metrics\">'+items.map(i=>'<div class=\"lvp-metric\"><span>'+esc(i[0])+'<\/span><strong>'+i[1]+'<\/strong><small>'+esc(i[2]||'')+'<\/small><\/div>').join('')+'<\/div>';\n  const caption=text=>'<p class=\"lvp-caption\">'+text+'<\/p>';\n  const banner=text=>'<p class=\"lvp-banner\">'+text+'<\/p>';\n  const action=(key,text)=>'<button type=\"button\" class=\"lvp-secondary\" data-action=\"'+key+'\">'+text+'<\/button>';\n  const table=(headers,rows)=>'<div class=\"lvp-table-scroll\"><table class=\"lvp-table\"><thead><tr>'+headers.map(x=>'<th scope=\"col\">'+esc(x)+'<\/th>').join('')+'<\/tr><\/thead><tbody>'+rows.map(r=>'<tr>'+r.map(x=>'<td>'+x+'<\/td>').join('')+'<\/tr>').join('')+'<\/tbody><\/table><\/div>';\n  const resultActions=(name,more='')=>'<div class=\"lvp-result-actions\">'+more+action('csv-'+name,t('Download CSV \u2193'))+'<\/div>';\n  const outputs=new Map(), csvs=new Map();\n  let active='capacity', capacityResult=null, costResult=null, spacingResult=null;\n\n  function csvRecord(key,headers,rows) {\n    const form=root.querySelector('[data-tool=\"'+key+'\"]');\n    if(!form)return;\n    const originEl=$('project-origin');\n    let metadata=[[t('LuminVolt solar planning tools'),key],[t('Model'),t('Independent preliminary estimate')],[t('Assumptions'),t('See calculation method on the tool page')],[t('Currency'),val('currency')],[t('Project assumptions source'),originEl?originEl.textContent.trim():'']];\n    ['kw','yield','retail','export','self'].forEach(k=>{\n      const lbl=root.querySelector('label[for=\"lvp-'+k+'\"]');\n      metadata.push([lbl?lbl.textContent.trim():k,val(k)]);\n    });\n    form.querySelectorAll('input:not([type=\"hidden\"]),select').forEach(el=>{\n      if(!el.id)return;\n      const lbl=root.querySelector('label[for=\"'+el.id+'\"]');\n      metadata.push([lbl?lbl.textContent.trim():(el.name||el.id),el.value]);\n    });\n    csvs.set(key,[...metadata,[],headers,...rows]);\n  }\n\n  function globalValid(tool) {const keys=tool==='returns'?['kw','yield','self','retail','export']:tool==='energy'?['kw','yield']:tool==='cost'?['kw']:[];for(const key of keys) {if(!$(key).checkValidity()) {$(key).reportValidity();return false;}}return true;}\n  function tariff(key,used) {return used>0 ? num(key) : optional(key);}\n\n  function drawRoof(r) {\n    const scale=Math.min(540\/num('roof-width'),190\/num('roof-length')),w=num('roof-width')*scale,h=num('roof-length')*scale,x=(600-w)\/2,y=20;\n    let rects='';const mw=(val('orientation')==='portrait'?num('module-width'):num('module-length'))*scale;\n    const gap=num('roof-gap')*scale,depth=r.projectedLength*scale,startX=x+num('setback')*scale,startY=y+num('setback')*scale;\n    if(r.rows*r.perRow<=500) for(let i=0;i<r.rows;i++)for(let j=0;j<r.perRow;j++)rects+='<rect x=\"'+(startX+j*mw+.5)+'\" y=\"'+(startY+i*(depth+gap)+.5)+'\" width=\"'+Math.max(.1,mw-1)+'\" height=\"'+Math.max(.1,depth-1)+'\" rx=\"1\" fill=\"#386e58\" stroke=\"#a1c6a8\" stroke-width=\".5\"\/>';\n    else rects='<rect x=\"'+startX+'\" y=\"'+startY+'\" width=\"'+r.occupiedWidth*scale+'\" height=\"'+r.occupiedLength*scale+'\" fill=\"#386e58\"\/>';\n    return '<div class=\"lvp-drawing\"><svg viewBox=\"0 0 600 250\" role=\"img\" aria-label=\"Simplified plan view of one roof. Exact module counts are listed above.\"><rect x=\"'+x+'\" y=\"'+y+'\" width=\"'+w+'\" height=\"'+h+'\" fill=\"#dee9d8\" stroke=\"#afc7a5\"\/>'+rects+'<text x=\"300\" y=\"240\" text-anchor=\"middle\" font-size=\"11\" fill=\"#5f7c5b\">'+t('One roof \u2022 ')+fmt(r.rows)+t(' rows \u00d7 ')+fmt(r.perRow)+t(' modules')+'<\/text><\/svg><\/div>';\n  }\n\n  function drawSpacing(r) {\n    const scale=Math.min(500\/Math.max(r.pitch+r.projection,.1),130\/Math.max(r.height,.1)), start=45, base=185;\n    const row=x=>'<path d=\"M'+x+' '+base+' l'+r.projection*scale+' '+(-r.height*scale)+'\" stroke=\"#236746\" stroke-width=\"7\"\/>';\n    return '<div class=\"lvp-drawing\"><svg viewBox=\"0 0 600 240\" role=\"img\" aria-label=\"Side view: row height, horizontal projection and clear gap on level ground\"><path d=\"M20 190h560\" stroke=\"#8cae84\"\/>'+row(start)+row(start+r.pitch*scale)+'<path d=\"M'+(start+r.projection*scale)+' '+(base-r.height*scale)+' L'+(start+r.pitch*scale)+' '+base+'\" stroke=\"#cd9b4d\" stroke-width=\"2\" stroke-dasharray=\"5 5\"\/><text x=\"300\" y=\"222\" text-anchor=\"middle\" font-size=\"11\" fill=\"#5f7c5b\">'+t('Clear gap ')+fmt(r.gap,2)+' m \u2022 '+t('Front-to-front pitch ')+fmt(r.pitch,2)+' m<\/text><\/svg><\/div>';\n  }\n\n  function drawShadow(r) {\n    const max=Math.max(1,...r.rows.flatMap(x=>[Math.abs(x.xEast),Math.abs(x.yNorth)])),s=90\/max;\n    const points=r.rows.map(x=>(300+x.xEast*s)+','+(120-x.yNorth*s)).join(' ');\n    return '<div class=\"lvp-drawing\"><svg viewBox=\"0 0 600 250\" role=\"img\" aria-label=\"Plan view of the shadow tip path. Up is north; right is east. Exact coordinates are in the table.\"><path d=\"M180 120h240m-120-105v210\" stroke=\"#aac5a0\"\/><text x=\"302\" y=\"15\" font-size=\"10\" fill=\"#63805e\">N<\/text><text x=\"425\" y=\"122\" font-size=\"10\" fill=\"#63805e\">E<\/text>'+r.rows.map(x=>'<path d=\"M300 120 L'+(300+x.xEast*s)+' '+(120-x.yNorth*s)+'\" stroke=\"#d9e5d0\"\/>').join('')+'<polyline points=\"'+points+'\" fill=\"none\" stroke=\"#1a7951\" stroke-width=\"2.5\"\/><circle cx=\"300\" cy=\"120\" r=\"4\" fill=\"#254d37\"\/><text x=\"300\" y=\"243\" text-anchor=\"middle\" font-size=\"10\" fill=\"#63805e\">'+t('Object at origin \u2022 Scale ')+fmt(90\/s,1)+t(' m per axis arm')+'<\/text><\/svg><\/div>';\n  }\n\n  function nightNotes(r) {\n    return (r.nightSamples?banner(r.nightSamples+' '+t('below-horizon sample(s) excluded. This is a daylight-only result.')):'')+(r.nearHorizon?banner(t('Sun is close to the horizon. Very long shadows and this approximation become especially sensitive to terrain and atmospheric refraction.')):'');\n  }\n\n  function render(key) {\n    switch(key) {\n      case 'capacity': {\n        const r=P.capacity({length:num('roof-length'),width:num('roof-width'),setback:num('setback'),moduleLength:num('module-length'),moduleWidth:num('module-width'),moduleW:num('module-w'),tilt:num('roof-tilt'),gap:num('roof-gap'),orientation:val('orientation'),roofs:num('roofs')});capacityResult=r;\n        csvRecord(key,[t('Total modules'),t('Estimated DC capacity')+' kWp',t('Rows per roof'),t('modules per row'),t('all identical roofs')],[ [r.modules,r.kw,r.rows,r.perRow,r.roofs] ]);\n        return hero(t('Estimated DC capacity'),fmt(r.kw,2),'kWp')+metrics([[t('Total modules'),fmt(r.modules),t('all identical roofs')],[t('Rows per roof'),fmt(r.rows),fmt(r.perRow)+' '+t('modules per row')],[t('Usable roof area'),fmt(r.usableArea,1)+' m\u00b2',t('after perimeter setbacks')]])+drawRoof(r)+caption(t('Conceptual packing only. Clearances and row gaps are entered assumptions; obstacles and required access lanes may reduce capacity.'))+resultActions(key, r.kw>0?action('use-capacity',t('Use capacity in this project \u2192')):'');\n      }\n      case 'energy': {\n        const r=P.generation({kw:num('kw'),yieldKwh:num('yield'),years:num('energy-years'),degradation:num('energy-deg')\/100});\n        csvRecord(key,[t('Year'),t('Energy kWh')],r.rows.map(x=>[x.year,x.energy]));\n        const max=r.firstYearEnergy;\n        return hero(t('First-year generation'),fmt(r.firstYearEnergy),'kWh')+metrics([[t('Lifetime generation'),fmt(r.totalEnergy\/1000,1)+' MWh',num('energy-years')+' '+t('years')],[t('Annual average'),fmt(r.totalEnergy\/r.years),'kWh\/'+t('year')],[t('Final year'),fmt(r.rows[r.rows.length-1].energy),'kWh']])+'<div class=\"lvp-bars\" role=\"img\" aria-label=\"Yearly energy declines by the entered annual degradation. Values are in the table.\">'+r.rows.map(x=>'<span style=\"height:'+(100*x.energy\/max)+'%\" title=\"'+t('Year ')+x.year+': '+fmt(x.energy)+' kWh\"><\/span>').join('')+'<\/div><div class=\"lvp-chart-labels\"><span>'+t('Year ')+'1<\/span><span>'+t('Year ')+r.years+'<\/span><\/div>'+table([t('Year'),t('Generation (kWh)')],r.rows.map(x=>[x.year,fmt(x.energy,1)]))+resultActions(key)+caption(t('Yield source: ')+esc($('project-origin')?$('project-origin').textContent.trim():''));\n      }\n      case 'cost': {\n        const keys=[['modules',t('PV modules')],['inverters',t('Inverters')],['mounting',t('Mounting')],['electrical',t('Electrical BOS')],['labour',t('Installation labour')]];\n        if(keys.every(([k])=>val('cost-'+k)==='') && optional('cost-fixed')===0) throw new Error(t('Enter at least one equipment quotation, unit cost or fixed expense. Blank items are excluded.'));\n        const r=P.cost({kw:num('kw'),rates:keys.map(([k,name])=>({name,perW:optional('cost-'+k)})),fixed:num('cost-fixed'),contingency:num('contingency')\/100});costResult=r;\n        const rows=r.items.map(x=>[x.name,fmt(x.perW,3),money(x.amount,2)]);rows.push([t('Other fixed costs'),'\u2014',money(r.fixed,2)],[t('Contingency'),'\u2014',money(r.contingencyAmount,2)],[t('Total'),'',money(r.total,2)]);\n        csvRecord(key,[t('Budget item'),t('Price \/Wp'),t('Amount')+' '+val('currency')],[...r.items.map(x=>[x.name,x.perW,x.amount]),[t('Other fixed costs'),'',r.fixed],[t('Contingency'),'',r.contingencyAmount],[t('Total'),'',r.total]]);\n        return hero(t('Estimated initial investment'),money(r.total))+metrics([[t('Installed cost'),money(r.perW,3),'\/Wp'],[t('Subtotal'),money(r.subtotal),t('before contingency')],[t('Contingency'),money(r.contingencyAmount),fmt(num('contingency'),1)+'% '+t('of subtotal')]])+table([t('Budget item'),t('Price \/Wp'),t('Amount')],rows)+resultActions(key,action('use-cost',t('Use budget in financial returns \u2192')))+caption(t('Only the entered line items are included. Request current quotes for a complete procurement budget.'));\n      }\n      case 'returns': {\n        const share=num('self')\/100;\n        const r=P.finance({capex:num('capex'),firstYearEnergy:num('kw')*num('yield'),selfUse:share,retail:tariff('retail',share),exportRate:tariff('export',1-share),years:num('finance-years'),degradation:num('finance-deg')\/100,escalation:num('escalation')\/100,opex:num('opex'),opexEscalation:num('opex-escalation')\/100,discount:num('discount')\/100,loanShare:num('loan-share')\/100,interest:num('interest')\/100,loanYears:num('loan-years'),replacementYear:num('replacement-year'),replacementCost:num('replacement-cost')});\n        const rows=r.rows.map(x=>[x.year,fmt(x.energy),money(x.savings),money(x.revenue),money(x.operatingCost),money(x.replacement),money(x.debtService),money(x.projectCashflow),money(x.equityCashflow),money(x.cumulativeEquity)]);\n        const headers=[t('Year'),t('Energy kWh'),t('Savings'),t('Export income'),t('Operating cost'),t('Replacement'),t('Debt payment'),t('Project cash'),t('Equity cash'),t('Equity cumulative')];\n        csvRecord(key,headers,[ [0,0,0,0,0,0,0,-num('capex'),-r.initialEquity,-r.initialEquity],...r.rows.map(x=>[x.year,x.energy,x.savings,x.revenue,x.operatingCost,x.replacement,x.debtService,x.projectCashflow,x.equityCashflow,x.cumulativeEquity])]);\n        return hero(t('Project net present value'),money(r.npvProject))+metrics([[t('Project IRR'),percent(r.irrProject),t('pre-tax, annual cash flow')],[t('Project payback'),r.paybackProject===null?t('Not recovered'):fmt(r.paybackProject,1)+' '+t('years'),t('durable undiscounted recovery')],[t('Lifetime project net'),money(r.lifetimeProjectNet),t('after initial investment')]])+metrics([[t('Equity NPV'),money(r.npvEquity),t('discount')+' '+fmt(num('discount'),1)+'%'],[t('Equity IRR'),percent(r.irrEquity),t('after annual debt service')],[t('Initial equity'),money(r.initialEquity),t('debt')+' '+money(r.loanPrincipal)]])+banner(t('Year-one savings ')+money(r.rows[0].savings)+' + '+t('export income ')+money(r.rows[0].revenue)+'. '+t('Self-use is a fixed ')+fmt(num('self'),1)+'% '+t('assumption.'))+(r.irrProject===null||r.irrEquity===null?caption(t('\u201cNot reported\u201d IRR means there is no conventional, uniquely reportable investment root. A negative later cash flow (for example a replacement) suppresses IRR; use NPV and the full cash-flow table to assess the scenario.')):'')+table(headers,[[0,'\u2014','\u2014','\u2014','\u2014','\u2014','\u2014',money(-num('capex')),money(-r.initialEquity),money(-r.initialEquity)],...rows])+resultActions(key)+caption(t('Equity payback: ')+(r.paybackEquity===null?t('not recovered in the analysis period'):fmt(r.paybackEquity,1)+' '+t('years'))+'. '+t('Payback is the first cumulative recovery that remains nonnegative through the modeled horizon. No taxes, subsidies or residual value included.'));\n      }\n      case 'spacing': {\n        const r=E.spacing({latitude:num('latitude'),day:day('date'),start:hour('start'),end:hour('end'),width:num('row-width'),tilt:num('row-tilt'),azimuth:num('azimuth')});spacingResult=r;\n        if(!r.available) throw new Error(t('No above-horizon sun was found in this time window. Change the date, latitude or solar hours.'));\n        csvRecord(key,[t('Solar time'),t('Clear row gap')+' m',t('sun elevation')+' deg','Azimuth deg'],r.samples.map(x=>[clock(x.hour),x.gap,x.elevation,x.azimuth]));\n        return hero(t('Front-to-front row pitch'),fmt(r.pitch,2),'m')+metrics([[t('Clear row gap'),fmt(r.gap,2)+' m',t('horizontal edge-to-edge')],[t('Projected row depth'),fmt(r.projection,2)+' m',t('level-ground footprint')],[t('Controlling solar time'),clock(r.worstTime),fmt(r.elevation,1)+'\u00b0 '+t('sun elevation')]])+nightNotes(r)+drawSpacing(r)+resultActions(key,action('use-spacing',t('Use clear gap in capacity estimate \u2192')))+caption(t('For the selected date and front-of-array direct sun only, with 5-minute sampling. Check every relevant seasonal condition for the final layout.'));\n      }\n      case 'shading': {\n        const r=E.shadow({latitude:num('shade-latitude'),day:day('shade-date'),start:hour('shade-start'),end:hour('shade-end'),height:num('obstacle-height')});\n        if(!r.available) throw new Error(t('No above-horizon sun was found in this time window.'));\n        csvRecord(key,[t('Solar time'),t('Tip east coordinate')+' m',t('Tip north coordinate')+' m',t('Length (m)'),t('sun elevation')+' deg'],r.rows.map(x=>[clock(x.hour),x.xEast,x.yNorth,x.length,x.elevation]));\n        return hero(t('Longest sampled shadow'),fmt(r.maxLength,2),'m')+metrics([[t('Solar time'),clock(r.longest.hour),t('at maximum sampled length')],[t('Tip east coordinate'),fmt(r.longest.xEast,2)+' m',t('negative = west')],[t('Tip north coordinate'),fmt(r.longest.yNorth,2)+' m',t('negative = south')]])+nightNotes(r)+drawShadow(r)+table([t('Solar time'),t('East (m)'),t('North (m)'),t('Length (m)'),t('Sun elevation')],r.rows.map(x=>[clock(x.hour),fmt(x.xEast,2),fmt(x.yNorth,2),fmt(x.length,2),fmt(x.elevation,1)+'\u00b0']))+resultActions(key);\n      }\n      case 'cable': {\n        const p={type:val('circuit'),material:val('material'),length:num('cable-length'),current:num('current'),voltage:num('voltage'),section:num('section'),temperature:num('conductor-temp'),powerFactor:num('power-factor'),maxDrop:num('max-drop')};if(val('ampacity')!=='')p.ampacity=num('ampacity');const r=E.cable(p);\n        const rows=[[t('Voltage-drop check'),r.voltageStatus==='pass'?t('Within entered limit'):t('Exceeds entered limit')],[t('Derated current-rating check'),r.ampacityStatus==='notchecked'?t('Not checked \u2014 enter derated ampacity'):r.ampacityStatus==='pass'?t('Within supplied ampacity'):t('Exceeds supplied ampacity')],[t('Theoretical minimum for voltage drop'),fmt(r.minSectionDrop,2)+' mm\u00b2'],[t('Standard sections meeting voltage drop'),r.candidates.length?r.candidates.join(', ')+' mm\u00b2':t('No listed section up to 630 mm\u00b2')]];\n        csvRecord(key,['Quantity','Value'],[['Voltage drop V',r.dropV],['Voltage drop percent',r.dropPercent],['Resistive loss W',r.lossW],['Loss percent of load power',r.lossPercent],['Minimum section voltage drop mm2',r.minSectionDrop],['Voltage status',r.voltageStatus],['Ampacity status',r.ampacityStatus],['Candidate sections mm2',r.candidates.join(';')]]);\n        return hero(t('Calculated voltage drop'),fmt(r.dropPercent,2),'%')+metrics([[t('Voltage difference'),fmt(r.dropV,2)+' V',fmt(num('voltage'))+' V '+t('circuit')],[t('Resistive cable loss'),fmt(r.lossW,1)+' W',t('at the entered operating current')],[t('Loss \/ load power'),fmt(r.lossPercent,2)+'%',t('not annual energy loss')]])+table([t('Check')||'Check',t('Result')||'Result'],rows)+banner(t('Candidate sections satisfy voltage drop only. ')+(r.ampacityStatus==='notchecked'?t('Ampacity has not been checked.'):t('Ampacity is assessed only against the derated rating you supplied.')))+resultActions(key);\n      }\n      case 'strings': {\n        const r=E.stringRange({voc:num('voc'),vmp:num('vmp'),vocCoeff:num('voc-coeff'),vmpCoeff:num('vmp-coeff'),minTemp:num('min-temp'),maxTemp:num('max-temp'),maxDc:num('max-dc'),mpptMin:num('mppt-min'),mpptMax:num('mppt-max')});\n        csvRecord(key,['Minimum modules','Maximum modules','Feasible','Max Voc module V','Min Vmp module V','Max Vmp module V'],[[r.min,r.max,r.feasible,r.maxVoc,r.minVmp,r.maxVmp]]);\n        return hero(t('Voltage-compatible modules per string'),r.feasible?fmt(r.min)+'\u2013'+fmt(r.max):t('No feasible range'))+metrics([[t('Highest module Voc'),fmt(r.maxVoc,2)+' V',t('across temperature endpoints')],[t('Lowest module Vmp'),fmt(r.minVmp,2)+' V',t('sets minimum string count')],[t('Highest module Vmp'),fmt(r.maxVmp,2)+' V',t('sets MPPT upper count')]])+caption(t('Voltage screening only. Check maximum input current, startup requirements, tolerances and applicable safety margins separately.'))+resultActions(key);\n      }\n      case 'solar-time': {\n        const r=E.solarTime({day:day('solar-date'),longitude:num('longitude'),timezone:num('timezone'),hour:hour('clock-hour')});\n        csvRecord(key,['Clock input to solar time','Solar input to clock time','Equation of time min','Net solar offset min'],[[clock(r.solarHour,r.solarDayOffset),clock(r.clockHourFromSolar,r.clockDayOffset),r.equationOfTime,r.offsetMinutes]]);\n        return metrics([[t('Clock \u2192 solar time'),clock(r.solarHour,r.solarDayOffset),t('input interpreted as civil time')],[t('Solar \u2192 clock time'),clock(r.clockHourFromSolar,r.clockDayOffset),t('input interpreted as solar time')],[t('Equation of time'),fmt(r.equationOfTime,2)+' min',t('net offset')+' '+fmt(r.offsetMinutes,2)+' min']])+resultActions(key);\n      }\n      case 'slope': {\n        const a=E.slope({grade:num('grade')}),b=E.slope({angle:num('slope-angle')});csvRecord(key,['Grade input percent','Angle result deg','Angle input deg','Grade result percent'],[[a.grade,a.angle,b.angle,b.grade]]);\n        return metrics([[t('Grade \u2192 angle'),fmt(a.angle,3)+'\u00b0',fmt(a.grade,2)+'% '+t('input')],[t('Angle \u2192 grade'),fmt(b.grade,3)+'%',fmt(b.angle,2)+'\u00b0 '+t('input')]])+resultActions(key);\n      }\n      case 'components': {\n        const a=E.tiltComponents({tilt:num('component-tilt'),azimuth:num('component-az')}),b=E.inverseTilt({north:num('component-north'),east:num('component-east')});\n        csvRecord(key,['North component deg','East component deg','Inverse tilt deg','Inverse azimuth deg'],[[a.north,a.east,b.tilt,b.azimuth]]);\n        return metrics([[t('North component'),fmt(a.north,2)+'\u00b0',t('from full tilt + azimuth')],[t('East component'),fmt(a.east,2)+'\u00b0',t('from full tilt + azimuth')],[t('Inverse result'),fmt(b.tilt,2)+'\u00b0 '+t('tilt'),fmt(b.azimuth,2)+'\u00b0 '+t('facing azimuth')]])+resultActions(key);\n      }\n      case 'emissions': {\n        const r=E.emissions({energy:num('emission-energy'),factor:num('emission-factor')});csvRecord(key,['Avoided kg CO2e','Avoided tonnes CO2e'],[[r.kg,r.tonnes]]);\n        return hero(t('Estimated avoided emissions'),fmt(r.tonnes,2),'t CO\u2082e\/year')+caption(t('Based solely on your entered displaced electricity and grid emission factor. Record the factor source and accounting period with the project.'))+resultActions(key);\n      }\n      case 'comparison': {\n        const n=num('increment-years'),capex=num('increment-cost'),benefit=num('increment-benefit'),op=num('increment-opex'),deg=num('increment-deg')\/100,disc=num('increment-discount')\/100;\n        const flows=[-capex];for(let y=1;y<=n;y++)flows.push(benefit*Math.pow(1-deg,y-1)-op);\n        csvRecord(key,['Year','Incremental cash flow '+val('currency')],flows.map((x,i)=>[i,x]));\n        return hero(t('Incremental net present value'),money(P.npv(flows,disc)))+metrics([[t('Incremental IRR'),percent(P.irr(flows)),t('conventional flows only')],[t('Lifetime incremental net'),money(flows.reduce((a,b)=>a+b,0)),t('including extra initial investment')]])+table([t('Year'),t('Additional net cash')],flows.map((x,i)=>[i,money(x,2)]))+resultActions(key);\n      }\n      case 'bifacial': {\n        const r=E.bifacial({front:num('front'),rear:num('rear'),bifaciality:num('bifaciality')});csvRecord(key,['Irradiance contribution gain percent','Equivalent irradiation kWh\/m2'],[[r.gainPercent,r.equivalentIrradiation]]);\n        return hero(t('Rear-side irradiation contribution'),fmt(r.gainPercent,2),'% '+t('of front-only equivalent'))+caption(t('Equivalent irradiation ')+fmt(r.equivalentIrradiation,1)+' kWh\/m\u00b2. '+t('This is an irradiation ratio, not a full electrical yield model.'))+resultActions(key);\n      }\n    }\n    return '';\n  }\n\n  function run(key,report=true) {\n    const form=root.querySelector('[data-tool=\"'+key+'\"]');if(!form)return;\n    if(!globalValid(key))return;\n    if(!form.checkValidity()){if(report)form.reportValidity();return;}\n    try {const html=render(key);$('output-'+key).innerHTML=html;outputs.set(key,html);}\n    catch(err) {$('output-'+key).innerHTML='<p class=\"lvp-error\" role=\"alert\">'+esc(err.message)+'<\/p>';outputs.delete(key);csvs.delete(key);}\n  }\n\n  function clear(key) {outputs.delete(key);csvs.delete(key);const out=$('output-'+key);if(out)out.innerHTML='<p class=\"lvp-empty\">'+t('Inputs changed. Calculate again to update this result.')+'<\/p>';}\n\n  function sharedChanged(ev) {\n    ['energy','cost','returns','comparison'].forEach(clear);\n    costResult=null;\n    if(!ev || ['lvp-kw','lvp-yield'].includes(ev.target.id)){const po=$('project-origin');if(po)po.textContent=t('User-edited capacity or yield. Verify these assumptions for this site.');}\n  }\n\n  function show(key,focus=false) {\n    const target=root.querySelector('[data-panel=\"'+key+'\"]'); if(!target)return;active=key;\n    root.querySelectorAll('[data-panel]').forEach(x=>{x.hidden=x!==target;});root.querySelectorAll('[data-nav]').forEach(x=>{if(x.dataset.nav===key)x.setAttribute('aria-current','page');else x.removeAttribute('aria-current');});\n    if(!outputs.has(key)&&['capacity','energy','spacing','shading','cable'].includes(key))run(key,false);\n    if(focus){const h=target.querySelector('h2');h.tabIndex=-1;h.focus({preventScroll:true});}\n  }\n\n  root.querySelectorAll('form[data-tool]').forEach(form=>{\n    form.addEventListener('submit',ev=>{ev.preventDefault();run(form.dataset.tool);});\n    form.addEventListener('input',()=>{clear(form.dataset.tool);if(form.dataset.tool==='capacity')capacityResult=null;if(form.dataset.tool==='cost')costResult=null;if(form.dataset.tool==='spacing')spacingResult=null;});\n    form.addEventListener('change',()=>{clear(form.dataset.tool);});\n  });\n\n  root.querySelectorAll('.lvp-project input,.lvp-project select').forEach(el=>el.addEventListener('input',sharedChanged));\n  root.querySelectorAll('[data-nav]').forEach(el=>el.addEventListener('click',ev=>{ev.preventDefault();const key=el.dataset.nav;history.replaceState(null,'','#'+key);show(key,true);}));\n  window.addEventListener('hashchange',()=>show(location.hash.slice(1)));\n\n  root.addEventListener('click',ev=>{\n    const button=ev.target.closest('[data-action]');if(!button)return;const act=button.dataset.action;\n    if(act==='use-capacity'&&capacityResult){$('kw').value=String(capacityResult.kw);sharedChanged();const po=$('project-origin');if(po)po.textContent=t('Capacity from the rectangular roof estimate. Yield and tariffs remain your assumptions.');history.replaceState(null,'','#energy');show('energy',true);}\n    else if(act==='use-cost'&&costResult){$('capex').value=costResult.total.toFixed(2);history.replaceState(null,'','#returns');show('returns',true);}\n    else if(act==='use-spacing'&&spacingResult){$('roof-gap').value=String(Math.ceil(spacingResult.gap*1000)\/1000);clear('capacity');capacityResult=null;history.replaceState(null,'','#capacity');show('capacity',true);run('capacity',false);}\n    else if(act.startsWith('csv-')){const rows=csvs.get(act.slice(4));if(!rows)return;const text=rows.map(r=>r.map(v=>'\"'+String(v).replace(\/\"\/g,'\"\"')+'\"').join(',')).join('rn');const blob=new Blob(['uFEFF'+text],{type:'text\/csv;charset=utf-8;'}),url=URL.createObjectURL(blob),a=document.createElement('a');a.href=url;a.download='luminvolt-'+act.slice(4)+'.csv';root.append(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(url),1000);}\n  });\n\n  const params=new URLSearchParams(location.search);let imported=false;\n  for(const [q,k] of [['kw','kw'],['yield','yield'],['retail','retail'],['export','export'],['self','self']]){const v=params.get(q);if(v!==null&&v.trim()!==''&&Number.isFinite(Number(v))){const old=val(k);$(k).value=v;if($(k).checkValidity())imported=true;else $(k).value=old;}}\n  if(params.get('currency')&&Array.from($('currency').options).some(x=>x.value===params.get('currency')))$('currency').value=params.get('currency');\n  const po=$('project-origin');\n  if(imported&&po)po.textContent=params.get('source')==='nasa-power'?t('Yield imported from the companion NASA POWER climate estimate. Review its model assumptions.'):params.get('source')==='manual-irradiation'?t('Yield imported from user-supplied irradiation in the companion calculator.'):t('Imported project inputs. Verify the yield source and tariff assumptions before use.');\n  root.querySelectorAll('[data-tool=\"cost\"],[data-tool=\"returns\"]').forEach(x=>{$('output-'+x.dataset.tool).innerHTML='<p class=\"lvp-empty\">'+(x.dataset.tool==='cost'?t('Enter your quotations to build a project budget.'):t('Enter investment and project tariffs, then calculate your cash-flow scenario.'))+'<\/p>';});\n  root.dataset.ready='true';\n  show(location.hash.slice(1)||'capacity');\n  run('strings',false);\n})();\n\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Plan PV-capaciteit, opbrengst, kosten en rendement; controleer rijafstand, schaduw, kabels en stringspanning.<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_yoast_wpseo_focuskw":"solar planning tools","_yoast_wpseo_title":"Solar Planning Tools & PV Calculators | LuminVolt","_yoast_wpseo_metadesc":"Free solar planning calculators for roof capacity, energy yield, project cost, cash flow, row spacing, shadows, cables and PV string voltage.","footnotes":""},"class_list":["post-844","page","type-page","status-publish"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.3 (Yoast SEO v28.7) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Solar Planning Tools &amp; PV Calculators | LuminVolt<\/title>\n<meta name=\"description\" content=\"Free solar planning calculators for roof capacity, energy yield, project cost, cash flow, row spacing, shadows, cables and PV string voltage.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/luminvolt.com\/nl\/solar-project-planning-tools\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Solar Planning Tools: Capacity, Yield, Cost &amp; Engineering\" \/>\n<meta property=\"og:description\" content=\"Free solar planning calculators for roof capacity, energy yield, project cost, cash flow, row spacing, shadows, cables and PV string voltage.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/luminvolt.com\/nl\/solar-project-planning-tools\/\" \/>\n<meta property=\"og:site_name\" content=\"LuminVolt\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-19T02:46:24+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data1\" content=\"8 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\\\/\\\/luminvolt.com\\\/solar-project-planning-tools\\\/\",\"url\":\"http:\\\/\\\/luminvolt.com\\\/solar-project-planning-tools\\\/\",\"name\":\"Solar Planning Tools & PV Calculators | LuminVolt\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/luminvolt.com\\\/#website\"},\"datePublished\":\"2026-10-18T03:39:25+00:00\",\"dateModified\":\"2026-10-19T02:46:24+00:00\",\"description\":\"Free solar planning calculators for roof capacity, energy yield, project cost, cash flow, row spacing, shadows, cables and PV string voltage.\",\"breadcrumb\":{\"@id\":\"http:\\\/\\\/luminvolt.com\\\/solar-project-planning-tools\\\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\\\/\\\/luminvolt.com\\\/solar-project-planning-tools\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\\\/\\\/luminvolt.com\\\/solar-project-planning-tools\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"http:\\\/\\\/luminvolt.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Solar Planning Tools: Capacity, Yield, Cost &#038; Engineering\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/luminvolt.com\\\/#website\",\"url\":\"https:\\\/\\\/luminvolt.com\\\/\",\"name\":\"LuminVolt\",\"description\":\"Your Partner in Advanced Solar Mounting Systems &amp; Energy Storage\",\"publisher\":{\"@id\":\"https:\\\/\\\/luminvolt.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/luminvolt.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/luminvolt.com\\\/#organization\",\"name\":\"LuminVolt\",\"url\":\"https:\\\/\\\/luminvolt.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/luminvolt.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/luminvolt.com\\\/wp-content\\\/uploads\\\/2024\\\/12\\\/LuminVolt-02.webp\",\"contentUrl\":\"https:\\\/\\\/luminvolt.com\\\/wp-content\\\/uploads\\\/2024\\\/12\\\/LuminVolt-02.webp\",\"width\":512,\"height\":512,\"caption\":\"LuminVolt\"},\"image\":{\"@id\":\"https:\\\/\\\/luminvolt.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Zonne-energie Projectplanningstools &amp; PV-Calculators | LuminVolt","description":"Gratis zonne-energie planningstools voor dakcapaciteit, energieopbrengst, projectkosten, cashflow, rijafstand, schaduw, kabels en stringspanning.","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":"http:\/\/luminvolt.com\/nl\/solar-project-planning-tools\/","og_locale":"nl_NL","og_type":"article","og_title":"Solar Planning Tools: Capacity, Yield, Cost & Engineering","og_description":"Free solar planning calculators for roof capacity, energy yield, project cost, cash flow, row spacing, shadows, cables and PV string voltage.","og_url":"http:\/\/luminvolt.com\/nl\/solar-project-planning-tools\/","og_site_name":"LuminVolt","article_modified_time":"2026-10-19T02:46:24+00:00","twitter_card":"summary_large_image","twitter_misc":{"Geschatte leestijd":"8 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/luminvolt.com\/solar-project-planning-tools\/","url":"http:\/\/luminvolt.com\/solar-project-planning-tools\/","name":"Zonne-energie Projectplanningstools &amp; PV-Calculators | LuminVolt","isPartOf":{"@id":"https:\/\/luminvolt.com\/#website"},"datePublished":"2026-10-18T03:39:25+00:00","dateModified":"2026-10-19T02:46:24+00:00","description":"Gratis zonne-energie planningstools voor dakcapaciteit, energieopbrengst, projectkosten, cashflow, rijafstand, schaduw, kabels en stringspanning.","breadcrumb":{"@id":"http:\/\/luminvolt.com\/solar-project-planning-tools\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["http:\/\/luminvolt.com\/solar-project-planning-tools\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/luminvolt.com\/solar-project-planning-tools\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"http:\/\/luminvolt.com\/"},{"@type":"ListItem","position":2,"name":"Solar Planning Tools: Capacity, Yield, Cost &#038; Engineering"}]},{"@type":"WebSite","@id":"https:\/\/luminvolt.com\/#website","url":"https:\/\/luminvolt.com\/","name":"LuminVolt","description":"Uw partner voor geavanceerde zonnepaneleninstallaties en energieopslag","publisher":{"@id":"https:\/\/luminvolt.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/luminvolt.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/luminvolt.com\/#organization","name":"LuminVolt","url":"https:\/\/luminvolt.com\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/luminvolt.com\/#\/schema\/logo\/image\/","url":"https:\/\/luminvolt.com\/wp-content\/uploads\/2024\/12\/LuminVolt-02.webp","contentUrl":"https:\/\/luminvolt.com\/wp-content\/uploads\/2024\/12\/LuminVolt-02.webp","width":512,"height":512,"caption":"LuminVolt"},"image":{"@id":"https:\/\/luminvolt.com\/#\/schema\/logo\/image\/"}}]}},"yoast_social":{"twitter_title":"","twitter_description":"","twitter_image":""},"_links":{"self":[{"href":"https:\/\/luminvolt.com\/nl\/wp-json\/wp\/v2\/pages\/844","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/luminvolt.com\/nl\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/luminvolt.com\/nl\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/luminvolt.com\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/luminvolt.com\/nl\/wp-json\/wp\/v2\/comments?post=844"}],"version-history":[{"count":6,"href":"https:\/\/luminvolt.com\/nl\/wp-json\/wp\/v2\/pages\/844\/revisions"}],"predecessor-version":[{"id":852,"href":"https:\/\/luminvolt.com\/nl\/wp-json\/wp\/v2\/pages\/844\/revisions\/852"}],"wp:attachment":[{"href":"https:\/\/luminvolt.com\/nl\/wp-json\/wp\/v2\/media?parent=844"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}