This server has not enabled fleet reporting.
\n Back to rover page\n
+
+
# Optional passive fleet telemetry, history, and daily reporting. The collector
# observes existing server events and rover sensor frames but never participates
# in command, assignment, docking, or safety decisions.
diff --git a/server/public/assets/FleetReportsApp-BqFpSAgV.js b/server/public/assets/FleetReportsApp-DciZHJcm.js
similarity index 99%
rename from server/public/assets/FleetReportsApp-BqFpSAgV.js
rename to server/public/assets/FleetReportsApp-DciZHJcm.js
index dcc0750e..6e1f2832 100644
--- a/server/public/assets/FleetReportsApp-BqFpSAgV.js
+++ b/server/public/assets/FleetReportsApp-DciZHJcm.js
@@ -1,4 +1,4 @@
-import{g as Me,u as Ae,a as Ne,i as De,b as Ie,D as Le,j as e,c as Te,S as Fe,t as Pe,C as de,L as Oe,r as he,d as We,e as Ue}from"./index-B0pLdqo3.js";var be={exports:{}};var He=be.exports,Ce;function $e(){return Ce||(Ce=1,(function(S,M){(($,v)=>{S.exports=v()})(He,function $(){var v=typeof self<"u"?self:typeof window<"u"?window:v!==void 0?v:{},B,z=!v.document&&!!v.postMessage,f=v.IS_PAPA_WORKER||!1,ie={},w=0,o={};function b(t){return t.charCodeAt(0)===65279?t.slice(1):t}function C(t){this._handle=null,this._finished=!1,this._completed=!1,this._halted=!1,this._input=null,this._baseIndex=0,this._partialLine="",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},(function(r){var s=je(r);s.chunkSize=parseInt(s.chunkSize),r.step||r.chunk||(s.chunkSize=null),this._handle=new pe(s),(this._handle.streamer=this)._config=s}).call(this,t),this.parseChunk=function(r,s){var i=parseInt(this._config.skipFirstNLines)||0;if(this.isFirstChunk&&0=this._config.preview),f)v.postMessage({results:n,workerId:o.WORKER_ID,finished:i});else if(E(this._config.chunk)&&!s){if(this._config.chunk(n,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);this._completeResults=n=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(n.data),this._completeResults.errors=this._completeResults.errors.concat(n.errors),this._completeResults.meta=n.meta),this._completed||!i||!E(this._config.complete)||n&&n.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),i||n&&n.meta.paused||this._nextChunk(),n}this._halted=!0},this._sendError=function(r){E(this._config.error)?this._config.error(r):f&&this._config.error&&v.postMessage({workerId:o.WORKER_ID,error:r,finished:!1})}}function re(t){var r;(t=t||{}).chunkSize||(t.chunkSize=o.RemoteChunkSize),C.call(this,t),this._nextChunk=z?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(s){this._input=s,this._nextChunk()},this._readChunk=function(){if(this._finished)this._chunkLoaded();else{if(r=new XMLHttpRequest,this._config.withCredentials&&(r.withCredentials=this._config.withCredentials),z||(r.onload=ae(this._chunkLoaded,this),r.onerror=ae(this._chunkError,this)),r.open(this._config.downloadRequestBody?"POST":"GET",this._input,!z),this._config.downloadRequestHeaders){var s,i=this._config.downloadRequestHeaders;for(s in i)r.setRequestHeader(s,i[s])}var n;this._config.chunkSize&&(n=this._start+this._config.chunkSize-1,r.setRequestHeader("Range","bytes="+this._start+"-"+n));try{r.send(this._config.downloadRequestBody)}catch(p){this._chunkError(p.message)}z&&r.status===0&&this._chunkError()}},this._chunkLoaded=function(){r.readyState===4&&(r.status<200||400<=r.status?this._chunkError():(this._start+=this._config.chunkSize||r.responseText.length,this._finished=!this._config.chunkSize||this._start>=(s=>(s=s.getResponseHeader("Content-Range"))!==null?parseInt(s.substring(s.lastIndexOf("/")+1)):-1)(r),this.parseChunk(r.responseText)))},this._chunkError=function(s){s=r.statusText||s,this._sendError(new Error(s))}}function O(t){(t=t||{}).chunkSize||(t.chunkSize=o.LocalChunkSize),C.call(this,t);var r,s,i=typeof FileReader<"u";this.stream=function(n){this._input=n,s=n.slice||n.webkitSlice||n.mozSlice,i?((r=new FileReader).onload=ae(this._chunkLoaded,this),r.onerror=ae(this._chunkError,this)):r=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount| Rover | Battery | Chemistry | Rated mAh | Installed | Retired | Learned baseline mAh | Notes |
|---|---|---|---|---|---|---|---|
| {battery.roverId} | {battery.batteryKey} | {battery.chemistry || '--'} | \n{number(battery.ratedCapacityMah, 0)} | {timestamp(battery.installedAt)} | \n{timestamp(battery.retiredAt)} | {number(battery.healthyBaselineMah, 0)} | {battery.notes || '--'} | \n
Loading fleet metrics…
: null}\n {error ?{error}
: null}\n {report ? (\n| {rover.name} | {rover.online ? 'online' : 'offline'} | \n{health.capacityRetentionPercent == null ? '--' : `${number(health.capacityRetentionPercent, 1)}%`} | \n{health.measuredUsableMah == null ? '--' : number(health.measuredUsableMah / 1000, 3)} | \n{number(health.measuredUsableWh)} | {health.confidence} | \n{rover.overallWhPerKm == null ? `need ${distance(rover.efficiencyDistanceRequiredMm)}` : number(rover.overallWhPerKm)} | \n{number(rover.movingWhPerKm)} | {distance(rover.distanceMm)} | {number(rover.dischargedWh)} | \n{number(rover.movingDischargedWh)} | {number(rover.stationaryDischargedWh)} | {duration(rover.movingMs)} | \n{rover.averageSpeedMmPerSecond == null ? '--' : `${number(rover.averageSpeedMmPerSecond)} mm/s`} | \n{rover.maximumSpeedMmPerSecond == null ? '--' : `${number(rover.maximumSpeedMmPerSecond)} mm/s`} | \n{number(rover.latestChargeMah, 0)} mAh | {number(rover.averageVoltageMv, 0)} mV | \n{number(rover.averageCurrentMa, 0)} mA | {number(rover.maximumTemperatureC, 1)} °C | {timestamp(rover.lastSampleAt)} | \n
| Rover | Battery | Reference mAh | Estimated usable mAh | Observed range floor | Retention | Observations | Average depth | Throughput | Latest evidence | Confidence basis |
|---|---|---|---|---|---|---|---|---|---|---|
| {rover.name} | {health.batteryKey} | {number(health.referenceMah, 0)} | {number(health.measuredUsableMah, 0)} | {number(health.observedUsableFloorMah, 0)} | {health.capacityRetentionPercent == null ? '--' : `${number(health.capacityRetentionPercent, 1)}%`} | {number(health.observationCount, 0)} | {number(health.averageObservationDepthPercent, 1)}% | {number(health.dischargedThroughputMah, 0)} mAh | {timestamp(health.latestObservationAt)} | {health.confidenceReason} |
| Rover | Severity | Reason |
|---|---|---|
| {item.roverId} | {item.severity} | {item.title} |
Energy is integrated per sensor interval from OI voltage and signed current. Existing odometer distance and speed are consumed directly; reporting does not calculate a competing speed value.
\nCapacity combines partial discharge current with packet 25 charge movement. Every usable observation contributes; deeper observations increase confidence without labeling cycles good or bad. Packet 26 is only a fixed reference.
\nWh/km appears after 25 m of selected-range odometer travel. Existing historical rows predate exact power integration, so their Wh fields remain zero rather than being backfilled with false precision.
\nThis server has not enabled fleet reporting.
\n Back to rover page\n| Rover | Battery | Chemistry | Rated mAh | Installed | Retired | Learned baseline mAh | Notes |
|---|---|---|---|---|---|---|---|
| {battery.roverId} | {battery.batteryKey} | {battery.chemistry || '--'} | \n{number(battery.ratedCapacityMah, 0)} | {timestamp(battery.installedAt)} | \n{timestamp(battery.retiredAt)} | {number(battery.healthyBaselineMah, 0)} | {battery.notes || '--'} | \n
Loading fleet metrics…
: null}\n {error ?{error}
: null}\n {report ? (\n| {rover.name} | {rover.online ? 'online' : 'offline'} | \n{health.capacityRetentionPercent == null ? '--' : `${number(health.capacityRetentionPercent, 1)}%`} | \n{health.measuredUsableMah == null ? '--' : number(health.measuredUsableMah / 1000, 3)} | \n{number(health.measuredUsableWh)} | {health.confidence} | \n{rover.overallWhPerKm == null ? `need ${distance(rover.efficiencyDistanceRequiredMm)}` : number(rover.overallWhPerKm)} | \n{number(rover.movingWhPerKm)} | {distance(rover.distanceMm)} | {number(rover.dischargedWh)} | \n{number(rover.movingDischargedWh)} | {number(rover.stationaryDischargedWh)} | {duration(rover.movingMs)} | \n{rover.averageSpeedMmPerSecond == null ? '--' : `${number(rover.averageSpeedMmPerSecond)} mm/s`} | \n{rover.maximumSpeedMmPerSecond == null ? '--' : `${number(rover.maximumSpeedMmPerSecond)} mm/s`} | \n{number(rover.latestChargeMah, 0)} mAh | {number(rover.averageVoltageMv, 0)} mV | \n{number(rover.averageCurrentMa, 0)} mA | {number(rover.maximumTemperatureC, 1)} °C | {timestamp(rover.lastSampleAt)} | \n
| Rover | Battery | Reference mAh | Estimated usable mAh | Observed range floor | Retention | Observations | Average depth | Throughput | Latest evidence | Confidence basis |
|---|---|---|---|---|---|---|---|---|---|---|
| {rover.name} | {health.batteryKey} | {number(health.referenceMah, 0)} | {number(health.measuredUsableMah, 0)} | {number(health.observedUsableFloorMah, 0)} | {health.capacityRetentionPercent == null ? '--' : `${number(health.capacityRetentionPercent, 1)}%`} | {number(health.observationCount, 0)} | {number(health.averageObservationDepthPercent, 1)}% | {number(health.dischargedThroughputMah, 0)} mAh | {timestamp(health.latestObservationAt)} | {health.confidenceReason} |
| Rover | Severity | Reason |
|---|---|---|
| {item.roverId} | {item.severity} | {item.title} |
Energy is integrated per sensor interval from OI voltage and signed current. Existing odometer distance and speed are consumed directly; reporting does not calculate a competing speed value.
\nCapacity combines partial discharge current with packet 25 charge movement. Every usable observation contributes; deeper observations increase confidence without labeling cycles good or bad. Packet 26 is only a fixed reference.
\nWh/km appears after 25 m of selected-range odometer travel. Existing historical rows predate exact power integration, so their Wh fields remain zero rather than being backfilled with false precision.
\nThis server has not enabled fleet reporting.
\n Back to rover page\n