Had a different idea for a means to control a fan recently: Klipper.
Klipper is an open-source 3D printer software much like Marlin, except that it runs on a Raspberry Pi and interfaces with a control board (instead of just running on the control board itself) and also optionally networks directly to a PC via WiFi or Ethernet for user input/control/monitoring (through Moonraker). It is designed to be adaptable to just about any 3D printer, from the basic bedslinger to the oddball "winch cable" printer.
Klipper also has a "none kinematics" option that allows for the software to control things that aren't 3D printers. It has built-in support for a number of different heater, heater fan, cooling fan, thermistor/thermocouple, etc. read and control schemes, some of which would perfectly apply in our scenario.
You would need a control board (like a BTT Octopus Max EZ), a Raspberry Pi 4B (1 Gb min, more if you want a screen/camera), and the associated fan/coolant sensor hardware. When setting up Klipper, you would simply define the printer type (aka the jeep) as "none kinematics" to tell it it isn't running a printer, define a thermistor (the coolant temperature sensor, may need to change type or otherwise convert the resistance scale to a supported thermistor), define a cooling fan (perhaps as temperature_fan), wire the PWM signal to a fan port (need to confirm that the Octopus switches low, not high), and then fill out the control scheme. Most Klipper temperature control schemes are PID, and these are tunable at the click of a button, meaning you wouldn't need to estimate the ki, kp, and kd; you could just simply let the controller decide for itself what the best parameters are by letting it test itself.
The RPi and controller could then be used to run dozens of other functions at the same time if you wanted to add them in the future. For example, you could eliminate the thermostat and replace it with a servo or stepper-driven flow control valve so you can precisely control the coolant temperature via Klipper. Or you could add a thermistor in the cabin and then allow PID control of the cabin heater and air conditioner so you could set a cabin temperature rather than just a blend door position just like in a modern high-end car. Or even control an EHPS pump. And you could add a screen so you can monitor and control without connecting to a PC.
https://www.klipper3d.org/Config_Reference.html
RatOS is probably the easiest way to get a Klipper config started, but it can be done manually as well.
https://os.ratrig.com/docs/introduction/