import math

class Ontvanger:
    def __init__(self): self.volgnummer = {}
    def verwerk(self, bericht, nu):
        verplicht = {"node","boot","seq","tijd_s","temperatuur_C"}
        if not verplicht <= bericht.keys(): return "schemafout"
        if type(bericht["seq"]) is not int or bericht["seq"] < 0: return "sequencefout"
        t,T = bericht["tijd_s"],bericht["temperatuur_C"]
        if not all(type(x) in (int,float) and math.isfinite(x) for x in (t,T,nu)):
            return "getalfout"
        if not -30 <= T <= 60 or not 0 <= nu-t <= 90: return "oud/bereik"
        sleutel=(bericht["node"],bericht["boot"])
        if bericht["seq"] <= self.volgnummer.get(sleutel,-1): return "duplicaat/volgorde"
        self.volgnummer[sleutel]=bericht["seq"]
        return "aanvaard"

r=Ontvanger()
b={"node":"kas","boot":"sessie-a","seq":12,"tijd_s":100,"temperatuur_C":21.1}
for bericht,nu in [(b,101),(b,102),(dict(b,seq=13),200),
                   (dict(b,boot="sessie-b",seq=0,tijd_s=201),202)]:
    print(r.verwerk(bericht,nu))
actief=120.0  # mA, gemeten ontwerpaanname voor hele knoop
rust=0.05    # mA, inclusief regelaar en lekstromen in rekenmodel
I=(actief*2+rust*58)/60
print("gemiddelde",round(I,3),"mA")
print("2000mAh, 80pct bruikbaar",round(1600/I/24,1),"dagen")
assert abs(I-4.048333333)<1e-7
