Multi-Platform IPMI Fan Control via Fan Curve
So, after a lot of bouncing around on other people's tools I made my own. You can find it here: https://github.com/jp-powers/fan-control
The purpose is a singular system to provide a "service based" fan controller for IPMI interfaces on TrueNAS Core, Proxmox, and pfSense. It works against all three OS's, and against Dell Gen 8 iDRAC or Supermicro Gen 10 systems. It could work against others without any work but that's what I've tested against.
Below the read more is some further details and thoughts.
So, back on my second home server I used a modified version of a popular FreeNAS perl script to manage the fans. It worked acceptably.
When I build my first Proxmox host which also acted as a file share, I switched a Ruby script that only monitored the CPU. It worked but I was always a little worried about the drive temps.
A couple months ago I rebuilt my Proxmox host and also built a dedicated TrueNAS Core fileshare. The TrueNAS machine is a huge 4U 36 bay device, with a ton of fans that are crazy loud. I tried a few of the popular FreeNAS perl scripts but none really worked well for me. They were too ... limited. The Ruby script I had used on Proxmox had a nice user programmable fan curve instead of "target this temperature" logic.
So, I started writing my own version in Python since that's supported natively on all three platforms. I had separate versions customized to each platform and they worked well enough. Over the last couple of days I started merging them together into a single tool with a configuration system, created some install/install scripts, and ran some testing. The big change for quality of life to me is the ability to change the configuration file and the script will detect the changes and act accordingly.
As mentioned on the github README.md, I really feel like this an amateur hour script. There's a lot of "uhhhh how do I do this?" brute forcing going on. However... it works. I've got it running on all three now for a little while and I've been throwing changes at the config to make sure it's doing what's expected and it does.
So yeah. That's a thing I did. Hopefully some people find some use out of it.