문서 섹션
rftools Python 라이브러리
RF 및 전자 계산기 255개 전부와 시뮬레이션 작업에 프로그램으로 접근할 수 있습니다. 타입이 지정된 함수, 배치 호출, 목표값 역산, 비동기 지원, CLI를 제공합니다. 모든 호출에 키가 필요하며, 무료 키로 월 5회 호출할 수 있습니다.
설치
pip install rftools-io. Python 3.12 이상이 필요하며, httpx, pydantic, click이 함께 설치됩니다. PyPI에서 보기.
API 키
rftools login(또는 rftools.Client().login())는 페이지와 코드를 보여 줍니다. 페이지를 열고 로그인한 뒤 코드를 승인하면, 키가 본인만 읽을 수 있는 사용자 자격 증명 파일에 저장됩니다. 또는 RFTOOLS_API_KEY를 설정하세요. 이쪽이 우선합니다. rftools.Client()와 모듈 수준 도우미는 둘 중 어느 것이든 읽으며, 명시적인 api_key=가 둘 다보다 우선합니다. 키는 rfc_로 시작합니다. 인증을 참고하세요.
빠른 시작
rftools.calculate()는 CalculatorResult를 반환합니다. 출력을 이름으로 읽거나 .values, .warnings, .provenance를 사용하세요.
카테고리별 타입 스텁
계산기 카테고리마다 모듈 하나, 계산기마다 함수 하나가 있으며, 매개변수 이름과 기본값은 웹 페이지와 같습니다. 슬러그는 -을 _로 바꾼 함수 이름이 되고, 숫자로 시작하는 이름에는 calc_ 접두사가 붙습니다.
| 모듈 | 계산기 | 예 |
|---|---|---|
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() |
목표값 역산
client.solve()는 출력을 목표값으로 만드는 입력 하나의 값을 찾아, 정확히 그 값에서 계산한 순방향 결과와 함께 반환합니다. 계산은 POST /api/py/v1/calculate/solve가 합니다. 집계되는 호출 한 번입니다. 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)는 .value, .unrounded, .reached, .evaluations, .warnings, .result를 지닌 SolveResult를 반환합니다. 마지막 항목은 solve_for를 .value로 둔 입력에 대해 client.calculate()가 반환하는 것과 같은 CalculatorResult입니다. 탐색으로 도달할 수 없는 목표값도 결과를 반환하며, .reached는 False이고 찾은 값 중 가장 가까운 값이 담기며, 역시 호출 한 번의 비용이 듭니다. 필드, 탐색 범위, 거부는 목표값 역산을 참고하세요.
배치
요청 하나에 최대 50건의 계산을 담을 수 있어 스윕에 적합합니다. 계산한 항목마다 호출 1회입니다. 배치 엔드포인트는 API 요금제에 포함됩니다. 요금(API는 월 $19, 10,000회)을 참고하세요.
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 = 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시뮬레이션 작업
매개변수와 파일은 보내기 전에 로컬에서 작업 유형의 계약에 비추어 검사됩니다. failed로 끝난 작업은 JobFailed를 발생시키며, 그 errorKind가 .kind에 담깁니다. 시뮬레이션 작업을 참고하세요.
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비동기 지원
FastAPI 서비스, 비동기 노트북, 동시 스윕에는 AsyncClient를 사용하세요.
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
rftools 명령은 패키지와 함께 설치됩니다.
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오류 처리
오류는 메시지 문구가 아니라 HTTP 상태로 분류됩니다. 500, 502, 503, 504 상태는 백오프를 두고 재시도한 뒤에 예외로 발생시킵니다. 오류를 참고하세요.
| 예외 | 발생 조건 |
|---|---|
| ValidationError | HTTP 400, 422 |
| AuthError | HTTP 401, 403 |
| QuotaError | HTTP 402 |
| NotFound | HTTP 404 |
| APIError | HTTP 409, 500, 503 |
| RateLimitError | HTTP 429 |
| JobFailed | failed로 끝난 작업. .kind는 그 작업의 errorKind입니다. |
| LoginError | rftools login이 키를 받지 못함. .error는 access_denied 또는 expired_token입니다. |
자동화할 준비가 되셨나요?
라이브러리를 설치하고 무료 키를 받으면 1분 안에 첫 계산을 실행할 수 있습니다. 그 뒤에 있는 REST API는 API 레퍼런스에서 설명합니다.