That's sarcasm, right? I automated my HVAC in the '90s and even then there were a ton of roadmaps to follow by people who had done it before. It was an afternoon project using something similar to these: https://www.sparkfun.com/products/245
Their thermostats had a defect at one point (not sure if it was ever actually fixed) where if your heating or cooling system caused a surge in your wiring, your nest would get stuck with both heating and cooling at full blast, or something equally silly. The Nest thermostat was certainly not designed to fail safely or sanely.
EDIT: to those who mention the hobbyist scene, consider that such projects are not necessarily trivial, and that getting it wrong remains potentially catastrophic. I believe the parent's point still stands.
activate_ac()
deactivate_heat()
elif temperature < min(desired_range): deactivate_ac()
activate_heat()
else: deactivate_heat()
deactivate_ac()You need to take hysteresis into account, temperature overshoot/undershoot, your compressor's duty cycle and startup latency (especially as it impacts MTBF), emergency/backup furnace control, failsafes to make sure the house doesn't freeze or overheat if/when any of the above goes wrong... lots of stuff like that.
The spec for an HVAC control system isn't overwhelming but it does warrant some thought.
For finer control of room temps, people often use mechanical radiator thermostats. They work just fine too.
New electronic models are usually just a thermistor with some analogue hysteresis. They work fine as well.
I might expect something with the extras you're describing to appear in a new office building, but in the UK at least adding PID and/or some kind of learning system to a domestic thermostat is overkill.
Generally, simple solutions are less likely to go badly wrong.
That's the tragic irony of Nest. The design is great, but the added value offered by a buggy and overcomplex implementation is negative.
As far as short-cycling the compressor goes, my current HVAC is smart enough to disallow that, but I've lived in older houses where that wasn't the case. You could potentially damage the compressor by wiggling the thermostat back and forth, forcing it to start up against back pressure.
Understanding the requirements is really job #1, and first on the list of reasons why HVAC control isn't just a simple "if too cold then turn on heat else turn on A/C" statement. That doesn't mean people shouldn't jump in and try it, of course. It's the best way to learn, if not always the cheapest.
Because there's a giant surge current when you start up a motor (like that in an A/C compressor), and it's just plain bad and even annoying to have your A/C cycle between on and off rapidly, a thermostat will intentionally overshoot the set point when cooling, and then undershoot that same set point when waiting for the house to heat up before it turns the A/C back on (or vice versa for heating).
Hysteresis is absolutely necessary to avoid both this problem, and also the problem where your temperature sensor isn't perfectly accurate and the readings from it will vary a bit from reading to reading.
You are absolutely right that you need to account for hysteresis.
Debounce is also necessary for sensors that have precision problems, where, in boundary conditions, they bounce back and forth between a measurement that would cause an "on" signal and a measurement that would cause an "off" signal. But, I think we're agreeing with each other :)
For the sensors, it seems to me that a debounce routine wouldn't work, and (this is assuming the sensor is giving an analog reading, not an on-off binary reading) what you really want there is some kind of averaging routine. Usually, the way a debounce routine works is that you look for a state transition (off->on), and then wait 30ms (general rule of thumb for human-actuated switch) and look again to make sure that the state is still "on" and then you do your operation based on that. But for analog sensors, you probably want something that's more like a running average so the readings don't vary too much, and one erroneous or too-extreme reading doesn't affect things much.
I could be wrong though; this is probably highly application-dependent.
Also, you should note that most of them also don't show the exact temperature in the room... it's an algorithm. Your furnace might heat to 68 on the display but the actual temp may be between 67 and 69, but if your display temp constantly bounced it would result in mass consumer disappointment.
Also, overshooting you ideal temp is fairly easy to do as there can be a lot of hot air in the vents even after you turn down the heat. So a little predictive modeling can be useful.
if (temp > max + error)
if (off (ac))
turn_on (ac);
if (temp < max - error)
if (on (ac))
turn_off (ac);
if (temp < min - error)
if (off (heat))
turn_on (heat);
if (temp > min + error)
if (on (heat))
turn_off (heat);The take-away is that like programming lift controllers[0] it's not quite as simple as it might first seem - many many edge cases.
[0] http://play.elevatorsaga.com/ (for example)
But yes agreed, in general there are lots of edge cases. I actually wrote a finite state machine specification for an elevator in a logic class once. Without having really thought about it much, it looks like the biggest problems with thermostats are dealing with scalars, sampling frequencies, and sampling error.
Here's an Arduino sketch showing a simple way of doing it. https://www.arduino.cc/en/Tutorial/Debounce
[1] http://www.labbookpages.co.uk/electronics/files/debounce/bou...
You want a PID controller in there (in some cases you might get away with just PI, but that needs analysis of the specific case)
Ideally of course you'd want to model the exact energy loss curve of the specific building you're in but nobody really does that.
The best part is of course that a PID controller sounds complicated, but the simplest one is actually just around 15 lines of code.