One body, many missions
The array is the hardware; the mission is the software. The same platform has been pointed at sleep and presence monitoring, wildlife observation, perimeter security, and mechanical health baselines — no rebuild between them.
Autonomous multi-sensor field platform
MOASAS is a field instrument that carries optical, thermal, acoustic, environmental, and positional sensors on a single compute core — with an on-board AI layer that reads its own instruments and reports what it finds, in plain language, without a person watching the feed.
Designed and built from scratch by Lee Newton, starting October 2024. It is currently running unattended at a remote residential site over cellular and mesh VPN.
MLX90640 thermal array with object-detection overlay, as rendered by the on-board dashboard. Frame shown here is simulated for the web — the platform composes the same view live from real sensor output.
Design intent
The array is the hardware; the mission is the software. The same platform has been pointed at sleep and presence monitoring, wildlife observation, perimeter security, and mechanical health baselines — no rebuild between them.
No sensor is wired into the main application. Each one runs as its own process and publishes to a shared JSON contract. Add a peripheral, and its history becomes queryable by the AI layer without touching the core.
The standing rule is features wait, stability doesn't. Any anomaly — a thread, a resource curve, an unexpected log line — stops feature work and starts diagnostics until the cause is named.
Hardware
Chassis, module shells, mounts and panels are designed and printed in-house. Each sensor lives in its own removable bay behind its own faceplate, so a module can be pulled or replaced without opening the compute section — and a new one only has to fit the bay and honour the logging contract.
An earlier revision sweeping on the pedestal head, bays still open. Pointing is currently manual and by tool call; the ground-up turret build replaces this head.
Instrumentation
| Subsystem | Hardware | Function |
|---|---|---|
| Compute core | Radxa Rock 5B+ · Ubuntu 22.04 · NVMe | Flask/gunicorn platform, all sensor processes, local inference |
| AI layer | Claude API, local 7B fallback | Reads live sensor state, answers questions about it, calls read-only tools with audit logging |
| Optical | Arducam · YOLOv8 | Object and person detection, presence tracking, event-gated recording |
| Thermal | MLX90640 · 32×24 @ 8 Hz | False-colour thermal field, mechanical and body heat signatures |
| Acoustic | USB microphone · YAMNet TFLite | Sound-event classification on a rolling buffer, threshold-triggered |
| Environmental | BME688 on ESP32-S2 | Temperature, humidity, pressure, air quality — logged continuously |
| Position | BN-880 GPS | Location and time reference for mobile missions |
| Pointing | ESP32 pan/tilt gimbal · UDP | Directed observation; custom pedestal-turret build in progress |
| Link | SIM7600G-H LTE · dual-radio Wi-Fi · mesh VPN | Cellular uplink with self-hosted AP; full remote operation and shell access |
| Power | PD battery rails · inline metering | Field endurance measured under full sensor load; hold-through on input transitions in development |
| Module bay | Per-port-power-switched USB hub | Named power control per peripheral for hot-swap and unattended recovery |
Interface
The platform serves a single responsive web interface. The same URL gives a full instrument wall on a desktop and a stacked, thumb-reachable layout on a phone — live camera, thermal field, audio classification, environmental and positional readouts, gimbal control, and a chat pane to the on-board AI. Nothing is desktop-only, which matters when the array is in the field and the operator is holding a phone. Both captures below are the real interface, unedited apart from the network detail.
Wildlife observation, unattended and in real time — deer in the camera feed while the detection log, audio classification, satellite lock and power draw all keep running beside it. Press play; this one doesn't autoload.
Live dashboard during unattended operation. Faces are deliberately obscured and network detail removed; everything else is the real interface, unedited.
The thermal field renders as a character grid rather than an image — each cell is a glyph and a colour, so it stays legible at 32 × 24 and costs almost nothing to push over a slow link. Density and hue climb together, which makes a warm body separate from its background at a glance.
AI layer
Because every sensor publishes to the same contract and every reading is appended to its own history, the AI layer can be asked about any of it in plain language — no dashboards to read, no logs to grep. It answers from the data it actually holds, and it interprets rather than just reporting: below, it explains a suppressed gas-resistance reading in terms of humidity, because that is how the BME688 behaves.
Hey HAL, what has the temperature, humidity and air quality looked like today?
Here's the full picture for today, July 27th — 1,115 readings logged.
| Min | 29.5 °C / 85.2 °F |
| Avg | 30.2 °C / 86.4 °F |
| Max | 31.6 °C / 88.8 °F |
| Now | 31.6 °C / 88.8 °F |
Stable and hot all day — only a 2°C spread, and you're sitting at the daily maximum right now at 6:34 PM EDT. The space hasn't cooled off yet this evening.
| Floor | 55.7 % |
| Avg | 61.2 % |
| Max | 70.3 % |
| Now | 67.9 % |
Today's RH floor is 55.7% — notably higher than the ~46–50% floors we've seen on better days. The AC either hasn't run long enough or the moisture load has been heavier. Currently climbing back toward the daily high.
| Min | 60.5 KΩ |
| Max | 106.5 KΩ |
| Now | 64.6 KΩ |
Sitting near its daily low. That tracks — high humidity suppresses gas resistance on the BME688, and at 68% RH the sensor reads the air as relatively stale. The 106 KΩ peak earlier was likely the driest window, when the AC was running.
KEY TAKEAWAYS
A real exchange, reproduced as returned. The environmental history it draws on runs to several thousand readings at one-minute resolution.
Architecture
Every peripheral, wired or wireless, obeys the same agreement. It writes its own state to a file; a generic logger keeps its history; a generic tool makes that history answerable. Nothing about adding a sensor requires editing the application that serves the dashboard.
Cold swap is the default for any sensor reconfiguration — it is the only always-safe path. Observation-only port control stays live because it never switches power. Live-bus cycling stays shelved until inrush behaviour is proven on an isolated supply.
Explicit per-file staging, timestamped backups before any edit, a compile gate before any service restart, one command at a time with read-back verification. Destructive writes are confirmed out loud.
The production disk has a verified bit-for-bit cold spare, checksum-probed and stored offline. A second unit runs from a scrubbed clone with its own identity, so bench work can never reach the deployed system.
Field record
The live deployment runs an event-gated pipeline end to end without supervision: detection identifies a subject and a context object together, the recorder opens a session, hysteresis closes it, chunks roll to disk under a hard cap, and an overnight pull moves the archive to a second machine on a rate-limited, read-only-at-source transfer. Absence alerting has fired correctly on a real event. The AI layer answers questions about all of it by prompt.
The site is unattended. Everything above was commissioned, and is maintained, over a remote shell from a phone.
Development log
Next
Ordered, and worked one at a time.
Contact
Open to conversations about deployments, sensor integrations, and the platform's use in monitoring and field-observation work.