Orchestrate Your IoT Sensors
Transform chaotic sensor streams into structured, observable data flows. Built-in metrics tell you exactly how your system is performing.
Everything you need
Channel Management
Handle 64+ sensors with individual configuration and priority
Priority Scheduling
P1-P5 levels ensure critical data is transmitted first
Frame Aggregation
Optimized packing for LoRaWAN 51-242 byte limits
Built-in Metrics
Real-time entropy, correlation, and resilience tracking
Architecture
Gateway manages multiple ALEC encoder instances, aggregating data from many sensors into efficient transmission frames.
Integrations
Export metrics to your favorite monitoring tools. Gateway provides Prometheus-compatible endpoints out of the box.
Monitoring
Storage
Cloud
Real-time Dashboard
Pre-built Grafana dashboard included β’ Real-time entropy, resilience, and channel metrics
Built-in Observability
Gateway includes a powerful metrics module that computes entropy-based indicators in real-time. Know your system health at a glance.
| Metric | Formula | What it tells you |
|---|---|---|
| Total Correlation (TC) | Sum H(Xi) - H(X1...Xn) | Redundancy across sensors |
| Resilience Index (R) | TC / Sum H(Xi) | System health (0-1) |
| Criticality (dR) | R - R without k | Sensor importance ranking |
High redundancy, can lose sensors
Moderate redundancy
Low redundancy, fragile system
LoRaWAN Optimized
Gateway automatically respects payload limits for different data rates.
| Data Rate | Max Payload | Use Case |
|---|---|---|
| DR0-DR2 | 51 bytes | Long range, low throughput |
| DR3 | 115 bytes | Balanced |
| DR4-DR5 | 242 bytes | Short range, high throughput |
Deployment Options
Cargo Crate
Add to your Rust project
cargo add alec-gateway Docker
Run as a standalone service
docker pull alec/gateway Kubernetes
Helm chart available
helm install alec Simple API
use alec_gateway::{Gateway, ChannelConfig, GatewayConfig};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create gateway with LoRaWAN frame limit
let config = GatewayConfig {
max_frame_size: 242,
..Default::default()
};
let mut gateway = Gateway::with_config(config);
// Add sensor channels with priorities
gateway.add_channel("temperature", ChannelConfig::with_priority(1))?;
gateway.add_channel("humidity", ChannelConfig::with_priority(2))?;
gateway.add_channel("pressure", ChannelConfig::with_priority(3))?;
// Collect sensor readings
let timestamp = 1234567890;
gateway.push("temperature", 22.5, timestamp)?;
gateway.push("humidity", 65.0, timestamp)?;
gateway.push("pressure", 1013.25, timestamp)?;
// Get aggregated frame ready for transmission
let frame = gateway.flush()?;
println!("Frame: {} bytes", frame.size());
// frame.to_bytes() -> send over LoRaWAN/MQTT
Ok(())
} Ready to orchestrate?
Start with the open source version or contact us for commercial licensing.