This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm that you accept these cookies being set.

PID-thermostat: help
#1
I have a heat pump, which can cool and heat. The switches from Jung measures only the temperature, thus the installer used the PID-function of the logic machine. But now, the heat pump (last week) has changed from heating to cooling. The temperature in the bedrooms was higher than the desired temperature, so one would expect that the valves opened so there was cooling in the bedrooms. But, the valves stayed closed. They went open, when I putted the desired temperature higher than the actual temperature in the room. So, it worked the other way around. 
The script (resident - 10s)  of the installer is:
Code:
Verwarmen = grp.getvalue('1/6/4')  -- status of the heat pump
if Verwarmen then
  Koelen = false
    -- init pid algorithm
    if not p then
      p = PID:init({
        current = '5/2/8', -- actual temperature
        setpoint = '1/4/11', -- desired temperature
        output = '1/4/4',  -- valve
        inverted = false 
      })
    end
-- p:reset()
else
  Koelen = true
    -- init pid algorithm
    if not p then
      p = PID:init({
        current = '5/2/8', -- actual temperature
        setpoint = '1/4/11', -- desired temperature
        output = '1/4/4',  -- valve
        inverted = true 
      })
    end
--  p:reset()
end

-- run algorithm
p:run()

The weird thing is that I save the script (without changing anything), the behavior is normal. Thus, the cooling start as the actual temperature is higher than the desired temperature. But, the heating side works then vice versa.

Can anyone help me wat is wrong?
Reply
#2
(18.05.2024, 16:07)Amelie Wrote: I have a heat pump, which can cool and heat. The switches from Jung measures only the temperature, thus the installer used the PID-function of the logic machine. But now, the heat pump (last week) has changed from heating to cooling. The temperature in the bedrooms was higher than the desired temperature, so one would expect that the valves opened so there was cooling in the bedrooms. But, the valves stayed closed. They went open, when I putted the desired temperature higher than the actual temperature in the room. So, it worked the other way around. 
The script (resident - 10s)  of the installer is:
Code:
Verwarmen = grp.getvalue('1/6/4')  -- status of the heat pump
if Verwarmen then
  Koelen = false
    -- init pid algorithm
    if not p then
      p = PID:init({
        current = '5/2/8', -- actual temperature
        setpoint = '1/4/11', -- desired temperature
        output = '1/4/4',  -- valve
        inverted = false 
      })
    end
-- p:reset()
else
  Koelen = true
    -- init pid algorithm
    if not p then
      p = PID:init({
        current = '5/2/8', -- actual temperature
        setpoint = '1/4/11', -- desired temperature
        output = '1/4/4',  -- valve
        inverted = true 
      })
    end
--  p:reset()
end

-- run algorithm
p:run()

The weird thing is that I save the script (without changing anything), the behavior is normal. Thus, the cooling start as the actual temperature is higher than the desired temperature. But, the heating side works then vice versa.

Can anyone help me wat is wrong?

Hi,
Have you tried this ?
https://kb.logicmachine.net/scripting/pid-thermostat/
Best regards Cristian
Reply
#3
The installer/programmer has copied the code into the section of the 'general functions' instead of in de user functions. The resident scrip seems to be the same as in the example
(expect that there is no require('user.pid'), but I think that it is not necessary since he uses general functions)

So, I don't see why it is not working as it should.
Reply
#4
You need to restart the script when heating/cooling mode changes because PID instance (p variable) is only created once the script starts.

Attach an event script to 1/6/4:
Code:
name = 'pid' -- resident script name
script.disable(name)
script.enable(name)

Resident script can be simplified:
Code:
-- init pid algorithm
if not p then
  inverted = not grp.getvalue('1/6/4')
  p = PID:init({
    current = '5/2/8', -- actual temperature
    setpoint = '1/4/11', -- desired temperature
    output = '1/4/4',  -- valve
    inverted = inverted,
  })
end

-- run algorithm
p:run()
Reply
#5
(20.05.2024, 07:20)admin Wrote: You need to restart the script when heating/cooling mode changes because PID instance (p variable) is only created once the script starts.

Attach an event script to 1/6/4:
Code:
name = 'pid' -- resident script name
script.disable(name)
script.enable(name)

Resident script can be simplified:
Code:
-- init pid algorithm
if not p then
  inverted = not grp.getvalue('1/6/4')
  p = PID:init({
    current = '5/2/8', -- actual temperature
    setpoint = '1/4/11', -- desired temperature
    output = '1/4/4',  -- valve
    inverted = inverted,
  })
end

-- run algorithm
p:run()

Thank you very  much! I was looking for a solution in that direction, but your proposal is much nicer than mine (and compacter).

Another question: the programmer/installer has made a resident script for each badroom. So, I have 4 scripts like that. Can I combine them into 1 resident script and working with a p1 for room 1, p2 for room2, p3 for room 3 and p4 for room4. Would it be less taxing for the LM?
Reply


Forum Jump: