Marrow Health
RO
Descarcă

Automatizări: datele tale, trimise după un program

Marrow poate trimite prin POST un fișier cu datele tale de sănătate la orice URL alegi, în ritmul ales de tine, direct de pe telefon. Pagina asta este referința: cum configurezi una, cum arată fiecare conținut trimis și cum scrii ceva care îl primește.

Configurări gata făcute pentru n8n, Zapier, Make, Home Assistant, Google Sheets și InfluxDB găsești la conexiuni.

Toate ghidurile Marrow: MCP · Oglindă auto-găzduită · Automatizări · Fișiere · Asistență

Ce este o automatizare

O sarcină salvată în Exportă, Automatizat: un tip de date, un format, un interval de date, un URL, un ritm. Marrow construiește fișierul din depozitul lui verificat și îl trimite prin POST la URL cu aplicația închisă, după fiecare sincronizare confirmată și la fiecare reîmprospătare în fundal, ori de câte ori a trecut ritmul ales. Nimic nu trece prin noi: telefonul vorbește direct cu endpointul tău.

Cum configurezi una

  1. Fila Exportă, Automatizat: activează-l, apoi Automatizare nouă. Dacă o creezi din pagina unei unelte (n8n, Zapier, Home Assistant și restul de la conexiuni), automatizarea poartă numele uneltei și spune lângă fiecare câmp ce vrea unealta acolo.
  2. Adresă: URL-ul https la care trimite prin POST. Antete: oricare are nevoie receptorul tău (un token bearer Authorization, un X-Gitlab-Token, orice). Când unealta nu are nevoie de niciunul, Adaugă antet se află la Mai multe opțiuni.
  3. Date: Metrici de sănătate, Antrenamente, Jurnal de forță, Jurnal de nutriție sau Simptome și dispoziție, ca JSON sau CSV. O automatizare poartă un singur tip, așa că fă câte una pentru fiecare tip dorit. Fiecare automatizare activă se numără ca o conexiune: Gratuit păstrează 1 conexiune activă odată, Marrow Pro până la 10, AI-urile și serverele incluse.
  4. Frecvență: la fiecare câte minute, ore sau zile. Intervalul de date, agregarea și timpul limită se află la Mai multe opțiuni.
  5. Rulează acum trimite un prim conținut, ca să verifici receptorul înainte să aștepți programul.

Intervale de date

Forme ale conținutului

Metrici de sănătate (totaluri zilnice, JSON)

Aceeași structură ca metricile din Health Auto Export (o listă metrics cu name, units și data cu qty), așa că un receptor scris pentru acea aplicație are nevoie doar de mici schimbări: datele de aici sunt zile simple, nu marcaje de timp, iar conținutul pentru antrenamente și forță de mai jos este al Marrow. Valorile sunt în unitatea stocată, din units (kg, m, mL, degC, kcal, count). Pulsul vine ca Avg, Min și Max în bpm pentru fiecare zi, iar somnul ca fiecare noapte, cu fazele ei, în ore. Convertește tu dacă vrei unități imperiale.

{"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"}]}
]}}

Eșantioanele brute (gruparea Eșantioane brute) trimit fiecare eșantion cu ora lui de început și de sfârșit, în locul unui total zilnic. Metricile CSV vin ca tabelul lat descris pe pagina fișierelor.

Antrenamente

{"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"}
]}}

Jurnal de forță

Fiecare serie de lucru (încălzirile sunt lăsate deoparte), plus progresul pe exercițiu și volumul pe grupă musculară. Greutățile sunt în unitatea aleasă la Configurări, Unități. Câmpul unit spune care este. Fiecare serie are set_type cu valoarea work, failure sau drop și poartă și rir dacă ai notat repetările rămase în rezervă. set_credits numără seriile creditate unei grupe musculare, în fracții când un exercițiu lucrează mai multe grupe.

{"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}]
}}

Jurnal de nutriție

{"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}}
  ]}
]}}

Cum scrii un receptor

Merge orice acceptă un POST HTTPS și răspunde cu 2xx: un serviciu de webhookuri, o funcție serverless, un script pe un server de acasă. Trei reguli îl țin robust:

Un receptor Python de douăsprezece rânduri care arhivează fiecare cerere:

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()

Pune-l în spatele HTTPS (un Cloudflare Tunnel, un Tailscale Funnel sau orice reverse proxy) și îndreaptă automatizarea spre el. Dacă vrei mai degrabă o copie pe care o poți interoga decât un dosar de fișiere, oglinda auto-găzduită este exact acest receptor, deja scris.

Bine de știut

Depanare

Testează cu Rulează acum. Rândul de sub el spune ce s-a întâmplat, iar Mai multe opțiuni, Jurnal de activitate păstrează ultimele 30 de rulări cu același rând. Activează Notifică la rulare (Mai multe opțiuni) ca să primești o notificare la fiecare rulare cât verifici.

Ce arată MarrowCe faci
Un rezumat al celor trimise, de exemplu 12 diary entriesLivrat: receptorul a răspuns cu 2xx. Dacă nu apare nimic la el, vezi ultimele rânduri de mai jos.
Server answered 401 sau 403Receptorul cere un antet sau cel adăugat de tine este greșit. Verifică numele și valoarea lui, inclusiv Bearer și spațiul de după.
Server answered 404Adresă greșită sau receptorul nu ascultă. În n8n, folosește Production URL și activează fluxul de lucru. Verifică dacă lipsește calea de la sfârșit.
Server answered 405Adresa nu primește POST. Îndreaptă-o spre endpointul făcut pentru date primite.
Server answered 413Conținutul este prea mare pentru receptor. Alege un interval de date mai scurt, mai puține metrici sau Totaluri zilnice în loc de Eșantioane brute.
Server answered 500 sau alt cod 5xxReceptorul a eșuat când l-a procesat. Uită-te în jurnalul lui. Arhivează mai întâi corpul brut, apoi analizează-l.
Cererea a expiratReceptorului i-a trebuit mai mult decât timpul limită. Răspunde întâi și lucrează după aceea, sau mărește Timp limită la Mai multe opțiuni (până la 300 s).
The App Transport Security policy requires the use of a secure connectionAdresa este http simplu, pe internet. Folosește https. iOS lasă Marrow să folosească http simplu doar în propria ta rețea.
A server with the specified hostname could not be foundO greșeală de scriere în adresă sau un nume pe care îl știe doar rețeaua ta de acasă. Verifică-l în Safari, pe telefon.
No valid URL - set an https endpoint firstAdresa este goală sau nu începe cu https:// (sau http:// în propria ta rețea).
Nothing to export in this rangeNu există date de acest tip în intervalul ales. Alege un interval mai lung la Mai multe opțiuni sau înregistrează mai întâi ceva.

Rezolvările pentru fiecare unealtă în parte sunt pe pagina ei: n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB, orice URL.