Add profile conditions, scene presets, MQTT integration, and Scenes tab
Feature 1 — Profile Conditions: time-of-day, system idle (Win32 GetLastInputInfo), and display state (GUID_CONSOLE_DISPLAY_STATE) condition types for automatic profile activation. Feature 2 — Scene Presets: snapshot/restore system that captures target running states, device brightness, and profile enables. Server-side capture with 5-step activation order. Dedicated Scenes tab with CardSection-based card grid, command palette integration, and dashboard quick-activate section. Feature 3 — MQTT Integration: MQTTService singleton with aiomqtt, MQTTLEDClient device provider for pixel output, MQTT profile condition type with topic/payload matching, and frontend support for MQTT device type and condition editor. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -128,6 +128,9 @@
|
||||
"device.led_type.hint": "RGB (3 channels) or RGBW (4 channels with dedicated white)",
|
||||
"device.send_latency": "Send Latency (ms):",
|
||||
"device.send_latency.hint": "Simulated network/serial delay per frame in milliseconds",
|
||||
"device.mqtt_topic": "MQTT Topic:",
|
||||
"device.mqtt_topic.hint": "MQTT topic path for publishing pixel data (e.g. mqtt://ledgrab/device/name)",
|
||||
"device.mqtt_topic.placeholder": "mqtt://ledgrab/device/living-room",
|
||||
"device.url.hint": "IP address or hostname of the device (e.g. http://192.168.1.100)",
|
||||
"device.name": "Device Name:",
|
||||
"device.name.placeholder": "Living Room TV",
|
||||
@@ -529,6 +532,7 @@
|
||||
"dashboard.stop_all": "Stop All",
|
||||
"dashboard.failed": "Failed to load dashboard",
|
||||
"dashboard.section.profiles": "Profiles",
|
||||
"dashboard.section.scenes": "Scene Presets",
|
||||
"dashboard.targets": "Targets",
|
||||
"dashboard.section.performance": "System Performance",
|
||||
"dashboard.perf.cpu": "CPU",
|
||||
@@ -568,6 +572,27 @@
|
||||
"profiles.condition.application.match_type.topmost": "Topmost (foreground)",
|
||||
"profiles.condition.application.match_type.topmost_fullscreen": "Topmost + Fullscreen",
|
||||
"profiles.condition.application.match_type.fullscreen": "Fullscreen",
|
||||
"profiles.condition.time_of_day": "Time of Day",
|
||||
"profiles.condition.time_of_day.start_time": "Start Time:",
|
||||
"profiles.condition.time_of_day.end_time": "End Time:",
|
||||
"profiles.condition.time_of_day.overnight_hint": "For overnight ranges (e.g. 22:00–06:00), set start time after end time.",
|
||||
"profiles.condition.system_idle": "System Idle",
|
||||
"profiles.condition.system_idle.idle_minutes": "Idle Timeout (minutes):",
|
||||
"profiles.condition.system_idle.mode": "Trigger Mode:",
|
||||
"profiles.condition.system_idle.when_idle": "When idle",
|
||||
"profiles.condition.system_idle.when_active": "When active",
|
||||
"profiles.condition.display_state": "Display State",
|
||||
"profiles.condition.display_state.state": "Monitor State:",
|
||||
"profiles.condition.display_state.on": "On",
|
||||
"profiles.condition.display_state.off": "Off (sleeping)",
|
||||
"profiles.condition.mqtt": "MQTT",
|
||||
"profiles.condition.mqtt.topic": "Topic:",
|
||||
"profiles.condition.mqtt.payload": "Payload:",
|
||||
"profiles.condition.mqtt.match_mode": "Match Mode:",
|
||||
"profiles.condition.mqtt.match_mode.exact": "Exact",
|
||||
"profiles.condition.mqtt.match_mode.contains": "Contains",
|
||||
"profiles.condition.mqtt.match_mode.regex": "Regex",
|
||||
"profiles.condition.mqtt.hint": "Activate when an MQTT topic receives a matching payload",
|
||||
"profiles.targets": "Targets:",
|
||||
"profiles.targets.hint": "Targets to start when this profile activates",
|
||||
"profiles.targets.empty": "No targets available",
|
||||
@@ -586,6 +611,36 @@
|
||||
"profiles.error.name_required": "Name is required",
|
||||
"profiles.toggle_all.start": "Start all targets",
|
||||
"profiles.toggle_all.stop": "Stop all targets",
|
||||
"scenes.title": "Scenes",
|
||||
"scenes.add": "Capture Scene",
|
||||
"scenes.edit": "Edit Scene",
|
||||
"scenes.name": "Name:",
|
||||
"scenes.name.hint": "A descriptive name for this scene preset",
|
||||
"scenes.description": "Description:",
|
||||
"scenes.description.hint": "Optional description of what this scene does",
|
||||
"scenes.color": "Card Color:",
|
||||
"scenes.color.hint": "Accent color for the scene card on the dashboard",
|
||||
"scenes.capture": "Capture",
|
||||
"scenes.activate": "Activate scene",
|
||||
"scenes.recapture": "Recapture current state",
|
||||
"scenes.delete": "Delete scene",
|
||||
"scenes.targets_count": "targets",
|
||||
"scenes.devices_count": "devices",
|
||||
"scenes.profiles_count": "profiles",
|
||||
"scenes.captured": "Scene captured",
|
||||
"scenes.updated": "Scene updated",
|
||||
"scenes.activated": "Scene activated",
|
||||
"scenes.activated_partial": "Scene partially activated",
|
||||
"scenes.errors": "errors",
|
||||
"scenes.recaptured": "Scene recaptured",
|
||||
"scenes.deleted": "Scene deleted",
|
||||
"scenes.recapture_confirm": "Recapture current state into \"{name}\"?",
|
||||
"scenes.delete_confirm": "Delete scene \"{name}\"?",
|
||||
"scenes.error.name_required": "Name is required",
|
||||
"scenes.error.save_failed": "Failed to save scene",
|
||||
"scenes.error.activate_failed": "Failed to activate scene",
|
||||
"scenes.error.recapture_failed": "Failed to recapture scene",
|
||||
"scenes.error.delete_failed": "Failed to delete scene",
|
||||
"autostart.title": "Auto-start Targets",
|
||||
"autostart.toggle.enabled": "Auto-start enabled",
|
||||
"autostart.toggle.disabled": "Auto-start disabled",
|
||||
@@ -961,6 +1016,7 @@
|
||||
"search.group.pattern_templates": "Pattern Templates",
|
||||
"search.group.audio": "Audio Sources",
|
||||
"search.group.value": "Value Sources",
|
||||
"search.group.scenes": "Scene Presets",
|
||||
"settings.backup.label": "Backup Configuration",
|
||||
"settings.backup.hint": "Download all configuration (devices, targets, streams, templates, profiles) as a single JSON file.",
|
||||
"settings.backup.button": "Download Backup",
|
||||
|
||||
Reference in New Issue
Block a user