Bar Chart

One bar per signal, side by side. Three rooms, three tanks, three phases — the bar chart is for comparing now, not for watching over time.
What it does
Each signal you add becomes a bar whose height is its latest value. The scale is either read from the values (the tallest bar sets the top) or fixed between a minimum and a maximum, so bars stay comparable from one moment to the next.
When to use it
- Compare rooms, tanks, zones — the same measurement in several places.
- A three-phase or a multi-channel reading.
- A quick ranking — which one is highest right now.
Set it up
- Place it — In edit mode, tap + at the bottom of the dashboard and choose Bar Chart under Displays. Twelve columns wide and six rows tall is a good size.
- Add the signals — Tap the chart, open the Data tab, and tap + Add a signal for each bar you want — the same measurement in three rooms, say.
- Fix the scale — If the bars are compared over time, turn Read from the values off under Scale and set a minimum and a maximum, so the scale does not jump at every reading.
Settings
Tap the widget in edit mode: the sheet opens with a live preview at the top, then two tabs — Data for what it reads or writes, Appearance for how it looks.
Data — what it reads
Signal
| Setting | Type | Default | What it controls |
|---|---|---|---|
| Signal | list of signals | empty | The signals it draws, one bar each. Accepts Integer or Decimal signals. |
Scale
| Setting | Type | Default | What it controls |
|---|---|---|---|
| Read from the values | toggle | on | The tallest bar sets the top of the scale. |
| Minimum / Maximum | numbers | 0 / 1 |
A fixed scale, when the toggle is off. |

Appearance — how it looks
Title
| Setting | Type | Default | What it controls |
|---|---|---|---|
| Title text | text | empty | A title above the widget. Empty means no title. |
| Alignment | Left / Center / Right | Center | Where the title sits. |
Direction
| Setting | Type | Default | What it controls |
|---|---|---|---|
| Direction | Vertical / Horizontal | Vertical | Bars standing, or lying. |
Display
| Setting | Type | Default | What it controls |
|---|---|---|---|
| Grid | toggle | on | |
| Axes | toggle | on | |
| Legend | toggle | off |
Per signal
| Setting | Type | Default | What it controls |
|---|---|---|---|
| Color | colour | one per bar | |
| Label | text | the signal’s name | Printed under the bar. |
| Unit | text | the signal’s unit | Printed with the value. |

States
- Waiting for data — nothing has arrived yet on this signal; the widget shows a placeholder.
- Live — every value the device writes replaces the previous one.
- Device offline — the last value stays on screen; the device’s dot is grey in the device list.
Arduino device code
The address is all the device knows — I1 here; use the one the app gave your signal. In the sketch, one line per bar:
InstantIoT.write(I1, readTemperature());
InstantIoT.write(I2, readHumidity());
Complete sketch — Cloud
Paste it into the Arduino IDE, put your Wi-Fi and the token the app gave you, upload. It publishes once a second.
#include <InstantIoT.h>
const char* WIFI_SSID = "MyWiFi";
const char* WIFI_PASS = "MyPassword";
const char* DEVICE_TOKEN = "PASTE_TOKEN_HERE";
InstantTimer timers;
void publish() {
InstantIoT.write(I1, readTemperature());
InstantIoT.write(I2, readHumidity()); // two signals, two bars
}
void setup() {
InstantIoT.begin(WiFiLink(WIFI_SSID, WIFI_PASS), Cloud(DEVICE_TOKEN));
timers.every(1000, publish);
}
void loop() {
InstantIoT.loop();
timers.run();
}
Other connections
The widget block never changes. Only the begin() line says how the device reaches the app:
| Connection | begin() |
Devices |
|---|---|---|
| Cloud over Wi-Fi (above) | InstantIoT.begin(WiFiLink("MyWiFi", "secret"), Cloud(DEVICE_TOKEN)); |
ESP32 family, ESP8266, UNO R4 WiFi, MKR WiFi 1010, Nano 33 IoT, UNO WiFi Rev2 |
| Cloud over Ethernet | InstantIoT.begin(EthernetLink(), Cloud(DEVICE_TOKEN)); |
any board + an Ethernet shield |
| Direct — the device’s own Wi-Fi | InstantIoT.begin(AccessPoint("MyESP32", "12345678")); |
every board with Wi-Fi |
| Direct — Bluetooth LE | InstantIoT.begin(BLELink("MyESP32")); — #include <NimBLEDevice.h> first |
ESP32 family (not the S2) |
| Direct — Bluetooth Classic | InstantIoT.begin(BluetoothLink("MyESP32")); |
the original ESP32, Android only |
| Direct — a Bluetooth module (HC-05, HM-10) | InstantIoT.begin(SerialLink(Serial1)); — or SerialLink(13, 15) on ESP8266, SerialLink(10, 11) on UNO / Nano |
every board, radio or not |
| Your own InstantIoT Server (open source, at home) | InstantIoT.begin(WiFiLink("MyWiFi", "secret"), MyServer("192.168.1.42", DEVICE_TOKEN)); |
same as Cloud |
Direct needs no token: the phone is at the other end of the wire. See Connect for TLS, timeouts and what to do when it does not connect.
Any display works at the same address. A metric, a gauge and this widget on the same signal show the same value; the device does not change. Change the widget, not the sketch.
Notes
- Fix the scale when the bars are compared over time; an automatic scale rescales at every reading.
- Bars want the same unit. Temperature next to humidity is two charts.
Next
→ Advanced Chart — the same signals over time → Horizontal Level — one value as a bar