Platform

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.

Device Registry

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"
}
Telemetry

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
}
OTA Updates

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" }
Rules Engine

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"
}
Multi-Tenant

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
Dashboard Builder

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 toggle
Diagnostics

Full 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
}
Anomaly Detection

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/acknowledge
Partner Portal

Manage 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 }
CLI Tool

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.