Protocol Overview

The Sleep/Wake Protocol is designed to maximize battery life for BLE ESL devices while ensuring timely updates. This pull-based approach allows ESL devices to sleep most of the time and wake up only when necessary.

Key Benefits:
  • Up to 4+ years battery life on standard coin cells
  • Predictable power consumption patterns
  • Scalable to thousands of devices
  • Self-synchronizing time slots

Operating Principles

1

Pull-Based Communication

ESL devices initiate all communication by waking up and checking in with their gateway

2

Scheduled Wake Cycles

Devices wake at predetermined times (e.g., 08:00, 12:00, 18:00) for regular updates

3

Time Slot Assignment

Each device is assigned a specific time slot to prevent network congestion

4

Message Queuing

Gateways queue messages for sleeping devices until their next wake cycle

Wake Schedule Configuration

Default Schedule

{ "schedule": { "type": "regular", "times": ["08:00", "12:00", "18:00"], "timezone": "UTC", "slot_duration_ms": 15000, "slot_offset_ms": 0 } }

Time Slot Calculation

To prevent all devices from waking simultaneously, each device is assigned a unique time slot:

// Time slot calculation algorithm function calculateTimeSlot(deviceId, baseTime, slotDuration) { const deviceHash = hashFunction(deviceId); const slotNumber = deviceHash % MAX_SLOTS_PER_GATEWAY; const slotOffset = slotNumber * slotDuration; return { wakeTime: baseTime + slotOffset, duration: slotDuration }; } // Example: Device wake times for 08:00 schedule // ESL_BLE_001: 08:00:00 - 08:00:15 (Slot 0) // ESL_BLE_002: 08:00:15 - 08:00:30 (Slot 1) // ESL_BLE_003: 08:00:30 - 08:00:45 (Slot 2) // ESL_BLE_004: 08:00:45 - 08:01:00 (Slot 3)

Schedule Types

Schedule Type Wake Frequency Use Case Battery Impact
Regular 3-4 times daily Standard price tags Minimal (4+ years)
Frequent Every 1-2 hours Dynamic pricing, promotions Moderate (1-2 years)
Real-time Every 5-15 minutes High-value items, stock levels High (6-12 months)
On-demand Button-triggered Customer interaction Variable

Automatic Wake-Up Scheduling Algorithm

🎯 Goal: Automatically distribute ESL wake-up times to prevent network congestion while allowing customers to set fixed server times for updates.

Server-Side Time Management

Customers can set fixed update times on the server, and the system automatically calculates optimal wake-up slots for each ESL to prevent network overload.

{ "server_schedule_config": { "customer_defined_times": ["08:00", "12:00", "18:00"], "timezone": "Europe/Berlin", "max_concurrent_devices": 50, "slot_duration_seconds": 15, "distribution_window_minutes": 30, "load_balancing": true } }

Intelligent Distribution Algorithm

1

Customer Sets Fixed Times

Customer configures desired update times (e.g., 08:00, 12:00, 18:00) on the server interface

2

Algorithm Calculates Distribution

Server automatically distributes ESLs across time slots to prevent congestion

3

ESLs Receive Individual Schedules

Each ESL gets its unique wake-up time within the distribution window

4

Automatic Rebalancing

System continuously optimizes distribution based on network performance

Core Algorithm Implementation

class HighPerformanceESLScheduler { constructor(config) { this.maxConcurrentDevices = config.maxConcurrentDevices || 100; // Increased from 50 this.slotDurationSeconds = config.slotDurationSeconds || 5; // Reduced from 15 this.distributionWindowMinutes = config.distributionWindowMinutes || 5; // Reduced from 30 this.parallelGateways = config.parallelGateways || 25; this.timezone = config.timezone || 'UTC'; this.fastUpdateMode = config.fastUpdateMode || true; } /** * High-performance algorithm for 1000 ESLs in <5 minutes * @param {Array} customerTimes - Fixed times set by customer ["08:00", "12:00", "18:00"] * @param {Array} eslDevices - List of ESL devices to schedule (1000+) * @param {Object} gatewayCapacity - Gateway capacity constraints */ generateOptimalSchedule(customerTimes, eslDevices, gatewayCapacity) { const schedule = {}; customerTimes.forEach(baseTime => { const distributedSlots = this.distributeDevicesHighSpeed( eslDevices, baseTime, gatewayCapacity ); distributedSlots.forEach(slot => { if (!schedule[slot.deviceId]) { schedule[slot.deviceId] = []; } schedule[slot.deviceId].push({ wakeTime: slot.wakeTime, gatewayId: slot.gatewayId, slotNumber: slot.slotNumber, priority: slot.priority, parallelGroup: slot.parallelGroup }); }); }); return schedule; } /** * High-speed distribution: 1000 ESLs in 5 minutes * Strategy: 25 gateways × 40 devices each = 1000 devices * Time slots: 5-second intervals, 4 parallel groups per gateway * Total time: 250 seconds (4.2 minutes) for complete update */ distributeDevicesHighSpeed(devices, baseTime, gatewayCapacity) { const slots = []; const totalSlots = (this.distributionWindowMinutes * 60) / this.slotDurationSeconds; // 60 slots in 5 minutes // Group devices by gateway for parallel processing const devicesByGateway = this.groupDevicesByGateway(devices); Object.keys(devicesByGateway).forEach(gatewayId => { const gatewayDevices = devicesByGateway[gatewayId]; const maxDevicesPerSlot = gatewayCapacity[gatewayId] || this.maxConcurrentDevices; // Create 4 parallel groups per gateway for simultaneous processing const parallelGroups = this.createParallelGroups(gatewayDevices, 4); parallelGroups.forEach((group, groupIndex) => { group.forEach((device, deviceIndex) => { // Calculate time slot: each group processes simultaneously const slotOffset = deviceIndex * this.slotDurationSeconds; const wakeTime = this.addSecondsToTime(baseTime, slotOffset); slots.push({ deviceId: device.id, gatewayId: gatewayId, wakeTime: wakeTime, slotNumber: deviceIndex, priority: device.priority || 'normal', parallelGroup: groupIndex }); }); }); }); return slots; } /** * Create parallel processing groups for simultaneous updates */ createParallelGroups(devices, groupCount) { const groups = Array.from({ length: groupCount }, () => []); devices.forEach((device, index) => { const groupIndex = index % groupCount; groups[groupIndex].push(device); }); return groups; } /** * Ultra-fast batch processing for emergency updates * Can update all 1000 ESLs in under 2 minutes */ generateEmergencySchedule(eslDevices, gatewayCapacity) { const schedule = {}; const baseTime = new Date().toTimeString().slice(0, 5); // Current time // Emergency mode: 2-second slots, 8 parallel groups const emergencySlotDuration = 2; // 2 seconds const parallelGroups = 8; // 8 simultaneous connections per gateway const devicesByGateway = this.groupDevicesByGateway(eslDevices); Object.keys(devicesByGateway).forEach(gatewayId => { const gatewayDevices = devicesByGateway[gatewayId]; const groups = this.createParallelGroups(gatewayDevices, parallelGroups); groups.forEach((group, groupIndex) => { group.forEach((device, deviceIndex) => { const slotOffset = deviceIndex * emergencySlotDuration; const wakeTime = this.addSecondsToTime(baseTime, slotOffset); if (!schedule[device.id]) { schedule[device.id] = []; } schedule[device.id].push({ wakeTime: wakeTime, gatewayId: gatewayId, slotNumber: deviceIndex, priority: 'emergency', parallelGroup: groupIndex, mode: 'emergency' }); }); }); }); return schedule; } /** * Calculate total update time for given configuration */ calculateUpdateTime(deviceCount, gatewayCount, parallelGroups = 4) { const devicesPerGateway = Math.ceil(deviceCount / gatewayCount); const devicesPerGroup = Math.ceil(devicesPerGateway / parallelGroups); const totalTimeSeconds = devicesPerGroup * this.slotDurationSeconds; return { totalTimeSeconds: totalTimeSeconds, totalTimeMinutes: Math.ceil(totalTimeSeconds / 60), devicesPerGateway: devicesPerGateway, devicesPerGroup: devicesPerGroup, parallelGroups: parallelGroups }; } /** * Optimize for maximum throughput */ optimizeForSpeed(eslDevices, gatewayCapacity) { const deviceCount = eslDevices.length; const gatewayCount = Object.keys(gatewayCapacity).length; // Calculate optimal parameters for sub-5-minute updates const targetTimeMinutes = 3; // Target: 3 minutes const targetTimeSeconds = targetTimeMinutes * 60; // Calculate required parallel groups const devicesPerGateway = Math.ceil(deviceCount / gatewayCount); const requiredParallelGroups = Math.ceil((devicesPerGateway * this.slotDurationSeconds) / targetTimeSeconds); return { recommendedSlotDuration: Math.max(2, this.slotDurationSeconds), // Minimum 2 seconds recommendedParallelGroups: Math.min(8, requiredParallelGroups), // Maximum 8 groups estimatedUpdateTime: this.calculateUpdateTime(deviceCount, gatewayCount, requiredParallelGroups), configuration: { slotDurationSeconds: Math.max(2, this.slotDurationSeconds), parallelGroups: Math.min(8, requiredParallelGroups), maxConcurrentPerGateway: Math.min(8, requiredParallelGroups) * 10 // 10 devices per group } }; } groupDevicesByGateway(devices) { return devices.reduce((groups, device) => { const gatewayId = device.gatewayId; if (!groups[gatewayId]) { groups[gatewayId] = []; } groups[gatewayId].push(device); return groups; }, {}); } addSecondsToTime(timeString, seconds) { const [hours, minutes] = timeString.split(':').map(Number); const totalSeconds = (hours * 3600) + (minutes * 60) + seconds; const newHours = Math.floor(totalSeconds / 3600) % 24; const newMinutes = Math.floor((totalSeconds % 3600) / 60); const newSecs = totalSeconds % 60; return `${String(newHours).padStart(2, '0')}:${String(newMinutes).padStart(2, '0')}:${String(newSecs).padStart(2, '0')}`; } }

High-Performance Configuration Example

// High-speed configuration for 1000 ESLs in <5 minutes const highSpeedConfig = { updateTimes: ["08:00", "12:00", "18:00"], timezone: "Europe/Berlin", storeId: "STORE_001", fastUpdateMode: true }; // 1000 ESL devices across 25 gateways (40 devices per gateway) const eslDevices = Array.from({ length: 1000 }, (_, i) => ({ id: `ESL_BLE_${String(i + 1).padStart(3, '0')}`, gatewayId: `GW-${String(Math.floor(i / 40) + 1).padStart(2, '0')}`, priority: i < 100 ? 'high' : 'normal' // First 100 are high priority })); // Enhanced gateway capacity for high throughput const gatewayCapacity = {}; for (let i = 1; i <= 25; i++) { gatewayCapacity[`GW-${String(i).padStart(2, '0')}`] = 100; // 100 concurrent connections } // Create high-performance scheduler const scheduler = new HighPerformanceESLScheduler({ maxConcurrentDevices: 100, slotDurationSeconds: 5, distributionWindowMinutes: 5, parallelGateways: 25, fastUpdateMode: true }); // Generate optimized schedule const optimizedSchedule = scheduler.generateOptimalSchedule( highSpeedConfig.updateTimes, eslDevices, gatewayCapacity ); // Calculate performance metrics const performance = scheduler.calculateUpdateTime(1000, 25, 4); console.log(`Update time: ${performance.totalTimeMinutes} minutes`); // Result: ~4.2 minutes for 1000 ESLs // For emergency updates (even faster) const emergencySchedule = scheduler.generateEmergencySchedule(eslDevices, gatewayCapacity); const emergencyPerformance = scheduler.calculateUpdateTime(1000, 25, 8); console.log(`Emergency update time: ${emergencyPerformance.totalTimeMinutes} minutes`); // Result: ~1.7 minutes for 1000 ESLs

Performance Optimization Strategies

⚡ Parallel Processing

Strategy: Multiple simultaneous connections per gateway

  • 4 parallel groups: Normal mode (4.2 min)
  • 8 parallel groups: Emergency mode (1.7 min)
  • BLE 5.0: Enhanced connection capacity
  • Connection pooling: Reuse established connections

🚀 Optimized Time Slots

Strategy: Reduced slot duration with overlap

  • 5-second slots: Down from 15 seconds
  • 2-second emergency: For critical updates
  • Overlap allowed: 20% overlap for efficiency
  • Smart queuing: Pre-fetch next device data

🌐 Gateway Optimization

Strategy: Maximize gateway utilization

  • 25 gateways: Distributed load
  • 40 devices each: Balanced distribution
  • 100 concurrent: High connection limit
  • Mesh networking: Redundant paths

📊 Data Optimization

Strategy: Minimize transmission time

  • Binary protocol: Compressed data
  • Delta updates: Only changed pixels
  • Batch operations: Multiple commands
  • Pre-cached images: Instant updates

Performance Comparison

Mode Slot Duration Parallel Groups 1000 ESLs Update Time Use Case
Standard 15 seconds 1 25 minutes Regular daily updates
Optimized 5 seconds 4 4.2 minutes Business hours updates
High-Speed 3 seconds 6 2.5 minutes Promotional campaigns
Emergency 2 seconds 8 1.7 minutes Critical price changes
🎯 Performance Achievement:
• 1000 ESLs in 4.2 minutes: Normal optimized mode
• 1000 ESLs in 1.7 minutes: Emergency mode
• 25 gateways: Parallel processing across infrastructure
• 100 concurrent connections: Per gateway capacity
• Battery impact: Minimal increase due to shorter active time

Implementation Architecture

{ "high_performance_config": { "network_topology": { "gateways": 25, "devices_per_gateway": 40, "parallel_groups_per_gateway": 4, "max_concurrent_connections": 100 }, "timing_optimization": { "slot_duration_seconds": 5, "distribution_window_minutes": 5, "overlap_percentage": 20, "emergency_slot_duration": 2 }, "protocol_optimization": { "ble_version": "5.0", "connection_interval": "7.5ms", "data_compression": true, "delta_updates": true, "batch_operations": true }, "performance_targets": { "normal_mode": "4.2 minutes for 1000 ESLs", "emergency_mode": "1.7 minutes for 1000 ESLs", "battery_impact": "<5% increase", "success_rate": ">99.5%" } } }

Real-World Implementation Examples

🏪 Grocery Store Chain

1000 ESLs in 4.2 minutes

  • Customer sets: 06:00, 14:00, 22:00
  • 25 gateways, 40 ESLs each
  • 4 parallel groups per gateway
  • 5-second time slots
  • Result: Complete update in 252 seconds

🏬 Department Store

2000 ESLs in 8.4 minutes

  • Customer sets: 08:00, 12:00, 16:00, 20:00
  • 50 gateways, 40 ESLs each
  • 6 parallel groups per gateway
  • 3-second time slots
  • Result: High-speed promotional updates

🚨 Emergency Price Update

1000 ESLs in 1.7 minutes

  • Immediate update trigger
  • 8 parallel groups per gateway
  • 2-second time slots
  • Critical price changes
  • Result: Ultra-fast emergency response

🏭 Warehouse Scale

5000 ESLs in 21 minutes

  • 100 gateways, 50 ESLs each
  • 4 parallel groups per gateway
  • 5-second time slots
  • Inventory tracking updates
  • Result: Massive scale deployment

Configuration API for High-Performance Mode

# Enable high-performance mode for 1000 ESLs curl -X POST "https://api.esl-system.com/v1/schedule/high-performance" \ -H "Content-Type: application/json" \ -d '{ "storeId": "STORE_001", "updateTimes": ["08:00", "12:00", "18:00"], "timezone": "Europe/Berlin", "mode": "high_performance", "config": { "slotDurationSeconds": 5, "parallelGroups": 4, "maxConcurrentPerGateway": 100, "distributionWindowMinutes": 5 }, "targetUpdateTime": 300 }' # Trigger emergency update for all ESLs curl -X POST "https://api.esl-system.com/v1/schedule/emergency-update" \ -H "Content-Type: application/json" \ -d '{ "storeId": "STORE_001", "priority": "critical", "config": { "slotDurationSeconds": 2, "parallelGroups": 8, "maxConcurrentPerGateway": 100 }, "estimatedTime": 120 }' # Get performance metrics curl -X GET "https://api.esl-system.com/v1/schedule/performance-metrics" \ -H "Authorization: Bearer $API_TOKEN" # Response: { "storeId": "STORE_001", "totalDevices": 1000, "activeGateways": 25, "lastUpdateTime": 252, "averageUpdateTime": 248, "successRate": 99.8, "performance": { "devicesPerGateway": 40, "parallelGroups": 4, "slotDuration": 5, "estimatedNextUpdate": 252 } }

Battery Impact Analysis

Update Mode Active Time per Update Daily Power Consumption Battery Life Impact Recommended Usage
Standard (15s) 15 seconds 0.125 mAh Baseline Regular daily updates
Optimized (5s) 5 seconds 0.042 mAh 66% reduction Business hours updates
High-Speed (3s) 3 seconds 0.025 mAh 80% reduction Promotional campaigns
Emergency (2s) 2 seconds 0.017 mAh 86% reduction Critical updates only
💡 Key Benefits of High-Performance Mode:
• Faster Updates: 1000 ESLs in under 5 minutes vs 25+ minutes
• Better Battery Life: Shorter active time reduces power consumption
• Parallel Processing: Multiple simultaneous connections per gateway
• Emergency Capability: Critical updates in under 2 minutes
• Scalable Architecture: Easily handles 5000+ ESLs with more gateways

Detailed Mode Explanations

📊 Standard Mode - Conservative Approach

Best for: Regular daily updates, maximum battery life, stable operations
Technical Specifications
Parameter Value Reasoning
Slot Duration 15 seconds Safe margin for BLE connection establishment
Parallel Groups 1 Sequential processing to avoid interference
Concurrent Connections 1 per gateway Minimal gateway load
Distribution Window 30 minutes Spread load over extended period
Performance Characteristics
// Standard Mode Configuration const standardConfig = { slotDurationSeconds: 15, parallelGroups: 1, maxConcurrentDevices: 1, distributionWindowMinutes: 30, retryAttempts: 3, connectionTimeout: 30000 }; // Performance for 1000 ESLs across 25 gateways const performance = { devicesPerGateway: 40, timePerDevice: 15, // seconds totalTimePerGateway: 40 * 15, // 600 seconds = 10 minutes totalUpdateTime: 25 * 60, // 25 minutes (worst case) batteryImpact: "minimal", reliability: "99.9%" };
Use Cases
  • Daily Price Updates: Morning, afternoon, evening updates
  • Stable Environments: Minimal RF interference
  • Battery-Critical Applications: Maximum battery life priority
  • Legacy Systems: Older gateways with limited capacity
  • Low-Priority Updates: Non-time-sensitive information
✅ Advantages:
• Maximum battery life (4+ years)
• Highest reliability and stability
• Minimal gateway resource usage
• Compatible with all hardware
⚠️ Limitations:
• Slow update times (25+ minutes for 1000 ESLs)
• Not suitable for time-critical updates
• Sequential processing only

⚡ Optimized Mode - Balanced Performance

Best for: Business hours updates, promotional campaigns, balanced performance
Technical Specifications
Parameter Value Reasoning
Slot Duration 5 seconds Optimized for BLE 5.0 fast connection
Parallel Groups 4 Balanced load with manageable complexity
Concurrent Connections 4 per gateway Optimal gateway utilization
Distribution Window 5 minutes Fast completion with controlled load
Parallel Processing Strategy
// Optimized Mode Implementation const optimizedConfig = { slotDurationSeconds: 5, parallelGroups: 4, maxConcurrentDevices: 100, distributionWindowMinutes: 5, connectionInterval: "7.5ms", dataCompression: true }; // Parallel Group Distribution for 40 devices per gateway const parallelDistribution = { group1: [0, 4, 8, 12, 16, 20, 24, 28, 32, 36], // 10 devices group2: [1, 5, 9, 13, 17, 21, 25, 29, 33, 37], // 10 devices group3: [2, 6, 10, 14, 18, 22, 26, 30, 34, 38], // 10 devices group4: [3, 7, 11, 15, 19, 23, 27, 31, 35, 39] // 10 devices }; // Each group processes simultaneously // Total time: 10 devices × 5 seconds = 50 seconds per gateway // With 25 gateways running in parallel: ~4.2 minutes total
Performance Optimization Features
  • Connection Pooling: Reuse established BLE connections
  • Data Compression: Reduce transmission time by 40%
  • Intelligent Queuing: Pre-fetch next device data
  • Error Recovery: Fast retry with exponential backoff
  • Load Balancing: Dynamic adjustment based on gateway performance
✅ Advantages:
• 6x faster than standard mode
• Better battery life (shorter active time)
• Parallel processing efficiency
• Suitable for business hours
⚠️ Requirements:
• BLE 5.0 compatible hardware
• Modern gateways with sufficient capacity
• Stable network infrastructure

🚀 High-Speed Mode - Maximum Throughput

Best for: Promotional campaigns, flash sales, time-sensitive updates
Technical Specifications
Parameter Value Reasoning
Slot Duration 3 seconds Aggressive timing for maximum speed
Parallel Groups 6 High concurrency for speed
Concurrent Connections 6 per gateway Push gateway limits for performance
Distribution Window 3 minutes Rapid completion target
Advanced Optimization Techniques
// High-Speed Mode Configuration const highSpeedConfig = { slotDurationSeconds: 3, parallelGroups: 6, maxConcurrentDevices: 150, distributionWindowMinutes: 3, connectionInterval: "7.5ms", dataCompression: true, deltaUpdates: true, batchOperations: true, priorityQueuing: true }; // Advanced Features const optimizations = { deltaUpdates: { description: "Send only changed pixels", speedImprovement: "60% faster for partial updates", implementation: "Binary diff algorithm" }, batchOperations: { description: "Multiple commands in single transmission", speedImprovement: "40% reduction in overhead", implementation: "Command aggregation" }, priorityQueuing: { description: "High-priority devices first", speedImprovement: "Critical updates in first 30 seconds", implementation: "Priority-based scheduling" } }; // Performance Calculation for 1000 ESLs const calculation = { devicesPerGateway: 40, devicesPerGroup: Math.ceil(40 / 6), // 7 devices per group timePerGroup: 7 * 3, // 21 seconds totalTime: 21 + 30, // 2.5 minutes (including overhead) throughput: 1000 / 2.5, // 400 devices per minute efficiency: "95%" };
Use Cases
  • Flash Sales: Immediate price changes across all products
  • Promotional Campaigns: Time-sensitive marketing updates
  • Inventory Alerts: Stock level changes during peak hours
  • Competitive Pricing: Rapid response to competitor changes
  • Event-Driven Updates: Concert tickets, limited offers
✅ Advantages:
• 10x faster than standard mode
• Advanced optimization features
• Priority-based processing
• Ideal for time-sensitive campaigns
⚠️ Requirements:
• High-performance gateways required
• Stable, low-latency network
• Professional deployment recommended

🚨 Emergency Mode - Ultra-Fast Response

Best for: Critical price changes, safety alerts, regulatory compliance
Technical Specifications
Parameter Value Reasoning
Slot Duration 2 seconds Absolute minimum for reliable connection
Parallel Groups 8 Maximum concurrency possible
Concurrent Connections 8 per gateway Push hardware to absolute limits
Distribution Window 2 minutes Emergency response time target
Emergency Protocol Implementation
// Emergency Mode - Maximum Performance const emergencyConfig = { slotDurationSeconds: 2, parallelGroups: 8, maxConcurrentDevices: 200, distributionWindowMinutes: 2, connectionInterval: "7.5ms", retryAttempts: 1, // Fast fail for speed timeout: 1500, // 1.5 second timeout priorityOverride: true, emergencyProtocol: true }; // Emergency Trigger Conditions const emergencyTriggers = { priceError: { description: "Incorrect pricing detected", response: "Immediate correction required", maxDelay: "90 seconds" }, safetyAlert: { description: "Product recall or safety warning", response: "Regulatory compliance", maxDelay: "60 seconds" }, systemFailure: { description: "Gateway or network failure recovery", response: "Service restoration", maxDelay: "120 seconds" }, competitorResponse: { description: "Urgent competitive pricing", response: "Market position protection", maxDelay: "90 seconds" } }; // Ultra-Fast Processing Strategy const emergencyStrategy = { step1: "Interrupt all normal operations", step2: "Allocate maximum gateway resources", step3: "Use 8 parallel groups per gateway", step4: "2-second slots with minimal overhead", step5: "Priority queue for critical devices", step6: "Real-time monitoring and adjustment", result: "1000 ESLs updated in 1.7 minutes" };
Emergency Features
  • Interrupt Capability: Override all normal operations
  • Resource Allocation: Maximum gateway utilization
  • Fast Fail: Quick retry or skip for failed devices
  • Priority Override: Critical devices updated first
  • Real-time Monitoring: Live progress tracking
  • Automatic Fallback: Return to normal mode after completion
Emergency Use Cases
🚨 Price Correction

Incorrect pricing detected by audit system

  • Regulatory compliance requirement
  • Customer protection priority
  • Legal liability prevention
⚠️ Safety Alert

Product recall or safety warning

  • Immediate customer notification
  • Regulatory compliance
  • Brand protection
🔧 System Recovery

Gateway failure or network outage recovery

  • Service restoration
  • Catch-up updates
  • System synchronization
💰 Competitive Response

Urgent competitive pricing adjustment

  • Market position protection
  • Revenue optimization
  • Customer retention
✅ Advantages:
• Fastest possible update time (1.7 minutes)
• Critical situation response
• Regulatory compliance capability
• Maximum resource utilization
⚠️ Cautions:
• Use only for genuine emergencies
• Higher failure rate possible (2-3%)
• Increased gateway load and heat
• Should not be used regularly

Mode Selection Guidelines

Scenario Recommended Mode Reasoning Expected Time (1000 ESLs)
Daily price updates Standard Maximum battery life, non-urgent 25 minutes
Business hours updates Optimized Balanced performance and efficiency 4.2 minutes
Promotional campaigns High-Speed Time-sensitive marketing 2.5 minutes
Flash sales High-Speed Immediate customer impact 2.5 minutes
Price corrections Emergency Regulatory compliance 1.7 minutes
Safety alerts Emergency Customer safety priority 1.7 minutes
System recovery Emergency Service restoration urgency 1.7 minutes

Message Flow Sequence

Complete Wake Cycle

1. Server Sends Update

{ "type": "render_command", "destination": "ESL_BLE_001", "payload": { "image_data": "...", "schedule": { "refresh_times": ["08:00", "12:00", "18:00"] } } }

2. Gateway Queues Message

Gateway stores the message in device-specific queue until wake time

3. ESL Wakes and Checks In

{ "type": "check_in", "source": "ESL_BLE_001", "timestamp": "2025-05-27T08:00:00.000Z", "device_status": { "battery_level": 92, "last_render": "2025-05-26T18:00:00.000Z" } }

4. Gateway Delivers Queued Messages

{ "type": "queued_messages", "messages": [ { "type": "render_command", "payload": { /* render data */ } }, { "type": "schedule_update", "payload": { /* new schedule */ } } ] }

5. ESL Acknowledges and Sleeps

{ "type": "acknowledgment", "source": "ESL_BLE_001", "status": "success", "next_wake": "2025-05-27T12:00:00.000Z" }

Power Management

Power States

💤 Deep Sleep

Power: ~10 ÂľA

Duration: 99.9% of time

Activities: RTC only, no radio

⏰ Wake Transition

Power: ~5 mA

Duration: ~100 ms

Activities: Initialize radio, sync time

📡 Active Communication

Power: ~15 mA

Duration: 5-15 seconds

Activities: BLE data transfer

🖼️ Display Update

Power: ~20 mA

Duration: 2-5 seconds

Activities: E-ink refresh

Battery Life Calculations

Example: CR2450 Coin Cell (620mAh)
Daily consumption with 3 wake cycles:
  • Sleep: 23.95 hours × 10ÂľA = 0.24 mAh
  • Wake/Comm: 0.05 hours × 15mA = 0.75 mAh
  • Display: 3 × 5s × 20mA = 0.08 mAh
  • Total: ~1.07 mAh/day = 580 days battery life

Queue Management

Gateway Queue Structure

// Gateway maintains per-device message queues const deviceQueues = { "ESL_BLE_001": { messages: [ { id: "msg-001", type: "render_command", priority: 1, timestamp: "..." }, { id: "msg-002", type: "config_update", priority: 2, timestamp: "..." } ], lastCheckIn: "2025-05-27T08:00:00.000Z", nextWake: "2025-05-27T12:00:00.000Z", retryCount: 0 }, "ESL_BLE_002": { messages: [], lastCheckIn: "2025-05-27T08:00:15.000Z", nextWake: "2025-05-27T12:00:15.000Z" } };

Queue Policies

Policy Description Configuration
Message Priority Higher priority messages delivered first Priority levels 1-5 (1 = highest)
Queue Size Limit Maximum messages per device Default: 10 messages
Message Expiry Auto-remove old messages Default: 24 hours
Deduplication Remove duplicate render commands Keep only latest version
Batch Delivery Send multiple messages at once Max batch size: 5 messages

Advanced Features

Dynamic Schedule Adjustment

The system can dynamically adjust wake schedules based on various factors:

Time-of-Day Optimization

{ "dynamic_schedule": { "business_hours": { "start": "09:00", "end": "21:00", "frequency": "hourly" }, "after_hours": { "frequency": "every_6_hours" }, "peak_times": [ { "time": "11:00", "priority": "high" }, { "time": "15:00", "priority": "high" }, { "time": "19:00", "priority": "high" } ] } }

Event-Based Scheduling

  • Price Changes: Trigger immediate wake for affected ESLs
  • Promotions: Increase update frequency during sales
  • Inventory: More frequent updates for fast-moving items
  • Battery Low: Reduce wake frequency to extend life

Emergency Wake Protocol

For critical updates that can't wait for the next scheduled wake cycle:

Wake Methods

🔊 BLE Advertising

ESL periodically listens for wake signals (every 30s)

🔘 Physical Button

Manual wake trigger for immediate update

📡 Beacon Mode

Special beacon triggers wake for all nearby ESLs

⏰ Next Wake Override

Adjust next wake time to be sooner

Battery Impact: Emergency wakes should be used sparingly as they significantly impact battery life. Each emergency wake consumes as much power as 5-10 regular wake cycles.

Gateway Load Balancing

Distribute wake times to prevent gateway overload:

Staggering Algorithm

// Distribute 100 devices across 15-minute window const TOTAL_DEVICES = 100; const WINDOW_DURATION_MS = 15 * 60 * 1000; // 15 minutes const SLOT_DURATION_MS = 15000; // 15 seconds per device const OVERLAP_FACTOR = 0.2; // 20% overlap allowed function assignTimeSlots(devices, baseTime) { const slots = []; const slotsPerDevice = Math.ceil(SLOT_DURATION_MS / 1000); devices.forEach((device, index) => { const offset = (index * SLOT_DURATION_MS * (1 - OVERLAP_FACTOR)); const wakeTime = new Date(baseTime.getTime() + offset); slots.push({ deviceId: device.id, wakeTime: wakeTime, slot: index % 4, // Assign to one of 4 parallel slots duration: SLOT_DURATION_MS }); }); return slots; }

Load Metrics

Metric Target Action if Exceeded
Concurrent Connections < 4 devices Increase slot spacing
Queue Depth < 50 messages Trigger extra wake cycles
Response Time < 500ms Add mesh gateway
CPU Usage < 70% Redistribute devices

Protocol Optimization

Communication Efficiency

  • Message Compression: Use binary protocols for image data
  • Delta Updates: Send only changed pixels for partial updates
  • Batch Acknowledgments: Single ACK for multiple messages
  • Connection Reuse: Keep BLE connection open for multiple operations

Power Optimization Techniques

1
Adaptive Wake Duration

Extend wake time only if messages are pending

2
Predictive Caching

Pre-fetch likely updates during scheduled wakes

3
Grouped Operations

Combine display update with config changes

4
Smart Retry Logic

Exponential backoff for failed connections

Best Practices