I’ve used Virtual Thermostat in the past with success. Mine is set for mode Sleep and keeps the room toasty until Sunrise when I deactivate the script (because main thermostats kick in).
The only quirk is if the mode changes while the heater is on. In which case, the heater never turns off therefore missing the set temp. This is because the app is de-activated in the new mode.
I guess a “fix” would be to create a transitional node where the space heater and main HVAC could run. In theory, the HVAC should heat the room to the set temp in the virtual thermostat script, and therefore the space heater will turn off when the room reaches temp.