diff --git a/README.md b/README.md index 812a069d..4e049344 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ curl -X POST http://your-pi-ip:5000/api/v3/plugins/install \ | [Cricket Scoreboard](./plugins/cricket-scoreboard/) | Live, recent & upcoming international (Test/ODI/T20I) and major domestic cricket | | | [AFL Scoreboard](./plugins/afl-scoreboard/) | Australian Football League live, recent & upcoming games | afl-scoreboard on an LED panel | | [NRL Scoreboard](./plugins/nrl-scoreboard/) | National Rugby League live, recent & upcoming games | | -| [F1 Scoreboard](./plugins/f1-scoreboard/) | Formula 1 race results, schedules, and standings | | +| [F1 Scoreboard](./plugins/f1-scoreboard/) | Formula 1 race results, schedules, and standings | f1-scoreboard on an LED panel | | [UFC Scoreboard](./plugins/ufc-scoreboard/) | UFC/MMA live fights, fighter headshots, records, odds & results — *by [LegoGuy1000](https://github.com/legoguy1000)* | | | [Masters Tournament](./plugins/masters-tournament/) | Live Masters golf leaderboard, hole tracking, player cards | | | [March Madness](./plugins/march-madness/) | NCAA tournament bracket tracker with round branding and live scores | | diff --git a/docs/assets/f1-scoreboard/driver-split.png b/docs/assets/f1-scoreboard/driver-split.png new file mode 100644 index 00000000..cb2f2f8f Binary files /dev/null and b/docs/assets/f1-scoreboard/driver-split.png differ diff --git a/docs/assets/f1-scoreboard/hero.png b/docs/assets/f1-scoreboard/hero.png new file mode 100644 index 00000000..5f1227e8 Binary files /dev/null and b/docs/assets/f1-scoreboard/hero.png differ diff --git a/docs/assets/f1-scoreboard/panel-sizes.png b/docs/assets/f1-scoreboard/panel-sizes.png new file mode 100644 index 00000000..5276f0ef Binary files /dev/null and b/docs/assets/f1-scoreboard/panel-sizes.png differ diff --git a/docs/assets/f1-scoreboard/shots.json b/docs/assets/f1-scoreboard/shots.json new file mode 100644 index 00000000..0cab3003 --- /dev/null +++ b/docs/assets/f1-scoreboard/shots.json @@ -0,0 +1,468 @@ +{ + "plugin": "f1-scoreboard", + "_comment": "Standings are seeded onto the plugin instance rather than fetched, and _last_update is seeded so update() does not re-fetch and clear them. The cards scroll, so shots step frames. Drivers, teams and points are invented.", + "defaults": { + "width": 128, + "height": 32, + "scale": 6, + "freeze_time": "2026-09-03T18:00:00+00:00", + "skip_update": true, + "frames": 60, + "config": { + "enabled": true + }, + "attrs": { + "_driver_standings": [ + { + "position": 1, + "code": "VER", + "name": "M. Verstappen", + "constructor_id": "red_bull", + "points": 374, + "wins": 9, + "is_favorite": true, + "gap_to_leader": 0, + "poles": 0, + "last_race_pts": 0 + }, + { + "position": 2, + "code": "NOR", + "name": "L. Norris", + "constructor_id": "mclaren", + "points": 331, + "wins": 4, + "is_favorite": false, + "gap_to_leader": 43, + "poles": 0, + "last_race_pts": 0 + }, + { + "position": 3, + "code": "PIA", + "name": "O. Piastri", + "constructor_id": "mclaren", + "points": 307, + "wins": 3, + "is_favorite": false, + "gap_to_leader": 67, + "poles": 0, + "last_race_pts": 0 + }, + { + "position": 4, + "code": "LEC", + "name": "C. Leclerc", + "constructor_id": "ferrari", + "points": 245, + "wins": 1, + "is_favorite": false, + "gap_to_leader": 129, + "poles": 0, + "last_race_pts": 0 + }, + { + "position": 5, + "code": "RUS", + "name": "G. Russell", + "constructor_id": "mercedes", + "points": 211, + "wins": 2, + "is_favorite": false, + "gap_to_leader": 163, + "poles": 0, + "last_race_pts": 0 + } + ], + "_constructor_standings": [ + { + "position": 1, + "constructor_id": "mclaren", + "name": "McLaren", + "points": 638, + "wins": 7, + "code": "MCL" + }, + { + "position": 2, + "constructor_id": "red_bull", + "name": "Red Bull", + "points": 521, + "wins": 9, + "code": "RED" + }, + { + "position": 3, + "constructor_id": "ferrari", + "name": "Ferrari", + "points": 456, + "wins": 1, + "code": "FER" + }, + { + "position": 4, + "constructor_id": "mercedes", + "name": "Mercedes", + "points": 398, + "wins": 2, + "code": "MER" + } + ], + "_last_update": 1788458400.0 + } + }, + "shots": [ + { + "name": "hero", + "frames": 280, + "width": 256, + "config": { + "enabled": true, + "driver_standings": { + "enabled": true + }, + "constructor_standings": { + "enabled": false + }, + "recent_races": { + "enabled": false + }, + "upcoming": { + "enabled": false + }, + "qualifying": { + "enabled": false + }, + "practice": { + "enabled": false + }, + "sprint": { + "enabled": false + }, + "calendar": { + "enabled": false + } + } + }, + { + "name": "m-drivers", + "frames": 280, + "width": 256, + "standalone": false, + "config": { + "enabled": true, + "driver_standings": { + "enabled": true + }, + "constructor_standings": { + "enabled": false + }, + "recent_races": { + "enabled": false + }, + "upcoming": { + "enabled": false + }, + "qualifying": { + "enabled": false + }, + "practice": { + "enabled": false + }, + "sprint": { + "enabled": false + }, + "calendar": { + "enabled": false + } + } + }, + { + "name": "m-constructors", + "frames": 280, + "width": 256, + "standalone": false, + "config": { + "enabled": true, + "driver_standings": { + "enabled": false + }, + "constructor_standings": { + "enabled": true + }, + "recent_races": { + "enabled": false + }, + "upcoming": { + "enabled": false + }, + "qualifying": { + "enabled": false + }, + "practice": { + "enabled": false + }, + "sprint": { + "enabled": false + }, + "calendar": { + "enabled": false + } + } + }, + { + "name": "split-on", + "frames": 340, + "width": 256, + "standalone": false, + "config": { + "enabled": true, + "driver_standings": { + "enabled": false + }, + "constructor_standings": { + "enabled": true, + "show_driver_split": true + }, + "recent_races": { + "enabled": false + }, + "upcoming": { + "enabled": false + }, + "qualifying": { + "enabled": false + }, + "practice": { + "enabled": false + }, + "sprint": { + "enabled": false + }, + "calendar": { + "enabled": false + } + } + }, + { + "name": "split-off", + "frames": 340, + "width": 256, + "standalone": false, + "config": { + "enabled": true, + "driver_standings": { + "enabled": false + }, + "constructor_standings": { + "enabled": true, + "show_driver_split": false + }, + "recent_races": { + "enabled": false + }, + "upcoming": { + "enabled": false + }, + "qualifying": { + "enabled": false + }, + "practice": { + "enabled": false + }, + "sprint": { + "enabled": false + }, + "calendar": { + "enabled": false + } + } + }, + { + "name": "size-64x32", + "width": 64, + "frames": 280, + "standalone": false, + "config": { + "enabled": true, + "driver_standings": { + "enabled": true + }, + "constructor_standings": { + "enabled": false + }, + "recent_races": { + "enabled": false + }, + "upcoming": { + "enabled": false + }, + "qualifying": { + "enabled": false + }, + "practice": { + "enabled": false + }, + "sprint": { + "enabled": false + }, + "calendar": { + "enabled": false + } + } + }, + { + "name": "size-128x32", + "width": 128, + "frames": 280, + "standalone": false, + "config": { + "enabled": true, + "driver_standings": { + "enabled": true + }, + "constructor_standings": { + "enabled": false + }, + "recent_races": { + "enabled": false + }, + "upcoming": { + "enabled": false + }, + "qualifying": { + "enabled": false + }, + "practice": { + "enabled": false + }, + "sprint": { + "enabled": false + }, + "calendar": { + "enabled": false + } + } + }, + { + "name": "size-128x64", + "width": 128, + "height": 64, + "frames": 280, + "standalone": false, + "config": { + "enabled": true, + "driver_standings": { + "enabled": true + }, + "constructor_standings": { + "enabled": false + }, + "recent_races": { + "enabled": false + }, + "upcoming": { + "enabled": false + }, + "qualifying": { + "enabled": false + }, + "practice": { + "enabled": false + }, + "sprint": { + "enabled": false + }, + "calendar": { + "enabled": false + } + } + }, + { + "name": "size-256x32", + "width": 256, + "frames": 280, + "standalone": false, + "config": { + "enabled": true, + "driver_standings": { + "enabled": true + }, + "constructor_standings": { + "enabled": false + }, + "recent_races": { + "enabled": false + }, + "upcoming": { + "enabled": false + }, + "qualifying": { + "enabled": false + }, + "practice": { + "enabled": false + }, + "sprint": { + "enabled": false + }, + "calendar": { + "enabled": false + } + } + } + ], + "composites": [ + { + "name": "standings-modes", + "columns": 1, + "cells": [ + { + "shot": "m-drivers", + "label": "f1_driver_standings", + "sublabel": "position, code, team and points" + }, + { + "shot": "m-constructors", + "label": "f1_constructor_standings" + } + ] + }, + { + "name": "driver-split", + "columns": 1, + "cells": [ + { + "shot": "split-on", + "label": "constructor_standings.show_driver_split: true" + }, + { + "shot": "split-off", + "label": "constructor_standings.show_driver_split: false" + } + ] + }, + { + "name": "panel-sizes", + "columns": 2, + "cells": [ + { + "shot": "size-64x32", + "label": "64 x 32" + }, + { + "shot": "size-128x32", + "label": "128 x 32" + }, + { + "shot": "size-128x64", + "label": "128 x 64" + }, + { + "shot": "size-256x32", + "label": "256 x 32" + } + ] + } + ] +} diff --git a/docs/assets/f1-scoreboard/standings-modes.png b/docs/assets/f1-scoreboard/standings-modes.png new file mode 100644 index 00000000..2e16eec4 Binary files /dev/null and b/docs/assets/f1-scoreboard/standings-modes.png differ diff --git a/plugins.json b/plugins.json index f818927f..0ae16c9b 100644 --- a/plugins.json +++ b/plugins.json @@ -212,10 +212,10 @@ "plugin_path": "plugins/f1-scoreboard", "stars": 0, "downloads": 0, - "last_updated": "2026-08-05", + "last_updated": "2026-09-03", "verified": true, "screenshot": "", - "latest_version": "1.8.6" + "latest_version": "1.8.7" }, { "id": "football-scoreboard", diff --git a/plugins/f1-scoreboard/README.md b/plugins/f1-scoreboard/README.md index 1b24ac59..85be7ba4 100644 --- a/plugins/f1-scoreboard/README.md +++ b/plugins/f1-scoreboard/README.md @@ -1,5 +1,13 @@ # F1 Scoreboard Plugin +![The driver standings scrolling across a 256x32 panel: the F1 mark, a season +progress bar, then a card showing P1 VER for Red Bull with points and +wins](../../docs/assets/f1-scoreboard/hero.png) + +*Every image in this README is real plugin output, rendered at the true panel +size from seeded standings so it reproduces exactly. Drivers, teams and points +are invented.* + A Formula 1 plugin for LEDMatrix that displays driver and constructor standings, race results, qualifying and practice times, sprint results, upcoming races, and the full season calendar — with team-colored visuals, @@ -86,11 +94,11 @@ Each mode section has an `enabled` toggle and mode-specific options: | `recent_races` | `show_winners_summary` | `true` | Show a compact winners summary card at the start of the recent races section | | `recent_races` | `show_gap_chart` | `true` | Show a horizontal bar chart of each finisher's time gap from the winner (team-colored bars) | | `recent_races` | `gap_chart_drivers` | `5` | Number of drivers to show on the race gap bar chart (3–10) | -| `upcoming` | `show_session_times` | `true` | Show practice / qualifying / race times | -| `upcoming` | `countdown_enabled` | `true` | Live countdown to next session | +| `upcoming` | `show_session_times` | `true` | **Not implemented.** Nothing reads it; the session times are always drawn. | +| `upcoming` | `countdown_enabled` | `true` | **Not implemented.** Nothing reads it; the countdown is always drawn. | | `upcoming` | `show_circuit_info` | `true` | Show circuit stats card after upcoming race card (laps, km, lap record) | | `qualifying` | `show_q1` / `show_q2` / `show_q3` | `true` | Toggle each qualifying segment | -| `qualifying` | `show_gaps` | `true` | Show gap-to-pole times | +| `qualifying` | `show_gaps` | `true` | **Not implemented.** Nothing reads it. | | `qualifying` | `show_team_duel` | `true` | Show team H2H summary card (who outqualified their teammate) | | `practice` | `sessions_to_show` | `["FP1","FP2","FP3"]` | Which sessions to render | | `practice` | `top_n` | `10` | Drivers per practice session | @@ -183,6 +191,17 @@ Override the font used for each text role. All fonts are bundled in `assets/font Available fonts: `PressStart2P-Regular.ttf`, `4x6-font.ttf`, `5by7.regular.ttf` +Each role also takes a size, and `auto_scale` decides whether those sizes are +used as written or scaled to the panel: + +| Key | Default | Description | +|---|---|---| +| `customization.auto_scale` | `true` | Leave the font fields below blank to auto-pick a crisp pixel (bitmap) font sized for your panel. This toggle only affects a scalable TTF you choose manually: on, it scales that TTF with panel size and snaps it to its pixel grid; off, it uses the exact size below. | +| `customization.header_text.font_size` | `8` | Size in pixels. | +| `customization.position_text.font_size` | `8` | Size in pixels. | +| `customization.detail_text.font_size` | `6` | Size in pixels. | +| `customization.small_text.font_size` | `6` | Size in pixels. | + ### Driver and team codes Set `favorite_driver` to one of these three-letter codes: @@ -212,6 +231,21 @@ Set `favorite_team` to one of these constructor IDs: timezone; if that isn't set, the host system's timezone is used, and only if neither is available do times fall back to UTC. +### What the modes look like + +The two standings modes need no session data, so they are pictured here. The +other six — recent races, upcoming, qualifying, practice, sprint and calendar +— need a live race weekend to have anything to show. + +![Driver and constructor standings](../../docs/assets/f1-scoreboard/standings-modes.png) + +Each card is tinted with the team's colour, and the header carries a season +progress bar showing the round. + +![show_driver_split on and off](../../docs/assets/f1-scoreboard/driver-split.png) + +![The same standings on four panel sizes](../../docs/assets/f1-scoreboard/panel-sizes.png) + ## Data sources | Data | Source | diff --git a/plugins/f1-scoreboard/manifest.json b/plugins/f1-scoreboard/manifest.json index 379ffb88..e7ab883d 100644 --- a/plugins/f1-scoreboard/manifest.json +++ b/plugins/f1-scoreboard/manifest.json @@ -1,7 +1,7 @@ { "id": "f1-scoreboard", "name": "F1 Scoreboard", - "version": "1.8.6", + "version": "1.8.7", "author": "ChuckBuilds", "class_name": "F1ScoreboardPlugin", "entry_point": "manager.py", @@ -29,6 +29,12 @@ "f1_calendar" ], "versions": [ + { + "version": "1.8.7", + "released": "2026-09-03", + "notes": "Documentation. This README was already close: 65 of the 70 settings were documented, and the five missing were customization.auto_scale and the four font sizes, which are now covered. Three settings are marked as not implemented -- upcoming.show_session_times, upcoming.countdown_enabled and qualifying.show_gaps appear nowhere in the plugin or the core, though the countdown they claim to gate is drawn regardless. Adds real rendered screenshots of both standings modes, the constructor driver-split toggle and four panel sizes; the other six modes need a live race weekend to have anything to show.", + "ledmatrix_min_version": "2.0.0" + }, { "version": "1.8.6", "released": "2026-08-21", @@ -286,7 +292,7 @@ "ledmatrix_min_version": "2.0.0" } ], - "last_updated": "2026-08-05", + "last_updated": "2026-09-03", "stars": 0, "downloads": 0, "verified": true,