Tự động hóa: dữ liệu của bạn, được đẩy theo lịch
Marrow có thể POST một tệp dữ liệu sức khỏe của bạn tới bất kỳ URL nào bạn chọn, theo nhịp bạn chọn, trực tiếp từ điện thoại. Trang này là tài liệu tham chiếu: cách thiết lập, mỗi payload trông như thế nào, và cách viết thứ gì đó để nhận chúng.
Các thiết lập làm sẵn cho n8n, Zapier, Make, Home Assistant, Google Sheets và InfluxDB nằm ở mục kết nối.
Tất cả hướng dẫn của Marrow: MCP · Bản sao tự lưu trữ · Tự động hóa · Tệp · Hỗ trợ
Tác vụ tự động hóa là gì
Một công việc đã lưu trong Xuất, Tự động: một loại dữ liệu, một định dạng, một khoảng ngày, một URL, một nhịp chạy. Marrow tạo tệp từ kho dữ liệu đã xác minh của nó và POST tới URL kể cả khi đóng ứng dụng, sau mỗi lần đồng bộ xong và mỗi lần làm mới nền, bất cứ khi nào nhịp chạy đã đến. Không có gì đi qua chúng tôi: điện thoại nói chuyện thẳng với endpoint của bạn.
Thiết lập một tác vụ tự động hóa
- Tab Xuất, Tự động: bật lên, rồi Tự động hóa mới. Khi tạo từ trang của một công cụ (n8n, Zapier, Home Assistant và các công cụ khác trong mục kết nối), tác vụ mang tên công cụ đó và ghi bên cạnh mỗi trường điều mà công cụ cần ở đó.
- Địa chỉ: URL https mà nó sẽ POST tới. Tiêu đề: bất kỳ tiêu đề nào bên nhận cần (token bearer
Authorization,X-Gitlab-Token, gì cũng được). Khi công cụ không cần tiêu đề nào, Thêm tiêu đề nằm trong Thêm tùy chọn. - Dữ liệu: Chỉ số sức khỏe, Bài tập, Nhật ký tập sức mạnh, Nhật ký dinh dưỡng, hoặc Triệu chứng và tâm trạng, dưới dạng JSON hoặc CSV. Mỗi tác vụ mang một loại dữ liệu, nên hãy tạo mỗi loại bạn muốn một tác vụ. Mỗi cái đang bật được tính là một kết nối: gói miễn phí giữ được 1 kết nối bật cùng lúc, Marrow Pro tới 10, tính cả AI và máy chủ.
- Nhịp chạy: cứ mỗi bấy nhiêu phút, giờ hoặc ngày. Khoảng ngày, cách tổng hợp và thời gian chờ nằm trong Thêm tùy chọn.
- Chạy ngay gửi payload đầu tiên để bạn kiểm tra bên nhận trước khi chờ đến lịch.
Khoảng ngày
- Kể từ lần chạy trước (mặc định): mọi thứ kể từ lần chạy thành công gần nhất, trừ đi hai ngày chồng lấp. HealthKit vẫn tiếp tục bổ sung dữ liệu cho một ngày sau khi ngày đó kết thúc, nên phần chồng lấp gửi lại những ngày vừa hoàn tất. Hãy giữ giá trị mới nhất cho mỗi chỉ số và mỗi ngày ở phía bạn thì việc lặp lại không gây hại. Một bên nhận đã ngừng hoạt động một thời gian sẽ nhận đủ mọi ngày bị lỡ ở lần chạy thành công đầu tiên.
- Hôm nay, 7 / 30 / 90 ngày qua, Năm qua: các khoảng trượt cố định, gửi lại đầy đủ mỗi lần chạy. Hãy chọn các mục này khi bạn muốn một bản chụp tự hồi phục hơn là một phần chênh lệch.
Dạng payload
Chỉ số sức khỏe (tổng theo ngày, JSON)
Cùng cấu trúc với chỉ số của Health Auto Export (một danh sách metrics gồm name, units và data với qty), nên bên nhận viết cho ứng dụng đó chỉ cần sửa chút ít: ngày ở đây là ngày thuần, không phải dấu thời gian, và các payload bài tập và sức mạnh bên dưới là của riêng Marrow. Giá trị tính theo đơn vị lưu trữ ghi trong units (kg, m, mL, degC, kcal, count). Nhịp tim đến dưới dạng Avg, Min và Max của mỗi ngày tính bằng bpm, còn giấc ngủ là từng đêm kèm các giai đoạn tính bằng giờ. Hãy tự quy đổi ở phía bạn nếu muốn dùng hệ đo lường Anh Mỹ.
{"data": {"metrics": [
{"name": "body_mass", "units": "kg",
"data": [{"date": "2026-09-11", "qty": 81.3}]},
{"name": "step_count", "units": "count",
"data": [{"date": "2026-09-11", "qty": 8746}]},
{"name": "heart_rate", "units": "bpm",
"data": [{"date": "2026-09-11", "Avg": 71, "Min": 52, "Max": 148}]},
{"name": "sleep_analysis", "units": "h",
"data": [{"date": "2026-09-11", "totalSleep": 7.2, "asleep": 7.2, "deep": 1.1, "rem": 1.6, "core": 4.3, "awake": 0.2,
"sleepStart": "2026-09-10 23:36:00 -0400", "sleepEnd": "2026-09-11 07:02:00 -0400"}]}
]}}
Mẫu thô (nhóm Mẫu thô) gửi từng mẫu với thời gian bắt đầu và kết thúc thay vì tổng theo ngày. Chỉ số CSV đến dưới dạng bảng rộng được mô tả ở trang về tệp.
Bài tập
{"data": {"workouts": [
{"activity": "Running", "start": "2026-09-11T18:43:41Z", "end": "2026-09-11T19:13:53Z",
"duration_min": 30.2, "kcal": 512, "distance_mi": 3.06, "avg_hr": 174, "source": "Apple Watch"}
]}}
Nhật ký tập sức mạnh
Mọi hiệp tập chính (hiệp khởi động được bỏ ra), cùng tiến bộ theo từng bài tập và khối lượng theo từng nhóm cơ. Mức tạ tính theo đơn vị bạn chọn trong Cài đặt, Đơn vị. Trường unit cho biết đó là đơn vị nào. set_type của mỗi hiệp là work, failure hoặc drop, và một hiệp còn mang thêm rir khi bạn đã ghi số lần lặp còn dư. set_credits đếm số hiệp được tính cho một nhóm cơ, theo phân số khi một bài tập tác động lên nhiều nhóm.
{"data": {"unit": "lb",
"sets": [{"time": "2026-09-11T17:02:00Z", "session": "Push day", "exercise": "Bench Press",
"set": 1, "weight": 185, "reps": 8, "est_1rm": 229.6, "set_type": "work"}],
"exercises": [{"exercise": "Bench Press", "best_est_1rm": 229.6,
"sessions": [{"date": "2026-09-11T17:02:00Z", "sets": 3, "top_weight": 185, "top_reps": 8, "est_1rm": 229.6, "volume": 3885}]}],
"muscle_groups": [{"group": "Chest", "volume": 3108.0, "set_credits": 2.4}]
}}
Nhật ký dinh dưỡng
{"data": {"days": [
{"day": "2026-09-11", "entries": [
{"meal": "breakfast", "name": "Oatmeal", "grams": 250, "kcal": 300,
"protein_g": 10, "carbs_g": 54, "fat_g": 5, "logged_at": "2026-09-11T12:10:00Z",
"nutrients": {"dietary_fiber": 8.0, "dietary_sugar": 1.2}}
]}
]}}
Viết bên nhận
Bất cứ thứ gì nhận HTTPS POST và trả lời 2xx đều dùng được: một dịch vụ webhook, một hàm serverless, một script trên máy chủ ở nhà. Ba quy tắc giúp nó vững vàng:
- Mới nhất thắng. Lưu giá trị theo khóa (chỉ số, ngày) hoặc theo định danh riêng của mục, rồi ghi đè khi lặp lại. Các khoảng ngày chồng lấp là có chủ ý.
- Lưu trữ phần thân thô trước. Rồi mới phân tích. Một lỗi của trình phân tích không bao giờ nên làm bạn mất dữ liệu.
- Trả lời nhanh. Marrow chờ tối đa theo thời gian chờ bạn đặt (mặc định 60 giây), quá thời gian đó thì đánh dấu lần chạy là lỗi. Các lần chạy lỗi được thử lại ở nhịp kế tiếp, tính từ khoảng thành công gần nhất.
Một bên nhận bằng Python mười hai dòng lưu trữ mọi bài gửi:
from http.server import BaseHTTPRequestHandler, HTTPServer
import time
class H(BaseHTTPRequestHandler):
def do_POST(self):
body = self.rfile.read(int(self.headers.get("Content-Length", 0)))
with open(f"marrow-{int(time.time())}.json", "wb") as f:
f.write(body)
self.send_response(200)
self.end_headers()
HTTPServer(("0.0.0.0", 8798), H).serve_forever()
Đặt nó sau HTTPS (Cloudflare Tunnel, Tailscale Funnel hoặc bất kỳ reverse proxy nào) và trỏ tác vụ tự động hóa tới đó. Nếu bạn muốn một bản sao truy vấn được hơn là một thư mục đầy tệp, bản sao tự lưu trữ chính là bên nhận đã viết sẵn đó.
Cần biết
- Tự động hóa chỉ chạy khi iOS cho phép ứng dụng chạy: sau khi đồng bộ xong, khi làm mới ở nền trước, và trong lúc làm mới nền. Một chiếc điện thoại khóa cả ngày sẽ gửi khi được mở khóa lần tiếp theo. Khoảng kể từ lần chạy trước bù lại khoảng trống đó.
- Mỗi lần chạy đều được ghi trong Nhật ký hoạt động của tác vụ (Thêm tùy chọn) cùng kết quả, nên một URL cấu hình sai hiện ngay trong ứng dụng, không chỉ trên máy chủ của bạn.
- Nhân bản một tác vụ để dùng lại các tiêu đề của nó cho một loại dữ liệu khác.
Khắc phục sự cố
Thử bằng Chạy ngay. Dòng bên dưới nó cho biết chuyện gì đã xảy ra, và Thêm tùy chọn, Nhật ký hoạt động giữ 30 lần chạy gần nhất với cùng dòng đó. Bật Thông báo khi chạy (Thêm tùy chọn) để nhận thông báo cho mỗi lần chạy trong lúc bạn kiểm tra.
| Marrow hiển thị gì | Cần làm gì |
|---|---|
Bản tóm tắt những gì đã gửi, chẳng hạn 12 diary entries | Đã gửi: bên nhận trả lời 2xx. Nếu bên đó không thấy gì, hãy xem các hàng cuối bên dưới. |
Server answered 401 hoặc 403 | Bên nhận cần một tiêu đề, hoặc tiêu đề bạn thêm bị sai. Kiểm tra tên và giá trị của nó, kể cả Bearer và dấu cách sau đó. |
Server answered 404 | Sai địa chỉ, hoặc bên nhận không lắng nghe. Trong n8n, hãy dùng Production URL và kích hoạt workflow. Kiểm tra xem có thiếu đường dẫn ở cuối không. |
Server answered 405 | Địa chỉ không nhận POST. Hãy trỏ nó tới endpoint dành cho dữ liệu gửi đến. |
Server answered 413 | Payload quá lớn đối với bên nhận. Chọn khoảng ngày ngắn hơn, ít chỉ số hơn, hoặc Tổng theo ngày thay cho Mẫu thô. |
Server answered 500 hoặc mã 5xx khác | Bên nhận gặp lỗi khi xử lý. Hãy xem nhật ký của chính nó. Lưu trữ phần thân thô trước, rồi mới phân tích. |
| Yêu cầu đã hết thời gian chờ | Bên nhận mất nhiều thời gian hơn thời gian chờ. Hãy trả lời trước rồi xử lý sau, hoặc tăng Thời gian chờ trong Thêm tùy chọn (tối đa 300 giây). |
| Chính sách Bảo mật Truyền tải Ứng dụng yêu cầu sử dụng kết nối bảo mật | Địa chỉ là http thuần trên internet. Hãy dùng https. iOS chỉ cho Marrow dùng http thuần trong mạng của riêng bạn. |
| Không tìm thấy máy chủ có tên máy chủ đã chỉ định | Địa chỉ gõ sai, hoặc là một cái tên chỉ mạng nhà bạn biết. Hãy kiểm tra trong Safari trên điện thoại. |
No valid URL - set an https endpoint first | Địa chỉ trống hoặc không bắt đầu bằng https:// (hoặc http:// trong mạng của riêng bạn). |
Nothing to export in this range | Không có dữ liệu loại đó trong khoảng ngày. Chọn khoảng dài hơn trong Thêm tùy chọn, hoặc hãy ghi nhận gì đó trước. |
- Đã gửi mà không thấy gì đến. Một số bên nhận trả lời 200 ngay cả khi họ bỏ dữ liệu. Home Assistant làm vậy khi webhook id sai, và công thức Apps Script làm vậy khi
?key=sai. Zapier và Make không hiện gì cho đến khi bạn nạp một mẫu trong trình soạn thảo của họ. Hãy kiểm tra lịch sử hoặc nhật ký của chính bên nhận. - Các lần chạy đến muộn hoặc không chạy. iOS chọn thời điểm cho các lần chạy nền: sau khi đồng bộ, khi bạn mở Marrow, và trong lúc làm mới nền. Hãy để Làm mới ứng dụng trong nền bật cho Marrow (Cài đặt, Cài đặt chung, Làm mới ứng dụng trong nền). Chế độ nguồn điện thấp sẽ giữ các lần chạy nền lại, và một chiếc điện thoại khóa cả ngày sẽ gửi khi được mở khóa lần tiếp theo. Kể từ lần chạy trước sẽ bắt kịp ở lần chạy thành công kế tiếp.
- Bên nhận trong mạng nhà bạn. Marrow cần quyền truy cập Mạng cục bộ để kết nối tới đó: Cài đặt, Quyền riêng tư và Bảo mật, Mạng cục bộ. Chạm Chạy ngay một lần khi đang mở Marrow để iOS có thể hỏi. Ở chế độ nền, iOS từ chối mà không hỏi cho đến khi bạn đã trả lời.
- Đã vuốt tắt. Sau khi bạn vuốt Marrow đi trong trình chuyển đổi ứng dụng, iOS có thể không đánh thức nó ở nền cho đến khi bạn mở lại.
- Cùng những ngày đó đến hai lần. Là có chủ ý: Kể từ lần chạy trước gửi lại hai ngày cuối, vì Apple Health vẫn tiếp tục bổ sung dữ liệu cho chúng. Hãy giữ giá trị mới nhất cho mỗi chỉ số và mỗi ngày.
- Không bật lên được. Mỗi tác vụ tự động hóa đang bật được tính là một kết nối. Gói miễn phí giữ được 1 kết nối bật cùng lúc, Marrow Pro tới 10: AI, máy chủ và tự động hóa cộng lại. Hãy tắt một cái khác trước.
- Đơn vị trông sai. Chỉ số đến theo đơn vị lưu trữ ghi trong
units(kg, m, mL, degC, kcal). Các hiệp tập sức mạnh theo Cài đặt, Đơn vị, và trườngunitcho biết đó là đơn vị nào.
Cách khắc phục cho từng công cụ nằm ở trang của nó: n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB, URL bất kỳ.