Skip to content

🖥️ A custom server rack screen

Abstract

I created a monitoring screen to place in my server rack. The screen is used to display different server statistics such as cpu, ram, disk, etc. usage for my servers (Proxmox, Unraid,..). To accomplish this, I got a Raspberry Pi with a screen. My server statistics are gathered via different Home Assistant integrations. Alternatively, you could use something like Grafana.

custom_rack_screen

Prerequisites

  • Hardware:
    • Raspberry Pi - I used a Raspberry Pi 3B+
    • Raspberry Pi screen - I got a basic 5" screen hat
  • Home Assistant with your server integrations:
    • Proxmox: https://github.com/dougiteixeira/proxmoxve
    • Unraid: https://github.com/domalab/ha-unraid

Step 1: Raspberry Pi install

Assemble your Raspberry Pi with a screen.
Setup you Raspberry Pi with Raspberry Pi OS Desktop.

custom_rack_screen


Step 2: Install Chromium browser

sudo apt update && sudo apt upgrade -y
sudo apt install -y chromium-browser
nano ~/kiosk.sh

Paste the following: (replace the URL to your own dashboard)

#!/bin/bash
# Delay to make sure everything is loaded
sleep 10
# Open Home Assistant dashboard in kiosk mode
chromium-browser --noerrdialogs --kiosk http://192.168.10.105:8123/dashboard-server/0

Make it executable:

chmod +x ~/kiosk.sh


Step 3: Auto start script

Create the directory

mkdir ~/.config/autostart

Create a .desktop file to auto-run the script:

nano ~/.config/autostart/kiosk.desktop

Paste: (my user is named 'admin', yours could be different)

[Desktop Entry]
Type=Application
Name=Home Assistant Kiosk
Exec=/home/admin/kiosk.sh
X-GNOME-Autostart-enabled=true

Step 4: Hide Mouse Cursor (Optional)

Install unclutter to hide the mouse after a few seconds:

sudo apt install unclutter

Step 5: Home Assistant Dashboard

Created a dedicated Home Assistant Dashboard custom_rack_screen

Below the raw yaml code for the dashboard:

Click to show
kiosk_mode:
  non_admin_settings:
    kiosk: true
    ignore_entity_settings: true
views:
  - title: Home
    sections:
      - type: grid
        cards:
          - type: horizontal-stack
            cards:
              - type: picture
                image: >-
                  data:image/png;base64,
              - type: gauge
                name: CPU
                severity:
                  green: 0
                  yellow: 50
                  red: 80
                entity: sensor.node_lumbridge_cpu_used
              - type: gauge
                name: RAM
                severity:
                  green: 0
                  yellow: 50
                  red: 80
                entity: sensor.node_lumbridge_memory_used_percentage
              - show_name: false
                show_icon: true
                type: button
                entity: binary_sensor.node_lumbridge_status
                show_state: true
          - type: horizontal-stack
            cards:
              - type: gauge
                name: Storage
                needle: false
                severity:
                  green: 0
                  yellow: 50
                  red: 80
                entity: sensor.storage_lumbridge_local_zfs_disk_used_percentage
              - graph: line
                type: sensor
                detail: 2
                entity: sensor.node_lumbridge_memory_used
                name: Mem
              - graph: line
                type: sensor
                entity: >-
                  sensor.disk_lumbridge_kingston_snv3s1000g_dev_nvme1n1_temperature
                detail: 2
                name: Disk
          - type: horizontal-stack
            cards:
              - type: gauge
                entity: sensor.storage_lumbridge_ardougne_pbs_disk_used_percentage
                severity:
                  green: 0
                  yellow: 50
                  red: 80
                name: Backup local
              - type: gauge
                name: Backup remote
                needle: false
                severity:
                  green: 0
                  yellow: 50
                  red: 80
                entity: >-
                  sensor.storage_lumbridge_ardougne_pbs_remote_disk_used_percentage
          - show_name: true
            show_icon: true
            type: button
            entity: >-
              binary_sensor.disk_lumbridge_kingston_snv3s1000g_dev_nvme0n1_health
            show_state: false
            name: Disk 1
          - show_name: true
            show_icon: true
            type: button
            show_state: false
            name: Disk 2
            entity: >-
              binary_sensor.disk_lumbridge_kingston_snv3s1000g_dev_nvme1n1_health
      - type: grid
        cards:
          - type: horizontal-stack
            cards:
              - type: picture
                image: >-
                  https://static-00.iconduck.com/assets.00/unraid-icon-2048x2048-sntilyzr.png
              - type: gauge
                name: CPU
                severity:
                  green: 0
                  yellow: 50
                  red: 80
                entity: sensor.unraid_server_tower_tower_cpu_usage
              - type: gauge
                name: RAM
                severity:
                  green: 0
                  yellow: 50
                  red: 80
                entity: sensor.unraid_server_tower_tower_ram_usage
              - show_name: false
                show_icon: true
                type: button
                entity: sensor.unraid_server_tower_tower_uptime_status
                show_state: true
          - type: horizontal-stack
            cards:
              - type: gauge
                name: Storage
                severity:
                  green: 0
                  yellow: 50
                  red: 80
                entity: sensor.unraid_server_tower_tower_array_usage
              - graph: line
                type: sensor
                entity: sensor.unraid_server_tower_tower_cpu_temperature
                detail: 2
                name: CPU
              - graph: line
                type: sensor
                entity: sensor.unraid_server_tower_tower_nct67_fan_1
                detail: 1
                name: FAN
          - type: horizontal-stack
            cards:
              - graph: line
                type: sensor
                entity: sensor.unraid_server_tower_tower_eth0_inbound
                detail: 2
                name: Eth0 Inbound
              - graph: line
                type: sensor
                entity: sensor.unraid_server_tower_tower_eth0_outbound
                detail: 2
                name: Eth0 Outbound
          - type: horizontal-stack
            cards:
              - show_name: true
                show_icon: true
                type: button
                entity: binary_sensor.unraid_server_tower_tower_parity_health
                show_state: false
                name: Parity
              - show_name: true
                show_icon: true
                type: button
                show_state: false
                name: Disk 1
                entity: binary_sensor.unraid_server_tower_tower_array_disk1_health
              - show_name: true
                show_icon: true
                type: button
                show_state: false
                name: Disk 2
                entity: binary_sensor.unraid_server_tower_tower_array_disk2_health
              - show_name: true
                show_icon: true
                type: button
                show_state: false
                name: Disk 3
                entity: binary_sensor.unraid_server_tower_tower_array_disk3_health
              - show_name: true
                show_icon: true
                type: button
                show_state: false
                name: Disk 4
                entity: binary_sensor.unraid_server_tower_tower_array_disk4_health
            grid_options:
              columns: 12
              rows: 2

Step 6: Test

Reboot and Test

sudo reboot

Step 7: 3d design

I custom designed a 3d model in Tinkercad: custom_rack_screen

A simple box was designed to house 2 led strips: custom_rack_screen
custom_rack_screen
custom_rack_screen
custom_rack_screen


Step 8: Final product

custom_rack_screen
custom_rack_screen
custom_rack_screen