Telemetry & Monitoring
Researched purchase lists for live telemetry on the E350 — Victron Cerbo GX hub, GNSS position and elevation, BME280 temperatures, OBD-II DTC capture, and the Cloudflare Access path to the site.
What to buy to make the bus observable: bank state of charge, PV yield, inverter output, position, elevation, temperatures, and OBD-II fault codes — and where that data goes afterward.
This page is a purchase list and an architecture, not a build. Nothing here is wired yet. Prices are research figures from 2026-09 and need re-verification before checkout — see Gates.
The good news: the hard part is already paid for. The 2026-09-25 Amazon cart (Solar Quotes) includes a Cerbo GX Mk2. That is the whole telemetry hub — it runs Venus OS, aggregates every Victron device over VE.Direct, logs to the microSD when the network is down, and serves MQTT locally. No separate industrial gateway, no Raspberry Pi, no paid telemetry subscription. See What you already own.
Architecture
48V bank ─┬─ SmartShunt 300A ──── VE.Direct ──┐
│ │
├─ SmartSolar 250/60-TR ─ VE.Direct ─┤
│ │
├─ MultiPlus-II 48/5000 ─ VE.Direct ─┤
│ │
└─ 48V ── Orion DC/DC ── 12V rail ────┼─ ESP32 + WiCAN ── OBD-II ── DTCs
│ (MQTT publish)
BME280 ×3 ────────────────┤
│
USB GNSS (NEO-M8N) ───────┤
│
Cerbo GX Mk2 ───────────────┘
(Venus OS · mosquitto broker · 4× temp inputs · microSD log)
│
│ MQTT over TLS 8883, out over Starlink
▼
Cloudflare Worker (Durable Object + D1 + KV)
│ same hostname, behind Cloudflare Access
▼
Jekyll page polls /api/bus/state
One hub, one broker, one outbound link. Nothing listens inbound.
What you already own
From the 2026-09-25 cart — this is the load-bearing part of the design:
| Part | Priced | Role in telemetry |
|---|---|---|
| Cerbo GX Mk2 | $203.00 | Hub. Venus OS, 3× isolated VE.Direct, 4× temp sense, 4× digital in, VE.Can, BMS-CAN, 2× USB host, Ethernet, Wi-Fi, Bluetooth, microSD. Runs the MQTT broker. |
| GX Touch 50 + wall mount | $149.28 + $17.89 | Local dashboard. Backlight is the biggest power knob — off or dim it when nobody is looking. |
| SmartShunt 300A | (in cart, Sep 26) | Bank SoC, volts, amps, power. The only SoC source, because the ECO-WORTHY BMS comms are closed. |
| SmartSolar 250/60-TR | $345.53 | PV input current/voltage, yield, MPPT state, charger-internal temperature (HEX register, firmware ≥1.53). |
| MultiPlus-II 48/5000/70 (120VAC) | $1,348.65 | Inverter state, AC out power, DC in current. |
| Orion-Tr Smart 48/12V 20A Isolated | $156.11 | The 12V rail — powers the ESP32, GNSS, USB bus. |
| 3× VE.Direct cable 9.84 ft | $52.80 | One per VE.Direct device. Exactly enough. |
| 16GB microSD + Cat-6 patch | $17.95 + $6.25 | GX onboard logging when Wi-Fi is down — the bid sheet already calls this out. |
GX power draw — corrected. Victron’s spec sheet says 2.8 W @ 12 V for the Cerbo GX; the Victron community confirms 2.8 W bare, 3.8 W with the Touch 50 backlight off, 4.8 W at full brightness. Earlier notes in this project put it at 28 W, which was wrong by 10×. At 48 V the same wattage is ~0.06 A. Cost: 67–115 Wh/day depending on backlight — under 3% of the daily load budget. Not a reason to skip the GX.
Left unused on the GX: the BMS-CAN port. Do not plug the ECO-WORTHY bank into it — the BMS comms are closed, and a silent CAN link is worse than none because you will believe SoC data you are not actually getting.
Purchase list — required
Closes the gaps the cart leaves open. Quantities assume 2S3P array (see the array warning).
A. Position and elevation
| # | Item | Spec / why this one | Qty | Est. price |
|---|---|---|---|---|
| A1 | u-blox NEO-M8N GNSS module | Concurrent L1+GPS/GLONASS/Galileo, cold-start fix in ~1 s, cold-start-jam robustness. Reports altitude from the fix — no separate altimeter needed. 3.3 V UART, use with the included active antenna. | 1 | $35–70 |
| A2 | NEO-M8P instead, if accurate timestamps matter | Adds RTC + PPS, so MQTT timestamps stay correct through long power-downs. Worth it if you plan historical trail analysis. Otherwise M8N is fine. | 1 (swap) | $45–90 |
| A3 | USB NMEA-0183 cable / USB-serial adapter | Carries the GNSS to a Cerbo GX USB host port. The GX then shows position as a GPS device and republishes it. Verify Venus OS accepts a plain NMEA-0183 serial source — this is the one integration step that has not been tested. | 1 | $10–25 |
| A4 | 18 AWG or heavier USB extension, 1–2 m | Thin or charging-cable USB is the classic cause of a GNSS receiver that locks satellites sometimes. Buy the fat one. | 1 | $8–20 |
| A5 | Roof/exterior antenna mount + drip loop + sealant | Antenna needs sky view; the cable entry needs the same lap sealant as the panels. | 1 | $15–40 |
Elevation caveat: GNSS altitude is a fix-derived estimate. Off by tens of metres routinely, worse in canyons and under tree cover. Fine for “am I climbing or descending,” not for surveying.
B. OBD-II fault codes
| # | Item | Spec / why this one | Qty | Est. price |
|---|---|---|---|---|
| B1 | ESP32 dev board (ESP32-C3 or -S3) | Runs ESPHome or esp_can2mqtt. Wi-Fi, USB, and it is the part you will actually be able to reflash in the desert. |
1 | $6–15 |
| B2 | WiCAN (MCU-based CAN board, HS3000 + MS-CAN) | OBD-II needs both channels. Classic CAN only is sufficient — the 2014 5.4 Triton is pre-CAN-FD, so do not pay for FD hardware. | 1 | $30–55 |
| B3 | Enclosure, 12 V buck, 5 A automotive fuse, pigtails | The ESP32 is not automotive-grade and playa dust is alkaline (pH ~10). Seal it, fuse it, decouple it. | 1 lot | $20–40 |
| B4 | 3.3 V ↔ 5 V level shifter (4-channel, BSS138-type) | ESP32 is 3.3 V logic; OBD-II transceivers and several CAN boards are 5 V. Not optional. | 1 | $4–8 |
Alternative if you want Linux instead of firmware: a CANable 2.0 / canable pro ($40–80) plus a small SBC gives you candump/cansend and full logging control — more flexible, more parts, more to break. Buy this only if you already run a small Linux box on the bus.
C. Temperatures
| # | Item | Spec / why this one | Qty | Est. price |
|---|---|---|---|---|
| C1 | Victron temperature sensor, 10 m (ASS000001000 — verify current PN) |
For the GX’s 4 dedicated temp inputs and the MultiPlus-II’s battery-temp input. Buy for battery bank, inverter/rack cabinet, and one spare. Battery temperature is what should set your charge limits, and the SmartShunt 300A has no temperature input of its own. | 3 | $12–35 ea |
| C2 | BME280 breakout (I²C or 1-Wire) | Humidity is the bonus — on a sealed bus, condensation is the failure mode that kills electronics. Interior, battery bay, and one ambient probe outside the shell. | 3 | $8–20 ea |
| C3 | Vented mounting for the battery-bay BME280 | Mount where it reads cell temperature, not the enclosure wall. A sensor bolted to a warm metal rack wall reads the rack, not the battery. Conformal coat the board. | 1 lot | $10–20 |
Why both C1 and C2: C1 is for charge control and load-shedding (Victron’s own number, correct behavior). C2 is for humidity and comfort, which C1 cannot see. Different jobs, different sensors.
D. Reliability consumables
| # | Item | Spec / why | Qty | Est. price |
|---|---|---|---|---|
| D1 | 15 A 1000 V DC PV fuse + holder, per string | Victron’s rule is 1.5 × Isc. These panels are ~9 A Isc, so 15 A per string. The bid shows a 10 A inline fuse — see the array warning. The cart has “PCS PV Panel String Fuse Male” — confirm it is 15 A 1000 V DC, not 10 A. | 2 + 1 spare | $8–15 ea |
| D2 | 3.15 A slow-blow fuse + inline holder for the GX power input | Victron’s spec for the Cerbo GX DC input. Only if the supplied lead’s fuse is missing. | 1 | $6–12 |
| D3 | Fused 12 V branch for the ESP32 + GNSS + USB hub | Off the Orion rail, own fuse, own strain relief. | 1 lot | $10–20 |
| D4 | Weatherproof grommets, drip loops, stainless ties, conformal coat | Alkaline dust + 100 °F roof + vibration. Consumables that decide whether this survives season one. | 1 lot | $25–50 |
Total required: roughly $300–500 on top of the cart. That is the whole telemetry stack minus the honest gap in E.
E. The bus-off gap — decide this before buying
Everything above needs the 12 V/48 V system powered. When the bus is switched off and shore is disconnected, the Cerbo GX is dark, and there is no live position. That is a real limit of the design, not something the parts list fixes.
Two honest options:
| Option | Cost | Trade |
|---|---|---|
| Accept it | $0 | Location is live only while the system is on. For a bus that is on when occupied, this is fine. |
| Add an independent LTE+GNSS tracker with its own internal battery | $60–200 + SIM plan | Reports position with the house bank off. Draws well under 1 W — a week parked is ~170 Wh, which is noise against a 15 kWh bank. But now your location is live always, which lands directly on the open privacy decision in .planning/STATE.md. |
Do not buy option two without settling that privacy question. The site is currently private, but a public live-location feed is a different risk class than a private site.
Parts specs worth keeping
SmartSolar 250/60-TR sizing check
| Quantity | Value | Against the controller |
|---|---|---|
| Array nominal | 1,200 W | — |
| MPPT max PV open-circuit | 149.76 V (per the bid spec sheet) | 2S3P string = 78.8 V STC ✓ · 6-in-series = 157.6 V STC ✗ |
| MPPT max output current | 60 A | Array delivers ~24 A at 51.2 V. Heavily oversized. |
| Array output at 90% into bank | ~1,080 W ÷ 56.8 V = 19.0 A | Well inside 60 A. |
| Charge voltage ceiling | 58.4 V per the bid | Victron 16S LiFePO₄ preset = 14.2 V/cell × 16 = 56.8 V ✓ |
The 250/60-TR is a large controller for a 1,200 W array. That is safe — you lose a little efficiency at low utilization and gain headroom — but it is worth knowing you are buying capacity you will not use. It also caps how far the array can grow later: at 60 A you could roughly double to ~2,400 W without touching the controller, subject to the 149.76 V string limit.
Charge settings that matter because there is no BMS link
Three batteries in parallel, SmartShunt for measurement, and no BMS communication to Victron means the MultiPlus settings are the charge control. There is no second line of defense.
| Setting | Value | Note |
|---|---|---|
| Battery type | LiFePO₄, 16S | Not lead-acid. Ever. |
| Absorption | 56.8 V (14.2 V/cell) | Matches the ECO-WORTHY maximum the bid sheet lists. Do not chase 57.6 V. |
| Float | 54.0 V (13.5 V/cell) | Matches the bid’s 54.0–54.4 V range. |
| Equalization | Off | LiFePO₄ does not equalize, and pushing it invites trouble. |
| Low-voltage cutoff | Above the Cubix100 BMS trip | Otherwise the inverter sags, the BMS cuts mid-discharge, and you get a load-drop restart. |
| Low-temp charge inhibit | Confirm the Cubix100 cutoff | LiFePO₄ below 0 °C is where the chemistry gets expensive. The bid does not mention a low-temp cutoff at all — ask. |
Inverter idle, refined
| Mode | Draw | Daily | Share of a 4,000 Wh day |
|---|---|---|---|
| Inverter (off) | ~15 W | 360 Wh | ~9% |
| AES | ~10 W | 240 Wh | ~6% |
| Search | ~3 W | 72 Wh | ~2% |
Search mode is only useful when you are not asking the inverter for AC, which is exactly the same condition as not needing it. The DC rail is the real fix — it is what lets the inverter stay in search mode all day instead of idling at 15 W. This is the strongest argument for wiring the rail loads properly.
OBD-II: what is actually readable
Worth being blunt, because a passive CAN tap sold as “reads your codes while you’re parked” does not work.
DTCs are request/response, not broadcast. Clearing or listing codes is OBD-II Mode 03 (confirmed powertrain DTCs), 07 (pending), 0A (permanent). Those are requests you send to the ECU. A listen-only sniffer sees frames going past and never gets the answer, because it never asked. A gateway has to actually transmit the request.
Ignition state is a real unknown. An active request may wake modules and draw battery. On this bus the 12 V rail and 200 A coach battery absorb that easily while the system is on, but “works with the bus off” is untested. Test it on the bus before building the tracker — this is Gate 9.
Coverage is powertrain-only. OBD-II is a powertrain standard. On a 2014 E350 you can reliably get engine and transmission codes off the J1962 port. ABS, SRS, and body-module codes often are not there at all — Ford keeps those behind Motorcraft IDS or a module-specific tool. Do not promise yourself whole-vehicle coverage from a $40 dongle.
The genuinely useful extra: Modes 06 (On-Board Monitor test results) and 09 (information types) are more available than DTCs on 2014 Fords. Mode 06 gives you live misfire and catalyst counters — that is the predictive-maintenance data nobody advertises. Capture it while you have the link.
Bus specifics for this build: J1962, pins 4/5 ground, 6 CAN-H, 9 CAN-L, 16 switched +12 V. 500 kbps classic CAN — 2014, pre-FD. Both HS3000 and MS-CAN channels come on the WiCAN; you need both for a full J1962 conversation.
Getting the data to the site
A static Jekyll site cannot hold live state. The site builds once and deploys; there is no server to ask. Live data has to be fetched by the browser from an endpoint that exists at request time.
The path:
- Cerbo GX publishes to its local MQTT broker (port 1883 plain, 8883 with TLS — use TLS).
- The broker ships out over the Starlink link on MQTT-TLS to a Cloudflare Worker.
- The Worker holds the broker credential, writes current state to KV and history to D1, and serves
GET /api/bus/state. - A Jekyll page polls that endpoint every 30–60 s and renders.
Rules, non-negotiable:
- The Worker route lives on the same hostname as the site, behind the same Access policy. Do not expose a second origin.
- No MQTT credentials, broker hostnames, or raw telemetry in Jekyll source. The repo is public-facing. Credentials live in Worker secrets and on the GX only.
- The GX gets a read-scoped, revocable broker credential. Rotate it like a password.
- Client polls read-only. Nothing in the browser may write to the bus.
Cloudflare Access — the trap to check first. The Pages Access toggle can create a wildcard-only policy covering *.e350-travel.pages.dev. The bare apex e350-travel.pages.dev is not matched by that wildcard. The result is a site that looks protected in the dashboard and is fully public at the actual URL.
Verify from a logged-out context, every time:
curl -I https://e350-travel.pages.dev/
Expect 302 to cloudflareaccess.com. Anything else means the site is open. Fix by editing the Access application’s hostname list directly, or by moving to a custom domain.
Granularity is a privacy decision, not a technical one. Exact live position, owner-only, short expiry, and a blackout toggle is a reasonable default. Public historical trails should be coarsened and delayed — a published breadcrumb trail is a map of your home, your dry camps, and your routines. The open privacy decision in .planning/STATE.md covers location detail and has not been settled.
Gates — verify before spending
- Array topology must change to 2S3P. 6-in-series is 157.6 V against a 149.76 V controller input. Get installer sign-off before the deposit. This is not a preference.
- String fuses to 15 A each. The bid shows a 10 A inline fuse; confirm what it protects and upsize if it is on the PV string.
- Battery nominal is 15.36 kWh, not 14.4. 3 × (51.2 V × 100 Ah) = 15.36 kWh. The site’s 14.4 figure came from treating a 16-cell bank as 48.0 V. Do not let a stale number drive a purchase decision.
- Orion: 20 A purchased, 30 A documented.
power-supply.mdrecommends the 48/12-30 (360 W); the cart has the 48/12-20 (244 W). Fridge + TV + chargers is ~165 W, so 20 A fits with little headroom. Pick one and make the BOM agree. - Orion is not a 3-stage charger. It has no absorption stage. Charging the 200 Ah coach battery through it risks overcharging once the alternator is involved, because the Orion sees the alternator’s higher voltage. Wire a sense lead or use a real charger. Ask the installer which.
- Victron MSRP check before deposit. The cart prices the 250/60-TR at $345, the Cerbo GX Mk2 at $203, and the MultiPlus-II 48/5000 at $1,348. All three are well under Victron list. Confirm they are genuine, and confirm the part numbers — a mislabeled clone in a 48 V solar system is a bad afternoon.
- Charge settings programmed at commissioning — 56.8 V absorption, 54.0 V float, no equalization, cutoff above the BMS trip. With no BMS link, these settings are the battery’s protection.
- Low-temperature charge cutoff on the Cubix100. Unmentioned in the bid. Confirm the value before any winter-desert generator charging.
- OBD-II key-off behavior, tested on the bus before committing to the ESP32 build.
- Live-location privacy decision settled before buying the independent tracker.
Cross-references
- Power & Solar — electrical design, DC rail, daily budget, generator-assisted power
- Solar Quotes — bid comparison, the 55-item cart, the array voltage conflict, deposit gates
- Ford E350 Specs — chassis, drivetrain, and power summary
- Maintenance — where Mode
06counters and stored DTCs belong in the service record .planning/STATE.md— open privacy decision covering location detail