Skip to content
Abschnitte der Dokumentation

rftools-Python-Bibliothek

Programmatischer Zugriff auf alle 255 HF- und Elektronikrechner und auf die Simulationsjobs: typisierte Funktionen, Batch-Aufrufe, Lösungen nach Zielwert, Async-Unterstützung und eine CLI. Jeder Aufruf braucht einen Schlüssel; ein kostenloser deckt 5 Aufrufe pro Monat ab.

Installation

pip install rftools-io. Python 3.12 oder neuer; sie bringt httpx, pydantic und click mit. Auf PyPI ansehen.

API-Schlüssel

rftools login (oder rftools.Client().login()) gibt eine Seite und einen Code aus: Öffnen Sie die Seite, melden Sie sich an, geben Sie den Code frei, und der Schlüssel wird in der Zugangsdaten-Datei Ihres Benutzers gespeichert, die nur Sie lesen können. Oder setzen Sie RFTOOLS_API_KEY, das Vorrang hat. rftools.Client() und die Hilfsfunktionen auf Modulebene lesen beides; ein ausdrückliches api_key= hat Vorrang vor beidem. Schlüssel beginnen mit rfc_; siehe Authentifizierung.

Schnellstart

rftools.calculate() gibt ein CalculatorResult zurück: Lesen Sie die Ausgaben nach Namen oder .values, .warnings und .provenance.

Typisierte Kategorie-Stubs

Ein Modul pro Rechnerkategorie, eine Funktion pro Rechner, mit Parameternamen und Standardwerten wie auf den Webseiten. Aus einem Slug wird ein Funktionsname mit - als _, und ein Name, der mit einer Ziffer beginnen würde, erhält das Präfix calc_.

SDK-Module
ModulRechnerZum Beispiel
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()

Nach einem Zielwert auflösen

client.solve() findet den Wert einer Eingabe, der eine Ausgabe auf einen Zielwert bringt, und gibt ihn mit dem Vorwärtsergebnis genau bei diesem Wert zurück, berechnet von POST /api/py/v1/calculate/solve. Ein gezählter Aufruf. Verfügbar ab 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) gibt ein SolveResult mit .value, .unrounded, .reached, .evaluations, .warnings und .result zurück, dasselbe CalculatorResult, das client.calculate() für die Eingaben mit solve_for auf .value gesetzt zurückgibt. Ein Zielwert, den die Suche nicht erreichen kann, liefert trotzdem ein Ergebnis, mit .reached False und dem nächstgelegenen gefundenen Wert, und kostet trotzdem einen Aufruf. Siehe Nach einem Zielwert auflösen für die Felder, den Suchbereich und die Ablehnungen.

Batch

Bis zu 50 Berechnungen in einer Anfrage, für Sweeps; ein Aufruf pro berechnetem Eintrag. Der Batch-Endpunkt gehört zum Tarif API; siehe Preise (API $19 pro Monat, 10.000 Aufrufe).

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)

Nutzung

Das monatliche Kontingent gehört dem Konto; jeder Schlüssel des Kontos zehrt davon.

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

Simulationsjobs

Parameter und Dateien werden lokal gegen den Vertrag des Jobtyps geprüft, bevor etwas gesendet wird. Ein Job, der mit failed endet, löst JobFailed aus, mit seinem errorKind als .kind. Siehe Simulationsjobs.

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

Async-Unterstützung

AsyncClient für FastAPI-Dienste, asynchrone Notebooks oder parallele Sweeps.

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

Der Befehl rftools wird mit dem Paket installiert.

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

Fehlerbehandlung

Fehler werden nach HTTP-Status eingeordnet, nie nach dem Meldungstext. Ein 500, 502, 503, 504 wird mit Backoff wiederholt, bevor die Ausnahme ausgelöst wird. Siehe Fehler.

SDK-Ausnahmen
AusnahmeAusgelöst bei
ValidationErrorHTTP 400, 422
AuthErrorHTTP 401, 403
QuotaErrorHTTP 402
NotFoundHTTP 404
APIErrorHTTP 409, 500, 503
RateLimitErrorHTTP 429
JobFailedEin Job, der mit failed endete; .kind ist sein errorKind.
LoginErrorrftools login lieferte keinen Schlüssel; .error ist access_denied oder expired_token.

Bereit für die Automatisierung?

Installieren Sie die Bibliothek, holen Sie sich einen kostenlosen Schlüssel und führen Sie in weniger als einer Minute eine erste Berechnung aus. Die REST-API dahinter ist in der API-Referenz dokumentiert.