small changes need in your rule
replace
if(WavinUtilityRoomActive.state > 0){
with
if(WavinUtilityRoomActive.state == ON){
(in my case i have a item of type number that tells hoch much the heating valve is open (0-100%) but you have a switch). this will probably fix the “OFF” issue.
you comments regarding target vs current mode are correct. just in my case i cannot set the target mode on my device, i can only set target temperature. changing of target mode has no impact, therefore i keep both them in sync for homekit
regarding predicated state, it is known feature. you need to add autoupdate=“false” to your item, e.g
`Number thermostat_target_temp "Thermostat Target Temp[%.1f C]" (gUtilityRoomThermostat) {homekit = "TargetTemperature" [minValue=5, maxValue=30, step=0.5], channel="zmartmodbus:jablotron_tp150:918a900e8b:chn0e8:ManualTemp", autoupdate="false"}
here is good explanation