Skip to content
Whyphy Technologies
All work
Renewable energy

FTC Solar

Solar tracker control systems

FTC Solar builds solar tracking systems, and the software that drives them has to work in a field with no signal, on hardware that has been in the sun for three years. We work across two surfaces: Mission Control, the cross-platform app crews carry, and the Voyager Zone Controller, the browser-based operator UI that runs on the ruggedised board sitting in the array itself.

FTC Solar, Solar tracker control systems
Our role
Front-end re-architecture · Cross-platform mobile · Embedded UI · Hardware integration
Platforms
Embedded Linux · Android · iOS · Windows
Stack
React 19TypeScriptViteRedux ToolkitRTK QueryMUISocket.IOMQTTFlutterPythonFlaskMongoDBZigbee / XBeeModbus

The problem

Problem.

The Zone Controller's operator UI had aged into a corner: React 16, a deprecated build toolchain, a 5,800-line component, a single reducer approaching 5,000 lines, no types, and no code splitting, running on an embedded board where every megabyte and every wasted poll costs something. It could not keep being extended, and it could not be switched off. The rewrite had to reach feature parity with a system that talks to real hardware over radio, and land on the same board.

What we built

Solutions.

Not a feature list, the pieces that had to exist for the product to do what it claims.

01

A ground-up UI re-architecture

Fifteen feature modules, each self-contained with its own components, services, socket handlers, store slice and types, replacing a monolith where business logic lived inside JSX.

02

A controller pattern that separates logic from view

Sixty-plus dedicated controller files hold the behaviour, leaving components to render. It is the change that makes the rest of the codebase reviewable.

03

Push instead of poll

Twenty-four periodic polling loops were removed in favour of Socket.IO push, on a device where the UI, the broker, the database and the control engine all share one small board, that is real headroom rather than a style preference.

04

A typed API layer

RTK Query services replaced direct HTTP calls scattered through components, and endpoint strings that had been spread across the codebase were consolidated into one file.

05

Tracker control and commissioning

The dashboard and tracker table, row-controller commissioning, fast scan, and stow and sun-position commands, the day-to-day of getting an array installed and keeping it pointed correctly.

06

Radio and network configuration

Dual-radio Zigbee setup (PAN ID, channel, stack profile, encryption) alongside zone settings for time, timezone, network and controller-to-controller links.

07

Weather-driven stow

Wind, flood, snow and hail sensor integration feeding stow decisions, with hail and diffuse-sun services that can be triggered manually or on a schedule. This is the part that protects the hardware from the weather.

08

Firmware over the air, with a way back

Scheduled OTA updates for row and zone controllers with progress reporting and rollback, because a failed firmware push in a field of trackers is not a support ticket, it's a truck roll.

09

Mission Control, in the crew's hand

The cross-platform app built with Flutter that talks to FTC's Rover hardware over USB and Bluetooth, so a crew manages sun position, motor speed and tilt for a whole field from a single screen.

Straightforward in communications and perfectly understood our needs and expectations. The project required a lot of time, so we had many communication sessions, but it went smoothly. The team did everything that we asked for, from start to finish, even some minor tweaks after the initial launch of the software.
FTC Solar Inc.Andrew Morse, Software Leader, FTC Solar Inc.
Under the hood

The parts that were genuinely hard.

01

A protocol for talking to the box over Bluetooth

Engineers in the field reach the controller over Bluetooth RFCOMM or a TCP socket, through a JSON request-and-acknowledge protocol with its own status codes, asynchronous responses over MQTT, a thread pool and a response queue. Command families cover zone and plant configuration, tracking, network, time sync, controller-to-controller links, sensors, radio settings and custom rover commands.

02

Software that assumes it is alone

The board runs its own message broker, its own database, and a Wi-Fi access point, supervised as more than two dozen managed processes with a health monitor watching them. There is offline patching and SD-card recovery, because the recovery path has to work when the nearest network is an hour's drive away.

03

Physical inputs, handled as physical inputs

Serial drivers for GPS and wind sensors, an XBee parameter service for the radios, Modbus for SCADA, and I²C and analogue-to-digital conversion for the rest. Sun position and backtracking are computed on the box rather than fetched.

04

Where we'd go next, stated plainly

Neither UI codebase has automated tests: the old one didn't, and the rewrite prioritised parity over coverage. The comparative report's own recommendation is a Vitest and React Testing Library phase, and we agree with it. We'd rather say that than imply a finished job.

Measured

What changed, in numbers we can point at.

Source lines, 67,395 down to 28,623.

TypeScript coverage, from none at all.

Largest file, 5,839 lines down to 691.

Polling loops, 27 down to 3.

Got something like FTC Solar in mind?

Tell us where your business is stuck. We'll show you what an AI-native team can ship, and how fast.