Skip to content

feat(gemba): live packaging OEE dashboard for the Tizen TV board - #8

Merged
mbreissi merged 15 commits into
mainfrom
feat/tizen-oee-dashboard
Jul 22, 2026
Merged

feat(gemba): live packaging OEE dashboard for the Tizen TV board#8
mbreissi merged 15 commits into
mainfrom
feat/tizen-oee-dashboard

Conversation

@mbreissi

Copy link
Copy Markdown
Contributor

Turns the Tizen TV client from a connection-feasibility proof into a real Line-2 packaging OEE dashboard, fed live over the existing multi-app gateway.

What

  • New experiments/gemba/apps/tv-board/ — the dallas-line-2-tizen mockup UI + an added OEE strip (OEE / Availability / Performance / Quality), driven live over the gateway app-WebSocket (protocol-v1 hello/subscribe/updates, signals capability). ES5 for the 2019 Tizen runtime; derives the gateway URL from location in a browser or from config.js when packaged. OEE tiles bind the frame's display names (OEE/Availability/Performance/Qualityid is null in the projection).
  • tv/tizen-gemba/ now packages this dashboard (its config.js points at the LAN console ws://192.168.1.224:8080/apps/tv-board/ws); config.xml + build-tizen.ps1 unchanged.

Verified

Served at /apps/tv-board/ (browser) and rendered live end-to-end: OEE 90.3 / Avail 94.5 / Perf 100 / Qual 95.5, plus GoodCaseCount, CaseRateCpm, motor-current trend, pallet build, quality tiles, coordinated LabelCode. App WS accepts the operator role + origin. (Harness registration + LAN exposure are in bottling-company-test#3.)

🤖 Generated with Claude Code

mbreissi and others added 15 commits July 21, 2026 09:29
Turns the Tizen TV client from a connection-feasibility proof into a real Line-2
packaging OEE dashboard. New experiments/gemba/apps/tv-board (browser-servable +
Tizen source): the dallas-line-2-tizen mockup UI + an added OEE strip (OEE /
Availability / Performance / Quality), driven live over the gateway app-WebSocket
(protocol-v1 hello/subscribe/updates, signals capability). ES5 for the 2019 Tizen
runtime; derives the gateway URL from location in a browser or from config.js when
packaged. OEE tiles bind the frame's display names (OEE/Availability/Performance/
Quality, id is null). tv/tizen-gemba now packages this dashboard (config.js points
at the LAN console; config.xml/build-tizen.ps1 unchanged).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxV5wFi7LCratBERVT6aiL
…PalletizerState

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxV5wFi7LCratBERVT6aiL
…', value at point.value) + stalled-socket watchdog

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxV5wFi7LCratBERVT6aiL
… nodeId + OEE topic)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxV5wFi7LCratBERVT6aiL
Rewrites the google-tv-gemba proof app into a native OEE dashboard for the filling
line (gw-fill-01): large TV-legible tiles (OEE hero + Availability/Performance/Quality
+ LineSpeed/GoodBottles/FillPressure/FillVolume/BowlLevel/ProductTemp/FillerState/
Rejects), bound to the OkHttp app-WebSocket signal stream. Parses snapshot (type
signals, name+latest) and delta (type signal, channel-path normalized) frames, scoped
to the filling device; keeps the proven OkHttp transport + reconnect + 15s ping, adds
a stalled-socket watchdog. Connects to the tv-board app (Origin google-tv.edgecommons.local).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxV5wFi7LCratBERVT6aiL
…e packaging board

The mockup's 7-13px mono labels don't read on a 55" TV suspended above a line; raise
label/secondary text to a ~19px floor and enlarge secondary values.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxV5wFi7LCratBERVT6aiL
…owing step E)

The TV-legibility label bump also enlarged the tiny 5-across process-flow cards, pushing
the PALLETIZER layer line outside its box. Exclude .machine from the label bump, size its
text to fit (16/22px), and raise the card min-height so the layer line stays inside.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxV5wFi7LCratBERVT6aiL
…ector caught it)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxV5wFi7LCratBERVT6aiL
Three rounds of on-panel (55" 1080p) tuning of the Dallas packaging OEE board:

- Float the 02 (Throughput) and 03 (Jam early warning) section headers ABOVE their
  cards, matching section 01 — each panel is wrapped in an .op-col so the heading is a
  sibling above the card rather than inside it.
- Give 02/03 a real column gutter and set them apart from 01. The 2019 Tizen web runtime
  (Chromium ~63) ignores the `gap` shorthand on grid, so the gutter uses the
  grid-column-gap longhand; `gap` alone rendered zero gutter (the two cards touched).
- Force the two content cards to equal height (.op-col fills the stretched grid row, the
  panel flexes to fill) and share one main-measure font size (48px).
- Right-align the motor-current warn label and size it down to a legible-but-unobtrusive
  16px (was crowding the reading value on the left, then briefly too large).
- Trim the board to fit 1080p with a small overscan cushion — the added OEE band had
  pushed the footer 138px below the fold. Only paddings/margins/box heights were
  reclaimed; the legibility font floor is untouched.

Verified live over CDP on the Samsung UN55RU8000: board 1080px, footer visible,
panels equal, 28px 02/03 gutter, unified main fonts. Mirrored into the tizen-gemba
package source and rebuilt/reinstalled the signed .wgt.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxV5wFi7LCratBERVT6aiL
The Jam early-warning card bunched its content in the top two-thirds with ~70px of dead
space at the bottom, and its landmarks did not line up with the Throughput card beside it.
Lay the jam panel out as a flex column so it fills the card and aligns with 02:

- the big motor-current reading now sits level with 02's good-case count (same top);
- the dotted 9.0 A warn line lands on 02's good/reject bar;
- the current-trend chart is taller (118px, was 84px), with less aspect squish;
- the Jam switch / Palletizer indicator row is pinned to the bottom of the card;
- the warn label is trimmed to 12px so the taller (less-squished) chart doesn't enlarge it.

Verified live over CDP on the Samsung UN55RU8000: number tops equal, warn line within 4px
of 02's bar, cards equal height, footer still within 1080p. Mirrored into the tizen-gemba
package source and rebuilt/reinstalled the signed .wgt; browser copy updated in the console.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxV5wFi7LCratBERVT6aiL
…ine 02 UX fixes

Reviewing the native Sony/Google-TV filling-line board against the fixes just made to the
Line 02 packaging board surfaced the same class of problem: the layout was top-packed
WRAP_CONTENT with fixed sp font sizes and no vertical-fill seam, so on a real panel it would
either clip the bottom tile row (dense/4K-scaled density) or leave a dead band at the bottom
(tvdpi) — the Line 02 bottom-cutoff / wasted-space bugs, latent only because this app had
never run on hardware.

Apply the Android equivalent of the Line 02 flex-fill:
- header stays fixed at the top; the OEE band and the production grid divide ALL remaining
  height by weight; the two tile rows split the grid evenly — the board fills the panel
  exactly at any reported density (no clip, no dead band);
- the big numbers (OEE hero, the three OEE parts, the eight tile values) autosize uniformly
  to the largest one-line size that fits their now-bounded cells, so they stay as large as
  legible without ever overflowing.

Equal-height/equal-width tiles and the section gutters were already consistent and are kept.

Compiles (assembleDebug). NOT yet verified on the Sony panel — fit, legibility and alignment
still need an on-device check once the TV's IP + ADB are available, the same way the Line 02
board was measured live.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxV5wFi7LCratBERVT6aiL
…n the Sony panel

On-device verification on the BRAVIA 4K VH2 (1080p override, density 2.0 — the worst-case
density the weighted-fill was built for) exposed two layout bugs and confirmed the fill works:

- OEE band labels ("AVAILABILITY"/"PERFORMANCE") wrapped to two lines — the label now
  autosizes to one line.
- Tile values clipped to a sliver: autosizing a value that shares a horizontal row with its
  unit doesn't scale cleanly. The value now sits ALONE in its cell (autosize 28–56sp,
  guaranteed to fit), with the unit moved up beside the name in the label row; the name
  autosizes to one line so it is never truncated.

Result on the panel: the board fills the screen with no clip or dead band, every tile shows a
large legible value with its full name and unit, and live filling data (line speed, good
bottles, fill pressure/volume, bowl level, product temp, filler state, rejects) is flowing.

Known gap (separate, needs a decision): the OEE band stays blank because the filling line
publishes no computed OEE — gemba/oee/* exists only for the packaging device (gw-pack-01);
gw-fill-01 carries only a raw OeeShiftSnapshot array.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxV5wFi7LCratBERVT6aiL
…al HMI

The board read as a flat grid of undifferentiated dark boxes with no hierarchy or focal
point. Rebuild it in the packaging board's visual language so it reads as a designed HMI:

- light "paper" theme with a dark ink header + OEE band and safety-yellow accents, instead
  of a uniform dark grid;
- numbered titled sections — 01 FILL LINE (process flow) and 02 FILL QUALITY (bowl-level tank
  + fill-pressure/volume radial gauges) — that break the screen into clear areas of focus;
- a rotary-filler-ring hero anchoring the right column (a valve carousel that rotates with the
  line speed, hub = live fill rate), the filling analogue of the packaging board's pallet grid;
- a shift tally (good bottles / rejects with an overfill-underfill split bar) under the hero,
  and a safety-striped footer strip of secondary readouts (product temp, CO2, valve, infeed).

New custom views: FillerRingView (hero), plus TankGaugeView / ArcGaugeView / BarMeterView
recoloured for the light theme; the unused SparklineView was removed (line speed now reads
from the ring hub). Verified live on the BRAVIA 4K VH2 (1080p surface, density 2.0): the board
fills the panel with no clip, every element is legible at distance, and it tracks the live
disturbance scenarios (filler pressure-hold turns the FILLER step amber and the pressure gauge
copper). Note the panel renders the Android UI at 1080p and upscales — the TV locks its UI
surface to 1080p (wm size 3840x2160 does not take), so 4K is not addressable from the app.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxV5wFi7LCratBERVT6aiL
…lity, flow, tally

Address the review nits on the filling HMI:

- Text cutoffs: the OEE hero and band values, and the flow stage names, were clipping. Root
  causes were autosize text filling its cell to the edge and long names truncating in narrow
  horizontal cards. Flow cards are now vertical (badge over a full-width name), section heights
  were rebalanced, and the autosize floors were lowered so values shrink instead of blanking.
- The fill-line strip is no longer decorative: each stage that has sim data shows it live — the
  depalletizer shows infeed (Feeding/Starved), the filler its state, the capper its cap-reject
  count. The rinser and labeler read a static "Running" because the sim emits no signals for
  them (a follow-up could add them).
- Bowl-level reading now has an outline (white fill + dark stroke) so it stays legible whether
  it sits over the blue liquid or the empty white tank below the waterline.
- Good/Rejects tally is realigned: the two headers and numbers line up, with a single yield bar
  spanning both (green good / copper overfill / blue underfill) beneath them.
- Conveyor speed replaces the redundant infeed readout in the footer; the filler ring hub is
  enlarged so the rate reads cleanly.

Verified live on the BRAVIA across the running scenarios (infeed starvation drops the ring to
"--" and marks the depalletizer/filler Starved; fill-pressure disturbance turns the pressure
gauge copper). The rotary-filler ring animates (rotation speed tracks the line rate).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxV5wFi7LCratBERVT6aiL
…e Sony panel

Full redesign of the native Android TV filling-line OEE board, driven by two
adversarial design reviews against the higher-quality packaging board.

- Flat, square-cornered full-width bands (no rounded cards); denser, calmer grid.
- Colour carries meaning only: OEE and ACTUAL RATE are neutral, the footer health
  stripe and OEE accent are threshold-driven, and amber appears solely on real
  cautions (below-target rate, low bowl level, disrupted stage).
- Instrumented INFEED > FILLER > CAPPER flow strip; each stage shares one anatomy
  (value + unit, state word, state bar) and bold amber chevrons read as one process.
- Fill-quality panel: full-height tank gauge plus four consistent bullet bars
  (pressure/volume/temp/CO2), each with a tolerance band and a target tick.
- RATE vs TARGET gauge in proper bullet-chart grammar: value fill + target marker.
- Rejects panel: hero total, proportional split bar, per-category breakdown.
- Header: brand mark + name, centred LINE/FILLING 01 identity, single device id.
- New BulletBarView (target marker + configurable below-band colour); TankGauge/
  BarMeterView reworked flat; ArcGaugeView/FillerRingView removed.
- .gitignore added for local.properties and Android build output.

Verified live on the Sony BRAVIA 4K (1920x1080), running and starved scenarios.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxV5wFi7LCratBERVT6aiL
@mbreissi
mbreissi marked this pull request as ready for review July 22, 2026 01:24
@mbreissi
mbreissi merged commit 7922e2e into main Jul 22, 2026
2 checks passed
@mbreissi
mbreissi deleted the feat/tizen-oee-dashboard branch July 28, 2026 22:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant