Skip to content
Secciones de la documentación

Biblioteca de Python rftools

Acceso programático a las 255 calculadoras de RF y electrónica y a los trabajos de simulación: funciones tipadas, llamadas por lotes, resolución para un valor objetivo, soporte asíncrono y una CLI. Cada llamada necesita una clave; una gratuita cubre 5 llamadas al mes.

Instalación

pip install rftools-io. Python 3.12 o posterior; incluye httpx, pydantic y click. Ver en PyPI.

Clave de API

rftools login (o rftools.Client().login()) muestra una página y un código: abra la página, inicie sesión, apruebe el código y la clave se guarda en el archivo de credenciales de su usuario, que solo usted puede leer. O bien defina RFTOOLS_API_KEY, que tiene prioridad. rftools.Client() y las funciones auxiliares del módulo leen cualquiera de las dos; un api_key= explícito prevalece sobre ambas. Las claves empiezan por rfc_; consulte Autenticación.

Inicio rápido

rftools.calculate() devuelve un CalculatorResult: lea las salidas por nombre, o .values, .warnings y .provenance.

Stubs tipados por categoría

Un módulo por categoría de calculadoras y una función por calculadora, con nombres de parámetros y valores predeterminados que coinciden con las páginas web. Un slug se convierte en nombre de función con - como _, y un nombre que empezaría por un dígito recibe el prefijo calc_.

Módulos del SDK
MóduloCalculadorasPor ejemplo
rftools.calculators.rf36rf.calc_5g_nr_band_lookup(), rf.calc_5g_nr_link_budget()
rftools.calculators.pcb36pcb.aperture_diagonal(), pcb.asymmetric_stripline()
rftools.calculators.power23power.battery_charge_time(), power.battery_internal_resistance()
rftools.calculators.signal14signal.adc_snr(), signal.am_modulation_index()
rftools.calculators.antenna11antenna.antenna_beamwidth(), antenna.antenna_downtilt()
rftools.calculators.general24general.calc_555_timer(), general.bjt_bias_point()
rftools.calculators.motor22motor.battery_runtime_motor(), motor.bldc_efficiency()
rftools.calculators.protocol11protocol.can_bus_timing(), protocol.clock_jitter()
rftools.calculators.emc16emc.cable_shield_effectiveness(), emc.chassis_resonance()
rftools.calculators.thermal6thermal.heatsink_calculator(), thermal.heatsink_selection()
rftools.calculators.sensor17sensor.calc_4_20ma_transmitter(), sensor.accelerometer_sensitivity()
rftools.calculators.unit_conversion19unit_conversion.angle_units(), unit_conversion.awg_wire()
rftools.calculators.audio18audio.amplifier_clipping(), audio.audio_adc_snr()
rftools.calculators.iot2iot.ble_link_budget(), iot.lora_link_budget()

Resolver para un valor objetivo

client.solve() halla el valor de una entrada que lleva una salida a un objetivo y lo devuelve con el resultado directo exactamente en ese valor, calculado por POST /api/py/v1/calculate/solve. Una llamada contabilizada. Disponible desde rftools-io 0.4.0.

Python
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) devuelve un SolveResult con .value, .unrounded, .reached, .evaluations, .warnings y .result, el mismo CalculatorResult que client.calculate() devuelve para las entradas con solve_for fijado en .value. Un objetivo que la búsqueda no puede alcanzar también devuelve un resultado, con .reached en False y el valor más cercano encontrado, y también cuesta una llamada. Consulte Resolver para un valor objetivo para los campos, el rango de búsqueda y los rechazos.

Cálculo por lotes

Hasta 50 cálculos en una solicitud, para barridos; una llamada por elemento calculado. El endpoint por lotes forma parte del plan API; consulte los precios (API $19 al mes, 10.000 llamadas).

Python
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)

Uso

La cuota mensual pertenece a la cuenta; todas las claves de la cuenta consumen de ella.

Python
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-* headers

Trabajos de simulación

Los parámetros y los archivos se comprueban localmente contra el contrato del tipo de trabajo antes de enviar nada. Un trabajo que termina en failed lanza JobFailed con su errorKind como .kind. Consulte Trabajos de simulación.

Python
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 needed

Soporte asíncrono

AsyncClient para servicios FastAPI, cuadernos asíncronos o barridos concurrentes.

Python
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

El comando rftools se instala con el paquete.

Shell
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 version

Gestión de errores

Los errores se clasifican por estado HTTP, nunca por el texto del mensaje. Un 500, 502, 503, 504 se reintenta con espera progresiva antes de lanzar la excepción. Consulte Errores.

Excepciones del SDK
ExcepciónSe lanza en caso de
ValidationErrorHTTP 400, 422
AuthErrorHTTP 401, 403
QuotaErrorHTTP 402
NotFoundHTTP 404
APIErrorHTTP 409, 500, 503
RateLimitErrorHTTP 429
JobFailedUn trabajo que terminó en failed; .kind es su errorKind.
LoginErrorrftools login no entregó ninguna clave; .error es access_denied o expired_token.

¿Listo para automatizar?

Instale la biblioteca, obtenga una clave gratuita y ejecute un primer cálculo en menos de un minuto. La API REST que hay detrás está documentada en la referencia de la API.