IoT Dash Documentation
Complete platform guide for v0.9.2-beta — Real-time IoT Dashboard with 15 widget types & light/dark theme
Overview
IoT Dash is a real-time IoT dashboard platform that connects to MQTT brokers to visualize sensor data, control IoT devices, and track GPS locations — all from your browser via WebSocket MQTT.
The platform organizes widgets into three categories:
- Display Widgets (9 types) — Gauge, Digital Display, 7-Segment, Stat Card, Status Card, LED Indicator, Progress Bar, Terminal Log, Image Card
- Control Widgets (5 types) — Button, Toggle, Slider, Number Input, RGB Color
- Location Widget (1 type) — Map Pin with real-time GPS tracking
Plus automatic Time-Series Charts for gauge widgets and a live Data Table for all MQTT messages.
🌤️ Weather Station
| Time | Topic | Value |
|---|---|---|
| 14:32:05 | weather/roof/temp | 23.5 |
| 14:32:05 | weather/roof/humidity | 65 |
| 14:32:04 | weather/roof/pressure | 1013 |
Quick Start — Manual Setup
Build your first dashboard from scratch in under 3 minutes:
Sign up & verify email
Create an account at www.iotdash.app. Check your inbox for a verification email and click the link.
Create an app
Click + New App in the sidebar. Give it a name (e.g., "My Workshop"). Choose Blank template.
Add a device
Click + Device in the header. Name it (e.g., "ESP32-Sensor"), pick an icon and color. A topic prefix auto-generates.
Add widgets
With the device tab active, click + Add Widget. The dropdown shows all 12 types grouped by category. Pick a Gauge from Display, give it a name, topic, unit, and min/max. Add a Toggle from Control to send commands.
Connect & test
Click Connect in the connection bar (uses IoT Dash Cloud by default). Then click ▶ Simulator to see live data flowing through your widgets.
Quick Start — AI Generator
The fastest way to build a dashboard. Describe your IoT setup in plain English and AI creates everything for you.
Open the AI Generator
Click the 🤖 AI Generate button in the sidebar (below your app list).
Describe your setup
Type a natural language description of your IoT project. Be specific about devices, sensors, and controls. Example:
"I have an ESP32 monitoring a greenhouse with temperature,
humidity, soil moisture sensors and a water pump relay.
Also a GPS tracker on my delivery van."
Preview the result
AI generates a complete dashboard blueprint showing devices, sensors (with appropriate widget types), controls, and map pins. Review the preview to make sure it looks right.
Click "Create Dashboard"
The app is created with all devices, sensors, controls, and map pins pre-configured. Connect to the broker and start the simulator to see it in action.
The AI Generator uses GPT-4o-mini via GitHub Models API (free tier: 150 requests/day). It may not always produce perfect configurations — you can edit any generated widget afterwards.
Quick Start — From Template
Templates create a pre-configured dashboard with mixed widget types in one click.
Create a new app
Click + New App in the sidebar.
Pick a template
Choose one of 5 pre-built templates: 🌤️ Weather Station, 🏠 Smart Home, 🏭 Industrial IoT, ⚡ Energy Monitor, or 🌱 Smart Agriculture. Each comes with sensors using a mix of widget types (gauges, digital displays, 7-segment readouts, stat cards, LEDs, progress bars, terminal logs) and preset controls.
Connect & explore
Hit Connect → Start Simulator. All widgets spring to life with simulated data. Edit or delete any widget to customize.
See the full App Templates reference for what each template includes.
Account & Login
IoT Dash uses Firebase Authentication with email/password.
- After signing up, you must verify your email before accessing the dashboard
- All data is stored per-user in Cloud Firestore and cached in
localStoragefor instant loading - Sessions persist — you stay logged in until you explicitly sign out
If you don't see the verification email, check your spam folder. You can request a new one from the verification page.
Apps
An app is an independent dashboard workspace. Each app has its own devices, widgets, layout, and broker configuration. You can create up to 5 apps per account.
Creating an App
Click + New App in the sidebar. Options:
- Blank — empty canvas, build from scratch
- Template — pre-configured sensors and controls (see Templates)
- AI Generate — describe your setup in words (see AI Generator)
Switching & Managing Apps
- Click any app in the sidebar to switch (dashboard fully remounts)
- Rename: right-click or use the edit button on an app
- Delete: removes the app and all its data permanently
Devices
Devices are the primary organizational unit. All widgets (sensors, controls, map pins) belong to a device. You must create at least one device before adding widgets.
A device typically represents one physical board (ESP32, Raspberry Pi, PLC). Its topic prefix ensures all its widgets publish/subscribe under a common MQTT namespace.
Creating a Device
| Field | Description |
|---|---|
| Name | Human-readable label (e.g., "Weather Station Roof") |
| Icon | Emoji icon for the device tab (📡 🖥️ 💡 🌡️) |
| Color | Accent color for the device tab border |
| Topic Prefix | Auto-generated from name. Pre-fills MQTT topics in widget modals (e.g., weather/station/) |
Device Profiles
Save a device's complete widget set as a reusable profile. Apply saved profiles when creating new devices to instantly set up all sensors, controls, and map pins. See Device Profiles.
Limits
Up to 20 devices per app. The "+ Device" button is disabled at the limit.
Widget Categories
IoT Dash organizes its 15 widget types into three categories. When you click + Add Widget, the dropdown shows all types grouped:
| Category | Direction | Count |
|---|---|---|
| Display | Read-only — subscribes to topics | 9 types |
| Control | Write — publishes to topics | 5 types |
| Location | Read-only — lat/lng topics | 1 type |
Display widgets subscribe to an MQTT topic and show incoming data. Control widgets publish MQTT messages when users interact. Map Pins subscribe to lat/lng topics for real-time GPS.
Gauge
The classic SVG arc gauge — a semicircular dial that fills proportionally between min and max. Best for real-time numeric values like temperature, pressure, or speed. Gauge widgets also automatically generate a time-series chart below them.
Configuration Fields
| Field | Description | Required |
|---|---|---|
| Name | Display label (e.g., "Room Temperature") | ✅ |
| MQTT Topic | Topic to subscribe to. Device prefix auto-fills. | ✅ |
| Unit | Display unit (°C, %, hPa, km/h, RPM) | |
| Data Type | number, integer, boolean, or string | |
| Min / Max | Gauge arc range (defines 0% and 100% fill) | |
| Warning Low / High | Thresholds that trigger visual warning colors | |
| Decimals | Decimal places for display (0–5) | |
| Icon / Color | Emoji icon and accent color for the gauge arc |
Best For
Temperature, pressure, speed, RPM, voltage — any value with a known range where you want to see "how full" the reading is.
Digital Display
A clean, large numeric readout — like a digital multimeter. Shows the value prominently in a monospace font with an optional thin bar indicating position within its range and a last-updated timestamp. Perfect when a gauge arc is overkill and you just need a big, readable number.
Features
- Monospace font — gives a clean digital-meter aesthetic
- Thin range bar — subtle position indicator (only for numeric data types)
- Last updated timestamp — shows when the last reading arrived
- Warning state — border glows red when value exceeds warning thresholds
- Multiple data types — also works for boolean (ON/OFF) and string payloads
Gauge vs Digital Display
| Feature | Gauge | Digital Display |
|---|---|---|
| Best for | Values with a "fill level" feel | Exact readout focus |
| Visual | SVG arc + auto chart | Large number + thin bar |
| Chart | ✅ Auto-generated below | No chart (add separately) |
| Timestamp | No | ✅ Shows last update |
| Size | Taller (gauge arc) | Compact |
Best For
Cumulative values (kWh, total count), high-precision readings, fast-changing values where a gauge arc would be distracting, or when you simply want the cleanest possible number display.
7-Segment Display
A retro-style seven-segment LED display — the classic look from industrial panels, digital clocks, and multimeters. Each digit is rendered as SVG segments with inactive segments faintly visible, giving that authentic hardware feel. The widget always keeps a dark panel background even in light theme for maximum realism.
Features
- SVG seven-segment digits — each segment individually rendered, inactive segments dimly visible
- Dark panel background — keeps the authentic LED panel look even in light theme
- Accent color segments — active segments glow in your chosen sensor color
- Warning state — segments turn red when value exceeds thresholds
- Supports decimals, negatives, and text — renders dots, minus signs, and basic characters
Best For
RPM, voltage, frequency, counters — any value where you want that classic industrial hardware panel aesthetic. Especially effective on dark dashboards for monitoring environments.
Stat Card
Shows the current value prominently with a trend arrow (↑ rising, ↓ falling, → stable) and min / avg / max from recent history. Great for at-a-glance monitoring.
Best For
Values where trend direction matters more than a gauge position — barometric pressure, vibration, pH, current draw. Also ideal when you want min/avg/max at a glance.
Status Card
A large, bold ON / OFF text display with a color glow. Designed for binary status indicators where you need instant, unmistakable visual clarity at a glance.
How It Works
Boolean data type: payloads 1, true, ON, open display as ON (glowing). Everything else displays as OFF (dim).
Best For
Door open/closed, machine running/stopped, alarm active/clear — any binary state where visibility from across the room matters.
LED Indicator
A simple colored glowing dot — mimics a physical LED on a circuit board. Compact and perfect for dense dashboards with many binary indicators.
LED vs Status Card
| Feature | LED Indicator | Status Card |
|---|---|---|
| Size | Compact (small dot) | Large (big text) |
| Visibility | Good for nearby monitoring | Visible from across the room |
| Best use | Dense dashboards, many indicators | Critical status, few indicators |
Best For
Motion detected, rain sensor, fault alerts, pump active, relay status — compact binary indicators when you have many on one dashboard.
Progress Bar
A horizontal bar that fills proportionally between min and max. Shows a percentage value alongside. Changes color when entering warning zones.
Best For
Tank levels, fill percentages, battery level, soil moisture, humidity, power consumption — any value naturally expressed as "how full" a horizontal bar is.
Terminal Log
A scrollable monospace log that displays every MQTT message received on the sensor's topic. Auto-scrolls to the latest message. Styled like a serial monitor terminal.
How It Works
- Subscribes to one MQTT topic
- Every incoming message is appended with a timestamp
- Auto-scrolls to latest entry
- Shows up to 100 recent messages
Best For
Device debug output, serial monitor data, event logs, alert messages — any string data type where you want to see a history of messages.
Image Card
Displays an image from a URL published to its MQTT topic. The payload must be a valid URL (http://, https://, or data: URI). Click the image to open it full-size.
Expected Payload
https://cam.example.com/snap.jpg
Or a base64 data URI:
data:image/jpeg;base64,/9j/4AAQ...
Best For
IP camera snapshots, QR codes, thermal images, microscope captures — any image published as a URL.
Time-Series Chart
A Recharts line chart that automatically appears for every Gauge widget with a numeric data type. Shows the recent history of values plotted over time.
Charts are only generated for Gauge widgets with number or integer data types.
Other display types (Stat, Status, LED, Progress, Terminal, Image) do not generate charts.
Control widgets publish MQTT messages when the user interacts with them. Use them to switch relays, set thresholds, trigger actions, or send commands to your devices.
Button
A simple click-to-publish button. Each click sends a fixed payload to the configured topic.
| Field | Description |
|---|---|
| Payload | The exact string published on click (e.g., STOP, 1, reboot) |
| Button Text | Text displayed on the button face (default: "Send") |
Toggle
An ON/OFF switch that alternates between two payloads. Visually shows the current state with a sliding knob.
| Field | Description |
|---|---|
| ON Payload | Value sent when toggled ON (e.g., 1, ON, LOCK) |
| OFF Payload | Value sent when toggled OFF (e.g., 0, OFF, UNLOCK) |
| ON / OFF Label | Text displayed in each state |
Slider
A range slider that publishes the current value when adjusted. Configure min, max, step, and unit.
| Field | Description |
|---|---|
| Min / Max | Slider range limits |
| Step | Increment size (e.g., 5 means 0, 5, 10, 15...) |
| Default Value | Initial slider position |
| Unit | Displayed next to the value (%, °C, min) |
Number Input
A text field + send button for typing an exact numeric value and publishing it. Supports min/max validation and step constraints. Press Enter or click ▶ to publish.
| Field | Description |
|---|---|
| Min / Max | Valid input range (values outside are rejected) |
| Step | Increment constraint |
| Unit | Displayed as placeholder/context |
Slider vs Number Input
| Feature | Slider | Number Input |
|---|---|---|
| Input method | Drag to approximate value | Type exact value |
| Best range | Small (0–100) | Large (0–10000) or precise |
| Use case | Fan speed, volume | Setpoints, thresholds, addresses |
RGB Color
A Blynk-style color picker for controlling RGB LEDs, light strips, or any color-based actuator. Includes a glowing preview circle, HTML5 color picker, and individual R / G / B sliders. Similar to the RGB widget in Blynk, but with three publish format options.
Configuration
| Field | Description |
|---|---|
| Publish Format | How the color is published — CSV (255,128,0), JSON ({"r":255,"g":128,"b":0}), or HEX (#FF8000) |
| Default Color | Initial color on load (default: #6C63FF) |
| Auto-send | When on, every color/slider change publishes immediately. Off = manual "Send Color" button |
Publish Formats Comparison
| Format | Example Payload | Best For |
|---|---|---|
| CSV | 255,128,0 | Arduino / ESP32 — easy sscanf() parsing |
| JSON | {"r":255,"g":128,"b":0} | Node-RED, Python, complex pipelines |
| HEX | #FF8000 | Web-based clients, NeoPixel libraries |
ESP32 Example (CSV format)
// Subscribe to RGB topic
mqttClient.subscribe("home/led/color");
// In message callback:
void onMessage(String topic, String payload) {
int r, g, b;
sscanf(payload.c_str(), "%d,%d,%d", &r, &g, &b);
analogWrite(RED_PIN, r);
analogWrite(GREEN_PIN, g);
analogWrite(BLUE_PIN, b);
}
With auto-send enabled (default), every drag of an R/G/B slider or color picker change publishes instantly — great for interactive LED testing. Disable auto-send for low-bandwidth scenarios where you want to pick a color first and then send once.
Map Pin
Displays real-time GPS positions on an interactive Leaflet map. Each pin subscribes to separate MQTT topics for latitude and longitude. The map widget appears automatically when at least one map pin exists.
Configuration
| Field | Description |
|---|---|
| Pin Name | Label shown on the map marker and in popups |
| Latitude Topic | MQTT topic publishing latitude (e.g., device/gps/lat) |
| Longitude Topic | MQTT topic publishing longitude (e.g., device/gps/lng) |
| Icon | Emoji icon displayed inside the map marker |
| Marker Color | Color of the pin marker and its glow |
Expected MQTT Payloads
topic: device/gps/lat → payload: 28.6139
topic: device/gps/lng → payload: 77.2090
Payloads must be plain numeric strings in decimal degrees.
Map pins use MQTT topics, not static coordinates. Your device publishes its position as separate lat/lng values, and the map updates in real time. The device topic prefix auto-fills.
MQTT Broker
IoT Dash connects to MQTT brokers over WebSocket (ws:// or wss://). Each app has its own broker configuration.
Browsers cannot use raw TCP MQTT (mqtt://). Your broker must support WebSocket connections. Most modern brokers (EMQX, HiveMQ, Mosquitto) have this on a separate port.
Broker Settings
| Field | Description | Default |
|---|---|---|
| Broker URL | Full WebSocket URL | IoT Dash Cloud preset |
| Username | MQTT auth username | — |
| Password | MQTT auth password | — |
| Client ID | Unique client identifier | Auto-generated |
| Keep-alive | Ping interval (seconds) | 60 |
| Clean Session | Start fresh each connect | true |
| Reconnect Period | Reconnect delay (ms) | 5000 |
| Connect Timeout | Connection timeout (ms) | 10000 |
Connection Status
| Status | Meaning |
|---|---|
| 🟢 Connected | Actively receiving messages |
| 🟡 Connecting | Establishing WebSocket connection |
| 🔴 Disconnected | Not connected — click "Connect" |
| 🔴 Error | Connection failed — check URL and credentials |
Broker Presets
| Preset | Provider | Auth | Notes |
|---|---|---|---|
| ⚡ IoT Dash Cloud | EMQX Cloud | Pre-filled | Built-in, works out of the box |
| 🦟 Mosquitto | Eclipse | None | Public test broker |
| 🐝 HiveMQ | HiveMQ | None | Public test broker |
| 📡 EMQX | EMQ | None | Public test broker |
| ☁️ HiveMQ Cloud | HiveMQ | Username/Pass | Free tier |
| 🌐 EMQX Cloud | EMQ | Username/Pass | Free tier |
| 🔧 Custom | Your own | Your config | Any WebSocket MQTT broker |
Use IoT Dash Cloud for the easiest experience. Pre-configured with auth and works with the simulator and ESP32 generator.
Simulator
The built-in simulator publishes random demo data to all your sensor topics without any hardware.
- Ensure you're connected to an MQTT broker
- Click ▶ Simulate in the connection bar
- Watch all widgets update with randomized values within their configured ranges
- Click ⏹ Stop to stop
The simulator publishes values within each sensor's configured min/max range, and random GPS coordinates for map pins.
Grid Layout
The dashboard uses a drag-and-drop grid powered by react-grid-layout v2.
Editing Layout
- Click 🔒 to unlock the layout (changes to 🔓 Editing)
- Drag widgets by the ⠿ handle in the top-left
- Resize by dragging the bottom-right corner
- Click 🔓 Editing to lock and save
Layout auto-saves with 800ms debounce.
Responsive Breakpoints
| Breakpoint | Width | Columns |
|---|---|---|
| Large (lg) | > 900px | 12 |
| Medium (md) | 600–900px | 8 |
| Small (sm) | < 600px | 4 |
Default Widget Sizes
| Widget Type | Default Width | Default Height |
|---|---|---|
| Gauge, Digital, 7-Segment, Stat, Status, LED, Progress | 3 columns | 2 rows |
| Terminal Log, Image Card | 6 columns | 3 rows |
| Button, Toggle, Slider, Number Input | 3 columns | 2 rows |
| Time-Series Chart | 6 columns | 2 rows |
| Map Widget | 12 columns (full width) | 4 rows |
| Data Table | 12 columns (full width) | 3 rows |
Data Table
A raw MQTT message log at the bottom of every dashboard. Shows recent incoming and outgoing messages with timestamps, topics, and payloads. Always present.
| Time | Direction | Topic | Payload |
|---|---|---|---|
| 14:32:06 | ⬇ IN | weather/roof/temp | 24.1 |
| 14:32:06 | ⬇ IN | weather/roof/humidity | 63 |
| 14:32:05 | ⬆ OUT | home/light/set | ON |
| 14:32:04 | ⬇ IN | farm/soil/moisture | 42.5 |
AI Dashboard Generator
Describe your IoT setup in plain English and the AI creates a complete dashboard with devices, sensors (automatically choosing appropriate widget types), controls, and map pins.
How It Works
- Click 🤖 AI Generate in the sidebar
- Describe your project (devices, sensors, what they measure, controls needed)
- Click Generate — AI analyzes your description and creates a blueprint
- Preview the generated devices, sensors, and controls
- Click Create Dashboard to apply it
Tips for Better Results
- Be specific: "ESP32 with DHT22 (temperature + humidity) and BMP280 (pressure)"
- Mention controls: "relay for water pump", "slider for fan speed"
- Mention locations: "GPS tracker on delivery van"
- Specify quantities: "4 room temperature sensors, 1 outdoor weather station"
Uses GPT-4o-mini via GitHub Models API (free tier: 150 requests/day). Results may not always be perfect — you can edit any widget after creation.
Theme (Light / Dark)
IoT Dash supports both dark and light themes. Switch using the theme toggle button in the sidebar footer.
How to Switch
- Open the sidebar (expand it if collapsed)
- At the bottom, click ☀️ Light Mode or 🌙 Dark Mode
- The theme switches instantly — all widgets, modals, charts, and maps adapt
Persistence
Your theme preference is saved to localStorage and persists across sessions. The theme is applied before React loads (via an inline script in index.html) so there's no flash of the wrong theme on page load.
CSS Variable System
The theme system uses CSS custom properties on the :root / [data-theme] selectors. All background colors, text colors, borders, shadows, and accent transparencies are driven by these variables:
| Variable | Dark Value | Light Value | Usage |
|---|---|---|---|
--bg-body | #0e0e16 | #f0f2f5 | Page background |
--bg-surface | #16161e | #ffffff | Sidebar, inputs |
--bg-card | #1e1e2e | #ffffff | Widget cards, modals |
--bg-elevated | #2a2a3e | #e4e4ed | Elevated elements |
--text-primary | #e0e0e0 | #1a1a2e | Main text |
--accent | #6c63ff | #6c63ff | Brand / accent color |
--border-subtle | #333 | #d5d5e0 | Borders |
New users start in dark mode. The sidebar toggle shows ☀️ to switch to light, and 🌙 to switch back to dark. Charts, tooltips, and the Leaflet map automatically adapt to the active theme.
ESP32 Code Generator
Click 📥 ESP32 in the connection bar to download a ready-to-flash Arduino sketch.
What's Included
- WiFi connection code (set your SSID/password)
- All broker presets as selectable blocks
- Sensor publish code — simulated values within your min/max ranges
- Control subscribe code — callbacks for each control topic
- Map pin GPS simulation — lat/lng near a base coordinate
- Auto-reconnect with configurable interval
Flashing Steps
Open the .ino file in Arduino IDE 2.x
Install PubSubClient library (Sketch → Include Library → Manage Libraries)
Set WIFI_SSID and WIFI_PASSWORD at the top of the file
Choose a broker preset (first one is default) or enter custom details
Select your ESP32 board and port → click Upload
Open Serial Monitor at 115200 baud to see connection status
Requirements
| Item | Details |
|---|---|
| Board | Any ESP32 (ESP32, ESP32-S3, ESP32-C3) |
| IDE | Arduino IDE 2.x |
| Library | PubSubClient by Nick O'Leary |
| Connection | Plain MQTT over TCP (port 1883) — no TLS |
The generated sketch publishes random simulated values. Replace the publishSensorData() body with real sensor readings (DHT22, BMP280, GPS module, etc.).
App Templates
Templates create pre-configured dashboards with mixed widget types in one click:
| Template | Sensors | Widget Types | Controls |
|---|---|---|---|
| 🌤️ Weather Station | Temp, Humidity, Pressure, Wind, Rain | Gauge, Progress, Stat, Digital, LED | — |
| 🏠 Smart Home | Room Temp, Light, Door, Motion | Stat, Progress, Status, LED | Toggle, Slider, Number Input |
| 🏭 Industrial IoT | Machine Temp, Vibration, RPM, Power, Status, Fault, Serial Log | Gauge, Stat, 7-Segment, Digital, Status, LED, Terminal | Button, Slider, Number Input |
| ⚡ Energy Monitor | Voltage, Current, Power, Energy, Grid Status | 7-Segment, Stat, Digital, LED | Toggle, Number Input |
| 🌱 Smart Agriculture | Soil Moisture, Soil Temp, pH, Humidity, Pump | Progress, Gauge, Stat, LED | Toggle, Slider |
All template widgets can be edited, deleted, or added to after creation.
Device Profiles
Device profiles let you save and reuse a device's complete widget configuration.
Built-in Profiles
| Profile | Contents |
|---|---|
| 📡 Weather Station | Temperature, humidity, pressure, wind sensors |
| 🔌 Smart Relay | Relay toggle + power sensor |
| 📍 GPS Tracker | Map pin with lat/lng topics |
| 💡 Light Dimmer | Brightness slider + light level sensor |
| 🌡️ Environment Monitor | Temp, humidity, pressure, air quality |
Custom Profiles
- Set up a device with all the widgets you want
- Right-click the device tab → Save as Profile
- When creating new devices, pick your saved profile from the profile picker
- Custom profiles can be deleted from the profile picker
Limits & Quotas
| Resource | Limit |
|---|---|
| Apps per account | 5 |
| Devices per app | 20 |
| Sensors per app | No hard limit (~50 practical) |
| Controls per app | No hard limit (~50 practical) |
| Map pins per app | No hard limit (~20 practical) |
| AI requests | 150/day (GitHub Models free tier) |
| Message history | Browser memory only (cleared on refresh) |
| Config persistence | Firestore (unlimited, cached in localStorage) |
IoT Dash stores your configuration (devices, widgets, layout, broker) in the cloud. Live sensor data (values, chart history, raw messages) is kept in browser memory only and lost on refresh. IoT Dash is a real-time visualization tool, not a data logger.
Tips & Shortcuts
| Action | How |
|---|---|
| Edit a device | Right-click the device tab |
| Edit a widget | Hover over it → click ✏️ |
| Delete a widget | Hover over it → click 🗑️ |
| Edit a map pin | Click the pin on the map → Edit |
| Unlock layout | Click 🔒 in the header bar |
| Drag a widget | Grab the ⠿ handle (layout unlocked) |
| Resize a widget | Drag the bottom-right corner (layout unlocked) |
| Open broker settings | Click ⚙️ in the connection bar |
| Toggle sidebar | Click ☰ in the header |
| Preview widget type | The sensor/control modal shows a live mini-preview as you configure |
| Add widget fast | Pick exact type from + Add Widget dropdown (no need to change type in modal) |
| Switch theme | Click ☀️ / 🌙 in the sidebar footer to toggle light / dark mode |
FAQ
Why can't I add widgets? The button is disabled.
You need a device first. Click + Device to create one, then widgets become available.
My widgets show "—" instead of a value.
No MQTT message has been received on that topic yet. Check that:
- You're connected to the broker (green status indicator)
- Your device publishes to the exact same topic string
- The broker allows the subscription (check ACLs if using authentication)
Can I use my own MQTT broker?
Yes! Choose "Custom Broker" in broker settings and enter your WebSocket URL (ws:// or wss://). Raw TCP (mqtt://) is not supported in browsers.
Why does my ESP32 use port 1883 but the dashboard uses 8084?
Browsers use WebSocket MQTT (port 8084 for WSS on EMQX). ESP32 uses raw TCP MQTT (port 1883). Both connect to the same broker through different protocol listeners.
What's the difference between Gauge and Stat Card?
Gauge shows a visual arc dial (like a speedometer) + generates a time-series chart. Stat Card shows a big number with trend arrow + min/avg/max — no chart. Choose Gauge when the arc visualization and chart history are valuable; choose Stat when trend direction and statistics matter more.
When should I use LED vs Status Card?
LED is compact (small dot) — best for dense dashboards with many indicators. Status Card is large with bold text — visible from across the room, best for critical statuses.
When should I use Slider vs Number Input?
Slider for approximate values in small ranges (volume, fan speed 0–100). Number Input for exact values or large ranges (setpoints, addresses, thresholds 0–10000).
How does the RGB Color widget publish data?
You choose the format when creating the widget: CSV (255,128,0), JSON ({"r":255,"g":128,"b":0}), or HEX (#FF8000). With auto-send enabled, every slider or picker change publishes immediately.
Can I switch between light and dark mode?
Yes! Click the ☀️ / 🌙 toggle in the sidebar footer. Your preference is saved automatically.
Is my data private?
Your dashboard config is stored in Firebase under your account. MQTT messages pass through the broker you choose — public brokers mean anyone can see your topics. Use IoT Dash Cloud or your own private broker for security.
What happens when I delete a device?
All sensors, controls, and map pins belonging to that device are permanently deleted.
Can I export data?
The Data Table shows raw messages during the session but they're not persisted. The ESP32 generator exports your configuration as an Arduino sketch. Data export is not currently supported.
What browsers are supported?
Chrome, Firefox, Edge, Safari — any modern browser with WebSocket support.
How does the AI Generator work?
It sends your description to GPT-4o-mini (via Netlify serverless function) which returns a structured JSON with devices, sensors, controls, and map pins. The app then creates all of them in one shot. Requires GITHUB_TOKEN environment variable in Netlify.