HVAC PID
Disclaimer: This library was implemented with the supervised help of AI.
HVAC PID is a general-purpose Elixir PID controller for discrete control loops. It supports direct and reverse action, independent P, I, and D terms, bounded output with anti-windup, a hold deadzone, and smooth transitions between manual and automatic control. The caller supplies each sample, its elapsed time, and the actuator interface.
Installation
Add hvac_pid to your dependencies in mix.exs:
def deps do
[
{:hvac_pid, "~> 0.1.0"}
]
end
The published docs will be at https://hexdocs.pm/hvac_pid.
Quick start
{:ok, pid} = HvacPid.Controller.new(out_min: 0, out_max: 100, kp: 8, tn: 20)
{:ok, pid} = HvacPid.Controller.set_mode(pid, :automatic)
{:ok, command, pid} = HvacPid.Controller.step(pid, 21.0, 19.0, 0.25)
Here the measurement is 2 units below the setpoint, so the default
:direct action gives a first command of 16. Use direction: :reverse
when increasing the command lowers the measured value. Pass the returned
pid to the next call. The HvacPid.Controller module docs explain the
control law and how to handle retuning, pauses, and actuator overrides.
Development
Run mix test --cover for the unit tests, simulated heating and cooling
loops, and the 95% coverage gate. Use mix deps.get and mix docs to build
the module documentation locally.
Licensed under Apache-2.0.