Marrow Health
PL
Pobierz

Wysyłanie danych z Apple Health do webhooka

Apple Health nie ma webowego API, więc dane trafiają do webhooka tylko wtedy, gdy wyśle je aplikacja na Twoim iPhonie. Marrow Health robi to bezpłatnie: automatyzacja wysyła metodą POST Twoje wskaźniki zdrowia, treningi, serie treningu siłowego, dziennik jedzenia albo objawy i nastrój na dowolny adres URL, jako JSON lub CSV, według wybranego harmonogramu, przy zamkniętej aplikacji. Poniżej znajdziesz konfigurację, strukturę danych oraz działające odbiorniki dla n8n, Home Assistant i zwykłego serwera. To my tworzymy Marrow.

Skonfiguruj automatyzację

  1. W Marrow Health otwórz kartę Eksportuj, potem Automatyczne, a następnie Nowa automatyzacja.
  2. Wklej adres URL webhooka (użyj HTTPS). Dodaj nagłówki, które sprawdza Twój odbiornik, na przykład token Authorization typu bearer albo klucz header-auth z n8n.
  3. Wybierz rodzaj danych: Wskaźniki zdrowia, Treningi, Dziennik treningu siłowego, Dziennik odżywiania lub Objawy i nastrój. Jedna automatyzacja wysyła jeden rodzaj, a możesz mieć ich do dziesięciu.
  4. Wybierz JSON lub CSV, zakres dat (domyślnie Od ostatniego uruchomienia) oraz częstotliwość uruchamiania w minutach, godzinach lub dniach.
  5. Włącz ją i stuknij Uruchom teraz, aby wysłać pierwszy pakiet danych, obserwując odbiornik.

Każde żądanie to POST z Content-Type: application/json (lub text/csv) i Twoimi nagłówkami. Każde uruchomienie wraz z kodem odpowiedzi jest wypisane w historii automatyzacji w aplikacji.

Co przychodzi

Wskaźniki zdrowia przychodzą jako sumy dzienne, w jednostce podanej w units. Tętno przychodzi jako średnia, minimum i maksimum z każdego dnia, a sen jako każda noc z podziałem na fazy, w godzinach:

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

Dane treningów, treningu siłowego, odżywiania i nastroju, surowe próbki zamiast sum dziennych oraz układ CSV znajdziesz w opisie automatyzacji.

Odbieranie w n8n

  1. Dodaj węzeł Webhook. Ustaw HTTP Method na POST i nadaj mu ścieżkę, na przykład apple-health.
  2. Aby użyć sekretu, ustaw Authentication na Header Auth i dodaj tę samą nazwę oraz wartość nagłówka do automatyzacji w Marrow.
  3. Kliknij Listen for test event, a potem w ciągu dwóch minut stuknij Uruchom teraz w Marrow. Dane pojawią się w edytorze.
  4. Opublikuj przepływ i wskaż w Marrow adres Production URL (ten z /webhook/, a nie z /webhook-test/). Adres testowy przestaje nasłuchiwać po teście.

Dane są w body, więc dzisiejsze kroki to {{ $json.body.data.metrics.find(m => m.name === 'step_count').data.at(-1).qty }} w wyrażeniu. Dodaj węzeł Split Out na body.data.metrics, aby obsłużyć każdy wskaźnik jako osobny element. n8n domyślnie przyjmuje dane do 16 MB, co wystarcza na lata sum dziennych. Uruchomienia produkcyjne widać w sekcji Executions, a nie w edytorze. (dokumentacja n8n Webhook)

Odbieranie w Home Assistant

Wyzwalacz webhooka przyjmuje żądanie POST pod adresem /api/webhook/<webhook_id>. Ta automatyzacja zapisuje najnowszą liczbę kroków w pomocniku liczbowym o nazwie input_number.steps_today (najpierw go utwórz, z maksimum wyższym niż Twój najlepszy dzień):

automation:
  - alias: "Apple Health from Marrow"
    triggers:
      - trigger: webhook
        webhook_id: "pick-a-long-random-id"
        allowed_methods:
          - POST
        local_only: false
    actions:
      - action: input_number.set_value
        target:
          entity_id: input_number.steps_today
        data:
          value: >-
            {{ ((trigger.json.data.metrics
                 | selectattr('name', 'eq', 'step_count') | first).data
                 | last).qty }}

(Dokumentacja wyzwalacza webhooka w Home Assistant)

Odbieranie na własnym serwerze

Działa każdy punkt końcowy, który przyjmuje żądanie POST przez HTTPS i odpowiada kodem 2xx. Ten archiwizuje każdy pakiet danych do pliku:

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 za pomocą Cloudflare Tunnel, Tailscale Funnel lub reverse proxy. Jeśli wolisz bazę danych, którą można odpytywać, zamiast folderu z plikami, samodzielnie hostowana kopia lustrzana Marrow to gotowy, napisany odbiornik, który mogą też odpytywać agenci AI.

Trzy zasady odbiornika, który nigdy nie gubi danych

Kiedy się uruchamia?

Za każdym razem, gdy iOS pozwoli Marrow działać: po synchronizacji z Apple Health, po otwarciu aplikacji i podczas odświeżania w tle, gdy minie wybrany interwał. To iOS decyduje, kiedy następuje odświeżanie w tle, więc telefon zablokowany przez cały dzień wyśle dane po następnym odblokowaniu, a Od ostatniego uruchomienia uzupełni lukę.

Inne sposoby