Project manager
Single stream: focus, living backlog (simple first, color by importance), then the run history. New follow-ups land on the board the same day they are created — not only in a journal bullet.
Loading…
Backlog
- Loading…
Activity
Overview
Deckhand V2 is teed into the Yamaha Command Link Plus (CLP) engine bus on this boat. That tap carries proprietary Yamaha PGNs (~65024–65295) and does not carry standard NMEA 2000 engine PGNs 127488/127489 — those appear only when a Yamaha gateway translates onto the Garmin N2K backbone. The Vessel app polls /mios-api/vessel and /mios-api/vessel/capture every 300 ms and paints a fixed 12×6 gauge deck from JSON fields decoded upstream on the Pi.
Yamaha CLP CAN → Deckhand V2 firmware → USB serial
├─ capture: (1 Hz decoded JSON)
├─ vessel: (1 Hz compact bar)
└─ N2K pgn_tick (1 Hz raw hex, up to 120 PGN+src pairs)
↓
mios-pi/daemon/vessel_live.py
• merges capture JSON
• re-decodes CLP via vessel_clp.py
(65280 rpm, 65283 hours, 65285 fuel rate,
65290 volts, 65041/65057 gear)
• strips bad firmware fields when CLP is fresh
↓
/mios-api/vessel + /mios-api/vessel/capture
↓
Vessel app tiles (Garmin WPE, ES5, 300 ms poll)
Two buses
| Bus / tap | What's on it | Example PGNs | Vessel tiles fed |
|---|---|---|---|
| Garmin N2K backbone | MFD, GPS, depth, wind, tanks; engines if a Yamaha N2K gateway is present | 129026 SOG, 128267 depth, 127250 heading, 127488/127489 std engine | SOG, depth, HDG, LAT, LON, COG; tanks, trip, BAT; std engine fields |
| Yamaha engine tap (CLP cable) | Twin F150s, proprietary Yamaha frames | 65280, 65283, 65285, 65290, 65041, 65057, 65281, etc. | PORT/STBD RPM, hours, volts, fuel rate, gear (neutral/engaged); cool partial |
Intended dual-Deckhand topology
Garmin N2K backbone ──► Deckhand v1 ──BLE──► mios-dev (nav)
Yamaha CLP / engine ──► Deckhand V2 ──USB──► mios-dev (engines)
↓
BLE advertise MIOS-dev ──► iPhone MIOS
↓
merged /vessel + /vessel/capture
Phone connects to MIOS-dev (one helm peripheral), not to Deckhand v1. Deckhand BLE Add remains allowlist-only; USB V2’s own BLE radio stays auto-excluded.
Firefly helm glass (mios-skunk)
The EC-A3588JD4 is native Android 14 on eMMC (flashed 2026-09-18). Debian, Redroid, nginx, discovery, and ws-scrcpy are gone. HDMI is the Android desktop — not a Chromium MIOS kiosk and not a streamed Redroid framebuffer. Network ADB is 10.0.0.33:5555. /mios/health reports live ADB health for this board (hardware, Salty, Wi-Fi, Ethernet/USB/Bluetooth, restarts, ADB/health/screenshot APIs) via GET /mios/health/api/mios-skunk; mios-dev probes every 5 minutes so the 08:00 UTC daily job has a same-day snapshot. There is no GNSS chip. An always-on listener accepts the same /mios-api/vessel JSON used on mios-dev (http://10.0.0.33:8091/mios-api/vessel): OS GPS gets lat/lon/speed/bearing; depth and water temperature stay on that snapshot. Bench feed is live /vessel or SkunkMarine history — not a trip baked into the image. Deployed Firefly will take Deckhand v1 over USB-C into this same sink. Live Vessel gauges stay on mios-dev until native MIOS exists on this box. Missing Linux health-push is not an outage. Missing wlan0 is Gate A, not an outage.
CLP — Command Link Plus
- Physical engine network — cable/bus at the helm/engines (twin F150 CLP)
- Proprietary PGN range on that bus (~65024–65295), distinct from standard N2K
- Our decode layer —
vessel_clp.py, measured byte map (2026-09-05 boat work)
- Q: V2 is on CLP only — no 127488/127489 on that tap?
- A: That describes where Deckhand is plugged in, not a V2 defect. 127488/127489 are standard N2K engine messages on the Garmin backbone when a gateway translates Yamaha → N2K. The engine-only CLP tap carries proprietary PGNs instead.
- Q: Is CLP just the whole Yamaha system?
- A: Precisely Command Link Plus — the engine digital bus and its PGN set. Standard N2K engine PGNs are a different language on a different segment unless bridged.
Measured byte map (authoritative 2026-09-05)
Source address 0 = port, 1 = starboard. A field appears only after Yamaha gauge confirmation.
| Field | PGN | Bytes | Scale | Confirmed |
|---|---|---|---|---|
| rpm | 65280 | b0–b1 LE | ÷ 8 | gauge sweep 600 / 1100 / 2000 |
| hours | 65283 | b0–b1 LE | × 0.05 h | gauge 348.5 / 348.4 h |
| fuel_rate_lph | 65285 | b0 | × 0.1 L/h | gauge 0.8 gph |
| alt_v (volts) | 65290 | b0–b1 LE | × 0.05 V | gauge 14.0 / 14.2 |
| gear | 65041 port / 65057 stbd | b3 bit 7 | set = neutral, clear = engaged | ~60 rpm drop; FWD/REV not available |
65290 is volts, not trim. 65024 was rejected as volts (identical on both engines). Gear publishes neutral (NEU) or engaged (GEAR) only — forward/reverse send identical frames on this bus.
Vessel app tiles — 12×6 deck (31 tiles)
File: mios-pi/apps/deckhand/index.html. UI reads JSON paths, not PGN numbers directly.
Rejected decodes — do not re-adopt
| PGN / decode | Was used as | Why rejected |
|---|---|---|
| 65106 b2–b3 LE ÷ 8 | RPM | Frozen 703.2 at all throttle points — overwrote good RPM |
| 65042 b2–b3 LE | Hours | Tracks throttle — it is RPM, not an hour meter |
| 65138 b3–b4 BE ÷ 2 | Hours | 352.0 steady, byte-identical both engines — coincidence vs gauge 348.5/348.4 |
| 65284 b0 ÷ 10 | Volts | 12.5 V always; 0x7D is padding in other PGNs |
| 65024 b2 ÷ 16 | Volts | Clean 14.0 but byte-identical both engines; cannot express 14.2 split |
| 65236 b2–b3 | Fuel rate | Payload constant 00C001C0 — frozen 1.19 gph |
| 65283 b0 × 4.2 | Oil pressure | That byte is low byte of hours counter |
| 65290 b0 | Trim % | That PGN is volts — phantom 25%/30% trim |
Deckhand capture log
Deckhand V2 on mios-dev USB uploads as mios-dev. Firmware still prints marine-gateway-1 on the serial wire; the Pi host identity is what the VPS stores. The marine-gateway-1 option is the older iOS / gateway stream. Decoded snapshots (n2k_samples) stay forever on the VPS. Raw USB/BLE lines go to vessel_raw_frames. mios-dev keeps a local 7-day SQLite spool so a VPS outage on the water is uploaded when the link returns. Helm journals stay on device_logs for mios-dev and are not purged. /mios/health names the Firefly board mios-skunk (also Firefly); ingest history stays on mios-firefly-1. Native Android 14 health is an ADB snapshot (hardware, Salty, Wi-Fi, connected devices, restarts, APIs) stored for the daily job — not the frozen 18 Sep Linux push. JSON: /mios/health/api/mios-skunk. Pi 5 health id is mios-pi5-1 even if its OS hostname is still mios-skunk.
| Time | Port RPM | Stbd RPM | Port fuel L/h | Stbd fuel L/h | SOG kn | Depth m |
|---|---|---|---|---|---|---|
| No samples yet — mios-dev uploads when online and Deckhand V2 is connected. | ||||||