feat(jmri): headless JMRI server with Leviton layout power monitor and X11 GUI mode

- Stable udev device symlinks (/dev/jmri/nce, /dev/jmri/loconet, /dev/jmri/lcc)
- jmri-monitor: polls Leviton Decora Smart switch to start/stop JMRI automatically
  - Quiet hours 1-10 AM (no polling)
  - 30s off-delay before shutdown
- LCRR config cloned from Gitea (ssh://gitea.mk-labs.cloud:2221/rblundon/LCRR.git)
- ~/.jmri symlinked to LCRR repo for GitOps config management
- jmri-gui: X11 remote GUI access (PanelPro/DecoderPro) via ssh -X as jmri user
  - Stops daemon, launches GUI, restarts daemon on exit if layout still on
- jmri user gets login shell + SSH key for GUI sessions
- Full JRE installed (openjdk-21-jre) for AWT/X11 support
This commit is contained in:
Hermes Agent service account committed 2026-07-29 00:43:23 -05:00
1 parent a5433dcb5b
commit d974c75d7c
26 files changed
+2460 -459

No files matched your search

@@ -0,0 +1 @@
{"nodes": [{"id": "home_hermes_git_homelab_n8n_workflows_dns_create_a_record_json", "label": "DNS_ Create A Record.json", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L1"}, {"id": "workflows_dns_create_a_record_name", "label": "name", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L2"}, {"id": "workflows_dns_create_a_record_nodes", "label": "nodes", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L3"}, {"id": "workflows_dns_create_a_record_pindata", "label": "pinData", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L56"}, {"id": "workflows_dns_create_a_record_connections", "label": "connections", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L57"}, {"id": "workflows_dns_create_a_record_connections_webhook", "label": "Webhook", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L58"}, {"id": "workflows_dns_create_a_record_webhook_main", "label": "main", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L59"}, {"id": "workflows_dns_create_a_record_connections_global_constants", "label": "Global Constants", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L69"}, {"id": "workflows_dns_create_a_record_global_constants_main", "label": "main", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L70"}, {"id": "workflows_dns_create_a_record_active", "label": "active", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L81"}, {"id": "workflows_dns_create_a_record_settings", "label": "settings", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L82"}, {"id": "workflows_dns_create_a_record_settings_executionorder", "label": "executionOrder", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L83"}, {"id": "workflows_dns_create_a_record_settings_binarymode", "label": "binaryMode", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L84"}, {"id": "workflows_dns_create_a_record_settings_availableinmcp", "label": "availableInMCP", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L85"}, {"id": "workflows_dns_create_a_record_versionid", "label": "versionId", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L87"}, {"id": "workflows_dns_create_a_record_meta", "label": "meta", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L88"}, {"id": "workflows_dns_create_a_record_meta_templatecredssetupcompleted", "label": "templateCredsSetupCompleted", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L89"}, {"id": "workflows_dns_create_a_record_meta_instanceid", "label": "instanceId", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L90"}, {"id": "workflows_dns_create_a_record_id", "label": "id", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L92"}, {"id": "workflows_dns_create_a_record_tags", "label": "tags", "file_type": "code", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L93"}], "edges": [{"source": "home_hermes_git_homelab_n8n_workflows_dns_create_a_record_json", "target": "workflows_dns_create_a_record_name", "relation": "contains", "confidence": "EXTRACTED", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L2", "weight": 1.0}, {"source": "home_hermes_git_homelab_n8n_workflows_dns_create_a_record_json", "target": "workflows_dns_create_a_record_nodes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L3", "weight": 1.0}, {"source": "home_hermes_git_homelab_n8n_workflows_dns_create_a_record_json", "target": "workflows_dns_create_a_record_pindata", "relation": "contains", "confidence": "EXTRACTED", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L56", "weight": 1.0}, {"source": "home_hermes_git_homelab_n8n_workflows_dns_create_a_record_json", "target": "workflows_dns_create_a_record_connections", "relation": "contains", "confidence": "EXTRACTED", "source_file": "n8n/workflows/DNS_ Create A Record.json", "source_location": "L57", "weight": 1.0}, {"source": "workflows_dns_create_a_record_connections", "target": "workflows_dns_create_a_record_connections_webhook", "relation": "contains", "confidence": "EXTRACTED", "source_file": "n8n/woLine truncated