# thermostaat.py - de verwarming van de klimaatmodule met hysterese
C_L, C_W = 80e3, 1.10e6     # J/K: de lucht (met wat snel meewarmt) en de buffer (vat + reservoir)
H, G = 20.2, 30.0           # W/K: lucht -> buiten, lucht <-> buffer
P = 800.0                   # W: verwarming aan
DT = 2.0                    # s: om de 2 s meten en beslissen
TAU_S = 60.0                # s: tijdconstante van de sensor in de sensorkast


def nacht(laag, hoog, uren=8.0, buiten=0.0):
    lucht = buffer = meting = 16.5
    aan = False
    keer_aan, tijd_aan = 0, 0.0
    t_min, t_max = 99.0, -99.0
    for stap in range(int(uren * 3600 / DT)):
        if not aan and meting < laag:          # de regelaar: twee grenzen
            aan = True
            keer_aan += 1
        elif aan and meting > hoog:
            aan = False
        warmte = (P if aan else 0.0) - H * (lucht - buiten) - G * (lucht - buffer)   # W
        lucht_nieuw = lucht + warmte * DT / C_L
        buffer += G * (lucht - buffer) * DT / C_W
        meting += (lucht - meting) * DT / TAU_S
        lucht = lucht_nieuw
        if aan:
            tijd_aan += DT
        t_min, t_max = min(t_min, lucht), max(t_max, lucht)
    return keer_aan / uren, 100 * tijd_aan / (uren * 3600), t_min, t_max


for breedte in (0.2, 0.5, 1.0, 2.0):
    per_uur, pct, lo, hi = nacht(16.5 - breedte / 2, 16.5 + breedte / 2)
    print(f"hysterese {breedte:.1f} K: {per_uur:4.1f} keer aan per uur, {pct:.0f} % aan, lucht {lo:.2f} tot {hi:.2f} °C")
