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_vm_provisioning_pipeline_json", "label": "VM Provisioning Pipeline.json", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L1"}, {"id": "workflows_vm_provisioning_pipeline_name", "label": "name", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L2"}, {"id": "workflows_vm_provisioning_pipeline_nodes", "label": "nodes", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L3"}, {"id": "workflows_vm_provisioning_pipeline_pindata", "label": "pinData", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L913"}, {"id": "workflows_vm_provisioning_pipeline_connections", "label": "connections", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L914"}, {"id": "workflows_vm_provisioning_pipeline_connections_n8n_webhook", "label": "n8n: Webhook", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L915"}, {"id": "workflows_vm_provisioning_pipeline_n8n_webhook_main", "label": "main", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L916"}, {"id": "workflows_vm_provisioning_pipeline_connections_n8n_validate_webhook_data", "label": "n8n: Validate Webhook Data", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L926"}, {"id": "workflows_vm_provisioning_pipeline_n8n_validate_webhook_data_main", "label": "main", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L927"}, {"id": "workflows_vm_provisioning_pipeline_connections_terraform_apply_vm_city_hall", "label": "Terraform: Apply VM (city-hall)", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L944"}, {"id": "workflows_vm_provisioning_pipeline_terraform_apply_vm_city_hall_main", "label": "main", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L945"}, {"id": "workflows_vm_provisioning_pipeline_connections_n8n_extract_terraform_variables", "label": "n8n: Extract Terraform Variables", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L955"}, {"id": "workflows_vm_provisioning_pipeline_n8n_extract_terraform_variables_main", "label": "main", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L956"}, {"id": "workflows_vm_provisioning_pipeline_connections_netbox_get_vm_interface", "label": "Netbox: Get VM Interface", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L966"}, {"id": "workflows_vm_provisioning_pipeline_netbox_get_vm_interface_main", "label": "main", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L967"}, {"id": "workflows_vm_provisioning_pipeline_connections_proxmox_get_vm_configuration", "label": "Proxmox: Get VM Configuration", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L977"}, {"id": "workflows_vm_provisioning_pipeline_proxmox_get_vm_configuration_main", "label": "main", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L978"}, {"id": "workflows_vm_provisioning_pipeline_connections_n8n_extract_proxmox_values", "label": "n8n: Extract Proxmox Values", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L988"}, {"id": "workflows_vm_provisioning_pipeline_n8n_extract_proxmox_values_main", "label": "main", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L989"}, {"id": "workflows_vm_provisioning_pipeline_connections_n8n_extract_network_adapter_id", "label": "n8n: Extract Network Adapter ID", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L999"}, {"id": "workflows_vm_provisioning_pipeline_n8n_extract_network_adapter_id_main", "label": "main", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L1000"}, {"id": "workflows_vm_provisioning_pipeline_connections_netbox_check_mac_address", "label": "Netbox: Check MAC Address", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L1010"}, {"id": "workflows_vm_provisioning_pipeline_netbox_check_mac_address_main", "label": "main", "file_type": "code", "source_file": "n8n/workflows/VM Provisioning Pipeline.json", "source_location": "L1011"}, {"id": "workflows_vm_provisioning_pipeline_connections_n8n_mac_already_exists", "label":Line truncated