class MeetPoort:
    """Alleen modulelucht: geen menging van lucht en reservoir-NTC."""
    def __init__(self, c):
        self.c, self.seq, self.historie = c, -1, []

    def meet(self, m, nu, voorspelde_sensor_C):
        if not finite(nu) or not finite(voorspelde_sensor_C):
            return {"waarde": None, "status": "ONGELDIG_MODEL"}
        if m is None:
            return {"waarde": None, "status": "ONTBREEKT"}
        if not all(k in m for k in ("node", "boot", "seq", "tijd", "C", "quality")):
            return {"waarde": None, "status": "SCHEMA"}
        status = "goed"
        if m["node"] != "modulelucht" or m["boot"] != "mega-A":
            status = "BOOT"
        elif not all(finite(m[k]) for k in ("seq", "tijd", "C")):
            status = "NIET_EINDIG"
        elif not isinstance(m["seq"], int) or m["seq"] <= self.seq:
            status = "REPLAY"
        elif not 0 <= nu-m["tijd"] <= self.c["meting_max_leeftijd_s"]:
            status = "STALE_KLOK"
        elif m["quality"] != "goed" or not -20 <= m["C"] <= 50:
            status = "QUALITY_BEREIK"
        elif abs(m["C"]-voorspelde_sensor_C) > .8:
            status = "INNOVATIE"
        else:
            self.seq = m["seq"]
            self.historie.append((m["C"], voorspelde_sensor_C))
            self.historie = self.historie[-12:]
            if len(self.historie) == 12:
                gem = [a for a, _ in self.historie]
                pred = [b for _, b in self.historie]
                if max(gem)-min(gem) < 1e-8 and max(pred)-min(pred) > .15:
                    status = "FREEZE"
        return {"waarde": float(m["C"]) if status == "goed" else None,
            "status": status}
