| name | description |
|---|---|
coffee-bridge-barista |
Use when operating the NIVONA coffee bridge over HTTP to inspect machines, brew drinks, confirm prompts, manage brew history and counter history, adjust history budget, and run bridge backup or restore flows. |
Use this skill when the user wants to inspect, control, or automate the local coffee bridge over HTTP.
Keep the workflow grounded in the bridge state:
- Check bridge status first with
GET /api/status. - List or inspect saved machines before acting.
- Read machine summary, recipes, settings, or stats before making strong claims.
- Only say a drink was brewed when the bridge accepted the request.
- Treat brew history and counter history as different data sets.
- Do not claim a brew completed unless the bridge explicitly confirms more than request acceptance.
POST /api/machines/{serial}/brewrecords an accepted brew request, not a confirmed finished cup.- Brew history is the exact bridge-side request log.
- Counter history is the machine stats timeline and can include local front-panel usage detected by polling.
- If a brew would overflow the fixed per-machine brew-history budget, the bridge rejects the brew request before dispatch.
POST /api/machines/{serial}/history/importrecomputesrecipeFingerprinton the bridge. Do not try to supply your own fingerprint as authoritative.- Use
POST /api/machines/{serial}/confirmwhensummary.status.hostConfirmSuggestedis true.
GET /api/machinesGET /api/machines/{serial}/summary- If needed:
GET /api/machines/{serial}/recipesGET /api/machines/{serial}/recipes/{selector}GET /api/machines/{serial}/mycoffeeGET /api/machines/{serial}/statsGET /api/machines/{serial}/settings
- Brew with
POST /api/machines/{serial}/brew - Read or refresh history with:
GET /api/machines/{serial}/historyGET /api/machines/{serial}/stats/history
If the user wants a customized standard drink, do not guess the allowed fields or enum values.
Use this sequence:
GET /api/machines/{serial}/recipes- find the target drink and selector
GET /api/machines/{serial}/recipes/{selector}- read the current recipe snapshot
- read
writableFields - read
optionsfor discrete machine-capped fields
- Build a
POST /api/machines/{serial}/brewbody with:selector- only override keys listed in
writableFields - only enum values present in
options
- Send the brew request
Important:
- These overrides are temporary for the started drink.
- They do not overwrite saved
MyCoffeeslots. - Prefer the live recipe detail over stale assumptions about bean counts, aroma codes, or temperature ranges.
- If a field is not listed in
writableFields, do not send it. - For amount fields, respect the current recipe family and field names returned by the bridge such as
coffeeAmountMl,waterAmountMl,milkAmountMl,milkFoamAmountMl, orsizeMl.
GET /api/statusGET /api/devicesGET /api/detailsGET /api/logsPOST /api/logs/clearPOST /api/reboot
GET /api/machinesPOST /api/machines/probePOST /api/machinesPOST /api/machines/manualPOST /api/machines/resetDELETE /api/machines/{serial}GET /api/machines/{serial}/summary
GET /api/machines/{serial}/recipesGET /api/machines/{serial}/recipes/{selector}- add
?refresh=1to force a live reread instead of using the LittleFS cache - returned recipes include capability data such as
writableFieldsand fieldoptions - use this route before customized brews so the agent knows which fields and enum values are valid on the current machine
- add
POST /api/machines/{serial}/recipes/refresh
POST /api/machines/{serial}/brew- accepts optional metadata:
sourceactorlabelnotecorrelationId
- successful accepted brews are appended to brew history
- the bridge may reject the brew if the next history entry would exceed the configured per-machine history budget
- accepts optional metadata:
POST /api/machines/{serial}/confirm
Example brew body:
{
"selector": 2,
"source": "ai",
"actor": "Barista Agent",
"label": "Bright Morning Lungo",
"note": "Softer morning cup."
}Example customized brew body:
{
"selector": 2,
"strengthBeans": 3,
"aroma": 2,
"temperature": 2,
"coffeeAmountMl": 120,
"source": "ai",
"actor": "Barista Agent",
"label": "Bright Morning Lungo"
}GET /api/machines/{serial}/history- newest entries first
- supports pagination with
?limit=20&offset=40
POST /api/machines/{serial}/history/import- accepts:
- a single entry object
{ "entry": { ... } }{ "entries": [ ... ] }
- recomputes
recipeFingerprintfrom the compactrecipeobject - stores only supported compact recipe fields
- accepts:
POST /api/machines/{serial}/history/clearPOST /api/history/config- updates the runtime per-machine brew-history budget in bytes
- clamps the value against the mounted LittleFS size
- compacts existing history immediately when needed
Example import body:
{
"entries": [
{
"timeUnix": 1773210600,
"timeIsoUtc": "2026-03-11T06:30:00Z",
"source": "ai-backfill",
"actor": "Barista Agent",
"label": "Bright Morning Lungo",
"recipe": {
"selector": 2,
"name": "lungo",
"title": "Lungo",
"strength": 2,
"strengthBeans": 3,
"aroma": 2,
"temperature": 2,
"coffeeAmountMl": 120
}
}
]
}GET /api/machines/{serial}/mycoffee- add
?refresh=1to force a live reread
- add
GET /api/machines/{serial}/mycoffee/{slot}- add
?refresh=1to force a live reread of a single slot
- add
POST /api/machines/{serial}/mycoffee/{slot}
GET /api/machines/{serial}/statsGET /api/machines/{serial}/stats/history- newest snapshots first
- supports pagination with
?limit=20&offset=40 - snapshots are only stored when live values change
POST /api/machines/{serial}/stats/history/clear
Counter history is not the same as brew history:
- brew history = accepted bridge brew requests with final applied recipe snapshots
- counter history = observed machine counters over time, including activity started from the front panel when stats polling notices changes
GET /api/machines/{serial}/settingsPOST /api/machines/{serial}/settings
GET /api/backup/export- downloads an NDJSON bundle containing:
- saved machines
- brew-history budget
- brew-history entries
- counter-history entries
- excludes:
- Wi-Fi credentials
- protocol-session cache
- LittleFS recipe caches
- downloads an NDJSON bundle containing:
POST /api/backup/restore- accepts a multipart upload
- replaces the current saved-machine store, brew history, and counter history
- clears recipe caches and stored protocol-session cache before restore
POST /api/wifi/savePOST /api/ota
Use the saved-machine APIs first. Low-level protocol routes are for diagnostics:
/api/protocol/send-frame/api/protocol/app-probe/api/protocol/session/api/protocol/stats-probe/api/protocol/settings-probe