Handboek · hoofdstuk 49Integratieproject: het brein van het station
Een reproduceerbaar stationontwerp met twee energierails, lokale bevoegdheid en zichtbare bewijsgrenzen
Je brengt warmte, energie, water, software, prognoses en levenscyclusimpact samen in één zelfstandig simulatiepakket. Je volgt eisen tot echte normale en gestoorde runs en beslist wat het bewijs werkelijk draagt. Het resultaat bevat ook de functies die nog niet mogen worden vrijgegeven.

- Je vertaalt behoeften naar unieke toetsbare eisen en een architectuur volgens het V-model.
- Je leidt een samenhangende digitale tweeling af en controleert warmte-, energie- en waterbalansen.
- Je gebruikt PID, saturatie en tracking met werkelijk geleverde actuatorwarmte.
- Je beproeft lokale bevoegdheid, meetkwaliteit, storingen, replay en vergrendelde herstart.
- Je evalueert een prognosemodel zonder tijdlek met een gelijke baselinehorizon en onthouding.
- Je koppelt FMEA, LCA, restonderzoek en een reproduceerbare verdediging aan een verantwoord acceptatiebesluit.
Een review is pas geslaagd als het besluit klopt
Een team toont een fraai dashboard: zon, batterij, reservoir en kamertemperatuur staan groen. De reviewer zet de broker uit, verstuurt een oud setpoint en laat de tank lekken. Het scherm is geen antwoord. Het antwoord zit in bevoegdheid, fysische stroompaden, meetkwaliteit en bewijs.
Het NASA Systems Engineering Handbook, bijlagen D, E en I koppelt eisen met unieke IDs aan verificatie en onderscheidt validatie: klopt de uitvoering met de eis, en voldoet de dienst in haar gebruikscontext? Habitat wordt hier een reproduceerbaar ontwerpexperiment. Het pakket levert controleerbare bewijzen én redenen om een functie nog niet aan te nemen. De projectuitkomst is een verdedigbaar besluit, ook wanneer comfort of hardware niet voldoet. Bron geraadpleegd 30-09-2026.
| Reviewbewijs | Betekenis |
|---|---|
| Numerieke balans | Conservatie van het gekozen model |
| Contractproef | Begrensde softwarebeslissing |
| Fysische proef | Werkelijke dienst en hardware in hun context |
De opdrachtgrens en de oplevering
E49 integreert het station met precies één bestaande klimaatmodule. De oplevering omvat eisen, architectuur, interfacecontracten, digitaal lesmodel, lokale regeling, forecast, FMEA, LCA en eindrapport. Het pakket bestuurt geen installatie. De 12 V- en 48 V-rails zijn elektrisch gescheiden; warmte kan vanuit de stationbuffer naar de module lopen. NFT, drinkvoorraad en gezuiverde H₂-voeding hebben eigen balansen.
De configuratie heet E49-S2-12-v1: 12 kWh stationopslag, vaste UTC+1, 8–14 maart 2021, seed 4902026. Dit is geen gemeten historische weerweek. Nieuwe capaciteiten, verliezen, profielen en debieten zijn benoemde modelkeuzen. Een geslaagde numerieke proef wordt geen installatiekeuze. Code, config, invoer, twaalf logs, gebeurtenissen en grenzen worden samen geleverd.
| Vaste proefkeuze | Waarde |
|---|---|
| Config | E49-S2-12-v1 |
| Klok / kalender | UTC+1 vast; 8–14 maart 2021 |
| Oplevering | Code, input, 26 uitvoerbestanden en acceptatieboek |
Het V-model koppelt ontwerp aan bewijs
Links leg je behoefte, grens, eisen en subsystemen vast. Onderaan implementeer je. Rechts toets je onderdelen, interfaces, integratie en dienst. Een syntactisch geldig centraal voorstel kan door de lokale eigenaar worden geweigerd; dat kan precies de eis zijn.
T-01 sluit de warmteboekhouding van het model; T-03 beoordeelt comfort. Een klein RK4-residu maakt een onjuiste verliescoëfficiënt niet waar. Een stopcontract bewijst geen contactorreactietijd. Iedere rechtertak noemt daarom methode, opstelling, ingreep, grens, bewijsbestand, beoordelaar en onzekerheid.
Van behoefte naar één toetsbare eis
- Lokale eigenaar woon; normaal doel 20 °C
- Lease 60 s; centrale telemetrie 60 s
- Eis, test en besluit
- 1D-03: zodra de lease verloopt kiest de lokale eigenaar 20 °C; een oude boodschap vernieuwt de lease niet.
- 2Route: Pi → voorstel → lokale eigenaar → begrensde PID. Test: doel 19,5 °C op t=0, TTL 60 s, daarna geen bericht. Op t=60 wordt het doel 20 °C.
- 3De brokerweek telt 1440 terugvalminuten. Normale voorstellen waren al 20 °C, dus de temperatuur is identiek. Dat bewijst deze bedrijfsmodus, geen AI-besparing.
Programma van eisen: energie en warmte
| Eis-ID en grens | Bewijs | Besluit |
|---|---|---|
| A-01 Twee rails, één station plus één module; geen verborgen converter. | Architectuur, config, twee saldi | modelgrens gecontroleerd |
| A-02 Elke eis heeft eigenaar, proef, bewijs en besluit. | Traceermatrix en eindrapport | projectprocedure |
| E-01 Opslag blijft binnen SOC-venster; tekorten blijven zichtbaar. | Twaalf weeklogs en contracttests | model geslaagd; autonomie niet |
| E-02 4 kVA continu, 8 kVA maximaal 5 s; P/Q/S en bankstroom samen. | Afschakel- en aanloopproef | continue selectie geslaagd; aanloop niet |
| E-03 Laadstroom apart: 80 A module, 60 A station; koude-interlock. | Koude/volle proef en contracttests | logica geslaagd; fabrikantbewijs open |
| E-04 16S-venster 44,8–55,2 V; iedere cel 2,8–3,45 V. | 58,4 V en ongelijke-celtest | weigering geslaagd; celselectie open |
| E-05 Windafregeling bewaakt 3 kW-dump en echte remgrenzen. | Vol-week en 245 V-rekening | nominaal model geslaagd; fysiek open |
| T-01 Vier warmtevoorraden, transporttekens en residu sluiten. | RK4, weekbalans, stapverfijning | numeriek geslaagd; niet gekalibreerd |
| T-02 Convector maximaal 800 W; warmte hangt van buffertemperatuur af. | warmtestap en qmodule_W | modelgrens geslaagd |
| T-03 Woondeel ≥19 °C; module ≥17,5 °C van 07–22 h, anders ≥15,5 °C. | Comforttellers alle scenario's | module normaal 0,5 h niet gehaald |
| T-04 Tracking gebruikt werkelijk geleverde actuatorwarmte. | PID en anti-windupproef | logica geslaagd |
Programma van eisen: water, data en bevoegdheid
| Eis-ID en grens | Bewijs | Besluit |
|---|---|---|
| W-01 NFT en drinkvoorraad apart; recirculatie is geen verbruik. | Massabalans en doorzet | model geslaagd; waterkwaliteit open |
| W-02 24 L-vlotter onafhankelijk; flowverlies stopt pomp. | Lek- en pompfoutweek | ideaal contact geslaagd; hardware open |
| H-01 Elektrolyse alleen uit bereikbaar 48 V-overschot. | H₂-energie-, verlies- en massalog | model geslaagd |
| H-02 Gezuiverde voeding begrenst H₂-productie. | 20 L-balans en lege-proef | minimumvoeding geslaagd; praktijk open |
| D-01 Identiteit, leeftijd ≤90 s, kwaliteit, eindigheid en innovatie. | Stale/NaN/freeze/bias-tests | logica geslaagd; gedeelde bias ontsnapt |
| D-02 Voorstel heeft boot/seq/tijd/TTL/mode/ACK en begrensd doel. | Geldige en onjuiste voorstellen | logica geslaagd |
| D-03 Verlopen lease valt lokaal terug naar 20 °C. | Brokerweek en leasecontract | 1440 min terugval; geen besparingsbewijs |
| D-04 Oud voorstel wordt na herstart opnieuw geweigerd. | Replayregister via JSON | logica geslaagd; duurzame opslag open |
| V-01 Stop/voedingsverlies vergrendelt; gezonde resetflank met verzoek/contact uit. | Contacttrace en resetreeks | logica geslaagd; hardware open |
| V-02 Ventilatie heeft een afzonderlijke risicogestuurde tak. | Stopweek en koud_leeg | stopweek gevoed; koude lege proef faalt |
Programma van eisen: prognose, impact en claim
- AI-01/AI-02: tijd, horizon en onthouding
- L-01/B-01/Q-01: grens, claim en reproductie
- Een besluit per bewijssoort
- 1AI-01 krijgt alleen prognosefeatures en een tijdsplit; AI-02 heeft een expliciete null-terugval.
- 2L-01 gebruikt dezelfde S1-inventarisgrens met nieuwe benoemde invoer. B-01 bewaart ontbrekend biologisch/medisch bewijs.
- 3Q-01 laat een andere leerling de volledige run reproduceren.
| Eis-ID en grens | Bewijs | Besluit |
|---|---|---|
| AI-01 Alle features vóór dezelfde 24 h-doelhorizon beschikbaar. | Archief, tijdsplit en RMSE | synthetische demonstratie geslaagd |
| AI-02 Onthouding bij ontbrekende/ongeldige prognose; lokale terugval. | Null- en buitengebiedproef | logica geslaagd |
| L-01 E47-S1-grens, 20 jaar, station plus één module; S2 expliciet. | Inventaris en 18 gevoeligheden | screening geslaagd; jaarfunctie open |
| B-01 Geen PCR-/teelt-/ademgas-/medische claim zonder passend bewijs. | Restonderzoek e29–e33 | geen behaalde stationsvoorziening |
| Q-01 Code, config, invoer en logs zelfstandig reproduceerbaar. | Schone-maprun en SHA | behaald voor dit pakket |
Architectuur: een stroom heeft een eigenaar
Module-PV 1,40 kWp voedt de 12 V-bank; extra PV 4,20 kWp en wind voeden de 48 V-bank. Totaal PV is 5,60 kWp. Alleen stationoverschot bereikt elektrolyse. Zonder ontworpen converter kan een volle stationbank de module niet bijladen en kan 12 V-afregeling geen waterstof produceren.
De module-eigenaar beheert lamp, NFT-pomp en convector; de station-eigenaar beheert WP, AC-selectie en H₂. Eén vrijgavemodel abstraheert hier gemeenschappelijke stopvoorwaarden. Een installatie moet echte eigenaren, contactoren, terugmeldingen en ventilatievoeding apart implementeren en toetsen. Telemetrie gaat naar Pi/logger; voorstellen gaan naar de lokale eigenaar. De mens stopt en reset onder voorwaarden. Geen AI- of MQTT-bericht heft dat op.
Hoofdparameters met herkomststatus
| Grootheid | Waarde | Status |
|---|---|---|
| Moduleopslag / PV | 3,072 kWh / 1,40 kWp | Habitat; 20–100% bruikbaar |
| Stationopslag / PV | 12 kWh / 4,20 kWp | S2-keuze / bestaand extra PV |
| 48 V laden / ontladen | 60 A / 100 A; 130 A gedurende 5 s | eigen laadkeuze / ontlaadgrens |
| η laden / ontladen / inverter | 0,95 / 0,96 / 0,93; 25 W | rekenaannamen |
| Ca / Cb / G / Hmodule | 80 kJ/K / 1,10 MJ/K / 30 / 20,2 W/K | e17-module |
| Cwoon / Cwp | 1,80 MJ/K / 418,6 kJ/K | nieuwe woonkeuze / 100 L water |
| Hwoon / Hvent | 29,8 / 5,025 W/K | ventilatie inbegrepen bij 100 m³/h |
| NFT / drink / H₂-water | 60 / 500 / 20 L | twee bestaande tanks / eigen gezuiverde voeding |
| Klok / besturing / plant | UTC+1 / 60 s / RK4 30 s | leskeuze, geen deadlinebewijs |
| Starttemperaturen | Ta=Tb=18; Th=20; Tw=35 °C | beginvoorraad bevat warmte |
Capaciteit is nog geen autonomie
- ηd=0,96; ηinv=0,93
- 250 W AC, 25 W inverter, 48 W aparte DC
- Bruikbare energie, nominale Ah en beperkte autonomie
- 1Vóór verliezen: 12×(0,90−0,20)=8,4 kWh. Bij nominaal 51,2 V hoort 12000/51,2=234,375 Ah. Dat kiest geen cel of BMS.
- 2Railvraag=250/0,93+25+48=341,817204 W; opslagafname=341,817204/0,96=356,059588 W.
- 3Zonder bronnen/veroudering: 8400/356,059588=23,591557 h. Alleen 8,4/0,25=33,6 h rekenen vergeet hulp- en padverliezen.
Spanning, stroom en schijnvermogen zijn verschillende toetsen
Bij inductieve AC-lasten tel je P en Q met hun tekens op en bereken je S. Hier hebben de lastprofielen laggende positieve Q en een opgegeven cos φ. Het is geen harmonischen-/golfvorm-/motorstartmodel. 8 kVA gedurende vijf seconden betekent niet dat iedere bank 8 kW kan leveren.
Het 16S-venster 2,8–3,45 V per cel geeft 44,8–55,2 V binnen de 44–56 V-rail. 16×3,65=58,4 V wordt geweigerd. Modulelading onder 0 °C is verboden; het station gebruikt een eigen strengere 5 °C-proefgrens. Fabrikantbewijs voor celvenster, capaciteit, BMS, converter, stroomduur en temperatuur ontbreekt. SOC voorspelt geen celspanning.
ηd is het gekozen ontlaadpad; U=44,8 V. De losse selectie rekent zonder gegarandeerde directe bronnen.
De lastselectie weigert een echte dienst
Prioriteit: drinkdruk, koelkast, WP, rest, noodwarmte. Iedere extra last wordt getoetst op S, beschikbaar DC-vermogen en stroom; weigering blijft een diensttekort. De WP-grens is de e16-waarde 1163,250573 W. Dit leesdeel hoort bij het volledige programma, niet bij een eigen verborgen model.
def pq(lasten): p = sum(w for w, pf in lasten) q = sum(w*math.tan(math.acos(pf)) for w, pf in lasten) return p, q, math.hypot(p, q) def kies_lasten(c, gevraagd, bus_W, spanning, piek=False): """Volgorde bepaalt prioriteit; elke afgewezen dienst blijft in het log.""" geleverd, geweigerd, lasten = {}, {}, [] limiet = c["omvormer_piek_VA"] if piek else c["omvormer_cont_VA"] stroom = c["b48_piek_A"] if piek else c["b48_ontlaad_A"] for naam, w, pf in gevraagd: p, q, s = pq(lasten+[(w, pf)]) dc = p/c["omvormer_eta"]+c["omvormer_nullast_W"] if s <= limiet and dc <= bus_W and dc/spanning <= stroom: geleverd[naam] = w lasten.append((w, pf)) else: geleverd[naam], geweigerd[naam] = 0.0, w p, q, s = pq(lasten) dc = p/c["omvormer_eta"]+c["omvormer_nullast_W"] if p else 0 return geleverd, geweigerd, (p, q, s, dc){
"gevraagd_PQS": [
4363.250572652715,
1030.8345703493094,
4483.366533218257
],
"geleverd_PQS_DC": [
2363.250572652715,
1030.8345703493094,
2578.288808603612,
2566.129648013672
],
"afgewezen_W": {
"nood": 2000
},
"duur_s": 60,
"nood_niet_geleverd_kWh": 0.03333333333333333
}4,48 kVA past niet continu; 7,28 kVA is geen vrijbrief
- Continu 4000 VA
- Aanloop P=5232 W, S=7280 VA, overige DC=48 W
- Weigering en restbewijs
- 1Continu P=4363,251 W, Q=1030,835 var, S=4483,367 VA. De selector weigert 2000 W noodwarmte; één minuut mist 0,033333 kWh.
- 2Aanloop-Q=√(7280²−5232²)=5062,072303 var. S<8000, maar I=132,505730 A>130. Deze aanloop is niet gehaald.
- 3P=5000 W bij dezelfde S geeft 126,705359 A. Dat selectiepunt past, maar bewijst niet dat dezelfde motor zo werkelijk aanloopt. Starter/motor/volgorde vragen een fysieke 5 s-proef met spanningsdip.
Vier toestanden en twee verschillende waterbuffers
Ta is modulelucht, Tb haar bestaande thermische buffer, Th woondeel en Tw de aparte 100 L-WP-buffer. De 200 L-modulebuffer en NFT zijn al opgenomen in Cb=1,10 MJ/K. De 100 L-WP-buffer verschijnt eenmaal als 418,6 kJ/K. Cwoon=1,80 MJ/K is een nieuwe leskeuze; e39’s 540 kJ/K wordt geen extra kamer.
De PID geeft reeds begrensde vragen van maximaal 800 W en 2500 W. De plant gebruikt qm=min(begrensde vraag,80·max(Tw−Ta,0)) en qh=min(begrensde vraag,140·max(Tw−Th,0)). Beide worden bij Tw afgetrokken en bij hun zone toegevoegd. WP-bufferverlies 2(Tw−Th) gaat intern naar het woondeel. Hwoon bevat Hvent=5,025 W/K al. Zonder gevoede ventilatie wordt uitsluitend die bestaande bijdrage afgetrokken en tegelijk een essentiële-diensttekort geregistreerd.
Afleiden vóór integreren: vier warmtevergelijkingen
G(Ta−Tb) heeft tegengestelde tekens in lucht en modulebuffer. Externe bronnen zijn WP, noodwarmte en proefwinsten. Nieuwe winsten: 0,6 m² effectieve modulezonwinst, lampwarmte, maximaal 20 W andere lokale warmte, 180 W bewoners en werkelijk geselecteerde binnenlasten. Dit zijn geen gekalibreerde gegevens.
Optellen elimineert alle interne transporten; ΔΣCT is externe warmte-in minus buitenverlies. Cb blijft vast wanneer NFT leegloopt en verplaatst water draagt geen expliciete enthalpie mee. Deze vereenvoudigde warmte-/waterkoppeling verhindert een gevalideerde fysieke temperatuurbaan bij groot waterverlies.
RK4 en transportflux krijgen dezelfde gewichten
Temperatuur en flux gebruiken dezelfde RK4-gewichten. Iedere deelstap berekent transport uit de buffertemperatuur; een koude buffer levert geen gratis 800 W. De assert vergelijkt ΔΣCT en externe nettowarmte in J. De 60 s-regelactie blijft gelijk terwijl de plantstap 60, 30 en 15 s varieert. Dat is integratieverfijning, geen stille verandering van controller of telemetrie.
def warmtestap(c, z, tout, qm_req, qh_req, qwp, qnood, gains_m, gains_h, extra_H, hwoon, dt): """RK4 integreert toestanden EN dezelfde fluxen voor de balans.""" capaciteiten = np.array([c["Ca_J_K"], c["Cb_J_K"], c["Cwoon_J_K"], c["Cwp_J_K"]]) def f(t): a, b, h, w = t qm = min(qm_req, c["Gconvector_W_K"]*max(0, w-a)) qh = min(qh_req, c["Gvloer_W_K"]*max(0, w-h)) qbw = c["Hwp_naar_woon_W_K"]*(w-h) g = c["Gmodule_W_K"]*(a-b) lm = (c["Hmodule_W_K"]+extra_H)*(a-tout) lh = hwoon*(h-tout) vermogen = np.array([qm+gains_m-lm-g, g, qh+qbw+qnood+gains_h-lh, qwp-qm-qh-qbw]) flux = np.array([qm, qh, lm, lh, qbw]) return vermogen/capaciteiten, flux voor = z.copy() som = np.zeros(5) for _ in range(round(c["besturing_s"]/dt)): k1, f1 = f(z) k2, f2 = f(z+dt*k1/2) k3, f3 = f(z+dt*k2/2) k4, f4 = f(z+dt*k3) z = z+dt*(k1+2*k2+2*k3+k4)/6 som += dt*(f1+2*f2+2*f3+f4)/6 delta = float(capaciteiten@(z-voor)) netto = (qwp+qnood+gains_m+gains_h)*c["besturing_s"]-som[2]-som[3] assert abs(delta-netto) < 1e-5 return z, som, delta-nettoPID trackt werkelijk geleverde warmte
Module Kp/Ki/Kd=220/0,03/1200; woondeel 350/0,025/3000; buffer 550/0,12/0. Eenheden zijn W/K, W/(K·s) en W·s/K. I heeft eenheid W. De afgeleide op meting wordt gefilterd met 60 s-tijdconstante; een setpointsprong geeft geen directe afgeleidepiek.
Verzadiging, koude buffer, spanningsgebrek of meetweigering vermindert werkelijk geleverde warmte. Tracking gebruikt die flux, niet alleen de clamp. De drie echte lussen hebben trackingtijd 600 s. De aparte uitvalproef gebruikt 120 s als overzichtelijke vergelijking. Dit is modeltuning; identificatie, anti-cycling en rekendeadlines blijven praktijkbewijs.
Dezelfde PID-klasse stuurt drie echte lussen
Eindigheidscontrole weigert NaN/oneindige instellingen of setpoints. Na iedere minuut komen qm/qh terug uit de geïntegreerde flux en qwp uit het geselecteerde WP-vermogen. Een compressorstoring maandag 23:00–dinsdag 04:00 maakt compressorwarmte nul; hydraulische hulp heeft een aparte voeding.
class PID: """Afgeleide op meting; integrale toestand heeft eenheid watt.""" def __init__(self, kp, ki, kd, maximum, begin=0, tau_d=60, tau_aw=600): if not all(finite(x) for x in (kp, ki, kd, maximum, begin, tau_d, tau_aw)): raise ValueError("niet-eindige PID-instelling") if min(kp, ki, kd) < 0 or min(maximum, tau_d, tau_aw) <= 0: raise ValueError("ongeldige PID-instelling") self.kp, self.ki, self.kd = kp, ki, kd self.maximum, self.I = maximum, begin self.tau_d, self.tau_aw = tau_d, tau_aw self.vorig, self.d = None, 0.0 def vraag(self, setpoint, y, dt): if not all(finite(a) for a in (setpoint, y, dt)) or dt <= 0: raise ValueError("ongeldige PID-invoer") afgeleid = 0 if self.vorig is None else (y-self.vorig)/dt a = math.exp(-dt/self.tau_d) self.d = a*self.d+(1-a)*afgeleid self.vorig = y self.e = setpoint-y self.onbegrensd = self.kp*self.e+self.I-self.kd*self.d return min(self.maximum, max(0.0, self.onbegrensd)) def terug(self, werkelijk, dt, aw=True): correctie = (werkelijk-self.onbegrensd)/self.tau_aw if aw else 0 self.I += dt*(self.ki*self.e+correctie)WP-storing: warmte 35,546 kWh, WP-elektrisch 17,614 kWh, noodwarmte 0,967 kWh. De aparte uitvalproef geeft na 2 h I=−200 W met tracking tegenover 18000 W zonder; eerste herstelactie 0 tegenover 800 W.
Meetkwaliteit hoort vóór de regelaar
De moduleluchtketen heeft een gesimuleerde eersteorde sensorvertraging van 60 s met stukconstant Ta per minuut. Dit is geen gemeten sensor of integraal continu sensor-/plantmodel, geen extra digitaal filter en geen menging met de buffer-NTC. De lokale poort toetst identiteit, boot/seq, eindigheid, leeftijd, kwaliteit, bereik en innovatie. 0,8 K en freeze-criteria zijn proefgrenzen, geen aangetoonde sensoronzekerheidsbegroting.
De ideale modelwatcher herkent een afzonderlijke bias van +3 °C, maar geen gedeelde bias van model en sensor. Die tegenproef blijft zichtbaar. Bij afwijzing wordt convectorwarmte nul; de echte planttemperatuur vervangt de defecte meting niet. Home-/WP-sensoren zijn in deze versie ideaal en vragen eigen kwaliteitsbewijs.
| Ketenonderdeel | Proefstatus |
|---|---|
| Sensorlag 60 s | Gesimuleerd, Ta stukconstant per minuut |
| Innovatiegrens 0,8 K | Eigen detectiecriterium, geen ijking |
| Home-/WP-sensor | Ideaal in deze versie; praktijkbewijs open |
Ontbreekt, stale, NaN, freeze en bias hebben aparte redenen
De poort geeft een waarde of None met reden. Standaard JSON bewaart null/status, geen NaN-token. Freeze: twaalf exact gelijke metingen terwijl de modelvoorspelling meer dan 0,15 K verandert. Een rustige sensor wordt niet zonder veranderingsbewijs bevroren genoemd.
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}| Fout | Uitkomst |
|---|---|
| ontbreekt | ONTBREEKT |
| stale | STALE_KLOK |
| NaN | NIET_EINDIG |
| ongeldig model | ONGELDIG_MODEL |
| bias/innovatie | INNOVATIE |
| freeze met verwachte verandering | FREEZE |
| gedeelde bias niet observeerbaar | aanvaard; absolute juistheid NIET bewezen |
Een MQTT-bericht is geen actuatorbevoegdheid
Het voorstel bevat node, owner_boot, source, source_boot, seq, tijd, ttl, mode, quality en set_C. Een applicatie-ACK bewaart node, boots, seq, moment en beslisreden. Alle grens-/tijd-/identiteitstoetsen moeten slagen. Het pakket gebruikt dictionaries en geen echte beveiligde broker.
OASIS MQTT 5.0 definieert QoS, message expiry en session state. Die transporteigenschappen vervangen het eigen tijd-/bevoegdheidscontract niet. Een protocol-PUBACK bewijst geen daadwerkelijke contactoractie. Retained setpoints, bronherstarts, klokken en duurzame replayopslag vragen een apart praktijkplan. Bron geraadpleegd 30-09-2026.
voorstel = {
'node': 'woon', 'owner_boot': 'woon-A',
'source': 'pi', 'source_boot': 'pi-A', 'seq': 17,
'tijd': 600, 'ttl': 60, 'mode': 'NORMAAL',
'quality': 'goed', 'set_C': 19.5
}| Contractgroep | Velden |
|---|---|
| Identiteit | node, owner_boot, source, source_boot |
| Volgorde/tijd | seq, tijd, ttl |
| Bevoegdheid/kwaliteit | mode, quality, set_C |
| Respons | Applicatie-ACK met correlatie en beslisreden |
Stop en herstart vragen een menselijke flank
Opstart is vergrendeld. Stop, voedingsverlies of ongezonde kring vergrendelt opnieuw. Stop los en spanning terug starten niets. Een gezonde resetflank mag alleen vrijgeven met verzoek uit én contactfeedback uit; vasthouden is geen nieuwe flank. Om 01:12 geeft reset bevoegdheid terug, maar pas om 01:13 volgt een apart nieuw verzoek.
Dit logische model bewijst geen SIL, PL, gecertificeerde noodstop, contactorreactietijd of veilige lastuitschakeling. De gewone taak van 60 s is geen snelle hardwarekring. Essentiële ventilatie blijft hier via haar aparte tak tijdens stop gevoed; dit beleid hoort bij de gekozen risicoanalyse.
class StopVrijgave: """Logisch model van een onafhankelijke, stopdominante vergrendeling.""" def __init__(self): self.vergrendeld, self.vorig_reset = True, False def stap(self, stop, voeding, gezond, reset, verzoek_uit, contact_uit): flank = reset and not self.vorig_reset self.vorig_reset = reset if stop or not voeding or not gezond: self.vergrendeld = True elif flank and verzoek_uit and contact_uit: self.vergrendeld = False return voeding and gezond and not stop and not self.vergrendeldRecirculatie telt door zonder evenveel water te verbruiken
- 1,20 L/min per goot; start 50 L; woensdag +20 L
- Drink: start 500 L; 70 L/d; zaterdag +200 L
- Doorzet en eindvoorraden
- 1Doorzet=4×1,2×10×24×7=8064 L/week. Hetzelfde water loopt herhaald rond; dat is geen netto afvoer.
- 2NFT-eindvoorraad=50+20−7×(3,6+0,7)=39,9 L. Tijdens pompen toont de tank 3,9 L minder door water onderweg.
- 3Drink-eindvoorraad=500+200−490=210 L. Werkelijke levering vraagt geselecteerde pomp en positieve voorraad; een lege tank geeft diensttekort.
De onafhankelijke vlotter ziet het tankpeil
Tank bij pomp=NFT-inventaris−3,9 L. Het ideale contact opent bij 24 L of 10 cm; de analytische kruising binnen de minuut begrenst de pompfractie. Leidingretour is vereenvoudigd onmiddellijk. Werkelijke contactvertraging en retourdynamiek blijven te testen.
Waterlek begint op 31 L en lekt twee uur 2 L/min, ook na pompstop. De vlotter stopt vóór drooglopen maar dicht het lek niet. Bijvullen is geen reparatie. De nieuwe flowbewaking vraagt twee actieve meetmomenten en stopt in de testcase na 60 s; de fasegrens is minder dan 120 s. De flowmeter is een selectievoorstel, geen bewezen hardware. H₂-water en drinkwater zijn aparte voorraden.
Waterstof maakt overschot niet verliesloos
Alleen 48 V-overschot na lasten en begrensd laden voedt elektrolyse. Keuzen: 55 kWh/kg elektrolyse, 3 kWh/kg compressie, DC-rendement 0,96, netto celrendement 0,50 bij LHV 33,333333 kWh/kg. Proces-/celwarmte wordt apart geteld en niet als woonwarmte teruggewonnen. Beginreserve 2 kg is aangevoerd proefmateriaal; eerdere productie valt buiten de week, maar niet vanzelf buiten werkelijke LCA.
Een eigen 20 L gezuiverde procesvoorraad begrenst productie bij afgerond 9 L/kg stoichiometrische minimumvoeding. Spoelen, purging en zuivering kunnen praktijkverbruik verhogen. Geen NFT-water wordt stil omgeleid. Celretourwater wordt geteld maar niet automatisch bruikbaar teruggewonnen. Opslaglek 0,1% actuele massa/dag is een scenario-aanname; grenzen zijn 12 kg, 200–1000 W elektrolyse en 500 W netto cel.
De werkelijk uitgevoerde waterstofrekening
- Normaal elektrolyse 45,380018 kWh
- Begin 2 kg H₂ en 20 L gezuiverd water
- Productie, verliezen en retourdienst
- 1Productie=E×0,96/58=0,751118 kg; minimumvoeding 6,760058 L. DC-verlies 1,815201, compressie 2,253353, procesverlies 16,274213 kWh.
- 2Massa eind=2+productie−verbruik−lek=2,734792 kg. Normaal gebruikt geen celenergie; productie alleen zou retour niet toetsen.
- 3h2_reserve levert werkelijk 33,266896 kWh, maar mist 69,38 h wooncomfort. h2_water_leeg produceert exact 0 kg; een ontbrekende voorraad wordt niet stil gevuld.
Het volledige experiment zelfstandig uitvoeren
Sla de zeven bron-/invoerbestanden hieronder in één schone map op. De geteste versies zijn Python 3.13.1 en NumPy 2.4.0. Er zijn geen cursusimports, broker, hardware of verborgen invoerbestanden. De andere downloads bevatten alle werkelijk berekende resultaten. De lange programmatuur wordt elders op samenhangende leesdelen getoond; hun unieke downloads zijn fragmenten, geen los uitvoerbaar pakket.
De CLI schrijft in de gekozen uitvoermap. Bij de cursusbouw krijgt de bron expliciet __name__='e49_bouw'; argparse leest daardoor geen bouwargumenten en __file__ is niet nodig. De bouwer roept dezelfde run_all aan met ingesloten JSON-/CSV-teksten. De generator is optioneel: beide geleverde CSV’s zijn compleet.
python -m pip install -r requirements.txtpython habitat_brein.py --out resultaat# Optioneel: dezelfde vaste CSV-invoer opnieuw makenpython maak_invoer.py# Een andere uitvoermap:python habitat_brein.py --out mijn_proefE49-S2-12-v1 | UTC+1 vast | seed 4902026
config sha256 79162d53dead19c58f257c78d9ab3803e9bd56e4f5c28495b2e8799dbd170a09
normaal: last12=13.009361 kWh last48=64.081185 kWh comforttekort woon=0.000 h module=0.500 h
koud_leeg: last12=1.156706 kWh last48=3.795089 kWh comforttekort woon=167.233 h module=167.917 h
vol: last12=13.302675 kWh last48=64.005070 kWh comforttekort woon=0.000 h module=0.000 h
broker: last12=13.009361 kWh last48=64.081185 kWh comforttekort woon=0.000 h module=0.500 h
sensorbias: last12=12.870861 kWh last48=63.276706 kWh comforttekort woon=0.000 h module=26.200 h
stop_herstel: last12=13.008128 kWh last48=64.019985 kWh comforttekort woon=0.000 h module=2.200 h
wp_storing: last12=13.009361 kWh last48=64.797079 kWh comforttekort woon=0.000 h module=0.500 h
waterlek: last12=12.729351 kWh last48=64.076010 kWh comforttekort woon=0.000 h module=0.233 h
pompfout: last12=12.729242 kWh last48=64.076038 kWh comforttekort woon=0.000 h module=0.233 h
drink_leeg: last12=13.009361 kWh last48=63.274734 kWh comforttekort woon=0.000 h module=0.500 h
h2_reserve: last12=13.049561 kWh last48=39.334005 kWh comforttekort woon=69.383 h module=63.167 h
h2_water_leeg: last12=13.009361 kWh last48=64.081185 kWh comforttekort woon=0.000 h module=0.500 h
forecast test model/basis RMSE kWh {'dagen': 35, 'model_RMSE_kWh': [0.5851539545652431, 2.534111423005847], 'basis_RMSE_kWh': [1.116428082109751, 5.479447885357938], 'prognose_T_RMSE_K': 2.005657163666399, 'prognose_zonuren_RMSE_h': 0.569031555245376}
contracttests 30
LCA S1/S2 kg/jaar [808.6800000000001, 873.68]De gewone week: comfort en energie tegelijk
Geleverd: 13,009361 kWh module-rail en 64,081185 kWh station-rail. WP-elektriciteit 17,914982 kWh; compressorwarmte 36,601712 kWh. Hun quotiënt omvat de geboekte hulpuren, geen catalogus-COP. W35-COP wordt uit e16 geïnterpoleerd; de vaste 35 °C-bufferstrategie is een leskeuze.
Wooncomfort slaagt; de module mist 0,5 h ondanks voldoende energie. Timing, transport en regeling zijn dus eigen grenzen. Temperatuur-/voorraadgrafieken tekenen intervaleinden. CSV-tijd/t_h is intervalbegin; temperatuur/SOC/water is de toestand na die minuut. Vermogen en vrijgave gelden tijdens het interval.
Het railsaldo onafhankelijk narekenen
- Geen 12→48 V-converter
- Afregeling, verlies en elektrolyse blijven apart
- Twee sluitende saldi
- 112 V: PV 27,206788 + begin 2,304 − eind 2,115748 = last 13,009361 + afregeling 13,480047 + verlies 0,905632 kWh.
- 248 V: PV 81,620363 + wind na buck 60,903405 + cel 0 + begin 8,4 − eind 10,8 = last 64,081185 + elektrolyse 45,380018 + PV-afregeling 26,999252 + dump vóór buck 2,840168×0,97 + verlies 0,908349 kWh.
- 3Elektrolyseverliezen verdelen h2_in verder; tel ze niet nogmaals bij de raillast. Winddump is vóór buck, daarom factor 0,97 in het saldo na buck.
Numerieke kwaliteit en modelgrens
| Gesloten grootheid | Weekresidu | Eenheid |
|---|---|---|
| rail12_kWh | −0,000000000000 | kWh |
| rail48_kWh | 0,000000000000 | kWh |
| h2_kg | 0,000000000000 | kg |
| nft_L | −0,000000000054 | L |
| drink_L | 0,000000000000 | L |
| proceswater_L | 0,000000000002 | L |
| warmte_week_kWh | 0,000000000002 | kWh |
| warmte_max_residu_J | 0,000000011843 | J |
| Plantstap; regelactie 60 s | Maximaal verschil t.o.v. 30 s | WP-energieverschil |
|---|---|---|
| 60 s | 0,000000017725 K | 0,000000000399 kWh |
| 15 s | 0,000000001090 K | −0,000000000025 kWh |
Convergentie heeft een beperkte betekenis
Verfijning bevestigt RK4 in dit gladde model. Zij identificeert geen capaciteit, deadline, sensorfout, compressorcyclus, leidingvertraging of bevriezing. Het interval maandag 23:42–23:43 van koud_leeg eindigt voor het eerst met niet-positieve waterbuffertemperatuur; daarna is het vloeibaar-watermodel ongeldig.
De log bewaart algebra en watermodel_geldig, maar verkoopt geen ijsvoorspelling. Comfort en kritieke voeding falen eerder al. Een fysisch vervolg vraagt faseverandering, stroming, enthalpie en volumeafhankelijke capaciteit. Bij groot NFT-lek beperkt constant Cb de temperatuurclaim eveneens. Deze grenzen mogen niet verdwijnen uit grafiek, resultaat of acceptatieboek.
Alle storingruns blijven in het resultaat
| Scenario | Geleverd 48 V (kWh) | Comforttekort woon / module (h) |
|---|---|---|
| normaal | 64,081 | 0,00 / 0,50 |
| koud_leeg | 3,795 | 167,23 / 167,92 |
| vol | 64,005 | 0,00 / 0,00 |
| broker | 64,081 | 0,00 / 0,50 |
| sensorbias | 63,277 | 0,00 / 26,20 |
| stop_herstel | 64,020 | 0,00 / 2,20 |
| wp_storing | 64,797 | 0,00 / 0,50 |
| waterlek | 64,076 | 0,00 / 0,23 |
| pompfout | 64,076 | 0,00 / 0,23 |
| drink_leeg | 63,275 | 0,00 / 0,50 |
| h2_reserve | 39,334 | 69,38 / 63,17 |
| h2_water_leeg | 64,081 | 0,00 / 0,50 |
Detectie slaagt terwijl klimaatdienst faalt
Dinsdag +3 °C meetbias geeft INNOVATIE en nul convectorvraag. Geen perfecte meting vervangt de fout. De plant koelt en mist 26,2 h modulecomfort. Detectie, begrensd gedrag en beschikbaarheid zijn verschillende eisen.
De tegenproef biedt meting 19 °C en model 19 °C bij fictieve waarheid 18 °C. De poort accepteert: absolute juistheid ontbreekt. Een onafhankelijke referentie, plaatsings-/ijkproef en onzekerheidsbegroting zijn nodig. Twee gelijke sensoren of foutmodellen zijn niet vanzelf onafhankelijk.
Water, voeding en herstel geven concrete tekorten
Bij pompfout blijft flow nul; de eerste motoropdracht kost wel energie. De tweede actieve controle stopt verdere pompactie. Het lek blijft na het ideale 24 L-contact doorlopen; woensdag bijvullen dicht niets. Drink_leeg levert slechts 70 L en mist 420 L gevraagde dienst. Een juiste NFT-balans herstelt geen drinkwater.
Stop_herstel bewaart vergrendeling, loslaten, voedingsverlies, terugkeer, menselijke reset en nieuw verzoek. De aparte ventilatietak blijft daar gevoed. Koud_leeg mist echter 4,268911 kWh kritieke DC-dienst. Minder ventilatieverlies maakt de algebra warmer maar het leefmilieu niet geldig. Luchtkwaliteit/veilige verblijfstijd zijn niet berekend.
| Proef | Concrete dienst |
|---|---|
| drink_leeg | 70 L geleverd, 420 L niet geleverd |
| pompfout | Werkelijke flow nul; lokaal flowalarm |
| stop_herstel | Aparte ventilatietak gevoed |
| koud_leeg | Kritieke DC-dienst ontbreekt |
Volle banken en de eindige winddump
- Nominale weerstand 16,6 Ω / 3 kW
- Overtoerenspanning als aparte audit: 245 V
- Nominale energieafregeling en de open fysieke grens
- 1PV wordt eerst afgeregeld. H₂ krijgt alleen door lek ontstane ruimte; windrest gaat naar de nominale dump.
- 2Maximale modeldump=2341,133 W; totaal vóór buck=361,777 kWh.
- 3Rechtstreeks 245²/16,6=3615,964 W overschrijdt de 3 kW-rating. De modelweek bevat geen thermische weerstandstemperatuur of mechanische toerentaldynamiek.
Forecast-invoer: beschikbaar vóór waarheid
| Veld | Beschikbaar | Gebruik |
|---|---|---|
| plan_tijd / doel_dag | 20:00 vóór volgende kalenderdag | horizonbewijs |
| prognose_T_C / prognose_zonuren | planmoment | uitsluitend deze weersfeatures |
| gerealiseerd weer | na doeldag | forecastfout achteraf |
| vraag_ref_kWh / pv48_kWh | na doeldag | oude trainlabels / latere scores |
| laatste_complete_* | doeldag minus twee | gelijke horizon basislijn |
| Actuele E48/SOC/toestand | nu | reserveheuristiek, geen toekomstmeting |
Een forecast-demonstratie met synthetische brondata
219 historische en zeven weekdagen. Na twee basislijn-opwarmdagen: 147 train, 35 validatie, 35 test. Fit 03-08–27-12-2020; validatie 28-12–31-01; test 01-02–07-03-2021 achteraf. Geen 07-03-label is nodig bij het eerste plan op 07-03 om 20:00.
Features: max(12−Tprognose,0), max(3−Tprognose,0)² en prognosezonuren. Alleen train bepaalt schaal en fit. NumPy least squares past twee regressies met intercept. Niet-negativiteit en proefgebied −15–30 °C liggen vooraf vast; test past niets aan.
De referentievraag is een apart synthetisch functieprofiel met ruis, niet dezelfde als fysica/PID/dispatch van de stationsweek. Scores bewijzen de procedure, geen operationele stationnauwkeurigheid. E41/e43 met gerealiseerd weer bewijzen ook geen dag-vooruitfout.
| Tijddeel | Datums / count |
|---|---|
| Train | 03-08–27-12-2020; 147 |
| Validatie | 28-12–31-01; 35 |
| Test achteraf | 01-02–07-03-2021; 35 |
Fit, tijdsplit en score blijven apart
Realisaties blijven uit features. De basislijn gebruikt de laatst complete dag, niet de onvolledige huidige dag om 20:00. Dit pakket gebruikt validatie niet voor modeltuning. Exacte datumgrenzen staan in JSON.
def voorspellers(c, archief): data = archief[2:219] # 217 verleden-dagen, week geen trainingsdata train, val, test = data[:-70], data[-70:-35], data[-35:] assert train[-1]["doel_dag"] < "2021-03-07" def features(r): t, s = float(r["prognose_T_C"]), float(r["prognose_zonuren"]) return [max(12-t, 0), max(3-t, 0)**2, s] X = np.array([features(r) for r in train]) mean, scale = X.mean(axis=0), X.std(axis=0) scale[scale == 0] = 1 def ontwerp(rows): x = np.array([features(r) for r in rows]) return np.column_stack([np.ones(len(rows)), (x-mean)/scale]) Y = np.array([[float(r["vraag_ref_kWh"]), float(r["pv48_kWh"])] for r in train]) beta = np.linalg.lstsq(ontwerp(train), Y, rcond=None)[0] def voorspel(r): try: x = np.asarray(features(r), dtype=float) except (ValueError, TypeError, KeyError): return None if not np.isfinite(x).all(): return None # Extrapolatie buiten het verstrekte proefgebied: onthouding. if float(r["prognose_T_C"]) < -15 or float(r["prognose_T_C"]) > 30: return None pred = np.r_[1, (x-mean)/scale]@beta return np.maximum(pred, 0).tolist() scores = {} for naam, rows in (("validatie", val), ("test", test)): y = np.array([[float(r["vraag_ref_kWh"]), float(r["pv48_kWh"])] for r in rows]) yp = np.maximum(ontwerp(rows)@beta, 0) base = np.array([[float(r["laatste_complete_vraag_kWh"]), float(r["laatste_complete_pv48_kWh"])] for r in rows]) scores[naam] = {"dagen": len(rows), "model_RMSE_kWh": np.sqrt(np.mean((yp-y)**2, axis=0)).tolist(), "basis_RMSE_kWh": np.sqrt(np.mean((base-y)**2, axis=0)).tolist(), "prognose_T_RMSE_K": math.sqrt(np.mean([ (float(r["prognose_T_C"])-float(r["gerealiseerd_T_C"]))**2 for r in rows])), "prognose_zonuren_RMSE_h": math.sqrt(np.mean([ (float(r["prognose_zonuren"])-float(r["gerealiseerde_zonuren"]))**2 for r in rows]))} return {"train_dagen": len(train), "train_van": train[0]["doel_dag"], "train_tot": train[-1]["doel_dag"], "validatie_van": val[0]["doel_dag"], "validatie_tot": val[-1]["doel_dag"], "test_van": test[0]["doel_dag"], "test_tot": test[-1]["doel_dag"], "scores_status": "ACHTERAF_SYNTHETISCH", "beta": beta.tolist(), "mean": mean.tolist(), "scale": scale.tolist(), "scores": scores}, voorspel| 35 testdagen | Vraag-RMSE (kWh) | PV48-RMSE (kWh) |
|---|---|---|
| prognosemodel | 0,585154 | 2,534111 |
| laatste complete dag | 1,116428 | 5,479448 |
Weerforecastfout apart: 2,005657 K en 0,569032 h zonuren.
Een voorspelling wordt een begrensd voorstel
- Emin=2,4 kWh; ηd=0,96
- Lokale grenzen 19–21 °C; fallback 20 °C
- Voorstel en onthouding
- 1Reserve=(6−2,4)×0,96=3,456 kWh. Tekort 9−2=7 kWh is groter; de eenvoudige supervisor stelt 19 °C voor.
- 2De lokale eigenaar toetst het bericht. De Pi verandert geen stop-, cel-, vlotter- of veiligheidsgrens. Dit is een reserveheuristiek, geen optimaal EMS.
- 3Ontbreekt/NaN/buitengebied geeft null/status en lokaal 20 °C. Onverwachte kou of een verkeerde vraagreferentie kan alsnog diensttekort geven. De reserveproef toont dat.
FMEA stopt niet bij detectie
Een FMEA verbindt oorzaak, lokaal effect, systeemeffect, barrière, proef en restbewijs. Ernst/optreden/detectie zijn ordinale bespreekschalen, geen FIT uit verzonnen incidenten. Gedeelde voeding/modelbias/contactorfout kan meerdere barrières raken.
| Faalwijze → effect | Barrière / bewijs | Restbewijs en eigenaar |
|---|---|---|
| Meetbias → warmte uit → koude module | D-01, biasweek/T-03 | ijking/modelbias; meetbeheer |
| NFT-lek → laag peil / teeltdienst weg | W-02-vlotter; lekweek | contact/retour/lekkage; waterbeheer |
| Koude bank → laadverbod / tekorten | E-03; koud_leeg | opstelling/celrating; elektrisch beheer |
| Contactor vast → actuator blijft aan | V-01-feedback weigert reset | echte uitschakelproef; bevoegd ontwerper |
| Pi/herstart → oud setpoint | D-02/D-04-replayregister | duurzame opslag/klok/security; software |
| Dump heet/open → overtoeren | E-05-rekenlimiet | thermiek/remcurve; aandrijfbeheer |
| H₂-water op → productie nul | H-02-voorraad; lege-proef | kwaliteit/gasveiligheid; procesbeheer |
Een foutboom voor leefdienst bevat onder meer gemeenschappelijke voedingsuitval van ventilatie en warmte. Twee detectiekansen vermenigvuldigen vraagt aantoonbare onafhankelijkheid. Dit pakket levert geen gevalideerde stationsuitvalkans.
Acceptatieboek: aangetoond, niet gehaald en open
| Bewijs | Uitkomst | Besluit |
|---|---|---|
| Conservatie | alle rail-/water-/H₂-/warmtebalansen sluiten | model geslaagd |
| Normale dienst | woon voldoet; module 0,5 h tekort | T-03 deels niet gehaald |
| Bias | afgewezen; 26,2 h moduletekort | D-01 slaagt, T-03 niet |
| H₂-reserve | 33,266896 kWh retour; 69,38 h woontekort | autonomie niet aangetoond |
| 4,48 kVA / aanloop | noodwarmte geweigerd / 132,506 A | selectie slaagt; dienst ontbreekt |
| Winddump | 3615,964 W >3000 W | fysiek open |
| Biologisch/medisch | geen passende praktijkvalidatie | geen behaalde voorziening |
S1 naar S2 met dezelfde grens
- [0,20) jaar; batterijleven 10 jaar
- 100 kg CO₂-eq/kWh; netfactor 0,15 kg/kWh
- Herberekening zonder week×52/dubbeltelling
- 1Pakketten op 0 en 10: 2×100B/20=10B kg/jaar. Overige S1-post inclusief I200=708,68 kg/jaar.
- 2S1=808,68; S2=708,68+120+0,15×300=873,68 kg CO₂-eq/jaar; twintigjarig 17473,6 kg.
- 3Functionele eenheid: één gemiddeld jaar gespecificeerde geplande dienst van station plus één module. De week bewijst geen gelijkwaardige jaardienst. I500 is een scenario, geen winterweek×52.
Volledige S2-kalenderinventaris
| Post | Pakketten in [0,20) | Productie (kg CO₂-eq) |
|---|---|---|
| hout | 1 | 312,00 |
| staal | 1 | 750,00 |
| beton | 1 | 240,00 |
| isolatie | 1 | 450,00 |
| modulegebouw | 1 | 650,00 |
| modulerek/water | 2 | 220,00 |
| PV12 | 1 | 840,00 |
| PV48 | 1 | 2520,00 |
| batterij12 | 3 | 921,60 |
| lamp12 | 3 | 300,00 |
| elektronica12 | 2 | 120,00 |
| wind | 1 | 650,00 |
| WP | 2 | 1600,00 |
| H2 | 2 | 2000,00 |
| elektronica48 | 2 | 300,00 |
| batterij48 | 2 | 2400,00 |
| Overige twintigjarige post | kg CO₂-eq |
|---|---|
| transport | 300,00 |
| eind | 500,00 |
| verbruiksmateriaal | 600,00 |
| netimport | 1500,00 |
| overig_gebruik | 300,00 |
Levensduur en import zijn echte sensitiviteiten
Count=ceil(H/L): leven 8 jaar vraagt pakketten op 0,8,16; leven 10 jaar op 0,10. Een pakket op precies 20 valt buiten de grens. Het pakket berekent 18 combinaties B8/12/16, I200/500/1000 en leven 8/10. De grafiek toont 10 jaar; bij 8 jaar verandert 10B in 15B.
B12/I500: 933,68 tegenover 873,68 kg/jaar, verschil 60. Werkelijke EPD, veroudering, randapparatuur en import kunnen de rangorde veranderen. Screening is geen productverklaring; veiligheid en gelijke dienst blijven voorwaarden.
def lca(c, B, I, leven=10): H = c["lca_horizon_jaar"] posten = [("hout", 1200, .26, 30), ("staal", 300, 2.5, 30), ("beton", 2000, .12, 30), ("isolatie", 150, 3, 30), ("modulegebouw", 1, 650, 30), ("modulerek/water", 1, 110, 15), ("PV12", 1.4, 600, 25), ("PV48", 4.2, 600, 25), ("batterij12", 3.072, 100, 8), ("lamp12", 2, 50, 8), ("elektronica12", 1, 60, 10), ("wind", 1, 650, 20), ("WP", 1, 800, 15), ("H2", 1, 1000, 10), ("elektronica48", 1, 150, 10), ("batterij48", B, 100, leven)] inventaris = [{"post": n, "hoeveelheid": q, "factor": f, "leven_jaar": L, "aantal": math.ceil(H/L), "kg": q*f*math.ceil(H/L)} for n, q, f, L in posten] overige = {"transport": 300, "eind": 500, "verbruiksmateriaal": 30*H, "netimport": I*.15*H, "overig_gebruik": 15*H} totaal = sum(r["kg"] for r in inventaris)+sum(overige.values()) return {"B_kWh": B, "import_kWh_jaar": I, "leven_jaar": leven, "inventaris": inventaris, "overige": overige, "kg_20jaar": totaal, "kg_jaar": totaal/H}Biologie en gezondheid houden hun eigen bewijslast
Een juiste energie-/waterbalans sluit geen voedsel-, ademgas- of gezondheidskring. E29 kiest geen ras/DNA-ingreep. E30-target-PCR bewijst geen algemene drinkbaarheid/infectiviteit; negatieve monsters met falende controle zijn oninterpreteerbaar. E31-Monod, e32-pools en e04/i05-testreservoir zijn aparte lesmodellen, geen NFT-productiereactor.
| Aansluiting | Concrete grens | Restonderzoek |
|---|---|---|
| e31-balans met NH₃-N | 1,68 kg O₂/d →1,23 kg droog / 2,20 kg CO₂ | licht, voedingsbron, respiratie, zuivering |
| Bewoners-CO₂ | 2,00 kg/d →maximaal 1,527273 kg O₂/d | geen stille sluiting met andere biomassa/N-bron |
| 5 cm-lichtscenario | 133,617 m² / 213,787 kWh/d alleen lampen | geen gekozen ademgasinstallatie |
| e32-ecologie | g-N-poolbalans geen stationvalidatie | inventaris/meting/respiratie/buffering |
| e33-monitor | synthetische ECG/puls/SpO₂ | geen diagnose, dosering of behandeling |
B-01 bewaart deze grenzen. Een dashboard toont onderzoek met bronstatus; het geeft geen onbewezen zorg-/levensondersteunende functie vrij. Een gunstige synthetische fout is geen klinisch nauwkeurigheidsbewijs.
Onderhoud en proof-tests hebben een terugweg
- StopVrijgave en de volledige contracttests
- Veilige mock-contactfeedback, geen installatiebelasting
- 1Start vergrendeld en leg een verzoek-uit/contact-uitpaar vast.
- 2Injecteer stop, loslaten, voedingsverlies en spanning terug.
- 3Probeer reset met verzoek aan en met contact aan; laat de knop los en herstel voorwaarden.
- 4Geef een nieuwe gezonde resetflank; activeer daarna pas met een afzonderlijk nieuw verzoek.
Onderhoud begint met toestand, bevoegdheid en isolatieplan en eindigt met controle en nieuwe vrijgave. Een software-uitcommando bewijst geen spanningsloze DC-installatie. De e19-richtwaarde 120 V garandeert geen veilige aanraking/onderhoud; bescherming en veilige toestand vragen bevoegd ontwerp.
| Proef | Voorbereiding en bewijs | Herstelcriterium |
|---|---|---|
| Stop/contactfeedback | veilige proeflast; echte terugmeldingen | gezonde resetflank; nieuw verzoek apart |
| 24 L-vlotter/druk | bekende volumes; aparte contactroute | lekvrij, peil/debiet plausibel |
| Koudeladen/celvenster | gecontroleerde BMS-proef binnen fabrikantgrens | geen lading buiten venster |
| Replay/powercut | opslagadapter, veilig moment | duurzaam register; oud seq geweigerd |
| WP/noodlast | storingsadapter, P/Q/S/stroom/temperatuur | herstel zonder ongecontroleerde I-opbouw |
| Winddump/rem | bevoegde dynamische/thermische opstelling | remcurve en puls-/duurbelasting |
Een testinterval volgt uit gebruik/faalmechanisme/detectie, niet uit een verzonnen jaarlijks keuringsbewijs. Noteer eigenaar, versie, meetmiddelen, criteria, afbreekconditie, uitkomst en terugkeerprocedure. Een gefaalde test opent een eis.
Planning, rollen en wijzigingsbeheer
De 14-wekenlesplanning reserveert herstelruimte. Rollen: systeemverantwoordelijke, fysica/data, lokale software, proefleiding en kritische reviewer. Eén leerling mag rollen combineren; review vraagt een andere blik. De 55 lestijden zijn een richtwaarde voor studie en geselecteerde projecttaken, geen identieke verplichte route door alle keuzetaken.
Interfacefreeze volgt eis-/risicoreview; codefreeze vóór integratie. Iedere wijziging noemt aanleiding, eis-IDs, configversie, saldi, nieuwe tests en besluit. Wijzig B/import →L-01 herberekenen; wijzig ventilatie →bestaande Hvent vervangen. Een nieuw schema zonder gewijzigd model is geen complete wijziging.
Een eindrapportpassage scheidt resultaat van besluit
- Code/config/invoerhashes; twaalf volledige logs
- Eis→proef→bewijs→besluit
- Een controleerbare passage
- 1Resultaat: warmteknopen en rails sluiten; normale module mist 0,5 h. Verwijs T-03 naar normaal.csv/resultaten.json, tijdcontract en figuur.
- 2Grens: geen jaarrond kalibratie; ideale woon-/WP-sensor; vast Cb bij waterverlies. B-01 en fysieke E-03/E-05/V-01 blijven open.
- 3Besluit: aanvaard als reproduceerbaar onderwijsontwerp, niet als zelfstandig bewoonbare installatie. 5232 W-aanloop is afgewezen op 132,506 A. Eerst starter/lastvariant toetsen; een aangepaste ochtendregeling vraagt nieuwe T-03-run met 800 W-grens.
Verdediging en eindrubric
Toon een live normale run, een gekozen foutinjectie en één niet-gehaalde eis. Verklaar fluxteken, berichtweigering en LCA-grens. Live code vervangt redenering niet; tekst zonder schone-maprun mist Q-01.
| Criterium | Gewicht | Volledig bewijs |
|---|---|---|
| Eisen/architectuur/traceerbaarheid | 20% | IDs, eigenaren, interfaces en besluiten |
| Fysisch/numeriek model | 25% | eenheden, tekens, grenzen, residu/convergentie |
| Regeling/fouten/bevoegdheid | 20% | werkelijke acties, negatief bewijs en herstel |
| Forecast/data/impact | 15% | tijd/horizon, basislijn, onthouding, S1→S2 |
| Reproductie/rapport/verdediging | 20% | complete run, hashes en eigen redenering |
Niveau per criterium: 0 ontbreekt/onjuist; 1 gedeeltelijk zonder bewijs; 2 juist maar onvolledig; 3 volledig controleerbaar; 4 kritisch met geldige alternatieven/tegenproef. Score=Σ gewicht×niveau/4. Een gemiddelde geeft geen verborgen fysieke of medische functie vrij. Toekomstlabels, verzwegen grens of onbewezen autonomie wijzen de betrokken eis af. Eerlijke negatieve uitkomsten kunnen juist sterk systeemdenken tonen.
Alle Expert-leerlijnen komen in één besluit samen
Wiskunde levert vergelijkingen/regressie/foutmaten; fysica warmte/stroom/vermogen; software invarianten/bevoegdheid; biologie voorkomt een onterechte gesloten-kringclaim. F33/I40 bieden eerdere projectroutes. Expert voegt negatieve bewijzen, forecastbeschikbaarheid en levenscyclusgrens toe.
Deze digitale tweeling is een versieerbaar simulatiemodel met synthetische gegevens. Kalibratie aan een echte installatie vraagt meetplan, identificatie, hardwareinterfaces en validatie. ‘Habitat is compleet’ betekent hier dat de ontwerp-/bewijsroute volledig is uitgewerkt.
moduleknopen
sensorvertraging versus filter
stop/herstart
rail en chemische grens
assaygrenzen
stoichiometrie/licht
pools en systeemgrens
meetclaims
tracking
kwaliteit en gedeelde fout
inventaris
rapport/verdediging
Het brein is een gecontroleerd onderwijsontwerp met zichtbaar nog niet vrijgegeven functies.
Bestanden en primaire methodebronnen
| Bron | Betekenis |
|---|---|
| habitat_brein.py | SHA256 e0eb095e35f1586cb3177eeb412b68344f7057203f06251410049ea458f08108 |
| config.json | Canonical SHA256 79162d53dead19c58f257c78d9ab3803e9bd56e4f5c28495b2e8799dbd170a09 |
| CSV’s / logs | invoerhashes in JSON; vaste seed en intervalcontract |
| NASA SE Handbook D/E/I | eis-/verificatie-/validatieplan; 30-09-2026 |
| OASIS MQTT 5.0 | transport/session/expiry; 30-09-2026 |
| NumPy least squares | primaire API-methode; getest 2.4.0 |
| E16/E17/E21/E27/E30–E33/E47 | primaire inhoudsbronnen en modelgrenzen in die hoofdstukken |
In het kort
- Een eis krijgt eigenaar, testcase, bewijs, besluit en restonderzoek.
- Twee energierails en afzonderlijke water-/warmtevoorraden verhinderen verborgen stromen en dubbeltelling.
- De digitale tweeling sluit numeriek, maar comfort, hardware en modelgebied hebben eigen grenzen.
- Lokale eigenaars, kwaliteit, TTL/replay en stopdominantie blijven actief zonder centrale voorspeller.
- Forecast gebruikt alleen eerder beschikbare data; screening-LCA behoudt dezelfde grens en geplande functionele dienst.
- Een reproduceerbaar negatief resultaat is bruikbaar bewijs; autonomie, biologie en medische toepassing vragen passende validatie.
Wat je nu kent
- acceptatieboek
- Overzicht van eis, bewijs, besluit en nog vereist onderzoek.
- lokale eigenaar
- De taak die een actuator zelfstandig begrenst en voorstellen kan weigeren.
- proefconfiguratie
- Benoemde verzameling parameters die geen installatiekeuze bewijst.
- tijdlek
- Gebruik van informatie die op het bedoelde planmoment nog niet beschikbaar was.
- tracking anti-windup
- Terugvoer van werkelijk geleverde actie naar de integrale toestand.
- bewijsgrens
- Het toepassingsgebied waarbinnen een berekening of proef een claim ondersteunt.