PREVIEW초안이에요. 아직 실제로 쓸 수는 없고, 계약과 안전 심사에 따라 바뀔 수 있어요.
리소스Resources · v1 preview

샷 기록Shots

샷 레코드는 허브의 로컬 DB 에 먼저 저장되고 연결이 돌아오면 업로드돼요. 곡선은 10 Hz 병렬 배열이고, 허브의 Flutter 앱이 쓰는 Decent 호환 JSON 에서 필드명을 평탄화한 형태예요.

목록

GET /v1/public/shots?machine=VDAS-PRO1G-2644-9999
    &from=2026-10-01T00:00:00Z&to=2026-10-31T23:59:59Z
    &trigger=button2&min_rating=4&cursor=…&limit=50
쿼리설명
machine시리얼 또는 장치 키. 생략하면 키 범위 안 전체
from · to시작 시각 범위 (UTC)
triggerbutton0·button1·button2·paddle·replay·remote·auto
min_rating별점 1~5
fieldssummary(기본, 곡선 제외) · full(곡선 포함)

샷 객체

{
  "id": "sh_01JB7Q",
  "machine": "VDAS-PRO1G-2644-9999",
  "device_key": "VDAS-PRO1G-2644-9999",
  "started_at": "2026-10-08T13:12:15Z",
  "duration_s": 14.0,
  "trigger": { "source": "button2", "mode": "scale" },
  "profile": "Espresso",
  "dose_g": 20.0,
  "target": { "volume_ml": null, "weight_g": 36.0 },
  "yield_g": 37.5,
  "yield_source": "scale",
  "peak": { "pressure_bar": 5.57, "flow_ml_s": 5.0 },
  "pre_shot_bar": 2.59,
  "temps": { "mix_c": 91.1, "basket_c": 87.9 },
  "rating": 4,
  "notes": "에티오피아 · 20 g · 분쇄 2.4",
  "scale": {
    "brand": "timemore", "model": "black_mirror_dot",
    "auto_stop": { "enabled": true, "reason": "target_weight", "sensitivity": 8 }
  },
  "paddle": null,
  "series": {
    "t_s":          [0.0, 0.1, 0.276, …],
    "pressure_bar": [2.59, 1.44, 0.92, …],
    "flow_ml_s":    [0.0, 0.0, 0.0, …],
    "weight_g":     [0.0, 0.0, 0.0, …],
    "temp_mix_c":   [91.1, 91.1, 91.1, …],
    "temp_basket_c":[87.9, 87.9, 87.9, …],
    "paddle_deg":   null
  }
}
필드설명
trigger.source버튼 0/1/2 · 패들 · 매핑 재생(replay) · 원격(remote) · 포터필터 자동(auto)
trigger.modeflow(물량 목표) · scale(저울 목표 무게 + 안전 상한 +30 mL)
yield_sourcescale 실측 · flow 유량 적산 추정 — 추정이면 UI 에 「예상」 표기 권장
series.paddle_deg패들 샷에서만. 부재는 null — 0.0 은 실측 홈 각도라 부재값으로 쓰지 않아요
series.* 길이전부 t_s 와 같아요. 60 초 샷 ≈ 600 점

단건 · 내보내기

GET /v1/public/shots/{id}                 # 항상 full
GET /v1/public/shots/{id}/export?format=decent   # Decent/Visualizer 호환 JSON
GET /v1/public/shots/export?machine=…&from=…&to=…&format=parquet   # Enterprise

Shot records are stored on the hub first and uploaded when the link is up. Curves are parallel arrays at 10 Hz, flattened from the Decent-compatible JSON the hub's Flutter app writes.

GET /v1/public/shots?machine=…&from=…&to=…&trigger=button2&min_rating=4&fields=full
GET /v1/public/shots/{id}
GET /v1/public/shots/{id}/export?format=decent
FieldMeaning
trigger.sourcebutton0/1/2 · paddle · replay · remote · auto
trigger.modeflow (volume target) · scale (target weight + 30 mL safety cap)
yield_sourcescale (measured) · flow (integrated estimate)
series.paddle_degpaddle shots only; absent is null, never 0.0
series.*same length as t_s; a 60 s shot ≈ 600 points

이 문서의 원본은 이 HTML 파일이에요 (빌드 없음).