머신 · 펌웨어 상태Machines
머신 객체는 모델·그룹 수·보고된 펌웨어 버전·마지막 체크인·OTA 잡 상태를 담아요. 전부 허브(Pi)가 30초마다 체크인하며 보고한 값이에요.
시리얼 형식
머신 시리얼은 VDAS-<MODEL>-<YYWW>-<NNNN> 이에요. 다중 그룹 머신은 그룹마다 장치 키 …-G<n> 를 가져요 (그룹 = 제어 보드 한 쌍 = 서버 행 하나).
| 모델 코드 | 이름 | 그룹 수 |
|---|---|---|
PRO1G | 프로 1그룹 | 1 |
PROMINI | 프로 미니 | 1 |
PRO2G | 프로 2그룹 | 2 |
PRO3G | 프로 3그룹 | 3 |
ECO2G | 에코 2그룹 | 2 |
ECO3G | 에코 3그룹 | 3 |
목록 · 조회
GET /v1/public/machines?cursor=…&limit=50
GET /v1/public/machines/{serial}
응답 예
{
"serial": "VDAS-PRO2G-2644-9999",
"model": "PRO2G",
"groups": 2,
"hw_rev": "rev_d",
"status": "in_production",
"units": [
{
"device_key": "VDAS-PRO2G-2644-9999-G1",
"firmware": { "brew_ctrl": "3.11.0", "keypad": "3.4.20", "pi_bundle": "2026.10.24" },
"last_checkin_at": "2026-10-29T12:03:41Z",
"connected": true,
"ota": { "expected_bundle": null, "active_job": null, "drift": false }
},
{
"device_key": "VDAS-PRO2G-2644-9999-G2",
"firmware": { "brew_ctrl": "3.10.1", "keypad": "3.4.19", "pi_bundle": "2026.10.17" },
"last_checkin_at": "2026-10-29T12:03:12Z",
"connected": true,
"ota": { "expected_bundle": "2026.10.24", "active_job": "job_01JB…", "drift": true }
}
]
}| 필드 | 의미 |
|---|---|
status | in_production · service(정비 중 — 캠페인 제외) · retired |
units[].firmware | 허브가 각 보드에 버전을 실제로 질의해 올린 값 (보드 응답이 없으면 null) |
units[].connected | 마지막 체크인이 5분 안이면 true |
units[].ota.drift | 기대 번들과 보고 번들이 다르면 true — 현장 수동 조치·부분 실패를 드러냄 |
units[].identity_conflict | 같은 장치 키로 두 기기가 번갈아 체크인하는 상태 (15분 창). true 면 보고값을 믿지 말 것 |
OTA 잡 조회
GET /v1/public/machines/{serial}/ota/jobs?limit=20
잡은 읽기 전용이에요. 번들 적용 순서는 keypad → brew_ctrl → pi 로 고정돼 있고, 펌웨어 단계가 실패하면 pi 단계는 건너뛰어요. 잡 생성·취소·캠페인은 기술자 어드민 API 의 몫이며 공개 API 에는 없어요.
A machine object holds model, group count, reported firmware versions, last check-in and OTA job state — all values the hub (Pi) reported at its 30-second check-in.
Serials
VDAS-<MODEL>-<YYWW>-<NNNN>; multi-group machines have one device key per group, …-G<n>. Models: PRO1G, PROMINI, PRO2G, PRO3G, ECO2G, ECO3G.
Endpoints
GET /v1/public/machines
GET /v1/public/machines/{serial}
GET /v1/public/machines/{serial}/ota/jobs| Field | Meaning |
|---|---|
status | in_production · service · retired |
units[].firmware | versions the hub actually queried from each board (null if unanswered) |
units[].ota.drift | expected bundle ≠ reported bundle |
units[].identity_conflict | two devices alternating on one key within 15 min — distrust the values |