Marrow Health
PL
Pobierz

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

  1. 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.
  2. Adres: adres URL https, pod który ma wysyłać POST. Nagłówki: wszystko, czego potrzebuje odbiornik (token Authorization typu bearer, X-Gitlab-Token, cokolwiek). Gdy narzędzie nie wymaga żadnych, Dodaj nagłówek znajdziesz w sekcji Więcej opcji.
  3. 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.
  4. Częstotliwość: co tyle minut, godzin lub dni. Zakres dat, agregacja i limit czasu są w sekcji Więcej opcji.
  5. Uruchom teraz wysyła pierwszy pakiet danych, aby sprawdzić odbiornik, zanim nadejdzie czas z harmonogramu.

Zakresy dat

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ść:

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ć

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 MarrowCo zrobić
Podsumowanie tego, co wysłano, na przykład 12 diary entriesDostarczono: odbiornik odpowiedział kodem 2xx. Jeśli po jego stronie nic nie widać, zobacz ostatnie wiersze poniżej.
Server answered 401 lub 403Odbiornik wymaga nagłówka albo dodany przez Ciebie jest błędny. Sprawdź jego nazwę i wartość, w tym Bearer i spację po nim.
Server answered 404Zł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 405Ten adres nie przyjmuje żądań POST. Wskaż punkt końcowy przeznaczony do odbierania danych.
Server answered 413Pakiet 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 5xxOdbiornik zawiódł podczas obsługi żądania. Zajrzyj do jego własnego dziennika. Najpierw zarchiwizuj surową treść, potem ją przetwarzaj.
Upłynął limit czasu żądaniaOdbiornik 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łączeniaAdres 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 hostaLiterówka w adresie albo nazwa znana tylko Twojej sieci domowej. Sprawdź ją w Safari na telefonie.
No valid URL - set an https endpoint firstAdres jest pusty albo nie zaczyna się od https:// (lub http:// w Twojej własnej sieci).
Nothing to export in this rangeBrak danych tego rodzaju w zakresie dat. Wybierz dłuższy zakres w sekcji Więcej opcji albo najpierw coś zapisz.

Rozwiązania dla poszczególnych narzędzi są na ich stronach: n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB, dowolny URL.