diff --git a/plugins.json b/plugins.json index 3c877193..c53aac55 100644 --- a/plugins.json +++ b/plugins.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "last_updated": "2026-07-09", + "last_updated": "2026-07-10", "plugins": [ { "id": "7-segment-clock", @@ -20,10 +20,10 @@ "plugin_path": "plugins/7-segment-clock", "stars": 0, "downloads": 0, - "last_updated": "2026-06-07", + "last_updated": "2026-07-08", "verified": true, "screenshot": "", - "latest_version": "1.0.2" + "latest_version": "1.0.3" }, { "id": "baseball-scoreboard", @@ -94,10 +94,10 @@ "plugin_path": "plugins/calendar", "stars": 0, "downloads": 0, - "last_updated": "2026-05-15", + "last_updated": "2026-07-08", "verified": true, "screenshot": "", - "latest_version": "1.1.2" + "latest_version": "1.1.3" }, { "id": "christmas-countdown", @@ -160,10 +160,10 @@ "plugin_path": "plugins/countdown", "stars": 0, "downloads": 0, - "last_updated": "2026-05-30", + "last_updated": "2026-07-08", "verified": true, "screenshot": "", - "latest_version": "3.1.0", + "latest_version": "3.1.1", "icon": "fa-clock" }, { @@ -529,7 +529,7 @@ "last_updated": "2026-07-08", "verified": true, "screenshot": "", - "latest_version": "1.2.1", + "latest_version": "1.2.2", "icon": "fa-circle-dot" }, { @@ -728,10 +728,10 @@ "plugin_path": "plugins/static-image", "stars": 0, "downloads": 0, - "last_updated": "2026-05-15", + "last_updated": "2026-07-08", "verified": true, "screenshot": "", - "latest_version": "1.0.3" + "latest_version": "1.0.4" }, { "id": "stock-news", diff --git a/plugins/7-segment-clock/README.md b/plugins/7-segment-clock/README.md index 6cd22de5..aeb16c01 100644 --- a/plugins/7-segment-clock/README.md +++ b/plugins/7-segment-clock/README.md @@ -1,16 +1,16 @@ # 7-Segment Clock Plugin -A retro-style 7-segment clock plugin for LEDMatrix that displays time using digit images with configurable formats and sunrise/sunset-based color transitions. +A retro-style 7-segment clock plugin for LEDMatrix that displays the time using +digit images with configurable format, spacing, and color. ## Features -- **Retro 7-Segment Display**: Uses classic digit images (13x32px) with customizable colors -- **Time Format Options**: Support for 12-hour and 24-hour time formats -- **Leading Zero Control**: Optional leading zero for hours (e.g., "09:30" vs "9:30") -- **Flashing Separator**: Optional blinking colon separator between hours and minutes -- **Sunrise/Sunset Color Transitions**: Automatically transitions between daytime and nighttime colors based on sun elevation -- **Location-Based**: Configure latitude/longitude for accurate sunrise/sunset calculations -- **Timezone Support**: Display time in any timezone +- **Retro 7-Segment Display**: Classic digit images (13×32px) with a customizable color +- **Time Format Options**: 12-hour and 24-hour formats +- **Leading Zero Control**: Optional leading zero for hours (e.g. "09:30" vs "9:30") +- **Flashing Separator**: Optional blinking colon between hours and minutes +- **Adjustable Digit Spacing**: Tune the pixel gap between digits for readability +- **Timezone Support**: Display time in any timezone (or inherit the main LEDMatrix timezone) ## Installation @@ -18,8 +18,7 @@ A retro-style 7-segment clock plugin for LEDMatrix that displays time using digi 1. Open the LEDMatrix web interface (`http://your-pi-ip:5000`) 2. Open the **Plugin Manager** tab -3. Find **7-Segment Clock** in the **Plugin Store** section and click - **Install** +3. Find **7-Segment Clock** in the **Plugin Store** section and click **Install** ### Manual Installation @@ -47,23 +46,11 @@ A retro-style 7-segment clock plugin for LEDMatrix that displays time using digi ## Configuration -The plugin can be configured via the web interface or directly in `config/config.json`: +The plugin can be configured via the web interface (the form is generated from +`config_schema.json`, which is the source of truth) or directly in +`config/config.json`. -### Basic Configuration - -```json -{ - "7-segment-clock": { - "enabled": true, - "display_duration": 15, - "is_24_hour_format": true, - "has_leading_zero": false, - "has_flashing_separator": true - } -} -``` - -### Full Configuration with Location and Colors +### Example ```json { @@ -71,88 +58,66 @@ The plugin can be configured via the web interface or directly in `config/config "enabled": true, "display_duration": 15, "location": { - "lat": 37.541290, - "lng": -77.434769, - "timezone": "US/Eastern", - "locality": "Richmond, VA" + "timezone": "US/Eastern" }, "is_24_hour_format": true, "has_leading_zero": false, "has_flashing_separator": true, - "color_daytime": "#FFFFFF", - "color_nighttime": "#220000", - "min_fade_elevation": "-1" + "digit_spacing": 2, + "color": "#FFFFFF" } } ``` ### Configuration Options -| Option | Type | Default | Description | -|--------|------|---------|-------------| +| Option | Type | Default | Notes | +|--------|------|---------|-------| | `enabled` | boolean | `true` | Enable or disable the plugin | -| `display_duration` | number | `15` | How long to display the clock (seconds) | -| `location.lat` | number | `37.541290` | Latitude for sunrise/sunset calculations | -| `location.lng` | number | `-77.434769` | Longitude for sunrise/sunset calculations | -| `location.timezone` | string | `"US/Eastern"` | Timezone string (e.g., "US/Eastern", "UTC") | -| `location.locality` | string | `"Richmond, VA"` | Human-readable location name | -| `is_24_hour_format` | boolean | `true` | Use 24-hour format (false for 12-hour) | -| `has_leading_zero` | boolean | `false` | Show leading zero for hours | -| `has_flashing_separator` | boolean | `true` | Enable blinking separator (colon) | -| `color_daytime` | string | `"#FFFFFF"` | Hex color for daytime (white) | -| `color_nighttime` | string | `"#FFFFFF"` | Hex color for nighttime (white) | -| `min_fade_elevation` | string | `"-1"` | Sun elevation threshold for color mixing | - -### Color Transition Options - -The `min_fade_elevation` option controls when color transitions occur based on sun elevation: - -- **`"-1"`** (None): No fading, switches directly between day/night colors -- **`"-6"`** (Civil twilight): Fades during civil twilight (sun 6° below horizon) -- **`"-12"`** (Nautical twilight): Fades during nautical twilight (sun 12° below horizon) -- **`"-18"`** (Astronomical twilight): Fades during astronomical twilight (sun 18° below horizon) +| `display_duration` | number | `15` | How long to show the clock, in seconds (5–300) | +| `location.timezone` | string | *(inherits)* | Timezone string (e.g. `US/Eastern`, `UTC`). If unset, inherits the main LEDMatrix timezone | +| `is_24_hour_format` | boolean | `true` | Use 24-hour format (`false` for 12-hour) | +| `has_leading_zero` | boolean | `false` | Show a leading zero for hours (e.g. `09:30` instead of `9:30`) | +| `has_flashing_separator` | boolean | `true` | Blink the colon separator once per second | +| `digit_spacing` | number | `2` | Pixels between digits, for readability (0–10) | +| `color` | string | `"#FFFFFF"` | Hex color for the digits (e.g. `#FFFFFF` white, `#FF0000` red) | ## Usage -Once installed and enabled, the plugin will automatically display the current time during the normal plugin rotation. The display updates every 60 seconds (configurable via `update_interval` in manifest). +Once installed and enabled, the plugin displays the current time during the normal +plugin rotation. The core refreshes the plugin on its own cadence (see +`update_interval` in `manifest.json`, default 60s). ### Time Formats -- **24-hour format** (`is_24_hour_format: true`): Displays time as "HH:MM" (e.g., "14:30") -- **12-hour format** (`is_24_hour_format: false`): Displays time as "H:MM" or "HH:MM" (e.g., "2:30" or "02:30") +- **24-hour** (`is_24_hour_format: true`): "HH:MM" (e.g. "14:30") +- **12-hour** (`is_24_hour_format: false`): "H:MM" or "HH:MM" depending on `has_leading_zero` (e.g. "2:30" or "02:30") ### Separator Flashing -When `has_flashing_separator` is enabled, the colon separator blinks every second (visible on even seconds, hidden on odd seconds), similar to traditional digital clocks. +When `has_flashing_separator` is enabled, the colon blinks each second (visible on +even seconds, hidden on odd), like a traditional digital clock. ## Technical Details ### Image Assets -The plugin uses digit images (13x32 pixels) and a separator image (4x14 pixels) stored in `assets/images/`: -- `number_0.png` through `number_9.png`: Digit images -- `separator.png`: Colon separator image - -Images have transparent foreground on black background, allowing colors to be applied dynamically. - -### Sunrise/Sunset Calculations - -The plugin uses the `astral` library to calculate sun elevation based on: -- Location (latitude/longitude) -- Current date and time -- Timezone +The plugin uses digit images (13×32px) and a separator image (4×14px) in +`assets/images/`: +- `number_0.png` through `number_9.png`: digit images +- `separator.png`: the colon separator -Color mixing is calculated based on the sun's elevation relative to the configured fade thresholds. +Images have a transparent foreground on a black background, so the configured +`color` is applied dynamically. ### Display Dimensions -The plugin automatically adapts to any display size configured in LEDMatrix. Display dimensions are read from `display_manager.width` and `display_manager.height`. - -Centering calculations ensure the clock is properly positioned regardless of display width (supports 64x32, 128x32, chained panels, etc.). +The plugin adapts to any display size configured in LEDMatrix (dimensions are read +from `display_manager`), and centers the clock regardless of panel width (64×32, +128×32, chained panels, etc.). ## Dependencies -- `astral>=3.2`: Sunrise/sunset and sun elevation calculations - `pytz>=2023.3`: Timezone support - `PIL` (Pillow): Image processing (provided by LEDMatrix core) @@ -161,26 +126,19 @@ Centering calculations ensure the clock is properly positioned regardless of dis ### Clock Not Displaying 1. Check that the plugin is enabled in `config/config.json` -2. Verify images are present in `assets/images/` directory -3. Check plugin logs for errors: `journalctl -u ledmatrix -f` (if running as service) +2. Verify the images are present in the `assets/images/` directory +3. Check plugin logs for errors: `journalctl -u ledmatrix -f` (if running as a service) ### Wrong Time Displayed -1. Verify timezone is correct in configuration -2. Check system time is correct -3. Ensure location coordinates are accurate if using sunrise/sunset features - -### Colors Not Transitioning - -1. Verify location coordinates (lat/lng) are correct -2. Check that `min_fade_elevation` is set appropriately -3. Verify `color_daytime` and `color_nighttime` are different colors +1. Verify `location.timezone` is correct (or that the inherited main timezone is right) +2. Check that the system time is correct ### Images Not Loading -1. Verify all image files exist in `assets/images/` directory -2. Check file permissions on image files -3. Verify image files are valid PNG files +1. Verify all image files exist in `assets/images/` +2. Check file permissions on the image files +3. Verify the image files are valid PNGs ## Development @@ -192,13 +150,14 @@ Centering calculations ensure the clock is properly positioned regardless of dis ├── manager.py # Main plugin class ├── config_schema.json # Configuration schema ├── requirements.txt # Python dependencies -├── README.md # This file +├── README.md # This file +├── LICENSE └── assets/ └── images/ - ├── number_0.png # Digit images (0-9) + ├── number_0.png # Digit images (0-9) ├── ... ├── number_9.png - └── separator.png # Colon separator + └── separator.png # Colon separator ``` ### Testing @@ -210,15 +169,14 @@ python run.py --emulator ## License -[Add your license here] +Released under the GNU General Public License v3.0 — see [LICENSE](LICENSE). ## Credits - Original Big Clock applet: [TronbyT Apps](https://github.com/tronbyt/apps) -- Digit images sourced from TronbyT repository -- Adapted for LEDMatrix plugin system +- Digit images sourced from the TronbyT repository +- Adapted for the LEDMatrix plugin system ## Support For issues, questions, or contributions, please open an issue on the GitHub repository. - diff --git a/plugins/7-segment-clock/manifest.json b/plugins/7-segment-clock/manifest.json index a7c86f24..7d007189 100644 --- a/plugins/7-segment-clock/manifest.json +++ b/plugins/7-segment-clock/manifest.json @@ -1,7 +1,7 @@ { "id": "7-segment-clock", "name": "7-Segment Clock", - "version": "1.0.2", + "version": "1.0.3", "description": "Display a retro-style 7-segment clock with customizable colors", "author": "LEDMatrix", "entry_point": "manager.py", @@ -24,15 +24,21 @@ "default_duration": 15, "config_schema": "config_schema.json", "versions": [ + { + "released": "2026-07-08", + "version": "1.0.3", + "notes": "Rewrite the README to match the actual config schema: remove the documented-but-removed sunrise/sunset color-transition options and location lat/lng/locality keys, and document the real color and digit_spacing options. Normalize the versions changelog key to ledmatrix_min_version.", + "ledmatrix_min_version": "2.0.0" + }, { "released": "2026-06-07", "version": "1.0.2", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-05-15", "version": "1.0.1", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "version": "1.0.0", @@ -40,5 +46,5 @@ "ledmatrix_min_version": "2.0.0" } ], - "last_updated": "2026-06-07" + "last_updated": "2026-07-08" } diff --git a/plugins/calendar/README.md b/plugins/calendar/README.md index 7a3bb4fb..6ceb255e 100644 --- a/plugins/calendar/README.md +++ b/plugins/calendar/README.md @@ -96,15 +96,23 @@ All authentication files (`credentials.json` and `token.pickle`) are stored in t ### Configuration Options -- `enabled`: Enable/disable the plugin -- `credentials_file`: Path to OAuth credentials JSON file -- `token_file`: Path to store authentication token -- `max_events`: Maximum number of events to fetch (1-10) -- `calendars`: List of calendar IDs (use `"primary"` for default calendar) -- `update_interval`: Seconds between API updates (minimum 60) -- `show_all_day_events`: Include all-day events -- `event_rotation_interval`: Seconds between rotating events (minimum 5) -- `display_duration`: Total display duration in seconds +The web UI form is generated from `config_schema.json` (the source of truth). +`credentials_file` and `token_file` are handled by the setup flow above (the upload +widget and first-time authentication) and rarely need editing by hand. + +| Key | Default | Notes | +|-----|---------|-------| +| `enabled` | `false` | Enable or disable the plugin | +| `credentials_file` | `"credentials.json"` | Google OAuth credentials file (uploaded via the config UI) | +| `token_file` | `"token.pickle"` | Where the OAuth token is stored after first-time auth (auto-created) | +| `calendars` | `["primary"]` | Calendar IDs to display — use the calendar picker after authenticating, or `"primary"` for your default | +| `max_events` | `3` | Maximum upcoming events to show (1–10) | +| `show_all_day_events` | `true` | Include all-day events | +| `event_rotation_interval` | `10` | Seconds between rotating displayed events (min 5) | +| `display_duration` | `30` | Total seconds on screen before moving to the next plugin (min 5) | +| `update_interval` | `3600` | Seconds between refreshes from Google (60–86400) | +| `customization.datetime_text.font` / `.font_size` | `PressStart2P-Regular.ttf` / `8` | Font family + size (4–16px) for the event date/time line | +| `customization.title_text.font` / `.font_size` | `PressStart2P-Regular.ttf` / `8` | Font family + size (4–16px) for the event title | ## Display Format diff --git a/plugins/calendar/config_schema.json b/plugins/calendar/config_schema.json index 9c95cc38..b2c034b8 100644 --- a/plugins/calendar/config_schema.json +++ b/plugins/calendar/config_schema.json @@ -5,6 +5,7 @@ "enabled": { "type": "boolean", "default": false, + "title": "Enabled", "description": "Enable or disable the calendar plugin" }, "credentials_file": { @@ -38,23 +39,27 @@ "default": 3, "minimum": 1, "maximum": 10, + "title": "Max Events", "description": "Maximum number of upcoming events to show" }, "show_all_day_events": { "type": "boolean", "default": true, + "title": "Show All-Day Events", "description": "Include all-day events in the display" }, "event_rotation_interval": { "type": "number", "default": 10, "minimum": 5, + "title": "Event Rotation Interval (seconds)", "description": "Seconds between rotating displayed events" }, "display_duration": { "type": "number", "default": 30, "minimum": 5, + "title": "Display Duration (seconds)", "description": "Total display duration in seconds before moving to next plugin" }, "update_interval": { @@ -62,6 +67,7 @@ "default": 3600, "minimum": 60, "maximum": 86400, + "title": "Update Interval (seconds)", "description": "How often to refresh calendar data from Google (seconds)" }, "customization": { diff --git a/plugins/calendar/manifest.json b/plugins/calendar/manifest.json index 172c9c54..e8ea97b9 100644 --- a/plugins/calendar/manifest.json +++ b/plugins/calendar/manifest.json @@ -1,7 +1,7 @@ { "id": "calendar", "name": "Google Calendar", - "version": "1.1.2", + "version": "1.1.3", "author": "ChuckBuilds", "description": "Display upcoming events from Google Calendar with date, time, and event details. Shows next 1-3 events with automatic rotation and timezone support.", "category": "productivity", @@ -35,15 +35,21 @@ } ], "versions": [ + { + "released": "2026-07-08", + "version": "1.1.3", + "notes": "Document the config in a per-key table (including the previously-undocumented customization fonts), add web-UI titles to the untitled options (Max Events, Show All-Day Events, durations, Update Interval), and normalize the versions changelog key to ledmatrix_min_version.", + "ledmatrix_min_version": "2.0.0" + }, { "released": "2026-05-15", "version": "1.1.2", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-04-24", "version": "1.1.1", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-03-02", @@ -56,7 +62,7 @@ "ledmatrix_min_version": "2.0.0" } ], - "last_updated": "2026-05-15", + "last_updated": "2026-07-08", "stars": 0, "downloads": 0, "verified": true, diff --git a/plugins/countdown/README.md b/plugins/countdown/README.md index c1f0c6ed..391e8859 100644 --- a/plugins/countdown/README.md +++ b/plugins/countdown/README.md @@ -48,24 +48,40 @@ Display customizable countdowns with images on your LED matrix. Perfect for birt ### Configuration Options +The web UI form is generated from `config_schema.json` (the source of truth). + #### Per-Countdown Settings -- **Name** (required): Display name, max 30 characters -- **Target Date** (required): Date in YYYY-MM-DD format -- **Image Path**: Local image path (optional) -- **Enabled**: Toggle to enable/disable this countdown -- **Display Order**: Controls rotation order (lower numbers first) - -#### Global Settings -- **Display Duration**: How long to show each countdown (seconds) -- **Font Family**: Choose from press_start, four_by_six, tom_thumb, tiny, picopixel -- **Font Size**: Size for countdown value (6-16px) -- **Font Color**: RGB color for countdown value -- **Name Font Size**: Size for countdown name (6-16px) -- **Name Font Color**: RGB color for countdown name -- **Fit to Display**: Auto-scale images to fit -- **Preserve Aspect Ratio**: Maintain image proportions when scaling -- **Background Color**: RGB color for background -- **Show Expired**: Display countdowns that have already passed + +Each entry in the **Countdowns** table supports: + +| Field | Default | Notes | +|-------|---------|-------| +| `name` (required) | — | Display name, max 30 chars | +| `target_date` (required) | — | `YYYY-MM-DD` — the date to count to/from | +| `target_time` | `00:00` | Optional `HH:MM` (24h) for sub-day precision; switches to hours/minutes as the event nears | +| `mode` | `until` | `until` counts down to the date (Days Until); `since` counts up from it (Days Since) | +| `layout_preset` | `image-left` | `image-left`, `image-right`, `text-only`, or `image-only` | +| `text_align` | `center` | `left`, `center`, or `right` for the name/value text | +| `image_path` | — | Optional image shown alongside the countdown | +| `enabled` | `true` | Show/hide this countdown | +| `display_order` | `0` | Rotation order (lower first) | +| `layout.*` | auto | Optional pixel position/size overrides for the image and text | +| `style.*` | inherit | Optional per-countdown font/size/color overrides (`null` inherits the global settings below) | + +#### Global Settings (defaults for all countdowns) + +| Key | Default | Notes | +|-----|---------|-------| +| `display_duration` | `15` | Seconds to show each countdown before rotating (5–300) | +| `font_family` | `press_start` | One of `press_start`, `four_by_six`, `tom_thumb`, `tiny`, `picopixel` | +| `font_size` | `8` | Countdown value font size (4–16px) | +| `font_color` | `[255, 255, 255]` | RGB color for the countdown value | +| `name_font_size` | `8` | Countdown name font size (4–16px) | +| `name_font_color` | `[200, 200, 200]` | RGB color for the countdown name | +| `background_color` | `[0, 0, 0]` | RGB background color | +| `show_expired` | `false` | Show `until` countdowns that have passed (as "Nd ago") | +| `fit_to_display` | `true` | Auto-scale images to their allocated area | +| `preserve_aspect_ratio` | `true` | Keep image proportions when scaling | ## Display Layout @@ -196,7 +212,7 @@ Feel free to submit issues, feature requests, or pull requests! ## License -MIT License - See LICENSE file for details +Released under the GNU General Public License v3.0 — see the LICENSE file for details. ## Credits diff --git a/plugins/countdown/config_schema.json b/plugins/countdown/config_schema.json index 086d2c3f..744593ad 100644 --- a/plugins/countdown/config_schema.json +++ b/plugins/countdown/config_schema.json @@ -8,6 +8,7 @@ "enabled": { "type": "boolean", "default": true, + "title": "Enabled", "description": "Enable or disable the countdown plugin" }, "countdowns": { diff --git a/plugins/countdown/manifest.json b/plugins/countdown/manifest.json index c9569dd3..2ea55540 100644 --- a/plugins/countdown/manifest.json +++ b/plugins/countdown/manifest.json @@ -1,7 +1,7 @@ { "id": "countdown", "name": "Countdown Display", - "version": "3.1.0", + "version": "3.1.1", "author": "ChuckBuilds", "description": "Create and manage customizable countdowns with images. Perfect for birthdays, holidays, events, and special occasions.", "entry_point": "manager.py", @@ -21,25 +21,31 @@ ">=2.0.0" ], "versions": [ + { + "released": "2026-07-08", + "version": "3.1.1", + "notes": "Rewrite the README config section as a per-key table covering the v3 keys (target_time, mode, layout_preset, text_align, and the per-countdown style/layout overrides), add a title to the top-level enabled option, normalize the versions changelog key to ledmatrix_min_version, and set the manifest license to GPL-3.0 (project standard; the LICENSE file was already GPL).", + "ledmatrix_min_version": "2.0.0" + }, { "released": "2026-05-30", "version": "3.1.0", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-05-30", "version": "3.0.1", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-05-30", "version": "3.0.0", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-05-15", "version": "2.0.1", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-03-06", @@ -55,8 +61,8 @@ "update_interval": 30, "default_duration": 15, "icon": "fa-clock", - "license": "MIT", + "license": "GPL-3.0", "homepage": "https://github.com/ChuckBuilds/ledmatrix-plugins/tree/main/plugins/countdown", "config_schema": "config_schema.json", - "last_updated": "2026-05-30" + "last_updated": "2026-07-08" } diff --git a/plugins/on-air/README.md b/plugins/on-air/README.md index 56d94bad..2e9d4726 100644 --- a/plugins/on-air/README.md +++ b/plugins/on-air/README.md @@ -1,8 +1,6 @@ # On Air Light -A retro broadcast tally light for your LED matrix. Publish a single MQTT message to take over the display with a pulsing red "ON AIR" sign — it holds until you send the off command, so it works as a persistent do-not-disturb signal during calls, recordings, or livestreams. - -![On Air Light — pulsing red ON AIR tally light on a 192×48 LED matrix panel](preview.png) +A retro broadcast tally light for your LED matrix. Publish a single MQTT message to take over the display with a bold "ON AIR" sign — it holds until you send the off command, so it works as a persistent do-not-disturb signal during calls, recordings, or livestreams. Text, text color, and background color are all customizable. --- @@ -53,17 +51,21 @@ mosquitto_pub -h -t ledmatrix/on-air/set -m OFF | Field | Default | Description | |---|---|---| -| **MQTT Broker Host** | `localhost` | IP or hostname of your MQTT broker | -| **MQTT Port** | `1883` | Broker port (use 8883 for TLS) | -| **MQTT Username** | *(blank)* | Leave blank if no auth required | -| **MQTT Password** | *(blank)* | Leave blank if no auth required | -| **Command Topic** | `ledmatrix/on-air/set` | Topic the plugin **subscribes** to | -| **State Topic** | `ledmatrix/on-air/state` | Topic the plugin **publishes** to after each state change | -| **Default Label** | `ON AIR` | Text shown when activated without a label in the payload | -| **Default Color** | `[255, 20, 20]` | RGB glow color — broadcast red by default | -| **Enable Pulsing** | `true` | Animate the glow with a slow heartbeat pulse | -| **Pulse Speed** | `1.2` Hz | How fast the glow breathes (1.2 ≈ one pulse per second) | -| **Standby Rotation Duration** | `5` s | How long the dark standby screen sits in the normal rotation before cycling away | +| **Sign Text** | `ON AIR` | Text shown when activated (max 32 chars). Overridable per-message via JSON. | +| **Text Color** | `[255, 255, 255]` | RGB color of the sign text. | +| **Background Color** | `[200, 10, 10]` | RGB background color — broadcast red by default. | +| **Font** | *(blank)* | Path to a TTF font relative to the LEDMatrix root (e.g. `assets/fonts/PressStart2P-Regular.ttf`). Blank uses the default font, auto-sized to 80% of display height. | +| **Font Size (px)** | `0` | Font height in pixels when a custom Font is set. `0` auto-sizes to 80% of display height. | +| **MQTT Broker Host** | `localhost` | IP or hostname of your MQTT broker. | +| **MQTT Port** | `1883` | Broker port (use 8883 for TLS). | +| **MQTT Username** | *(blank)* | Leave blank if no auth required. | +| **MQTT Password** | *(blank)* | Leave blank if no auth required. | +| **Command Topic** | `ledmatrix/on-air/set` | Topic the plugin **subscribes** to (publish `ON`/`OFF` or JSON). | +| **State Topic** | `ledmatrix/on-air/state` | Topic the plugin **publishes** to after each state change. | +| **Enable Home Assistant Auto-Discovery** | `true` | Announce to HA via MQTT discovery so it auto-creates the device (switch, label sensor, connectivity) — no `configuration.yaml` needed. | +| **HA Discovery Prefix** | `homeassistant` | MQTT topic prefix your HA MQTT integration listens on. | +| **Device Name in Home Assistant** | `LED Matrix — On Air` | How the device appears under Settings → Devices & Services → MQTT. | +| **Display Duration (seconds)** | `5` | How long the sign stays on screen each rotation cycle while active (1–60). | --- @@ -98,16 +100,16 @@ The label (max 16 chars) replaces "ON AIR" on the display. On panels 128 px wide ### JSON — state + label + color ```json -{"state": "on", "label": "IN MEETING", "color": [255, 140, 0]} -{"state": "on", "label": "RECORDING", "color": [255, 20, 20]} -{"state": "on", "label": "LIVE", "color": [255, 0, 80]} +{"state": "on", "label": "IN MEETING", "bg": [255, 140, 0]} +{"state": "on", "label": "RECORDING", "bg": [200, 10, 10]} +{"state": "on", "label": "LIVE", "bg": [255, 0, 80], "color": [255, 255, 255]} ``` -Color is `[R, G, B]` and controls both the background glow and the tally dot. Good presets: +`bg` (or `background_color`) sets the sign's background — the dominant color of the display — and `color` (or `text_color`) sets the text. Both are `[R, G, B]`. Good background presets: -| Situation | Color | +| Situation | Background | |---|---| -| Recording / On Air | `[255, 20, 20]` — broadcast red | +| Recording / On Air | `[200, 10, 10]` — broadcast red | | In a meeting / call | `[255, 140, 0]` — amber | | Livestreaming | `[255, 0, 80]` — hot pink | | Do Not Disturb | `[180, 0, 180]` — purple | diff --git a/plugins/on-air/manifest.json b/plugins/on-air/manifest.json index 59939d2d..e0135dac 100644 --- a/plugins/on-air/manifest.json +++ b/plugins/on-air/manifest.json @@ -1,7 +1,7 @@ { "id": "on-air", "name": "On Air Light", - "version": "1.2.1", + "version": "1.2.2", "author": "ChuckBuilds", "description": "Retro broadcast ON AIR tally light. Activate remotely via MQTT or Home Assistant to signal you're on a call, recording, or live — stays on until you turn it off.", "entry_point": "manager.py", @@ -11,29 +11,35 @@ "display_modes": ["on_air"], "compatible_versions": [">=2.0.0"], "versions": [ + { + "released": "2026-07-08", + "version": "1.2.2", + "notes": "Update the README to match the current config schema and behavior: replace the removed pulsing/glow/tally-dot options with the actual text color, background color, font, and Home Assistant discovery fields; fix the per-message color/bg payload docs; and drop the broken preview image reference.", + "ledmatrix_min_version": "2.0.0" + }, { "released": "2026-07-08", "version": "1.2.1", "notes": "Add a GPL-3.0 LICENSE file (project-standard license). Remove the invalid update_interval:0 manifest field (this plugin is MQTT push-driven and does not poll, matching mqtt-notifications).", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-06-08", "version": "1.2.0", "notes": "Fully customisable display: text, font path, font size, text color, background color. Removed animation/glow/tally-dot. Font loaded via PIL ImageFont.truetype with auto fallback to built-in display fonts. Per-MQTT-message color and bg override via JSON payload.", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-06-08", "version": "1.1.0", "notes": "Add HA MQTT Auto-Discovery: plugin publishes device + switch/sensor/binary_sensor configs on connect so HA creates the device automatically. Adds LWT for accurate offline detection. New config fields: ha_discovery, discovery_prefix, device_name.", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-06-07", "version": "1.0.0", "notes": "Initial release. MQTT-driven ON AIR tally light with pulsing red glow, state feedback topic, and Home Assistant switch compatibility.", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" } ], "default_duration": 5, diff --git a/plugins/static-image/README.md b/plugins/static-image/README.md index 6432d435..e75f2b84 100644 --- a/plugins/static-image/README.md +++ b/plugins/static-image/README.md @@ -75,9 +75,9 @@ from it. Key options: | Key | Default | Notes | |---|---|---| | `enabled` | `false` | Master switch | -| `images` | `[]` | Array of image paths (relative to LEDMatrix root or absolute) | -| `image_config.mode` | `"single"` | How images are presented | -| `image_config.rotation_mode` | `"sequential"` | `"sequential"` or `"random"` when multiple images | +| `images` | `[]` | Array of image entries (each an object with a `path` and an optional per-image `schedule`), managed via the file-upload widget. See **Per-Image Scheduling** below. | +| `image_config.mode` | `"single"` | How images are presented: `"single"` or `"multiple"` | +| `image_config.rotation_mode` | `"sequential"` | Order when showing multiple images: `"sequential"`, `"random"`, `"time_based"` (advance on a wall-clock interval), or `"date_based"` (one image per day) | | `rotation_settings.sequential_loop` | `true` | Loop back to the first image after the last | | `rotation_settings.random_seed` | `null` | Optional fixed seed for reproducible random order | | `rotation_settings.time_intervals.enabled` | `false` | Tie image changes to wall-clock intervals | @@ -88,6 +88,21 @@ from it. Key options: | `background_color` | `[0, 0, 0]` | RGB fill behind transparent pixels | | `display_duration` | `10` | Seconds the plugin holds the screen each rotation | +### Per-Image Scheduling + +Each entry in `images` can carry an optional `schedule` so an image only shows at +certain times (e.g. a "good morning" board, or business-hours signage): + +| Schedule key | Default | Notes | +|---|---|---| +| `schedule.enabled` | `false` | Turn scheduling on for this image | +| `schedule.mode` | `"always"` | `"always"` (any time), `"time_range"` (same window every day), or `"per_day"` (a different window per weekday) | +| `schedule.start_time` / `schedule.end_time` | `"08:00"` / `"18:00"` | Window bounds (HH:MM, 24-hour) for `time_range` mode | +| `schedule.days.` | — | Per-weekday `enabled` + `start_time`/`end_time`, used when `mode` is `"per_day"` | + +When several images are eligible at the same time, they rotate per +`image_config.rotation_mode`. + ## Usage ### Basic Setup diff --git a/plugins/static-image/manifest.json b/plugins/static-image/manifest.json index c68159c3..64eb9d06 100644 --- a/plugins/static-image/manifest.json +++ b/plugins/static-image/manifest.json @@ -1,7 +1,7 @@ { "id": "static-image", "name": "Static Image Display", - "version": "1.0.3", + "version": "1.0.4", "author": "ChuckBuilds", "description": "Display static images on your LED matrix with automatic scaling, aspect ratio preservation, and transparency support. Perfect for logos, artwork, or custom graphics.", "entry_point": "manager.py", @@ -18,10 +18,16 @@ "static_image" ], "versions": [ + { + "released": "2026-07-08", + "version": "1.0.4", + "notes": "Correct the README config docs: document all rotation_mode values (sequential/random/time_based/date_based), describe images as scheduled image entries rather than plain paths, and add a Per-Image Scheduling section. Normalize the versions changelog key to ledmatrix_min_version.", + "ledmatrix_min_version": "2.0.0" + }, { "released": "2026-05-15", "version": "1.0.3", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "version": "1.0.2", @@ -34,7 +40,7 @@ "ledmatrix_min_version": "2.0.0" } ], - "last_updated": "2026-05-15", + "last_updated": "2026-07-08", "stars": 0, "downloads": 0, "verified": true,