Calcolatore del tempo di ritorno di una batteria di accumulo fotovoltaico. Uno strumento pensato per chi ha (o sta per installare) un impianto FV e vuole capire, prima di spendere, se aggiungere un accumulo conviene e in quanti anni si ripaga.
Cosa inserisci:
La potenza del tuo impianto fotovoltaico (kWp)
Il consumo elettrico annuo (kWh)
La capacità e il costo chiavi in mano della batteria
Il prezzo dell'energia acquistata e il Bonus Ristrutturazione applicabile
Cosa ottieni:
La produzione FV annua stimata e il surplus diurno oggi ceduto alla rete
I kWh che la batteria ti fa autoconsumare in più ogni anno
Il risparmio annuo incrementale e il costo netto dopo detrazione
Il tempo di ritorno in anni, con e senza Bonus 50%
Stima indicativa, non un preventivo: il risultato reale dipende da consumi, esposizione e offerte di mercato.
#mt-se9fv{ --mt-font:"Red Hat Display",system-ui,-apple-system,"Segoe UI",Arial,sans-serif; --mt-primary:#006B1F; --mt-primary-hover:#00591A; --mt-accent:#8F00FF; --mt-accent-hover:#601AA6; --mt-accent-text:#FFFFFF; --mt-warm:#E8741E; --mt-bg:#FFFFFF; --mt-surface:#F6F6F6; --mt-surface-2:#ECEFF0; --mt-border:#DCE0E1; --mt-text:#151515; --mt-text-muted:#4F4F4F; --mt-h2:700 21px/1.25 var(--mt-font); --mt-h3:600 16px/1.4 var(--mt-font); --mt-body:400 14px/1.5 var(--mt-font); --mt-num-lg:800 28px/1.1 var(--mt-font); --mt-r-card:16px; --mt-r-input:4px; --mt-r-button:8px; --mt-shadow-card:rgba(56,56,56,0.15) 0 0 10px 2px; --mt-shadow-btn:rgba(0,0,0,0.15) 0 2px 5px,rgba(0,0,0,0.13) 0 9px 9px; display:block; max-width:640px; margin:24px auto; background:var(--mt-bg); border:1px solid var(--mt-border); border-radius:var(--mt-r-card); box-shadow:var(--mt-shadow-card); padding:24px; font:var(--mt-body); color:var(--mt-text); box-sizing:border-box;}#mt-se9fv *,#mt-se9fv *::before,#mt-se9fv *::after{box-sizing:inherit;}#mt-se9fv h2{font:var(--mt-h2);color:var(--mt-primary);margin:0 0 4px;}#mt-se9fv .mt-subtitle{font:var(--mt-body);color:var(--mt-text-muted);margin:0 0 20px;}#mt-se9fv .mt-section{margin-bottom:20px;}#mt-se9fv .mt-label-row{display:flex;align-items:center;gap:6px;margin-bottom:6px;}#mt-se9fv label{font:600 13px/1.4 var(--mt-font);color:var(--mt-text);}#mt-se9fv .mt-unit{font:var(--mt-body);color:var(--mt-text-muted);margin-left:2px;}#mt-se9fv .mt-val-display{font:600 13px/1.4 var(--mt-font);color:var(--mt-primary);margin-left:auto;}#mt-se9fv input[type=range]{ width:100%; height:6px; border-radius:3px; background:linear-gradient(to right,var(--mt-primary) 0%,var(--mt-primary) var(--pct,30%),var(--mt-surface-2) var(--pct,30%),var(--mt-surface-2) 100%); -webkit-appearance:none; appearance:none; border:none; outline:none; cursor:pointer; padding:0; min-height:44px; display:block;}#mt-se9fv input[type=range]::-webkit-slider-thumb{ -webkit-appearance:none; width:20px;height:20px; border-radius:50%; background:var(--mt-primary); border:2px solid #fff; box-shadow:0 1px 3px rgba(0,0,0,0.3); cursor:pointer;}#mt-se9fv input[type=range]::-moz-range-thumb{ width:20px;height:20px; border-radius:50%; background:var(--mt-primary); border:2px solid #fff; box-shadow:0 1px 3px rgba(0,0,0,0.3); cursor:pointer;}#mt-se9fv input[type=number],#mt-se9fv select{ width:100%; background:var(--mt-surface-2); border:1px solid var(--mt-border); border-radius:var(--mt-r-input); min-height:44px; padding:10px 12px; font:var(--mt-body); color:var(--mt-text); outline:none;}#mt-se9fv input[type=number]:focus,#mt-se9fv select:focus{border-color:var(--mt-primary);}#mt-se9fv select{ -webkit-appearance:none; -moz-appearance:none; appearance:none; background-image:url("data:image/svg+xml;utf8,"); background-repeat:no-repeat; background-position:right 12px center; background-size:16px; padding-right:38px;}#mt-se9fv .mt-results{ display:grid; grid-template-columns:1fr 1fr; gap:12px; margin:20px 0;}@media(max-width:480px){ #mt-se9fv .mt-results{grid-template-columns:1fr;}}#mt-se9fv .mt-result-card{ background:var(--mt-bg); border:1px solid var(--mt-border); border-radius:12px; padding:14px 16px;}#mt-se9fv .mt-result-card.mt-highlight{ border-color:var(--mt-primary); border-left:4px solid var(--mt-primary);}#mt-se9fv .mt-result-card.mt-highlight-accent{ border-color:var(--mt-accent); border-left:4px solid var(--mt-accent);}#mt-se9fv .mt-result-label{ display:flex;align-items:center;gap:5px; font:600 11px/1.3 var(--mt-font); color:var(--mt-text-muted); text-transform:uppercase; letter-spacing:0.04em; margin-bottom:6px;}#mt-se9fv .mt-result-val{ font:var(--mt-num-lg); color:var(--mt-text);}#mt-se9fv .mt-result-card.mt-highlight .mt-result-val{color:var(--mt-primary);}#mt-se9fv .mt-result-card.mt-highlight-accent .mt-result-val{color:var(--mt-accent);}#mt-se9fv .mt-result-unit{font:400 13px/1 var(--mt-font);color:var(--mt-text-muted);margin-left:3px;}#mt-se9fv .mt-chart-wrap{ background:var(--mt-bg); border:1px solid var(--mt-border); border-radius:12px; padding:16px; margin-top:20px;}#mt-se9fv .mt-chart-title{ font:var(--mt-h3); color:var(--mt-text); margin:0 0 12px;}#mt-se9fv .mt-chart-legend{ display:flex;gap:16px;flex-wrap:wrap; font:400 12px/1.4 var(--mt-font); color:var(--mt-text-muted); margin-bottom:8px;}#mt-se9fv .mt-legend-dot{ display:inline-block;width:10px;height:10px; border-radius:50%;margin-right:4px;vertical-align:middle;}#mt-se9fv svg{display:block;width:100%;overflow:visible;}#mt-se9fv .mt-disclaimer{ font:400 11px/1.5 var(--mt-font); color:var(--mt-text-muted); margin-top:16px; padding-top:12px; border-top:1px solid var(--mt-border);}/* info affordance */#mt-se9fv .mt-info-wrap{position:relative;display:inline-flex;}#mt-se9fv .mt-info{ display:inline-flex;align-items:center;justify-content:center; position:relative; width:18px;height:18px;min-width:18px; padding:0;margin:0; border-radius:50%; border:1px solid var(--mt-border); background:var(--mt-surface-2); color:var(--mt-text-muted); font:700 11px/1 var(--mt-font); font-style:italic; cursor:pointer; flex-shrink:0;}#mt-se9fv .mt-info::before{content:"";position:absolute;inset:-13px;}#mt-se9fv .mt-info:hover,#mt-se9fv .mt-info[aria-expanded="true"]{background:var(--mt-primary);color:#fff;border-color:var(--mt-primary);}#mt-se9fv .mt-info:focus-visible{outline:2px solid var(--mt-accent);outline-offset:2px;}#mt-se9fv .mt-info-pop{ position:absolute;z-index:5; top:calc(100% + 8px);left:0; width:max-content;max-width:240px; padding:8px 10px; border-radius:8px; background:var(--mt-text); color:#fff; font:400 12px/1.45 var(--mt-font); box-shadow:var(--mt-shadow-card);}#mt-se9fv .mt-info-pop[hidden]{display:none;}@media(max-width:480px){#mt-se9fv .mt-info-pop{max-width:200px;}}@media(prefers-reduced-motion:reduce){ #mt-se9fv *{transition:none!important;animation:none!important;}} Calcolatore payback accumulo fotovoltaico Stima il ritorno dell'investimento in una batteria LFP — con e senza Bonus Ristrutturazione 50%. Potenza impianto FV Consumo annuo Capacità batteria Costo batteria (chiavi in mano) Prezzo energia acquistata Bonus Ristrutturazione applicabile 50% (abitazione principale) 36% (seconda casa / altri immobili) Nessun bonus Produzione FV annua stimata Surplus ceduto alla rete (senza batteria) kWh aggiuntivi autoconsumati Risparmio annuo incrementale Costo netto dopo detrazione Tempo di ritorno Risparmio cumulato vs. investimento (15 anni) 0 – – – – 0 3 6 9 12 15 Anni Stima indicativa — non un preventivo. I risultati dipendono da irraggiamento locale, profilo di consumo, tariffe e condizioni di fornitura effettive. La detrazione IRPEF si applica solo se sussistono i requisiti di legge; consulta un tecnico abilitato. Costanti: rendimento specifico medio nazionale 1.150 kWh/kWp/yr (PVGIS 2026-Q1).(function(){ /* ── COSTANTI ── */ var YIELD = 1150; var SC_NO_BAT = 0.30; var SC_TARGET = 0.90; var DOD = 0.90; var EFF = 0.95; var BAT_LIFE = 25; /* ── ROOT ── */ var root = document.getElementById('mt-se9fv'); if(!root) return; /* ── REFS INPUTS ── */ var inKwp = root.querySelector('#mt-se9fv-kwp'); var inConsumo= root.querySelector('#mt-se9fv-consumo'); var inBat = root.querySelector('#mt-se9fv-bat'); var inCosto = root.querySelector('#mt-se9fv-costo'); var inPrezzo = root.querySelector('#mt-se9fv-prezzo'); var inBonus = root.querySelector('#mt-se9fv-bonus'); /* ── REFS DISPLAY ── */ var dKwp = root.querySelector('#mt-se9fv-kwp-val'); var dConsumo= root.querySelector('#mt-se9fv-consumo-val'); var dBat = root.querySelector('#mt-se9fv-bat-val'); var dPrezzo = root.querySelector('#mt-se9fv-prezzo-val'); /* ── REFS OUTPUTS ── */ var oProd = root.querySelector('#mt-se9fv-o-prod'); var oSurp = root.querySelector('#mt-se9fv-o-surp'); var oKwh = root.querySelector('#mt-se9fv-o-kwh'); var oRisp = root.querySelector('#mt-se9fv-o-risp'); var oNetto = root.querySelector('#mt-se9fv-o-netto'); var oPb = root.querySelector('#mt-se9fv-o-pb'); /* ── REFS CHART ── */ var svgEl = root.querySelector('#mt-se9fv-svg'); var lineBonus = root.querySelector('#mt-se9fv-line-bonus'); var lineFull = root.querySelector('#mt-se9fv-line-full'); var costLine = root.querySelector('#mt-se9fv-costline'); var crossBonus = root.querySelector('#mt-se9fv-cross-bonus'); var crossFull = root.querySelector('#mt-se9fv-cross-full'); var pbLabelBonus = root.querySelector('#mt-se9fv-pb-label-bonus'); var pbLabelFull = root.querySelector('#mt-se9fv-pb-label-full'); var yLabels = [ root.querySelector('#mt-se9fv-y0'), root.querySelector('#mt-se9fv-y1'), root.querySelector('#mt-se9fv-y2'), root.querySelector('#mt-se9fv-y3'), root.querySelector('#mt-se9fv-y4') ]; /* ── CHART GEOMETRY ── */ var CX0=40, CX1=508, CY0=170, CY1=8; /* left, right, bottom, top */ var YEARS=15; /* ── HELPERS ── */ function fmt(n,dec){ dec = dec || 0; return n.toLocaleString('it-IT',{minimumFractionDigits:dec,maximumFractionDigits:dec}); } function clamp(v,mn,mx){return Math.max(mn,Math.min(mx,v));} function setSliderPct(el){ var mn=parseFloat(el.min),mx=parseFloat(el.max),v=parseFloat(el.value); var pct=((v-mn)/(mx-mn)*100).toFixed(1)+'%'; el.style.setProperty('--pct',pct); } /* ── COMPUTE ── */ function compute(){ var kwp = parseFloat(inKwp.value)||6; var consumo = parseFloat(inConsumo.value)||4500; var cap = parseFloat(inBat.value)||10; var costo = parseFloat(inCosto.value)||7000; var prezzo = parseFloat(inPrezzo.value)||0.25; var bonus = parseFloat(inBonus.value)||0; /* formula faithful to brief */ var prod_annua = kwp * YIELD; var surplus = prod_annua * (1 - SC_NO_BAT); var kwh_rec = Math.min(cap * DOD * EFF * 365, surplus, consumo * (SC_TARGET - SC_NO_BAT)); kwh_rec = Math.max(0, kwh_rec); var risp_annuo = kwh_rec * prezzo; var costo_netto = costo * (1 - bonus); var pb_anni = (risp_annuo > 0) ? costo_netto / risp_annuo : Infinity; /* full-price payback (no bonus) */ var pb_full = (risp_annuo > 0) ? costo / risp_annuo : Infinity; var costo_bonus = costo_netto; /* alias for chart */ /* display values */ dKwp.textContent = fmt(kwp,kwp%1===0?0:1)+' kWp'; dConsumo.textContent= fmt(consumo)+' kWh/anno'; dBat.textContent = fmt(cap,cap%1===0?0:1)+' kWh'; dPrezzo.textContent = '0,'+Math.round(prezzo*100)+' €/kWh'; oProd.textContent = fmt(Math.round(prod_annua)); oSurp.textContent = fmt(Math.round(surplus)); oKwh.textContent = fmt(Math.round(kwh_rec)); oRisp.textContent = fmt(Math.round(risp_annuo)); oNetto.textContent = fmt(Math.round(costo_netto)); if(!isFinite(pb_anni)||pb_anni>50){ oPb.textContent = '> 25'; } else { oPb.textContent = '≈ '+fmt(pb_anni,1); } /* slider pct fill */ setSliderPct(inKwp); setSliderPct(inConsumo); setSliderPct(inBat); setSliderPct(inPrezzo); /* chart update */ updateChart(risp_annuo, costo_bonus, costo, pb_anni, pb_full); } /* ── CHART UPDATE ── */ function updateChart(rispAnnuo, costoBonus, costoFull, pbBonus, pbFull){ var W = CX1 - CX0; var H = CY0 - CY1; /* 162 */ var dx = W / YEARS; /* build cumulative arrays (net = cumSavings - cost at yr 0) */ var cumBonus = [], cumFull = []; for(var i=0; i<=YEARS; i++){ cumBonus.push(rispAnnuo * i - costoBonus); cumFull.push(rispAnnuo * i - costoFull); } /* scale: find range */ var allVals = cumBonus.concat(cumFull).concat([0]); var minV = Math.min.apply(null, allVals); var maxV = Math.max.apply(null, allVals); if(maxV === minV){ maxV = minV + 1000; } /* pad */ var pad = (maxV - minV) * 0.08; minV -= pad; maxV += pad; function toSY(v){ return CY0 - ((v - minV) / (maxV - minV)) * H; } function toSX(i){ return CX0 + (i / YEARS) * W; } /* build points strings */ var ptBonus='', ptFull=''; for(var j=0; j<=YEARS; j++){ ptBonus += toSX(j).toFixed(1)+','+toSY(cumBonus[j]).toFixed(1)+' '; ptFull += toSX(j).toFixed(1)+','+toSY(cumFull[j]).toFixed(1)+' '; } lineBonus.setAttribute('points', ptBonus.trim()); lineFull.setAttribute('points', ptFull.trim()); /* cost line (zero reference = cumSavings - cost; horizontal at y of 0) */ var y0 = toSY(0); y0 = clamp(y0, CY1, CY0); costLine.setAttribute('y1', y0.toFixed(1)); costLine.setAttribute('y2', y0.toFixed(1)); /* y-axis labels (4 ticks + 0) */ var step = (maxV - minV) / 4; var tickVals = [minV, minV+step, minV+2*step, minV+3*step, maxV]; var tickYs = [CY0, CY0-H/4, CY0-H/2, CY0-3*H/4, CY1+4]; /* labels: y4=top (maxV), y0=bottom (minV) */ for(var k=0; k<5; k++){ var tv = tickVals[k]; var label = (Math.abs(tv)<1000) ? fmt(Math.round(tv)) : fmt(Math.round(tv/100)*100); yLabels[k].textContent = (tv>=0?'':'')+label; yLabels[k].setAttribute('y', tickYs[4-k].toFixed(1)); } /* crosshair: bonus */ placeCross(pbBonus, rispAnnuo, costoBonus, costoFull, toSX, toSY, crossBonus, pbLabelBonus, 'bonus', YEARS); placeCross(pbFull, rispAnnuo, costoBonus, costoFull, toSX, toSY, crossFull, pbLabelFull, 'full', YEARS); } function placeCross(pb, risp, costoBonus, costoFull, toSX, toSY, circle, label, which, YEARS){ if(!isFinite(pb)||pb>YEARS+0.5){ circle.setAttribute('cx','-100'); circle.setAttribute('cy','-100'); label.setAttribute('x','-100'); label.setAttribute('y','-100'); label.textContent=''; return; } var x = toSX(Math.min(pb, YEARS)); var cumAtPb = risp * pb - (which==='bonus' ? costoBonus : costoFull); var y = toSY(0); /* crosshair at zero line */ y = clamp(y, CY1+2, CY0-2); circle.setAttribute('cx', x.toFixed(1)); circle.setAttribute('cy', y.toFixed(1)); var ly = y - 8; if(ly < CY1+12) ly = y + 16; label.setAttribute('x', x.toFixed(1)); label.setAttribute('y', ly.toFixed(1)); label.textContent = '≈'+Math.round(pb)+'a'; void cumAtPb; /* used above in calc, suppress lint */ } /* ── INFO TOOLTIPS ── */ root.querySelectorAll('.mt-info').forEach(function(btn){ var pop = root.querySelector('#'+btn.getAttribute('aria-describedby')); if(!pop) return; btn.addEventListener('click', function(e){ e.stopPropagation(); var open = btn.getAttribute('aria-expanded')==='true'; root.querySelectorAll('.mt-info[aria-expanded="true"]').forEach(function(o){ o.setAttribute('aria-expanded','false'); var p = root.querySelector('#'+o.getAttribute('aria-describedby')); if(p) p.hidden=true; }); btn.setAttribute('aria-expanded', String(!open)); pop.hidden = open; }); }); document.addEventListener('click', function(){ root.querySelectorAll('.mt-info[aria-expanded="true"]').forEach(function(o){ o.setAttribute('aria-expanded','false'); var p = root.querySelector('#'+o.getAttribute('aria-describedby')); if(p) p.hidden=true; }); }); root.addEventListener('keydown', function(e){ if(e.key==='Escape'){ root.querySelectorAll('.mt-info[aria-expanded="true"]').forEach(function(o){ o.setAttribute('aria-expanded','false'); var p = root.querySelector('#'+o.getAttribute('aria-describedby')); if(p) p.hidden=true; o.focus(); }); } }); /* ── BIND INPUTS ── */ [inKwp, inConsumo, inBat, inCosto, inPrezzo, inBonus].forEach(function(el){ el.addEventListener('input', compute); }); /* ── INIT ── */ compute();})();
Come funziona il calcolo
Il tool parte dalla produzione annua del tuo impianto (potenza in kWp × resa specifica media) e stima il surplus diurno che oggi finisce in rete quando non c'è accumulo. La batteria recupera parte di quel surplus: i kWh effettivamente autoconsumati in più sono il minimo tra l'energia che l'accumulo può ciclare in un anno (capacità × profondità di scarica utile × efficienza di ciclo × 365), il surplus disponibile e il margine di autoconsumo ancora raggiungibile. Quei kWh, moltiplicati per il prezzo dell'energia acquistata, danno il risparmio annuo incrementale; il costo netto è la spesa della batteria al netto della detrazione, e il tempo di ritorno è costo netto diviso risparmio annuo.
Ipotesi e dati di riferimento
Resa specifica ~1.150 kWh/kWp/anno (PVGIS, media nazionale, 2026)
Autoconsumo senza batteria ~30%, obiettivo con accumulo fino al 60% dei consumi
Batteria LFP: profondità di scarica utile 90%, efficienza di ciclo 95%
Detrazione: 50% abitazione principale, 36% seconda casa, recuperata in 10 anni
Quando usarlo
È pensato per impianti residenziali esistenti su cui valutare l'aggiunta di un accumulo. Il risultato è più affidabile quando inserisci il prezzo dell'energia letto in bolletta e il preventivo reale della batteria.
Limiti
È una stima indicativa, non un preventivo né un parere fiscale. Non modella il profilo orario dei consumi, la stagionalità o il degrado della batteria, e l'aliquota della detrazione può cambiare per legge. Per l'approfondimento tecnico vedi l'articolo collegato.
Scopri gli Strumenti Digitali Correlati
Quanto rende un impianto fotovoltaico a terra e in quanti anni rientri?
Stima in pochi secondi il tempo di rientro, il beneficio annuo e il risparmio netto a 20 anni del tuo impianto a terra.
Noleggio o acquisto del fotovoltaico: quale costa di più sul lungo periodo?
Confronta in pochi secondi il costo totale del noleggio operativo con l'acquisto diretto: inserisci potenza, canone e durata e scopri quale opzione conviene alla tua azienda.