Utility Bill Optimization Tool
Configure Your Utilities
Set up the utilities you want to track. This information will be saved in your browser.
Enter Utility Bill Data
Add New Bill for
Entered Bills for
| Period | Consumption () | Total Bill ($) | Effective Rate ($/) | Actions |
|---|
Analyze Consumption & Cost Trends
Consumption Trend ()
Cost Trend ($)
Key Metrics & Comparisons for
Optimization Scenarios & Estimator
"What-If" Scenarios for
Appliance Electricity Estimator
Estimate electricity usage for common appliances. This helps identify high-consumption devices.
| Appliance | Watts | Hrs/Day | Est. kWh/Month | Est. Cost/Month ($) | Actions |
|---|
Download Your Utility Report
The PDF report will include your utility configurations, detailed bill entries, trend analysis summaries (data and charts if possible), current "What-If" scenario results, and appliance estimations (if available).
Scenario: Reduce Consumption by ${reductionPercent}%
Estimated New Avg. Consumption: ${reducedConsumption.toFixed(2)} ${config.unit}
Estimated New Avg. Monthly Bill: $${newBillFromReduction.toFixed(2)}
Estimated Monthly Savings: $${savingsFromReduction.toFixed(2)} (Annual: $${(savingsFromReduction*12).toFixed(2)})
`; } const newRate = parseFloat(whatIfNewRateEl.value); if (!isNaN(newRate) && newRate >= 0) { const newBillFromRateChange = (avgConsumption * newRate) + config.fixedCharge; const savingsFromRateChange = currentAvgBill - newBillFromRateChange; resultsHtml += `
Scenario: Rate Change to $${newRate.toFixed(4)} per ${config.unit}
Estimated New Avg. Monthly Bill: $${newBillFromRateChange.toFixed(2)}
Estimated Monthly ${savingsFromRateChange >= 0 ? 'Savings' : 'Increase'}: $${Math.abs(savingsFromRateChange).toFixed(2)}
Enter a value for reduction or new rate to see scenario results.
'; if(whatIfResultsDisplayEl) whatIfResultsDisplayEl.style.display = 'block'; } } window.ubot_addAppliance = function() { const name = applianceNameEl.value.trim(); const wattage = parseFloat(applianceWattageEl.value); const hours = parseFloat(applianceHoursPerDayEl.value); if (!name || isNaN(wattage) || wattage <=0 || isNaN(hours) || hours < 0 || hours > 24) { alert("Please enter valid appliance name, positive wattage, and hours (0-24)."); return; } applianceEstimates.push({ id: Date.now(), name, wattage, hours }); saveData(); ubot_renderAppliancesTable(); applianceNameEl.value = ''; applianceWattageEl.value = ''; applianceHoursPerDayEl.value = ''; } function ubot_deleteAppliance(applianceId) { // Not global as it's called by a JS-created handler applianceEstimates = applianceEstimates.filter(app => app.id !== applianceId); saveData(); ubot_renderAppliancesTable(); } function ubot_renderAppliancesTable() { const elecConfig = utilityConfigs["Electricity"]; if (!elecConfig || typeof elecConfig.rate !== 'number') { // Check if rate is a number if(appliancesTableEl) appliancesTableEl.style.display = 'none'; if (appliancePieChartInstance) appliancePieChartInstance.destroy(); appliancePieChartInstance = null; return; } if (applianceEstimates.length === 0) { if(appliancesTableEl) appliancesTableEl.style.display = 'none'; if (appliancePieChartInstance) appliancePieChartInstance.destroy(); appliancePieChartInstance = null; return; } if(appliancesTableEl) appliancesTableEl.style.display = 'table'; if(appliancesTableBodyEl) appliancesTableBodyEl.innerHTML = ''; let pieChartLabels = []; let pieChartData = []; applianceEstimates.forEach(app => { const dailyKWh = (app.wattage * app.hours) / 1000; const monthlyKWh = dailyKWh * 30; const monthlyCost = monthlyKWh * elecConfig.rate; const row = appliancesTableBodyEl.insertRow(); row.insertCell().textContent = app.name; row.insertCell().textContent = app.wattage; row.insertCell().textContent = app.hours.toFixed(1); row.insertCell().textContent = monthlyKWh.toFixed(2); row.insertCell().textContent = monthlyCost.toFixed(2); const actionsCell = row.insertCell(); const deleteBtn = document.createElement('button'); deleteBtn.textContent = 'Del'; deleteBtn.className = 'ubot-button danger small'; deleteBtn.onclick = () => ubot_deleteAppliance(app.id); actionsCell.appendChild(deleteBtn); pieChartLabels.push(app.name); pieChartData.push(monthlyKWh); }); if (appliancePieChartCanvas) { if (appliancePieChartInstance) appliancePieChartInstance.destroy(); if (pieChartData.length > 0) { appliancePieChartInstance = new Chart(appliancePieChartCanvas.getContext('2d'), { type: 'pie', data: { labels: pieChartLabels, datasets: [{ label: 'Est. Monthly kWh', data: pieChartData, backgroundColor: ['#007bff', '#28a745', '#ffc107', '#dc3545', '#17a2b8', '#6c757d', '#fd7e14', '#6610f2', '#20c997'], hoverOffset: 4 }] }, options: { responsive: true, maintainAspectRatio: true, plugins: { legend: { position: 'top'}}} }); } } else { console.error("Appliance pie chart canvas not found.");} } // --- Tab 5: PDF Export --- if(downloadPdfButton) downloadPdfButton.addEventListener('click', async function() { let pdfHtml = `Utility Bill Optimization Report
`; pdfHtml += `Generated on: ${new Date().toLocaleDateString()}
`; // ... (rest of PDF generation logic - it's long, assuming it's mostly correct from before, but relies on chart instances being valid) // Crucial: Ensure chart instances are valid and getBase64Image() is called correctly. // Add placeholders if charts can't be generated. pdfHtml += `Utility Configurations
`; let hasConfigs = false; UTILITY_TYPES.forEach(type => { const config = utilityConfigs[type]; if (config && config.unit) { hasConfigs = true; pdfHtml += `${type}
- Unit: ${config.unit}
- Rate: $${(config.rate || 0).toFixed(4)} / ${config.unit}
- Fixed Charge: $${(config.fixedCharge || 0).toFixed(2)} / month
No utilities configured.
"; pdfHtml += `Detailed Bill Entries
`; let hasBills = false; UTILITY_TYPES.forEach(type => { const bills = utilityBills[type]; const config = utilityConfigs[type]; if (bills && bills.length > 0 && config && config.unit) { hasBills = true; pdfHtml += `${type} (Unit: ${config.unit})
| Period | Consumption | Total Bill ($) | Effective Rate ($/${config.unit}) |
|---|---|---|---|
| ${bill.period} | ${bill.consumption.toFixed(2)} | ${bill.totalBill.toFixed(2)} | ${isNaN(effectiveRate) ? '-' : effectiveRate.toFixed(4)} |
No bill data entered.
"; pdfHtml += `Trend Analysis Summaries
`; let hasAnalysis = false; for (const type of UTILITY_TYPES) { const bills = utilityBills[type]; if (bills && bills.length > 0 && utilityConfigs[type] && utilityConfigs[type].unit) { hasAnalysis = true; pdfHtml += `${type} Analysis
`; let totalConsumption = 0, totalCost = 0; bills.forEach(b => { totalConsumption += b.consumption; totalCost += b.totalBill; }); const avgConsumption = bills.length > 0 ? totalConsumption / bills.length : 0; const avgCost = bills.length > 0 ? totalCost / bills.length : 0; pdfHtml += `Avg. Monthly Consumption: ${avgConsumption.toFixed(2)} ${utilityConfigs[type].unit}
`; pdfHtml += `Avg. Monthly Bill: $${avgCost.toFixed(2)}
`; if (analysisUtilitySelectEl && analysisUtilitySelectEl.value === type) { if (consumptionChartInstance) { try { pdfHtml += `Consumption Trend
(Consumption chart image not available)
`} } if (costChartInstance) { try { pdfHtml += `Cost Trend
(Cost chart image not available)
`} } } else { pdfHtml += `(Trend charts for ${type} not included in this snapshot as it was not the active analysis view.)
`; } } } if (!hasAnalysis) pdfHtml += "No analysis performed.
"; pdfHtml += `"What-If" Scenario Results
`; if (optimizeUtilitySelectEl && optimizeUtilitySelectEl.value && whatIfResultsDisplayEl && whatIfResultsDisplayEl.style.display !== 'none' && whatIfResultsDisplayEl.innerHTML.length > 20) { pdfHtml += `For Utility: ${optimizeUtilitySelectEl.value}
`; pdfHtml += `No 'What-If' scenarios calculated or utility not selected.
"; } pdfHtml += `Appliance Electricity Estimator
`; if (applianceEstimates.length > 0 && utilityConfigs["Electricity"] && typeof utilityConfigs["Electricity"].rate === 'number') { const elecRate = utilityConfigs["Electricity"].rate; pdfHtml += `| Appliance | Watts | Hrs/Day | Est. kWh/Month | Est. Cost/Month ($) |
|---|---|---|---|---|
| ${app.name} | ${app.wattage} | ${app.hours.toFixed(1)} | ${monthlyKWh.toFixed(2)} | ${monthlyCost.toFixed(2)} |
Appliance Consumption Share (Est. kWh/Month)
(Appliance chart image not available)
`; } } } else { pdfHtml += "No appliance data or Electricity rate not configured.
"; } pdfHtml += `