9.8 KiB
Node-RED Node Configuration Reference
Quick reference for configuring nodes when implementing data persistence.
Modified Existing Nodes
1. Machine Cycles Function Node
Name: Machine cycles
Type: function
Outputs: 3 (changed from 2)
Code: See modified_machine_cycles.js
Wiring:
Output 1 → [Scrap prompt handler] (existing)
Output 2 → [Production state handler] (existing)
Output 3 → [Session State DB] (NEW - MySQL node)
2. Work Order Buttons Function Node
Name: Work Order buttons
Type: function
Outputs: 5 (changed from 4)
Code: See modified_work_order_buttons.js
Wiring:
Output 1 → [Upload handler] (existing)
Output 2 → [Select query handler] (existing)
Output 3 → [Start/scrap handler] (existing)
Output 4 → [Complete handler] (existing)
Output 5 → [Session State DB] (NEW - MySQL node)
New Recovery Flow Nodes
3. Startup Inject Node
Name: Startup Trigger
Type: inject
Payload: timestamp
Topic: (empty)
Repeat: none
Once after: 0.1 seconds
On start: checked ✓
Wiring:
Output → [Query Previous Session]
4. Query Previous Session Function
Name: Query Previous Session
Type: function
Outputs: 1
Code: See startup_recovery_query.js
Wiring:
Output → [Session State DB]
5. Process Recovery Response Function
Name: Process Recovery Response
Type: function
Outputs: 2
Code: See process_recovery_response.js
Wiring:
Output 1 → [Session State DB] (deactivate stale)
Output 2 → [Recovery Prompt UI]
6. Restore Session Function
Name: Restore Session
Type: function
Outputs: 2
Code: See restore_session.js
Triggered by: User clicking "Restore Session" button
Wiring:
Output 1 → [Session State DB] (update work order status)
Output 2 → [Success notification UI]
7. Start Fresh Function
Name: Start Fresh
Type: function
Outputs: 2
Code: See start_fresh.js
Triggered by: User clicking "Start Fresh" button
Wiring:
Output 1 → [Session State DB] (deactivate old session)
Output 2 → [Success notification UI]
8. Session State DB MySQL Node
Name: Session State DB
Type: mysql
Database: [Select your database config - same as work_orders]
This node receives inputs from:
- Machine cycles (output 3)
- Work Order buttons (output 5)
- Query Previous Session
- Process Recovery Response (output 1)
- Restore Session (output 1)
- Start Fresh (output 1)
UI Notification Nodes
Option A: Simple Toast Notifications
Node: notification
Type: ui_toast
Position: top right
Duration: 5 seconds
Highlight: (varies by message type)
Receives from:
- Process Recovery Response (output 2)
- Restore Session (output 2)
- Start Fresh (output 2)
Option B: Custom Dashboard Modal (Recommended)
Create a custom UI template for recovery prompts:
Node: Recovery Prompt Modal
Type: ui_template
Template HTML: (see below)
Receives from:
- Process Recovery Response (output 2)
Sends to:
- Restore Session (when "Restore" clicked)
- Start Fresh (when "Start Fresh" clicked)
Modal Template Example:
<div ng-show="msg.payload.type === 'recovery-prompt'"
style="position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%);
background: white; padding: 30px; border-radius: 8px;
box-shadow: 0 4px 6px rgba(0,0,0,0.1); z-index: 1000;">
<h2>{{msg.payload.title}}</h2>
<p>{{msg.payload.message}}</p>
<div style="margin: 20px 0;">
<p><strong>Work Order:</strong> {{msg.payload.details.workOrderId}}</p>
<p><strong>Cycles Completed:</strong> {{msg.payload.details.cyclesCompleted}}</p>
<p><strong>Operating Time:</strong> {{msg.payload.details.operatingTime}}</p>
<p><strong>Status:</strong> {{msg.payload.details.trackingWas}}</p>
<p><strong>Last Update:</strong> {{msg.payload.details.lastUpdate}}</p>
</div>
<button ng-click="send({action: 'restore-session', payload: msg.sessionData})"
style="padding: 10px 20px; margin-right: 10px; background: #4CAF50;
color: white; border: none; border-radius: 4px; cursor: pointer;">
Restore Session
</button>
<button ng-click="send({action: 'start-fresh', payload: msg.sessionData.session_id})"
style="padding: 10px 20px; background: #f44336; color: white;
border: none; border-radius: 4px; cursor: pointer;">
Start Fresh
</button>
</div>
<div ng-show="msg.payload.type === 'recovery-prompt'"
style="position: fixed; top: 0; left: 0; width: 100%; height: 100%;
background: rgba(0,0,0,0.5); z-index: 999;">
</div>
Route Modal Actions:
Node: Route Recovery Actions
Type: switch
Property: msg.action
Rules:
1. == "restore-session" → [Restore Session function]
2. == "start-fresh" → [Start Fresh function]
Complete Recovery Flow Diagram
┌─────────────────────┐
│ Startup Inject │
│ (0.1 sec delay) │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Query Previous │
│ Session (function) │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Session State DB │
│ (MySQL) │
└──────────┬──────────┘
│
▼
┌─────────────────────┐ ┌─────────────────────┐
│ Process Recovery ├─(1)─→│ Session State DB │
│ Response (function) │ │ (deactivate stale) │
└──────────┬──────────┘ └─────────────────────┘
│(2)
▼
┌─────────────────────┐
│ Recovery Prompt UI │
│ (Modal or Toast) │
└──────────┬──────────┘
│
┌──────┴──────┐
│ │
▼ ▼
┌────────┐ ┌────────┐
│Restore │ │ Start │
│Session │ │ Fresh │
└───┬─┬──┘ └──┬─┬───┘
│ │ │ │
(1) │ │(2) (1)│ │(2)
│ │ │ │
│ └────┬────┘ │
│ │ │
▼ ▼ ▼
┌──────────┐ ┌────────────┐
│Session │ │ Success UI │
│State DB │ │ │
└──────────┘ └────────────┘
Debug Nodes (Recommended)
Add debug nodes to monitor the flow:
Debug 1: Session Sync Monitor
Name: Debug Session Sync
Type: debug
Connected to: Session State DB output
Output: complete msg object
To: debug panel
Debug 2: Recovery Data Monitor
Name: Debug Recovery Data
Type: debug
Connected to: Process Recovery Response output 2
Output: msg.payload
To: debug panel
Debug 3: Restore Status Monitor
Name: Debug Restore Status
Type: debug
Connected to: Restore Session output 2
Output: msg.payload
To: debug panel
Testing Checklist
Test Node Outputs
-
Machine Cycles Output 3:
- Should fire every 5 seconds during production
- Should fire immediately on state changes
- Check msg._mode === "session-sync"
- Check msg.topic contains INSERT query
-
Work Order Buttons Output 5:
- Should fire on START button
- Should fire on STOP button
- Should fire on work order start
- Should fire on work order complete
- Check msg._mode === "session-sync" or "deactivate-session"
-
Recovery Flow:
- Inject should trigger 0.1 sec after deploy
- Query function should output SELECT statement
- Process function should detect sessions correctly
- Restore/Fresh functions should update database
Verify Database
-- Check if syncing is working
SELECT COUNT(*) FROM session_state;
-- Check latest update
SELECT * FROM session_state
ORDER BY updated_at DESC LIMIT 1;
-- Check sync frequency (should be ~5 seconds apart)
SELECT
session_id,
FROM_UNIXTIME(updated_at/1000) as update_time
FROM session_state
WHERE is_active = 1
ORDER BY updated_at DESC LIMIT 10;
Common Wiring Mistakes
❌ Wrong: Machine Cycles output 3 → existing handler ✅ Correct: Machine Cycles output 3 → NEW Session State DB node
❌ Wrong: Using separate MySQL nodes with different configs ✅ Correct: All session_state queries use SAME MySQL config
❌ Wrong: Recovery prompt wired directly to database ✅ Correct: Recovery prompt → User action → Function → Database
❌ Wrong: Inject node set to repeat ✅ Correct: Inject node fires ONCE on startup only
Performance Tips
- Reuse MySQL Node: Use same Session State DB node for all queries
- Throttle Writes: Don't modify the 5-second throttle (already optimized)
- Index Check: Ensure indexes are created (see SQL file)
- Connection Pool: Configure MySQL node with connection pooling
- Debug Cleanup: Remove debug nodes in production
Quick Rollback
If you need to revert changes:
-
Restore original function code from backups:
flows.json.backup_phase2- Or remove sync code and restore original output counts
-
Remove recovery flow nodes
-
Database table is harmless to leave (no overhead if not used)
Last Updated: 2025-11-21 Version: 1.0 Related Files:
- IMPLEMENTATION_GUIDE.md
- IMPLEMENTATION_SUMMARY.md
- optimization_prompt.txt