Sections de la documentation
Bibliothèque Python rftools
Un accès par programme aux 255 calculateurs RF et électronique et aux tâches de simulation : fonctions typées, appels par lots, résolution pour une valeur cible, prise en charge asynchrone et une CLI. Chaque appel nécessite une clé ; une clé gratuite couvre 5 appels par mois.
Installation
pip install rftools-io. Python 3.12 ou ultérieur ; elle installe httpx, pydantic et click. Voir sur PyPI.
Clé d'API
rftools login (ou rftools.Client().login()) affiche une page et un code : ouvrez la page, connectez-vous, approuvez le code, et la clé est enregistrée dans le fichier d'identifiants de votre utilisateur, lisible par vous seul. Ou définissez RFTOOLS_API_KEY, qui a la priorité. rftools.Client() et les fonctions utilitaires du module lisent l'un ou l'autre ; un api_key= explicite l'emporte sur les deux. Les clés commencent par rfc_ ; voir Authentification.
Démarrage rapide
rftools.calculate() renvoie un CalculatorResult : lisez les sorties par nom, ou .values, .warnings et .provenance.
Stubs typés par catégorie
Un module par catégorie de calculateurs, une fonction par calculateur, avec des noms de paramètres et des valeurs par défaut identiques à ceux des pages web. Un slug devient un nom de fonction où - devient _, et un nom qui commencerait par un chiffre reçoit le préfixe calc_.
| Module | Calculateurs | Par exemple |
|---|---|---|
rftools.calculators.rf | 36 | rf.calc_5g_nr_band_lookup(), rf.calc_5g_nr_link_budget() |
rftools.calculators.pcb | 36 | pcb.aperture_diagonal(), pcb.asymmetric_stripline() |
rftools.calculators.power | 23 | power.battery_charge_time(), power.battery_internal_resistance() |
rftools.calculators.signal | 14 | signal.adc_snr(), signal.am_modulation_index() |
rftools.calculators.antenna | 11 | antenna.antenna_beamwidth(), antenna.antenna_downtilt() |
rftools.calculators.general | 24 | general.calc_555_timer(), general.bjt_bias_point() |
rftools.calculators.motor | 22 | motor.battery_runtime_motor(), motor.bldc_efficiency() |
rftools.calculators.protocol | 11 | protocol.can_bus_timing(), protocol.clock_jitter() |
rftools.calculators.emc | 16 | emc.cable_shield_effectiveness(), emc.chassis_resonance() |
rftools.calculators.thermal | 6 | thermal.heatsink_calculator(), thermal.heatsink_selection() |
rftools.calculators.sensor | 17 | sensor.calc_4_20ma_transmitter(), sensor.accelerometer_sensitivity() |
rftools.calculators.unit_conversion | 19 | unit_conversion.angle_units(), unit_conversion.awg_wire() |
rftools.calculators.audio | 18 | audio.amplifier_clipping(), audio.audio_adc_snr() |
rftools.calculators.iot | 2 | iot.ble_link_budget(), iot.lora_link_budget() |
Résoudre pour une valeur cible
client.solve() trouve la valeur d'une entrée qui amène une sortie à une cible et la renvoie avec le résultat direct calculé exactement à cette valeur, par POST /api/py/v1/calculate/solve. Un appel décompté. Disponible à partir de rftools-io 0.4.0.
import rftools
client = rftools.Client()
# The trace width that reaches 50 Ω on 1.51 mm FR-4, rounded to a 0.001 mm grid
result = client.solve(
"microstrip-impedance",
{"substrateHeight": 1.51, "dielectricConstant": 4.5, "copperThickness": 35},
"traceWidth", "impedance", 50,
grid=0.001,
)
print(result.value, result.reached, result.evaluations)
print(result.result.values["impedance"])Client.solve(slug, inputs, solve_for, target_output, target_value, grid=None, range=None) renvoie un SolveResult avec .value, .unrounded, .reached, .evaluations, .warnings et .result, le même CalculatorResult que client.calculate() renvoie pour les entrées avec solve_for fixé à .value. Une cible que la recherche ne peut pas atteindre renvoie tout de même un résultat, avec .reached à False et la valeur la plus proche trouvée, et coûte tout de même un appel. Voir Résoudre pour une valeur cible pour les champs, la plage de recherche et les refus.
Calcul par lots
Jusqu'à 50 calculs en une requête, pour les balayages ; un appel par élément calculé. Le point de terminaison par lots fait partie de l'offre API ; voir les tarifs (API $19 par mois, 10 000 appels).
results = client.batch([
("vswr-return-loss", {"vswr": 1.5}),
("vswr-return-loss", {"vswr": 2.0}),
("free-space-path-loss", {"frequency": 2400, "distance": 0.05}),
])
for r in results:
print(r.values if r.ok else r.error)Usage
Le quota mensuel appartient au compte ; chaque clé du compte y puise.
usage = client.usage() # GET /v1/usage, never metered
print(usage.used, "of", usage.allowance, "used; resets", usage.reset_at)
for key in usage.keys:
print(key.key_id, key.label, key.used)
result = client.calculate("vswr-return-loss", {"vswr": 2.5})
print(result.usage.remaining) # from this response's X-Usage-* headersTâches de simulation
Les paramètres et les fichiers sont vérifiés localement par rapport au contrat du type de tâche avant tout envoi. Une tâche qui se termine en failed lève JobFailed avec son errorKind dans .kind. Voir Tâches de simulation.
job = client.submit_job("sat_link_budget", {"latitude_deg": 40.7, "longitude_deg": -74.0})
job = job.wait(timeout=600) # polls as the web app does
print(job.status, job.result()) # a summary; job.result(full=True) for all of it
est = client.estimate_job("fdtd_sparam", {"traceW": 0.42, "subH": 0.51, "solveMode": "express"})
print(est.lane, est.within_budget) # never charged, no key neededPrise en charge asynchrone
AsyncClient pour les services FastAPI, les notebooks asynchrones ou les balayages concurrents.
import asyncio
import rftools
async def main():
async with rftools.AsyncClient() as client:
result = await client.calculate("vswr-return-loss", {"vswr": 2.5})
print(result["returnLoss"])
asyncio.run(main())CLI
La commande rftools est installée avec le paquet.
rftools login # get a key; saved, never printed
rftools calc vswr-return-loss --vswr 2.5
rftools calc vswr-return-loss --vswr 2.5 --json | jq .values
rftools list --category rf
rftools info free-space-path-loss
rftools solve microstrip-impedance --for traceWidth --target impedance=50 --grid 0.001 \
--param substrateHeight=1.51 --param dielectricConstant=4.5 --param copperThickness=35
rftools sim fdtd_sparam --param solveMode=express --no-wait
rftools estimate fdtd_sparam --param traceW=0.42 --param subH=0.51
rftools versionGestion des erreurs
Les erreurs sont classées selon le statut HTTP, jamais selon le texte du message. Un 500, 502, 503, 504 est retenté avec un délai croissant avant que l'exception ne soit levée. Voir Erreurs.
| Exception | Levée pour |
|---|---|
| ValidationError | HTTP 400, 422 |
| AuthError | HTTP 401, 403 |
| QuotaError | HTTP 402 |
| NotFound | HTTP 404 |
| APIError | HTTP 409, 500, 503 |
| RateLimitError | HTTP 429 |
| JobFailed | Une tâche qui s'est terminée en failed ; .kind est son errorKind. |
| LoginError | rftools login n'a délivré aucune clé ; .error vaut access_denied ou expired_token. |
Prêt à automatiser ?
Installez la bibliothèque, obtenez une clé gratuite et lancez un premier calcul en moins d'une minute. L'API REST sous-jacente est documentée dans la référence de l'API.