Automatyzacje: Twoje dane, wysyłane według harmonogramu
Marrow potrafi wysłać metodą POST plik z Twoimi danymi zdrowotnymi pod dowolny wskazany przez Ciebie adres URL, z wybraną przez Ciebie częstotliwością, bezpośrednio z telefonu. Ta strona to opis referencyjny: jak to skonfigurować, jak wygląda każdy pakiet danych i jak napisać coś, co je odbiera.
Gotowe konfiguracje dla n8n, Zapier, Make, Home Assistant, Google Sheets i InfluxDB znajdziesz w sekcji połączenia.
Wszystkie poradniki Marrow: MCP · Samodzielnie hostowana kopia lustrzana · Automatyzacje · Pliki · Wsparcie
Czym jest automatyzacja
Zapisane zadanie w sekcji Eksportuj, Automatyczne: jeden rodzaj danych, jeden format, jeden zakres dat, jeden adres URL, jedna częstotliwość. Marrow buduje plik ze swojego zweryfikowanego magazynu i wysyła go metodą POST na ten adres przy zamkniętej aplikacji, po każdej synchronizacji i przy każdym odświeżeniu w tle, gdy tylko minie wyznaczony czas. Nic nie przechodzi przez nas: telefon łączy się bezpośrednio z Twoim punktem końcowym.
Konfiguracja
- Karta Eksportuj, Automatyczne: włącz, a potem Nowa automatyzacja. Jeśli powstanie ze strony narzędzia (n8n, Zapier, Home Assistant i pozostałe w sekcji połączenia), automatyzacja nosi nazwę tego narzędzia i przy każdym polu podpowiada, czego narzędzie tam oczekuje.
- Adres: adres URL https, pod który ma wysyłać POST. Nagłówki: wszystko, czego potrzebuje odbiornik (token
Authorizationtypu bearer,X-Gitlab-Token, cokolwiek). Gdy narzędzie nie wymaga żadnych, Dodaj nagłówek znajdziesz w sekcji Więcej opcji. - Dane: Wskaźniki zdrowia, Treningi, Dziennik treningu siłowego, Dziennik odżywiania lub Objawy i nastrój, jako JSON lub CSV. Jedna automatyzacja obsługuje jeden rodzaj, więc utwórz po jednej na każdy potrzebny rodzaj. Każda włączona liczy się jako połączenie: plan bezpłatny pozwala mieć włączone 1 połączenie naraz, Marrow Pro do 10, wliczając AI i serwery.
- Częstotliwość: co tyle minut, godzin lub dni. Zakres dat, agregacja i limit czasu są w sekcji Więcej opcji.
- Uruchom teraz wysyła pierwszy pakiet danych, aby sprawdzić odbiornik, zanim nadejdzie czas z harmonogramu.
Zakresy dat
- Od ostatniego uruchomienia (domyślnie): wszystko od ostatniego udanego uruchomienia, zaczynając o dwa dni wcześniej (zakładka). HealthKit uzupełnia dane dnia jeszcze po jego zakończeniu, więc zakładka wysyła ponownie niedawno zakończone dni. Zachowuj po swojej stronie najnowszą wartość dla każdego wskaźnika i dnia, a powtórzenia będą nieszkodliwe. Odbiornik, który przez jakiś czas nie działał, dostaje wszystkie pominięte dni przy pierwszym udanym uruchomieniu.
- Dzisiaj, Ostatnie 7 / 30 / 90 dni, Ostatni rok: stałe okna kroczące, wysyłane w całości przy każdym uruchomieniu. Wybierz je, gdy wolisz migawkę, która sama się naprawia, niż samą zmianę (deltę).
Struktura danych
Wskaźniki zdrowia (sumy dzienne, JSON)
Taka sama struktura jak wskaźniki w Health Auto Export (lista metrics z polami name, units i data z qty), więc odbiornik napisany dla tej aplikacji wymaga tylko drobnych zmian: daty to tu zwykłe dni, a nie znaczniki czasu, a poniższe dane treningów i treningu siłowego mają format własny Marrow. Wartości są w zapisanej jednostce podanej w units (kg, m, mL, degC, kcal, count). Tętno przychodzi jako Avg, Min i Max z każdego dnia w bpm, a sen jako każda noc z fazami w godzinach. Jeśli chcesz jednostki imperialne, przelicz je po swojej stronie.
{"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"}]}
]}}
Surowe próbki (grupowanie Surowe próbki) wysyłają każdą próbkę z czasem początku i końca zamiast sumy dziennej. Wskaźniki w CSV przychodzą jako szeroka tabela opisana na stronie plików.
Treningi
{"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"}
]}}
Dziennik treningu siłowego
Każda seria robocza (rozgrzewki są pominięte), a także postęp w każdym ćwiczeniu i objętość dla każdej grupy mięśni. Ciężary są w jednostce wybranej w Ustawienia, Jednostki. Pole unit mówi, w której. set_type każdej serii to work, failure lub drop, a seria zawiera też rir, jeśli zapisano powtórzenia w zapasie. set_credits liczy serie zaliczone do grupy mięśni, w ułamkach, gdy ćwiczenie angażuje kilka grup.
{"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}]
}}
Dziennik odżywiania
{"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}}
]}
]}}
Pisanie odbiornika
Działa wszystko, co przyjmuje żądanie POST przez HTTPS i odpowiada kodem 2xx: usługa webhooków, funkcja bezserwerowa, skrypt na domowym serwerze. Trzy zasady zapewniają jego niezawodność:
- Wygrywa najnowsza wartość. Zapisuj wartości pod kluczem (wskaźnik, dzień) lub według tożsamości samego wpisu i nadpisuj je przy powtórzeniu. Okna nakładają się celowo.
- Najpierw zarchiwizuj surową treść. Potem ją przetwarzaj. Błąd parsera nigdy nie powinien kosztować Cię danych.
- Odpowiadaj szybko. Marrow czeka do ustawionego limitu czasu (domyślnie 60 s), a potem oznacza uruchomienie jako nieudane. Nieudane uruchomienia są ponawiane przy następnym cyklu, od ostatniego udanego okna.
Dwunastowierszowy odbiornik w Pythonie, który archiwizuje każde żądanie:
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()
Udostępnij go przez HTTPS (Cloudflare Tunnel, Tailscale Funnel lub dowolny reverse proxy) i wskaż go w automatyzacji. Jeśli zależy Ci na kopii, którą można odpytywać, a nie na folderze z plikami, samodzielnie hostowana kopia lustrzana to gotowy, napisany odbiornik.
Warto wiedzieć
- Automatyzacje działają tylko wtedy, gdy iOS pozwala aplikacji działać: po zatwierdzeniu synchronizacji, przy odświeżeniu na pierwszym planie i podczas odświeżania w tle. Telefon zablokowany przez cały dzień wyśle dane po następnym odblokowaniu. Okno od ostatniego uruchomienia uzupełnia lukę.
- Każde uruchomienie jest zapisywane w Dzienniku aktywności automatyzacji (Więcej opcji) wraz z wynikiem, więc błędnie skonfigurowany adres URL widać w aplikacji, a nie tylko na serwerze.
- Zduplikuj automatyzację, aby użyć jej nagłówków dla innego rodzaju danych.
Rozwiązywanie problemów
Sprawdź przyciskiem Uruchom teraz. Wiersz pod nim mówi, co się stało, a Więcej opcji, Dziennik aktywności przechowuje ostatnie 30 uruchomień z takim samym wierszem. Włącz Powiadom po uruchomieniu (Więcej opcji), aby podczas sprawdzania dostawać powiadomienie o każdym uruchomieniu.
| Co pokazuje Marrow | Co zrobić |
|---|---|
Podsumowanie tego, co wysłano, na przykład 12 diary entries | Dostarczono: odbiornik odpowiedział kodem 2xx. Jeśli po jego stronie nic nie widać, zobacz ostatnie wiersze poniżej. |
Server answered 401 lub 403 | Odbiornik wymaga nagłówka albo dodany przez Ciebie jest błędny. Sprawdź jego nazwę i wartość, w tym Bearer i spację po nim. |
Server answered 404 | Zły adres albo odbiornik nie nasłuchuje. W n8n użyj Production URL i aktywuj przepływ. Sprawdź, czy na końcu nie brakuje ścieżki. |
Server answered 405 | Ten adres nie przyjmuje żądań POST. Wskaż punkt końcowy przeznaczony do odbierania danych. |
Server answered 413 | Pakiet danych jest za duży dla odbiornika. Wybierz krótszy zakres dat, mniej wskaźników albo Sumy dzienne zamiast Surowych próbek. |
Server answered 500 lub inny kod 5xx | Odbiornik zawiódł podczas obsługi żądania. Zajrzyj do jego własnego dziennika. Najpierw zarchiwizuj surową treść, potem ją przetwarzaj. |
| Upłynął limit czasu żądania | Odbiornik odpowiadał dłużej niż wynosi limit czasu. Odpowiedz najpierw, a pracuj potem, albo zwiększ Limit czasu w sekcji Więcej opcji (do 300 s). |
| Zasady App Transport Security wymagają użycia bezpiecznego połączenia | Adres to zwykłe http w internecie. Użyj https. iOS pozwala Marrow używać zwykłego http tylko w Twojej własnej sieci. |
| Nie można znaleźć serwera o podanej nazwie hosta | Literówka w adresie albo nazwa znana tylko Twojej sieci domowej. Sprawdź ją w Safari na telefonie. |
No valid URL - set an https endpoint first | Adres jest pusty albo nie zaczyna się od https:// (lub http:// w Twojej własnej sieci). |
Nothing to export in this range | Brak danych tego rodzaju w zakresie dat. Wybierz dłuższy zakres w sekcji Więcej opcji albo najpierw coś zapisz. |
- Dostarczono, ale nic nie dociera. Niektóre odbiorniki odpowiadają kodem 200, nawet gdy odrzucają dane. Home Assistant robi tak przy błędnym identyfikatorze webhooka, a przepis z Apps Script przy błędnym
?key=. Zapier i Make nic nie pokazują, dopóki nie wczytasz próbki w ich edytorze. Sprawdź własną historię lub dziennik odbiornika. - Uruchomienia przychodzą późno lub wcale. iOS wybiera moment uruchomień w tle: po synchronizacji, po otwarciu Marrow i podczas odświeżania w tle. Zostaw włączone Odświeżanie aplikacji w tle dla Marrow (Ustawienia, Ogólne, Odświeżanie aplikacji w tle). Tryb oszczędzania energii wstrzymuje uruchomienia w tle, a telefon, który pozostaje zablokowany, wyśle dane po następnym odblokowaniu. Od ostatniego uruchomienia nadrabia zaległości przy następnym udanym uruchomieniu.
- Odbiornik w Twojej sieci domowej. Marrow potrzebuje dostępu do sieci lokalnej, aby do niego dotrzeć: Ustawienia, Prywatność i ochrona, Sieć lokalna. Stuknij raz Uruchom teraz przy otwartym Marrow, aby iOS mógł o to zapytać. W tle iOS odmawia bez pytania, dopóki nie odpowiesz.
- Zamknięty przesunięciem. Po zamknięciu Marrow przesunięciem w przełączniku aplikacji iOS może nie uruchamiać go w tle, dopóki nie otworzysz go ponownie.
- Te same dni przychodzą dwa razy. Celowo: Od ostatniego uruchomienia wysyła ponownie ostatnie dwa dni, bo Apple Health nadal je uzupełnia. Zachowuj najnowszą wartość dla każdego wskaźnika i dnia.
- Nie chce się włączyć. Każda włączona automatyzacja liczy się jako połączenie. Plan bezpłatny pozwala mieć włączone 1 połączenie naraz, Marrow Pro do 10: AI, serwery i automatyzacje razem. Najpierw wyłącz inną.
- Jednostki wyglądają źle. Wskaźniki przychodzą w zapisanych jednostkach podanych w
units(kg, m, mL, degC, kcal). Serie siłowe stosują Ustawienia, Jednostki, a poleunitmówi, które.
Rozwiązania dla poszczególnych narzędzi są na ich stronach: n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB, dowolny URL.