Wateranalyses controlesysteem

Een van de mooiste en meest waardevolle projecten waaraan ik heb meegewerkt. Voor een van de grootste drinkwaterbedrijven van Nederland heb ik bijgedragen aan de ontwikkeling van een intern systeem dat waterkwaliteitsmetingen borgt en tegelijkertijd het onderliggende bedrijfsproces optimaliseert.

Quality control system for water analyses - Main.png

Project informatie

Start
maart 2024
Einde
juli 2025
Complexiteit
9 / 10
Team grote (Ontwikkelaars)
3
Type
QAS
Stack
C# Javascript HTML & CSS SQL PowerShell YAML Entity Framework Core xUnit / NUnit MudBlazor .NET Blazor GIT IIS Scrum Kanban CI/CD DevOps

Over het project

Voor een van de grootste drinkwaterbedrijven van Nederland heb ik meegewerkt aan de ontwikkeling van een nieuw intern systeem dat de betrouwbaarheid en integriteit van waterkwaliteitsmetingen borgt. Het bedrijf levert dagelijks schoon drinkwater aan miljoenen inwoners en voert daarnaast onafhankelijke metingen uit voor een groot aantal externe klanten. De nauwkeurigheid en betrouwbaarheid van deze data zijn daarom cruciaal.

Het project had in de eerste fase als doel het grote aantal bestaande Excel processen met complexe macro’s te vervangen door een centraal, controleerbaar en reproduceerbaar systeem. Het resultaat is een applicatie die volledige meetruns analyseert, correcties toepast op basis van interne standaarden en automatisch controleert of eerste lijns controlemonsters met bekende stoffen correct worden teruggevonden. Afwijkingen worden expliciet gesignaleerd, waarna analisten de resultaten gecontroleerd kunnen beoordelen en vrijgeven richting het LIMS systeem. Daarmee is niet alleen de efficiëntie verhoogd, maar ook de betrouwbaarheid en traceerbaarheid van het proces.

Na de succesvolle afronding en inproductiename van de eerste fase is het systeem verder uitgebreid met een tweede fase. Deze fase richtte zich op Non Target Screening, waarbij veel grotere en complexere datasets uit analyse instrumenten worden verwerkt. Waar de eerste fase vooral gericht was op het borgen en vrijgeven van bekende meetresultaten, lag in fase twee de nadruk op het analyseren, corrigeren, herkennen en beoordelen van onbekende of verdachte componenten in watermonsters.


Het team, mijn rol en de samenwerking

Het team bestond uit een senior lead developer, een tweede ontwikkelaar, een tester en een product owner vanuit de klantorganisatie. Ongeveer drie maanden na de start van het project ben ik fulltime aangesloten. De actieve ontwikkelfase van de eerste fase duurde daarna nog circa een jaar.

Mijn rol ging verder dan alleen ontwikkelen. In nauwe samenwerking met analisten werkten we vaak vanuit bestaande Excel schermen en macro’s als vertrekpunt. Die hebben we niet één op één overgezet, maar kritisch geanalyseerd en opnieuw ontworpen met als doel de onderliggende bedrijfsprocessen te optimaliseren. Het ging daarbij niet alleen om digitalisering, maar om het structureren, vereenvoudigen en toekomstbestendig maken van een kritisch werkproces. Hierdoor waren we intensief betrokken bij het functioneel ontwerp, de workflow en de gebruikerservaring, waarbij we veel vertrouwen en ruimte kregen om inhoudelijk mee te denken.

Na het vertrek van de senior lead developer heb ik richting het einde van de eerste fase, vlak voor de inproductiename, de verantwoordelijkheid voor het project op mij genomen. Kort daarna is het systeem gefaseerd in productie genomen, wat gecontroleerd en zonder noemenswaardige verstoringen verliep.

Voor de tweede fase heb ik de verantwoordelijkheid voor het traject in zijn geheel gekregen. Dit betekende dat ik niet alleen betrokken was bij de technische uitwerking, maar ook bij het vertalen van de inhoudelijke analyseprocessen naar een werkbare applicatiestructuur. Samen met de analisten heb ik de bestaande werkwijze rond Non Target Screening onderzocht, uitgewerkt en vertaald naar domeinlogica, schermen, validaties en verwerkingsstappen. Daarbij was het belangrijk om de wetenschappelijke correcties en controles betrouwbaar te implementeren, maar ook inzichtelijk te houden voor de gebruikers.


Inhoudelijke werking van het systeem

Het systeem ondersteunt het volledige analyseproces van laboratoriumruns en borgt daarbij de kwaliteit en integriteit van de meetresultaten van diverse meetinstrumenten en methoden. Een run bestaat uit een reeks monsters die gezamenlijk op een analysemachine worden verwerkt. Binnen zo’n run bevinden zich verschillende typen monsters, elk met een specifieke rol binnen de kwaliteitsborging.

Naast klantmonsters bevat een run onder andere eerste lijns controlemonsters, blanco monsters en monsters met interne standaarden. Deze worden niet alleen individueel beoordeeld, maar altijd in samenhang met de volledige run. De kwaliteit van één meting staat namelijk niet op zichzelf; de betrouwbaarheid wordt bepaald door het totaalbeeld.

Op basis van interne standaarden worden correctiefactoren berekend en toegepast op de gemeten waarden. Blanco monsters worden gebruikt om eventuele vervuiling of carry over te signaleren. Vervolgens voert het systeem geautomatiseerde validaties uit op zowel monster als run niveau. Denk hierbij aan controles op acceptatiegrenzen, onderlinge consistentie en afwijkingen ten opzichte van historische of statistische verwachtingen.

Wanneer een run niet aan de gestelde criteria voldoet, wordt dit expliciet gesignaleerd. De analist krijgt inzicht in de afwijkingen en kan onderbouwd besluiten tot vrijgave, correctie of afkeur. Pas na deze validatiestap worden de eerste lijns controlemonsters verwerkt in de ELC kaarten en worden de definitieve resultaten weggeschreven naar het LIMS systeem.

Daarnaast faciliteert het systeem periodieke rapportages en jaarevaluaties, waarmee trends en structurele afwijkingen inzichtelijk worden gemaakt. Hierdoor ondersteunt het niet alleen de dagelijkse operatie, maar ook structurele kwaliteitsbewaking op langere termijn.

In de tweede fase is hier een Non Target Screening uitbreiding aan toegevoegd. Deze uitbreiding verwerkt meetdata uit gespecialiseerde analyse software en ondersteunt het beoordelen van grote hoeveelheden features die in watermonsters worden aangetroffen. Daarbij worden onder andere interne standaarden gezocht, retentietijden gecorrigeerd, massa afwijkingen berekend en correcties toegepast op basis van regressielijnen. Ook worden afwijkingen automatisch gesignaleerd wanneer correcties buiten de vastgestelde grenzen vallen.

Deze uitbreiding maakt het mogelijk om complexe ruwe meetdata op een reproduceerbare manier om te zetten naar bruikbare informatie voor analisten. Het systeem ondersteunt daarbij het herkennen van bekende componenten, het beoordelen van nieuwe of verdachte features en het vastleggen van statistieken per monster en run. Hierdoor ontstaat een beter controleerbaar proces voor een analysevorm die van nature veel complexer en minder voorspelbaar is dan reguliere doelstofanalyses.

De kracht van het systeem zit in de combinatie van geautomatiseerde validatie, transparante besluitvorming en menselijke controle. Daarmee wordt geborgd dat meetresultaten niet alleen technisch correct zijn, maar ook uitlegbaar, reproduceerbaar en aantoonbaar betrouwbaar.


Architectuur en technische keuzes

Gezien de complexiteit van de domeinlogica is bewust gekozen voor een architectuur die scheiding van verantwoordelijkheden afdwingt en langdurige onderhoudbaarheid ondersteunt. De applicatie is opgezet volgens Clean Architecture, waarbij de kern van het systeem, de validatie en correctielogica, volledig losstaat van infrastructuur en presentatie. Hierdoor blijft de domeinlogica leidend en testbaar, onafhankelijk van technische implementatiedetails.

Binnen de applicatielaag is gekozen voor een CQRS aanpak in combinatie met MediatR. Commands en queries zijn expliciet gescheiden, waardoor use cases helder zijn afgebakend en de verwerkingsstappen van een run transparant blijven. Dit sluit goed aan bij een systeem waarin traceerbaarheid en controle essentieel zijn.

Verder is voor de data laag Entity Framework Core gebruikt, met een zorgvuldige modellering van runs, monsters, meetresultaten en features waarbij samenhang en performance centraal staan. De front end is gebouwd met Blazor WebAssembly en de applicatie wordt gehost in IIS, ondersteund door een CI/CD pipeline voor gecontroleerde en reproduceerbare deployments, inclusief database migraties.

Voor de tweede fase is de bestaande architectuur verder benut en uitgebreid om de complexere Non Target Screening processen goed te kunnen ondersteunen. Daarbij was het belangrijk dat importlogica, correctieberekeningen, validaties, statistieken en gebruikersinteractie duidelijk gescheiden bleven. Hierdoor konden de complexe berekeningen rondom interne standaarden, massa correctie en retentietijd correctie geïsoleerd worden getest en onderhouden, zonder dat de rest van het systeem onnodig complex werd.

De gekozen architectuur en stack ondersteunen daarmee wat voor dit systeem het belangrijkst is: betrouwbaarheid, testbaarheid en langdurige beheersbaarheid van complexe domeinlogica.


Terugblik

Voor mij is dit een erg bijzonder project geweest. De complexe materie, de sterke samenwerking en het actieve meedenken over het functionele ontwerp maakten het inhoudelijk en technisch zeer uitdagend. Gedurende het traject kregen we veel vertrouwen en vrijheid om het systeem zorgvuldig uit te werken, wat heeft geleid tot een succesvolle gefaseerde livegang en een stabiel eindresultaat.

Dat ik aan het einde van de eerste fase de verantwoordelijkheid kreeg vlak voor de inproductiename, en daarna de volledige verantwoordelijkheid kreeg voor de tweede fase, maakte het project voor mij extra waardevol. Het gaf mij de kans om niet alleen technisch bij te dragen, maar ook richting te geven aan de verdere ontwikkeling van een kritisch systeem binnen een complex domein.

De tweede fase maakte het project inhoudelijk nog interessanter. Non Target Screening vraagt om een combinatie van softwareontwikkeling, domeinkennis, statistiek, correctielogica en nauwe afstemming met analisten. Juist die combinatie van technische diepgang en directe impact op een belangrijk kwaliteitsproces maakt dit voor mij een van de mooiste en meest waardevolle projecten waaraan ik heb mogen meewerken.


Opmerking: Vanwege de aard van het systeem en de gevoeligheid van de onderliggende data ben ik beperkt in wat ik publiekelijk kan delen. Daarom bevat deze website geen schermafbeeldingen, codevoorbeelden of technische detailuitwerkingen over dit project.