Everything. One platform.
Every feature built together — not stitched from five different services. Device registry, telemetry, OTA, rules engine, anomaly detection, partner portal, dashboard builder, diagnostics, and CLI.
Register, provision, and manage every device
A central registry for every device in your fleet. Register via REST API, provision from the CLI tool, or let the firmware auto-register on first boot.
- ✓Serial number + product type + firmware version tracked per device
- ✓QR code generated per device for zero-touch customer claiming
- ✓Assign devices to organizations and rooms in bulk or one-by-one
- ✓Online / Offline detection based on last_seen timestamp (< 5 min = online)
- ✓Offline alerts fire when device silent for 15+ minutes
- ✓Full device shadow: desired state + reported state synced via MQTT
POST /devices/register
{
"serial_no": "EC-CLM-001",
"product_type": "EC-CLIMATE-V1",
"fw_version": "1.2.0"
}Live sensor data + 7-day history
Every device streams telemetry every 5 seconds. View live cards, filter by time range, and plot historical trends — all from the same dashboard.
- ✓MQTT TLS (WiFi devices) and HTTPS (GSM devices) — both supported
- ✓Telemetry stored in Supabase, queryable by ?hours=1/6/24/168
- ✓Live state cards update every 5s without page refresh
- ✓Historical line charts: Temp, Humidity, CO₂, Battery, Signal
- ✓Time range selector: 1h · 6h · 24h · 7d
- ✓Metric toggles — show/hide individual sensors per device
- ✓Weekly PDF report — device summary, telemetry avg/min/max, rules activity, signal health
// Device publishes to:
devices/{serial}/telemetry
// Payload example (EC-CLIMATE-V1):
{
"temp": 24.3, "hum": 58,
"co2": 847, "relay": false,
"bat": 4.05, "signal": -61,
"uptime": 3840, "heap": 186432
}Push firmware from dashboard to device in seconds
Upload a compiled .bin file, select the target device, and push. If the device is offline, the update is stored as pending and auto-pushed when it reconnects.
- ✓Upload .bin firmware from dashboard — stored in Supabase Storage
- ✓Push to online device via MQTT devices/{serial}/ota
- ✓Offline device: stored as pending_fw_version + pending_fw_url
- ✓Auto-push when device comes back online (first telemetry triggers check)
- ✓Firmware version tracked per device in registry
- ✓Org admins notified via notification bell on firmware upload
// Platform pushes to device:
devices/{serial}/ota → { "url": "...", "version": "1.3.0" }
// Pending OTA (offline device):
GET /devices/:serial/commands
← { "fw_url": "...", "fw_version": "1.3.0" }Threshold rules + scheduled automation + webhooks
Two types of automation rules — threshold-based (sensor condition) and schedule-based (time + day). When any rule fires, an optional webhook POST notifies your external system.
- ✓Threshold rules: IF co2 > 1000 THEN relay = true — evaluated every 30s
- ✓Schedule rules: AT 22:00 Mon–Fri THEN relay = false
- ✓Day-of-week selector per schedule rule (any combination)
- ✓Rule fires → MQTT command to device in real time
- ✓Webhook URL per rule — POSTs JSON to Telegram bot, Slack, n8n, Make.com
- ✓last_fired timestamp tracked per rule, 90s debounce on schedule rules
// Webhook payload on rule fire:
POST {your_webhook_url}
{
"event": "rule_fired",
"rule_name": "Night shutoff",
"rule_type": "schedule",
"device_serial": "EC-CLM-GERMANY01",
"action": { "key": "relay", "value": false },
"triggered_at": "2026-06-27T22:00:01Z"
}B2B hierarchy: Org Admin → Room → Tenant
Built for companies that deploy IoT products to business clients. Each client gets their own org, their own rooms, and their tenants get QR-based access.
- ✓Super Admin: full platform view, all orgs, all devices
- ✓Org Admin: manage their org's rooms, devices, rules, OTA, notifications
- ✓Room Tenant: read-only climate view, accessed via QR scan
- ✓RBAC middleware — role-based routing on every page
- ✓Notification bell: org admins notified on firmware upload + device offline
- ✓Audit trail: last_fired, last_seen, offline_alerted_at per device/rule
// Role routing: admin → / (full platform) org_admin → /org (their org) customer → /portal (their devices) tenant → /portal/room (their room) // QR claim flow: /claim-room?room_id=xxx → login/register → room assigned
Drag-and-drop control dashboards — built for your hardware
Build custom IoT dashboards without writing any frontend code. Add sensor widgets, relay toggles, sliders, and charts — then drag them into any layout. Fully bidirectional with your device's shadow state.
- ✓Live / Edit mode toggle — widgets are interactive only in Live mode; layout is locked
- ✓Toggle widget: ON/OFF relay, LED, fan — sends shadow_desired, shows device-confirmed state (green dot)
- ✓Metric card: reads shadow_reported in real time (temp, hum, CO₂, battery, signal)
- ✓Line chart: plots telemetry history — 1h, 6h, or 24h time range
- ✓Slider widget: sets numeric setpoint or PWM duty — 400ms debounced send
- ✓Button widget: one-shot command press (any field → any value)
- ✓Device status widget: online/offline indicator with last-seen timestamp
- ✓Drag handle — left grip strip; resize via corner handle; layout saved to org database
- ✓Custom field names — any shadow key (relay, led, gpio5, fan_speed) — not locked to presets
// Widget sends PATCH to registry:
PATCH /devices/{serial}/shadow/desired
{ "relay": true }
// Registry saves to DB + publishes MQTT:
devices/{serial}/shadow/desired → { "relay": true }
// ESP32 firmware receives via MQTT:
void onShadowDesired(JsonObject desired) {
if (desired["relay"]) hvac.setRelay(true);
if (desired["led"]) digitalWrite(LED_PIN, HIGH);
}
// Device confirms back via telemetry:
shadow_reported.relay = true ← green dot on toggleFull device health: battery, signal, heap, GPS, reboot reason
Every telemetry packet carries diagnostic fields — not just sensor data. The diagnostics panel gives ops teams everything needed to debug a device remotely.
- ✓Battery voltage (V) + percentage via LiPo ADC (3.3–4.2V range)
- ✓Signal strength (dBm) — WiFi RSSI or GSM CSQ
- ✓Heap free (bytes) — catches memory leaks before crash
- ✓Reboot reason: POWERON / SW / PANIC / WDT / BROWNOUT / EXT
- ✓GPS: fix status, satellite count, TTFF (seconds)
- ✓Remote reboot: dashboard button → MQTT / HTTP 205 → ESP.restart()
// Diagnostics in every telemetry packet:
{
"bat": 4.05,
"signal": -61,
"heap": 186432,
"uptime": 3840,
"reboot_reason": "POWERON",
"gps_fix": true,
"sats": 9,
"ttff": 17.4
}Detect problems before they become failures
Rolling-average anomaly detection watches every active device's telemetry stream. When a reading spikes beyond its learned baseline, EdgeConductor fires an in-app alert and email — before a human-set threshold rule would even catch it.
- ✓Rolling mean over last 29 readings — learns what normal looks like for each device
- ✓Monitors Temperature, Humidity, CO₂, and Battery on every active device
- ✓Warning at 20–40% deviation · Critical at 40–100% deviation
- ✓Battery absolute floor: alert fires when voltage drops below 3.5V regardless of trend
- ✓30-minute cooldown per device+field — no duplicate alert spam
- ✓In-app notification bell + email with current value, baseline average, and % deviation
// Anomaly fires automatically — no configuration needed.
// Example alerts sent to org admin:
⚠️ Warning: CO₂ on EC-CLM-GERMANY01
CO₂ is 67% above baseline
current: 1840 ppm · avg: 1103 ppm
🔴 Critical: Temperature on EC-CLM-ROOM02
Temperature is 82% above baseline
current: 41.2°C · avg: 22.6°C
// Query unacknowledged anomalies via SDK:
const anomalies = await ec.anomalies.list(orgId, { unacked: true });
await ec.anomalies.acknowledge(anomaly.id);
// Or via API:
GET /orgs/:id/anomalies?unacked=true
PATCH /anomalies/:id/acknowledgeManage all your customer orgs from one portal
System integrators and hardware OEMs get a dedicated Partner Portal. Create customer orgs, register fleets, invite org admins, and monitor every deployment — all from a single multi-org view under your brand.
- ✓Partner role — dedicated /partner portal, separate from admin and org_admin
- ✓Create and manage unlimited customer orgs from one dashboard
- ✓Per-org stats: device count, online count, anomalies, last activity
- ✓Invite org admin to any customer org via email
- ✓White-label each org independently — logo, color, domain per customer
- ✓API and SDK access scoped per org — customers only see their own data
// Create a partner account (super admin):
POST /partners { name, slug, contact_email, plan }
// Create a customer org under this partner:
POST /partners/:id/orgs
{
"name": "Acme Manufacturing",
"slug": "acme-manufacturing",
"product": "EC-CLIMATE-V1",
"plan": "pro"
}
// Aggregate stats across all customer orgs:
GET /partners/:id/stats
← { orgs: 12, total_devices: 847,
online_devices: 821, active_devices: 834 }Manage your entire fleet from the terminal
The ec CLI brings device management, OTA firmware pushes, live telemetry streaming, and factory provisioning to your command line. Fully scriptable — works in CI/CD, factory floors, and headless environments.
- ✓ec device list / create / shadow / reboot — complete fleet control without opening a browser
- ✓ec telemetry watch — stream live sensor data in terminal, updated every 5 seconds
- ✓ec ota upload + push — upload .bin, then push to one device or entire product type fleet
- ✓ec manufacture 500 — bulk-register up to 500 devices, generates QR PNGs and CSV in one command
- ✓ec login stores credentials in ~/.ec/config.json — works cleanly in CI/CD via env vars
- ✓Chain commands: upload on merge → push on release tag — fully automated OTA pipeline
# Factory floor: register 50 tracker devices $ ec manufacture 50 --prefix EC-TRACK --type tracker ✓ EC-TRACK-00001 QR saved ✓ EC-TRACK-00002 QR saved ... 50 device(s) registered CSV: manufacture_output/manufacture_EC-TRACK_2026-07-02.csv QR: manufacture_output/qr_EC-TRACK_2026-07-02/ (50 files) # CI/CD: push new firmware to all trackers on release $ ec ota upload ./tracker_v2.1.4.bin --version 2.1.4 --type tracker $ ec ota push --type tracker ✓ OTA triggered — Job #12 Devices : 50 targeted
See it live in 30 minutes
Book a demo and we'll walk you through every feature with a live device running.