Case Study . Vec-TR, Vecmocon Technologies

Making Remote EV Commands Safe and Reliable

Command Centre is the module we designed in Vec-TR that lets fleet operators and engineers push firmware and configuration updates to thousands of connected IoT devices across EV fleets, in a way that's structured, traceable, and safe by design.

Team

Product Designer, Developers, Product Managers

Duration

11 Months (2023 - 2026)

Platform

Web app

Decipline

Research, UX, UI, Testing

This project involved a larger team of 13 Developers, 2 Product Managers, 2 Designers and 1 Design Lead, 3 QA Analysis and Product Managers of BMS, IoT and Charger.

Overview

Vec-TR is Vecmocon's SAAS platform for monitoring EV fleets remotely — giving operators visibility into asset health, device status, and field issues in real time, from anywhere. Command centre is the part of it that is built to push changes back out to the fleet, rather than just watching it.

The scale is what makes the risk real: Vec-TR tracks close to 10,000 connected devices, each one physically installed inside a vehicle already running on the road. Sending a single firmware command can target up to 500 assets at once — and there's no undo. Once a command reaches a device, it's committed. This project is about making those remote safe and reliable for operators.

The Challenge

Our engineering team were sending firmware updates using Python script, manually coordinated firmware files over chats and spreadsheets. The process "worked" in sending commands but a wrong hardware version would only surface after the command had been sent.

The problem wasn't a missing feature. It was that the existing process would let user do anything, right up until something went wrong with the vehicle.

Solution

We defined two principles that shaped every decision that followed. The goal was to introduce positive friction — small, deliberate pauses that reduce the user's cognitive load by shifting validation from memory to system.

01 - VALIDATE BY SYSTEM

Don't expect user to remember every compatibility rules, let the system validate it.

02 - ONE COMMITMENT AT A TIME

Each step locks in a decision before revealing the next. Instead of managing every variable simultaneously, the user moves through a narrowing set of certain choices.

File Management

A single source of truth for firmware

A central home for firmware files, shifting the memory load from person to system.

Creating a firmware file

Metadata — version, compatible hardware, organisation — set once at creation, then reused as validation everywhere the file is used.

Switching a firmware file from inactive to active

Inactive by default — a file can't be used in a command until someone deliberately switches it on.

This one decision closes the most common failure mode we saw in the old process — a file being deployed before anyone confirmed it was the right one.

Create Command

A guided, 4-step wizard

One decision at a time, checked by system as user go.

1

Select file & devices

Choosing a file first filters the next screen to only compatible assets — anything incompatible simply isn't included. Switch between a flat list or grouped view depending on scale, and assets already mid-command show as unavailable, linked straight to the batch that's blocking them.

Selecting a compatible firmware file before choosing assets.

Incompatible assets automatically excluded from selection.

Toggling between flat list and grouped asset view for scalable selection.

User can directly link to the blocking batch, so they can decide whether to intervene rather than hit a dead end.

2

Set the trigger

Immediate runs the command the moment it's created. Manual holds it pending — open for review, escalation, or cancellation.

3

Set a timeout

A Never command keeps retrying indefinitely, for fixes that can't wait. A defined threshold stops zombie commands from draining device batteries on repeat failed attempts.

4

Review & commit

Every decision — file, targets, trigger, timeout — shown once, and locked. The last chance to catch a mistake before it reaches up to 500 real vehicles.

Command logs

A live audit, with room to act

Every command sent, tracked from

Pending

In progress

Pass

Failed

Ended

Real-time monitoring

Track batch level progress, or drill into the detailed performance of command in every asset.

Manual trigger holding state

Waiting command sit in Pending state with a prominent 'Trigger' action so it does not go unnoticed.

Edits Before Launch

Pending batches can be reviewed and adjusted for last minute changes before they go out.

Retry Command

Retry a command stuck in a long in-progress state or failed due to an error. Clear memory before retrying increase chance of success in next run.

Impact & Learnings

100%

The engineering team fully shifted from python scripts to Command Center.

100%

Reduction in mis-sent commands and configurations.

Friction only earns its place if it catches a real failure. Every pause we added — inactive files, locked steps, the final review — had to prove it stopped something from going wrong, or it was just annoyance in disguise.

Validation has to live inside the flow, not beside it. Moving compatibility checks into the wizard, instead of a rules doc, is what actually changed behaviour — nobody reads a rules doc under deadline.