一張表看懂:改一個參數,其他會怎麼動
蛋糕濾杯的底面積是固定的,所以「粉量」不只是濃淡的問題,它同時改變粉層深度、阻力、接觸時間和吸走的水。下表是同一個研磨度下的方向。
| 你改了 | 粉層 | 滴濾時間 | 萃取率 EY | 濃度 TDS | 杯中液量 |
| 粉量 ↑(水不變) | 變深 | 變長 | ↓(水相對變少) | ↑↑ | ↓(每 g 粉吸走約 2 g 水) |
| 粉量 ↑(比例不變) | 變深 | 變長 | 略 ↑(接觸變久) | ≈ | ↑ |
| 研磨調細 | — | 變長 | ↑(太細反而不均、會降) | ↑ | ≈ |
| 水溫 ↑ | — | 略短 | ↑(萃取變快) | ↑ | ≈ |
| 悶蒸水 ↑ | 濕得更均勻 | — | 略 ↑ | 略 ↑ | ≈ |
| 段數 ↑/停頓 ↑ | — | 變長 | ↑ | ↑ | ≈ |
| 冰手沖:冰比例 ↑ | — | 變短(熱水少) | ↓(熱水比降低) | 最終 ≈ 由總水決定 | ≈ |
核心:不管熱或冰,都要喝起來是 1:15
「1:15 的風味」可以拆成兩件事:濃度(TDS,杯裡每 100 g 有幾 g 咖啡物質)和萃取率(粉裡被帶出多少)。濃度決定濃淡,最直接;萃取率決定酸甜苦的平衡,靠研磨和水溫調。工具用濃度來定義:
濃度 = 溶出物 ÷ 出杯重 → 同樣粉量、同樣萃取率時,出杯重一樣,濃度就一樣
- 熱飲:直接用 注水 = 粉量 × 15。15.5 g → 232.5 ml,取 233 ml。
- 冰飲:冰塊融化的水也會進杯,所以要讓「搖勻濾冰後的出杯重」等於「同樣粉量熱沖 1:15 的出杯重」。熱沖 1:15 的出杯 =(15 − 1.94)× 粉量。
冰飲注水 = 冰飲吸水 × 粉量 + (15 − 熱飲吸水) × 粉量 ÷ (1 + k) k = 每 g 咖啡液會融掉的冰 ≈ 0.65
| 用你的實測驗算 | 粉量 | 出杯 | 熱沖 1:15 應出 | 風味相當於 |
| 熱飲 233 ml | 15.5 g | 203 g | 203 g | 1:15.0 |
| 冰飲 165 ml + 130 g 冰 | 17.8 g | 230 g | 232 g | 1:14.9 |
你憑口感調出來的冰飲,算出來已經幾乎是 1:15,這也驗證了這個定義合理。要剛好 1:15,冰飲注水是 167 ml,只差 2 ml;165 ml 正好是 App 設得出來的 15 倍數(App 填 1:11),所以冰飲不必做非 15 倍數的實驗。
- 冰量不影響濃度(冰夠時):融多少冰是咖啡液的熱量決定的,多放的冰會被濾掉。所以冰量只要「夠」:至少 0.65 × 濾出液,再多 30 g 讓搖的時候保持冰冷。
- 萃取率要另外補:冰飲的熱水只有粉的 9.3 倍,萃取率比熱飲低一點(工具推估約 −1%)。濃度對了但喝起來偏酸、偏薄時,把研磨調細一點或水溫 +1°C。
實驗:機器能不能不用 15 的倍數
App 以 15 g 為基準,水量只能是 15 的倍數(225、240…),15.5 g 粉最接近只有 1:14.5 或 1:15.5。捷徑直接送指令,可以把每段水量寫成任意數字。要確認的是機器會不會照做。
- 空杯出水測試:放濾紙、不放粉,下壺放在秤上歸零。用捷徑送 233 ml 的配方。
- 出水約 230–233 g(濾紙會吸 2–3 g)→ 機器照分段水量出水,非 15 倍數可行。
- 出水約 225 或 240 g → 機器自己湊回 15 的倍數,只能用「App 可設」的選項。
- 機器拒絕或沒有研磨/出水 → 多半是指令比例欄位的問題。工具已經自動把它填成 總水量 ÷ 15 無條件進位(233 → 16),通常不會發生。
冰飲 165 ml 本來就是 15 的倍數,這個實驗只跟熱飲有關。你目前的熱飲捷徑送的就是 233 ml。如果剛才那杯 203 g 是用捷徑沖的,代表機器很可能已經照 233 ml 出水,空杯測一次就能確定。
蛋糕濾紙(Wave 155)的特性
xBloom Original 的濾杯用 155 尺寸的平底波浪濾紙(官方 Premium 平底濾紙或 Kalita 155 都可以)。平底讓粉層厚度一致,波浪褶讓紙和杯壁之間留空隙,減少紙貼壁造成的旁流。代價是底面積小、深度對粉量很敏感。
乾粉層深度 h ≈ 粉量 ÷ (堆積密度 0.37 g/ml × 底面積) → 底面積固定時,h 跟粉量成正比
- 阻力:依 Darcy 定律,同研磨下粉層深一倍,阻力約大一倍,滴濾變慢。要維持相同流速,研磨大約要隨 √深度 變粗。
- 經驗表:NextLevel Pulsar 的建議是乾粉層 14 → 17 → 20 → 25 mm 時,研磨分別粗 0 / 40 / 80 / 145 µm,而且總時間仍會變長。換算約每深 1 mm 粗 13 µm。在 155 濾杯裡,粉每多 1 g 粉層約深 1 mm。
- 太深:研磨沒跟著變粗時,細粉堵住濾紙、形成通道,尾段出現澀感(Scott Rao)。機器在水位太高時會停下來等待。
- 太淺:通道直接穿到底,澀味進杯;Rao 認為 15 g 放在 185 大濾杯就太淺。155 用 15–20 g 剛好。
- 深一點的好處:較不易形成通道,細粉被粉層攔住的比例較高(Coffee ad Astra)。缺點是悶蒸較難全部濕透。
- 溢流:機器每段是連續注水。大段水量 + 粉層體積超過濾紙高度,水會從紙緣繞過粉層,等於沒萃取的水直接加進杯裡。工具裡的剖面圖就是在算這件事。
來源:nextlevelbrewer.com/pulsar-mini-recipes · scottrao.com/blog/2025/11/11/bed-depth-why-it-matters · coffeeadastra.com/2025/11/28/the-pulsar-mini-and-the-importance-of-bed-depth · samplecoffee.com.au/brewguides/kalita-wave
粉量會吸水 → 決定杯中實際液量
滴濾式沖煮結束後,濕粉會留住一部分水(文獻值:滴濾約 2 g/g,浸泡式約 3 g/g)。你的熱飲實測:15.5 g × 15 = 233 ml 注水,濾出 203 g,每 g 粉吸走 1.94 g,跟文獻值幾乎一樣。冰飲:165 ml 注水,濾出 139 g,每 g 粉吸走 1.46 g,比熱飲少。可能是冰飲水少、沖煮時間較短,粉沒有吸飽。工具熱、冰分開用各自的實測值。
杯中液量 B ≈ 注水 − 吸水 × 粉量(熱 1.94、冰 1.46) EY = TDS × B ÷ 粉量
| 你的配方 | 粉量 | 注水 | 被粉吸走 | 杯中約 |
| 熱飲 1:15 | 15.5 g | 233 ml | 30 g | 203 g(實測) |
| 冰飲 | 17.8 g | 165 ml | 26 g | 139 g(實測) |
所以同樣 1:15,粉越多,被吸走的水越多。要固定出杯量時,用「注水 = 目標杯量 + 2 × 粉量」:想出 203 g、用 17 g 粉,就注 237 ml(1:13.9)。吸水值會隨萃取率、烘焙度和研磨變,換豆時可以再秤一次:(注水 − 濾出液)÷ 粉量,填到「校正」。
來源:baristahustle.com/lesson/acm-5-03-liquid-retained-ratios · coffeeadastra.com/2019/02/20/a-more-accurate-way-to-calculate-average-extraction-yield
熱手沖標準流程與每一步的影響
- 悶蒸 2–3 倍粉量水,30–45 秒:讓粉排氣、全部濕透。水不夠,乾粉塊在之後的注水會被繞過;新鮮的豆可延長到 45 秒。蛋糕濾杯底面積大,悶蒸水建議至少 2 倍。xBloom 的「振動」等於代替手搖,讓粉層攤平。
- 分段注水:段數和停頓主要是在調總接觸時間。Barista Hustle 的測試裡,不同注水手法的 EY 幾乎一樣,差別是流速。Wave 常見做法是 3–6 段、總時間 3–4 分鐘。
- 水溫:UC Davis(Batali 2020)把 TDS 和 EY 固定時,87/90/93°C 喝起來沒有明顯差異。水溫的作用是改變萃取速度,所以它和研磨可以互相替代。淺焙 92–95°C,中深焙 86–90°C。xBloom Original 出水端上限約 95°C。
- 粉水比:在滴濾中,水越多萃取率略高,但 1:15 到 1:17 差距很小;主要差在濃度。
- 目標:SCA 金杯 TDS 1.15–1.35%、EY 18–22%。UC Davis 2023 新版沖煮控制圖指出消費者分成兩群:一群偏好低濃度中萃取,另一群偏好中濃度。所以沒有單一正確答案,以你的店客群為準。
來源:baristahustle.com/blooming-marvellous · baristahustle.com/newsletters/baseline-tests · Batali et al., Sci Rep 2020(PMC7536440)· Guinard et al., J Food Sci 2023, 88:2168
冰手沖(日式急冷)
把總水量的一部分換成下壺裡的冰。熱水直接滴在冰上急速降溫,香氣保留較多。常見分配是熱水 60%、冰 40%(範圍 33–50%)。
| 出處 | 粉 | 熱水 | 冰 | 冰佔比 |
| xBloom 官方部落格 | 20 g | 190 | 110 | 37% |
| Kurasu(Wave) | 16 g | 150 | 140 | 48% |
| coffeelabo | 20 g | 160 | 120 | 43% |
| 台灣「375」 | 15 g | 150 | 100 | 40% |
| 你的冰飲(現用) | 17.8 g | 165 | 130 | 44% |
- 熱水比變低 → 萃取變低:你的冰飲熱水只有粉的 9.3 倍(熱飲 15 倍)。水少,帶走的可溶物少(CoffeeGeek 實測冰手沖 EY 15–18%,比熱的低)。所以冰手沖要研磨更細、水溫高 1–2°C、或多一段注水來補。
- 粉量更多 → 粉層更深:17.8 g 的粉層比 15.5 g 深約 2 mm,阻力變大,正好抵消一部分「調細」的效果,所以冰手沖不必調得像手沖壺那麼細。
- 你的做法:滴在冰上 → 雪克杯搖勻 → 濾冰出杯。139 g 咖啡液 + 130 g 冰,出杯 230 g,代表融掉約 91 g 冰、濾掉約 39 g。用熱平衡反推,咖啡液碰到冰時的有效溫度約 55°C(滴落過程已經降溫)。
- 冰量的意義:只要冰夠多,融掉的量由咖啡液的熱量決定(約 0.65 g 冰/每 g 咖啡液),多放的冰會被濾掉,出杯量幾乎不變。冰少於這個量,冰全部融化、飲料就不夠冰。你放 130 g、需要約 90 g,留了安全空間。
- 風味比例:出杯 230 g,跟同樣 17.8 g 熱沖 1:15 的出杯 232 g 幾乎一樣,所以喝起來相當於 1:14.9。不能直接用「熱水 + 冰 ÷ 粉」算,因為粉吸走的水和濾掉的冰都沒進杯。
出杯 = (粉量 × 粉水比 − 吸水 × 粉量) + 融冰 融冰 = min(冰量, 濾出液 × 4.18 × (55 − 2) ÷ 342) 最終 TDS = EY × 粉量 ÷ 出杯
來源:xbloom.com/blogs/news/iced-coffee-brewing-methods · xbloom.com/products/iced-coffee-bundle · kurasu.kyoto/blogs/recipe/new-kalita-wave-iced-coffee-recipe · coffee-labo.co.jp/recipe/iced-coffee · coffeegeek.com
xBloom Original 的機器限制
- 粉水比怎麼算:App 只能以 15 g 為基準,但你實際用更多粉,所以工具一律用「實際粉量 × 粉水比」算注水量(15.5 g × 15 = 233 ml)。送給機器的指令裡另有一個比例欄位,機器會檢查「15 g × 該欄位」不能小於總水量(Studio 上少了會拒絕或跳過研磨),所以這個欄位自動填 總水量 ÷ 15 無條件進位(233 → 16)。它只是技術欄位,不影響實際注水。
- 研磨:你用外部磨豆機,工具固定送出 App 錄製時的研磨值 150,研磨建議以「你的磨豆機粗/細多少 µm」表示。
- 注水圖形:雲端欄位 1=中心、2=螺旋、3=繞圈(Studio 文件),Original 是電極控制水柱的方向,對應待驗證。
- 流速:官方沒公布。Studio 是 3.0–3.5 ml/s,評測說 Studio 比 Original 快,所以預設 3.0。用碼表量一次某一段注水的時間,就能在「校正」改成實際值。
- 濾杯尺寸:官方沒有列出平底直徑和高度,預設值是 Wave 155 的估計,用尺量一次填進「校正」最準。
來源:xbloom.com/products/omni-dripper-for-xbloom-original · github.com/hessius/XBRecipeWriterPlus(雲端 API 與 Studio 協定逆向)· techcrunch.com/2023/03/31/xbloom-pour-over
預估怎麼算、能信多少
- 可信:杯中液量(吸水 2 g/g 是共識)、冰塊熱平衡(物理)、粉層深度(幾何,前提是濾杯尺寸正確)。
- 趨勢可信、數字要校正:總時間與最高水位。用逐秒模擬:機器以固定流速注水,前 2 × 粉量 的水被粉吸走,其餘依 Darcy 定律從粉層滲出。填一次實測總時間就會校正。
- 只當方向:EY。沒有公開研究給出滴濾的精確係數,所以工具以你的熱飲 1:15 為基準(預設 EY 20%),只推算相對變化:粉水比 ln 係數 3、水溫每 °C 0.1%、接觸時間 ln 係數 2.5。有折射儀時,把實測 EY 填進「校正」,其他配方就會跟著準。
iPad 的熱飲鍵、冰飲鍵怎麼自動更新
捷徑沒辦法被別的程式改寫,所以做法是讓「熱飲」、「冰飲」兩個捷徑每次執行時,去讀 iCloud Drive「捷徑」資料夾裡的檔案。更新檔案,就等於更新了捷徑;快速工具列上的按鈕完全不用動。
| 檔案 | 內容 | 誰寫入 | 誰讀取 |
| xbloom-hot.txt | 熱飲配方 | 「xBloom 設定」(編輯器按「設為熱飲鍵」) | 熱飲 |
| xbloom-ice.txt | 冰飲配方 | 「xBloom 設定」(編輯器按「設為冰飲鍵」) | 冰飲 |
| xbloom-token.txt | token | 「xBloom 更新 token」或「xBloom 設定」(編輯器「傳 token 到 iPad」) | 熱飲、冰飲 |
- 新配方:在這裡調好 →「設為 iPad 熱飲鍵」(或冰飲鍵)→ iPad 開啟「xBloom 設定」寫入檔案,跳通知「熱飲鍵已更新」。之後按快速工具列的「熱飲」就是新配方。
- 新 token:執行「xBloom 更新 token」(自動登入),或在「吧台 → 連線與 token」貼上 Mac 取得的 token 按「傳到 iPad」。熱飲、冰飲下一次就會用新的。
- token 過期:熱飲、冰飲收到 NO AUTHENTICATION 時,會自動執行「xBloom 更新 token」再送一次。
「設為熱飲鍵」要在 iPad 上按才會直接寫入。在手機或電腦上調配方時,先「存到店內配方庫」,再到 iPad 的「吧台」頁按;或按「QR」,讓 iPad 執行「xBloom 設定」掃描。第一次 iOS 會詢問貼上、存檔、連線權限,都選「永遠允許」。
Token:怎麼取得、過期怎麼辦
沖煮指令的 header 裡有一行 authorization: token 加 32 碼,這是你 xBloom 帳號的登入憑證。它會過期,或在 App 登出、換裝置登入時失效,這時伺服器回 {"message":"NO AUTHENTICATION","code":10001}。
不用再架 mitmproxy。公開的 xBloom API 逆向專案(XBRecipeWriterPlus)用真實帳號驗證過:用帳號密碼呼叫登入 API 就會回傳 token,請求是普通 JSON,不需要加密。
POST https://client-api.xbloom.com/tMemberLogin.thtml { email, password, interfaceVersion: 20240918, skey: "testskey", phoneType, clientType, languageType, jpushId: "" }
→ { result: "success", token, projectToken, projectRefreshToken, member: { tableId } }
- 回傳的 token 是 base64 格式(含 %2F),給食譜雲端用;你沖煮用的是 32 碼十六進位,對應的應該是 projectToken(IoT 平台的 token,另外附了 refresh token 也符合會過期的行為)。第一次執行「更新 token」時會驗證這點。
- 指令 header 裡的 appid、nonce、ts、sign 是固定值。你的捷徑重複使用同一組好幾個月都有效,表示伺服器不檢查時間,所以只需要換 token。
一鍵與自動更新
- iPad:「xBloom 更新 token」捷徑:登入 → 取 projectToken → 存成 iCloud Drive「捷徑」資料夾裡的 xbloom-token.txt。帳號密碼在匯入捷徑時填一次。
- iPad:「xBloom 沖煮」捷徑(新版):token 改從那個檔案讀;伺服器回 NO AUTHENTICATION 時,自動執行更新 token,再重送同一杯。正常情況下完全不用手動處理。
- Mac:xbloom-token.sh(帳號放 ~/.xbloom,密碼放鑰匙圈)與 xbloom-send.sh(過期時一樣自動更新再重送)。
- 這個頁面:「吧台」頁下方有「立即更新 token」按鈕和錯誤對照表。網頁本身不碰 token:它跑在 Claude 的安全框架裡,不能直接連 xBloom,token 也不該放在分享出去的頁面裡。
第一次用要驗證的事
- 是不是 projectToken:在 Mac 執行 xbloom-token.sh,它會印出新 token 的前 6 碼,跟捷徑現在用的(前 6 碼)比對;再空杯送一次,能沖就確定。
- 會不會把官方 App 踢下線:登入後打開 iPad 的 xBloom App,確認還是登入狀態。如果 App 被登出,代表同帳號只能一處登入,建議另開一個店用帳號、在 App 裡把機器分享給它,捷徑用店用帳號。
密碼存在捷徑裡是明文,能打開這台 iPad 捷徑 App 的人都看得到;Mac 版存在鑰匙圈比較安全。mitmproxy 抓 token 的舊流程保留當備案。來源:github.com/hessius/XBRecipeWriterPlus(library/cloud/session.ts、docs/machine-integration/cloud-api.md §C-bis)