Skip to main content

Hill of Towie - Open Source Dataset

Analysis of the Hill of Towie wind farm open dataset: https://zenodo.org/records/22662930

This repo contains analysis and helper functions to:

  • download the open dataset from Zenodo which includes 10-minute SCADA, ~1Hz fastlog collected by Anemo, controller telemetry and LiDAR data.
  • estimate energy uplift thanks to upgrades using the wind-up library
  • ad-hoc analysis of the Dynamic Yaw trial, including wake-steering event finding and LiDAR analysis.

New to the dataset? Field definitions, reference frames and known data quality issues are documented in Hill_of_Towie_data_dictionary.md in the Zenodo data pack.

Working with the fastlog? How it is resampled to a regular timebase, which aggregates are available, and how to reuse the chunked cache on your own data source is described in docs/fastlog_resampling.md.

The repository currently covers three upgrade validation campaigns:

  • the Dynamic Yaw wake steering and collective yaw control trial, analysis first published in 2026 (scripts/wfc_analysis_2026)
  • the earlier AeroUp and TuneUp turbine upgrades, analysis first published in 2025 (scripts/uplift_analysis_2025)

Quickstart

Analysis scripts in this repo download the input data from Zenodo automatically on first use — no manual data staging is required. See scripts/wfc_analysis_2026/inspect_data.py for a short example of loading the open dataset into pandas dataframes. An example plot this script makes is shown below; this plot compares standard SCADA 10-min data with the controller fastlog data available thanks to Anemo.

10min_vs_fastlog_T03

Dynamic Yaw analysis

A presentation explaining Dynamic Yaw and the analysis in this repo is available here.

The folder scripts/wfc_analysis_2026 analyses the energy uplift from the Dynamic Yaw (DY) controller trial at Hill of Towie. DY combines two control features which both provide energy uplift in different ways:

  • Wake Steering (WS) — selected upwind turbines steer to deflect their wake away from a downwind partner. The controller applies a non-zero wake-steering offset only when the wind direction falls inside one of the pre-defined steering windows in controller_config/wake-steering-lookup.csv.
  • Collective Control (CC) — every controlled turbine gets an improved wind direction signal based on pooled information from all turbines. This helps the turbine ignore turbulence when deciding whether to yaw or not, which can reduce yaw activity and increase energy yield. This is also essential for steering turbines to mitigate sensor bias during the steer.

DY is switched on and off by a synthetic toggle generated from UTC time (50-minute on/off period, see hot_dy_toggle_df() in uplift_ws.py). The toggle pattern lets wind-up estimate uplift from interleaved on/off pairs rather than a single before/after split.

The driver script is scripts/wfc_analysis_2026/total_uplift.py. It runs the WS and CC analyses end-to-end, generates many plots including all the plots shown below, and combines the two results into a long-term AEP figure via compute_lt_uplift().

Site layout

The bubble plot below shows the layout and ground elevation of each turbine — the west cluster sits on the higher, exposed hilltop while the east cluster sits on a second smaller hill:

Hill of Towie turbine elevation

Wake Steering result

scripts/wfc_analysis_2026/uplift_ws.py runs one wind-up analysis per steering window. Each window uses a wind direction filter that matches the upwind turbine's steering range. The P50 wake-steering uplift across the qualifying steering events is +1.32% (σ = 0.54%).

The plot below shows the per-turbine WS uplift across the west of the farm:

Hill of Towie WS test turbine uplift

Collective Control result

scripts/wfc_analysis_2026/uplift_cc.py runs wind-up on the 10-min periods that the per-steer analysis did not consume, isolating the contribution of CC to uplift. T07 is excluded from the CC test set because it was not actively controlled during the campaign.

Across the 13 CC test turbines the P50 uplift is +0.56% (σ = 0.47%) with an average yaw-activity reduction of −6.0%. The headline test-vs-reference bar chart shows ~0% uplift on the four references (three reference turbines and the ZX300 LiDAR) as expected, while the test group is positive:

Hill of Towie CC test turbine uplift combined uplift and 90pct CI

CC also changes how much each turbine yaws. The bubble plot below shows the per-turbine yaw activity change: blue means the turbine yawed less under CC:

Hill of Towie CC test turbine yaw activity change

Combined long-term AEP

compute_lt_uplift() in total_uplift.py blends the WS and CC results into a long-term AEP figure using FLORIS-derived fractions of time and energy that the long-term steering schedule will spend in each mode. The combination gives:

  • AEP uplift P50: +0.7%, σ = 0.4%, P95 = 0.0%
  • Long-term yaw-activity change: −2.4% wind farm average, with an individual turbine maximum of +8.1% on T03 (the most actively-steered turbine).

scripts/wfc_analysis_2026 also includes:

  • inspect_data.py — quick sanity plots of all data sources together.
  • zx300_wake_steers.py, zxtm_wake_steers.py — wake steer plots with data from the on-site ZX300 (near T11) and ZXTM (on T07) LiDARs.
  • z300_wake_steer_animation.py, zxtm_wake_steer_animation.py — matplotlib animations of LiDAR and turbine data during steering events.

The output of zxtm_wake_steer_animation.py is shown below (note wind is coming from SSW, bottom left of the middle plot): zxtm_wake_steer_animation

Earlier upgrade analysis (published in 2025)

The folder scripts/uplift_analysis_2025 uses wind-up to run two analyses of energy uplift after turbine upgrades.

Note any analysis can be run without running the others, e.g. you do not need to run northing.py before aero_up.py.

The script scripts/uplift_analysis_2025/northing.py calculates the northing corrections saved to scripts/uplift_analysis_2025/wind_up_config/northing/optimized_northing_corrections.yaml and used in subsequent analyses. The plot below shows the circular difference of ERA5 wind direction to each turbine's yaw direction before the northing correction. The turbine north calibrations are apparently often wrong, which means the northing correction is quite important.

northing error vs reanalysis_wd before northing

AeroUp

The script scripts/uplift_analysis_2025/aero_up.py analyses the energy uplift thanks to AeroUp for T13. The result is a P50 uplift of 4.3% with a 90% confidence interval of 3.3% to 5.3%. This is visualized in the plot below along with the uplift results for the three selected reference turbines, which are near 0% uplift as expected:

combined uplift and 90% CI

TuneUp

The script scripts/uplift_analysis_2025/tune_up.py analyses the energy uplift thanks to TuneUp for nine test turbines. The result is a P50 uplift of 1.1% with a 90% confidence interval of 0.2% to 2.0%. This is visualized in the plot below along with the uplift result for the ten unchanged reference turbines, which is near 0% uplift as expected:

combined uplift and 90% CI

Code for WeDoWind challenge

scripts/wedowind_challenge_2025 contains code used for the WeDoWind 2025 power prediction kaggle competition, which used the Hill of Towie open dataset. solution_using_wind_up.py needs a few extra packages that are not in the locked environment; see its docstring.

Using hot_open in another project

The helper package is published on PyPI:

uv add hot-open

Releases follow semantic versioning; while the version is 0.x, a minor version bump may contain breaking changes. Release notes are on the GitHub releases page. The analysis scripts under scripts/ are not part of the package.

Python environment

The environment can be created and managed using uv. To create the environment:

uv sync

To run formatting and linting:

uv run poe all

Configuration

All filesystem paths used by the scripts and helpers are controlled by environment variables. Each variable is optional — if unset, the default location under your home directory is used and created on first access. Values can either be exported in your shell or written to a .env file at the repo root (auto-loaded via python-dotenv).

Variable Default Used for
HOT_OPEN_DATA_DIR ~/temp/hill-of-towie-open-source-analysis/data Input data: Zenodo downloads land here (SCADA zips, LiDAR data, fastlog data, metadata CSV).
HOT_OPEN_OUTPUT_DIR ~/temp/hill-of-towie-open-source-analysis/output Per-script output directory (one subfolder per script, named after the script's filename).
HOT_OPEN_CACHE_DIR ~/temp/hill-of-towie-open-source-analysis/cache Parquet caches for unpacked SCADA, fastlog-by-day, ERA5, and wind-up intermediates. Safe to delete to force a rebuild.
HOT_OPEN_FILESTORE_DIR <HOT_OPEN_DATA_DIR>/turbine_fastlog/Filestore Fastlog tree (FL/<park>/<device>/<date>/). When set explicitly, load_hot_fl_data() skips the Zenodo download of turbine_fastlog.zip.
WINDUP_OUTPUT_DIR ~/temp/hill-of-towie-open-source-analysis/windup_output Root directory wind-up analyses write their per-assessment output into.

Example .env:

HOT_OPEN_DATA_DIR=D:/hot_open/data
HOT_OPEN_CACHE_DIR=D:/hot_open/cache
WINDUP_OUTPUT_DIR=D:/hot_open/windup_output

Contact

Alex.Clerc@res-group.com

Metadata

Release files for hot-open 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for hot-open 0.2.0
File Size Uploaded
hot_open-0.2.0.tar.gz 39.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for hot-open 0.2.0
File Interpreter ABI Platform
hot_open-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 78.7 kB

Release files / hot_open-0.2.0.tar.gz

Download URL hot_open-0.2.0.tar.gz
Size 39.5 kB
Tags Source
SHA-256 checksum
How to use checksums
8fc1a1d4de78d995896733ecb921b97e9d54198fcae51b660316b7d53c304246
BLAKE2b-256 checksum
How to use checksums
5965ae0f05cb63f94c6d9e579344498718be8a8a757b2661eaf3527dc6d92921
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / hot_open-0.2.0-py3-none-any.whl

Download URL hot_open-0.2.0-py3-none-any.whl
Size 39.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
23ea9f00e03ad6970b8763cd08cd83ca06d37fd4de328423ec25b90532034892
BLAKE2b-256 checksum
How to use checksums
880bc8280be1c71261746b65191a1d4e600528614fcfb75197c505b1ff619bbf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release history Release notifications | RSS feed

0.2.1

2 release files

This release

0.2.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page