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
- 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.
- Adresă: URL-ul https la care trimite prin POST. Antete: oricare are nevoie receptorul tău (un token bearer
Authorization, unX-Gitlab-Token, orice). Când unealta nu are nevoie de niciunul, Adaugă antet se află la Mai multe opțiuni. - 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.
- Frecvență: la fiecare câte minute, ore sau zile. Intervalul de date, agregarea și timpul limită se află la Mai multe opțiuni.
- Rulează acum trimite un prim conținut, ca să verifici receptorul înainte să aștepți programul.
Intervale de date
- De la ultima rulare (implicit): tot ce s-a întâmplat de la ultima rulare reușită, minus o suprapunere de două zile. HealthKit continuă să completeze o zi și după ce s-a încheiat, așa că suprapunerea retrimite zilele încheiate recent. Păstrează pe partea ta ultima valoare pentru fiecare metrică și zi, iar repetările sunt inofensive. Un receptor care a fost oprit o vreme primește toate zilele pierdute la prima rulare reușită.
- Astăzi, Ultimele 7 / 30 / 90 de zile, Ultimul an: ferestre mobile fixe, retrimise integral la fiecare rulare. Alege-le când preferi un instantaneu care se repară singur în locul unei diferențe.
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:
- Ultima valoare câștigă. Salvează valorile după (metrică, zi) sau după identitatea proprie a intrării și suprascrie la repetare. Ferestrele se suprapun intenționat.
- Arhivează mai întâi corpul brut. Apoi analizează-l. O eroare de parsare nu trebuie să te coste datele.
- Răspunde repede. Marrow așteaptă până la timpul limită setat de tine (implicit 60 s) și marchează rularea ca eșuată în caz contrar. Rulările eșuate se reiau la următoarea bifă a frecvenței, din ultima fereastră reușită.
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
- Automatizările rulează doar când iOS lasă aplicația să ruleze: după o sincronizare confirmată, la reîmprospătarea în prim-plan și în timpul reîmprospătării în fundal. Un telefon care rămâne blocat toată ziua trimite la următoarea deblocare. Fereastra „de la ultima rulare” acoperă golul.
- Fiecare rulare este înregistrată în Jurnal de activitate al automatizării (Mai multe opțiuni), cu rezultatul ei, așa că un URL greșit se vede în aplicație, nu doar pe serverul tău.
- Dublează o automatizare ca să-i refolosești antetele pentru alt tip de date.
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ă Marrow | Ce faci |
|---|---|
Un rezumat al celor trimise, de exemplu 12 diary entries | Livrat: receptorul a răspuns cu 2xx. Dacă nu apare nimic la el, vezi ultimele rânduri de mai jos. |
Server answered 401 sau 403 | Receptorul 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 404 | Adresă 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 405 | Adresa nu primește POST. Îndreaptă-o spre endpointul făcut pentru date primite. |
Server answered 413 | Conț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 5xx | Receptorul a eșuat când l-a procesat. Uită-te în jurnalul lui. Arhivează mai întâi corpul brut, apoi analizează-l. |
| Cererea a expirat | Receptorului 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 connection | Adresa 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 found | O 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 first | Adresa este goală sau nu începe cu https:// (sau http:// în propria ta rețea). |
Nothing to export in this range | Nu există date de acest tip în intervalul ales. Alege un interval mai lung la Mai multe opțiuni sau înregistrează mai întâi ceva. |
- Livrat, dar nu ajunge nimic. Unele receptoare răspund 200 chiar și când aruncă datele. Home Assistant face asta cu un ID de webhook greșit, iar rețeta Apps Script cu un
?key=greșit. Zapier și Make nu arată nimic până nu încarci un exemplu în editorul lor. Verifică istoricul sau jurnalul receptorului. - Rulările vin târziu sau deloc. iOS alege momentul pentru rulările în fundal: după o sincronizare, când deschizi Marrow și în timpul reîmprospătării în fundal. Ține activat Background App Refresh pentru Marrow (Settings, General, Background App Refresh). Modul economie de energie ține rulările în fundal pe loc, iar un telefon care rămâne blocat trimite la următoarea deblocare. „De la ultima rulare” recuperează la următoarea rulare reușită.
- Un receptor în rețeaua ta de acasă. Marrow are nevoie de acces la Local Network ca să ajungă la el: Settings, Privacy and Security, Local Network. Atinge Rulează acum o dată, cu Marrow deschis, ca iOS să poată întreba. În fundal, iOS refuză fără să întrebe până răspunzi.
- Aplicația a fost închisă cu un gest. După ce ștergi Marrow din selectorul de aplicații, iOS poate să nu-l trezească în fundal până îl deschizi din nou.
- Aceleași zile ajung de două ori. Intenționat: „De la ultima rulare” retrimite ultimele două zile, pentru că Apple Health continuă să le completeze. Păstrează ultima valoare pentru fiecare metrică și zi.
- Nu se activează. Fiecare automatizare activă se numără ca o conexiune. Gratuit păstrează 1 conexiune activă odată, Marrow Pro până la 10: AI-uri, servere și automatizări la un loc. Oprește mai întâi alta.
- Unitățile par greșite. Metricile ajung în unitățile stocate, din
units(kg, m, mL, degC, kcal). Seriile de forță urmează Configurări, Unități, iar câmpulunitspune care este.
Rezolvările pentru fiecare unealtă în parte sunt pe pagina ei: n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB, orice URL.