7.1 KiB
Scheduler Fields Support
Overview
The infoscreen client automatically preserves all fields sent by the scheduler in the event database, including scheduler-specific metadata fields like page_progress and auto_progress.
How It Works
Event Storage (simclient.py)
When an event is received via MQTT on the infoscreen/events/{group_id} topic:
-
Full Preservation: The
save_event_to_json()function stores the complete event data usingjson.dump()without filtering -
No Data Loss: All fields from the scheduler are preserved, including:
page_progress- Current page/slide progress trackingauto_progress- Auto-progression stateoccurrence_of_id- Original event ID for recurring eventsrecurrence_rule- iCal recurrence rule (RRULE format)recurrence_end- End date for recurring events- Any other scheduler-specific fields
-
Debug Logging: When
LOG_LEVEL=DEBUG, the system logs the presence ofpage_progressandauto_progressfields
Event Processing (display_manager.py)
The Display Manager:
- Uses scheduler-specific fields to control presentation behavior:
page_progress: Controls Impressive's--page-progressoption (overall progress bar)auto_progress: Controls Impressive's--auto-progressoption (per-page countdown)
- Other scheduler-specific fields are preserved but not actively used by display logic
Example Event with Scheduler Fields
{
"id": 57,
"occurrence_of_id": 57,
"group_id": 2,
"title": "2. Wiederholung",
"start": "2025-10-19T05:00:00+00:00",
"end": "2025-10-19T05:30:00+00:00",
"recurrence_rule": "FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU;UNTIL=20251101T225959Z",
"recurrence_end": "2025-11-01T22:59:59",
"page_progress": true,
"auto_progress": true,
"presentation": {
"type": "slideshow",
"auto_advance": true,
"slide_interval": 10,
"files": [
{
"name": "slides.pdf",
"url": "http://server:8000/api/files/slides.pdf",
"checksum": null,
"size": null
}
]
}
}
Implementation Details
Storage Function (simclient.py)
def save_event_to_json(event_data):
"""Speichert eine Event-Nachricht in der Datei current_event.json
This function preserves ALL fields from the incoming event data,
including scheduler-specific fields like:
- page_progress: Current page/slide progress tracking
- auto_progress: Auto-progression state
- And any other fields sent by the scheduler
"""
Display Manager Implementation (display_manager.py)
The Display Manager reads page_progress and auto_progress fields and translates them to Impressive command-line options:
# In start_presentation() method:
# Get scheduler-specific progress display settings
page_progress = event.get('page_progress', False) # Show overall progress bar
auto_progress = event.get('auto_progress', False) # Show per-page auto-advance progress
# Later, when building Impressive command:
if page_progress:
cmd.append('--page-progress')
logging.info("Page progress bar enabled (shows overall position in presentation)")
if auto_progress:
cmd.append('--auto-progress')
logging.info("Auto-progress bar enabled (shows per-page countdown during auto-advance)")
Impressive Command Line Options
| Event Field | Impressive Option | Short Form | Description |
|---|---|---|---|
page_progress: true |
--page-progress |
-q |
Shows a progress bar at the bottom indicating position in presentation |
auto_progress: true |
--auto-progress |
-k |
Shows a countdown progress bar for each page during auto-advance |
Example Commands:
# With page progress only
impressive --fullscreen --auto 10 --wrap --page-progress presentation.pdf
# With auto progress only
impressive --fullscreen --auto 10 --wrap --auto-progress presentation.pdf
# With both progress bars
impressive --fullscreen --auto 10 --wrap --page-progress --auto-progress presentation.pdf
Storage Function (simclient.py)
def save_event_to_json(event_data):
"""Speichert eine Event-Nachricht in der Datei current_event.json
This function preserves ALL fields from the incoming event data,
including scheduler-specific fields like:
- page_progress: Show overall progress bar in presentation
- auto_progress: Show per-page auto-advance countdown
- And any other fields sent by the scheduler
"""
try:
json_path = os.path.join(os.path.dirname(__file__), "current_event.json")
with open(json_path, "w", encoding="utf-8") as f:
json.dump(event_data, f, ensure_ascii=False, indent=2)
logging.info(f"Event-Nachricht in {json_path} gespeichert")
# Log if scheduler-specific fields are present (DEBUG level)
if isinstance(event_data, list):
for idx, event in enumerate(event_data):
if isinstance(event, dict):
if 'page_progress' in event:
logging.debug(f"Event {idx}: page_progress = {event['page_progress']}")
if 'auto_progress' in event:
logging.debug(f"Event {idx}: auto_progress = {event['auto_progress']}")
elif isinstance(event_data, dict):
if 'page_progress' in event_data:
logging.debug(f"Event page_progress = {event_data['page_progress']}")
if 'auto_progress' in event_data:
logging.debug(f"Event auto_progress = {event_data['auto_progress']}")
except Exception as e:
logging.error(f"Fehler beim Speichern der Event-Nachricht: {e}")
Verification
To verify that scheduler fields are being stored correctly:
-
Check the log file (with
LOG_LEVEL=DEBUG):tail -f ~/infoscreen-dev/logs/simclient.logLook for:
Event page_progress = 0 Event auto_progress = true -
Inspect current_event.json directly:
cat ~/infoscreen-dev/src/current_event.json | jqAll scheduler fields should be present in the output.
-
Test with MQTT message:
mosquitto_pub -h localhost -t "infoscreen/events/2" -m '{ "id": 99, "page_progress": 5, "auto_progress": true, "presentation": { "files": [{"name": "test.pdf"}], "auto_advance": true, "slide_interval": 10 } }'Then check that
page_progressandauto_progressappear incurrent_event.json.
Future Use
If the Display Manager needs to use these scheduler fields in the future (e.g., to resume presentations at a specific page), the fields are already available in the event data without any code changes needed in simclient.py.
Summary
✅ No changes required - The current implementation already preserves all scheduler fields
✅ Automatic preservation - Uses json.dump() which saves complete data structure
✅ Debug logging added - Logs presence of page_progress and auto_progress fields
✅ Documentation updated - README now documents scheduler-specific fields
✅ Future-proof - Any new scheduler fields will be automatically preserved