☰
HomeAbout UsSupportContactPartner With Us

NP × NParks Control Panel · Operations Manual

Weed Harvester Operations Manual

A complete walkthrough of the desktop control panel for the NParks Weed Harvesting Boat: installation, first login, every page, hardware setup, and troubleshooting.

Contents

00 Overview01 Before You Start02 Installation03 First Run & Login04 The Five Pages05 GPS & Routing06 Battery (BMS)07 Settings08 Offline Map Data09 Closing the App10 Troubleshooting11 Quick Reference12 Field Deployment & Network Test

00 — Overview

What this system does

The Control Panel is the onboard interface for operating and monitoring an NParks weed-harvesting boat: GPS position and routing, live battery telemetry over RS485, and (in progress) a camera feed, all from one full-screen kiosk application.

It is an Electron desktop app with five pages reached from the left sidebar: Home, GPS & Routing, Camera, Battery, and Settings, backed by a Node.js main process that talks directly to the battery hardware over a serial RS485 connection, and to two small Python services for weather logging.

Note

This manual covers the app as currently built. The Camera page's live feed is not yet wired up; see section 10 for status and section 04 for what each page does today.

01 — Before You Start

What you need on the machine

Everything below is required to build and run the app from source. Items marked optional are only needed for specific features.

RequirementUsed forNotes
Windows 10/11Target platformwin32
GitCloning the repository 
Node.js + npmRunning and building the appElectron 41 toolchain
Python 3Weather logging servicesOptional — Home dashboard weather tiles only
RS485-to-USB adapterBattery (BMS) pageOptional until you connect real hardware
Java 17+Generating offline map dataOptional — only for building an .mbtiles package

Hardware you'll need

Two physical items are specific to this project and worth having in hand before you start: the battery pack assembly and the RS485-to-USB adapter that bridges it to the laptop running the app.

The two LiFePO4 battery packs with BMS wiring and balance leads, as installed on the boat

Battery packs — the two LiFePO4 packs (Battery 1 & Battery 2) with their BMS wiring harness and balance-lead connectors.

RS485-to-USB adapter plugged into a laptop's USB port, with the green screw-terminal RS485 connector visible

RS485-to-USB adapter — plugs into a free USB port; the green screw-terminal block is where the battery's A/B communication lines connect.

02 — Installation

From a fresh clone to a running app

This is the exact sequence; each step depends on the one before it.

1

Clone the repository

Pick a working folder and pull the source down.

cmd

git clone https://github.com/Xovai/NP-X-NParks-control-panel.git
cd NP-X-NParks-control-panel
2

Install dependencies

The project has two package.json files: the repo root and App/. Install both.

cmd

npm install && cd App && npm install && cd ..
Note

serialport (the Battery page's RS485 connection) is a native module. If the app throws a module version-mismatch error on launch, rebuild it against Electron's Node version: cd App && npx electron-builder install-app-deps

3

Set the admin password

The app can only be closed by entering an admin password; it's read from an environment file that isn't checked into git, so you set it once per machine.

cmd

cd App
copy .env.example .env
# then open .env and set:
ADMIN_PASSWORD=your-chosen-password
Warn

Skip this and the app still launches, but the exit dialog will reject every password; you'll see a console warning on startup as a reminder. There's no other way out of the kiosk window.

4

Launch the application

The launcher starts the background weather/camera services, then the Electron app itself. If you'd rather not use the terminal, open the App folder in File Explorer and double-click start-app directly:

cmd

start-app.bat
File Explorer showing the App folder contents, with start-app highlighted

App/ folder — start-app is the Windows Batch File; double-click it to launch.

Windows Open File Security Warning dialog for start-app.bat, with the Run button highlighted

Windows will show an unknown publisher warning the first time; this is expected for an unsigned internal tool. Click Run to continue.

03 — First Run & Login

Signing in

The app opens full-screen on the login page. Enter the standard operator credentials:

FieldValue
Usernameadmin
Passwordadmin

This is separate from the admin exit password configured in App/.env; login gets you into the app, and the exit password is only asked when closing it. On success you land on the Home dashboard.

The Boat Control Panel login screen with empty username and password fields

The login screen, as it appears full-screen on launch.

The login screen after entering admin credentials, showing a green Access Granted button

After correct credentials, the button switches to Access Granted and redirects to Home.

04 — The Five Pages

What's in the sidebar

Navigate between pages from the left sidebar at any time; it also has a collapse toggle for a wider working view.

Dashboard

Home

At-a-glance GPS map, current location, orientation (roll/yaw/pitch), and battery status; the default landing page.

Navigation

GPS & Routing

Full-screen map, live position, and the waypoint manager. Covered in detail in section 05.

In progress

Camera

Reserved for a live onboard camera feed. Not yet connected; see section 10.

Hardware

Battery

Live BMS telemetry over a direct RS485 connection. Covered in detail in section 06.

Configuration

Settings

Serial port, camera IP, and map preferences. Covered in detail in section 07.

The left navigation sidebar, listing Home, GPS and Routing, Camera, Orientation, Battery Management, Settings, and a Sign Out link

The sidebar is a shared component loaded into every page, so the navigation stays identical everywhere.

The Home dashboard grid, showing the GPS map, camera view placeholder, current location panel, and orientation panel

Home arranges the map, camera placeholder, location, and orientation panels in a responsive grid.

05 — GPS & Routing

Map, position & waypoints

The map fills the page; a floating panel on the right shows live GPS coordinates and holds the controls.

Map controls

Adding waypoints

Three ways to place a waypoint, all in the Waypoint Manager card:

Every waypoint pin can be dragged directly on the map to fine-tune its position, and clicking a waypoint in the list (not its ×) re-centers the map on it. Waypoints persist automatically between sessions; nothing to save manually.

Online vs. offline map

By default the map uses OneMap and needs internet access. With Offline Map Fallback enabled in Settings (section 07), the app switches automatically to a locally stored map the moment it detects no internet connection, and switches back once connectivity returns; no action needed on this page either way.

06 — Battery (BMS)

Connecting to the battery hardware

This page talks directly to the battery management system over RS485; there is no separate bridge application to run first.

1

Plug in the RS485-to-USB adapter

Note which COM port Windows assigns it.

2

Choose the port and baud rate

Use Refresh if the port isn't listed yet. Baud rate defaults to 9600, matching the hardware.

3

Click Connect

The app polls both battery packs, Modbus slave addresses 0x81 and 0x82, automatically once connected, and remembers this port/baud rate for next time.

What's on screen

PanelShows
Hero statsTotal voltage, state of charge, current, live power
Cell Voltage Grid (24S)All 24 cells, colour-flagged against the pack average
Health ReportCycle count, remaining capacity, avg/max/min cell voltage, cell differential
Thermal ManagementT1 / T2 sensors and MOSFET temperature
Live System LogConnection events and read errors, newest first

Use the Battery 1 / Battery 2 tabs to switch which pack the panels are showing; both are polled in the background regardless of which tab is active.

Alarm

A red alarm indicator appears if any temperature sensor exceeds 60°C or total voltage drops below 42V.

Cross-checking with the manufacturer's tool

If a reading looks wrong, it helps to verify it independently with BMS Tool, the battery manufacturer's own Windows diagnostic utility, connected to the same RS485 line. It shows the same registers the app reads, per battery, addressed individually:

BMS Tool software showing live data for Battery 1: 79.9V total, 81.1% SOC, per-cell voltages, and temperatures

BMS Tool, Battery 1 (Addr_01): total voltage, SOC, per-cell voltage grid, and temperatures.

BMS Tool software showing live data for Battery 2: 79.9V total, 80.8% SOC, per-cell voltages, and temperatures

BMS Tool, Battery 2 (Addr_02): same layout, second pack.

Note

BMS Tool's own Addr_01 / Addr_02 dropdown is a separate addressing scheme from the app's Modbus slave addresses (0x81 / 0x82); see the case study in section 10 for why both packs need distinct addresses at all.

07 — Settings

Configuring the system

Four groups, top to bottom:

Serial Connection

COM Port, Baud Rate, and Update Rate — reference fields for the connected serial hardware.

Camera

Camera 1 IP — reserved for the IP camera feed (not yet active, see section 10).

Map

System & Alerts

Test Alarm plays the alert sound to confirm audio output is working.

08 — Offline Map Data

Enabling the offline fallback map

The offline map needs a local tile package that isn't included by default. The quickest way to get one:

1

Get an .mbtiles package

Download MOBAC (Mobile Atlas Creator, free). Choose the OpenStreetMap Mapnik map source, select the area you need, and export as MBTiles (SQLite).

2

Place the file

Save it as exactly:

App/Map/offline-data/singapore.mbtiles

3

Restart, then enable it

Restart the app, open Settings, and turn on Offline Map Fallback. The status line will read "Offline map data found" once it's picked up correctly.

Tip

Covering a wider area at higher zoom levels produces a much larger file. For anything beyond a small demo area, see App/Map/offline-data/README.md for building a package with Planetiler instead.

09 — Closing the App

Exiting the kiosk window

The window has no title bar and won't close on its own; this is deliberate, so the app can't be dismissed accidentally while the boat is operating. Use the in-app exit control and enter the admin password configured in App/.env (section 02, step 3). An incorrect password shows an Access Denied dialog and the window stays open.

A Restricted dialog reading: You must enter the admin password to exit, with an OK button

What you'll see if you try to close the window without the admin password.

10 — Troubleshooting

Common issues

"Access Denied" every time you try to close the app

App/.env either doesn't exist or ADMIN_PASSWORD is unset. Check the terminal the app was launched from for a startup warning, then redo section 02 step 3.

Battery page won't connect / times out

Settings shows "No offline map data installed yet"

The .mbtiles file described in section 08 isn't in place, or the app hasn't been restarted since adding it.

Camera page is blank

Expected for now; the camera proxy service is a placeholder and no live feed is wired up yet. This is tracked as in-progress, not a fault in your setup.

Weather figures on Home don't update

The weather dashboard reads from a local Flask service that isn't started by default outside of start-app.bat. See README.md in the repo root for running weatherdata.py and server.py directly.

Case study: only one battery is detected

Resolved during commissioning

Symptom

With both battery packs physically connected, the BMS software could only detect one pack at a time, never both simultaneously, making it impossible to read live values from the second pack.

Root cause

A serial communication address conflict: both battery packs shipped configured to the same communication address (Addr_01), so they collided on the shared RS485 bus instead of responding individually.

Resolution

One pack's communication address had to be changed manually: splicing into its communication line, connecting it to the manufacturer's programming tool, and reassigning the address in the manufacturer software. Final addressing: Battery 1 = 0x01, Battery 2 = 0x02.

Tip

If you ever swap in a replacement battery pack, check its address before wiring it in; a fresh pack from the manufacturer is likely to default back to Addr_01 and collide with whichever pack already holds that address.

11 — Quick Reference

Defaults & key locations

Credentials & hardware defaults

App loginadmin / admin
Exit / admin unlock passwordset in App/.env
BMS baud rate (default)9600
BMS slave addresses0x81 (Battery 1), 0x82 (Battery 2)
Weather API port127.0.0.1:5000

Key files

Admin passwordApp/.env
Saved waypointsApp/user-data/waypoints.json
App preferences (map mode, offline fallback)App/user-data/app-settings.json
Offline map tilesApp/Map/offline-data/singapore.mbtiles
BMS connection logicApp/services/bmsService.js

12 — Field Deployment & Network Test

Wireless coverage at Eco Lake

Before relying on a live camera feed on the water, the wireless link that will carry it was tested on site at Eco Lake, Singapore Botanic Gardens (Bukit Timah Core), across nine points around the lake.

Network layout

One router paired with two long-range 5GHz access points covers the lake from opposite shores; the IP camera connects to the router over a direct LAN cable, and every other client, including the test laptop, joins over Wi-Fi.

Network diagram: a Camera connects by direct LAN to a Router, which links wirelessly to Access Point 1 and Access Point 2

Router + camera in one hut facing the lake; AP1 and AP2 extend coverage to the far shore.

Aerial map of Eco Lake with nine numbered test location markers and the Router plus AP1 position marked

The nine test locations ringing the lake, plus the Router+AP1 and AP2 mounting points.

Network SSIDWiFi-AX_E5AC_Main
Target deviceIP camera 192.168.2.122
Hardware1 main router + 2× long-range 5GHz access points

Methodology

At each of the nine locations, the same sequence was repeated:

1

Associate

Connect the test laptop to WiFi-AX_E5AC_Main and confirm it receives an IP address in the 192.168.2.x subnet.

2

Test communication

Open Command Prompt and run ping 192.168.2.122 to confirm the camera is reachable.

3

Measure latency

Open a browser to the camera's stream endpoint and record round-trip responsiveness.

4

Record & relocate

Log throughput, packet loss, and jitter, then move to the next of the nine locations and repeat.

Results

LocationDownload (Mbps)Upload (Mbps)Ping (ms)Jitter (ms)
117.637.4612
2————
31.20.189167
43.52.982
522.010.272
655.763.679
745.525.366
846.123.363
926.313.068
Note

Location 2 recorded no result. Location 3, directly opposite both access points across the widest stretch of water, shows the weakest throughput; worth keeping in mind when planning camera-dependent routes.