Easily estimate your potential savings with a rooftop solar system in Brunei. Draw your rooftop area on the map, enter your electricity bill and other parameters, then click “Calculate” for a tailored estimate.
Month | Solar Output (kWh) | Estimated Savings (B$) |
---|---|---|
No data yet. |
Download a PDF listing all inputs, constants, reasoning, and formulas used.
This guidebook explains every technical detail, assumption, and formula used by the Brunei Solar Savings Calculator. It is intended for professional users who wish to understand the underlying models (PVWatts® v8), tariff structures, and how each input or constant influences the final energy and financial estimates.
The calculator has two modes:
PVWatts® is an NREL web application (and API) that simulates the hourly performance of a grid‐connected photovoltaic array. It uses typical meteorological year (TMY) data and a collection of physical modules/inverter thermal models to estimate DC‐to‐AC energy output.
We assume Brunei’s “Residential Tier A” block‐rate schedule:
Consumption (kWh) | Rate (B$/kWh) |
---|---|
0 – 600 | 0.01 |
601 – 2 000 | 0.08 |
2 001 – 4 000 | 0.10 |
> 4 000 | 0.12 |
Monthly Tariff Calculation Algorithm:
function calculate_tariff_A_cost(kWh): if kWh ≤ 600: cost = kWh × 0.01 else if kWh ≤ 2000: cost = (600 × 0.01) + ((kWh – 600) × 0.08) else if kWh ≤ 4000: cost = (600 × 0.01) + (1400 × 0.08) + ((kWh – 2000) × 0.10) else: cost = (600 × 0.01) + (1400 × 0.08) + (2000 × 0.10) + ((kWh – 4000) × 0.12) return cost
In code, we use this function hourly for each month’s projected
kWh to compute estimated B$ savings. The sum of all months equals
Estimated Annual Savings
.
The “System Losses” percentage in PVWatts® accounts for all losses not explicitly handled by the module/inverter model. By default, it is 14 %, composed of:
Category | Default Value (%) |
---|---|
Soiling | 2 % |
Shading | 3 % |
Snow | 0 % |
Mismatch | 2 % |
Wiring | 2 % |
Connections | 0.5 % |
Light‐Induced Degradation | 1.5 % |
Nameplate Rating | 1 % |
Age | 0 % |
Availability | 3 % |
These multiplicative losses combine as:
100% × [1 – (1–0.02) × (1–0.03) × (1–0.02) × (1–0.02)
× (1–0.005) × (1–0.015) × (1–0.01) × (1–0.03)] ≈ 14 %
The tilt angle (θ) is the angle between the module surface and
horizontal plane (0° = flat, 90° = vertical).
- Quick Mode default: 15° (practical for Brunei
near‐equatorial installations).
- Engineer Mode: User enters any value (e.g.
20° for a pitched roof).
Rule of thumb: tilt ≈ latitude to maximize year-round energy.
The azimuth angle (ϕ) is measured clockwise from True North, so 0° = north, 90° = east, 180° = south, 270° = west. - Default (northern hemisphere): 180° (south-facing). - For mornings vs. afternoons: slightly adjust ±15°–30° from due south as needed.
Conversion table for cardinal directions:
North: 0° East: 90° South: 180° West: 270°
When you draw a polygon around your rooftop on the satellite map, the code computes the area (A) in m². We then assume a standard crystalline‐silicon module efficiency of 15 % as follows:
Formula:
DC Capacity (kW ₚ) = ( Rooftop Area (m²) ) ÷ 6.5 ( m² per kWₚ )
Why 6.5 m² per kWₚ?
If you wish to override this assumption (e.g. you know your module efficiency or panel dimensions), simply switch to Engineer Mode and enter your own DC capacity.
In JavaScript:
// 1) User draws rooftop → compute DC capacity: const capacityUser = parseFloat(document.getElementById("simple-capacity").value) || 5; // 2) User selects District → fallback lat/lon: const coords = districtCoords[selectedDistrict]; // 3) User enters monthly bill and roof orientation: const bill = parseFloat(document.getElementById("simple-bill").value); const roofDir = parseFloat(document.getElementById("simple-roof").value); // 4) Default tilt/losses: const tilt = 15; const losses = 14; // 5) Build the PVWatts® API payload: const payload = { lat: coords.lat, lon: coords.lon, system_capacity: capacityUser, module_type: 0, // Standard crystalline array_type: 1, // Fixed (open rack) tilt: tilt, azimuth: roofDir, losses: losses, inv_eff: 96, dc_ac_ratio: 1.2, gcr: 0.4 }; // 6) Send to Flask: fetch("/api/calculate", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload), }) .then(res => res.json()) .then(data => { // data.ac_monthly, data.ac_annual, data.capacity_factor, etc. // data.monthly_savings = data.ac_monthly.map(kwh => calculate_tariff_A_cost(kwh)); // … });
The Flask endpoint then returns all relevant fields:
annual_kWh
, capacity_factor
estimated_monthly_usage
, total_savings
coverage_percent
, suggested_capacity
monthly_kWh
, monthly_savings
When the user clicks “Export PDF,” a client‐side or server‐side routine collects:
These items are formatted into a professional PDF using a library
such as pdfkit
(Python/Flask) or jsPDF
(client‐side). The PDF layout uses a clean, serif heading font
(e.g. Times New Roman or Georgia) for titles and a legible sans‐serif
(e.g. Arial or Open Sans) for body text. The color palette is
kept grayscale (dark headings on white background) for optimal
print/export quality. Margins are set to 1″ on all sides, and
table-of‐contents and page numbers are included.
Example PDF Layout:
• Cover page: “Brunei Solar Savings – Assumptions & Formulas”
• Section 1: User Inputs (with a small table)
• Section 2: Constants & Reasoning (detailed bulleted list + equations)
• Section 3: PVWatts® Model Description (summary from Section 2 above)
• Section 4: Tariff A Calculation Logic (copied from Section 3 above)
• Section 5: Rooftop Estimation Formula (copied from Section 6 above)
• Section 6: Computed Results (annual vs monthly vs coverage)
• Section 7: References (NREL PVWatts® docs, Brunei tariff official document)