- Remove hardcoded database credentials from all scripts - Remove hardcoded Legacy API tokens from backend scripts - Remove hardcoded MQTT credentials from mqtt-test.js - Update backend/.env.example with DB_HOST, DB_USER, DB_PASSWORD, DB_NAME - Update backend/.env.example with LEGACY_API_TOKEN and MQTT credentials - Add dotenv config to all scripts requiring credentials - Create comprehensive documentation: - scripts/README.md - Root scripts usage - backend/scripts/README.md - Backend scripts documentation - MQTT_TESTING.md - MQTT testing guide - SECURITY_CREDENTIALS_CLEANUP.md - Security changes summary All scripts now read credentials from backend/.env instead of hardcoded values. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
16 KiB
WellNuo MQTT & Notifications Architecture
Overview
This document describes the notification system architecture for WellNuo app.
Key insight: There are TWO parallel notification systems:
- MQTT — Real sensor data from IoT devices → WellNuo Backend → Process & Notify
- eluxnetworks API — Direct notification sending via
send_walarmfunction
1. System Architecture
Two Notification Paths
PATH 1: MQTT (Real Sensor Data)
┌────────────────────┐ ┌──────────────────────────────────┐ ┌─────────────────────┐
│ IoT Sensors │ ──▶ │ MQTT Broker │ ──▶ │ WellNuo Backend │
│ (eluxnetworks) │ │ mqtt.eluxnetworks.net:1883 │ │ (subscribes) │
└────────────────────┘ └──────────────────────────────────┘ └──────────────────────┘
↓
┌─────────────────────┐
│ Process Alert │
│ → Find Users │
│ → Send Notifications│
└─────────────────────┘
PATH 2: eluxnetworks API (Direct Notification)
┌────────────────────┐ ┌──────────────────────────────────┐ ┌─────────────────────┐
│ API Call │ ──▶ │ https://eluxnetworks.net/ │ ──▶ │ eluxnetworks │
│ (send_walarm) │ │ function/well-api/api │ │ Backend │
└────────────────────┘ └──────────────────────────────────┘ └──────────────────────┘
↓
┌─────────────────────┐
│ Send via: │
│ MSG, EMAIL, │
│ SMS, PHONE │
└─────────────────────┘
Important: These are SEPARATE systems!
- MQTT sends data to WellNuo Backend which then processes and sends notifications
- send_walarm API sends notifications DIRECTLY through eluxnetworks infrastructure
send_walarmdoes NOT generate MQTT messages — it's a direct notification API
2. MQTT System (Path 1)
Connection Details
- Broker:
mqtt://mqtt.eluxnetworks.net:1883 - Username:
anandk - Password:
anandk_8
Topic Format
/well_{deployment_id}
Example: /well_21, /well_29, /well_38
Message Format
{
"Command": "REPORT",
"body": "alert text describing what happened",
"time": 1706000000
}
Command Types
| Command | Description |
|---|---|
REPORT |
Sensor alert - needs processing |
CREDS |
Device credentials - ignore |
MQTT → WellNuo Backend Flow
1. Sensor sends MQTT message
↓
2. WellNuo Backend receives message (mqtt.js)
↓
3. Save to `mqtt_alerts` table
↓
4. Classify alert type (EMERGENCY vs ACTIVITY)
↓
5. Find users with access to this deployment
↓
6. Check user notification settings
↓
7. Send notifications (Push, Email, SMS, Phone)
↓
8. Log to `notification_history` table
3. eluxnetworks API (Path 2)
API Endpoint
POST https://eluxnetworks.net/function/well-api/api
Authentication
Step 1: Get Token
curl -X POST "https://eluxnetworks.net/function/well-api/api" \
--data-urlencode "function=credentials" \
--data-urlencode "user_name=robster" \
--data-urlencode "ps=rob2" \
--data-urlencode "clientId=001" \
--data-urlencode "nonce=111"
# Response: {"token": "eyJhbGc...", "ok": 1, "status": "200 OK"}
Step 2: Use Token for API calls
Available Functions
| Function | Description |
|---|---|
credentials |
Login, get JWT token |
send_walarm |
Send notification via specific channel |
store_alarms |
Update device alarm configuration |
alarm_on_off |
Enable/disable alarms |
get_alarm_state |
Get current alarm state |
send_walarm Parameters
| Parameter | Required | Description |
|---|---|---|
function |
✅ | Always send_walarm |
token |
✅ | JWT token from credentials |
user_name |
✅ | Username (robster) |
deployment_id |
✅ | Target deployment (e.g., 21) |
method |
✅ | MSG, EMAIL, SMS, or PHONE |
content |
✅ | Alert message text |
location |
❌ | Room/area name |
feature |
❌ | Alert type (stuck, absent, temperature, etc.) |
test_only |
❌ | true = dry run, false = send real |
action |
❌ | send_to_me or send_to_all |
✅ API Testing Results (2026-01-27)
All notification methods tested and WORKING:
TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
# MSG (Push notification) ✅ WORKS
curl -X POST "https://eluxnetworks.net/function/well-api/api" \
--data-urlencode "function=send_walarm" \
--data-urlencode "token=$TOKEN" \
--data-urlencode "user_name=robster" \
--data-urlencode "deployment_id=21" \
--data-urlencode "method=MSG" \
--data-urlencode "content=Test push notification" \
--data-urlencode "test_only=false" \
--data-urlencode "action=send_to_me"
# Response: {"ok": 1, "status": "200 OK"}
# EMAIL ✅ WORKS
# Same request with method=EMAIL
# SMS ✅ WORKS
# Same request with method=SMS
# PHONE ✅ WORKS
# Same request with method=PHONE
Important: These notifications go through eluxnetworks infrastructure, NOT through WellNuo backend!
4. Alert Types (from devices table)
The legacy system defines these alert types in devices.alert_details:
Alert Categories
| # | Type | Description | Warning → Alarm Flow |
|---|---|---|---|
| 0 | STUCK | Person not moving for too long | Warning (7h) → Alarm (10h) |
| 1 | ABSENT | Person not detected | Warning (20min) → Alarm |
| 2 | TEMP_HIGH | High temperature | Warning (80°F) → Alarm (90°F) |
| 3 | TEMP_LOW | Low temperature | Warning (60°F) → Alarm (50°F) |
| 4 | RADAR | Movement detected | Immediate |
| 5 | PRESSURE | Pressure sensor (bed?) | Threshold-based |
| 6 | LIGHT | Light sensor | Threshold-based |
| 7 | SMELL | Smell/gas detection | Immediate |
Example device_alarms configuration:
{
"enabled_alarms": "000110101010",
"stuck_minutes_warning": 420,
"stuck_warning_method_0": "SMS",
"stuck_minutes_alarm": 600,
"stuck_alarm_method_1": "PHONE",
"absent_minutes_warning": 20,
"absent_warning_method_2": "SMS",
"absent_minutes_alarm": 30,
"absent_alarm_method_3": "PHONE",
"temperature_high_warning": "80",
"temperature_high_warning_method_4": "SMS",
"temperature_high_alarm": "90",
"temperature_high_alarm_method_5": "PHONE",
"temperature_low_warning": "60",
"temperature_low_warning_method_6": "SMS",
"temperature_low_alarm": "50",
"temperature_low_alarm_method_7": "PHONE",
"radar_alarm_method_8": "MSG",
"pressure_threshold": "15.0",
"pressure_alarm_method_9": "MSG",
"light_threshold": "150.0",
"light_alarm_method_10": "MSG",
"smell_alarm_method_11": "EMAIL",
"rearm_policy": "1H",
"filter": "6"
}
5. Notification Channels
Available Methods
| Method | Description | eluxnetworks API | WellNuo Backend |
|---|---|---|---|
MSG |
Push notification | ✅ Works | ✅ Implemented (Expo Push) |
EMAIL |
Email notification | ✅ Works | ⚠️ SMTP configured, not connected |
SMS |
Text message | ✅ Works | ❌ Need Twilio |
PHONE |
Voice call | ✅ Works | ❌ Need Twilio/LiveKit |
Key Difference
- eluxnetworks API (
send_walarm) — all 4 channels work NOW - WellNuo Backend — only Push works, others need implementation
6. User Roles
From user_access table:
| Role | Permissions | Notifications |
|---|---|---|
| Custodian | Full rights, owner, can delete | ✅ Receives all |
| Guardian | High rights, can manage & invite | ✅ Receives all |
| Caretaker | View only | ✅ Receives all |
All roles receive notifications!
7. WellNuo Classification Logic
Simplified for WellNuo App
| Classification | Alert Types | Behavior |
|---|---|---|
| EMERGENCY | fall, sos, emergency, stuck_alarm, absent_alarm | ALL channels, ALL users, ignore settings |
| ACTIVITY | Everything else | Per user settings, respect quiet hours |
Body text → Classification mapping
const bodyLower = alert.body.toLowerCase();
if (bodyLower.includes('emergency') ||
bodyLower.includes('fall') ||
bodyLower.includes('sos') ||
bodyLower.includes('stuck') ||
bodyLower.includes('absent')) {
return 'EMERGENCY';
}
return 'ACTIVITY';
8. Notification Settings
Current: Global per user
Table: notification_settings
push_enabledemail_enabledsms_enabledquiet_hours_enabledquiet_hours_startquiet_hours_end
Needed: Per user + per beneficiary
New table: user_beneficiary_notification_prefs
| Column | Type | Default | Description |
|---|---|---|---|
| user_id | UUID | - | User reference |
| beneficiary_id | UUID | - | Beneficiary reference |
| push_enabled | boolean | true | Push notifications |
| email_enabled | boolean | true | Email notifications |
| sms_enabled | boolean | true | SMS notifications |
| call_enabled | boolean | false | Phone calls (only emergency) |
| quiet_hours_enabled | boolean | false | Enable quiet hours |
| quiet_hours_start | time | 22:00 | Quiet period start |
| quiet_hours_end | time | 07:00 | Quiet period end |
Created automatically when user gets access to beneficiary.
9. Notification Flows
EMERGENCY Flow
Alert received (fall, sos, stuck, absent)
↓
Find ALL users with access to beneficiary
↓
For EACH user (ignore settings!):
├── Send Push immediately
├── Send Email immediately
├── Send SMS immediately
└── Make Phone Call immediately
↓
Log all results to notification_history
ACTIVITY Flow
Alert received (other types)
↓
Find ALL users with access to beneficiary
↓
For EACH user:
├── Check quiet_hours → if active, SKIP (except emergency)
├── Check push_enabled → if ON, send Push
├── Check email_enabled → if ON, send Email
└── Check sms_enabled → if ON, send SMS
↓
Log all results to notification_history
10. Testing
Test MQTT (Sensor Simulation)
cd ~/Desktop/WellNuo
# Monitor deployment 21 (Ferdinand)
node mqtt-test.js
# Monitor specific deployment
node mqtt-test.js 42
# Send test alert (simulates sensor)
node mqtt-test.js send "Test emergency alert"
node mqtt-test.js send "fall detected"
Test eluxnetworks API (Direct Notification)
Step 1: Get token
curl -s -X POST "https://eluxnetworks.net/function/well-api/api" \
--data-urlencode "function=credentials" \
--data-urlencode "user_name=robster" \
--data-urlencode "ps=rob2" \
--data-urlencode "clientId=001" \
--data-urlencode "nonce=111" | jq -r '.token'
Step 2: Send notification
TOKEN="your_token_here"
curl -X POST "https://eluxnetworks.net/function/well-api/api" \
--data-urlencode "function=send_walarm" \
--data-urlencode "token=$TOKEN" \
--data-urlencode "user_name=robster" \
--data-urlencode "deployment_id=21" \
--data-urlencode "method=MSG" \
--data-urlencode "content=Test alert" \
--data-urlencode "test_only=false" \
--data-urlencode "action=send_to_me"
Postman Collection
File: /api/Wellnuo_API.postman_collection.json
Pre-configured requests:
credentials- Loginsend_walarm- Send alertalarm_on_off- Enable/disable alarmsget_alarm_state- Get current statestore_alarms- Update configuration
11. Database Tables
WellNuo Backend Tables
| Table | Purpose |
|---|---|
users |
User accounts |
beneficiaries |
People being monitored |
user_access |
Who has access to whom (roles) |
beneficiary_deployments |
Links beneficiary to deployment_id |
notification_settings |
User notification preferences |
push_tokens |
Device push tokens |
notification_history |
Log of sent notifications |
mqtt_alerts |
Raw MQTT messages received |
Legacy Tables (eluxnetworks)
| Table | Purpose |
|---|---|
deployments |
Deployment configurations |
deployment_details |
Deployment metadata |
devices |
IoT devices with alert_details |
12. Known Issues
Issue 1: Users without push tokens excluded
Location: backend/src/services/mqtt.js:201
-- Current query excludes users without push tokens entirely
WHERE bd.legacy_deployment_id = $1
AND pt.token IS NOT NULL -- ❌ Problem: users without tokens don't get other channels
Fix needed: Remove this filter, send via other channels even if no push token.
Issue 2: Email not connected to alert flow
Email service exists (backend/src/services/email.js) but is not called from MQTT alert processing.
Issue 3: SMS and Phone not implemented
Need Twilio integration for SMS and Phone calls in WellNuo backend.
13. Implementation TODO
Phase 1: Fix current MQTT system
- Remove push token filter from user query
- Connect Email service to MQTT alert flow
- Create proper alert email template
- Test Push notifications end-to-end
Phase 2: Add missing channels to WellNuo backend
- Integrate Twilio for SMS
- Integrate Twilio Voice (or LiveKit) for calls
- Add In-App UI notifications (WebSocket/polling)
Phase 3: Per-beneficiary settings
- Create
user_beneficiary_notification_prefstable - Auto-create settings when user gets access
- Update notification service to check per-beneficiary settings
- Add settings UI in app
Phase 4: Advanced features
- Quiet hours per beneficiary
- Escalation logic (if no response → next channel)
- Daily/weekly digest emails
14. Schema Diagram
Interactive diagram: https://diagrams.love/canvas?schema=cmkwvuljj0005llchm69ln8no
15. Credentials Reference
MQTT Broker
- Host:
mqtt.eluxnetworks.net - Port:
1883 - Username:
anandk - Password:
anandk_8
eluxnetworks API
- URL:
https://eluxnetworks.net/function/well-api/api - Username:
robster - Password:
rob2
WellNuo Database
- Host:
eluxnetworks.net - Port:
5432 - Database:
wellnuo_app - User:
sergei - Password:
W31153Rg31
References
- MQTT Service:
backend/src/services/mqtt.js - Notification Service:
backend/src/services/notifications.js - Email Service:
backend/src/services/email.js - Postman Collection:
api/Wellnuo_API.postman_collection.json - Legacy alarms UI: https://eluxnetworks.net/shared/alarms.html