Jump to content

Welcome to Smart Home Forum by FIBARO

Dear Guest,

 

as you can notice parts of Smart Home Forum by FIBARO is not available for you. You have to register in order to view all content and post in our community. Don't worry! Registration is a simple free process that requires minimal information for you to sign up. Become a part of of Smart Home Forum by FIBARO by creating an account.

 

As a member you can:

  •     Start new topics and reply to others
  •     Follow topics and users to get email updates
  •     Get your own profile page and make new friends
  •     Send personal messages
  •     ... and learn a lot about our system!

 

Regards,

Smart Home Forum by FIBARO Team


Critical heating logic issue – boiler does not start according to schedule


Recommended Posts

Posted

After updating to version 5.200.8, a serious issue with the heating logic based on schedules and Fibaro thermostatic heads is still present.

Problem description (key issue):

  • A Climate Zone schedule is set to a target temperature, e.g. 21.5°C

  • The thermostatic head:

    • has a local setpoint of e.g. 20.0°C

    • does not automatically synchronize with the schedule

  • In this situation:

    • the boiler does NOT start, even though the schedule requires 21.5°C

    • the boiler starts only when the actual temperature drops below the local head setpoint (20.0°C)

Manual synchronization (important):

  • To temporarily restore correct behavior, it is necessary to manually force synchronization from the web interface (HC3), for example by:

    • manually changing the temperature on the thermostatic head

    • switching back to automatic / schedule mode

  • This synchronization:

    • works only temporarily

    • after a few minutes, or after the next wake-up of the device

    • the thermostatic head becomes desynchronized again from the schedule

Impact:

  • The Climate Zone schedule does not actually control heating

  • The system decides whether to start the boiler based on the local setpoint of the thermostatic head, not the scheduled temperature

  • This leads to situations where:

    • heating does not start despite scheduled demand

    • thermal comfort is not maintained

    • the user interface suggests the schedule is active, while in reality it is not

Additional observations:

  • The issue frequently occurs:

    • after charging the thermostatic head

    • after communication loss / wake-up

    • after manual temperature changes followed by a return to automatic mode

  • This is not a UI issue — the decision logic of the system is inconsistent

  • The only workaround is:

    • repeated manual synchronization

    • or the use of additional LUA scenes (which should not be required when using schedules)

Conclusions:

  • The Climate Zone schedule does not enforce a persistent update of the head setpoint

  • Manually forced synchronization is not preserved over time

  • Boiler start logic is based on the local thermostatic head setpoint, not the scheduled temperature

  • This is a functional defect, not a configuration issue

Please advise:

  • whether this issue is known to the development team

  • whether a fix is planned where:

    • the Climate Zone schedule is authoritative over thermostatic head setpoints

    • and synchronization is persistent, not temporary

This is a core heating function, and the current behavior causes real-world usability and comfort issues.

  • 2 weeks later...
Posted

I am note sure if I have been having this exact issue where my climate was not sync to my heating controllers so i made a scene which runs every 5 min from 1 min past the hour as the climate has every 5 min slots and does this it is not the most elegant solution as this was written about 5 years ago when my coding skills were slightly more starter level then now, however it does the job and one day will look to maybe tighten it up a little, but i think this is what you are saying is a similar problem you have been having so if it is would be interested in a better solution  


--Only run this scene when set to HOME profile
local currentProfile = api.get("/profiles").activeProfile
if currentProfile ~= 1 then
    return
end
--If the trigger for this scene is a profile change then we want to wait 30 seconds to give the system a chance to change
if sourceTrigger.property == "activeProfile" then
    --put in 10 second delay
    fibaro.sleep(10000)
end
--Functions
local fmt = string.format
function str2sec(str) local h,m,s=str:match("^(%d%d):(%d%d):?(%d*)") return 3600*h+60*m+(s~="" and s or 0) end
function sec2str(sec) return fmt("%02d:%02d%s",math.floor(sec/3600),math.floor((sec % 3600)/60),sec % 60 > 0 and fmt(":%02d",sec%60) or "") end
--Setup locals
local currentDate = os.date("*t")
local currentTime = os.date("%H:%M")
local jT = json.decode(fibaro.getGlobalVariable("jHomeTable"))
local emailNotification = jT.User.****
local DownstairsClimateZone = jT.Climate.Downstairs
local UpstairsClimateZone = jT.Climate.Upstairs
local DownstairsHeating = jT.Hallway.Heating
local UpstairsHeating = jT.UpHallway.Heating
local DownstairsHeatingOverRideTimerVariable = tonumber(fibaro.getGlobalVariable("heatingOverrideDownstairs"))
local DownstairsHeatingOverRideStateVariable = fibaro.getGlobalVariable("heatingOverrideStateDownstairs")
local DownstairsHeatingSetpointEndTime = fibaro.getGlobalVariable("heatingDownstairsCurrentSetPointEndTime")
local UpstarirsHeatingOverRideTimerVariable = tonumber(fibaro.getGlobalVariable("heatingOverrideUpstairs"))
local UpstarirsHeatingOverRideStateVariable = fibaro.getGlobalVariable("heatingOverrideStateUpstairs")
local UpstairsHeatingSetpointEndTime = fibaro.getGlobalVariable("heatingUpstairsCurrentSetPointEndTime")
--Fetch the climate panel setting
local dPanel =api.get("/panels/climate/"..DownstairsClimateZone)
local dPanelSetpoint = dPanel.properties.currentTemperatureHeating
local dPanelMode = dPanel.active
local dPanelNextSwitchOver = string.format("%02d",dPanel.properties.currentSetpointTimeEndHour)..":"..string.format("%02d",dPanel.properties.currentSetpointTimeEndMinute)
local uPanel =api.get("/panels/climate/"..UpstairsClimateZone)
local uPanelSetpoint = uPanel.properties.currentTemperatureHeating
local uPanelMode = uPanel.active
local uPanelNextSwitchOver = string.format("%02d",uPanel.properties.currentSetpointTimeEndHour)..":"..string.format("%02d",uPanel.properties.currentSetpointTimeEndMinute)
--Fetch Thermostat set points
local DownstairsHeatingMode = fibaro.getValue(DownstairsHeating, "thermostatMode")
local DownstairsHeatingSetpoint = fibaro.getValue(DownstairsHeating, "heatingThermostatSetpoint")
local UpstairsHeatingMode = fibaro.getValue(UpstairsHeating, "thermostatMode")
local UpstairsHeatingSetpoint = fibaro.getValue(UpstairsHeating, "heatingThermostatSetpoint")

--test
--print(uPanel,uPanelSetpoint,uPanelMode,uPanelNextSwitchOver,UpstairsHeatingMode,UpstairsHeatingSetpoint)
--end of tests

--Always check that it is on heat mode
if DownstairsHeatingMode ~= "Heat" then
    fibaro.call(DownstairsHeating, "setThermostatMode","Heat")
    --fibaro.alert("email", {emailNotification}, "Downstairs Thermostat has been set to HEAT mode.")
end
if UpstairsHeatingMode ~= "Heat" then
    fibaro.call(UpstairsHeating, "setThermostatMode","Heat")
    --fibaro.alert("email", {emailNotification}, "Upstairs Thermostat has been set to HEAT mode.")
end
--Run when setting active profile to HOME
if sourceTrigger.property == "activeProfile" then
    print("Current Profile has triggered this scene")
    --we are on current profile is home so we want to make sure the heating is set correctly and reset any overrides.
    --we want to sleep for 30 seconds to give the heating controls to sync.
    if dPanelSetpoint ~= DownstairsHeatingSetpoint then
        print("Adjust thermostat DS")
        fibaro.call(DownstairsHeating, "setHeatingThermostatSetpoint",dPanelSetpoint)
    end
    if uPanelSetpoint ~= UpstairsHeatingSetpoint then
        print("Adjust thermostat US")
        fibaro.call(UpstairsHeating, "setHeatingThermostatSetpoint",uPanelSetpoint)
    end
    if DownstairsHeatingOverRideStateVariable == "true" then
        print("adjust downstairs variables")
        fibaro.setGlobalVariable("heatingOverrideStateDownstairs", "false")
        fibaro.setGlobalVariable("heatingOverrideDownstairs", tostring(0))
    end
    if UpstarirsHeatingOverRideTimerVariable == "true" then
        print("adjust upstairs variables")
        fibaro.setGlobalVariable("heatingOverrideStateUpstairs", "false")
        fibaro.setGlobalVariable("heatingOverrideUpstairs", tostring(0))
    end
    --we want to quit this scene after running this
    return
end

--check downstairs zone
if dPanelMode == true then
    if dPanelSetpoint > DownstairsHeatingSetpoint then
        if currentTime == DownstairsHeatingSetpointEndTime then
            fibaro.call(DownstairsHeating, "setHeatingThermostatSetpoint",dPanelSetpoint)
            fibaro.alert("email", {emailNotification}, "Downstairs Thermostat has been adjusted, from "..DownstairsHeatingSetpoint.." and is now set to "..dPanelSetpoint.."This alert gets triggered if the current time is 1 minute after the climate change time for this zone and the heating has not adjusted itself to the climate zone setting.")
        end
    elseif dPanelSetpoint < DownstairsHeatingSetpoint then
        if currentTime == DownstairsHeatingSetpointEndTime then
            fibaro.call(DownstairsHeating, "setHeatingThermostatSetpoint",dPanelSetpoint)
            fibaro.setGlobalVariable("heatingOverrideStateDownstairs", "false")
            fibaro.setGlobalVariable("heatingOverrideDownstairs", tostring(0))
            fibaro.alert("email", {emailNotification}, "Downstairs Thermostat has been adjusted, from "..DownstairsHeatingSetpoint.." and is now set to "..dPanelSetpoint)
        else
            if DownstairsHeatingOverRideStateVariable == "false" then
                fibaro.setGlobalVariable("heatingOverrideStateDownstairs", "true")
                fibaro.setGlobalVariable("heatingOverrideDownstairs", "12")
                --fibaro.alert("email", {emailNotification}, "Downstairs Thermostat has been set to Override Mode, and Counter Timer is set to 12")
            else
                if DownstairsHeatingOverRideTimerVariable > 0 then
                    print(DownstairsHeatingOverRideTimerVariable,"DownstairsHeatingOverRideTimerVariable value line 104")
                    fibaro.setGlobalVariable("heatingOverrideDownstairs", tostring(DownstairsHeatingOverRideTimerVariable-1))
                    --fibaro.alert("email", {emailNotification}, "Downstairs Thermostat has been set to Override Mode, and Counter Timer is set to "..tostring(DownstairsHeatingOverRideTimerVariable-1))
                else
                    fibaro.setGlobalVariable("heatingOverrideStateDownstairs", "false")
                    fibaro.call(DownstairsHeating, "setHeatingThermostatSetpoint",dPanelSetpoint)
                    fibaro.alert("email", {emailNotification}, "Downstairs Thermostat has been adjusted, from "..DownstairsHeatingSetpoint.." and is now set to "..dPanelSetpoint)
                end
            end
        end    
    elseif dPanelSetpoint == DownstairsHeatingSetpoint then
        if DownstairsHeatingOverRideStateVariable == "true" then
            fibaro.setGlobalVariable("heatingOverrideStateDownstairs", "false")
            fibaro.setGlobalVariable("heatingOverrideDownstairs", tostring(0))
        end
    end
end

--test code
--print(uPanelMode,uPanelSetpoint,UpstairsHeatingSetpoint,currentTime,UpstairsHeatingSetpointEndTime)
--end test

--check upstairs zone
if uPanelMode == true then
    if uPanelSetpoint > UpstairsHeatingSetpoint then
        if currentTime == UpstairsHeatingSetpointEndTime then
            fibaro.call(UpstairsHeating, "setHeatingThermostatSetpoint",uPanelSetpoint)
            fibaro.alert("email", {emailNotification}, "Upstairs Thermostat has been adjusted, from "..UpstairsHeatingSetpoint.." and is now set to "..uPanelSetpoint.."This alert gets triggered if the current time is 1 minute after the climate change time for this zone and the heating has not adjusted itself to the climate zone setting.")
        end
    elseif uPanelSetpoint < UpstairsHeatingSetpoint then
        if currentTime == UpstairsHeatingSetpointEndTime then
            fibaro.call(UpstairsHeating, "setHeatingThermostatSetpoint",uPanelSetpoint)
            fibaro.setGlobalVariable("heatingOverrideStateUpstairs", "false")
            fibaro.setGlobalVariable("heatingOverrideUpstairs", tostring(0))
            fibaro.alert("email", {emailNotification}, "Upstairs Thermostat has been adjusted, from "..UpstairsHeatingSetpoint.." and is now set to "..uPanelSetpoint)
        else
            if UpstarirsHeatingOverRideStateVariable == "false" then
                fibaro.setGlobalVariable("heatingOverrideStateUpstairs", "true")
                fibaro.setGlobalVariable("heatingOverrideUpstairs", "12")
                --fibaro.alert("email", {emailNotification}, "Upstairs Thermostat has been set to Override Mode, and Counter Timer is set to 12")
            else
                if UpstarirsHeatingOverRideTimerVariable > 0 then
                    --fibaro.debug("Scene103", UpstarirsHeatingOverRideTimerVariable)
                    print(UpstarirsHeatingOverRideTimerVariable,"UpstarirsHeatingOverRideTimerVariable value line 146")
                    fibaro.setGlobalVariable("heatingOverrideUpstairs", tostring(UpstarirsHeatingOverRideTimerVariable-1))
                    --fibaro.alert("email", {emailNotification}, "Upstairs Thermostat has been set to Override Mode, and Counter Timer is set to "..tostring(UpstarirsHeatingOverRideTimerVariable-1))
                else
                    fibaro.setGlobalVariable("heatingOverrideStateUpstairs", "false")
                    fibaro.call(UpstairsHeating, "setHeatingThermostatSetpoint",uPanelSetpoint)
                    fibaro.alert("email", {emailNotification}, "Upstairs Thermostat has been adjusted, from "..UpstairsHeatingSetpoint.." and is now set to "..uPanelSetpoint)
                end
            end
        end
    elseif uPanelSetpoint == UpstairsHeatingSetpoint then
        if UpstarirsHeatingOverRideStateVariable == "true" then
            fibaro.setGlobalVariable("heatingOverrideStateUpstairs", "false")
            fibaro.setGlobalVariable("heatingOverrideUpstairs", tostring(0))
        end
    end
end
--set Next change over time
--fibaro.debug("Scene103", sec2str(str2sec(dPanelNextSwitchOver)+(1*60)))
fibaro.setGlobalVariable("heatingDownstairsCurrentSetPointEndTime", sec2str(str2sec(dPanelNextSwitchOver)+(1*60)))
fibaro.setGlobalVariable("heatingUpstairsCurrentSetPointEndTime", sec2str(str2sec(uPanelNextSwitchOver)+(1*60)))

Posted

Hello @DJ6971,

thank you for your report. Please verify whether the device was added with a security level. If yes, please try adding the device without a security level.

We are currently investigating the issue on our side.

Best regards,  
Gonia  
Fibaro Team

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...