TL;DR
By drawing inspiration from solutions in other domains, we should embrace a firmware-less approach for smart devices, ensuring greater flexibility, security, and long-term adaptability.
By centralizing device firmware on a hub or edge device, we eliminate redundant feature development across multiple devices. This reduces development and support costs but also simplifies maintenance.
Recap
In the previous post, we highlighted some (though certainly not all) of the challenges involved in building a smart device, focusing primarily on unforeseen costs and complications.
Post-sale costs often catch developers and customers off guard. Many products unexpectedly reach their end-of-support, leaving users with expensive devices they can no longer use at full capacity. This creates adoption anxiety, slowing the widespread integration of smart devices into our lives. Combined with high prices, poor security, and multiple cumbersome applications, these issues become significant barriers to adoption.
As companies and developers, we have a responsibility to support our customers to the best of our ability. Building smart devices isn’t just about innovation—it’s about ensuring long-term usability, security, and trust.
Rationale
Let's consider a few real-life scenarios:
- When traveling from New York to Tokyo, most people don’t buy or even rent a private jet: they share existing infrastructure.
- You don’t need separate computers for Microsoft Word and email: one device can handle multiple tasks.
Similarly, many features we expect from smart devices should be shared across multiple systems, rather than being duplicated on individual devices:
- Internet connectivity.
- User interfaces (local control panels, web interfaces, mobile apps).
- User authentication.
- Security and over-the-air updates.
- Data collection.
In many cases (especially in a smart home setup) computing resources can also be shared. Input methods, CPU, memory, and graphics are often underutilized, making resource pooling a practical and efficient approach.
The very same idea we applied in serverless computing could be applied here: that's why I'm calling this firmware-less (with or without hyphen? leave a comment).
An Overview
Let's compare a possible traditional approach with a firmware-less approach.
A Traditional Approach
Our traditional smart thermostat is engineered somehow like this:
The fragmentation of interfaces and connectivity across smart home devices leads to redundancy, inefficiency, and complexity. Every new addition (whether an AC unit, alarm system, or smart speaker) introduces another screen, remote, or app, making interaction cumbersome instead of seamless.
A Firmware-less Approach
A more integrated approach could streamline smart home management, reducing unnecessary duplication and clutter while enhancing usability. Centralized control, shared UI frameworks, and edge computing could help consolidate resources so devices operate more efficiently and cohesively.
Smart devices could be thin clients, connecting to a hub that handles processing and UI rendering. Think of it like how cloud gaming works: instead of every gaming device needing high-end hardware, a central server does the heavy lifting.
At first both approaches seem similar but note a few differences:
- The edge device hosts our firmware (in theory our thermostat wouldn't even need a microcontroller at all).
- All the expensive resources are shared: the edge device hosts multiple firmware and they all share CPU, memory, Internet connection, UI and cloud services.
- Running on the same device it's easy for multiple applications to expose their own services and to use other services, when available, to add functionalities.
Which are the advantages?
- Lower development costs – Comparable to a traditional non-smart device.
- More affordable – Potentially cheaper than both other smart devices and even traditional non-smart thermostats.
- No running costs – Updates are only required for the hub, which can be sourced by the user from any vendor and maintained via a subscription program.
- Long-term relevance – Your product remains secure and up-to-date without additional company costs.
- Better user experience – Simplifies interactions and eliminates redundant interfaces.
- Stronger security management – Centralized control ensures consistent updates and authentication.
-
A service-oriented approach – Enables exciting possibilities:
- Your AC unit could integrate with the alarm system to detect occupancy, optimizing energy use or adjusting when windows are open.
- Your floor-cleaning robot could serve as an additional security layer within your alarm system.
- Automation tasks become easier to set up (we all love Node-RED but it's not for everyone!)
- Write a comment if you can think of other integration!
Of course, there are technical challenges to address, and we will explore them in the next post. However, this is not a disruptive approach: we already have all the necessary tools, and these patterns have been successfully tested across various industries and applications. Rather than reinventing the wheel, we should embrace a sustainable and efficient solution.
Top comments (2)
An alarm system is one of the most pervasive devices in any (smart) home, with various sensors placed throughout to detect presence and intrusions. These sensors could be shared across devices (aligning perfectly with the spirit of this approach).
For example, a floor-cleaning robot could use this data to prioritize cleaning the rooms where you spend the most time or to clean immediately after you leave a room.
Establishing communication protocols between services is essential, but the biggest challenge I can see is offloading a firmware to an unknown edge device. While an interpreted language like JavaScript or Python could work, it would be highly limiting. Containerized applications (Docker-style) might offer flexibility, but they are resource-intensive and wouldn’t fully resolve compatibility issues across different architectures (CPU, OS, etc.)
Thank you for your feedback!
This is a very good point. A "client" device could/should share its own resources (as a service) to offer additional functionalities to the whole system. In an ideal world I'd imagine a simple "discovery" protocol to allow each firmware to search and use what's in the system without forcing the user to setup automation tasks.
This is one of the points we're going to discuss in the next post.
Currently we have things like MicroPython (or CircuitPython) and tiny JS engines like JerryScript (and a few more others I can't remember) but you're right in saying that it would be extremely limiting (and possibly sub-optimal from a performance point of view).
Containers would run with relatively inexpensive hardware but they have the problem you mentioned.
One of the possible solutions we explored is based on WebAssembly, it has some VERY promising characteristics and we're going to talk about it in another post.