Marrow Health
VI
Tải về

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

  1. 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 ở đó.
  2. Đị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.
  3. 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ủ.
  4. 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.
  5. 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

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ộ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

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 403Bê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 404Sai đị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 413Payload 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ácBê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 rangeKhô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.

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ỳ.