التحكم التلقائي: بياناتك، تُدفع وفق جدول
يستطيع Marrow إرسال ملف ببياناتك الصحية بطلب POST إلى أي رابط تختاره، بالتكرار الذي تختاره، من الهاتف مباشرةً. هذه الصفحة هي المرجع: كيف تُعدّ واحدًا، وكيف تبدو كل حمولة، وكيف تكتب ما يستقبلها.
إعدادات جاهزة لـ n8n وZapier وMake وHome Assistant وGoogle Sheets وInfluxDB تجدها ضمن الاتصالات.
كل أدلة Marrow: MCP · النسخة المطابقة المستضافة ذاتيًا · التحكم التلقائي · الملفات · الدعم
ما هو التحكم التلقائي
مهمة محفوظة في تصدير، تلقائي: نوع واحد من البيانات، وصيغة واحدة، ونطاق تواريخ واحد، ورابط واحد، وتكرار واحد. يبني Marrow الملف من مخزنه الموثَّق ويرسله بطلب POST إلى الرابط والتطبيق مغلق، بعد كل مزامنة وعند كل تحديث في الخلفية، كلما انقضى التكرار. لا شيء يمر عبرنا: الهاتف يتحدث مباشرةً مع نقطة نهايتك.
إعداد تحكم تلقائي
- علامة التبويب «تصدير»، تلقائي: شغّله، ثم تحكم تلقائي جديد. وعند إنشائه من صفحة أداة (n8n وZapier وHome Assistant وغيرها ضمن الاتصالات)، يحمل التحكم التلقائي اسم تلك الأداة ويوضح بجانب كل حقل ما تريده الأداة فيه.
- العنوان: رابط https الذي سيُرسل إليه بطلب POST. الترويسات: أي ترويسات يحتاجها المستقبِل (رمز bearer في
Authorization، أوX-Gitlab-Token، أو أي شيء). وعندما لا تحتاج الأداة إلى أي منها، تجد «إضافة عنوان» ضمن «خيارات إضافية». - البيانات: المقاييس الصحية أو التمارين أو سجل تمارين القوة أو يوميات التغذية أو الأعراض والمزاج، بصيغة JSON أو CSV. كل تحكم تلقائي يحمل نوعًا واحدًا، فأنشئ واحدًا لكل نوع تريده. ويُحسب كل واحد قيد التشغيل اتصالًا: تحتفظ الخطة المجانية باتصال واحد قيد التشغيل في كل مرة، وMarrow Pro حتى 10، بما فيها الذكاء الاصطناعي والخوادم.
- التكرار: كل عدد من الدقائق أو الساعات أو الأيام. نطاق التواريخ والتجميع والمهلة تجدها ضمن خيارات إضافية.
- تشغيل الآن يرسل أول حمولة لتتحقق من المستقبِل قبل انتظار الجدول.
نطاقات التواريخ
- منذ آخر تشغيل (الافتراضي): كل شيء منذ آخر تشغيل ناجح، مع تداخل يومين. يواصل HealthKit ملء اليوم بعد انتهائه، لذلك يعيد التداخل إرسال الأيام المكتملة حديثًا. احتفظ بأحدث قيمة لكل مقياس ويوم لديك، وتصبح التكرارات غير مؤذية. أما المستقبِل الذي توقف مدة فيحصل على كل الأيام الفائتة في أول تشغيل ناجح.
- اليوم وآخر 7 / 30 / 90 يومًا والسنة الماضية: نوافذ متحركة ثابتة، تُعاد كاملةً في كل تشغيل. اخترها عندما تفضّل لقطة تصحّح نفسها على تغييرات جزئية.
أشكال الحمولة
المقاييس الصحية (مجاميع يومية، JSON)
البنية نفسها المستخدمة في مقاييس Health Auto Export (قائمة metrics فيها name وunits وdata مع qty)، لذا يحتاج المستقبِل المكتوب لذلك التطبيق إلى تعديلات صغيرة فقط: التواريخ هنا أيام عادية وليست طوابع زمنية، وحمولتا التمارين والقوة أدناه خاصتان بـ Marrow. القيم بالوحدة المخزّنة المذكورة في units (kg وm وmL وdegC وkcal وcount). يأتي معدل نبضات القلب كقيم Avg وMin وMax لكل يوم بوحدة bpm، ويأتي النوم كل ليلة مع مراحلها بالساعات. حوّل على جانبك إن أردت الوحدات الإمبراطورية.
{"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"}]}
]}}
العينات الخام (تجميع العينات الخام) ترسل كل عينة بوقت بدايتها ونهايتها بدلًا من المجموع اليومي. وتأتي مقاييس CSV في الجدول العريض الموصوف في صفحة الملفات.
التمارين
{"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"}
]}}
سجل تمارين القوة
كل جولة عمل (دون جولات الإحماء)، إضافةً إلى التقدم لكل تمرين والحجم لكل مجموعة عضلية. الأوزان بالوحدة التي اخترتها في الإعدادات، الوحدات. والحقل unit يوضح أيّها. نوع كل جولة set_type هو work أو failure أو drop، وتحمل الجولة أيضًا rir عندما سجّلت التكرارات المتبقية في الاحتياط. ويعدّ set_credits الجولات المحتسبة لمجموعة عضلية، بكسور عندما يشغّل التمرين عدة مجموعات.
{"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}]
}}
يوميات التغذية
{"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}}
]}
]}}
كتابة مستقبِل
أي شيء يقبل POST عبر HTTPS ويرد برمز 2xx يصلح: خدمة webhook، أو دالة serverless، أو سكربت على خادم منزلي. ثلاث قواعد تجعله متينًا:
- الأحدث يفوز. خزّن القيم بمفتاح (المقياس، اليوم) أو بهوية الإدخال نفسه واكتب فوقها عند التكرار. النوافذ تتداخل عمدًا.
- احفظ النص الخام أولًا. ثم حلّله. ينبغي ألا يكلّفك خطأ في المحلّل بياناتك.
- أجب بسرعة. ينتظر Marrow حتى المهلة التي حددتها (الافتراضي 60 ثانية) وإلا يعدّ التشغيل فاشلًا. وتُعاد محاولة التشغيلات الفاشلة في نبضة التكرار التالية من آخر نافذة ناجحة.
مستقبِل Python من اثني عشر سطرًا يحفظ كل ما يُرسَل:
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()
ضعه خلف HTTPS (Cloudflare Tunnel أو Tailscale Funnel أو أي وكيل عكسي) ووجّه التحكم التلقائي إليه. وإذا كنت تريد نسخة قابلة للاستعلام بدلًا من مجلد ملفات، فإن النسخة المطابقة المستضافة ذاتيًا هي هذا المستقبِل مكتوبًا جاهزًا.
من المفيد أن تعرف
- تعمل التحكمات التلقائية فقط عندما يسمح iOS للتطبيق بالعمل: بعد المزامنة، وعند التحديث في المقدمة، وأثناء التحديث في الخلفية. الهاتف المقفل طوال اليوم يرسل عند فتحه التالي. ونافذة «منذ آخر تشغيل» تغطي الفجوة.
- يُسجَّل كل تشغيل في سجل النشاط الخاص بالتحكم التلقائي (خيارات إضافية) مع نتيجته، فيظهر الرابط الخاطئ في التطبيق، وليس على خادمك فقط.
- كرّر تحكمًا تلقائيًا لإعادة استخدام ترويساته مع نوع آخر.
استكشاف الأخطاء وإصلاحها
اختبر بـ تشغيل الآن. السطر تحته يقول ما حدث، وخيارات إضافية، سجل النشاط يحتفظ بآخر 30 تشغيلًا بالسطر نفسه. شغّل إشعار عند التشغيل (خيارات إضافية) لتصلك إشعارات عن كل تشغيل أثناء التحقق.
| ما يعرضه Marrow | ما العمل |
|---|---|
ملخص لما أُرسل، مثل 12 diary entries | تم التسليم: ردّ المستقبِل برمز 2xx. إذا لم يظهر شيء لديه، فراجع الصفوف الأخيرة أدناه. |
Server answered 401 أو 403 | المستقبِل يريد ترويسة، أو أن التي أضفتها خاطئة. تحقق من اسمها وقيمتها، بما في ذلك Bearer والمسافة بعدها. |
Server answered 404 | العنوان خاطئ، أو أن المستقبِل لا يستمع. في n8n، استخدم Production URL وفعّل سير العمل. تحقق من مسار ناقص في نهاية العنوان. |
Server answered 405 | العنوان لا يقبل POST. وجّهه إلى نقطة النهاية المخصصة للبيانات الواردة. |
Server answered 413 | الحمولة أكبر مما يحتمله المستقبِل. اختر نطاق تواريخ أقصر، أو مقاييس أقل، أو المجاميع اليومية بدلًا من العينات الخام. |
Server answered 500 أو أي رمز 5xx آخر | فشل المستقبِل أثناء المعالجة. راجع سجله الخاص. احفظ النص الخام أولًا، ثم حلّله. |
| انتهت مهلة الطلب | استغرق المستقبِل أكثر من المهلة. أجب أولًا ثم اعمل بعد ذلك، أو ارفع Timeout ضمن «خيارات إضافية» (حتى 300 ثانية). |
| تشترط سياسة App Transport Security استخدام اتصال آمن | العنوان http عادي على الإنترنت. استخدم https. لا يسمح iOS لـ Marrow باستخدام http العادي إلا على شبكتك الخاصة. |
| تعذّر العثور على خادم بالاسم المحدد | خطأ مطبعي في العنوان، أو اسم لا تعرفه إلا شبكة منزلك. تحقق منه في Safari على الهاتف. |
No valid URL - set an https endpoint first | العنوان فارغ أو لا يبدأ بـ https:// (أو http:// على شبكتك الخاصة). |
Nothing to export in this range | لا توجد بيانات من هذا النوع في نطاق التواريخ. اختر نطاقًا أطول ضمن «خيارات إضافية»، أو سجّل شيئًا أولًا. |
- تم التسليم، لكن لا شيء يصل. بعض المستقبِلات ترد برمز 200 حتى عندما تتجاهل البيانات. يفعل Home Assistant ذلك عند خطأ في معرّف webhook، وتفعله وصفة Apps Script عند خطأ في
?key=. أما Zapier وMake فلا يعرضان شيئًا حتى تحمّل عينة في محررهما. تحقق من سجل المستقبِل نفسه. - التشغيلات تتأخر أو لا تحدث. يختار iOS لحظة التشغيل في الخلفية: بعد المزامنة، وعند فتح Marrow، وأثناء التحديث في الخلفية. أبقِ «تحديث تطبيق الخلفية» (Background App Refresh) قيد التشغيل لـ Marrow (الإعدادات، عام، تحديث تطبيق الخلفية). يؤجل وضع الطاقة المنخفضة التشغيلات في الخلفية، والهاتف المقفل طوال اليوم يرسل عند فتحه التالي. ويستدرك «منذ آخر تشغيل» ما فات في التشغيل الناجح التالي.
- مستقبِل على شبكة منزلك. يحتاج Marrow إلى إذن الشبكة المحلية للوصول إليه: الإعدادات، الخصوصية والأمان، الشبكة المحلية. اضغط «تشغيل الآن» مرة واحدة والتطبيق مفتوح ليتمكن iOS من السؤال. وفي الخلفية يرفض iOS دون أن يسأل إلى أن تجيب.
- أُغلق بالسحب. بعد أن تسحب Marrow بعيدًا في مبدّل التطبيقات، قد لا يوقظه iOS في الخلفية حتى تفتحه مجددًا.
- الأيام نفسها تصل مرتين. عمدًا: «منذ آخر تشغيل» يعيد إرسال آخر يومين لأن Apple Health يواصل ملأهما. احتفظ بأحدث قيمة لكل مقياس ويوم.
- لا يمكن تشغيله. يُحسب كل تحكم تلقائي قيد التشغيل اتصالًا. تحتفظ الخطة المجانية باتصال واحد قيد التشغيل في كل مرة، وMarrow Pro حتى 10: الذكاء الاصطناعي والخوادم والتحكمات التلقائية معًا. أوقف تحكمًا آخر أولًا.
- الوحدات تبدو خاطئة. تصل المقاييس بالوحدات المخزّنة المذكورة في
units(kg وm وmL وdegC وkcal). وتتبع جولات القوة الإعدادات، الوحدات، والحقلunitيوضح أيّها.
حلول كل أداة على حدة في صفحتها: n8n وZapier وMake وHome Assistant وGoogle Sheets وInfluxDB وأي URL.