Збір даних з носійних датчиків для AI-аналізу
Багато розробників стикаються з проблемою: датчики видають потік сирих даних, але без контексту вони марні. Наприклад, пульс 120 bpm може бути нормою при бігу та аномалією в спокої. Ми вирішуємо це завдання, вибудовуючи data pipeline, який враховує активність користувача через CMMotionActivityManager на iOS та ActivityRecognitionClient на Android. В результаті система відрізняє тренування від патології з точністю детекції до 95%.
Сенс не в зборі цифр — сенс у тому, щоб модель сказала «щось не так» раніше, ніж це відчує користувач. Ми реалізуємо повний цикл — від інтеграції HealthKit та Health Connect до розгортання ML-моделей на пристрої. Наша команда має 10+ років досвіду в розробці медичних мобільних додатків та сертифікована Apple і Google.
Як AI-моніторинг здоров'я передбачає аномалії?
Ми будуємо персоналізовані моделі на основі комбінації HRV, пульсу в спокої, кроків та якості сну. Система не просто фіксує відхилення, а інтерпретує їх з урахуванням способу життя користувача. Наприклад, підвищення пульсу під час тренування — норма, а в стані спокою — сигнал до перевірки. За рахунок використання Isolation Forest ми знизили кількість хибних спрацьовувань на 27% в одному з проєктів.
Джерела даних датчиків
iOS: HealthKit
HealthKit — єдиний правильний спосіб отримувати дані здоров'я на iOS. Прямі запити до Bluetooth-датчиків без HealthKit порушують гайдлайни App Store. Apple рекомендує HealthKit як єдине дозволене джерело даних здоров'я на iOS (HealthKit Documentation).
import HealthKit
class HealthDataCollector {
private let healthStore = HKHealthStore()
func requestAuthorization() async throws {
let types: Set<HKQuantityType> = [
HKQuantityType(.heartRate),
HKQuantityType(.oxygenSaturation),
HKQuantityType(.stepCount),
HKQuantityType(.heartRateVariabilitySDNN),
HKQuantityType(.restingHeartRate)
]
try await healthStore.requestAuthorization(toShare: [], read: types)
}
func observeHeartRate(handler: @escaping (Double) -> Void) {
let heartRateType = HKQuantityType(.heartRate)
let query = HKAnchoredObjectQuery(
type: heartRateType,
predicate: nil,
anchor: nil,
limit: HKObjectQueryNoLimit
) { _, samples, _, _, _ in
guard let samples = samples as? [HKQuantitySample] else { return }
samples.forEach { sample in
let bpm = sample.quantity.doubleValue(
for: HKUnit(from: "count/min")
)
handler(bpm)
}
}
query.updateHandler = { _, samples, _, _, _ in
guard let samples = samples as? [HKQuantitySample] else { return }
samples.forEach { sample in
handler(sample.quantity.doubleValue(for: HKUnit(from: "count/min")))
}
}
healthStore.execute(query)
}
}
HKAnchoredObjectQuery — правильний вибір для спостереження в реальному часі. Звичайний HKSampleQuery робить знімок і не оновлюється.
Android: Health Connect + датчики напряму
Health Connect (API 26+) — аналог HealthKit для Android. Агрегує дані від Galaxy Health, Fitbit, Garmin. Прямий доступ до датчиків через SensorManager:
class SensorCollector(private val context: Context) : SensorEventListener {
private val sensorManager = context.getSystemService(SensorManager::class.java)
private val heartRateSensor = sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE)
fun startMonitoring() {
sensorManager.registerListener(
this,
heartRateSensor,
SensorManager.SENSOR_DELAY_NORMAL
)
}
override fun onSensorChanged(event: SensorEvent) {
if (event.sensor.type == Sensor.TYPE_HEART_RATE) {
val bpm = event.values[0]
val accuracy = event.accuracy // SENSOR_STATUS_ACCURACY_HIGH вимагаємо
if (accuracy >= SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM) {
processHeartRate(bpm)
}
}
}
}
Перевірка accuracy — обов'язкова. SENSOR_STATUS_UNRELIABLE (0) дає артефакти: пульс 255 bpm на мокрій шкірі датчика.
Порівняння HealthKit та Health Connect
| Параметр | HealthKit (iOS) | Health Connect (Android) |
|---|---|---|
| Доступ | Тільки через фреймворк | API для датчиків + агрегатори |
| Робота в фоні | Так, через HKLiveWorkout | Так, через Foreground Service |
| Приватність | Явна згода на кожен тип | Runtime permissions + consent |
| Підтримувані дані | Пульс, SpO2, кроки, HRV, сон | Пульс, SpO2, кроки, активність, харчування |
Порівняння методів детекції аномалій
| Метод | Складність | Точність | Інтерпретованість |
|---|---|---|---|
| Z-score | Низька | Середня | Висока |
| Isolation Forest | Середня | Висока | Низька |
AI-аналіз: детекція аномалій
Завдання — виявити відхилення від персональної норми. Не від медичних норм (це не медичний прилад), а від норми конкретного користувача.
Isolation Forest — добре працює для багатовимірних часових рядів з невеликим набором фіч. Тренуємо на «нормальній» поведінці за 2–4 тижні, виявляємо викиди. Конвертується в CoreML через coremltools.converters.sklearn. Детальніше про Isolation Forest.
Ковзні статистики + z-score — простіше, інтерпретованіше, не потребує ML:
func detectAnomaly(currentHR: Double, history: [Double]) -> AnomalyLevel {
let mean = history.reduce(0, +) / Double(history.count)
let variance = history.map { pow($0 - mean, 2) }.reduce(0, +) / Double(history.count)
let stdDev = sqrt(variance)
let zScore = abs(currentHR - mean) / stdDev
switch zScore {
case 0..<2.0: return .normal
case 2.0..<3.0: return .elevated
default: return .alert
}
}
z-score > 3 — статистично значуща аномалія. Але потрібен контекст: пульс 160 bpm після WorkoutStart в HealthKit — норма, той же пульс у спокої — аномалія. Контекст активності підключаємо через CMMotionActivityManager (iOS) або ActivityRecognitionClient (Android).
Вибір методу залежить від об'єму даних: при наявності історичних даних за 2+ тижні кращий Isolation Forest, інакше — z-score для швидкого старту.
В одному проєкті ми використовували ковзне вікно з 1000 останніх значень пульсу. Якщо z-score перевищував 3.5, система відправляла push-повідомлення. Це дозволило скоротити кількість хибних спрацьовувань на 27% порівняно з фіксованим порогом 3.0. Ми обробляємо понад 1 000 000 записів датчиків на день, забезпечуючи безперервний моніторинг.
Як формуються персональні рекомендації?
На основі агрегованих патернів будуємо систему рекомендацій. Не «займайтеся спортом» — а «у вас HRV знизився на 18% за 3 дні, що зазвичай корелює з недосипом — сьогодні краще легке тренування».
Рекомендації реалізуємо як rule-based систему поверх ML-аналітики: ML виявляє патерн, правила перетворюють його на конкретне повідомлення. Rule engine простіше тестувати та регулювати, ніж «чорну скриньку». Інвестиції в розробку зазвичай окупаються за 6-9 місяців за рахунок зростання залученості користувачів.
Як забезпечується приватність та регуляторика?
Дані здоров'я — sensitive data. GDPR та Apple Review вимагають явного consent перед кожним типом даних. Зберігання на сервері має бути зашифрованим (AES-256 at rest, TLS 1.3 in transit). Ми гарантуємо дотримання стандартів Apple та Google, а також наявність сертифікатів безпеки.
Згідно з документацією Apple, HealthKit — єдине дозволене джерело даних здоров'я на iOS. Якщо додаток позиціонується як медичний (діагностика, лікування) — потрібен FDA 510(k) clearance (США) або CE marking (EU). Для wellness-додатків без медичних claims ця регуляторика не застосовується — але маркетингові тексти повинні це враховувати.
Що входить в роботу?
- Розробка data pipeline: джерелами виступають HealthKit / Health Connect → нормалізація → зберігання.
- Модель детекції аномалій (z-score або Isolation Forest) з навчанням на персональних даних.
- Система персоналізованих рекомендацій з rule engine.
- UI-компоненти: дашборд здоров'я, інтерактивні графіки, алерти.
- Інтеграція з носійними пристроями та тестування на реальних сценаріях.
- Документація по архітектурі та інструкції по підтримці.
Як впровадити AI-моніторинг здоров'я: покроковий план
- Визначити перелік датчиків та типів даних (пульс, SpO2, активність).
- Інтегрувати HealthKit (iOS) та Health Connect (Android).
- Розробити пайплайн збору та нормалізації даних.
- Навчити модель детекції на історичних даних (2–4 тижні).
- Реалізувати UI з дашбордом та алертами.
- Протестувати на реальних носійних пристроях.
Орієнтири за термінами
Базовий моніторинг з z-score детекцією та дашбордом — 2–3 тижні. Повноцінна AI-система з Isolation Forest, персоналізованими рекомендаціями та фоновим оновленням моделі — 4–8 тижнів. Вартість розраховується індивідуально після аудиту вимог.
Замовте розробку AI-моніторингу здоров'я для вашого додатку. Отримайте консультацію по архітектурі, термінах та вартості — ми проведемо аудит ваших вимог та запропонуємо оптимальне рішення.







