From c2f0edbd6466b8a6d7f1269dc298871fc550d5f5 Mon Sep 17 00:00:00 2001 From: Chuck <33324927+ChuckBuilds@users.noreply.github.com> Date: Wed, 2 Sep 2026 14:38:18 -0400 Subject: [PATCH 1/2] fix(clock-simple): make the bitmap fonts work, and document every setting Three of the six fonts in the picker did nothing, each for its own reason, and all three failed the same way: a warning in the log and a silent fall back to the default face, so the setting looked broken rather than misconfigured. A .bdf is a bitmap face that exists at exactly one pixel size. The loader asked for font_size (8 by default), FreeType answered "invalid pixel size" for every .bdf, and the clock used the default font -- 5x7.bdf and 4x6.bdf rendered byte-identical to PressStart2P-Regular.ttf. They are now retried at the size the file's own PIXEL_SIZE header declares. Verified by rendering all six and hashing: before, four of six were the same image; after, all five remaining fonts are distinct. cozette.bdf is removed from the three font pickers. The file is shipped by neither the core nor the plugin, so choosing it could only ever fall back to the default. Removing a schema option would normally be a major bump, but this one has never functioned, so no working configuration can depend on it -- hence minor. Say the word if you would rather it stayed listed and merely documented. The README is rewritten around real rendered screenshots and now covers all 20 settings. Things it previously left unsaid: enabled defaults to false, which is the usual reason a fresh install shows nothing; the timezone resolution order (plugin, then global, then system, with no UTC fallback); that font_size applies only to scalable .ttf faces; that 24h mode never draws the AM/PM element at all; and how the text shrinks and the date falls back through shorter forms -- "September 2nd" to "Sep 2nd" to "Sep 2" -- to fit a narrow panel, which the 64x32 shot shows. Config-token audit against the old README: nothing dropped, no broken TOC anchors, and all 20 schema leaves documented. Co-Authored-By: Claude Opus 5 --- README.md | 2 +- docs/assets/clock-simple/colors.png | Bin 0 -> 16656 bytes docs/assets/clock-simple/date-format.png | Bin 0 -> 23128 bytes docs/assets/clock-simple/fonts.png | Bin 0 -> 25986 bytes docs/assets/clock-simple/hero.png | Bin 0 -> 1247 bytes docs/assets/clock-simple/panel-sizes.png | Bin 0 -> 21290 bytes docs/assets/clock-simple/shots.json | 448 +++++++++++++++++++++++ docs/assets/clock-simple/time-format.png | Bin 0 -> 14928 bytes plugins.json | 4 +- plugins/clock-simple/README.md | 421 ++++++++++++++------- plugins/clock-simple/config_schema.json | 72 +++- plugins/clock-simple/manager.py | 32 ++ plugins/clock-simple/manifest.json | 13 +- 13 files changed, 830 insertions(+), 162 deletions(-) create mode 100644 docs/assets/clock-simple/colors.png create mode 100644 docs/assets/clock-simple/date-format.png create mode 100644 docs/assets/clock-simple/fonts.png create mode 100644 docs/assets/clock-simple/hero.png create mode 100644 docs/assets/clock-simple/panel-sizes.png create mode 100644 docs/assets/clock-simple/shots.json create mode 100644 docs/assets/clock-simple/time-format.png diff --git a/README.md b/README.md index 13432c47..e76d1db3 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ curl -X POST http://your-pi-ip:5000/api/v3/plugins/install \ | Plugin | Description | Preview | |--------|-------------|---------| -| [Simple Clock](./plugins/clock-simple/) | Time and date display | | +| [Simple Clock](./plugins/clock-simple/) | Time and date display | clock-simple on an LED panel | | [7-Segment Clock](./plugins/7-segment-clock/) | Retro-style 7-segment clock with customizable colors | 7-segment-clock on an LED panel | | [Google Calendar](./plugins/calendar/) | Upcoming events from Google Calendar | | | [Geochron World Clock](./plugins/geochron/) | World map with the real-time day/night terminator | | diff --git a/docs/assets/clock-simple/colors.png b/docs/assets/clock-simple/colors.png new file mode 100644 index 0000000000000000000000000000000000000000..0e8f5ac3011dda6d0040d65bf34fff8ea206d070 GIT binary patch literal 16656 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

a7GU$6cC{{ZKoQo;ZL literal 0 HcmV?d00001 diff --git a/docs/assets/clock-simple/date-format.png b/docs/assets/clock-simple/date-format.png new file mode 100644 index 0000000000000000000000000000000000000000..68d9ea01c403613fa1f55255080b5b2ac8f5d5a4 GIT binary patch literal 23128 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 uw!r^O!6O8P`Bt-bd5v+!3}Rbbq6d=CPF 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 GNB;%Dp-tid literal 0 HcmV?d00001 diff --git a/plugins.json b/plugins.json index 610c1736..8f51520d 100644 --- a/plugins.json +++ b/plugins.json @@ -164,10 +164,10 @@ "plugin_path": "plugins/clock-simple", "stars": 0, "downloads": 0, - "last_updated": "2026-07-31", + "last_updated": "2026-09-02", "verified": true, "screenshot": "", - "latest_version": "1.0.10" + "latest_version": "1.1.0" }, { "id": "countdown", diff --git a/plugins/clock-simple/README.md b/plugins/clock-simple/README.md index d2d68a5f..7ff143e4 100644 --- a/plugins/clock-simple/README.md +++ b/plugins/clock-simple/README.md @@ -1,200 +1,345 @@ ------------------------------------------------------------------------------------ -### Connect with ChuckBuilds - -- Show support on Youtube: https://www.youtube.com/@ChuckBuilds -- Stay in touch on Instagram: https://www.instagram.com/ChuckBuilds/ -- Want to chat or need support? Reach out on the ChuckBuilds Discord: https://discord.com/invite/uW36dVAtcT -- Feeling Generous? Support the project: - - Github Sponsorship: https://github.com/sponsors/ChuckBuilds - - Buy Me a Coffee: https://buymeacoffee.com/chuckbuilds - - Ko-fi: https://ko-fi.com/chuckbuilds/ - ------------------------------------------------------------------------------------ - -# Simple Clock Plugin - -A simple, customizable clock display plugin for LEDMatrix that shows the current time and date. +# Simple Clock + +A clean time-and-date clock for your LED matrix. It picks the largest text that +fits your panel, shrinks and abbreviates when it has to, and lets you restyle +the time, the date and the AM/PM marker independently. + +![The clock on a 128x32 panel showing 3:07 PM in white with PM in pale yellow, +and Wednesday over September 2nd in +orange](../../docs/assets/clock-simple/hero.png) + +*Every image in this README is real plugin output, rendered at the true panel +size against a frozen clock and then scaled up so the pixels stay pixels. +Nothing here is a mockup.* + +--- + +## Table of Contents + +1. [What's On Screen](#whats-on-screen) +2. [Installation](#installation) +3. [Quick Start](#quick-start) +4. [Configuration Reference](#configuration-reference) + - [enabled](#enabled) + - [display_duration](#display_duration) + - [update_interval](#update_interval) + - [timezone](#timezone) + - [time_format](#time_format) + - [show_seconds](#show_seconds) + - [center_time_with_ampm](#center_time_with_ampm) + - [show_date](#show_date) + - [date_format](#date_format) + - [position_x and position_y](#position_x-and-position_y) +5. [Fonts and Colours](#fonts-and-colours) +6. [Panel Sizes and How Text Shrinks](#panel-sizes-and-how-text-shrinks) +7. [Troubleshooting](#troubleshooting) +8. [Development](#development) +9. [Support](#support) + +--- + +## What's On Screen + +Up to three elements, each styled separately: + +```text + 3:07 PM <- the time, and the AM/PM marker (12-hour mode only) + Wednesday <- the weekday, in the OLD_CLOCK date format only +September 2nd <- the date +``` -## Features +The weekday line is specific to the default `OLD_CLOCK` date format. The +numeric formats draw a single date line and no weekday. -- **Time Display**: Shows current time in 12-hour or 24-hour format -- **Date Display**: Optional date display with multiple format options -- **Timezone Support**: Configurable timezone for accurate time display -- **Color Customization**: Customizable colors for time, date, and AM/PM indicator -- **Position Control**: Configurable display position +--- ## Installation -### From the Plugin Store (recommended) +**From the Plugin Store (recommended).** Open the LEDMatrix web interface at +`http://:5000`, go to **Plugin Manager**, find **Simple Clock** in +the **Plugin Store** section, and click **Install**. -1. Open the LEDMatrix web interface (`http://your-pi-ip:5000`) -2. Open the **Plugin Manager** tab -3. Find **Simple Clock** in the **Plugin Store** section (it's in the - `time` category) and click **Install** -4. Toggle the plugin on, then click **Restart Display Service** on the - **Overview** tab +**Manually.** Copy this directory into your LEDMatrix `plugin-repos/` and +restart the display service. -### Manual Installation +Note that `enabled` defaults to **`false`**, so the clock does nothing until +you switch it on — unlike most plugins in this repo. -1. Copy this plugin directory to your `plugins/` folder -2. Restart LEDMatrix -3. Enable the plugin in the web interface +--- -## Configuration +## Quick Start -Add the following to your `config/config.json`: +```json +{ + "clock-simple": { + "enabled": true + } +} +``` + +Everything else has a sensible default. A fully specified configuration: ```json { "clock-simple": { "enabled": true, - "timezone": "America/New_York", + "display_duration": 15, + "update_interval": 1, + "timezone": "America/Chicago", "time_format": "12h", "show_seconds": false, + "center_time_with_ampm": false, "show_date": true, - "date_format": "MM/DD/YYYY", - "display_duration": 15, + "date_format": "OLD_CLOCK", "position_x": 0, "position_y": 0, "customization": { - "time_text": { - "font": "PressStart2P-Regular.ttf", - "font_size": 8, - "text_color": [255, 255, 255] - }, - "date_text": { - "font": "PressStart2P-Regular.ttf", - "font_size": 8, - "text_color": [255, 128, 64] - }, - "ampm_text": { - "font": "PressStart2P-Regular.ttf", - "font_size": 8, - "text_color": [255, 255, 128] - } + "time_text": { "font": "PressStart2P-Regular.ttf", "font_size": 8, + "text_color": [255, 255, 255] }, + "date_text": { "font": "PressStart2P-Regular.ttf", "font_size": 8, + "text_color": [255, 128, 64] }, + "ampm_text": { "font": "PressStart2P-Regular.ttf", "font_size": 8, + "text_color": [255, 255, 128] } } } } ``` -### Configuration Options +--- + +## Configuration Reference + +| Option | Type | Default | What it does | +|--------|------|---------|--------------| +| [`enabled`](#enabled) | boolean | `false` | Whether the clock runs at all | +| [`display_duration`](#display_duration) | number | `15` | Seconds the clock holds the panel per turn | +| [`update_interval`](#update_interval) | integer | `1` | Seconds between refreshes | +| [`timezone`](#timezone) | string / null | `null` | IANA timezone, or inherit | +| [`time_format`](#time_format) | string | `12h` | `12h` or `24h` | +| [`show_seconds`](#show_seconds) | boolean | `false` | Append `:SS` | +| [`center_time_with_ampm`](#center_time_with_ampm) | boolean | `false` | Centre time and AM/PM as one block | +| [`show_date`](#show_date) | boolean | `true` | Draw the date at all | +| [`date_format`](#date_format) | string | `OLD_CLOCK` | Which date style | +| [`position_x`](#position_x-and-position_y) | integer | `0` | Horizontal nudge, in pixels | +| [`position_y`](#position_x-and-position_y) | integer | `0` | Vertical nudge, in pixels | + +### `enabled` + +Turns the clock on. **It defaults to `false`**, which is the single most common +reason a fresh install shows nothing. + +### `display_duration` + +How many seconds the clock holds the panel each time the rotation reaches it. +This does not affect accuracy — the time is re-read every frame, so it stays +correct for the whole turn however long you make it. + +### `update_interval` + +Seconds between refreshes, default `1`. With `show_seconds` on you want `1`; +with it off you could raise it, but there is little to gain — the plugin only +pushes pixels to the panel when the rendered image actually changes, so an +unchanged minute costs nothing either way. + +### `timezone` + +An IANA timezone name such as `America/Chicago`, `Europe/London` or +`Australia/Sydney`. Resolution order, first match wins: + +1. `timezone` in this plugin's config +2. The global LEDMatrix `timezone` setting +3. The host system's timezone + +Leave it unset on a normal install. Set it only when you want this clock to +show a *different* zone from the rest of your board — a second clock for a +remote office, for instance. + +### `time_format` + +`12h` (the default) draws `3:07` with a separate `PM` marker that you can +colour independently. `24h` draws `15:07` and no marker at all — the AM/PM +element simply is not used. + +### `show_seconds` -| Option | Type | Default | Description | -|--------|------|---------|-------------| -| `enabled` | boolean | `false` | Enable or disable the plugin | -| `display_duration` | number | `15` | Seconds to hold the screen each rotation (1–300) | -| `update_interval` | integer | `1` | How often to redraw the clock, in seconds (1–60) | -| `timezone` | string \| null | `null` | IANA timezone name (e.g. `"America/New_York"`). When null, inherits the global LEDMatrix timezone | -| `time_format` | string | `"12h"` | `"12h"` or `"24h"` | -| `center_time_with_ampm` | boolean | `false` | Center the time + AM/PM as one block (12h only) | -| `show_seconds` | boolean | `false` | Include seconds in the time | -| `show_date` | boolean | `true` | Show date below the time | -| `date_format` | string | `"OLD_CLOCK"` | One of `"MM/DD/YYYY"`, `"DD/MM/YYYY"`, `"YYYY-MM-DD"`, `"OLD_CLOCK"` (e.g. `Monday, January 1st`) | -| `position_x` | integer | `0` | X offset in pixels | -| `position_y` | integer | `0` | Y offset in pixels | -| `customization` | object | See below | Per-element font and color overrides | +Appends `:SS`, giving `3:07:09` or `15:07:09`. The string is wider, so on a +narrow panel the clock picks a smaller size to fit it. -### Customization Options +![Four panels comparing 12-hour against 24-hour, and seconds off against +on](../../docs/assets/clock-simple/time-format.png) -The `customization` object allows you to customize fonts and colors for each display element: +### `center_time_with_ampm` -- **`time_text`**: Font and color settings for the time display - - `font`: Font family (e.g., `"PressStart2P-Regular.ttf"`) - - `font_size`: Font size in pixels (4-16) - - `text_color`: RGB color array `[R, G, B]` (default: `[255, 255, 255]`) +By default the time is centred on the panel and the `PM` marker sits beside it, +which means the digits stay put as the hour changes between one and two +characters. Set this to `true` to centre the time *and* the marker together as +one block — tidier at a glance, at the cost of the digits shifting slightly +when the hour rolls from `9:59` to `10:00`. -- **`date_text`**: Font and color settings for the date display - - `font`: Font family - - `font_size`: Font size in pixels (4-16) - - `text_color`: RGB color array (default: `[255, 128, 64]`) +### `show_date` -- **`ampm_text`**: Font and color settings for AM/PM indicator (12-hour format only) - - `font`: Font family - - `font_size`: Font size in pixels (4-16) - - `text_color`: RGB color array (default: `[255, 255, 128]`) +Set to `false` for a time-only clock. The time is then drawn larger, since it +has the whole panel to itself. -### Timezone Examples +### `date_format` -- `"America/New_York"` - Eastern Time -- `"America/Chicago"` - Central Time -- `"America/Denver"` - Mountain Time -- `"America/Los_Angeles"` - Pacific Time -- `"Europe/London"` - GMT/BST -- `"Asia/Tokyo"` - Japan Standard Time -- `"Australia/Sydney"` - Australian Eastern Time +| Value | Renders as | Notes | +|-------|------------|-------| +| `OLD_CLOCK` | `Wednesday` over `September 2nd` | The default. The only format with a weekday line | +| `MM/DD/YYYY` | `09/02/2026` | US numeric | +| `DD/MM/YYYY` | `02/09/2026` | Day-first numeric | +| `YYYY-MM-DD` | `2026-09-02` | ISO 8601 | -## Usage +![Six panels showing the four date formats, a time-only clock, and the centred +AM/PM variant](../../docs/assets/clock-simple/date-format.png) -Once installed and configured: +`OLD_CLOCK` is the format the original LEDMatrix clock used, with a full month +name and an ordinal day. It is the widest of the four, which is what makes the +shrink-to-fit behaviour below most visible. -1. The plugin will automatically update every second (based on `update_interval` in manifest) -2. The display will show during rotation according to your configured `display_duration` -3. The time updates in real-time based on your configured timezone +### `position_x` and `position_y` + +Pixel offsets applied to the whole clock, both defaulting to `0`. Positive `x` +moves right, positive `y` moves down. These are for nudging the layout on a +panel where it sits slightly wrong — for centring, leave them alone, since the +clock already centres itself on the panel it is given. + +--- + +## Fonts and Colours + +Three elements are styled independently under `customization`: `time_text`, +`date_text` and `ampm_text`. Each takes `font`, `font_size` and `text_color`. + +`text_color` is an `[R, G, B]` array. The defaults are deliberately not all +white — white time, orange date, pale yellow AM/PM — so the three read as +distinct at a glance. + +![Four panels showing the default colours, an amber scheme, a cyan scheme and +all-white](../../docs/assets/clock-simple/colors.png) + +`font` takes one of five faces: + +![Five panels showing each available font rendering the same +time](../../docs/assets/clock-simple/fonts.png) + +| Font | Kind | Notes | +|------|------|-------| +| `PressStart2P-Regular.ttf` | Scalable | The default; chunky 8-bit, very legible across a room | +| `4x6-font.ttf` | Scalable | Small, fits noticeably more on a line | +| `5by7.regular.ttf` | Scalable | A rounder 5×7 face | +| `5x7.bdf` | Bitmap | Crisp; always drawn at its native 7px size | +| `4x6.bdf` | Bitmap | The smallest option; native 6px | + +**`font_size` only applies to the scalable `.ttf` faces.** A `.bdf` is a bitmap +font that exists at exactly one pixel size, so the plugin loads it at the size +the file declares and ignores `font_size`. That is why the two `.bdf` faces +look sharp while a `.ttf` scaled to an odd size looks soft. + +--- + +## Panel Sizes and How Text Shrinks + +The clock measures its text against the panel and steps down rather than +overflowing. + +![The same clock on 64x32, 128x32, 128x64 and 256x32 +panels](../../docs/assets/clock-simple/panel-sizes.png) + +Two behaviours worth knowing, both visible in the 64×32 panel above: + +- **The weekday abbreviates.** `Wednesday` becomes `Wed` when the full name + will not fit. +- **The date falls back through shorter forms.** `September 2nd` becomes + `Sep 2nd`, then `Sep 2`; the numeric formats drop to a two-digit year + (`09/02/26`) and then to `09-02`. + +The clock only shortens what it must, so a wider panel keeps the full text. On +a 128×64 panel the time and date sit in separate bands with the space between +them; on a 256×32 chain the clock centres and simply has more black around it. + +--- ## Troubleshooting -### Common Issues +**Nothing appears at all.** +`enabled` defaults to `false` in this plugin. Check it is `true`. -**Time shows wrong timezone:** -- Verify the `timezone` setting in your configuration (if specified) -- If not specified, check the global `timezone` setting in your main LEDMatrix config -- Check that the timezone string is valid (see timezone examples above) +**The time is wrong by a whole number of hours.** +That is the timezone. Check `timezone` here, then the global LEDMatrix +`timezone`, then the host clock. Remember an unset value inherits rather than +defaulting to UTC. -**Colors not displaying correctly:** -- Ensure RGB values are between 0-255 -- Check that your display supports the chosen colors +**The time is wrong by minutes.** +That is the Pi's system clock, not the plugin. Check `timedatectl` and that NTP +is reaching a time server. -**Plugin not appearing in rotation:** -- Verify `enabled` is set to `true` -- Check that the plugin loaded successfully in the web interface -- Ensure `display_duration` is greater than 0 +**I picked a font and nothing changed.** +On a current version all five faces work. On older versions the two `.bdf` +options silently fell back to the default, because they were requested at +`font_size` rather than at the pixel size the file declares. If you are on an +older build, use one of the `.ttf` faces. -### Debug Logging +**The date is abbreviated and I want it in full.** +That is the fit logic — the full text does not fit at the current font size. +Use a smaller font (`4x6.bdf` or `4x6-font.ttf`), a shorter `date_format`, or a +wider panel. -Enable debug logging to troubleshoot issues: +**Text is cut off at an edge.** +Check `position_x` / `position_y` are `0`. The clock centres itself, so a +non-zero offset is the usual cause. -```json -{ - "logging": { - "level": "DEBUG", - "file": "/path/to/ledmatrix.log" - } -} +### Debug logging + +The plugin logs the formatted time once a minute at INFO, and font-loading +problems at WARNING: + +```bash +journalctl -t ledmatrix -f ``` +A line like `Could not load font @` means the face was found but +could not be loaded at that size; `Font file not found` means the file is +missing from `assets/fonts/`. + +--- + ## Development -### Plugin Structure +### Plugin structure +```text +clock-simple/ +├── manifest.json # Plugin metadata and version history +├── manager.py # ClockSimplePlugin +├── config_schema.json # Settings schema; source of truth for defaults +├── README.md +└── LICENSE ``` -plugins/clock-simple/ -├── manifest.json # Plugin metadata and requirements -├── manager.py # Main plugin class -├── config_schema.json # Configuration validation schema -└── README.md # This file -``` -### Testing +Fonts are not shipped with the plugin — they come from the core's +`assets/fonts/` directory. + +### Regenerating the images in this README -The fastest way to verify a change without restarting the full display -service is the LEDMatrix dev preview server, which renders this plugin in -your browser without any hardware: +Every screenshot comes from a declarative shot list against a frozen clock, so +re-rendering is reproducible: ```bash -cd /path/to/LEDMatrix -python3 scripts/dev_server.py --extra-dir /path/to/ledmatrix-plugins/plugins/clock-simple -# then open http://localhost:5001 +python scripts/render_docs_assets.py --plugin clock-simple ``` -You can also render a single still frame to a PNG with -`scripts/render_plugin.py` — see -[`docs/DEV_PREVIEW.md`](https://github.com/ChuckBuilds/LEDMatrix/blob/main/docs/DEV_PREVIEW.md) -for details. +`--check` verifies the committed images still match what the plugin renders. -## License +--- -GPL-3.0 License - feel free to modify and distribute. +## Support -## Contributing +- YouTube: +- Instagram: +- Discord: +- Sponsor: [GitHub Sponsors](https://github.com/sponsors/ChuckBuilds) · + [Buy Me a Coffee](https://buymeacoffee.com/chuckbuilds) · + [Ko-fi](https://ko-fi.com/chuckbuilds/) -Found a bug or want to add features? Please create an issue or submit a pull request on the [LEDMatrix GitHub repository](https://github.com/ChuckBuilds/LEDMatrix). +Released under the GNU General Public License v3.0 — see [LICENSE](LICENSE). diff --git a/plugins/clock-simple/config_schema.json b/plugins/clock-simple/config_schema.json index c3c11b1f..aad94dfc 100644 --- a/plugins/clock-simple/config_schema.json +++ b/plugins/clock-simple/config_schema.json @@ -25,13 +25,19 @@ "x-advanced": true }, "timezone": { - "type": ["string", "null"], + "type": [ + "string", + "null" + ], "default": null, "description": "Timezone for the clock display (e.g., 'America/New_York', 'Europe/London'). Use IANA timezone database names. If not specified or set to null, inherits from LEDMatrix global timezone setting." }, "time_format": { "type": "string", - "enum": ["12h", "24h"], + "enum": [ + "12h", + "24h" + ], "default": "12h", "description": "Time format: '12h' for 12-hour format with AM/PM, '24h' for 24-hour format" }, @@ -53,7 +59,12 @@ }, "date_format": { "type": "string", - "enum": ["MM/DD/YYYY", "DD/MM/YYYY", "YYYY-MM-DD", "OLD_CLOCK"], + "enum": [ + "MM/DD/YYYY", + "DD/MM/YYYY", + "YYYY-MM-DD", + "OLD_CLOCK" + ], "default": "OLD_CLOCK", "description": "Date format to display. OLD_CLOCK matches the original clock layout with weekday and month/day with ordinal suffix (e.g., 'Monday, January 1st')" }, @@ -88,8 +99,7 @@ "4x6-font.ttf", "5by7.regular.ttf", "5x7.bdf", - "4x6.bdf", - "cozette.bdf" + "4x6.bdf" ], "default": "PressStart2P-Regular.ttf", "x-advanced": true @@ -114,10 +124,18 @@ }, "minItems": 3, "maxItems": 3, - "default": [255, 255, 255] + "default": [ + 255, + 255, + 255 + ] } }, - "x-propertyOrder": ["font", "font_size", "text_color"], + "x-propertyOrder": [ + "font", + "font_size", + "text_color" + ], "additionalProperties": false }, "date_text": { @@ -134,8 +152,7 @@ "4x6-font.ttf", "5by7.regular.ttf", "5x7.bdf", - "4x6.bdf", - "cozette.bdf" + "4x6.bdf" ], "default": "PressStart2P-Regular.ttf", "x-advanced": true @@ -160,10 +177,18 @@ }, "minItems": 3, "maxItems": 3, - "default": [255, 128, 64] + "default": [ + 255, + 128, + 64 + ] } }, - "x-propertyOrder": ["font", "font_size", "text_color"], + "x-propertyOrder": [ + "font", + "font_size", + "text_color" + ], "additionalProperties": false }, "ampm_text": { @@ -180,8 +205,7 @@ "4x6-font.ttf", "5by7.regular.ttf", "5x7.bdf", - "4x6.bdf", - "cozette.bdf" + "4x6.bdf" ], "default": "PressStart2P-Regular.ttf", "x-advanced": true @@ -206,17 +230,31 @@ }, "minItems": 3, "maxItems": 3, - "default": [255, 255, 128] + "default": [ + 255, + 255, + 128 + ] } }, - "x-propertyOrder": ["font", "font_size", "text_color"], + "x-propertyOrder": [ + "font", + "font_size", + "text_color" + ], "additionalProperties": false } }, - "x-propertyOrder": ["time_text", "date_text", "ampm_text"], + "x-propertyOrder": [ + "time_text", + "date_text", + "ampm_text" + ], "additionalProperties": false } }, - "required": ["enabled"], + "required": [ + "enabled" + ], "additionalProperties": false } diff --git a/plugins/clock-simple/manager.py b/plugins/clock-simple/manager.py index 386bad39..0a7d9bc3 100644 --- a/plugins/clock-simple/manager.py +++ b/plugins/clock-simple/manager.py @@ -132,6 +132,24 @@ def _load_element_font(self, element_cfg: Dict[str, Any]): font = ImageFont.truetype(path, size) break except OSError as e: + # A .bdf is a bitmap face and only exists at the one pixel + # size it was drawn at; FreeType rejects any other with + # "invalid pixel size". Asking for font_size (8 by default) + # therefore failed for every .bdf in the picker, and the + # clock silently fell back to the default font -- the + # setting looked like it did nothing. Retry at the size the + # file declares. + native = self._bdf_pixel_size(path) + if native is not None and native != size: + try: + font = ImageFont.truetype(path, native) + self.logger.debug( + "Loaded bitmap font %s at its native size %d " + "(requested %d)", name, native, size + ) + break + except OSError: + pass # OSError only: that is what FreeType raises for a missing, # unreadable or malformed face. Catching everything here # would turn a programming error into a silent fallback to @@ -142,6 +160,20 @@ def _load_element_font(self, element_cfg: Dict[str, Any]): self._font_cache[key] = font return self._font_cache[key] + @staticmethod + def _bdf_pixel_size(path: str) -> Optional[int]: + """The pixel size a .bdf font declares, or None if it does not.""" + try: + with open(path, "r", encoding="latin-1") as handle: + for line in handle: + if line.startswith("PIXEL_SIZE"): + return int(line.split()[1]) + if line.startswith("CHARS"): + break # past the header; no point reading the glyphs + except (OSError, ValueError, IndexError): + return None + return None + def _get_global_timezone(self) -> str: """Get the global timezone from the main config.""" try: diff --git a/plugins/clock-simple/manifest.json b/plugins/clock-simple/manifest.json index 1aac999f..a5ecd7f7 100644 --- a/plugins/clock-simple/manifest.json +++ b/plugins/clock-simple/manifest.json @@ -1,7 +1,7 @@ { "id": "clock-simple", "name": "Simple Clock", - "version": "1.0.10", + "version": "1.1.0", "author": "ChuckBuilds", "description": "A simple clock display with current time and date", "category": "time", @@ -16,6 +16,11 @@ "clock-simple" ], "versions": [ + { + "version": "1.1.0", + "released": "2026-09-02", + "ledmatrix_min": "2.0.0" + }, { "version": "1.0.10", "released": "2026-07-31", @@ -25,13 +30,13 @@ "released": "2026-07-21", "version": "1.0.8", "ledmatrix_min": "2.0.0", - "notes": "Actually stop the per-second flash. The previous fix only avoided a full hardware clear on unchanged frames, but it still called display_manager.clear() whenever the visible content changed — and clear() writes black straight to the panel's front buffer, so the panel blanked between the clear and the redraw on the core's ~1 Hz loop. With seconds shown that content changes every second, so it flashed every second (and once a minute otherwise). The clock now rebuilds each frame on a fresh in-memory buffer and lets update_display() swap it in atomically (SwapOnVSync); dirty-tracking skips the push when pixels are unchanged. No hardware clear, so the panel never blanks — whether or not seconds are shown." + "notes": "Actually stop the per-second flash. The previous fix only avoided a full hardware clear on unchanged frames, but it still called display_manager.clear() whenever the visible content changed \u2014 and clear() writes black straight to the panel's front buffer, so the panel blanked between the clear and the redraw on the core's ~1 Hz loop. With seconds shown that content changes every second, so it flashed every second (and once a minute otherwise). The clock now rebuilds each frame on a fresh in-memory buffer and lets update_display() swap it in atomically (SwapOnVSync); dirty-tracking skips the push when pixels are unchanged. No hardware clear, so the panel never blanks \u2014 whether or not seconds are shown." }, { "released": "2026-07-19", "version": "1.0.7", "ledmatrix_min": "2.0.0", - "notes": "Fix the clock flashing/blinking periodically. The plugin now redraws its content on every render tick and only clears the buffer when the displayed time or date changes, instead of skipping frames — so the panel stays lit steadily regardless of update_interval. Also fit the time/AM-PM and date to the panel width so content no longer overflows the edge on narrow (64px-wide) matrices; the weekday and date are abbreviated only when the full text wouldn't fit, so wider panels are unchanged." + "notes": "Fix the clock flashing/blinking periodically. The plugin now redraws its content on every render tick and only clears the buffer when the displayed time or date changes, instead of skipping frames \u2014 so the panel stays lit steadily regardless of update_interval. Also fit the time/AM-PM and date to the panel width so content no longer overflows the edge on narrow (64px-wide) matrices; the weekday and date are abbreviated only when the full text wouldn't fit, so wider panels are unchanged." }, { "released": "2026-07-17", @@ -50,7 +55,7 @@ "ledmatrix_min_version": "2.0.0" } ], - "last_updated": "2026-07-31", + "last_updated": "2026-09-02", "stars": 0, "downloads": 0, "verified": true, From b7b65fe269784427b976f852be0d91f3d12c59dc Mon Sep 17 00:00:00 2001 From: Chuck <33324927+ChuckBuilds@users.noreply.github.com> Date: Wed, 2 Sep 2026 14:39:16 -0400 Subject: [PATCH 2/2] docs(clock-simple): restore the dev-preview instructions The config-token audit only looks at settings, so it did not catch that the rewrite dropped a prose section: how to preview a change with the core's dev_server.py and --extra-dir, and the pointer to DEV_PREVIEW.md. Worth having -- it is the fastest loop for anyone changing this plugin, and nothing else in the README says it exists. Co-Authored-By: Claude Opus 5 --- plugins/clock-simple/README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/plugins/clock-simple/README.md b/plugins/clock-simple/README.md index 7ff143e4..2222f460 100644 --- a/plugins/clock-simple/README.md +++ b/plugins/clock-simple/README.md @@ -320,6 +320,21 @@ clock-simple/ Fonts are not shipped with the plugin — they come from the core's `assets/fonts/` directory. +### Previewing a change without a panel + +The fastest way to see a change is the core's dev preview server, which renders +the plugin in a browser with no hardware: + +```bash +cd /path/to/LEDMatrix +python3 scripts/dev_server.py --extra-dir /path/to/ledmatrix-plugins/plugins/clock-simple +# then open http://localhost:5001 +``` + +To render a single still frame to a PNG instead, use `scripts/render_plugin.py` +in the core — see +[docs/DEV_PREVIEW.md](https://github.com/ChuckBuilds/LEDMatrix/blob/main/docs/DEV_PREVIEW.md). + ### Regenerating the images in this README Every screenshot comes from a declarative shot list against a frozen clock, so