# FEATURE: Sensors Management System
**ID:** FEATURE-SENSORS
**Status:** 🟡 In Progress
**Priority:** High
**Created:** 2026-01-19
---
## Overview
Система управления BLE-сенсорами WP для мониторинга пожилых людей (beneficiaries).
Сенсоры измеряют активность в помещении и передают данные через WiFi на Legacy API.
**Схема архитектуры:**
https://diagrams.love/canvas?schema=cmkm6nt6x0063ll5lqaq49lbt
---
## Сущности
### Beneficiary (Подопечный)
- Пожилой человек, за которым ухаживают
- Хранится в: **WellNuo API** (PostgreSQL)
- Поля: `firstName`, `lastName`, `avatar`, `dateOfBirth`
### Deployment (Домовладение)
- Место проживания beneficiary в Legacy API
- Хранится в: **Legacy API** (eluxnetworks.net)
- Поля: `address`, `timezone`, `devices[]`, `beneficiary_id`
- Связь: 1 Beneficiary = 1 Deployment
### Device (WP Sensor)
- Физический BLE/WiFi сенсор
- Хранится в: **Legacy API**
- Поля:
- `well_id` — уникальный ID устройства
- `mac` — MAC адрес
- `location` — где установлен (текстовое поле, редактируемое)
- `description` — описание (текстовое поле, редактируемое)
- `deployment_id` — привязка к домовладению
- `status` — online/warning/offline (вычисляется по lastSeen)
---
## API
### WellNuo API (Primary)
**Base URL:** `https://wellnuo.smartlaunchhub.com/api`
**Auth:** Bearer JWT token
Используется для:
- Авторизация пользователей
- CRUD beneficiaries
- Подписки и платежи
- Профиль пользователя
### Legacy API (External)
**Base URL:** `https://eluxnetworks.net/function/well-api/api`
**Auth:** Form-encoded (user_name, token)
⚠️ **Внешний сервис — нет доступа к коду, только API**
#### Ключевые endpoints для устройств:
| Endpoint | Описание | Параметры |
|----------|----------|-----------|
| `device_list_by_deployment` | Список устройств deployment | deployment_id |
| `device_form` | Создать/обновить устройство | well_id, device_mac, location, description, deployment_id |
| `device_set_group` | Установить группу | device_id, group_id |
| `request_devices` | Получить online устройства | deployment_id, fresh=true |
#### Формат device_form:
```
POST /function/well-api/api
Content-Type: application/x-www-form-urlencoded
function=device_form
user_name={{user_name}}
token={{token}}
well_id=497
device_mac=142B2F81A14C
location=Спальня, у кровати
description=Основной сенсор
deployment_id=22
```
---
## Bluetooth Flow
### BLE Manager
**Файл:** `services/ble/BLEManager.ts`
**Библиотека:** `react-native-ble-plx`
### UUID и протокол:
```typescript
SERVICE_UUID: '4fafc201-1fb5-459e-8fcc-c5c9c331914b'
CHAR_UUID: 'beb5483e-36e1-4688-b7f5-ea07361b26a8'
```
### BLE команды:
| Команда | Формат | Описание |
|---------|--------|----------|
| PIN Unlock | `pin\|7856` | Разблокировка устройства |
| Get WiFi List | `w` | Получить доступные WiFi |
| Set WiFi | `W\|SSID,PASSWORD` | Установить WiFi |
| Get WiFi Status | `a` | Текущее подключение |
| Reboot | `s` | Перезагрузка |
| Disconnect | `D` | Отключение BLE |
### Таймауты:
- Сканирование: 10 сек
- Команда: 5 сек
### Формат ответа WiFi List:
```
SSID1,-55;SSID2,-70;SSID3,-80
```
---
## Экраны
### 1. Equipment Screen
**Путь:** `/(tabs)/beneficiaries/:id/equipment`
**Файл:** `app/(tabs)/beneficiaries/[id]/equipment.tsx`
**Функции:**
- Summary card (total/online/warning/offline)
- Список подключённых сенсоров (из API)
- BLE сканирование поблизости
- Detach сенсор
**Текущие ограничения:**
- ❌ НЕТ редактирования location/description
### 2. Add Sensor Screen
**Путь:** `/(tabs)/beneficiaries/:id/add-sensor`
**Файл:** `app/(tabs)/beneficiaries/[id]/add-sensor.tsx`
**Функции:**
- Инструкции по добавлению (4 шага)
- BLE сканирование
- Список найденных устройств с RSSI
### 3. Setup WiFi Screen
**Путь:** `/(tabs)/beneficiaries/:id/setup-wifi`
**Файл:** `app/(tabs)/beneficiaries/[id]/setup-wifi.tsx`
**Функции:**
- Получить WiFi список от сенсора (BLE)
- Выбор сети и ввод пароля
- Подключение и привязка к beneficiary
### 4. Device Settings Screen
**Путь:** `/(tabs)/beneficiaries/:id/device-settings/:deviceId`
**Файл:** `app/(tabs)/beneficiaries/[id]/device-settings/[deviceId].tsx`
**Функции:**
- Просмотр Well ID, MAC, Deployment ID
- Текущий WiFi статус
- Изменение WiFi
- Перезагрузка
**Текущие ограничения:**
- ❌ НЕТ редактирования location/description
---
## Что нужно доработать
### TASK-1: Добавить редактирование location/description
**Проблема:**
Сейчас `location` и `description` показываются в UI (equipment.tsx:454-456), но нет возможности их редактировать.
**Решение:**
1. Добавить в Device Settings Screen форму для редактирования
2. Создать метод `updateDevice()` в api.ts
3. Использовать Legacy API endpoint `device_form`
**Файлы для изменения:**
- `services/api.ts` — добавить `updateDeviceMetadata(deviceId, location, description)`
- `app/(tabs)/beneficiaries/[id]/device-settings/[deviceId].tsx` — добавить форму
**API вызов:**
```typescript
async updateDeviceMetadata(
deviceId: string,
wellId: number,
mac: string,
location: string,
description: string
) {
const creds = await this.getLegacyCredentials();
const formData = new URLSearchParams({
function: 'device_form',
user_name: creds.userName,
token: creds.token,
editing_device_id: deviceId,
well_id: wellId.toString(),
device_mac: mac,
location: location,
description: description,
});
// POST to Legacy API
}
```
### TASK-2: Показывать placeholder для пустого location
**Проблема:**
Если location пустой — ничего не показывается.
**Решение:**
В equipment.tsx вместо:
```tsx
{sensor.location && (
{sensor.location}
)}
```
Сделать:
```tsx
openLocationEditor(sensor)}>
{sensor.location || 'Tap to set location'}
```
### TASK-3: Quick edit location из Equipment Screen
**Проблема:**
Сейчас для редактирования location нужно заходить в Device Settings.
**Решение:**
Добавить inline редактирование или ActionSheet с опцией "Edit Location".
---
## Ключевые файлы
| Файл | Описание |
|------|----------|
| `services/ble/BLEManager.ts` | BLE менеджер |
| `services/ble/types.ts` | Типы BLE |
| `contexts/BLEContext.tsx` | Global BLE state |
| `services/api.ts` | API методы |
| `types/index.ts` | WPSensor тип (строки 47-59) |
| `app/(tabs)/beneficiaries/[id]/equipment.tsx` | Equipment Screen |
| `app/(tabs)/beneficiaries/[id]/add-sensor.tsx` | Add Sensor |
| `app/(tabs)/beneficiaries/[id]/setup-wifi.tsx` | Setup WiFi |
| `app/(tabs)/beneficiaries/[id]/device-settings/[deviceId].tsx` | Device Settings |
| `api/Wellnuo_API.postman_collection.json` | Postman коллекция |
---
## Статусы сенсора
Вычисляются на клиенте по `lastSeen`:
| Статус | Условие | Цвет |
|--------|---------|------|
| `online` | lastSeen < 5 мин | Зелёный |
| `warning` | 5 мин < lastSeen < 60 мин | Жёлтый |
| `offline` | lastSeen > 60 мин | Красный |
---
## Mock режим
Когда приложение работает в iOS Simulator, используется `MockBLEManager` с тестовыми данными:
```javascript
{
id: 'mock-743',
name: 'WP_497_81a14c',
mac: '142B2F81A14C',
rssi: -55,
wellId: 497,
}
```
Это позволяет разрабатывать без физического устройства.
---
## Implementation Steps
### Phase 1: API метод для обновления устройства
- [ ] Создать `updateDeviceMetadata()` в api.ts
- [ ] Тестировать через curl/Postman
### Phase 2: UI для редактирования в Device Settings
- [ ] Добавить TextInput для location
- [ ] Добавить TextInput для description
- [ ] Кнопка Save
- [ ] Loading state при сохранении
### Phase 3: Quick edit из Equipment Screen
- [ ] Добавить ActionSheet с опцией "Edit Location"
- [ ] Или inline edit по тапу
### Phase 4: Валидация и UX
- [ ] Показывать placeholder для пустого location
- [ ] Ограничить длину текста (если есть лимит API)
- [ ] Показывать success/error feedback
---
## Verification Checklist
- [ ] Сенсоры загружаются из Legacy API
- [ ] BLE сканирование находит WP_* устройства
- [ ] WiFi настройка работает через BLE
- [ ] Location/description сохраняется в Legacy API
- [ ] Location отображается в Equipment Screen
- [ ] Mock режим работает в симуляторе