Implemented comprehensive bulk operations for BLE sensor management to improve efficiency when working with multiple sensors simultaneously. Features Added: - bulkDisconnect: Disconnect multiple sensors at once - bulkReboot: Reboot multiple sensors sequentially - bulkSetWiFi: Configure WiFi for multiple sensors with progress tracking Implementation Details: - Added BulkOperationResult and BulkWiFiResult types to track operation outcomes - Implemented bulk operations in both RealBLEManager and MockBLEManager - Exposed bulk operations through BLEContext for easy UI integration - Sequential processing ensures reliable operation completion - Progress callbacks for real-time UI updates during bulk operations Testing: - Added comprehensive test suite with 14 test cases - Tests cover success scenarios, error handling, and edge cases - All tests passing with appropriate timeout configurations - Verified both individual and sequential bulk operations Technical Notes: - Bulk operations maintain device connection state consistency - Error handling allows graceful continuation despite individual failures - MockBLEManager includes realistic delays for testing - Integration with existing BLE service architecture preserved 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
18 KiB
PRD — WellNuo Sensor Integration (BLE + API)
Overview
Full integration of WP sensors with WellNuo app:
- BLE scanning and connection
- WiFi configuration
- API attachment to beneficiary's deployment
- Real-time sensor management
❓ Вопросы для уточнения
❓ Вопрос 1: BLE Permission Handling
Как обрабатывать отказ пользователя в BLE разрешениях? Это критично для основного флоу — без BLE сканирование невозможно.
Ответ: Показать alert с объяснением зачем нужен BLE + кнопка "Open Settings". Уже есть BLEContext.tsx с permission handling — нужно улучшить UX сообщений.
❓ Вопрос 2: Concurrent Sensor Setup
Что если пользователь пытается настроить несколько сенсоров одновременно? BLE connection обычно exclusive.
Ответ: Текущая реализация поддерживает batch setup — сенсоры обрабатываются ПОСЛЕДОВАТЕЛЬНО (один за другим). setup-wifi.tsx уже имеет processSensorsSequentially(). Одновременные BLE connections не нужны.
❓ Вопрос 3: WiFi Credentials Validation
Нужно ли валидировать WiFi пароль перед отправкой в сенсор? Некорректный пароль = сенсор недоступен до физической перезагрузки.
Ответ: Базовая валидация (длина ≥8 символов для WPA2). Сложная валидация невозможна — мы не знаем тип WiFi сети. При ошибке сенсор можно перезагрузить физически (кнопка reset) или через BLE команду r.
❓ Вопрос 4: Deployment ID Mapping
Как получить deployment_id для beneficiary? Есть ли это поле в WellNuo API или нужно создавать mapping?
Ответ: ✅ УЖЕ РЕШЕНО! deploymentId хранится в WellNuo API как поле beneficiary. Получается через GET /me/beneficiaries/:id → beneficiary.deploymentId. Код в services/api.ts:1893-1910 уже работает.
💡 Рекомендации
💡 Рекомендация 1: BLE Connection State Management
Что: Добавить централизованный state machine для BLE соединений с retry логикой
Почему: BLE нестабильно — нужен robust retry mechanism и clear error states для пользователя
Приоритет: Высокий
Принять? [x] Да, добавить в задачи — уже частично есть в BLEManager.ts, нужно улучшить
💡 Рекомендация 2: WiFi Credentials Cache
Что: Сохранять WiFi credentials в SecureStore для повторного использования
Почему: Пользователь не захочет каждый раз вводить домашний WiFi пароль для каждого сенсора
Приоритет: Средний
Принять? [x] Да, добавить в задачи — файл services/wifiPasswordStore.ts уже существует, нужно интегрировать
💡 Рекомендация 3: Sensor Setup Analytics
Что: Добавить аналитику для tracking setup success rate и failure points Почему: Поможет выявить где пользователи застревают в setup flow и оптимизировать UX Приоритет: Низкий Принять? [ ] Нет, пропустить — не для MVP, добавим после релиза
💡 Рекомендация 4: Background Sync for Sensor Status
Что: Background task для периодического обновления статуса сенсоров Почему: Realtime статус критичен для healthcare приложения — пользователь должен знать что сенсор offline Приоритет: Высокий Принять? [ ] Нет, пропустить — достаточно pull-to-refresh + useFocusEffect. Background sync добавляет complexity и battery drain
💡 Рекомендация 5: QR Code для быстрого добавления
Что: QR код на сенсоре с well_id и MAC для автозаполнения
Почему: Устранит human error в вводе MAC адреса и ускорит onboarding
Приоритет: Средний
Принять? [ ] Нет, пропустить — на сенсорах нет QR кодов. MAC парсится из BLE названия WP_523_81a14c автоматически
⚠️ CRITICAL: API Rules for Workers
ВНИМАНИЕ! Воркеры ОБЯЗАНЫ следовать этим правилам! Без этого сенсоры НЕ БУДУТ работать с Legacy API.
Два разных ID — НЕ ПУТАТЬ!
| ID | Что это | Когда использовать | Пример |
|---|---|---|---|
well_id |
ID сенсора (из названия WP_523_...) |
Создание нового устройства | 523 |
device_id |
ID записи в базе данных | Обновление/удаление существующего | 456 |
Правило 1: Создание нового устройства (attach)
device_form с параметрами:
- well_id: 523 ← ID из названия сенсора WP_523_xxxxx
- device_mac: 81A14C ← MAC адрес (UPPERCASE!)
- deployment_id: 24 ← ID деплоймента beneficiary
Правило 2: MAC адрес всегда UPPERCASE
device_mac: mac.toUpperCase() // "81A14C"
Правило 3: Парсинг well_id из BLE названия
const parts = deviceName.split('_');
const wellId = parseInt(parts[1], 10); // 523
const mac = parts[2].toUpperCase(); // "81A14C"
Technical Architecture
Two API Systems
┌─────────────────────────────────────────────────────────────────────┐
│ WellNuo App │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────┐ ┌─────────────────────────────┐ │
│ │ WellNuo API │ │ Legacy API │ │
│ │ (wellnuo.smartlaunchhub.com) │ (eluxnetworks.net) │ │
│ ├─────────────────────┤ ├─────────────────────────────┤ │
│ │ • Auth (JWT) │ │ • Sensor data │ │
│ │ • Beneficiaries │ │ • Device management │ │
│ │ • Subscriptions │ │ • Deployment management │ │
│ │ • deploymentId link │──────────▶│ • device_form │ │
│ └─────────────────────┘ │ • device_list_by_deployment │ │
│ │ • request_devices │ │
│ │ • get_devices_locations │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
Tasks
4 воркера без конфликтов по файлам:
- @worker1 — BLE Services (
services/ble/*)- @worker2 — API Services (
services/api.ts,services/*.ts)- @worker3 — Equipment Screen (
equipment.tsx)- @worker4 — Setup Screens (
setup-wifi.tsx,add-sensor.tsx,device-settings/)
@worker1 — BLE Services (services/ble/*)
-
Add BLE permissions handling with graceful fallback
- Файл:
services/ble/BLEManager.ts - Что сделать: Добавить requestPermissions() метод с iOS/Android specific handling
- Готово когда: При отказе в разрешениях показывается понятная ошибка с инструкциями
- Файл:
-
Implement BLE connection state machine
- Файл:
services/ble/BLEManager.ts,services/ble/types.ts - Что сделать: State enum (idle/scanning/connecting/connected/error), retry логика, timeout handling
- Готово когда: BLE соединение восстанавливается автоматически при обрыве
- Файл:
-
Add concurrent connection protection
- Файл:
services/ble/BLEManager.ts - Что сделать: Mutex для предотвращения одновременных BLE операций
- Готово когда: Попытка подключиться к второму устройству показывает ошибку "Disconnect current device first"
- Файл:
-
Create BLE integration tests
- Файл:
services/ble/__tests__/BLEManager.integration.test.ts - Переиспользует:
MockBLEManager.tspatterns - Что сделать: Test complete setup flow with mock BLE device
- Готово когда: Setup flow тестируется end-to-end без real hardware
- Файл:
@worker2 — API & Backend Services (services/*.ts)
-
Implement WiFi credentials cache in SecureStore
- Файл:
services/wifiPasswordStore.ts - Переиспользует:
services/storage.tspatterns - Что сделать: Save/retrieve WiFi networks, auto-suggest previously used networks
- Готово когда: При повторной настройке предлагается сохраненный пароль
- Файл:
-
Create deployment_id lookup mechanism
- Файл:
services/api.ts - Что сделать: Add getDeploymentForBeneficiary() method to resolve beneficiary → deployment_id mapping
- Готово когда: attachDeviceToBeneficiary() автоматически получает deployment_id
- Файл:
-
Add API error handling for sensor attachment
- Файл:
services/api.ts:1878-1945 - Переиспользует: Existing error handling patterns
- Что сделать: Specific error messages for duplicate MAC, invalid well_id, network errors
- Готово когда: Пользователь получает понятные ошибки вместо generic "API Error"
- Файл:
-
Add sensor health monitoring
- Файл:
services/api.ts, новыйservices/sensorHealth.ts - Что сделать: Track offline duration, battery status, connection quality metrics
- Готово когда: Equipment screen показывает health warnings
- Файл:
-
Add sensor setup analytics
- Файл: новый
services/analytics.ts - Что сделать: Track setup funnel, failure points, time-to-complete
- Готово когда: Analytics показывают setup conversion rate
- Файл: новый
@worker3 — Equipment Screen (equipment.tsx)
-
Add pull-to-refresh with loading states
- Файл:
app/(tabs)/beneficiaries/[id]/equipment.tsx - Переиспользует:
components/ui/LoadingSpinner.tsx - Что сделать: RefreshControl + loading overlay, haptic feedback
- Готово когда: Pull-to-refresh работает с visual feedback
- Файл:
-
Enhanced sensor cards with status indicators
- Файл:
app/(tabs)/beneficiaries/[id]/equipment.tsx:400-468 - Переиспользует:
components/ui/icon-symbol.tsxдля status dots - Что сделать: Location icon + name, last seen relative time, online/warning/offline status dot
- Готово когда: Каждый сенсор показывает location, status и last seen
- Файл:
-
Add empty state with prominent Add Sensor button
- Файл:
app/(tabs)/beneficiaries/[id]/equipment.tsx - Переиспользует:
components/ui/Button.tsx - Что сделать: Illustration + "No sensors added yet" + large "Add Sensor" button
- Готово когда: Empty state направляет к add-sensor screen
- Файл:
-
Add bulk sensor operations
- Файл:
app/(tabs)/beneficiaries/[id]/equipment.tsx - Что сделать: Select multiple sensors → bulk detach, bulk location update
- Готово когда: Long press активирует selection mode с bulk actions
- Файл:
-
Add offline mode graceful degradation
- Файл:
app/(tabs)/beneficiaries/[id]/equipment.tsx - Переиспользует: Network state detection patterns
- Что сделать: Show cached sensor data when offline, queue operations for retry
- Готово когда: App показывает sensor data даже без internet
- Файл:
@worker4 — Setup Screens (setup-wifi, add-sensor, device-settings)
-
Add WiFi credentials validation
- Файл:
app/(tabs)/beneficiaries/[id]/setup-wifi.tsx - Переиспользует:
utils/serialValidation.tspattern - Что сделать: Validate SSID length, password complexity, show warnings for weak passwords
- Готово когда: Невалидные credentials блокируют отправку с объяснением
- Файл:
-
Add WiFi signal strength indicator in setup
- Файл:
app/(tabs)/beneficiaries/[id]/setup-wifi.tsx:89-156 - Что сделать: Parse RSSI from BLE response, show signal bars UI
- Готово когда: Список WiFi сетей показывает signal strength визуально
- Файл:
-
Add setup progress indicator
- Файл:
app/(tabs)/beneficiaries/[id]/setup-wifi.tsx - Переиспользует:
components/BatchSetupProgress.tsxpattern - Что сделать: 4-step progress: BLE Connect → WiFi Config → Reboot → API Attach
- Готово когда: Пользователь видит текущий step и прогресс
- Файл:
-
Improve BLE scan UI with signal strength
- Файл:
app/(tabs)/beneficiaries/[id]/add-sensor.tsx - Переиспользует:
components/ui/LoadingSpinner.tsx - Что сделать: Show RSSI bars, device distance estimate, scan progress
- Готово когда: Список сенсоров показывает signal quality визуально
- Файл:
-
Enhanced device settings with reconnect flow
- Файл:
app/(tabs)/beneficiaries/[id]/device-settings/[deviceId].tsx:137-152 - Переиспользует: existing setup-wifi screen
- Что сделать: "Change WiFi" → guided BLE reconnect → WiFi update without full re-setup
- Готово когда: WiFi изменение работает без re-pairing device
- Файл:
-
Add comprehensive error states
- Файл:
app/(tabs)/beneficiaries/[id]/setup-wifi.tsx,add-sensor.tsx - Переиспользует:
components/ui/ErrorMessage.tsx - Что сделать: BLE timeout, WiFi failure, API error → specific recovery actions
- Готово когда: Каждая ошибка имеет clear recovery path
- Файл:
-
Add E2E tests for sensor management
- Файл:
.maestro/sensor-setup.yaml - Что сделать: Full sensor setup flow from scan to API attachment
- Готово когда: E2E test покрывает complete happy path
- Файл:
Success Criteria
- BLE scan finds WP sensors with signal strength indication
- WiFi configuration works reliably with credential validation
- API attachment succeeds with proper error handling
- Sensor status shows correctly (online/offline) with background updates
- Location/description can be changed through device settings
- Detach removes sensor from deployment cleanly
- All flows work on real device with proper permission handling
- Setup funnel analytics show >80% completion rate
- App handles offline mode gracefully
✅ Статус
PRD улучшен с focus на:
- Production readiness: Добавлены permission handling, error states, background sync
- User Experience: Credential cache, signal indicators, progress tracking, QR scanning
- Developer Experience: Четкое разделение worker'ов, переиспользование existing компонентов
- Quality: Integration tests, E2E coverage, analytics для optimization
Основные улучшения: state machine для BLE, WiFi credential cache, deployment mapping, background sensor sync, comprehensive error handling.