The problem and the idea
Using a high-performance gaming machine brings lots of joy (in gaming) and other benefits (in development), but also the fundamental problem of high power consumption, even when there is no load on the machine.
To get an idea, here are some numbers: approximately 185 watts of power consumption for the whole desk setup (this means the PC, monitor, attached peripherals, lights, etc.), while only a browser and a media stream (Jellyfin) are active. Nothing special, the machine is bored by this. But still, 185 watts. This adds up fast.
So I had the idea to replace this power-hungry beast with something more modest. Luckily, I have a Steam Deck lying around, which I only use occasionally. This thing runs a fully fledged Linux desktop OS, has lots of processing power and should be more than enough for almost all daily work. But it gets into a little trouble when it comes to bringing demanding games onto my 3440×1440 monitor, especially at a proper frame rate of around 100 fps. So there it is, the main question:
How do I set up my Steam Deck and my gaming machine, and integrate both into the homelab in a way that I can use the capabilities when needed and save power when not?
The main problem and motivation: 185 watts power consumption at near idle (browser and a media stream). With 3-5 active hours a day and 0.35€/kWh, this is around 95€/year. Just for browsing and watching.
The solution
The solution, put simply, is to move the gaming machine to the homelab rack, configure it to be reachable from the internal network and stream its desktop. That way I can use any device (the Steam Deck, low power) for daily work and only start the gaming machine when needed.
This raises the following questions:
- How do I make the PC reachable at all?
- How do I manage its uptime (booting, shutting down)?
- Is the Steam Deck capable of handling my daily tasks to full satisfaction?
- Does this actually reduce the power consumption noticeably? And if yes, by how much?
Streaming the desktop
After some research, I quickly settled on Sunshine and Moonlight . The first runs on the gaming machine as a streaming server, the second on the clients in question (currently only the Steam Deck). Sunshine takes care of providing desktops and apps (you might want to stream only a specific app or game, not the whole desktop), manages encoding and transport, and handles authentication and device pairing. Moonlight serves as the client, providing a UI to start those apps and desktops.
Because the gaming machine will not hold any essential data or demanding programs, as its main purpose is running games, I decided to install Bazzite on it. It brings a lot of the functionality we need. Sunshine can be installed and configured via the preinstalled stores and config managers.
After a little bit of fiddling around, the streaming worked pretty well, even at 3440×1440 with a 100 Hz refresh rate. I do not want to go into detail, but here is what was done:
- Create a virtual dummy monitor with an EDID, to always have a desktop available.
- Disable the KWin permission checks, which is fine in this case, as nothing besides games is running.
So, on to the next step.
Managing the machine’s uptime
I’ll make it short. Wake-on-LAN is your friend. Activate it in the BIOS, enable it in Linux, done. Not much to fiddle around with, not much to tell. It is a well-known and long-established technology. Moonlight even has a built-in function to wake up the paired machine, without the need for another program or the router UI.
With Wake-on-LAN working as intended, I simply set the machine to “shut down after 15 minutes of inactivity”. The machine boots fast enough that I don’t feel the need to use suspend.
The only problem that arises: downloading a big game that takes more than 15 minutes. Either deactivate the shutdown or set the timeout higher. And don’t forget to activate it again (this is actually the hard part).
Steam Deck for daily work
The main problem is the read-only file system, which does not allow installing packages via pacman. Two solutions arise:
Number 1: Disable read-only mode in the terminal with sudo steamos-readonly disable, which I refuse to do, as I like the idea of a read-only file system.
Number 2: Use what the OS already provides. SteamOS comes with podman and distrobox preinstalled. This opens up near infinite possibilities for creating and managing portable environments for different needs. A box for the dev environment, one for managing backups (because we can’t install borg via pacman). You name it, you build it.
Number 2 was the (for me) obvious way to go. I will not go into detail here. That will be a post of its own, explaining the benefits of building and maintaining OS configs and environments with distrobox and chezmoi.
Does this actually save us money?
Quick answer: yes. Long answer: yes, and even more then I hoped for.
The desk setup now pulls between 60 and 65 watts for the same tasks as the old setup. With the estimated 3-5 hours of use a day, this results in 0.48 kWh less consumed per day. Over the year, this adds up to a 61€ lower electricity bill. Pretty nice.
The actual saving depends on how often I run the gaming machine. But a short look showed that the power consumption of the gaming machine went down as well. Even when the desk and the gaming machine are both running, the total power consumption is below the old one. I am unsure why, but I assume it is because no monitor is attached anymore. The gaming PC now only drives a virtual one, which can be handled by the onboard graphics, so the dedicated GPU can idle more efficiently.
Conclusion
The fundamental problem was solved, the initial idea worked out even better than expected, the power saving is higher than anticipated and the whole setup was much easier than I figured at the beginning.
Still, I am not sure if I would recommend this without reservation. If you do not have a low-power mini PC (the Steam Deck is basically one: 15 W TDP, small form factor) lying around and would need to buy one first, the savings might be too low compared to the investment.