Skip to content

Kestrel Energy

A telemetry platform that keeps up with the grid

Kestrel Energy balances 1,900 MW of wind and battery storage across Norway and the UK on data that used to arrive twelve seconds late. We replaced a tag-licensed historian with a streaming platform that carries 2.8 billion readings a day and lands them in under a second.

Client
Kestrel Energy
Sector
Energy
Run
10 months · Sep 2024 – Jun 2025
Filed
2025-06-24
Capability
Data engineering · Cloud migration · Reliability engineering
Stack
Rust · Apache Flink · Apache Kafka · TimescaleDB · OPC UA · Kubernetes · Azure · Grafana · Terraform

Impact

  • 2.8B

    Meter and SCADA readings ingested per day

  • 900 ms

    Sensor-to-control-room latency, down from 12 seconds

  • £640k

    Annual historian licence and colocation cost removed

Challenge

Energy
10 months · Sep 2024 – Jun 2025

The historian charged per instrumented tag, and Kestrel had hit its 250,000-tag ceiling eighteen months earlier — new turbines were being commissioned with telemetry switched off to stay under the limit. Control-room operators made balancing decisions on data that averaged twelve seconds old, which is an eternity when you are bidding into a fifteen-minute settlement period. Monthly regulatory submissions to NVE and Ofgem took two analysts nine working days of spreadsheet assembly, and the numbers did not always reconcile with the traded position.

Solution

We wrote the edge collectors in Rust because they run on constrained gateways at sixty sites and must buffer through a satellite link outage without dropping a reading; each one holds seventy-two hours locally and replays in order. Apache Flink does windowing and validation in the stream, so bad sensor data is quarantined before it reaches a dashboard rather than after an operator has acted on it. Eleven years and fourteen terabytes of historian archive were backfilled into TimescaleDB and reconciled against the original exports row by row. Regulatory reporting became a query: nine days of analyst time is now a forty-minute scheduled job with a signed export. The OT network stayed segmented to IEC 62443 zones throughout — collectors push out, nothing reaches in.

Plates

  • Data pipeline diagram tracing a reading from an OPC UA sensor at a wind site through a Rust edge collector, Kafka, Apache Flink validation windows, and into TimescaleDB and the control-room dashboard.
    Plate 01Sensor to control room, with validation before display.
  • Control-room dashboard showing live output across sixty sites as a stacked area chart, with battery state of charge, curtailment flags and a latency readout of 900 milliseconds in the header.
    Plate 02Latency is displayed on the wall so it stays everyone’s problem.
  • Backfill reconciliation report comparing eleven years of archived historian exports against the migrated TimescaleDB tables, showing matched row counts per year and a variance column of zero.
    Plate 03Fourteen terabytes reconciled year by year before switchover.

Testimony

They spent the first three weeks reading SCADA logs rather than talking to us. The plan they came back with named the two failure modes that had actually been costing us money, and ignored the four we had been arguing about internally for a year.

Rohan Agarwal · Head of Grid Operations Technology, Kestrel Energy5 out of 5