Do you use docker for anything else self hosted? You should give it a try. I literally had not heard of grocy till I read your post but I self host other things with docker. I googled them, visited their github looked at their docker instructions - theirs downloading a docker compose file and lsio’s which gave a run option rather than compose.
I pulled up an ssh to my server from my phone and literally entered the run command from here just modified to have my preferred storage path.
docker run -d \
--name=grocy \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-p 9283:80 \
-v ~/.config/grocy:/config \
--restart unless-stopped \
lscr.io/linuxserver/grocy:latest```
I then opened my browser to http://ip:9283 and was prompted with a username and password. I googled and found out the default is admin/admin. I now have grocy temporarily running on my server. If I want to run it permanently I'd include it in my existing docker-compose stack or create a new one with just it in it.
I understand it's frustrating and you may not want to use grocy after all and someone might have a good alternative, but getting to terms with docker will make your self hosting life much easier - it took me longer to type this post than it took me to get grocy up and running with docker.
I have a similar setup with 3 different heating elements, each with it’s own different brand controller (who knows what the previous owner was thinking!).
I swapped one out a few years ago for a Heltun which seemed to meet my requirements and is designed for exactly that. It is the older discontinued model running on 500 series z-wave, their newer ones run on 700 series.
I had initially planned to replace all 3 with the same model assuming it was good - I haven’t (as yet) - it was a pretty new product and it was a bit buggy which made me hesitant. I have wood flooring on top of the concrete slab/ electric blanket in two areas and it’s advised to not heat the wood up too high as it causes shrinkage, unlike under ceramic tile, and sometimes it would not respect the max floor temperature setting. I went back and forth with their support about it and they were very helpful, giving me beta firmware to flash etc and I worked around it.
For the last couple of years it’s been mostly stable and behaving. For whatever reason, it no longer lets me directly set the target temperature in Home Assistant which it previously did - I may need to dig into that as it would be handy sometimes, but I think it meets all of your other requirements, like on device manual control, no cloud, air temp sensor and floor sensor connection etc.
There aren’t that many products out there that fit the bill, I was particularly struggling with ones that would let me set the max floor temp sensor low enough when I was comparing the spec sheets a few years back.