Skip to content
Sections de la documentation

Journal des modifications de l'API

Chaque modification de l'API publique qu'un appelant pourrait remarquer, de la plus récente à la plus ancienne. Chaque entrée est datée du jour de son annonce ici ; une modification qui rompt la compatibilité avec les appelants existants est annoncée au plus tard avec la version qui l'introduit, et marquée Incompatible. 29 des 81 entrées ci-dessous sont incompatibles.

  1. rf-link-budget prend 0,5 dB de pertes atmosphériques quand atmosphericLoss est omis

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch

    Un appel qui omettait atmosphericLoss était calculé avec 0 dB alors que ses provenance.inputs indiquaient la valeur par défaut documentée, 0,5 dB. Il est désormais calculé avec 0,5 dB, comme l'indiquent la page du calculateur et la provenance : rxPower, linkMargin et maxRangeKm se décalent donc de ce demi-décibel pour un tel appel. Un appel qui envoie l'entrée est inchangé.

    Toutes les autres entrées de tous les calculateurs ont été vérifiées de la même façon : omise, une entrée est soit refusée (400, rien de facturé), soit calculée avec sa valeur par défaut documentée.

  2. GET /v1/usage peut renvoyer les appels par jour

    • GET /api/py/v1/usage

    Passez ?days=N, de 1 à 90, et la réponse contient daily : une entrée {date, calls} pour chacun des N derniers jours en UTC, du plus ancien jusqu'à aujourd'hui. Les calls d'un jour sont additionnés sur toutes les clés du compte, déduction faite des appels restitués, et un jour sans appel affiche 0. Les jours antérieurs au 2026-09-24, date de début du comptage horaire, affichent 0.

    Sans days, la réponse est inchangée. La consultation de l'usage n'est toujours jamais décomptée.

  3. Le nombre de ports d'un fichier Touchstone envoyé se lit dans ses lignes avant son nom

    • rf_cascade
    • sparam_pipeline
    • impedance_match
    • eye_diagram

    Lorsque le nombre de valeurs d'un fichier admet plus d'un nombre de ports, ses lignes décident avant son extension : trois points à un port dans un fichier nommé .s2p font un port, et non un point à deux ports, et un nom que les données contredisent est signalé (port_count_mismatch dans rf_cascade). Un mot-clé [Number of Ports] décide toujours en premier.

    Le diagramme de l'œil n'échoue plus sur un fichier dont l'extension annonce plus de ports que ses données n'en contiennent.

  4. Le Monte Carlo de filtre exécute jusqu'à 1 000 essais gratuitement et 100 000 avec Pro et API, dans un budget de travail

    • POST /api/py/v1/jobs (filter_monte_carlo)
    • POST /api/py/v1/jobs/estimate
    • GET /api/py/v1/jobs/types
    • MCP simulate_filter_monte_carlo
    • rftools-io SDK

    monteCarloIterations va jusqu'à 1 000 avec l'offre Free (500 auparavant) et 100 000 avec Pro et API (10 000 auparavant). La durée maximale de la tâche est de 180 s (120 s auparavant).

    Le coût d'une exécution est le nombre de ses essais multiplié par les évaluations du réseau en échelle que chacun demande, fixées par ses composants et passCriteria. Une exécution dont la prévision dépasse le budget de son environnement (120 s dans l'environnement payant, 60 s dans le gratuit) est refusée à la soumission et par l'estimation avec errorKind: "too_large", avant toute facturation. Le détail nomme monteCarloIterations et donne le coût, la limite et, dans allowed.max, le nombre maximal d'essais qui tiennent. 100 000 essais d'une échelle à 5 composants sur trois critères tiennent ; une échelle à 20 composants sur huit critères tient jusqu'à 53 304.

    L'estimation indique withinBudget, un budget de type ladderEvaluations et work sous forme de trials et ladderEvaluationsPerTrial, que computeCost.work d'une tâche enregistre aussi.

  5. La liste des étages d'une cascade RF est vérifiée à la soumission

    • POST /api/py/v1/jobs
    • POST /api/py/v1/jobs/estimate
    • rf_cascade

    Un stages mal formé (pas du JSON, vide, un étage qui n'est pas un objet, une valeur qui n'est pas un nombre fini) est refusé par un 400 qui nomme l'étage et la clé, avant toute facturation. Il était auparavant accepté, puis échouait en erreur interne (fault).

    Les valeurs des étages sont bornées : gain_db ±1000 dB, nf_db de 0 à 1000 dB, iip3_dbm et p1db_dbm ±1000 dBm, et le gain de la chaîne après chaque étage dans ±1000 dB. NaN, Infinity et true/false sont refusés ; les nombres écrits sous forme de texte sont toujours lus.

    Une clé d'étage qui ne diffère d'une clé connue que par la casse (gain_dB, IIP3_dbm, Name) est refusée, avec l'étage et la clé attendue ; elle était auparavant ignorée et l'étage tournait avec la valeur par défaut. Toute autre clé qu'un étage n'accepte pas (notes, part) est ignorée avec un avertissement unknown_stage_key.

    Un étage dont le sparamFile n'a pas été envoyé avec la tâche est refusé, au lieu d'être calculé avec son gain saisi.

  6. Sans point d'interception, la valeur est null, et non 99 dBm

    • POST /api/py/v1/jobs
    • rf_cascade

    L'IIP3 d'un étage passif, ainsi que l'IIP3, l'OIP3, le P1dB et le SFDR d'une chaîne lorsqu'aucun étage ne les limite, valent null (ils valaient 99 dBm et 99 + gain). Les percentiles et l'histogramme Monte Carlo de l'IIP3 valent alors null, et le rendement de l'IIP3 est de 100 %.

    Un étage passif n'ajoute plus de point d'interception à 99 dBm : un atténuateur de 150 dB devant un amplificateur à IIP3 de 0 dBm donne désormais 150 dBm, et non 99.

  7. Cascade RF : bruit passif depuis les fichiers, signe du Monte Carlo, points d'interception exacts, avertissements

    • rf_cascade

    Un étage passif dont le gain vient d'un fichier tire son facteur de bruit de ce gain.

    Le Monte Carlo fait varier le facteur de bruit d'un étage passif avec ses pertes ; le signe était inversé.

    L'IIP3 et le P1dB d'entrée sont calculés exactement, si bas soient-ils (trois amplificateurs de 300 dB : −600 dBm et −610 dBm, qui donnaient −270 dBm auparavant) ; un plancher de −270 dBm ne subsiste que comme garde-fou là où la somme derrière un point n'est pas un nombre positif et fini, ce que les bornes des étages rendent inatteignable : un P1dB ne fait donc plus échouer la tâche.

    Avertissements unknown_stage_type, unknown_stage_key et file_not_uploaded.

  8. L'adaptation d'impédance arrondit sur une échelle logarithmique et utilise la réflexion en ondes de puissance sur tout le balayage

    • POST /api/py/v1/jobs
    • impedance_match

    Les composants E12, E24 et E96 prennent la valeur normalisée la plus proche sur une échelle logarithmique, selon l'espacement des séries ; exactement à mi-chemin, la plus petite. 2,099 nH donne désormais 2,2 nH, et non 2,0 nH. Là où les deux règles diffèrent, les composants, l'affaiblissement de réflexion et la branche que choisit auto peuvent changer.

    |S11|, la trajectoire sur l'abaque de Smith, l'affaiblissement de réflexion dans le pire cas et la bande passante utilisent la réflexion en ondes de puissance (Z − Zs*)/(Z + Zs), comme les valeurs à f0. Une source réelle est inchangée ; une source complexe, saisie ou lue dans un fichier, donne un |S11| différent.

  9. L'adaptation d'impédance indique sa fréquence de conception, le modèle en fréquence de sa charge et ses valeurs à f0

    • POST /api/py/v1/jobs
    • POST /api/py/v1/jobs/estimate
    • impedance_match

    Chaque nouveau paramètre est facultatif ; une requête qui ne les contient pas obtient la même réponse qu'avant.

    designFreq (Hz) : f0, indiquée séparément de freqStart–freqStop et à l'intérieur de cet intervalle ; à défaut, le centre de la bande.

    loadModel : constant (à défaut), series_rc ou series_rl (ajustés à f0 ; une réactance de mauvais signe est refusée) ou file (les propres points de fréquence de la charge envoyée). branchPreference : any, lowpass ou highpass, avec un avertissement branch_preference_unmet lorsqu'aucune branche de ce type n'existe. Un fichier de charge .s1p est accepté.

    Nouveaux résultats : designFreqHz, loadModel, unmatchedLoad, performance.ideal et .standard (affaiblissement de réflexion, VSWR, pertes de désadaptation supprimées et la bande passante à RL ≥ 10 dB avec ses bornes et sa part de f0, résolue par dichotomie), branch et qDefinitions.

  10. Le diagramme de l'œil accepte une excursion d'émission, un CTLE et un masque

    • POST /api/py/v1/jobs (eye_diagram)
    • MCP simulate_eye_diagram

    Chaque nouveau paramètre est facultatif, et une requête qui ne les contient pas obtient la même réponse qu'avant.

    launchSwing (mV crête à crête, valeur par défaut 2000, les ±1 V que supposait tout résultat antérieur) met à l'échelle chaque tension ; eyeHeightPctOfSwing donne la hauteur de l'œil en proportion de celle-ci.

    equalization: ctle applique le filtre à temps continu de l'annexe 93A de l'IEEE 802.3. ctleDcGain (de −12 à 0 dB) fixe son gain ; vide, le meilleur entre −12 et 0 dB par pas de 1 dB est retenu. ctle indique le gain, l'accentuation à Nyquist, le balayage et l'œil avant le filtre.

    maskType (hexagon ou rectangle), maskHalfHeight (mV) et maskWidth (UI) donnent mask.pass, margin_mV et les violations. samplingPhase (UI après le passage par zéro) et lossFrequency (Hz) ajoutent sampling et lossAtFrequency.

    Chaque résultat porte channelFile, uiMeasured et traceCount.

  11. La détection radar accepte une graine aléatoire

    • POST /api/py/v1/jobs (radar_detection)
    • provenance.seed

    randomSeed (un entier, 0 ou plus) remplace la graine Monte Carlo fixe 42 et est enregistrée dans provenance.seed : une exécution peut ainsi être répétée, et une variante resoumise sur les mêmes tirages. Sans elle, chaque résultat est inchangé.

  12. Le Monte Carlo de filtre exécute une échelle telle que construite, selon les critères que vous fixez, et indique quoi resserrer

    • POST /api/py/v1/jobs (filter_monte_carlo)
    • MCP simulate_filter_monte_carlo
    • rftools-io SDK

    Chaque nouveau paramètre est facultatif, et une requête qui ne les contient pas obtient la même réponse qu'avant, avec de nouveaux champs de résultat à côté.

    parts (de 1 à 20, de la source à la charge : ref, kind L ou C, position series ou shunt, value en H ou F, tolerance facultative en %) simule l'échelle telle que donnée, sans arrondi E24. passCriteria (de 1 à 8 : insertionLoss sur fStart–fStop au plus maxDb, cutoff3dB dans fMin–fMax, attenuation à freq ou sur fStart–fStop au moins minDb) remplace rippleSpec_db et rejectionSpec_db. yieldTarget (%, 95 si vide).

    Nouveaux résultats : circuit, yieldTarget avec un verdict par rapport à l'intervalle à 95 %, criteria avec statistiques, histogrammes et le varianceShare (r²) de chaque composant, failingTrials (les 200 premiers), sampleTrials et, si des critères sont saisis, whatIfs : les composants qui pèsent le plus sur le critère le plus souvent manqué, avec une tolérance d'un cran plus serrée, recalculés sur les mêmes essais. Resoumettre avec la randomSeed de l'exécution et ces tolérances donne le même rendement.

  13. La boucle de régulation de l'alimentation à découpage accepte son compensateur par composants, résout une fréquence de croisement et rend un verdict

    • POST /api/py/v1/jobs
    • POST /api/py/v1/jobs/estimate
    • smps_control_loop result

    Chaque nouvelle entrée est facultative, et une requête qui ne la contient pas obtient la même réponse qu'avant.

    compensatorType: type2_ota avec compRc, compCc, compChf, compGm et compVref décrit un compensateur de type II à transconductance par ses composants, transposé exactement en K, f_z et f_p. Un compVref supérieur à Vout est refusé.

    solveFor: crossover avec targetCrossover (Hz, valeur par défaut Fsw/10), resistorSeries (E96) et capacitorSeries (E12) place R_c, C_c et C_hf en mode courant crête et indique ce qu'ils obtiennent.

    minPhaseMargin (45°) et minGainMargin (10 dB) fixent le verdict et le rendement du Monte Carlo.

    Nouveaux résultats : verdict, polesZeros, nominal.phaseCrossoverHz, nominal.loopGainAt100HzDb, compensatorParts, solve, runSummary et bodeAboveHalfFsw, les réponses jusqu'à 2·Fsw, où aucune marge n'est lue.

  14. Seize calculateurs de timing comparent leurs temps à un budget

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Chaque nouvelle entrée est facultative, et une requête qui ne la contient pas obtient la même réponse qu'avant, sauf indication contraire dans les entrées ci-dessous.

    uart-baud-rate : oversampling (16 ou 8), divisorFraction (0 un diviseur entier, 1 une fraction par pas de 1/oversampling) et errorBudget (%, 2, que suit l'avertissement d'erreur de débit) ; divisorSet, baudError_pct (signé) et stopSampleOffset_bits.

    can-bus-timing : sjw (tq, 1) ; bitRateActual, bitRateError_pct, samplePointActual et oscTolerance_pct, la tolérance d'horloge que l'ISO 11898-1 accorde à chaque nœud.

    lin-bus-timing : slotTime (ms, 10) ; frameTimeMax, 1,4 × la trame nominale (LIN 2.x). modbus-frame-timing : charGap (ms, 0), que le temps de trame compte désormais ; t15, charGapChars et t15Chars.

    spi-timing : riseTime (2,2τ) et edgeShare_pct. i2s-timing : mclk (MHz, 16,9344) et rateBudget (%, 0,1) ; mclkDivider, bclkActual, sampleRateActual et sampleRateError_pct. pwm-duty-cycle : timerClock (MHz, 16) et requiredBits (8) ; periodCounts, onCounts, dutyActual, frequencyActual et dutyResolution_bits.

    555-timer : targetTime (ms, 2), errorBudget (%, 5), rTolerance et cTolerance (%, 0) ; timeMin, timeMax et timingError_pct. rc-time-constant : rTolerance (%, 1), cTolerance (%, 5) et tauBudget (%, 10), avec un avertissement au-delà ; tauMinUs, tauMaxUs et tauErrorPct.

    inductor-energy : requiredTime (µs, 20). battery-charge-time : requiredTime (h, 3). supercapacitor-backup : holdUpTime (s, 60). motor-inrush-current : dipLimit (%, 10). via-step-response : slowdownBudget (%, 10), que suit désormais l'avertissement de ralentissement. Chacune est refusée à 0 ou en dessous.

    inrush-current-limiter : ntcR25 (Ω, 0 pour la valeur requise) et ntcTolerance (%, 20) ; peakInrushMax. Avec ntcR25 renseigné, peakInrush, timeConstant et limitingResistor suivent la thermistance ajustée. pid-tuning : overshootBudget (%, 25) ; overshootPct et settlingTime tirés d'une réponse indicielle simulée en boucle fermée.

  15. Quatorze calculateurs de fréquence comptent leurs produits dans une bande

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Chaque nouvelle entrée est facultative, et une requête qui ne la contient pas obtient la même réponse qu'avant, sauf indication contraire dans les entrées ci-dessous.

    mixer-spur-calculator : rfBandLow/rfBandHigh (MHz, 902/928), ifBandwidth (MHz, 10) et nearMargin (MHz, 50) ; spursInBand, spursNearBand, nearestSpur, imageFreq, imageToBand et loToBand, à partir de chaque entrée RF convertie vers la FI, f_RF = (m·f_LO ± f_IF)/n (m l'harmonique de l'OL, n l'harmonique RF, comme dans l'ancien décompte), m + n jusqu'à maxOrder.

    intermodulation-distortion : bandLow/bandHigh (MHz, 88/108) ; productsInBand. vibration-phase-noise : offsetBandLow/offsetBandHigh (Hz, 1000/10000) ; sidebandsInBand. phase-noise-to-jitter : pointsIntegrated.

    ism-coexistence : channelWidth1_MHz/channelWidth2_MHz (20/2) ; overlappingChannels, avec les canaux répartis uniformément sur la bande. channels1 et channels2 sont limités à 100.

    via-stub-resonance : dataRate (Gb/s, 10) ; nyquistFreq, resonancesInBand et resonancesNearBand. chassis-resonance : bandLow/bandHigh (MHz, 30/1000) ; f011MHz et modesInBand. room-modes : bandLow/bandHigh (Hz, 20/200) ; modesInBand, modesNearBand et modalBandwidth.

    sampling-nyquist : harmonicOrder (5) ; aliasesInBand (le ton lui-même replié dans la bande du signal), harmonicAliasesInBand (ses harmoniques repliées dans celle-ci, qui comptent jusqu'au SFDR du convertisseur) et lowestAliasingInput. fft-bin-resolution : toneFreq (Hz, 1000) et sidebandSpacing (Hz, 100) ; toneBin, toneLevelError, resolutionBandwidth et sidebandsUnresolved (null pour un ton au-dessus de f_s/2).

    am-modulation-index : channelWidth (kHz, 10) ; powerInChannel, sidebandsInChannel et sidebandsOutside. fm-modulation-index : channelLow/channelHigh (kHz, 98000/98200) ; occupiedBandwidth, powerInChannel, sidebandsInChannel et sidebandsOutside (null au-delà de β = 1000, avec un avertissement).

    oversampling-snr : signalBandwidth (Hz, 24000) ; modulatorRate, outOfBandNoise et foldBands. digital-filter-order : toneFreq (Hz, 1000) et maxHarmonic (5) ; harmonicsInPassband, harmonicsInTransition, nearestHarmonic, butterworthAttenuation et chebyshevAttenuation.

  16. can-bus-timing : le prédiviseur et les quanta les plus proches du débit

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Parmi tous les bits de 8 à 25 quanta de temps (CAN 2.0), avec le prédiviseur de part et d'autre de celui qu'il demande, le plus proche du débit ; puis le point d'échantillonnage le plus proche de celui demandé (CiA 601-3) ; puis 16 quanta ; puis le plus petit prédiviseur. Le calculateur prenait le prédiviseur le plus proche de 16 quanta, quel que soit le débit obtenu : 36 MHz à 500 kbps donnait 5 × 14 quanta, 2,86 % trop rapide, et donne désormais 3 × 24, exact. prescaler, nominalBitTime, tq et les segments changent lorsqu'un réglage exact ou plus proche existe ; toutes les valeurs par défaut et tous les préréglages sont inchangés.

    Le point d'échantillonnage se situe au plus un quantum avant la fin du bit, de sorte que les segments s'additionnent jusqu'à lui (8 quanta à 95 % donnaient 9).

  17. modbus-frame-timing : temporisations fixes au-delà de 19 200 Bd

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Au-delà de 19 200 Bd, t35 vaut 1,75 ms fixe (Modbus over Serial Line V1.02, section 2.5.1.1), et non plus 3,5 caractères (0,334 ms à 115 200 Bd 8E1), et maxFrameRate suit ; le nouveau t15 y vaut 750 µs fixe.

  18. intermodulation-distortion : im3High est une valeur absolue

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    im3High vaut |2f₂ − f₁|, comme im3Low déjà : en dessous de f₂ = f₁/2, il était négatif (100 et 40 MHz : −20, désormais 20 MHz).

  19. chassis-resonance : c exacte et le mode (0,1,1)

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    La vitesse de la lumière est exacte, 29 979 245 800 cm/s, et non 3 × 10¹⁰ : fLowest, f101MHz et f110MHz baissent de 0,07 % (901,39 → 900,76 MHz avec les valeurs par défaut).

    fLowest inclut (0,1,1), le mode le plus bas lorsque la longueur est le plus petit côté (Pozar, Microwave Engineering, 4e éd., section 6.3) : un boîtier de 10 × 30 × 20 cm donnait 1581 MHz et donne 900,76 MHz ; wavelengthAtResonance suit.

  20. phase-noise-to-jitter : le profil intégré par lois de puissance

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Avec profileMode 1, le profil est intégré par lois de puissance entre ses points, des droites sur des axes log-log (Drakhlis, Microwaves & RF, janvier 2001), et la bande se termine au niveau propre du profil à cet endroit. Un trapèze linéaire surestimait un profil décroissant, et L₄ était maintenu jusqu'à la fin de la bande même lorsqu'il se situe au-delà : le profil par défaut à 100 MHz donnait 0,166 ps et donne 0,084 ps. rmsJitter, cycleToCycleJitter, phaseNoisePower, rmsPhaseError et adcSnrLimit changent dans ce mode ; le mode à niveau unique est inchangé.

  21. sampling-nyquist : l'alias se replie sur le multiple de f_s le plus proche

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    aliasFreq_Hz vaut |f − k·f_s| avec k l'entier le plus proche de f/f_s (Kester, MT-002). Il valait |f_s − f|, correct seulement jusqu'à 1,5·f_s : 10 kHz à 4 kSa/s donnait 6000 Hz et donne 2000 Hz.

  22. fm-modulation-index : la largeur de bande de Bessel tirée des fonctions de Bessel

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    besselBandwidth couvre les bandes latérales au-dessus de 1 % de la porteuse non modulée, 2·n·f_m (Haykin, Communication Systems) : elle valait 2(β + 1)·f_m, de nouveau la règle de Carson. À β = 5, elle valait 180 kHz et vaut 240 kHz. Au-delà de β = 1000, elle vaut null, avec un avertissement.

  23. digital-filter-order : l'ordre elliptique exact

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    ellipticOrder résout l'équation de degré K(k)·K′(k₁)/(K′(k)·K(k₁)), avec k = f_p/f_s et k₁ = ε_p/ε_s. C'était l'ordre de Tchebychev divisé par 1,5, trop élevé dans la plupart des conceptions et trop bas dans certaines : les valeurs par défaut demandent 3, et non 4 ; une transition 2:1 à 1 et 20 dB demande 3, et non 2.

  24. via-stub-resonance : pas de stub, pas de résonance

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Avec la sortie sur la dernière couche, il n'y a pas de stub : resonantFreq et backdrillBenefit valent null (une résonance non bornée), et non plus 0.

  25. room-modes et inductor-energy : des refus qui nomment ce qui ne va pas

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    room-modes refuse une vitesse du son ou un temps de réverbération inférieurs ou égaux à 0 avec un message propre, et ne renvoie aucune valeur à côté d'un refus ; il renvoyait des zéros et nommait les dimensions de la pièce.

    inductor-energy refuse une résistance série inférieure ou égale à 0, comme le site l'a toujours fait ; l'API échouait dessus.

  26. Huit autres calculateurs de convertisseurs et de circuits de commande acceptent une plage de fonctionnement, choisissent leurs composants et ajoutent un modèle de pertes

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Comme buck-converter : chaque entrée qui varie en service est une paire <input>Min et <input>Max, où 0 (la valeur par défaut) signifie l'entrée nominale. Chaque pire cas est une sortie, avec les valeurs d'entrée auxquelles il se produit comme sorties propres (rippleWorstA à rippleWorstVin). Les composants sont dimensionnés au moins pour ce qu'exige le cas le plus défavorable : une inductance de la série E12 et une tension nominale égale à la valeur normalisée suivante à partir de 1,5 fois la pire tension (l'interrupteur du flyback, à partir de son pic de drain écrêté). Les entrées du modèle de pertes ont des valeurs par défaut typiques ; ses pertes sont données au point nominal, en W, et s'ajoutent à lossTotal. Une requête sans les nouvelles entrées obtient la même réponse qu'avant, sauf indication contraire dans les entrées ci-dessous.

    boost-converter : inputVoltageMin/inputVoltageMax ; coutEach, ainsi que rdsOn, tSwitch, qg, vGate, vDiode, qrr, dcr, coreLoss, esrOut du modèle de pertes. Parmi les nouvelles sorties figurent dutyMin/dutyMax, inductorMinWorstUH et inductorChosenUH, ilPeakWorst, inputCurrentWorst, q1RmsA, coutRmsA, outputRippleMV, vdsRating, huit pertes et efficiencyLossModel ; l'entrée efficiency fixe toujours les courants.

    flyback-converter : vinMin/vinMax, calculés à chaque coin avec le transformateur nominal ; rdsOn, tFall, qg, vGate, vDiode, rPri, rSec, coreLoss, leakageInductance (µH, valeur par défaut 2,6) et clampRatio (valeur par défaut 2, à partir de 1,1) du modèle de pertes, avec la perte de l'écrêteur RCD ½·L_lk·I_pk²·f·k/(k − 1). Parmi les nouvelles sorties figurent les courants crête et efficaces des deux enroulements, reflectedVoltage, clampVoltage, vdsPeakWorst, vdsRating, diodeVrWorst, diodeVrRating, sept pertes et efficiencyLossModel.

    charge-pump-voltage : inputVoltageMin/inputVoltageMax et pumpCurrentMin/pumpCurrentMax ; switchResistance (Ω, valeur par défaut 1) et esr (mΩ, valeur par défaut 10), ajoutées à la résistance de partage de charge comme l'est la R_O de la fiche technique de l'ICL7660. Parmi les nouvelles sorties figurent loadedVoltageMin/loadedVoltageMax, outputResistance, loadedVoltageWithLosses, les valeurs nominales des condensateurs et des interrupteurs, trois pertes et efficiencyLossModel (égal à efficiency avec des composants idéaux).

    switching-regulator-ripple : outputCurrent (A, valeur par défaut 2), inputVoltageMin/inputVoltageMax, et le modèle de pertes du convertisseur abaisseur sur ses propres composants (son esr est celle du condensateur de sortie). Parmi les nouvelles sorties figurent les ondulations et les courants efficaces dans le pire cas, vdsRating, huit pertes et efficiency.

    mosfet-power-dissipation : drainCurrentMin/drainCurrentMax et tAmbientMin/tAmbientMax (toute valeur sauf 0, qui désigne la valeur nominale) ; rdsonTempco (%/°C, valeur par défaut 0), résolu jusqu'à la jonction sous forme fermée, coss (pF, valeur par défaut 0), qg et vGate. Parmi les nouvelles sorties figurent junctionTempWorst avec son courant et sa température ambiante, totalLossWorst, efficiencyWorst, vdsRating, quatre pertes et efficiencyLossModel.

    h-bridge-selection et motor-driver-power : motorCurrentMin/motorCurrentMax et la plage de l'alimentation (motorVoltageMin/motorVoltageMax, supplyVoltageMin/supplyVoltageMax) ; le temps mort tDead et la vBody de la diode de structure (TI SLVA504A) et, sur le pont en H, dutyCycle (%, valeur par défaut 75), tSwitch, qg et vGate. Parmi les nouvelles sorties figurent la pire perte du pont, le FET le plus chaud, vdsRating, les pertes et efficiencyLossModel.

    class-d-efficiency : outputPowerMin/outputPowerMax et supplyVoltageMin/supplyVoltageMax ; switchingFreq (kHz, valeur par défaut 400), filterCutoff (kHz, valeur par défaut 40), tSwitch, coss, qg, vGate, ainsi que la dcr et la coreLoss de l'inductance du filtre. Parmi les nouvelles sorties figurent le filtre de sortie (TI SLAA701B) tel que calculé et tel que choisi, cinq pertes, loadPower, efficiencyLossModel, le pire rendement et la pire perte avec leurs coins, headroomWorst (négatif là où le pont ne peut pas fournir l'excursion de sortie), les courants d'ondulation et de crête du filtre, et les valeurs nominales.

  27. boost-converter : le rapport cyclique est celui de TI SLVA372D

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Le rapport cyclique valait 1 − V_in/(V_out·η), si bien que les pertes le raccourcissaient, en contradiction avec le propre courant d'entrée du calculateur. C'est désormais l'équation 1 de TI SLVA372D, D = 1 − V_in·η/V_out. Avec les valeurs par défaut (5 V vers 12 V, 0,5 A, 100 kHz, 88 %), dutyCycle passe de 52,65 % à 63,33 %, inductorValue de 64,35 µH à 77,41 µH et outputCapacitor de 4,388 µF à 5,278 µF.

    Le refus et l'avertissement se déplacent avec lui : une entrée entre η·V_out et V_out, refusée auparavant, est désormais calculée (seul V_out ≤ V_in est refusé), et l'avertissement de rapport cyclique à 95 % intervient à V_in·η/V_out ≤ 0,05.

  28. switching-regulator-ripple : une sortie égale ou supérieure à l'entrée est refusée

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Le calculateur est un abaisseur. Avec outputVoltage égal ou supérieur à inputVoltage, il renvoyait un rapport cyclique de 99 % et une ondulation négative ; il refuse désormais avec « Output voltage must be less than input voltage » et ne renvoie aucune valeur.

  29. buck-converter : une plage d'entrée, les composants choisis et leurs contraintes, et un modèle de pertes avec le rendement

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    vinMin et vinMax donnent l'entrée sous forme de plage (0, la valeur par défaut, est la vin nominale). L'inductance est dimensionnée là où son ondulation est la plus forte et choisie au moins à cette valeur dans la série E12 (inductorMinWorstUH, inductorChosenUH) ; chaque contrainte est donnée là où elle est la plus forte, avec la tension d'entrée à laquelle elle se produit : rippleWorstA/rippleWorstVin, ilPeakWorst/ilPeakWorstVin, outputRippleMV/outputRippleVin, cinMinWorstUF, cinRmsA, q1RmsA, q2RmsA (chacune avec son …Vin), ainsi que dutyMin, dutyMax. Le banc de sortie compte coutCount condensateurs de coutEach µF ; les tensions nominales des composants sont vdsRating, cinVoltageRating, coutVoltageRating (la valeur commercialisée à partir de 1,5 fois la tension).

    Un modèle de pertes, toutes les entrées facultatives : rdsOnHigh, rdsOnLow, tSwitch, qg, vGate, tDead, vBody, dcr, coreLoss, esrOut, esrIn. À l'entrée et à la charge nominales, les pertes sont lossDcr, lossCore, lossHsConduction, lossLsConduction, lossHsSwitching, lossGateDrive, lossDeadTime, lossCapEsr et lossTotal (W), avec outputPower et efficiency (%). Une requête sans les nouvelles entrées obtient les cinq sorties qu'elle obtenait avant, sauf cinUF (voir buck-converter-input-capacitance).

  30. buck-converter : le condensateur d'entrée est dimensionné pour l'ondulation de l'entrée

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    cinUF divisait par la tension d'ondulation de la sortie (deltaVout de vout). Il prend désormais l'ondulation propre de l'entrée, la nouvelle entrée deltaVin (% de vin, valeur par défaut 1), comme dans l'équation 12 de TI SLVA477B : C_in = I_out·D·(1 − D)/(f_sw·ΔV_in). Avec les valeurs par défaut (12 V vers 5 V, 1 A, 500 kHz), 9,72 µF devient 4,05 µF.

  31. Vingt-trois autres calculateurs acceptent une série de composants et donnent la conception telle que construite

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    eSeries (0 pour des valeurs idéales, ou 12, 24, 48, 96) arrondit chaque résistance, condensateur ou inductance que le calculateur conçoit ou lit à la valeur la plus proche de cette série, et chaque sortie est alors celle de la conception arrondie. Sa valeur par défaut laisse à une requête qui ne le contient pas la réponse qu'elle obtenait avant : 24 pour attenuator-designer, led-resistor et zener-diode, dont les sorties E24 (piR1Nearest à tR2Nearest, rNearest, iActual, pNearest, e24Resistor) le suivent désormais, et 0 pour voltage-divider, opamp-gain, comparator-hysteresis, schmitt-trigger, transistor-switch, current-mirror, crystal-load-capacitance, photodiode-transimpedance, lm317-resistors, rs485-termination, pll-loop-filter, wilkinson-power-divider, rc-snubber, rcd-clamp-snubber, emi-filter-lc, power-supply-ripple-filter, conducted-emissions-filter, differential-mode-filter, speaker-crossover et tweeter-capacitor. Les composants de directional-coupler sont des lignes et n'en prennent pas.

    De nouvelles sorties décrivent la conception arrondie : attenuator-designer piAttenuationBuilt (dB) et piInputImpedanceBuilt (Ω) ; wilkinson-power-divider isolationBuilt (dB à f₀, null avec la résistance exacte, où elle n'est pas bornée) ; rcd-clamp-snubber clampVoltageBuilt, rippleVoltageBuilt, clampPowerBuilt et peakDrainVoltageBuilt ; pll-loop-filter crossoverBuilt (kHz, le passage à 0 dB de la boucle ; pmActual est la marge à cet endroit) ; rs485-termination failsafeVoltage (mV, la tension A–B du bus au repos) ; emi-filter-lc insertionLossBuilt (dB à 10·f_c) ; conducted-emissions-filter cornerBuilt, attenuationBuilt et outputLevelBuilt ; speaker-crossover wooferCutoffBuilt et tweeterCutoffBuilt ; tweeter-capacitor crossoverBuilt ; zener-diode zenerCurrentBuilt (mA) et zenerPowerBuilt (mW) à pleine charge à travers la résistance retenue, le courant étant négatif là où la résistance ne peut pas supporter la charge.

    Libellés, clés inchangées : les résistances arrondies de l'atténuateur s'intitulent « (rounded) » au lieu de « (E24) » ; rNearest « Nearest Series Value », pNearest « Power (series R) », e24Resistor « Nearest Series Resistor » ; l'error de current-mirror « Output Current Error », le déficit par rapport à N·I_ref (avec une série, il inclut l'arrondi, et une sortie Widlar est résolue à partir de V_T·ln(I_ref/I) = I·R_E avec la R_E arrondie).

    Pour qu'un composant puisse être résolu pour une sortie cible, ces entrées indiquent désormais un maximum (une valeur supérieure est tout de même calculée, avec l'avertissement de la provenance) : comparator-hysteresis r1 et r2 10 000 kΩ ; photodiode-transimpedance feedbackResistance 1e7 kΩ et feedbackCapacitance 100 000 pF ; differential-mode-filter inductance 100 000 µH et capacitance 1 000 µF ; power-supply-ripple-filter inductance 100 000 µH et capacitance 100 000 µF.

  32. schmitt-trigger : seuils par superposition sur l'entrée +

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    La bande valait V_cc·R2/(R2 + R3), qui néglige R1, placée symétriquement autour de la tension du diviseur. Les seuils sont désormais obtenus par superposition au nœud + (TI SNOA997A) : V_TH+ = V_cc·R1/(R1 + R2∥R3) et V_TH− = V_cc·(R1∥R3)/(R2 + R1∥R3) ; centerVoltage est le milieu de la bande. Avec les valeurs par défaut (5 V, 10, 10 et 100 kΩ), vth_high, vth_low et hysteresis passent de 2,727, 2,273 et 0,4545 V à 2,6190, 2,3810 et 0,2381 V. Le circuit est un trigger inverseur ; la description le disait non inverseur.

  33. conducted-emissions-filter : L et C s'adaptent à la charge

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    L et C étaient répartis en √(LC·Z) et √(LC/Z), ce qui fixait √(L/C) à √Z (7,07 Ω sur 50 Ω ; le filtre présentait un pic de 17 dB à 47 kHz depuis une source de tension). Ils valent désormais L = Z/ω₀ et C = 1/(ω₀·Z). Avec les valeurs par défaut (80 dBµV à 150 kHz, 20 dB, 50 Ω), lValue passe de 23,7 µH à 167,8 µH et cValue de 0,475 µF à 0,0671 µF. La fréquence de coupure, et donc l'atténuation de 40 dB/décade, est inchangée.

  34. attenuator-designer, led-resistor, zener-diode : valeurs E24 inférieures à 10 Ω

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Leurs recherches E24 commençaient à 10 Ω, si bien qu'un composant inférieur à 10 Ω était ramené à 10 Ω : les résistances série de 2,875 Ω d'un atténuateur en T de 1 dB sous 50 Ω sortaient à 10 Ω (l'atténuateur construit donnait 1,336 dB et 54 Ω), et une résistance de LED de 5 Ω à 10 Ω. Les recherches commencent désormais à 0,10 Ω (3,0 Ω et 5,1 Ω). Au-dessus de 10 Ω, rien ne change.

  35. pll-loop-filter et class-d-efficiency : un refus ne renvoie aucune valeur

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    pll-loop-filter (à chaque refus) et class-d-efficiency (dans l'API) renvoyaient des zéros à côté de l'erreur. Ils ne renvoient plus aucune valeur, comme les autres calculateurs.

  36. filter-designer : la réponse de l'échelle telle que construite, un décalage exact de la coupure et des coupures jusqu'à 1 GHz

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Six nouvelles sorties décrivent l'échelle que forment les valeurs des composants, résolue comme une cascade de matrices ABCD entre Z₀ et sa charge : loadImpedance (Z₀, ou Z₀/g_{N+1} pour un Tchebychev d'ordre pair, g_{N+1}·Z₀ en passe-haut), cutoffBuilt_Hz (la fréquence à −3 dB, passe-bas et passe-haut), fLowBuilt_Hz et fHighBuilt_Hz (les bords à −3 dB d'un passe-bande), passbandLoss_dB (la pire perte jusqu'à 0,8·f_c, au-dessus de 1,25·f_c, ou sur les 80 % centraux d'une bande) et stopbandBuilt_dB (la perte là où le prototype atteint le double de sa coupure). Avec eSeries renseigné, ce sont celles de la conception arrondie ; avec des composants idéaux, la bande coupée est égale à attenuation_at_2fc.

    fcShiftPercent valait la moitié de la plus grande erreur de composant. Il indique désormais de combien l'arrondi a déplacé la fréquence à −3 dB de l'échelle construite (pour un passe-bande, le centre de sa bande à −3 dB) par rapport à celle de l'échelle idéale : le Butterworth d'ordre 5 à 100 MHz avec des composants E24 donne +0,997 %, là où l'estimation donnait +1,31 %. Avec eSeries à 0, il vaut 0, comme avant.

    fc accepte jusqu'à 1 GHz (il s'arrêtait à 10 MHz).

  37. voltage-drop : toutes les jauges sont calculées, et l'aluminium est celui de l'IEC 60889

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Un wireGauge absent du tableau (une jauge impaire ou fractionnaire) était calculé avec la résistance du 12 AWG. Il suit désormais la même formule que le tableau, cuivre selon l'IEC 60028 (1/58 Ω·mm²/m) sur la section de la jauge selon l'ASTM B258 ; les jauges du tableau sont inchangées.

    conductorType 1 (aluminium) prenait 1,61 fois la résistance du cuivre. Il prend désormais les 0,028264 Ω·mm²/m de l'IEC 60889, soit 1,6393 fois le cuivre, si bien que chaque chute de tension en aluminium est supérieure de 1,8 % : 10 AWG à 15 A sur 30 m sous 120 V chute de 4,03 %, là où il indiquait 3,96 %.

  38. coax-loss : atténuation tirée des données des fabricants ; huit autres câbles, puissance d'entrée et puissance de sortie

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Le tableau des câbles donnait environ 1,7 fois les dB/100 ft des fiches techniques, si bien que la perte de chaque câble était trop faible. L'atténuation pour 100 m vaut désormais k₁√f + k₂f avec f en MHz : les coefficients publiés par Times Microwave (25 °C) pour les câbles LMR, et un ajustement par moindres carrés sur les tableaux de Belden et de CommScope (20 °C) pour les autres. lossPer100m ancien → nouveau à 100, 435 et 2400 MHz : LMR-400 2,15 → 4,10, 4,62 → 8,74, 11,50 → 21,70 ; LMR-240 3,60 → 8,05, 7,69 → 17,04, 19,40 → 41,51 ; LMR-200 4,80 → 10,64, 10,35 → 22,43, 26,00 → 54,18 ; LMR-100A 10,80 → 23,84, 23,45 → 51,01, 61,00 → 127,68 ; RG-58/U 10,00 → 12,45, 22,65 → 28,77, 64,00 → 84,61 ; RG-8X 6,10 → 10,10, 13,50 → 22,74, 38,00 → 63,62 ; RG-213/U 4,70 → 6,30, 10,35 → 15,21, 28,50 → 48,34 ; RG-174/U 19,00 → 28,12, 43,33 → 65,75, 120,00 → 197,64 ; Belden 9913 2,50 → 4,34, 5,42 → 9,23, 13,70 → 22,75 ; Andrew LDF4-50A 0,70 → 2,17, 1,53 → 4,66, 3,95 → 11,81. attenuation_dB et les parts de puissance et de tension suivent. L'Andrew LDF4-50A est le câble de 1/2 in ; il était étiqueté 7/8 in.

    cableIndex 0–9 conservent leurs câbles et va désormais jusqu'à 17 : LMR-600, LMR-195, LMR-400-UltraFlex, LMR-400-LLPL (plenum), RG-316, RG-6 (75 Ω), Andrew LDF5-50A (7/8 in) et LMR-900. Nouvelle entrée facultative inputPower (dBm, valeur par défaut 30) ; nouvelles sorties powerOut_dBm, powerOut_W et lossPerMeter. Une fréquence supérieure au maximum nominal d'un câble, au-delà du dernier point d'un tableau ajusté, ou inférieure à la fréquence à partir de laquelle un ajustement est valable à 10 % près, reçoit un avertissement, pas un refus.

  39. Dix-huit calculateurs acceptent des listes : étages, pertes, termes, couches, charges, composants et surfaces

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Chaque liste est un nombre d'éléments et des entrées indexées (numLoads avec load1Current, load2Current, …), de sorte qu'une requête reste un objet plat. Chaque nombre a pour valeur par défaut la liste que le calculateur avait auparavant : une requête sans les nouvelles entrées obtient donc la même réponse qu'avant (vérifié sur 201 requêtes par calculateur, refus compris). Une entrée indexée au-delà du nombre est ignorée.

    noise-figure-cascade : numStages va désormais jusqu'à 10 (il allait jusqu'à 4), avec stage5Gain, stage5NF, stage5IIP3 jusqu'à stage10IIP3, et une bandwidth facultative (MHz, valeur par défaut 1) ; nouvelles sorties cascadedGain, noiseTemperature (290 K × (F − 1)) et noiseFloor (kT₀B plus le facteur de bruit en cascade).

    lora-link-budget, ble-link-budget, 5g-nr-link-budget : extraLossCount (0–6) parmi extraLoss1 à extraLoss6 (dB), et totalLoss. clock-jitter : jitterTerms (0–6) parmi term{n}Jitter_ps, additionnés en quadrature. emi-margin-budget : marginTerms (0–6) parmi term{n}Allowance, et totalAllowance. sensor-accuracy-budget : errorTerms (0–6) parmi term{n}Error, en quadrature. 4-20ma-transmitter : loopElements (0–6) parmi element{n}Resistance, et totalLoopResistance.

    heatsink-calculator, heatsink-selection, thermal-resistance-network, junction-temperature : numLayers (0–6) parmi layer{n}Theta (°C/W), en série entre le boîtier et le dissipateur ; les deux calculateurs de dissipateur renvoient aussi thetaJS et heatsinkTemp.

    battery-life : numLoads (0–7) parmi load{n}Current et load{n}Duty, et selfDischargeCurrent. battery-runtime-motor : motorDuty (%, valeur par défaut 100) et numLoads (0–5) parmi load{n}Current, load{n}Duty et load{n}Efficiency, et batteryCurrent. solar-panel-sizing : loadHours (h par jour, valeur par défaut 24) et numLoads (0–9) parmi load{n}Power et load{n}Hours.

    gear-ratio : extraStages (0–5) parmi stage{n}Driver, stage{n}Driven et stage{n}Efficiency, et totalEfficiency. series-parallel-resistor : numParts (1–8, valeur par défaut 4) avec r5 à r8, et sumOfValues ; r1 peut valoir 0, un composant non monté, comme les autres positions le pouvaient déjà. rt60-reverberation : numSurfaces (0–8) parmi surface{n}Area et surface{n}Alpha, et otherArea et meanAbsorption.

  40. Les bilans de liaison répondent à une distance de 0 sans perte de trajet

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    lora-link-budget, ble-link-budget et 5g-nr-link-budget refusaient une distance de 0. Ils y répondent désormais avec 0 dB de perte de trajet : la liaison sans trajet, que les pages utilisent pour montrer le bilan avant le trajet. Une distance négative est toujours refusée.

  41. clock-jitter : sans budget temporel restant, la part n'est pas bornée, elle ne vaut pas 0 %

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Lorsque les temps de setup et de hold occupent toute la période d'horloge, budgetUsed_pct valait 0, ce qui se lit comme une absence totale de gigue. Il vaut désormais null (une part non bornée), avec un avertissement indiquant qu'il ne reste aucun budget temporel lorsqu'aucune violation de setup n'est à signaler.

  42. series-parallel-resistor : le rapport du diviseur porte sur les deux composants montés

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Avec exactement deux composants montés, voltDividerRatio valait R2/(R1 + R2) quels qu'ils soient, donc 0 avec R1 et R3 montés. Il vaut désormais le second composant monté divisé par la somme des deux, ce qui ne change rien lorsqu'il s'agit de R1 et R2.

  43. optical-sensor-range : un refus ne renvoie aucune valeur

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Un facteur de sécurité inférieur ou égal à 0 était refusé avec maxRange et normalizedRange à 0 à côté de l'erreur. Le refus ne renvoie désormais aucune valeur, comme tous les autres refus.

  44. broadside-coupled-pair : sans plans, ni impédance de mode commun, ni impédance découplée, ni hauteur par rapport au plan

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Une paire non blindée (shielded 0) n'a pas de plans de référence, si bien que commonImpedance, uncoupledImpedance et heightToPlane ne sont pas définis, comme le disait déjà l'avertissement. Ils valaient 0 et valent désormais null.

  45. rise-time-bandwidth : sans horloge, pas de rang d'harmonique

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Avec clockFrequency à 0, que l'entrée autorise pour se passer d'horloge, harmonicNumber valait 0, une valeur qu'aucune horloge ne donne. Il vaut désormais null, comme d'autres sorties là où une valeur n'existe pas.

  46. Treize calculateurs évaluent leur résultat par rapport à une norme publiée

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Chacun accepte la norme (et, le cas échéant, la classe) comme entrée facultative, et renvoie la limite, le résultat en pourcentage de celle-ci (au-delà de 100, c'est un échec) et la valeur d'une entrée qui permettrait la conformité. Les limites sont calculées dans le calcul lui-même : l'API rend donc le verdict de la page. Chaque nouvelle entrée est facultative et, à sa valeur par défaut, aucune sortie existante ne change, sauf indication contraire dans une entrée ci-dessous.

    power-density : standard (0 FCC 47 CFR §1.1310, 1 ICNIRP 2020), exposureClass, groundReflection ; renvoie limitDensity, limitPercent, minDistance, maxEirp. trace-width-current : standard (il lit la traceWidth dessinée que l'API accepte déjà) ; limitCurrent, limitPercent, minTraceWidth. microvia-current-capacity : standard, conductorClass ; limitCurrent, limitPercent, minVias, minViaDiameter. pcb-trace-temp : standard, laminate ; chartRise, limitRise, limitPercent, minTraceWidth, maxCurrent.

    minimum-conductor-spacing : conductorSpacing ; spacingPercent, maxVoltage (la limite est spacing). padstack-annular-ring : standard, padDiameter, producibilityLevel ; minLandDiameter, landPercent, maxDrillDiameter. solder-paste-volume : releaseCriterion ; maxStencilThickness, stencilPercent, maxApertureReduction. bga-land-pad : ballType, landDiameter ; ipcLand, landDeviation, landTolerance, landPercent, compliantLand.

    i2c-pullup : pullup ; riseTime, riseTimePercent, maxBusCap (la limite est riseTimeTarget_ns, le mode est speedMode). usb-termination : impedanceError, impedanceTolerance, impedancePercent, compliantImpedance (la norme est usbVersion). esd-tvs-diode : standard, testLevel, esdRating ; testVoltage, limitPercent. esd-clamp-selection : standard, testLevel ; testVoltage, limitPercent. radiated-emission-estimate : standard, emissionClass ; eFieldUvm, limitField, limitPercent, maxCurrent, maxLoopArea.

    Là où une norme ne fixe aucune limite (ICNIRP sous 30 MHz, CISPR 32 hors de 30 MHz–6 GHz, couronnes de la classe 2 de l'IPC-6012, un espacement A6 au-dessus de 3 050 m), les nouvelles sorties valent NaN, renvoyées comme null, avec un avertissement qui en donne la raison.

  47. Onze calculateurs de lignes de transmission renvoient la longueur d'onde guidée

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    microstrip-impedance, controlled-impedance, asymmetric-stripline, dual-stripline, differential-pair, edge-coupled-internal-symmetric, edge-coupled-internal-asymmetric, edge-coupled-embedded, broadside-coupled-pair, coplanar-waveguide et coax-impedance acceptent une frequency facultative (GHz, valeur par défaut 2,4) et renvoient guidedWavelength et quarterWavelength (mm), λg = c/(f·√εeff), les lignes couplées à partir de leur εeff en mode impair. Une requête sans frequency renvoie toutes les sorties existantes inchangées, plus les deux nouvelles à 2,4 GHz.

  48. radiated-emission-estimate : la marge suit la norme et la classe choisies

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    margin est la limite de la norme et de la classe choisies à la fréquence et à la distance de la requête, moins le champ : standard 0 désigne la CISPR 32 et 1 la FCC Part 15, section 15.109, emissionClass 0 la classe B et 1 la classe A. Une requête sans eux obtient la CISPR 32 classe B, comme avant : sa marge est donc inchangée. Les limites FCC s'appliquent de 30 MHz à 40 GHz, et la marge vaut null hors de la plage de sa norme. Le libellé de la sortie est désormais « Margin to Limit ».

  49. minimum-conductor-spacing ajoute les colonnes A6 et A7 des sorties de composants, et une sortie B4

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    condition 4 correspond à A6 (sortie ou terminaison de composant externe, non revêtue, du niveau de la mer à 3 050 m) et 5 à A7 (sortie ou terminaison de composant externe, avec vernis de tropicalisation), toutes deux du tableau 6-1 de l'IPC-2221B. Au-dessus de 3 050 m, une requête A6 renvoie un espacement null avec un avertissement, car le tableau ne donne A6 que jusqu'à 3 050 m. La nouvelle sortie spacingB4 est la colonne B4 (conducteurs externes, revêtement polymère permanent), à côté de spacingB1, spacingB2 et spacingB3. Les conditions 0 à 3 et les sorties existantes sont inchangées.

  50. bga-land-pad dimensionne la pastille selon le diamètre de la bille, comme l'IPC-7351B

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    La pastille valait le diamètre de la bille × 1,0, 0,9 ou 0,8 selon le niveau de densité, ce qu'aucun tableau IPC ne donne. Elle suit désormais l'IPC-7351B : pour une bille qui s'affaisse, 25, 20 ou 15 % de moins que la bille selon la taille de celle-ci. Avec les valeurs par défaut, padDia passe de 0,55 à 0,45 mm, et les sorties qui en dérivent suivent. L'entrée densityLevel est retirée, car l'IPC-7351B n'applique pas de niveaux de densité à une pastille de BGA : une requête qui l'envoie reçoit une réponse, avec un avertissement indiquant que la valeur n'a pas été lue.

  51. bldc-winding : une bobine s'étend sur au moins une encoche

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch

    Là où le nombre d'encoches divisé par le nombre de pôles s'arrondissait à 0 (6 encoches pour 14 pôles, par exemple), le pas de bobine valait 0, le facteur de bobinage 0, et actualKv et deltaEquivKv valaient null. Une bobine concentrée est enroulée autour d'une dent : le pas vaut donc désormais au moins une encoche, et ces sorties sont des nombres.

  52. Les tâches emi_radiated appliquent la limite la plus stricte en bord de bande

    • POST /api/py/v1/jobs

    À exactement 88, 216 et 960 MHz (FCC Part 15) et 230 MHz (CISPR 32), la plus souple des deux limites adjacentes était utilisée. Le 47 CFR 15.109(c) dispose que la limite la plus stricte s'applique aux bords de bande, et la CISPR 32 applique la limite la plus basse à une fréquence de transition ; les deux règles sont désormais appliquées.

  53. Plages d'entrée sur 31 calculateurs

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}
    • POST /api/py/v1/calculate/batch
    • provenance.validRange

    Les entrées de 30 calculateurs ont reçu un maximum, pour la plupart des calculateurs de géométrie (lignes, pastilles, antennes, guides d'ondes), pour que la page puisse les obtenir par résolution, et la capacité de bus d'i2c-pullup va désormais jusqu'à 550 pF, la limite du Fast-mode Plus. L'API ne refuse pas une valeur au-delà de la plage d'une entrée ; provenance.validRange la signale comme hors plage.

  54. Douze calculateurs de capteurs gagnent un étage d'entrée : sa tension, le code du CAN et la résolution

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    ntc-thermistor, rtd-temperature, pt100-resistance, thermocouple-voltage, wheatstone-bridge, strain-gauge-bridge, pressure-bridge-output, load-cell-amplifier, hall-effect-sensor, current-shunt, accelerometer-sensitivity et lvdt-sensitivity acceptent des entrées facultatives d'étage d'entrée et renvoient trois nouvelles sorties. Les entrées sont un diviseur (fixedResistor, sensorPosition ou ntcPosition) ou un amplificateur (frontGain), et un CAN (adcRef, adcBits), en réutilisant une entrée que le calculateur avait déjà (gain, amplifierGain, adcVoltage, supplyVoltage). Les sorties sont la tension de l'étage d'entrée (dividerVoltage ou amplifiedVoltage), adcCode (un code unipolaire sur N bits, maintenu entre 0 et 2^N − 1) et resolution (la grandeur physique par pas du CAN en ce point).

    load-cell-amplifier accepte la charge appliquée à la cellule (appliedLoad) et renvoie sa sortie (bridgeOutputMv) ; accelerometer-sensitivity accepte acceleration et renvoie outputVoltage.

    Chaque nouvelle entrée est facultative et, à sa valeur par défaut, aucune sortie existante ne change : une requête écrite avant cette modification renvoie les mêmes valeurs qu'avant, plus les nouvelles sorties.

  55. current-shunt : le gain de l'amplificateur vaut 20 par défaut

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    Lorsqu'une requête omet amplifierGain, current-shunt utilise désormais 20 là où il utilisait 50. Avec les autres valeurs par défaut (10 A dans 10 mΩ, un CAN de 3,3 V), un gain de 50 portait le CAN à 5 V, au-delà de sa référence. Un gain de 20 donne 2 V. amplifiedVoltage et adcResolutionCurrent changent pour ces requêtes ; une requête qui précise amplifierGain n'est pas concernée.

  56. hall-effect-sensor : un champ nul ou négatif est refusé

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    hall-effect-sensor renvoie désormais une erreur pour un Bfield inférieur ou égal à 0 mT, comme le faisait déjà le site, là où l'API renvoyait des valeurs calculées à partir de celui-ci.

  57. frequency-ppm-tolerance : les avertissements citent les tolérances d'horloge applicables

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/{slug}

    Les avertissements de frequency-ppm-tolerance citaient un budget UART de ±50 ppm (un UART tolère environ 2 %) et jugeaient ±100 ppm trop lâche pour l'USB, qui autorise ±2500 ppm en pleine vitesse. Au-delà de ±50 ppm, l'avertissement cite désormais l'Ethernet 100BASE-TX et l'horloge radio du Bluetooth LE. Au-delà de ±100 ppm, il cite toutes les horloges Ethernet, et au-delà de ±500 ppm l'USB 2.0 haute vitesse. Les seuils de 50 et 100 ppm sont inchangés ; celui de 500 ppm est nouveau.

  58. Largeur de piste et échauffement propres à la carte, tirés du modèle thermique de rftools

    • POST /api/py/v1/calculate (trace-width-current, pcb-trace-temp)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    trace-width-current gagne widthBoardMm, la largeur minimale pour cette carte, et pcb-trace-temp gagne tempRiseBoard et maxTempBoard, l'échauffement et la température maximale sur celle-ci ; les deux gagnent inModelRange. Ces valeurs viennent du modèle thermique propre à rftools, jamais présenté comme IPC-2152 : un réseau thermique sous forme fermée ajusté sur un solveur 2D en volumes finis, réservé aux tests, de la piste, du stratifié, du plan et de l'air immobile (convection et rayonnement), lui-même vérifié par rapport à des mesures publiées (conditions de l'IPC-TM-650 2.5.4.1A, ajustements de Brooks & Adam sur les abaques de l'IPC-2152, et d'autres) et assorti d'une marge de 15 % sur l'échauffement, tirée du pire d'entre eux. Dans sa plage validée (largeur de piste 0,25–5,1 mm, carte 1,4–3,2 mm, une piste interne à partir de 1,27 mm de large, un échauffement de 5–100 °C, un plan à 0,1 mm ou plus), l'ajustement reste à 2,81 % du solveur.

    Nouvelles entrées, ajoutées avec des valeurs par défaut pour qu'une requête existante calcule à l'identique : boardThickness (mm, valeur par défaut 1,6), planeDistance (mm jusqu'à un plan de cuivre, 0 s'il n'y en a pas) et planeCopperWeight (oz, valeur par défaut 0,5) sur les deux calculateurs, et isExternal sur pcb-trace-temp. Toutes les sorties existantes sont inchangées. Avec les valeurs par défaut, widthBoardMm vaut 0,30212 mm, à côté des 0,78144 mm de Figure 5-1, et tempRiseBoard 10,2818 °C.

    Hors de la plage validée, le résultat est toujours donné, avec inModelRange à 0 et un avertissement qui nomme la borne ; une carte de moins de 1,4 mm renvoie à Figure 5-1, où le modèle et les données d'épaisseur publiées de l'IPC-2152 divergent. Un emballement thermique renvoie null pour l'échauffement propre à la carte. provenance.validRange gagne models sur ces deux calculateurs, chaque modèle ajusté avec son propre inside : d'abord l'ajustement de l'IPC-2152 Figure 5-1, puis le modèle thermique, et status vaut outside si l'un ou l'autre l'est. Une requête à ces calculateurs avec un courant, un échauffement, un poids de cuivre ou une longueur nuls ou négatifs est refusée dans le navigateur comme par l'API, et un courant négatif est refusé au lieu de recevoir une réponse 500.

  59. Sept sorties que les calculateurs ne pouvaient pas calculer sont supprimées

    • POST /api/py/v1/calculate (differential-via, usb-termination, parabolic-dish-antenna)
    • POST /api/py/v1/calculate/batch
    • MCP run_calculation
    • rftools-io SDK

    differential-via ne renvoie plus diffImpedance, commonImpedance, oddImpedance, evenImpedance ni singleEndedImpedance. Une résolution de champ (un solveur quasi statique 3D validé sur quatre formes fermées et recoupé en pleine onde avec openEMS à 0,4 % près) a montré que l'impédance d'une paire de vias dépend de l'espacement des plans qu'elle traverse, qui n'est pas une entrée : avec les valeurs par défaut, elle vaut 85,6 Ω pour un espacement de plans de 0,1 mm et 96,0 Ω pour 1,0 mm, là où le calculateur indiquait 44,10 Ω. Aucune relation entre les entrées du calculateur n'approche chaque cas à 10 % près, et l'impédance de mode commun dépend en outre du chemin du courant de retour. La résonance du stub et les pertes sont toujours renvoyées ; voir l'entrée sur les corrections.

    usb-termination ne renvoie plus eyeOpening, une heuristique qu'aucune spécification USB ne définit. parabolic-dish-antenna ne renvoie plus noiseTemperature, qui valait 290·(1 − η) : la température de bruit d'une antenne dépend de son élévation, de son débordement et du ciel, dont aucun n'est une entrée du calculateur.

    Un appelant qui lit l'une de ces clés doit cesser de le faire : la clé est absente, et non null. Toutes les autres sorties des trois calculateurs sont toujours renvoyées.

  60. Les valeurs qui n'existent pas sont absentes ou null, et non égales à zéro ou à une valeur sentinelle

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Ces sorties valent désormais null là où la grandeur n'est pas définie, là où elles étaient auparavant un nombre : la signalRiseTime de usb-termination pour l'USB 3.0, qui ne spécifie aucun temps de montée de l'émetteur (l'USB 2.0 donne son minimum de 500 ps, T_HSR) ; les sorties de couplage de pcb-crosstalk-emc au-delà de la limite du couplage faible, (x_C + x_L)/2 = 0,1, où le modèle à constantes localisées ne s'applique plus ; vbSealed et f3Sealed de subwoofer-box pour Qts ≥ 0,707, où aucun alignement en enceinte close n'existe (ils donnaient 2·Vas) ; le qFactor de planar-spiral-inductor à la résonance propre ou au-delà ; le foret et la fraise de recouvrement d'aperture-diagonal lorsqu'aucun outil disponible ne convient (ils donnaient 0) ; le qFactor de lc-resonance sans résistance, le Q non borné d'un circuit sans pertes (il donnait 9999, et la bande passante f₀/9999 ; la bande passante vaut désormais 0) ; et la stubResonance de differential-via en l'absence de stub (elle donnait 0 GHz). Chaque null s'accompagne d'un avertissement qui en donne la raison.

    Une entrée refusée ne renvoie désormais aucune valeur, seulement son erreur, là où ces calculateurs renvoyaient des zéros ou des valeurs partielles : power-density, thermal-via-array, bga-breakout-width sans canal, dual-stripline avec h₂ ≤ 0, fresnel-zone, et chaque refus de doppler-shift, reactance-calculator, broadside-coupled-pair, fusing-current, rise-time-bandwidth, current-divider, delta-wye-conversion, voltage-drop, rt60-reverberation et vfd-motor-speed. Un zéro à côté d'une erreur se lisait comme un résultat.

    Un appelant qui traitait ces valeurs comme des nombres doit vérifier si elles valent null, ou si la clé est absente à côté d'une erreur. /calculate/solve ignore déjà les points sans la sortie.

  61. Calculateurs corrigés d'après leurs références, avec trois nouvelles entrées et de nouvelles sorties

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • POST /api/py/v1/jobs (emi_radiated)
    • MCP run_calculation
    • MCP simulate_emi_radiated
    • rftools-io SDK

    Constantes. La résistivité du cuivre est partout celle de l'IEC 60028, 1/58 Ω·mm²/m (trace-resistance 100,217 → 100,458 mΩ avec ses valeurs par défaut ; les autres calculateurs sur le cuivre bougent de 0,008 %, l'épaisseur de peau de 0,004 %). Le moteur microstrip utilise η₀/2π là où il utilisait 60, ainsi que la vitesse exacte de la lumière : toute impédance basée sur la microstrip bouge donc de −0,069 % (microstrip-impedance 80,954 → 80,898 Ω, differential-pair 99,983 → 99,914 Ω, et avec elles les largeurs résolues). Tous les calculateurs partagent désormais un même η₀ = µ₀·c (CODATA 2018). L'impédance d'onde de power-density vaut µ₀·c, 376,730 Ω (elle valait 120π). Le retard de controlled-impedance vaut √εeff/0,299792458 ps/mm (6,52995 → 6,53447). La tâche emi_radiated utilise π·µ₀/c et µ₀ pour ses champs : elle concorde donc désormais avec radiated-emission-estimate (elle donnait 0,021 dB et 0,023 dB de trop).

    Modèles. planar-spiral-inductor reprend les éléments parasites de Jow & Ghovanloo et la longueur de piste de sa forme : résonance propre 68,0 → 601,7 MHz et Q à 100 MHz 814,5 → 116,8 avec les valeurs par défaut, avec la nouvelle entrée facultative frequency (MHz, valeur par défaut 100) pour Q. pcb-crosstalk-emc est le modèle à deux extrémités de Paul : les clés existantes sont par extrémité (la moitié des anciennes valeurs), farEndCrosstalk est nouvelle, et les valeurs par défaut sont une horloge de 3,3 V à 25 MHz. subwoofer-box accorde l'évent selon Margolis & Small (20,246 → 40,273 Hz) et ajoute f3Vented. pcb-crosstalk repose sur le moteur de microstrips couplées, avec la nouvelle entrée dielectricConst (valeur par défaut 4,5 ; couplage 6,77 → 5,72 %). La résistance de bord de patch-antenna suit le modèle à fentes rayonnantes de Balanis avec le η₀ exact, sans écrêtage (306,80 → 321,22 Ω ; la résistance d'alimentation et l'encoche à 50 Ω suivent). lc-resonance traite sa résistance série comme une perte série dans les deux topologies, Q = Z₀/R (le mode parallèle calculait R/Z₀), et ajoute impedanceAtResonance_ohm : R en série, L/(C·R) en parallèle. La résonance du stub de differential-via est présentée comme la borne supérieure à vide, et sa perte dans les conducteurs comme la borne supérieure pour des plans denses (0,030 → 0,011 dB).

    Règles. Un réseau de microvias est dimensionné d'après sa section totale, note 5 de l'IPC-2221 (dix vias 2,762 → 1,466 A). L'auto-échauffement d'un via est le maximum du fût, P·L/(8kAN), dans via-voltage-drop (0,2506 → 0,0313 °C) et microvia-current-capacity. bga-breakout-width compte la rangée extérieure (escapeRows 1 → 2). padstack-annular-ring évalue le rapport d'aspect selon le tableau 9-4 de l'IPC-2222, 8:1 pour chaque classe, avec un contrôle du perçage minimal selon le tableau 9-6, et la couronne interne de la classe 3 vaut 0,025 mm. thermal-via-array compte des vias entiers. i2c-pullup et rs485-termination renvoient leurs résistances non arrondies (l'affichage arrondit toujours). aperture-diagonal accepte la nouvelle entrée routerBit.

    Une requête qui omet l'une des nouvelles entrées obtient sa valeur par défaut.

  62. Quatre sorties qui gardaient la même valeur pour toute entrée sont supprimées

    • POST /api/py/v1/calculate (balun-transformer, opamp-bandwidth, capacitor-code)
    • POST /api/py/v1/calculate/batch
    • MCP run_calculation
    • rftools-io SDK

    Chacune de ces sorties renvoyait la même valeur quelles que soient les entrées, et aucune n'était un résultat : vswr (1,0, « VSWR (ideal) ») et insertionLoss (0,3 dB, « Typical Insertion Loss ») de balun-transformer ; slewLimited d'opamp-bandwidth (0, un emplacement réservé pour une vérification qui exige des entrées de vitesse de balayage et d'amplitude dont le calculateur ne dispose pas) ; et voltageCode de capacitor-code (0 V, une tension nominale qu'un code à 3 chiffres ne code pas). Elles ne sont plus renvoyées, pas même à côté d'un refus.

    Un appelant qui lit l'une de ces clés doit cesser de le faire : la clé est absente, et non null. Ce que représentait chaque valeur figure désormais dans provenance.assumptions : ideal-transformer sur balun-transformer (adapté par construction ; les pertes du noyau et des enroulements ne sont pas modélisées, et un balun à ferrite perd typiquement 0,1 à 1 dB) et capacitance-only sur capacitor-code. Toutes les autres sorties des trois calculateurs sont inchangées.

  63. Le gain de loop-antenna inclut son rendement de rayonnement

    • POST /api/py/v1/calculate (loop-antenna, capacitor-code)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Le gain de loop-antenna valait 1,76 dBi pour toute entrée : la directivité d'une petite boucle, 3/2, sans aucune de ses pertes. Il vaut désormais cette directivité multipliée par le rendement de rayonnement e = R_rad/(R_rad + R_loss), tiré des deux résistances que le calculateur renvoie déjà : G = 10·log₁₀(1,5·e) (Balanis, Antenna Theory, 4e éd., chapitre 2 et section 5.2). Avec les valeurs par défaut, une boucle de 1 m en cuivre de 10 mm à 7 MHz, il vaut −9,4043 dBi, 11,2 dB sous l'ancienne valeur ; une boucle dont les pertes sont faibles devant sa résistance de rayonnement donne toujours près de 1,76 dBi. Le rendement est la nouvelle sortie radiationEfficiency (%), 7,6467 % avec les valeurs par défaut.

    capacitor-code arrondissait dans l'API un code fractionnaire au pair le plus proche là où la page arrondit à la valeur supérieure : 104,5 était décodé en 100 nF par l'API et en 1 µF par la page. Les deux donnent désormais 1 µF.

  64. Huit entrées qui ne changeaient aucun résultat en fixent désormais un ; onze nouvelles sorties

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Chacune des entrées ci-dessous était déclarée mais n'était lue par aucune sortie. Elle fixe désormais une nouvelle sortie, ajoutée après les sorties existantes et calculée à partir d'une relation que le calculateur établit déjà ; aucune sortie existante ne change, pour aucune entrée. patch-antenna : feedOffset fixe feedResistance_ohm, R_edge·cos²(π·y₀/L) (Balanis, Antenna Theory, 4e éd., section 14.2.1, éq. 14-20a), 306,795 Ω avec l'alimentation au bord par défaut et 65,501 Ω à 10 mm, et insetFeedPosition_mm est l'encoche qui donne 50 Ω, 10,594 mm. flyback-converter : fsw fixe primaryInductance (µH), Vin·D/(fsw·Ipk) pour le propre courant crête en conduction critique du calculateur, 130,56 µH. solar-panel-sizing : batteryCapacity fixe batteryAutonomyDays, C·V·0,5/(P·24 h) à la profondeur de décharge de 50 % que suppose la capacité requise, 0,25 jour. rs485-termination : baudRate fixe baudRateUtilisation (%), le débit en proportion du maximum de 10⁸ bit·m, 11,52 %. adc-snr : samplingFreq fixe nyquistZone, ⌊f_in/(f_s/2)⌋ + 1, et aliasFrequency (MHz), |f_in − f_s·round(f_in/f_s)| (Kester, Analog Devices MT-002) : zone 1 et 1 MHz avec les valeurs par défaut, zone 2 et 30 MHz pour 70 MHz à 100 MSPS. bldc-thermal : continuousCurrent fixe ratedCurrentShare (%), le courant de fonctionnement rapporté au courant nominal, 75 %. bldc-winding : supplyVoltage fixe noLoadSpeed (tr/min), Kv·V, 11 406,44 tr/min. Les valeurs sont données aux valeurs par défaut de chaque calculateur.

    Deux autres nouvelles sorties : assumedBoomLength (m) sur yagi-antenna, la longueur de boom qu'implique son espacement d'éléments de 0,2λ, (N − 1)·0,2λ, 1,6655 m avec les valeurs par défaut, qui remplace son entrée de longueur de boom retirée (voir cette entrée) ; et radiationEfficiency (%) sur loop-antenna (voir l'entrée sur son gain). Sur le site uniquement, le widget réglementaire en direct d'ism-coexistence affiche désormais la bande que choisit son bandIndex ; son résultat est inchangé.

    Une requête qui omet l'une de ces entrées obtient sa valeur par défaut. patch-antenna sans feedOffset et solar-panel-sizing sans batteryCapacity recevaient jusqu'ici une réponse 400 ; les deux reçoivent désormais une réponse.

  65. Douze entrées qui n'ont jamais changé un résultat sont retirées ; une requête qui en envoie une reçoit un avertissement

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • MCP get_calculator_schema
    • rftools-io SDK

    Ces entrées étaient déclarées, mais aucune de leurs valeurs ne changeait une sortie, un avertissement ou un refus : smith-chart frequency, via-calculator signalLayer, stackup-builder layerCount (le modèle est un empilage fixe à quatre couches, ce que dit désormais son titre), i2c-pullup numDevices, fm-modulation-index carrierFreq, quantization-noise frequency, 555-timer vcc, bldc-efficiency polePairs, opamp-bandwidth phase_margin, battery-internal-resistance temperature, rs485-termination numNodes et yagi-antenna boomLength. Elles quittent le catalogue, les bornes de la provenance et le schéma MCP ; chaque calculateur les liste sous retiredInputs, avec la date.

    Une requête qui en envoie encore une reçoit les mêmes valeurs qu'avant et l'avertissement existant « Input '<key>' is not read by this calculator and was ignored. ». Elle n'est jamais refusée. POST /calculate/solve refuse de résoudre pour l'une d'elles, comme pour toute entrée non déclarée ; aucune grille sur elle n'aurait pu faire bouger une sortie. Une requête à yagi-antenna sans boomLength, qui recevait jusqu'ici une réponse 400, reçoit désormais une réponse.

    La prochaine version de rftools-io conserve chaque mot-clé retiré : en passer un déclenche un DeprecationWarning qui nomme la clé et sa date de retrait, et la clé n'est pas envoyée.

  66. trace-width-current lit sa largeur IPC-2152 sur l'IPC-2152 Figure 5-1 ; pcb-trace-temp indique l'échauffement selon l'IPC-2152

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    La width2152mm de trace-width-current, présentée comme IPC-2152, valait la largeur IPC-2221 × 0,75 sur une couche externe et × 0,85 sur une couche interne, un facteur que l'IPC-2152 ne contient pas et plus étroit que toute lecture IPC-2152 à partir de 2 A. Elle suit désormais l'IPC-2152 (2009) Figure 5-1, l'abaque que l'IPC-2152 recommande pour les conducteurs internes et externes dans tous les environnements, via l'ajustement publié I = 0,024·ΔT^0,44·A^0,725, identique sur les deux couches : 0,7814 mm avec les valeurs par défaut, contre 0,2266 mm auparavant ; à 5 A, avec un échauffement de 10 °C et 1 oz sur une couche externe, 7,194 mm, contre 2,086 mm auparavant. Elle reproduit à 5 % près les lectures d'Olson (2010) sur la Figure 5-1 de 300 et 680 sq mil. La clé est inchangée ; son libellé est désormais « Min Width (IPC-2152 Fig. 5-1) ».

    Les deux calculateurs prennent le cuivre à 35 µm par once, si bien que width2221mm bouge de −0,58 % (0,3004 mm avec les valeurs par défaut, contre 0,3021 mm). resistance, voltageDrop et powerDiss de trace-width-current sont calculés pour une nouvelle entrée, la largeur de piste dessinée, là où ils utilisaient le minimum IPC-2221, avec le cuivre selon l'IEC 60028 à 1/58 Ω·mm²/m : 0,10433 Ω avec les valeurs par défaut, contre 0,17326 Ω.

    Nouvelle entrée facultative, ajoutée ; une requête qui l'omet obtient sa valeur par défaut : traceWidth sur trace-width-current (mm, 0,5). Nouvelles sorties : inChartRange sur les deux calculateurs (1 dans la plage que trace l'IPC-2152 Figure 5-1, 0 en dehors, reporté dans provenance.validRange avec le pire résidu de l'ajustement), et tempRise2152 et maxTemp2152 sur pcb-trace-temp, l'échauffement selon la Figure 5-1 (k = 0,024, toute couche) à côté de l'échauffement externe selon l'IPC-2221 : 25,815 °C avec les valeurs par défaut, à côté de 5,342 °C. Les sorties existantes de pcb-trace-temp conservent leurs clés et leurs valeurs.

    Les résultats hors des abaques sont donnés et signalés, jamais refusés : un avertissement nomme la grandeur et la borne de l'abaque, pour les courbes de 10 à 45 °C et 700 sq mil de la Figure 5-1, les 10 à 100 °C et 700 sq mil de l'abaque A de l'IPC-2221 sur une couche externe, et les ½ à 3 oz de l'abaque B ; au-delà de la Figure 5-1, provenance.validRange.status vaut outside.

    Références : trace-width-current, pcb-trace-temp, microvia-current-capacity et via-calculator citaient l'IPC-2221B pour l'abaque de courant, que cette édition (2012) ne contient pas. Ils citent désormais l'IPC-2221A (2003) Figure 6-4, l'abaque de l'IPC-2221 (1998), et l'IPC-2152 (2009) Figure 5-1 ; aucune valeur des deux derniers ne change.

  67. Douze calculateurs appliquent le modèle que décrivent leur page et leur référence

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Chacun des calculateurs ci-dessous calculait un modèle qui s'arrêtait en deçà de ce que décrivent sa page et sa référence, de la même façon dans le navigateur, l'API et le serveur MCP. Chacun calcule désormais le modèle publié et est testé sur un cas publié, et la vérification de parité maintient le navigateur et l'API sur les mêmes valeurs. Les calculs enregistrés stockent des entrées : ils sont donc recalculés. bldc-winding, qui relève de la même modification, a sa propre entrée du 2026-10-11.

    Les valeurs changent pour : cable-shield-effectiveness (impédance de transfert R_T + jωM_T, et efficacité de blindage rapportée à l'impédance de ligne, Hähner & Mund 1998 : 64,95 dB avec les valeurs par défaut, contre 30,97 dB rapportés à 1 Ω, sans plancher à 0 dB), ferrite-bead (R_DC + (R_AC ∥ L ∥ C) d'Analog Devices AN-1368, calée sur l'impédance saisie à 100 MHz, et la perte d'insertion complexe entre la source et la charge : la perle par défaut de 600 Ω donne 94,9 Ω à 1 GHz, contre 1897 Ω), mosfet-operating-point (le point de fonctionnement sur la droite de charge du drain, Sedra & Smith 7e section 5.3 ; voir l'entrée incompatible ci-dessous), bldc-motor (la poussée à la vitesse où les couples du moteur et de l'hélice s'équilibrent, Drela 2007, avec C_P 0,047 : 140,91 g avec les valeurs par défaut, contre 80,43 g à 75 % fixe de la vitesse à vide), ethernet-cable (perte d'insertion du câble selon l'ANSI/TIA-568-C.2 à la fréquence de signalisation de chaque PHY, 31,25, 62,5 ou 400 MHz : 7,69 dB avec les valeurs par défaut, contre 16,5 dB ; la catégorie 8 est un canal de 30 m à toute vitesse), radar-range-equation (la portée au SNR qu'exige l'équation d'Albersheim pour P_d et P_fa : 35,23 km avec les valeurs par défaut, contre 74,96 km à SNR = 1, et snrAtMaxRange indique ce SNR, là où il valait 0), bldc-efficiency (pertes cuivre I²·R avec la résistance entre bornes, Drela 2007 et le maxon Formulae Handbook : 4,500 W avec les valeurs par défaut, contre 6,750 W), bldc-thermal (la résistance de l'enroulement à la température qu'il atteint, maxon Formulae Handbook section 9.2, avec les mêmes pertes cuivre : 207,61 °C avec les valeurs par défaut, contre 184,47 °C ; voir l'entrée incompatible ci-dessous), class-d-efficiency (conduction dans les FET qui portent la charge simultanément, I²·R_DS(on)·N/2 : 0,625 W avec les valeurs par défaut, contre 1,250 W), motor-driver-power (deux FET en conduction et un en commutation dure, TI SLVA504A : un pont de 0,1440 W avec les valeurs par défaut, contre 0,2088 W), et coax-impedance et via-calculator (Z₀ tirée de η₀/2π = 59,9585 Ω avec les constantes CODATA 2018, là où ils utilisaient 60 : 47,990 Ω et 35,2243 Ω avec les valeurs par défaut, contre 48,023 Ω et 35,2487 Ω).

    Nouvelles entrées facultatives, ajoutées ; une requête qui en omet une obtient sa valeur par défaut : transferInductance (nH/m, 0,159155, qui reproduit l'impédance de transfert précédente à 10 mΩ/m) et lineImpedance (Ω, 50) sur cable-shield-effectiveness ; beadInductance (µH, 1,208), parasiticCapacitance (pF, 1,678) et sourceImpedance (Ω, 0) sur ferrite-bead ; biasMode (0 résout la droite de charge, 1 prend V_DS tel que saisi ; valeur par défaut 0) sur mosfet-operating-point ; pd (0,9), pfa (1×10⁻⁶) et pulses (1, intégrées de façon non cohérente) sur radar-range-equation ; transitionTime (ns, 50) sur motor-driver-power.

    Nouvelles sorties : vdsOperating sur mosfet-operating-point, loadedRpm et loadedCurrent sur bldc-motor, et gateDriveLoss (2·Q_g·V·f, dissipée dans le pilote de grille) sur motor-driver-power.

    Clés conservées, avec des significations qui correspondent désormais à leurs libellés : le conductionLoss de motor-driver-power est la perte d'une position en conduction (I²·R), switchingLoss celle de l'unique FET en commutation dure, totalLossPerFet le FET le plus chaud, et efficiency est rapporté à V·I·D et compte la commande de grille. L'entrée phaseResistance de bldc-efficiency et bldc-thermal est présentée comme la résistance entre bornes, mesurée entre deux fils, ce qu'elle a toujours été.

    La perte d'insertion de la catégorie 8 utilise les coefficients provisoires que le modèle de canal de l'IEEE 802.3bq cite pour la catégorie 8 TIA (projet d0.7 : 1,8·√f + 0,005·f + 0,25/√f dB pour 100 m), et chaque résultat de catégorie 8 le précise, faute de disposer du tableau publié de la TIA-568.2-D.

    Nouveaux refus et avertissements : ferrite-bead refuse une impédance à 100 MHz que ses L et C ne peuvent pas atteindre, en nommant la plus grande possible ; radar-range-equation refuse une P_d qu'aucun détecteur n'atteint à cette P_fa et avertit hors de la plage indiquée par Albersheim ; cable-shield-effectiveness avertit quand le câble dépasse un sixième de longueur d'onde ou que le couplage n'est plus faible ; ethernet-cable avertit quand une catégorie est évaluée au-delà de la fréquence pour laquelle elle est spécifiée.

  68. mosfet-operating-point résout la droite de charge par défaut ; bldc-thermal renvoie null là où l'enroulement s'emballe

    • POST /api/py/v1/calculate (mosfet-operating-point, bldc-thermal)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    mosfet-operating-point résout désormais par défaut la loi quadratique avec la droite de charge du drain V_DS = V_DD − I_D·R_D (Sedra & Smith, Microelectronic Circuits, 7e éd., section 5.3, exemple 5.5) : vdd et rdLoad fixent donc le point de fonctionnement, et un vds saisi ne le fait plus. Avec les valeurs par défaut, il donne 11,96 mA en régime ohmique à V_DS 0,0401 V, là où il donnait 450 mA, que la charge de 1 kΩ ne peut pas laisser passer sous 12 V. Un appelant qui s'appuie sur le vds saisi doit envoyer biasMode: 1, qui conserve le calcul précédent et avertit quand V_DS + I_D·R_D s'écarte de plus de 1 % de V_DD. La nouvelle sortie vdsOperating donne la V_DS du point de fonctionnement dans les deux modes.

    bldc-thermal tient désormais compte de la hausse de la résistance de l'enroulement avec la température (maxon Formulae Handbook, 2012, section 9.2). Là où α·Rθ·R₂₅·I² ≥ 1, il n'y a pas de régime permanent : les pertes cuivre croissent avec la température plus vite que le chemin thermique ne les évacue. tempRise, steadyStateTemp, thermalMargin et hotResistance y valent null, avec un avertissement qui nomme le courant en dessous duquel l'enroulement se stabilise ; c'étaient auparavant des nombres (467,97 °C à 25 A sur le moteur par défaut, qui s'emballe désormais au-delà de 23,21 A). Un appelant qui les lit comme des nombres doit traiter null. deratedCurrent et timeToLimit sont toujours des nombres.

    Le timeToLimit de bldc-thermal vaut null, avec un avertissement, lorsque le courant crête stabilise l'enroulement sous sa limite, si bien que la limite n'est jamais atteinte. Il valait auparavant la valeur sentinelle 9999 s, qui se lisait comme une durée réelle.

  69. bldc-winding : le taux de remplissage compte les deux côtés de bobine, et le facteur de bobinage de l'étoile des encoches

    • POST /api/py/v1/calculate (bldc-winding)
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    fillFactor compte désormais les deux côtés de bobine de chaque encoche, 2·N·A_wire/A_slot (Pyrhönen, Jokinen & Hrabovcová, Design of Rotating Electrical Machines, 2008, section 2.9) : une bobine sur chaque dent place deux côtés de bobine dans chaque encoche. Il n'en comptait qu'un, si bien que chaque taux de remplissage double. Il n'est plus plafonné à 100 % : un bobinage qui ne tient pas renvoie sa valeur réelle, avec les avertissements à 75 % et 90 % comme avant.

    windingFactor tire son facteur de distribution de la méthode de l'étoile des encoches, k_d = sin(π/6)/(z·sin(π/(6z))) pour q = S/(3P) = z/n sous forme irréductible (Bianchi & Dai Pré, 2006). Il valait 1 pour tout q arrondi à 1, si bien que les bobinages à nombre fractionnaire d'encoches donnaient trop : 12 encoches et 14 pôles donnent désormais 0,93301 (contre 0,96593), 18 encoches et 16 pôles 0,94521 (contre 0,98481). Les bobinages à nombre entier d'encoches sont inchangés. turnsPerCoil, actualKv, deltaEquivKv et phaseResistance suivent : le bobinage par défaut de 935 Kv reste à 4 spires et atteint 1027,61 Kv (contre 992,59), et 920 Kv sur un stator de 23 × 10 mm demande 6 spires (contre 5).

    Le maxCurrent par défaut du calculateur vaut 5 A (contre 10 A), si bien que son bobinage EMAX MT2213 par défaut est réalisable : 4 spires d'AWG 18 à 47,24 % de remplissage. À 10 A, il faut de l'AWG 14 et 119,44 %. L'API n'applique aucune valeur par défaut : une requête qui envoie maxCurrent est calculée avec la valeur envoyée.

  70. Trente calculateurs corrigés selon la relation qu'ils citent

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/calculate/solve
    • MCP run_calculation
    • rftools-io SDK

    Chacun des calculateurs ci-dessous calculait autre chose que sa référence citée, de la même façon dans le navigateur, l'API et le serveur MCP. Chacun calcule désormais la relation de la référence et est testé sur une valeur publiée. Les calculs enregistrés stockent des entrées : ils sont donc recalculés.

    Les valeurs changent pour : equalizer-q-factor (largeur de bande en octaves à Q constant), capacitor-code (un chiffre multiplicateur 8 signifie ×0,01, 9 signifie ×0,1), opamp-gain (la bande passante est le GBW divisé par le gain de bruit), coax-impedance (coupure TE11 sur la circonférence moyenne), h-bridge-selection (deux FET conduisent à la fois), bldc-winding (le facteur √3 relève de l'étoile ; nouvelles valeurs par défaut tirées d'un vrai moteur 12N14P), speaker-crossover (inductances du 2e ordre √2·R/ω_c, le double de l'ancienne valeur, y compris dans l'export KiCad), esd-tvs-diode (le niveau IEC 61000-4-2 reprend le premier pic de la norme, 3,75 A/kV), common-mode-choke (une impédance série complexe dans un système 50 Ω/50 Ω), uart-baud-rate (les parités mark et space comptent un bit), bldc-motor (poussée statique C_T·ρ·n²·D⁴ avec C_T 0,11), resistor-color-code (orange ±0,05 %, jaune ±0,02 % ; un anneau de tolérance blanc est refusé), pt100-resistance (le C de l'IEC 60751 sous 0 °C, et la pente complète), torque-units, energy-units et torque-unit-converter (facteurs exacts de la NIST SP 811), via-thermal-resistance (capacité en courant tirée de l'ajustement IPC-2221), thermal-via-array (le fût métallisé est en cuivre quel que soit le remplissage), stackup-builder (L3 résolue en stripline, L1 avec l'épaisseur de cuivre, le cuivre compté dans le total), coplanar-waveguide (le CPW avec plan de masse reste fini pour les pistes larges), i2c-pullup (V_OL vaut 0,2·V_DD à 2 V ou moins), vibration-phase-noise (le terme aléatoire décroît avec l'écart de fréquence ; la déviation est la valeur crête), inrush-current-limiter (le pic au démarrage à froid vaut V/R_cold), shielding-effectiveness (les pertes par réflexion intègrent η₀ ; réflexions multiples ajoutées), ethernet-cable (la catégorie 5e à 10 Gb/s échoue), ground-plane-impedance (inductance µ₀·h·l/w ; résistance en alternatif sur une seule face) et minimum-conductor-spacing (tableau 6-1 de l'IPC-2221B par plage, avec ses taux par volt au-delà de 500 V).

    Nouvelles entrées facultatives : separation sur ground-plane-impedance (mm, valeur par défaut 1) et tempRise sur via-thermal-resistance (°C, valeur par défaut 10). Une requête qui les omet obtient la valeur par défaut, qui reproduit les exemples de calcul publiés.

    Nouvelles sorties : hotRestartInrush sur inrush-current-limiter et multipleReflectionLoss sur shielding-effectiveness.

    Les sorties sans valeur reviennent désormais à null avec un avertissement, là où elles étaient un nombre : la longueur d'onde guidée et les vitesses de phase et de groupe de waveguide-cutoff sous la coupure, et la largeur de stackup-builder pour une impédance cible que la couche ne peut pas atteindre.

    comparator-hysteresis et pcb-trace-temp ne changent que leurs libellés et la formule indiquée : aucun nombre ne change.

    POST /api/py/v1/calculate/solve refuse une grid plus fine que 1×10⁻¹² de l'ordre de grandeur de la plage par un refus grid 400, avant toute évaluation et sans facturation. Une telle grille pouvait retenir une requête jusqu'à expiration du délai.

  71. radiated-emission-estimate : marge par rapport à la CISPR 32 classe B, null là où elle ne fixe pas de limite

    • POST /api/py/v1/calculate (radiated-emission-estimate)
    • POST /api/py/v1/calculate/batch
    • MCP run_calculation
    • rftools-io SDK

    La marge est désormais prise par rapport à la limite CISPR 32 classe B à la distance de mesure : tableaux A.4 et A.5, la ligne à 3 m sous √30 m et la ligne à 10 m au-dessus jusqu'à 1 GHz, les lignes en valeur moyenne à 3 m de 1 à 6 GHz, 20 dB/décade à partir de la distance tabulée, et la limite la plus basse en bord de bande. C'était auparavant 40 dBµV/m fixes, à toute fréquence et toute distance.

    En dessous de 30 MHz et au-dessus de 6 GHz, la CISPR 32 ne fixe aucune limite rayonnée : margin y vaut donc null, avec un avertissement. C'était auparavant un nombre. Un appelant qui lit margin comme un nombre doit traiter null.

    Le champ est l'estimation d'une petite boucle en espace libre, désormais avec la constante exacte π·µ₀/c. Une mesure au-dessus d'un plan de masse peut donner jusqu'à 6 dB de plus, comme l'indique la page.

  72. filter-designer et six calculateurs RF corrigés

    • POST /api/py/v1/calculate
    • MCP run_calculation
    • rftools-io SDK

    filter-designer : les valeurs du prototype de Tchebychev étaient fausses à partir de l'ordre 4 (g3 1,5733, désormais 2,3661), un Butterworth du premier ordre donnait g1 = 1 (désormais 2), et les valeurs des éléments du passe-bande étaient dix fois trop petites à Q = 10. Les valeurs sont désormais calculées, et non tabulées.

    waveguide-cutoff, free-space-path-loss, rf-link-budget, fresnel-zone, link-margin et radar-range-equation utilisent la vitesse exacte de la lumière, et non 3×10⁸ : les longueurs bougent d'environ 0,07 % et la perte de trajet de 0,006 dB. radar-range-equation utilise aussi la constante de Boltzmann exacte.

    planar-spiral-inductor refuse un diamètre intérieur égal ou supérieur au diamètre extérieur au lieu de renvoyer NaN.

    Quatorze calculateurs ont été ajoutés les 2026-10-05 et 2026-10-06, dont la nouvelle catégorie iot ; interrogez le catalogue par GET ou list_calculators pour les voir.

  73. Impédance du PDN : un modèle de plans convergent, un port déduit et deux nouveaux paramètres

    • POST /api/py/v1/jobs (pdn_impedance)
    • POST /api/py/v1/jobs/estimate
    • MCP simulate_pdn_impedance
    • rftools-io SDK

    Si portX_mm et portY_mm sont omis, le port est désormais placé au point au tiers de la carte (a/3, b/3) plutôt qu'en son centre. Le centre est un nœud de tous les modes de cavité d'indice impair : les premières résonances n'apparaissaient donc jamais avec les valeurs par défaut. Une requête qui indique le port obtient le port demandé.

    Deux paramètres facultatifs : portSize_mm (valeur par défaut 1 mm, 0,25–20), le côté du carré par lequel le courant du CI entre dans les plans, et boardInductance_nh (valeur par défaut 1 nH, 0–20), l'inductance entre le régulateur et les plans, qui était fixée à 1 nH. Un port qui dépasse d'un bord de la carte est accepté et modélisé avec son image ; un port dont le centre est hors de la carte, ou qui est plus grand que la carte, est refusé.

    Les résultats changent. La somme modale du plan était tronquée en fonction de freqMax_hz et, avec un port ponctuel, ne convergeait jamais : les résultats variaient donc avec le balayage. Elle converge désormais et ne dépend pas du balayage en dessous du premier mode. Au port par défaut, l'inductance d'étalement du plan vaut environ 1,5 nH là où elle était donnée à environ 0,2 nH : la résonance série du plan nu descend donc d'environ 550 à environ 210 MHz, et les jeux de condensateurs recommandés changent. Les résultats antérieurs ne sont pas recalculés.

    Le verdict et summary.maxZPdnDb couvrent désormais toute la bande de découplage, qui se termine à 0,8 × le premier mode de cavité de la carte, avec le pire cas affiné entre les points de la grille. Nouveaux champs de résultat : summary.band, summary.worstHz, summary.unreachable, resonances[].portCoupling, ainsi que le port, la taille du port et l'inductance de la carte utilisés, sous params. Tous les champs existants sont conservés.

  74. Un appel de résolution pour une valeur cible : chercher une entrée de calculateur pour une sortie cible

    • POST /api/py/v1/calculate/solve

    POST /api/py/v1/calculate/solve trouve la valeur d'une entrée d'un calculateur qui amène l'une de ses sorties à une cible — la largeur de piste qui donne 50 Ω, l'écart qui donne une impédance différentielle cible — et la renvoie avec le résultat direct calculé exactement à cette valeur : values, warnings, errors et provenance, exactement ce que /calculate renvoie pour ces entrées. Un seul appel décompté remplace les nombreux appels directs qu'un client dépenserait autrement à chercher à la main.

    La recherche parcourt les bornes indiquées de l'entrée, resserrées par une range facultative ; une entrée sans borne indiquée en exige une. Une grid facultative arrondit la valeur renvoyée à son multiple le plus proche dans la plage, à côté de la solution non arrondie. Une cible que la recherche ne peut pas atteindre reste un succès, avec reached: false et la valeur la plus proche trouvée, et elle est facturée. Les refus — un calculateur inconnu, un nom d'entrée ou de sortie que le calculateur ne déclare pas, une valeur non finie, une plage manquante sur une entrée non bornée — ne coûtent rien, comme sur toutes les autres routes de calculateur.

    Le Client.solve() du SDK Python (rftools-io 0.4.0) et l'outil solve_calculation du serveur MCP (2.2.0) proposent le même appel.

  75. Un quota épuisé sur les routes de calculateur donne 402, et non 401

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch

    Les routes de calculateur répondaient 401 « Invalid or quota-exceeded API key » aussi bien à une clé non valide qu'à un quota épuisé : un script ne pouvait donc pas distinguer une mauvaise clé d'un mois chargé. Un quota épuisé donne désormais 402, comme la route des tâches le faisait déjà, avec errorKind: "rate_limited", reason, limit, used, resetAt, upgradeUrl, overageUrl et un en-tête Retry-After.

    401 signifie désormais uniquement que la clé est absente, mal formée, inconnue ou révoquée, et ne mentionne jamais de quota. Une requête sans aucune clé reçoit un 401 avec une keyUrl où obtenir une clé gratuite.

    Un appel est vérifié avant d'être décompté : un calculateur inconnu (404) ou une entrée qui n'est pas un nombre fini (400) ne coûtent rien, et un calcul qui échoue est restitué. Dans un lot, seuls les éléments qui passent ces vérifications sont décomptés, et les éléments dont le calcul échoue sont restitués. Basez votre logique sur le statut et errorKind, jamais sur le texte du message.

  76. Le quota mensuel appartient au compte et est partagé par toutes ses clés

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • POST /api/py/v1/jobs

    Chaque clé avait auparavant son propre quota mensuel, si bien qu'un compte disposant de plusieurs clés pouvait consommer son quota une fois par clé. Le quota appartient désormais au compte : les appels de chacune de ses clés, y compris les clés révoquées, sont décomptés d'un seul chiffre mensuel, réinitialisé au début de chaque mois civil en UTC.

    Un compte qui n'a qu'une clé ne voit aucune différence. Les appels restent attribués à la clé qui les a faits, et le tableau de bord et GET /api/py/v1/usage les listent par clé.

  77. Un point de terminaison d'usage, et des en-têtes d'usage sur chaque réponse décomptée

    • GET /api/py/v1/usage
    • X-Usage-Allowance
    • X-Usage-Used
    • X-Usage-Reset
    • X-Usage-Overage

    GET /api/py/v1/usage indique à une clé (X-API-Key ou Authorization: Bearer rfc_…) ou à une session connectée l'offre, le quota, ce qui est consommé et ce qui reste, sa date de réinitialisation, l'état du dépassement et les appels attribués à chacune des clés du compte. Sa consultation n'est jamais décomptée.

    Chaque réponse décomptée porte X-Usage-Allowance, X-Usage-Used (cet appel compris) et X-Usage-Reset, ainsi que X-Usage-Overage lorsqu'un dépassement a été décompté. Les navigateurs peuvent les lire.

  78. Chaque résultat indique comment il a été calculé

    • POST /api/py/v1/calculate
    • POST /api/py/v1/calculate/batch
    • GET /api/py/v1/jobs/{jobId}

    Les résultats des calculateurs et chaque élément d'un lot portent un objet provenance à neuf membres : method, version, formulaRef, assumptions, validRange, computedAt, inputs, seed et elapsedSeconds. Les résultats des tâches portaient déjà provenance ; il gagne formulaRef, assumptions, validRange et computedAt plutôt qu'un second objet, et sa version s'écrit worker@<revision> au lieu de la révision seule.

    Une entrée hors de la plage pour laquelle un calculateur est prévu est tout de même calculée : validRange la nomme et un avertissement est ajouté. Un résultat stocké avant cette modification conserve les membres qu'il avait ; traitez un membre absent comme inconnu.

  79. Les programmes peuvent obtenir une clé par l'autorisation d'appareil

    • POST /api/py/v1/oauth/device/code
    • POST /api/py/v1/oauth/device/token
    • /device/

    Un programme sans navigateur intégré peut obtenir une clé sans que son utilisateur en colle une (autorisation d'appareil OAuth 2.0, RFC 8628). Il demande un code à /oauth/device/code, montre à son utilisateur le code et l'adresse https://rftools.io/device/, puis interroge /oauth/device/token à l'intervalle qui lui a été donné. Une fois que l'utilisateur s'est connecté et a approuvé le code, l'interrogation suivante renvoie une clé d'API ordinaire, une seule fois.

    La clé est décomptée, listée et révocable comme toute autre, et elle compte dans la limite de clés du compte.

  80. Des liens de clé pour les clients, et des libellés sur les clés

    • POST /api/py/v1/apikeys
    • /dashboard/?newKey=1

    POST /api/py/v1/apikeys accepte un corps facultatif {"label", "client"} et renvoie les deux ; sans corps, il fonctionne comme avant. Un client peut envoyer son utilisateur vers https://rftools.io/dashboard/?newKey=1&client=<clientId> pour créer une clé libellée à son nom, affichée une seule fois.

  81. Les refus nomment la limite et le moyen de la dépasser

    • 429 responses
    • 402 from POST /api/py/v1/jobs
    • Authorization: Bearer rfc_…

    Le 429 par minute porte errorKind: "rate_limited", limit, windowSeconds et upgradeUrl à côté de detail, comme chaque autre refus porte son errorKind. Le 402 de la route des tâches pour un quota épuisé gagne reason, limit, used, upgradeUrl et overageUrl, et le 402 pour un quota épuisé des modes de résolution de fdtd_sparam porte reason: "solve_mode". Les champs existants sont inchangés.

    Les routes de calculateur acceptent une clé sous la forme Authorization: Bearer rfc_… aussi bien que X-API-Key, comme les routes des tâches le faisaient déjà.

La référence complète est la documentation de l'API ; la description lisible par machine est le playground OpenAPI et le document OpenAPI.