Fathomiser
Water-tank monitoring, from a cellular sensor to useful levels, history and alerts.
Fathomiser was a family venture for remotely monitoring water tanks. I was a founder and worked on the software between the device and its owners: decoding readings, estimating tank volume, building the React dashboard, and extending it into mobile projects with Capacitor.
The software combined tank configuration with distance readings, kept a timestamped history, and surfaced battery and last-active information. Later services handled changes in tank level and missing check-ins through notification rules and offline alerts. This page looks back at that work.
Highlights
- Cellular sensor readings translated into water volume
- React and TypeScript dashboard with mobile projects
- Tank history, battery and last-active information
- Installation warnings and configurable alerts
In action
The tank behind the number
The question was practical: how much water is left in a tank when you are somewhere else? A cellular device measured the distance towards the water surface and sent readings to the backend. The owner could check the level in a dashboard without visiting the tank. Our experience with dry summers in rural Northland helped motivate the family venture.
A distance in millimetres became an estimated volume through the tank’s configured height, capacity and overflow offset. The backend aligned the units and bounded the result between empty and full. Those settings were part of the measurement itself: a chart could only show useful litres when the sensor reading and installation details agreed. The proportional calculation was an estimate, rather than a model for every possible tank shape.
Give device data its meaning
The device sent binary packets containing its identity, sequence, time, distance, battery voltage and accelerometer readings. The software needed to interpret those bytes before they became ordinary application data. Units and encodings mattered just as much as the TypeScript types used after decoding.
In March 2022, I replaced an assumption that the device’s timestamp was Unix seconds with a decoder for its calendar components. Year, month, day, hour, minute and second had to become a UTC date before the reading entered storage and history. Orientation checks addressed another physical detail: a device pointing the wrong way could prompt an installation warning asking the owner to check it.
A level needs context
The dashboard paired current volume with a history of readings, recent change, average daily usage and estimated days remaining. Battery voltage and last-active time helped explain the state of the device behind the chart. The days-remaining figure was a simple estimate based on recent usage, with the history available to put it in perspective.
I worked on tank overviews, charts, settings, reading data and the notification-rule editor. React and TypeScript supported the browser dashboard, while later Capacitor work connected the interface to iOS and Android projects. The same tank configuration and readings needed to remain understandable across those screens.
Explain readings and silence
Notification rules described changes in tank level over a chosen period. The later backend compared a new volume with an earlier reading, related the difference to tank capacity and checked it against the rule. A separate offline detector checked whether a tank had stopped reporting, allowing twice its configured check-in interval before identifying it as offline.
A level alert and a missing-data alert carry different meanings. One describes a change in measured water; the other says the system has stopped hearing from the device. Temporary recipient records limited repeated warnings. Following the measurement through ingestion, history and notifications was a large part of the software work, with collaborators contributing across electronics, firmware, product development and the business.

