Have you ever walked into a hotel where everything looks perfect – a beautiful lobby, minimalist design, lighting that perfectly accentuates the architecture, and a welcoming scent? Most of us have probably experienced this, but when it comes time to check in, you approach the reception desk and see a screen with a stark dashboard, like something out of a factory? Is this how the Thingsboard dashboard should look in an elegant hotel that cares about every detail? Definitely not.
Why is the standard dashboard just the beginning?
This was the exact view one of our customers had. Their system was running on ThingsBoard CE. Data from the sensors came in perfectly – temperatures, humidity, energy consumption, and door statuses were all technically correct. However, the user experience failed to match the hotel’s style at all.
The reception area was minimalist, neat, with a modern design, warm wood, and golden accents – yet the dashboard looked like a screen from some lab. Green and yellow graphs, blue lines, and fonts that felt like Windows XP made it impossible not to notice. On top of that, employees complained that they had trouble finding their way around it. The manager’s request summarizes our goal: “We don’t want it to look like the old system. We want it to look like our hotel brochure.” That was the crux of the problem: transforming the raw ThingsBoard interface into something stylish, intuitive, and easy to use.
Why Choose ThingsBoard for IoT?
ThingsBoard is a great piece of software. Really. Open-source, stable, well-documented. You can put it in Docker and have a working IoT system in half an hour. But it looks… as if it was designed by a team of engineers, not someone who ever thought about UX. And that’s a problem when the data is supposed to appear not in a factory, but in a hotel. That’s why we took a human approach. No magic. Just step by step. From determining what should be visible to presenting it as clearly as we can.
The three levels of ThingsBoard customization we apply
Level 1 - Basic Thingsboard IoT dashboard customization (for everyone)
The first stage of work focused on cosmetics, without interfering with the code. We changed the colours, logo and overall layout. The background was replaced with something calmer, matching the colours of the hotel. We replaced the raw indicator tiles with simpler, larger indicators with icons.
Example IoT Dashboard Layout:
- Top: General information – occupancy, lobby temperature, alerts.
- Middle: Charts.
- Right side: Minor messages, e.g. “room 107 – door open too long”.
How to set a logo in Thingsboard?
We solved the problem of not being able to change the global logo in the CE version of the interface by adding the logo as a simple Image widget directly to the dashboard. Although this is a technical workaround, it is unnoticeable to visitors and significantly improves the aesthetics for employees.
How to get dashboard alias data?
We introduced data aliases instead of raw device IDs, using names such as ‘Main Building’ or ‘West Wing’. This was a key change that made the dashboard universal. To make it work in another hotel in the chain, all we had to do was change the aliases, without having to modify the code.
Thanks to these changes, the system began to look more ‘human’. The reaction of the receptionist, who had previously avoided working with the dashboard, was very positive: ‘Oh, now it looks like part of our system, not like an external programme.’
Level 2 - Widget Editor: serious Customization (for developers)
The next stage of work focused on using the Widget Editor in ThingsBoard – a special environment (mini-IDE allowing the use of HTML, CSS and JS) for creating custom, interactive widgets. The goal was to make the dashboard not only look good, but also actively support employees.
We introduced several key interactive elements: we created tiles with room status colors (green – free, blue – occupied, grey – cleaning); we added tooltips to charts that immediately informed users which floor was the largest energy consumer; and the new kitchen chart – visualizing guest preferences and the number of people who had not yet arrived for dinner – proved to be a great success. The chefs, in particular, received this solution with great enthusiasm.
At the same time, we took care of the aesthetic details that build a consistent brand image: gently rounded corners, gradients and subtle shadows under the cards. All this was achieved with a minimum of code, which made a big impression on the technical staff. Also the reaction of the manager was memorable. After clicking on the chart, he asked if it was really possible to do this without filtering and exporting to Excel. The answer was yes, even without the Professional Edition.
Level 2 in practice - room status tile (code example in Widget Editor)
{{settings.roomLabel || 'Room 101'}}
UNKNOWN
/* Base tile layout */
.tile {
display: grid;
grid-template-rows: auto 1fr auto;
gap: 8px;
padding: 14px;
border-radius: 14px;
background: #ffffff;
box-shadow: 0 2px 10px rgba(0,0,0,0.06);
height: 100%;
box-sizing: border-box;
font-family: Inter, system-ui, sans-serif;
}
.tile-header { display: flex; align-items: center; }
.tile-title { font-weight: 600; font-size: 14px; color: #2d3748; }
.tile-body {
display: flex; align-items: center; justify-content: center;
gap: 10px; min-height: 64px;
}
.status-text { font-size: 22px; font-weight: 700; letter-spacing: .5px; }
.status-dot {
width: 14px; height: 14px; border-radius: 50%;
border: 2px solid rgba(0,0,0,0.06);
}
/* Color states (applied by JS) */
.state-vacant { color: #2f855a; } /* green */
.state-occupied { color: #3182ce; } /* blue */
.state-cleaning { color: #b7791f; } /* amber */
.state-alarm { color: #e53e3e; } /* red */
.state-unknown { color: #4a5568; } /* gray */
.dot-vacant { background:#38a169; }
.dot-occupied { background:#4299e1; }
.dot-cleaning { background:#d69e2e; }
.dot-alarm { background:#e53e3e; }
.dot-unknown { background:#a0aec0; }
.tile-footer {
font-size: 12px; color: #718096;
text-align: right;
}
/*
Room Status Tile (ThingsBoard CE widget)
Reads the latest telemetry key "room_status" and renders a color-coded tile.
Expected values (case-insensitive): VACANT | OCCUPIED | CLEANING | ALARM
Works with any string – unmapped values fall back to UNKNOWN.
Authoring tips for the article:
- The widget demonstrates Level 2 customization: custom HTML/CSS/JS,
live reaction to telemetry, and configurable labels/colors via settings.
*/
let els = {};
let classes = {
VACANT: { text: 'VACANT', textCls: 'state-vacant', dotCls: 'dot-vacant' },
OCCUPIED: { text: 'OCCUPIED', textCls: 'state-occupied', dotCls: 'dot-occupied' },
CLEANING: { text: 'CLEANING', textCls: 'state-cleaning', dotCls: 'dot-cleaning' },
ALARM: { text: 'ALARM', textCls: 'state-alarm', dotCls: 'dot-alarm' }
};
const UNKNOWN = { text: 'UNKNOWN', textCls: 'state-unknown', dotCls: 'dot-unknown' };
function normalize(v) {
return (v || '').toString().trim().toUpperCase();
}
function clearStateClasses() {
const all = ['state-vacant','state-occupied','state-cleaning','state-alarm','state-unknown'];
const dots = ['dot-vacant','dot-occupied','dot-cleaning','dot-alarm','dot-unknown'];
all.forEach(c => els.text.classList.remove(c));
dots.forEach(c => els.dot.classList.remove(c));
}
function render(statusRaw, ts) {
const key = normalize(statusRaw);
const cfg = classes[key] || UNKNOWN;
clearStateClasses();
els.text.textContent = (self.ctx.settings.labels && self.ctx.settings.labels[key]) || cfg.text;
els.text.classList.add(cfg.textCls);
els.dot.classList.add(cfg.dotCls);
els.footer.textContent = ts ? `Updated: ${new Date(ts).toLocaleString()}` : '';
}
/* ThingsBoard widget lifecycle */
self.onInit = function () {
els.text = document.getElementById('status-text');
els.dot = document.getElementById('status-dot');
els.footer = document.getElementById('tile-footer');
// Allow custom label overrides from settings (optional)
// Example in Settings JSON:
// { "roomLabel": "Room 101", "labels": { "VACANT": "READY", "OCCUPIED": "IN USE" } }
// Initial state (before data arrives)
render('UNKNOWN', null);
};
self.onDataUpdated = function () {
// Access default subscription for latest telemetry
const sub = self.ctx.defaultSubscription;
if (!sub || !sub.latestData || !sub.latestData.room_status) {
render('UNKNOWN', null);
return;
}
// latestData. is an object with { ts, value }
const latest = sub.latestData.room_status;
render(latest.value, latest.ts);
};
self.onResize = function () {}; // Not needed, but part of the API
self.onDestroy = function () {}; // Cleanup if you add timers/listeners
/* Expose user settings in the widget editor (optional but nice for Level 2) */
self.getSettingsSchema = function () {
return {
schema: {
type: 'object',
properties: {
roomLabel: { title: 'Room label', type: 'string', default: 'Room 101' },
labels: {
title: 'Custom status labels',
type: 'object',
properties: {
VACANT: { type: 'string', default: 'VACANT' },
OCCUPIED: { type: 'string', default: 'OCCUPIED' },
CLEANING: { type: 'string', default: 'CLEANING' },
ALARM: { type: 'string', default: 'ALARM' }
}
}
}
}
};
};
/* Declare expected data keys so the user can bind telemetry without coding */
self.getDataKeys = function () {
return [
// Latest telemetry key that drives the tile
{ type: 'latest', name: 'room_status', label: 'Room status', required: true }
];
};
Level 3 - architecture, or making sense of it all
The transition to ThingsBoard Professional paved the way for true systems engineering. We realised that it is not the data itself that is key, but the context in which it is presented.
Using wireframes, we precisely determined for whom and where specific dashboards should appear. We planned the construction of unusual visualisations using the Widget Editor, as well as the integration of external 3D libraries for dynamic rendering of building floors.
What is an "Asset" in Thingsboard?
ThingsBoard defines every physical and logical unit – like the hotel, a room, or the restaurant as an Asset, each capable of having its own devices, data, and relationships. We then utilized these inherent relationships to build an intuitive navigation system grounded in visualizations and context.
How were the dashboards personalised for each department?
We implemented a system where clicking on a hotel name opens a personalized screen displaying only the necessary information. This design eliminates the need to search through complex lists and filter data. Instead, each department now has its own dedicated view:
- Reception: A simple panel with room occupancy, alerts and basic indicators.
- Technician: Handy views of temperatures, sensors and control buttons.
- Kitchen: Live data on their operations.
- Rooms: A small AI agent on a round screen shows the status of the environment and a control panel.
- Management: Key financial indicators: energy costs, consumption and monthly trends.
All views are now assigned directly to the user. This means that after logging in, the employee immediately sees their world – personalized, context-specific information – without unnecessary options or the risk of making a mistake. Crucially, this eliminates the need for manual switching between dashboards.
It is this third level of sophistication that has made ThingsBoard no longer be seen as an engineering tool, but rather as a fully functional, intuitive hotel system.
What are the business benefits of using Thingsboard dashboards for IoT?
Technology is important, yes, but a successful hotel or any hardware product company, for that matter, is run by people. Every department has its own unique perspective and needs. The Front Desk expects simplicity and quick answers. Our Embedded Engineers need fine-grained control and reliable data feeds. And the Management team? They just want concrete, quantifiable results – no guesswork.
What we found when implementing personalized ThingsBoard dashboards is that we were essentially building contextual transparency for everyone. By doing this, we were able to give different roles the right view of the same single source of truth, without compromising the integrity of the underlying data stream.
This seemingly simple feature giving the right data to the right person cuts down on internal friction and speeds up operations significantly. We see several immediate, tangible benefits for our clients:
How can ThingsBoard dashboards minimize manual reporting time for engineers?
The technician saves hours previously wasted on compiling manual reports because the Management team now has instant, real-time access to energy consumption trends, device reliability metrics, or occupancy rates. This reduction in the operational burden on internal teams is key.
How do customized IoT dashboards improve incident response time?
The Front Desk worker doesn’t have to call an engineer about a high-temperature sensor in Room 212 anymore; they see the status immediately, often with suggested actions. This streamlined process significantly reduces response time, thereby freeing up technical bandwidth and accelerating feature development.
Can ThingsBoard provide trustworthy data for executive decision-making?
I remember the CEO, checking the energy usage graph on his phone, saying, “Finally, something that makes sense.” That kind of direct access, reducing dependencies and improving response time, is a real business benefit – it’s how you manage based on verifiable data, not on assumptions.
Great IoT dashboard it's not just about looks, it's about trust
The project goes far beyond just a “nicer look.” It was a genuine step toward running the entire operation from Smart City sensors to Medical Devices based on verifiable, transparent data.
And that brings us to the last, critical part: trust. When a dashboard is reliable, operates consistently, and speaks the correct language to diverse roles (from receptionist to engineer to CEO), people actually use it long-term. This trust factor, the assurance that the tool is a genuine, stable operational asset and not just a gimmick is often what determines if the project truly “lives” long after we’ve completed the deployment. It sounds simple, but for complex embedded systems, that human confidence is foundational to long-term success.
Taking Your ThingsBoard implementation further
If you’re currently using ThingsBoard dashboards, either in a hotel setting or any environment where data needs to be operational and presentable, we often find clients stuck at the foundational layer.
- Initial Setup (The Basics): Everyone handles the basic colors, layout, and branding. That’s necessary, but it’s only the start.
- Contextualizing Data (Real Value): The real architectural challenge is using the Widget Editor to build meaningful interactions: custom tooltips, drill-down capabilities, and complex data relationships. This is where we build the logic that saves your engineers time.
- Systemic Integration (Scalability): The ultimate goal leverages Asset and Device Relations to create a systemic view. Imagine: such a systemic view provides every department, every floor, and every device group with its own specialized dashboard, all connected to the single source of truth. At this point, your dashboard stops being just another data panel and becomes a genuine, integrated element of your business architecture.
Do you have a ThingsBoard dashboard and want to move past the basics? Are you ready to transform it into the resilient, systemic tool that actively supports your operational KPIs? If so, let’s talk about the next step. Tell us about your current deployment and business goals, and we will propose the technical roadmap to make your data truly actionable and architecturally sound.












