WellNuo/docs/LEGACY_API_DEVICES.md
Sergei ff35690e46 Add Legacy API documentation for device & deployment management
Documents available API endpoints and their limitations:
- set_deployment: Creates deployment (WORKS, returns deployment_id)
- device_form: Attaches device to deployment (WORKS)
- request_devices: Gets devices list (BROKEN - KeyError in Legacy API)

Includes room location codes, SQL queries for WellNuo DB access,
and complete flow examples for beneficiary setup.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-01 14:21:26 -08:00

384 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Legacy API — Device & Deployment Management
## Overview
WellNuo использует **Legacy API** (`eluxnetworks.net`) для управления IoT устройствами и деплойментами.
**Архитектура баз данных:**
- **Legacy DB** (eluxnetworks.net, внутренняя) — хранит deployments, users, devices созданные через API
- **WellNuo DB** (`wellnuo_app` на eluxnetworks.net:5432) — хранит связи WellNuo beneficiaries с Legacy deployments
---
## Authentication
### Login (Get Token)
```bash
curl -s -X POST https://eluxnetworks.net/function/well-api/api \
-d "function=credentials" \
-d "user_name=robster" \
-d "ps=rob2" \
-d "clientId=001" \
-d "nonce=$(date +%s)"
```
**Response:**
```json
{
"ok": 1,
"token": "eyJhbGciOiJIUzI1NiIs...",
"user_name": "robster",
"expiry": 1766257742
}
```
**Token validity:** 7 days
---
## Deployments
### Create Deployment (set_deployment) ✅ РАБОТАЕТ
Создаёт deployment и пользователя-бенефициара в Legacy системе.
```bash
TOKEN="your-jwt-token"
TIMESTAMP=$(date +%s)
curl -s -X POST https://eluxnetworks.net/function/well-api/api \
-d "function=set_deployment" \
-d "user_name=robster" \
-d "token=$TOKEN" \
-d "deployment=NEW" \
-d "beneficiary_name=Test User" \
-d "beneficiary_email=test${TIMESTAMP}@example.com" \
-d "beneficiary_user_name=testuser${TIMESTAMP}" \
-d "beneficiary_password=securepass123" \
-d "beneficiary_address=123 Main St" \
-d "beneficiary_photo=/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAABAAEDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAn/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAX/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCwAB//2Q==" \
-d "firstName=Test" \
-d "lastName=User" \
-d "first_name=Test" \
-d "last_name=User" \
-d "new_user_name=testuser${TIMESTAMP}" \
-d "phone_number=+10000000000" \
-d "key=securepass123" \
-d "signature=Test" \
-d "gps_age=0" \
-d "wifis=[]" \
-d "devices=[]"
```
**Response:**
```json
{
"ok": 1,
"deployment_id": 120,
"beneficiary_user_id": 273,
"status": "200 OK"
}
```
**Важные параметры:**
| Параметр | Обязательный | Описание |
|----------|--------------|----------|
| `beneficiary_photo` | ✅ Да | Base64 JPEG (даже минимальный 1x1 pixel) |
| `beneficiary_user_name` | ✅ Да | Уникальный username |
| `beneficiary_email` | ✅ Да | Уникальный email |
| `key` | ✅ Да | Пароль бенефициара |
| `signature` | ✅ Да | Подпись (любое значение) |
---
## Devices
### Room Location Codes
| Room | Code |
|------|------|
| Bedroom | 102 |
| Living Room | 103 |
| Kitchen | 104 |
| Bathroom | 105 |
| Hallway | 106 |
| Office | 107 |
| Garage | 108 |
| Dining Room | 109 |
| Basement | 110 |
| Other | 200 |
### Attach Device to Deployment (device_form)
```bash
TOKEN="your-jwt-token"
curl -s -X POST https://eluxnetworks.net/function/well-api/api \
-d "function=device_form" \
-d "user_name=robster" \
-d "token=$TOKEN" \
-d "well_id=523" \
-d "mac=142B2F81AAD4" \
-d "location=102" \
-d "description=Bedroom" \
-d "group_id=120"
```
**Response:**
```json
{"ok": 1}
```
### Set Device Well ID (device_set_well_id)
Привязка устройства к деплойменту:
```bash
TOKEN="your-jwt-token"
curl -s -X POST https://eluxnetworks.net/function/well-api/api \
-d "function=device_set_well_id" \
-d "user_name=robster" \
-d "token=$TOKEN" \
-d "well_id=523" \
-d "new_group_id=120"
```
### Get Deployment Devices (request_devices)
```bash
TOKEN="your-jwt-token"
curl -s -X POST https://eluxnetworks.net/function/well-api/api \
-d "function=request_devices" \
-d "user_name=robster" \
-d "token=$TOKEN" \
-d "deployment_id=120"
```
> **Примечание:** Может требовать внутреннюю инициализацию. Если не работает — используйте SQL.
---
## WellNuo Database Access
Для работы с WellNuo данными (связи beneficiary ↔ deployment) используйте PostgreSQL напрямую.
### Connection
```bash
PGCONNECT_TIMEOUT=15 PGPASSWORD='W31153Rg31' psql \
-h eluxnetworks.net -p 5432 -U sergei -d wellnuo_app
```
### Link Beneficiary to Legacy Deployment
```sql
-- Привязать WellNuo beneficiary к Legacy deployment
INSERT INTO beneficiary_deployments (beneficiary_id, legacy_deployment_id)
VALUES (71, 120)
ON CONFLICT (beneficiary_id)
DO UPDATE SET legacy_deployment_id = 120;
```
### Get Devices for Deployment
```sql
SELECT
id AS well_id,
mac,
description AS room_name,
location AS room_code,
group_id AS deployment_id,
online,
last_data_at
FROM devices
WHERE group_id = 120
ORDER BY id;
```
### Check Device Online Status
```sql
SELECT
id AS well_id,
description AS room,
online,
last_data_at,
CASE
WHEN online = true AND last_data_at > NOW() - INTERVAL '5 minutes' THEN 'Online'
WHEN last_data_at > NOW() - INTERVAL '1 hour' THEN 'Recent'
ELSE 'Offline'
END AS status
FROM devices
WHERE group_id = 120;
```
### Change Room Assignment
```sql
UPDATE devices
SET
location = 103, -- Living Room
description = 'Living Room'
WHERE id = 523;
```
---
## Complete Flow: Create Beneficiary with Device
### 1. Get Legacy Token
```bash
TOKEN=$(curl -s -X POST https://eluxnetworks.net/function/well-api/api \
-d "function=credentials&user_name=robster&ps=rob2&clientId=001&nonce=$(date +%s)" \
| jq -r '.token')
```
### 2. Create Legacy Deployment
```bash
TIMESTAMP=$(date +%s)
RESPONSE=$(curl -s -X POST https://eluxnetworks.net/function/well-api/api \
-d "function=set_deployment" \
-d "user_name=robster" \
-d "token=$TOKEN" \
-d "deployment=NEW" \
-d "beneficiary_name=John Doe" \
-d "beneficiary_email=john${TIMESTAMP}@example.com" \
-d "beneficiary_user_name=johndoe${TIMESTAMP}" \
-d "beneficiary_password=pass123" \
-d "beneficiary_address=123 Main St" \
-d "beneficiary_photo=/9j/4AAQSkZJRgABAQEASABIAAD..." \
-d "firstName=John" \
-d "lastName=Doe" \
-d "first_name=John" \
-d "last_name=Doe" \
-d "new_user_name=johndoe${TIMESTAMP}" \
-d "phone_number=+15551234567" \
-d "key=pass123" \
-d "signature=wellnuo" \
-d "gps_age=0" \
-d "wifis=[]" \
-d "devices=[]")
DEPLOYMENT_ID=$(echo $RESPONSE | jq -r '.deployment_id')
echo "Created deployment: $DEPLOYMENT_ID"
```
### 3. Attach Device to Deployment
```bash
curl -s -X POST https://eluxnetworks.net/function/well-api/api \
-d "function=device_form" \
-d "user_name=robster" \
-d "token=$TOKEN" \
-d "well_id=523" \
-d "mac=142B2F81AAD4" \
-d "location=102" \
-d "description=Bedroom" \
-d "group_id=$DEPLOYMENT_ID"
```
### 4. Link to WellNuo Beneficiary
```bash
PGPASSWORD='W31153Rg31' psql -h eluxnetworks.net -p 5432 -U sergei -d wellnuo_app -c "
INSERT INTO beneficiary_deployments (beneficiary_id, legacy_deployment_id)
VALUES (71, $DEPLOYMENT_ID)
ON CONFLICT (beneficiary_id) DO UPDATE SET legacy_deployment_id = $DEPLOYMENT_ID;
"
```
---
## WellNuo Backend Integration
Код в `/var/www/wellnuo-api/src/legacyAPI.js`:
```javascript
// Room location mapping
const ROOM_LOCATIONS = {
'Bedroom': 102,
'Living Room': 103,
'Kitchen': 104,
'Bathroom': 105,
'Hallway': 106,
'Office': 107,
'Garage': 108,
'Dining Room': 109,
'Basement': 110,
'Other': 200
};
// Create deployment via Legacy API
async function createLegacyDeployment(params) {
const formData = new URLSearchParams({
function: 'set_deployment',
user_name: params.username,
token: params.token,
deployment: 'NEW',
beneficiary_name: params.beneficiaryName,
beneficiary_email: params.beneficiaryEmail,
beneficiary_user_name: params.beneficiaryUsername,
beneficiary_password: params.beneficiaryPassword,
beneficiary_photo: params.beneficiaryPhoto || MINIMAL_JPEG,
// ... other params
});
const response = await fetch(LEGACY_API_URL, {
method: 'POST',
body: formData
});
const data = await response.json();
return data.deployment_id; // Returns actual deployment ID (e.g., 120)
}
```
---
## Quick Reference
| Task | Method | Endpoint/Query |
|------|--------|----------------|
| Login | API | `function=credentials` |
| Create deployment | API | `function=set_deployment` |
| Attach device | API | `function=device_form` |
| Change device group | API | `function=device_set_well_id` |
| Get devices | SQL | `SELECT * FROM devices WHERE group_id = ?` |
| Change room | SQL | `UPDATE devices SET location = ?` |
| Check online status | SQL | `SELECT online, last_data_at FROM devices` |
| Link WellNuo beneficiary | SQL | `INSERT INTO beneficiary_deployments...` |
---
## Database Tables
### devices (Legacy DB, accessible via SQL)
```
id (well_id), mac, description (room), location (room_code),
group_id (deployment_id), online, last_data_at, firmware
```
### beneficiary_deployments (WellNuo DB)
```
beneficiary_id, legacy_deployment_id
```
---
## Troubleshooting
### `deployment_id: 0` в ответе
- Убедитесь что передаёте `beneficiary_photo` с валидным base64 JPEG
- Все обязательные поля должны быть заполнены
### `request_devices` возвращает ошибку
- Используйте SQL запрос к таблице `devices` как альтернативу
### Device не обновляется через API
- Используйте SQL UPDATE для существующих устройств