Eten op inspanning, niet op de klok — zo werkt Smart Fueling in WattLog.pro
Elke wielrenner kent het advies: eet elke 45 minuten. Elke wielrenner die ooit een zware intervaltraining heeft gedaan, weet ook dat het niet klopt. Een drempeltraining van 60 minuten verbrandt meer koolhydraten dan een herstelrit van 90 minuten, en een timer ziet het verschil niet. Het moment waarop je merkt dat je had moeten eten, is het moment waarop het te laat is: je zit midden in een blok, handen aan het stuur, en de hongerklop komt twintig minuten later.
Ik bouw WattLog.pro in mijn eentje: een trainingsplatform met live sensordata, gestructureerde workouts die een smart trainer in ERG-modus aansturen, en gesimuleerde GPX-routes. Er was al een instelling „herinner me elke X minuten aan eten”, en toch vergat ik steeds te eten — omdat de herinnering niets te maken had met hoe hard ik reed. Zo heb ik die vervangen door iets dat daar wél rekening mee houdt.
Timer tegenover wat je echt verbrandt
Dezelfde renner, drie verschillende trainingen. Een „elke 45 minuten”-timer behandelt ze volgens de klok, Smart Fueling volgens hoeveel koolhydraten er echt uit de tank zijn gegaan:
| Training | Duur | Verbrande koolhydraten* | Timer elke 45 min | Smart Fueling** |
|---|---|---|---|---|
| Herstel, 50% FTP | 1 u 30 min | ca. 70 g | 2 herinneringen | 1 melding |
| Duur, 65% FTP | 2 u | ca. 160 g | 2 herinneringen | 2 meldingen |
| Drempel, 90% FTP | 1 u | ca. 155 g | 1 herinnering | 2 meldingen |
* Renner met een FTP van 250 W, gelijkmatig gereden, berekend met de curve hieronder (1 kJ ≈ 1 kcal, 4 kcal per gram koolhydraten). ** Standaarddrempel van 400 kJ, ervan uitgaande dat je bij elke melding eet.
Een uur op drempel verbrandt evenveel koolhydraten als twee uur duurtraining en meer dan het dubbele van anderhalf uur herstel — en juist daar herinnert de timer je het minst vaak aan eten.
Het signaal komt al binnen
Een vermogensmeter of smart trainer meldt meerdere keren per seconde het aantal watt. Vermogen maal tijd is mechanische arbeid in kilojoules, en fietsen kent een handig toeval. Getrainde wielrenners zetten voedingsenergie met een rendement van ongeveer 18–26% om in arbeid op de pedalen [1], en één kcal is 4,184 kJ. Bij een rendement van zo’n 24% heffen de twee factoren elkaar op:
Het is een benadering: het rendement verschilt per renner en stijgt met het vermogen [1, 2], dus de echte factor schuift een beetje de ene of de andere kant op. De berekening staat uitgebreider in kilojoules verbranden op de trainer. In mijn analyse na de rit zat dit al. Alleen tijdens de rit was het niet beschikbaar.
De kern van de engine is daarom een accumulator in de sessiemanager aan de serverkant. Elke vermogensmeting telt de arbeid sinds de vorige meting op (trapeziumintegratie), waarbij het gat tussen twee metingen is begrensd op 5 seconden, zodat een Bluetooth-onderbreking geen energie kan verzinnen. Gaat het totaal over een drempel (standaard 400 kJ, per atleet instelbaar), dan krijgt de renner de melding om te eten. De status staat in dezelfde Redis-sessiemetadata als de rest van een live rit, dus een herladen pagina of een nieuwe verbinding met een andere API-worker gaat verder waar het was, in plaats van de balk op nul te zetten.
Die eerste versie stond er snel en was al beter dan de timer. Maar hij zat er nog steeds op een interessante manier naast.
Niet elke kilojoule is gelijk
400 kJ in een rustig duurtempo en 400 kJ op drempel zijn evenveel arbeid, maar ze kosten niet evenveel brandstof. De inspanningsfysiologie noemt dit de „crossover”: bij lage intensiteit is vet de belangrijkste brandstof, en naarmate de intensiteit stijgt schuift het lichaam op naar koolhydraten, die bij zware inspanning domineren [3]. Studies met isotopentracers bij wielrenners laten hetzelfde beeld in detail zien: de oxidatie van spierglycogeen en bloedglucose stijgt met elke stap in intensiteit, terwijl de vetoxidatie piekt rond een gemiddeld vermogen en daarna daalt [4, 5]. Een balk die ruwe kilojoules telt, waarschuwt te laat op zware dagen en zeurt op rustige.
De oplossing is een curve: het aandeel koolhydraten in de energie als functie van de intensiteit ten opzichte van FTP.
De curve is stuksgewijs lineair: ongeveer 45% bij 55% van FTP, 65% bij 75%, 80% bij 95% en meer dan 90% boven FTP. Om duidelijk te zijn over de herkomst van deze getallen: het is mijn eigen benadering, gevormd naar de richting en de globale orde van grootte van de bovenstaande studies, geen waarden uit één enkel onderzoek. Die studies meten intensiteit ten opzichte van VO2max of maximale belasting, niet FTP, dus de vertaling is een technische schatting. De kilojoules van elke meting worden vervolgens gewogen met dat aandeel, ten opzichte van een gematigde referentie-inspanning:
brandstofbalk += kJ_toename × gewicht
Twee eigenschappen zijn hierbij belangrijk. Ten eerste is het gewicht bij een gematigde inspanning precies 1, dus de drempel behoudt zijn betekenis en bestaande instellingen gedragen zich niet ongemerkt anders. Ten tweede valt zonder FTP de intensiteit niet te beoordelen, dus valt de balk terug op ongewogen kilojoules in plaats van te gokken. In de praktijk vult rijden op 96% van FTP de balk nu bijna 1,8 keer zo snel als dezelfde hoeveelheid arbeid op 56%. Ken je je FTP niet, begin dan met een FTP-test.
De balk toont grammen, geen kilojoules. Renners denken in „één gel” of „ongeveer 30 g”, niet in kJ. De drempel wordt daarom weergegeven als een portie koolhydraten: 400 kJ × 65% ÷ 4 kcal/g is ongeveer 65 g verbrand, waarvan het de moeite waard is de helft aan te vullen — vandaar een portie van ongeveer 30 g.
Wanneer de app iets zegt
Een correct getal is niet genoeg als de melding op het verkeerde moment komt. Het meeste werk ging zitten in wanneer de app iets moet zeggen. Zo ziet de brandstofbalk tijdens de rit eruit in zijn drie toestanden:
De meldingen lopen via hetzelfde kanaal als de berichten van de coach: het berichtenpaneel, een toast op de telefoon, een geluid, en gesproken audio als spraakhints aanstaan. De rest zijn regels over wanneer de app je niet moet storen:
| Situatie | Wat Smart Fueling doet |
|---|---|
| Balk bereikt 75% van de drempel | Kleurt amber en vraagt je eten klaar te leggen |
| Balk bereikt 100% | „Eet nu” — herhaald elke 100 kJ tot je eet |
| Drempel overschreden boven 105% van FTP | Melding wacht tot het vermogen daalt — het interval wordt niet onderbroken |
| Route: 0,5 km vóór een klim van 4%+ (na 1 km+ vlak) | „Klim voor je, eet nu” |
| Afdaling steiler dan −5% of klim steiler dan 12% | Stilte — alle meldingen wachten |
| Tikken op „+Portie” | Haalt één portie van het tekort af in plaats van het op nul te zetten |
Het vasthouden tijdens een zware inspanning is een vlag die bij het overschrijden wordt gezet, geen live controle vermogen > 1,05 × FTP — de naïeve versie liet de banner bij elke pedaalslag van een zwaar interval aan en uit flikkeren. En de knop begon als „+Gel”, alsof gels het enige goede antwoord waren. Nu is het „+Portie”: ben je twee porties achter en eet je één keer, dan sta je er nog één achter.
Op een gesimuleerde GPX-route scant de engine bij de start het hoogteprofiel en zoekt het laatste rustige moment om te eten voordat de weg omhoog gaat:
De terreinvoorspelling leverde de bug op waarvan ik het blijst ben dat de tests hem vonden. Een waypoint dat binnen een stiltezone werd gepasseerd, werd overgeslagen maar bleef in de lijst staan. Omdat de triggervoorwaarde „gepasseerd tussen de vorige en de huidige positie” was, kon hij nooit meer afgaan: de melding ging stilletjes verloren. De fix laat een openstaand waypoint afgaan in de eerste tick na het einde van de stiltezone, en voegt meerdere gepasseerde waypoints samen tot één melding, zodat een verouderde nooit later in z’n eentje opduikt.
Vóór de rit: wat mee te nemen
De andere helft van de voeding gebeurt thuis. Vóór elke sessie van meer dan een uur toont de voorbereidingspagina een kaart met de koolhydraten en het vocht die je mee moet nemen — zonder een trainer te verbinden of iets te starten:
Deze rit duurt ongeveer 1 u 30 min. Neem ongeveer mee:
Bij een gestructureerde workout komt de energie rechtstreeks uit het plan: het doelvermogen van elke stap maal de duur geeft de exacte kilojoules, normalized power geeft de intensiteit, en dezelfde koolhydraatcurve wordt per stap toegepast. Een workout met zware versnellingen en rustige herstelblokken vraagt meer koolhydraten dan een gelijkmatige rit met hetzelfde gemiddelde vermogen, en de schatting houdt daar rekening mee. Een paar voorbeelden voor een renner met een FTP van 250 W op de trainer:
| Training | Energie | Koolhydraten mee | Vocht |
|---|---|---|---|
| Duur 1 u 30 min, 65% FTP | 878 kJ | 50–70 g | 1,2 l |
| Sweet spot 1 u 30 min, 88% FTP | 1188 kJ | 70–90 g | 1,2 l |
| Tempo 2 u, 75% FTP | 1350 kJ | 90–120 g | 1,6 l |
| Duur 3 u, 65% FTP | 1755 kJ | 95–145 g | 2,4 l |
Voor een GPX-route is er geen plan, dus gebruik ik het natuurkundige model waar de trainersimulatie al op draait: voor elk segment van 50 m het vermogen dat nodig is om de aangenomen snelheid vast te houden tegen zwaartekracht, rolweerstand en luchtweerstand, met het gewicht van de renner, het gewicht van de fiets, CdA, Crr en luchtdichtheid. Dit soort model is goed gevalideerd: in wegtests voorspelde het het gemeten vermogen met R² = 0,97 en een standaardfout van 2,7 W [6]. Afdalingen waarbij je niet hoeft te trappen tellen als nul arbeid. Een heuvelachtige route komt zo terecht duurder uit dan een vlakke van dezelfde lengte.
De getallen worden daarna een paklijst: ongeveer de helft van de verbrande koolhydraten, begrensd op wat de darm kan opnemen, en weergegeven als bereik, omdat één getal valse precisie zou suggereren. De grenzen volgen de huidige richtlijnen voor koolhydraatinname tijdens inspanning: één enkele koolhydraatbron kan tot ongeveer 60 g/u worden geoxideerd, en pas langere inspanningen rechtvaardigen ongeveer 90 g/u, met meerdere transporteerbare koolhydraten zoals glucose plus fructose [7]. Dezelfde richtlijnen zeggen dat de inname omlaag moet bij een lage absolute intensiteit — en dat is precies wat de intensiteitscurve doet. De factor „de helft van wat je verbrandt” is mijn eigen keuze, geen getal uit de literatuur.
Voor vocht wordt de zweettabel uit de analyse na de rit hergebruikt. Het plan raadt aan ongeveer 80% van het geschatte verlies te drinken, maar nooit meer dan 0,8 l/u:
| Intensiteit van de rit | Binnen | Buiten |
|---|---|---|
| Laag (IF < 0,65) | 1,0 l/u | 0,6 l/u |
| Gemiddeld (IF 0,65–0,85) | 1,4 l/u | 0,9 l/u |
| Hoog (IF > 0,85) | 1,8 l/u | 1,2 l/u |
Hier is de eerlijkste bron een kanttekening: zweetsnelheden verschillen sterk tussen mensen, en het standpunt over vochtaanvulling raadt aan je eigen zweetsnelheid te bepalen door je vóór en na een rit te wegen, met als doel het vochtverlies onder ongeveer 2% van je lichaamsgewicht te houden [8]. De tabel is een startpunt, niet jouw getal. Meer daarover in hydratatie, elektrolyten en zout.
Dat hergebruik was bewust. Mijn eerste versie van de kaart vóór de rit rekende met een vaste 500 ml per uur, terwijl de analyse na de rit voor een gematigde indoorsessie 1,4 l/u zweet aannam. De renner zou over dezelfde rit twee tegenstrijdige dingen te horen krijgen. Nu rekenen alle drie de plekken met dezelfde aannames:
Een bug die de functie elders vond
Bij het testen van de routekaart kreeg ik een verdacht resultaat: 2,7 l vocht voor een route die volgens de pagina 1 u 41 min zou duren. Dat is 1,6 l/u, het dubbele van de grens.
| Routetijd (60 km) | 2,7 l vocht is… | |
|---|---|---|
| Getoond door de app | 1 u 41 min | 1,6 l/u ✗ |
| Echt bij 18 km/u | 3 u 22 min | 0,8 l/u ✓ |
De vochtberekening klopte. De duur was fout, en niet in mijn nieuwe code: vier routeschermen schatten de tijd als segmenten × 5 seconden, maar segmenten zijn 50 m lang, dus die formule klopt alleen bij 36 km/u. Bij de standaard 18 km/u was elke routetijd in de app met de helft onderschat. De backend geeft de tijd nu mee met het voedingsplan, en alle routeschermen delen één functie „afstand gedeeld door snelheid”.
Wat het niet doet
Dit is een richtlijn, geen meting, en dit artikel zou oneerlijk zijn zonder de kanttekeningen:
- De koolhydraatcurve benadert gemiddeld gedrag, en mensen verschillen sterk. In een studie met 300 personen verklaarden geslacht, fitheid en activiteitsniveau samen maar 12% van de verschillen in vetoxidatie tijdens inspanning; de rest bleef onverklaard [9]. De app vermeldt bij elke schatting dat het om populatiegemiddelden gaat.
- Het routemodel gaat uit van een constante snelheid. Echte renners vertragen op klimmen, dus het model overschat waarschijnlijk het benodigde vermogen op steile stukken.
- De live weging heeft een FTP en een vermogensbron nodig. Zonder die twee telt de balk ruwe arbeid; een hartslagalternatief voor de live balk is er nog niet.
- Ik heb de schattingen nog niet vergeleken met een echte lange rit en een weegschaal. Het gedrag is vastgelegd met unittests, niet met praktijkdata.
De hele engine kan in de Instellingen worden uitgezet, en zolang hij aanstaat vervangt hij de oude eetherinnering met vaste tussenpozen in plaats van ermee te concurreren.
Wat ik eruit meeneem
De functie die eruitzag als „toon een melding bij 400 kJ” werd drie modellen die het met elkaar eens moeten zijn: een live accumulator, een plan vóór de rit en een analyse erna. Het echte werk zat niet in de formule, maar in zorgen dat die drie de renner hetzelfde verhaal vertellen, en in het kiezen van het juiste moment om iets te zeggen. De beste beslissing was geen enkel scherm eigen constanten te laten houden. De nuttigste gewoonte was een getal dat vreemd oogt — zoals 2,7 l in minder dan twee uur — te behandelen als bugmelding en niet als afrondingskwestie.
Bronnen
- Coyle EF, Sidossis LS, Horowitz JF, Beltz JD. Cycling efficiency is related to the percentage of type I muscle fibers. Med Sci Sports Exerc. 1992;24(7):782–788. PubMed 1501563
- Ettema G, Lorås HW. Efficiency in cycling: a review. Eur J Appl Physiol. 2009;106(1):1–14. doi:10.1007/s00421-009-1008-7
- Brooks GA, Mercier J. Balance of carbohydrate and lipid utilization during exercise: the "crossover" concept. J Appl Physiol. 1994;76(6):2253–2261. doi:10.1152/jappl.1994.76.6.2253
- Romijn JA, Coyle EF, Sidossis LS, et al. Regulation of endogenous fat and carbohydrate metabolism in relation to exercise intensity and duration. Am J Physiol. 1993;265(3):E380–E391. doi:10.1152/ajpendo.1993.265.3.E380
- van Loon LJ, Greenhaff PL, Constantin-Teodosiu D, Saris WH, Wagenmakers AJ. The effects of increasing exercise intensity on muscle fuel utilisation in humans. J Physiol. 2001;536(1):295–304. doi:10.1111/j.1469-7793.2001.00295.x
- Martin JC, Milliken DL, Cobb JE, McFadden KL, Coggan AR. Validation of a mathematical model for road cycling power. J Appl Biomech. 1998;14(3):276–291. doi:10.1123/jab.14.3.276
- Jeukendrup A. A step towards personalized sports nutrition: carbohydrate intake during exercise. Sports Med. 2014;44(Suppl 1):S25–S33. doi:10.1007/s40279-014-0148-z (open access: PMC4008807)
- American College of Sports Medicine; Sawka MN, Burke LM, Eichner ER, et al. Exercise and fluid replacement. Med Sci Sports Exerc. 2007;39(2):377–390. doi:10.1249/mss.0b013e31802ca597
- Venables MC, Achten J, Jeukendrup AE. Determinants of fat oxidation during exercise in healthy men and women: a cross-sectional study. J Appl Physiol. 2005;98(1):160–167. doi:10.1152/japplphysiol.00662.2003
Wat kostte je laatste rit je?
Upload een GPX- of TCX-bestand van een willekeurige rit en zie TSS, vermogen, hartslag en zones — in 30 seconden, zonder account.
Analyseer je rit — zonder account →Upload een GPX- of TCX-bestand uit Strava of Garmin. Hoe kom je eraan?