Automatiseringer: dine data, sendt efter en tidsplan
Marrow kan sende en fil med dine sundhedsdata med POST til en hvilken som helst URL, du vælger, med den hyppighed, du vælger, direkte fra telefonen. Denne side er referencen: hvordan du opsætter en, hvordan hvert indhold ser ud, og hvordan du skriver noget, der kan modtage det.
Færdige opsætninger til n8n, Zapier, Make, Home Assistant, Google Sheets og InfluxDB finder du under forbindelser.
Alle Marrow-guides: MCP · Selvhostet spejl · Automatiseringer · Filer · Support
Hvad en automatisering er
Et gemt job i Eksporter, Automatiseret: én slags data, ét format, ét datointerval, én URL, én hyppighed. Marrow bygger filen ud fra sit kontrollerede lager og sender den med POST til URL'en, mens appen er lukket, efter hver gennemført synkronisering og ved hver opdatering i baggrunden, når intervallet er gået. Intet går gennem os: telefonen taler direkte med dit endpoint.
Sådan opsætter du en
- Fanen Eksporter, Automatiseret: slå den til, og vælg derefter Ny automatisering. Hvis den laves fra et værktøjs side (n8n, Zapier, Home Assistant og de andre under forbindelser), får automatiseringen værktøjets navn, og ved hvert felt står det, hvad værktøjet vil have der.
- Adresse: den https-URL, den skal sende til med POST. Headers: dem din modtager har brug for (et bearer-token i
Authorization, enX-Gitlab-Token, hvad som helst). Når værktøjet ikke kræver nogen, findes Tilføj overskrift under Flere muligheder. - Data: Sundhedsmålinger, Træninger, Styrkelog, Kostdagbog eller Symptomer og humør, som JSON eller CSV. Én automatisering indeholder én slags, så lav én for hver slags, du vil have. Hver, der er slået til, tæller som en forbindelse: Gratis beholder 1 forbindelse slået til ad gangen, Marrow Pro op til 10, AI'er og servere medregnet.
- Hyppighed: hvert så og så mange minutter, timer eller dage. Datointervallet, sammenlægningen og timeout findes under Flere muligheder.
- Kør nu sender det første indhold, så du kan tjekke modtageren, før du venter på tidsplanen.
Datointervaller
- Siden seneste kørsel (standard): alt siden den seneste vellykkede kørsel, minus et overlap på to dage. HealthKit bliver ved med at udfylde en dag, efter den er slut, så overlappet sender nyligt afsluttede dage igen. Behold den seneste værdi pr. måling og dag hos dig, så er gentagelserne harmløse. En modtager, der har været nede et stykke tid, får hver mistet dag ved den første kørsel, der lykkes.
- I dag, Seneste 7 / 30 / 90 dage, Seneste år: faste glidende vinduer, der sendes igen i fuld længde hver gang. Vælg dem, når du hellere vil have et øjebliksbillede, der heler sig selv, end en delta.
Indholdets opbygning
Sundhedsmålinger (daglige totaler, JSON)
Samme opbygning som målingerne fra Health Auto Export (en liste metrics med name, units og data med qty), så en modtager skrevet til den app kun skal have små ændringer: datoer er her almindelige dage, ikke tidsstempler, og indholdet for træning og styrke nedenfor er Marrows eget. Værdierne er i den gemte enhed, der står i units (kg, m, mL, degC, kcal, count). Puls kommer som hver dags Avg, Min og Max i bpm, og søvn som hver nat med sine faser i timer. Regn om hos dig, hvis du vil have imperiale enheder.
{"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"}]}
]}}
Rå prøver (grupperingen Rå prøver) sender hver prøve med start- og sluttidspunkt i stedet for en daglig total. CSV-målinger kommer som den brede tabel, der er beskrevet på siden om filer.
Træninger
{"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"}
]}}
Styrkelog
Hvert arbejdssæt (opvarmning er udeladt) plus fremgang pr. øvelse og volumen pr. muskelgruppe. Vægte er i den enhed, du valgte under Indstillinger, Enheder. Feltet unit fortæller hvilken. Hvert sæts set_type er work, failure eller drop, og et sæt har også rir, når du loggede gentagelser i reserve. set_credits tæller de sæt, der tilskrives en muskelgruppe, i brøkdele, når en øvelse arbejder med flere grupper.
{"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}]
}}
Kostdagbog
{"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}}
]}
]}}
Skriv en modtager
Alt, der tager imod en HTTPS POST og svarer med 2xx, virker: en webhook-tjeneste, en serverless-funktion, et script på en server derhjemme. Tre regler holder det robust:
- Den seneste vinder. Gem værdier med (måling, dag) eller postens egen identitet som nøgle, og overskriv ved gentagelse. Vinduerne overlapper med vilje.
- Arkivér den rå tekst først. Læs den derefter. En fejl i læsningen må aldrig koste dig data.
- Svar hurtigt. Marrow venter op til den timeout, du har sat (standard 60 s), og markerer ellers kørslen som mislykket. Mislykkede kørsler prøves igen ved næste tik fra det seneste vellykkede vindue.
En Python-modtager på tolv linjer, der arkiverer hvert indlæg:
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()
Sæt den bag HTTPS (en Cloudflare Tunnel, Tailscale Funnel eller en hvilken som helst reverse proxy), og peg automatiseringen på den. Hvis du vil have en kopi, du kan forespørge, frem for en mappe med filer, er det selvhostede spejl netop den modtager, allerede skrevet.
Godt at vide
- Automatiseringer kører kun, når iOS lader appen køre: efter en gennemført synkronisering, ved opdatering i forgrunden og ved opdatering i baggrunden. En telefon, der ligger låst hele dagen, sender, næste gang den låses op. Vinduet siden seneste kørsel dækker hullet.
- Hver kørsel står i automatiseringens Aktivitetslog (Flere muligheder) med sit resultat, så en forkert URL kan ses i appen og ikke kun på din server.
- Duplikér en automatisering for at genbruge dens headers til en anden slags.
Fejlfinding
Test med Kør nu. Linjen under den fortæller, hvad der skete, og Flere muligheder, Aktivitetslog gemmer de seneste 30 kørsler med samme linje. Slå Giv besked ved kørsel (Flere muligheder) til for at få en notifikation for hver kørsel, mens du tjekker.
| Hvad Marrow viser | Hvad du skal gøre |
|---|---|
En oversigt over, hvad der blev sendt, fx 12 diary entries | Leveret: modtageren svarede 2xx. Hvis der ikke vises noget hos den, så se de sidste rækker nedenfor. |
Server answered 401 eller 403 | Modtageren vil have en header, eller den du tilføjede, er forkert. Tjek navn og værdi, også Bearer og mellemrummet efter. |
Server answered 404 | Forkert adresse, eller modtageren lytter ikke. I n8n skal du bruge Production URL og aktivere workflowet. Tjek, om der mangler en sti til sidst. |
Server answered 405 | Adressen tager ikke imod en POST. Peg på det endpoint, der er lavet til indgående data. |
Server answered 413 | Indholdet er for stort til modtageren. Vælg et kortere datointerval, færre målinger eller Daglige totaler i stedet for Rå prøver. |
Server answered 500 eller en anden 5xx | Modtageren fejlede under behandlingen. Kig i dens egen log. Arkivér den rå tekst først, og læs den derefter. |
| Anmodningen fik timeout | Modtageren brugte længere tid end timeout. Svar først, og arbejd bagefter, eller hæv Timeout under Flere muligheder (op til 300 s). |
| The App Transport Security policy requires the use of a secure connection | Adressen er almindelig http på internettet. Brug https. iOS lader kun Marrow bruge almindelig http på dit eget netværk. |
| A server with the specified hostname could not be found | En tastefejl i adressen eller et navn, som kun dit hjemmenetværk kender. Tjek det i Safari på telefonen. |
No valid URL - set an https endpoint first | Adressen er tom eller starter ikke med https:// (eller http:// på dit eget netværk). |
Nothing to export in this range | Ingen data af den slags i datointervallet. Vælg et længere interval under Flere muligheder, eller log noget først. |
- Leveret, men der kommer intet frem. Nogle modtagere svarer 200, selv når de dropper dataene. Home Assistant gør det med et forkert webhook-id, og opskriften med Apps Script gør det med en forkert
?key=. Zapier og Make viser intet, før du indlæser et eksempel i deres editor. Tjek modtagerens egen historik eller log. - Kørsler kommer for sent eller slet ikke. iOS vælger tidspunktet for kørsler i baggrunden: efter en synkronisering, når du åbner Marrow, og under opdatering i baggrunden. Lad Opdatering af apps i baggrunden være slået til for Marrow (Indstillinger, Generelt, Opdatering af apps i baggrunden). Strømsparetilstand holder kørsler i baggrunden tilbage, og en telefon, der ligger låst, sender, næste gang den låses op. Siden seneste kørsel indhenter det ved næste kørsel, der lykkes.
- En modtager på dit hjemmenetværk. Marrow skal have adgang til lokalt netværk for at nå den: Indstillinger, Anonymitet og sikkerhed, Lokalt netværk. Tryk på Kør nu én gang med Marrow åben, så iOS kan spørge. I baggrunden afviser iOS uden at spørge, indtil du har svaret.
- Fejet væk. Når du fejer Marrow væk i appskifteren, vækker iOS den muligvis ikke i baggrunden, før du åbner den igen.
- De samme dage kommer to gange. Med vilje: Siden seneste kørsel sender de sidste to dage igen, fordi Apple Health bliver ved med at udfylde dem. Behold den seneste værdi pr. måling og dag.
- Den vil ikke slå til. Hver automatisering, der er slået til, tæller som en forbindelse. Gratis beholder 1 forbindelse slået til ad gangen, Marrow Pro op til 10: AI'er, servere og automatiseringer tilsammen. Slå en anden fra først.
- Enhederne ser forkerte ud. Målinger kommer i de gemte enheder, der står i
units(kg, m, mL, degC, kcal). Styrkesæt følger Indstillinger, Enheder, og feltetunitfortæller hvilken.
Løsninger for ét værktøj ad gangen står på dets side: n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB, enhver URL.