MIOS

Helm knowledge · Deckhand V2 · Yamaha CLP

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.

focus.md
Loading…

Backlog

Color = importance · order = in progress, then simplest
  • Loading…

Activity

Loading…

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)
✅ Verified ⚠ Firmware-only / unconfirmed 🚫 Stripped ❌ Missing 🔀 Dual-bus

Two buses

Bus / tapWhat's on itExample PGNsVessel 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

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.

FieldPGNBytesScaleConfirmed
rpm65280b0–b1 LE÷ 8gauge sweep 600 / 1100 / 2000
hours65283b0–b1 LE× 0.05 hgauge 348.5 / 348.4 h
fuel_rate_lph65285b0× 0.1 L/hgauge 0.8 gph
alt_v (volts)65290b0–b1 LE× 0.05 Vgauge 14.0 / 14.2
gear65041 port / 65057 stbdb3 bit 7set = 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 / decodeWas used asWhy rejected
65106 b2–b3 LE ÷ 8RPMFrozen 703.2 at all throttle points — overwrote good RPM
65042 b2–b3 LEHoursTracks throttle — it is RPM, not an hour meter
65138 b3–b4 BE ÷ 2Hours352.0 steady, byte-identical both engines — coincidence vs gauge 348.5/348.4
65284 b0 ÷ 10Volts12.5 V always; 0x7D is padding in other PGNs
65024 b2 ÷ 16VoltsClean 14.0 but byte-identical both engines; cannot express 14.2 split
65236 b2–b3Fuel ratePayload constant 00C001C0 — frozen 1.19 gph
65283 b0 × 4.2Oil pressureThat byte is low byte of hours counter
65290 b0Trim %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.

Range
Open SkunkMarine ↗
No sample loaded
TimePort RPMStbd RPMPort fuel L/hStbd fuel L/hSOG knDepth m
No samples yet — mios-dev uploads when online and Deckhand V2 is connected.