Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8" /> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |
| <title>NEM Battery SCADA & Energy Data Explorer</title> | |
| <link rel="preconnect" href="https://fonts.googleapis.com" /> | |
| <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" /> | |
| <link rel="stylesheet" href="/static/css/style.css?v=__VERSION__" /> | |
| <script src="https://cdn.plot.ly/plotly-2.27.0.min.js" defer></script> | |
| </head> | |
| <body> | |
| <!-- ββ Header ββ --> | |
| <header> | |
| <div> | |
| <h1>π NEM Battery SCADA & Energy Data Explorer</h1> | |
| <p>4-second SCADA power output and 5-minute dispatch energy storage data for BESS units in Australia's NEM</p> | |
| </div> | |
| </header> | |
| <main> | |
| <!-- ββ BESS list staleness banner (shown only when /api/bess returns a non-live source) ββ --> | |
| <div id="bess-list-banner" class="alert alert-warning hidden" role="status"></div> | |
| <!-- ββ Control panel ββ --> | |
| <section class="panel"> | |
| <h2>Select Data</h2> | |
| <div class="controls"> | |
| <div class="form-group"> | |
| <label for="sel-state">State / Region</label> | |
| <select id="sel-state" disabled> | |
| <option value="">β Loadingβ¦ β</option> | |
| </select> | |
| </div> | |
| <div class="form-group"> | |
| <label for="sel-bess">BESS Unit</label> | |
| <select id="sel-bess" disabled> | |
| <option value="">β Select a state first β</option> | |
| </select> | |
| </div> | |
| <div class="form-group"> | |
| <label for="inp-date">Date <span style="color:var(--text-muted);font-weight:400">(max 1 day)</span></label> | |
| <input type="date" id="inp-date" disabled /> | |
| </div> | |
| <div class="form-group"> | |
| <label>Data Types</label> | |
| <div class="data-type-group"> | |
| <div class="check-row-header" style="margin-bottom:0"> | |
| <label class="check-label"> | |
| <input type="checkbox" id="chk-scada" checked /> | |
| 4-second SCADA | |
| </label> | |
| <button class="about-toggle" data-tip="4-sec power output & quality flags Β· PUBLIC_NEXT_DAY_FPPMW Β· from 29 Apr 2025" data-about="scada">βΆ About</button> | |
| </div> | |
| <div class="check-row-header"> | |
| <label class="check-label"> | |
| <input type="checkbox" id="chk-energy" checked /> | |
| 5-minute Dispatch | |
| </label> | |
| <button class="about-toggle" data-tip="5-min energy storage & dispatch MW Β· DISPATCH_UNIT_SOLUTION Β· from 1 Apr 2025" data-about="energy">βΆ About</button> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="form-group"> | |
| <label> </label> | |
| <button class="btn btn-primary" id="btn-load" disabled>Load Data</button> | |
| </div> | |
| </div> | |
| </section> | |
| <!-- ββ Error ββ --> | |
| <div id="error-box" class="alert alert-error hidden" role="alert"> | |
| β οΈ <span id="error-msg"></span> | |
| </div> | |
| <!-- ββ Loading ββ --> | |
| <div id="loading-box" class="hidden"> | |
| <div class="spinner-wrap"> | |
| <div class="spinner"></div> | |
| <p id="loading-msg">Fetching data from AEMO NEMWEBβ¦</p> | |
| </div> | |
| </div> | |
| <!-- ββ Results ββ --> | |
| <div id="results-box" class="hidden"> | |
| <!-- ββ SCADA section ββ --> | |
| <div id="scada-results" class="hidden"> | |
| <section class="panel"> | |
| <h2>SCADA β Summary Statistics</h2> | |
| <details class="dataset-info"> | |
| <summary>About this dataset β PUBLIC_NEXT_DAY_FPPMW</summary> | |
| <div class="dataset-info-body"> | |
| <p> | |
| In the <strong>PUBLIC_NEXT_DAY_FPPMW</strong> (FPP Daily) data files, these four | |
| columns define the exact timing and status of the 4-second SCADA power measurements | |
| for batteries and generators. | |
| </p> | |
| <p style="margin-bottom:0.5rem"><strong style="color:var(--text);font-size:0.85rem">Column Descriptions</strong></p> | |
| <div class="col-defs"> | |
| <div class="col-def"> | |
| <span class="col-name">INTERVAL_DATETIME</span> | |
| <span class="col-desc">The <strong>target timestamp</strong> for the 4-second interval. Follows the format <code>YYYY/MM/DD HH:MM:SS</code> and represents the standard grid slot (e.g., :00, :04, :08) the measurement is assigned to.</span> | |
| </div> | |
| <div class="col-def"> | |
| <span class="col-name">MEASUREMENT_DATETIME</span> | |
| <span class="col-desc">The <strong>actual timestamp</strong> when the SCADA reading was recorded by AEMO's systems. May differ slightly from <code>INTERVAL_DATETIME</code> due to communication latency or jitter; AEMO snaps each reading to the nearest 4-second slot.</span> | |
| </div> | |
| <div class="col-def"> | |
| <span class="col-name">MEASURED_MW</span> | |
| <span class="col-desc">The <strong>instantaneous power output</strong> of the asset in Megawatts (MW) at that specific time. For batteries, positive values denote discharging (generation) and negative values denote charging (load).</span> | |
| </div> | |
| <div class="col-def"> | |
| <span class="col-name">MW_QUALITY_FLAG</span> | |
| <span class="col-desc">A <strong>numeric code</strong> indicating data health. Tells you whether <code>MEASURED_MW</code> is a live reading or a substitute inserted because the real data was missing or erroneous (see below).</span> | |
| </div> | |
| </div> | |
| <p style="margin-top:1rem;margin-bottom:0.5rem"><strong style="color:var(--text);font-size:0.85rem">MW_QUALITY_FLAG Values</strong></p> | |
| <p>The quality flag is critical for ensuring you aren't analysing "frozen" or "bad" data. | |
| According to the <strong>AEMO FPP Factor Calculation Guide</strong>, the digits translate as follows:</p> | |
| <div class="col-defs" style="margin-top:0.65rem"> | |
| <div class="col-def"> | |
| <span class="col-name" style="color:var(--good)">0 β Good</span> | |
| <span class="col-desc">Data is valid and received directly from the site telemetry.</span> | |
| </div> | |
| <div class="col-def"> | |
| <span class="col-name" style="color:var(--suspect)">1 β Substituted / Estimated</span> | |
| <span class="col-desc">The raw data was missing. AEMO has "held" the previous known-good value or interpolated a value to fill the gap.</span> | |
| </div> | |
| <div class="col-def"> | |
| <span class="col-name" style="color:var(--bad)">2 β Bad</span> | |
| <span class="col-desc">Telemetry is flagged as bad (e.g., communication failure, hardware fault). These points are typically excluded from high-fidelity performance analysis.</span> | |
| </div> | |
| <div class="col-def"> | |
| <span class="col-name" style="color:var(--na)">3 β Manual Override</span> | |
| <span class="col-desc">An AEMO operator has manually adjusted the value to correct for a known system-wide error.</span> | |
| </div> | |
| </div> | |
| </div> | |
| </details> | |
| <div id="stats-grid" class="stats-grid"></div> | |
| <h2 style="margin-bottom:0.6rem">Data Quality</h2> | |
| <div id="quality-strip" class="quality-strip"></div> | |
| <p style="font-size:0.78rem;color:var(--text-muted)"> | |
| Quality flags are sourced directly from the AEMO FPP dataset. | |
| <strong style="color:var(--good)">Good (0)</strong> = reliable measurement; | |
| <strong style="color:var(--suspect)">Suspect (1)</strong> = possible communication issue; | |
| <strong style="color:var(--bad)">Bad (2)</strong> = sustained failure or substituted value. | |
| </p> | |
| </section> | |
| <section class="panel"> | |
| <h2>4-Second Power Output (MW)</h2> | |
| <div id="scada-chart-container"></div> | |
| </section> | |
| <section class="panel"> | |
| <h2>Download SCADA Dataset</h2> | |
| <div class="download-bar" style="margin-bottom:0.75rem"> | |
| <span>4-second SCADA data for the selected BESS and date:</span> | |
| <a id="btn-csv" class="btn btn-outline" href="#" download>β¬ CSV</a> | |
| <a id="btn-parquet" class="btn btn-outline" href="#" download>β¬ Parquet</a> | |
| </div> | |
| <p style="font-size:0.78rem;color:var(--text-muted)"> | |
| <strong>Parquet</strong> is recommended for Python users β 5β10Γ smaller than CSV, | |
| loads natively with <code>pandas.read_parquet()</code> or <code>polars.read_parquet()</code>. | |
| </p> | |
| </section> | |
| </div><!-- /scada-results --> | |
| <!-- ββ Energy section ββ --> | |
| <div id="energy-results" class="hidden"> | |
| <section class="panel"> | |
| <h2>Dispatch Energy β Summary Statistics</h2> | |
| <details class="dataset-info"> | |
| <summary>About this dataset β DISPATCH_UNIT_SOLUTION</summary> | |
| <div class="dataset-info-body"> | |
| <p> | |
| Extracted from AEMO's <strong>DISPATCH_UNIT_SOLUTION</strong> table and published | |
| the following day via NEMWEB. Data is fetched live from: | |
| <a href="https://nemweb.com.au/Reports/Current/Next_Day_Dispatch/" target="_blank" rel="noopener">Current directory</a> | |
| (individual daily files, recent months) or the | |
| <a href="https://www.nemweb.com.au/REPORTS/ARCHIVE/Next_Day_Dispatch/" target="_blank" rel="noopener">Archive directory</a> | |
| (monthly bundles for older dates, accessed via HTTP Range requests). | |
| </p> | |
| <div class="col-defs"> | |
| <div class="col-def"> | |
| <span class="col-name">INITIALMW</span> | |
| <span class="col-desc">Actual power output (MW) at the exact start of the 5-minute dispatch interval. Used as the baseline for the next dispatch instruction.</span> | |
| </div> | |
| <div class="col-def"> | |
| <span class="col-name">INITIAL_ENERGY_STORAGE</span> | |
| <span class="col-desc">State of Energy (SoE) at the start of the interval (MWh). Represents how much energy was physically available in the battery before the current interval's dispatch began.</span> | |
| </div> | |
| <div class="col-def"> | |
| <span class="col-name">ENERGY_STORAGE</span> | |
| <span class="col-desc">Target or projected energy level at the end of the interval (MWh). Accounts for the expected charging or discharging activity scheduled during that 5-minute block.</span> | |
| </div> | |
| </div> | |
| </div> | |
| </details> | |
| <div id="energy-stats-grid" class="stats-grid"></div> | |
| </section> | |
| <section class="panel"> | |
| <h2>5-Minute Initial Energy Storage (MWh) & Dispatch MW</h2> | |
| <div id="energy-chart-container"></div> | |
| </section> | |
| <section class="panel"> | |
| <h2>Download Energy Dataset</h2> | |
| <div class="download-bar" style="margin-bottom:0.75rem"> | |
| <span>5-minute dispatch energy data for the selected BESS and date:</span> | |
| <a id="btn-energy-csv" class="btn btn-outline" href="#" download>β¬ CSV</a> | |
| <a id="btn-energy-parquet" class="btn btn-outline" href="#" download>β¬ Parquet</a> | |
| </div> | |
| <p style="font-size:0.78rem;color:var(--text-muted)"> | |
| Columns: <code>SETTLEMENTDATE</code>, | |
| <code>INITIALMW</code><span class="info-icon" data-tip="Actual MW output at interval start. Used as the dispatch baseline.">β</span>, | |
| <code>INITIAL_ENERGY_STORAGE</code><span class="info-icon" data-tip="State of Energy (SoE) at interval start (MWh) β energy physically available in the battery before dispatch began.">β</span>, | |
| <code>ENERGY_STORAGE</code><span class="info-icon" data-tip="Target energy level at interval end (MWh) β accounts for scheduled charging or discharging during the 5-minute block.">β</span>. | |
| <strong>Parquet</strong> recommended for programmatic use. | |
| </p> | |
| </section> | |
| </div><!-- /energy-results --> | |
| </div><!-- /results-box --> | |
| <!-- ββ Info ββ --> | |
| <section class="panel"> | |
| <h2>About This App</h2> | |
| <p style="font-size:0.875rem;color:var(--text-muted);line-height:1.7"> | |
| This tool provides access to two datasets published by the | |
| <a href="https://www.aemo.com.au" target="_blank" rel="noopener">Australian Energy Market Operator (AEMO)</a> | |
| via NEMWEB:<br/><br/> | |
| <strong>4-second SCADA data</strong> β from | |
| <a href="https://www.nemweb.com.au/REPORTS/Current/FPPDAILY/" target="_blank" rel="noopener">NEMWEB FPPDAILY</a>, | |
| published as part of the | |
| <a href="https://aemo.com.au/initiatives/major-programs/frequency-performance-payments-project" target="_blank" rel="noopener">Frequency Performance Payments (FPP)</a> | |
| scheme (commenced 28 February 2025). Currently fetchable from <strong>29 April 2025</strong>; | |
| earlier daily bundles have been rolled off the AEMO archive.<br/><br/> | |
| <strong>5-minute dispatch energy data</strong> β from | |
| <a href="https://nemweb.com.au/Reports/Current/Next_Day_Dispatch/" target="_blank" rel="noopener">NEMWEB Next_Day_Dispatch</a>, | |
| with the <code>INITIAL_ENERGY_STORAGE</code> column added on 11 February 2025. | |
| Currently fetchable from <strong>1 April 2025</strong>; earlier monthly bundles have been rolled off.<br/><br/> | |
| Data is fetched live from AEMO on each request β no data is stored on this server. | |
| Maximum request window: <strong>1 day</strong> per query. | |
| </p> | |
| </section> | |
| </main> | |
| <footer> | |
| <div> | |
| SCADA data: <a href="https://www.nemweb.com.au/REPORTS/Current/FPPDAILY/" target="_blank">AEMO NEMWEB FPPDAILY</a> | |
| | | |
| Energy data: <a href="https://nemweb.com.au/Reports/Current/Next_Day_Dispatch/" target="_blank">AEMO Next_Day_Dispatch</a> | |
| | | |
| BESS list: <a href="https://www.aemo.com.au/energy-systems/electricity/national-electricity-market-nem/planning_and_forecasting/generation-information" target="_blank">AEMO NEM Generation Information</a> | |
| | | |
| Not affiliated with AEMO. | |
| </div> | |
| <div style="margin-top:0.6rem"> | |
| This tool is provided for informational and research purposes only. Data is retrieved as-is from | |
| AEMO NEMWEB and is subject to change, correction, or unavailability without notice. No warranty β | |
| express or implied β is made regarding the accuracy, completeness, timeliness, or fitness for any | |
| particular purpose of the data presented. The authors accept no liability for any loss, damage, or | |
| decision made in reliance on this information. Always verify critical data directly with | |
| <a href="https://www.aemo.com.au" target="_blank" rel="noopener">AEMO</a>. | |
| </div> | |
| </footer> | |
| <!-- ββ About modal ββ --> | |
| <div id="about-modal" class="modal-overlay hidden" role="dialog" aria-modal="true" aria-labelledby="modal-title"> | |
| <div class="modal-card"> | |
| <div class="modal-header"> | |
| <h3 id="modal-title"></h3> | |
| <button id="modal-close" class="modal-close" aria-label="Close">β</button> | |
| </div> | |
| <div class="modal-body" id="modal-body"></div> | |
| </div> | |
| </div> | |
| <script src="/static/js/app.js?v=__VERSION__"></script> | |
| </body> | |
| </html> | |