Runs standalone
The room's whole logic — components, blocks, scenes — executes on the device. No external box has to be alive for a guest to dim the lights.
Room automation firmware
by Roomio
Room automation firmware,
engineered like an operating system.
Noesis turns one controller into the room's brain: hardware I/O and field buses become clean software components, function blocks give them reflexes — with custom JavaScript when the built-ins are not enough — and everything is scriptable over a clean RPC API.
The runtime
Every room runs its full logic on the device and links up to Roomio's cloud GRMS for property-wide control. The cloud makes the whole estate manageable from one screen; the edge keeps each room running even when the link is gone.
Noesis is a single ESP-IDF firmware build. The C5's dual-band radio keeps the web UI, the API and the cloud uplink responsive even in crowded hotel RF; BLE handles first-boot onboarding from a phone; and the silicon's 802.15.4 radio runs Zigbee today, with Thread and Matter in reach.
Edge + cloud
The room's whole logic — components, blocks, scenes — executes on the device. No external box has to be alive for a guest to dim the lights.
Every controller links up to Roomio's Guest Room Management System: property-wide dashboards, PMS integration, remote config and fleet OTA from one screen.
If the gateway or uplink dies, the room keeps running on local logic and last-synced config — then reconnects and back-fills the event journal when the link returns.
Connectivity
Onboard media come up out of the box. Expansion cards are detected at boot and their protocol stacks load as native components — same image, no reflash, no special build.
Onboard
The wired backbone: web UI, RPC, MQTT and Modbus TCP served over one cable, with the radio as fallback.
Dual-band with WPA3. The 5 GHz side keeps management traffic smooth where 2.4 GHz is a battlefield.
Two independent buses with their own polling engines and power supply.
Coordinator on the C5's native 802.15.4 radio — no card needed. Battery sensors and remotes join as input components.
Expansion cards
Architecture
Every capability is a module with a contract. Higher layers only ever talk to the contract below them — which is why a Modbus fan coil, a DALI ballast and an onboard relay all feel identical from a scene, a script or the API.
Every relay, input, dimmer or Modbus register block implements the same interface: typed config, live status, events, and its own RPC namespace.
Function blocks subscribe to component events and drive component outputs. They never touch hardware directly, so logic survives hardware changes.
One trigger, many coordinated changes. Scenes are declarative data — diffable, exportable, and safe to hand to non-programmers.
Because every module self-describes, the web UI and the API surface appear automatically for anything you add — including store imports.
Components
Each I/O group and each bus device is its own component: isolated, self-describing, individually configurable — and addressable over the API as type:id.
Function blocks
A function block bundles components with behavior: inputs, outputs, parameters, state. Install one from the store, wire it in the flow editor — or write your own, in JavaScript.
Up/down interlock, travel-time calibration, tilt steps and group commands. Exposes the Cover.* RPC namespace.
Keycard and switch state drive the corridor DND light, mute the doorbell and flag the room to the PMS over API or MQTT.
Guest requests housekeeping from the bedside; the flag clears at the door and every transition lands in the event log.
Hysteresis or PI control of valve plus 3-speed fan, from any temperature source — an NTC on AD I/O or a Modbus FCU register.
Fuses keycard holder, door contact and PIR into one occupancy truth that scenes, HVAC and the minibar can rely on.
Watches a Modbus energy meter, sheds noncritical loads on threshold, and journals consumption per stay.
When a built-in block is not enough, write one. Script blocks run sandboxed on-device with CPU and memory budgets, subscribe to any event on the bus, call any RPC method, and keep state in a persistent key-value store. Publish yours to the store as a signed package when it is good.
Scenes
Scenes are named room states. They call components and function blocks in one coordinated move — and because they are data, staff can edit them in the web UI without touching logic.
Flow editor
The configurator embeds Svelte Flow: drag components and blocks onto the canvas, connect ports, hit deploy. The graph compiles to the exact same primitives the API drives.
@xyflow/svelte · drag the nodes · swipe to pan · live values ride the wires
Dynamic Modbus
Modbus devices are described, not hardcoded. An electronic datasheet — a signed JSON register map — teaches Noesis a new device at runtime.
From the store, from a vendor file, or from a colleague's export. Versioned and signed.
Typed values with scaling, units, enums and poll groups. Writable registers become RPC setters with validation.
Tiles show up in the web UI, a modbus:<name> namespace opens on the API, and changes publish as events.
| name | fn | addr | type | scale | unit | live |
|---|
Point-and-click register mapping with live read preview from the connected bus — then export, reuse across rooms, and share.
The store
Modbus datasheets and function blocks are packages: signed, versioned, one-click importable from the built-in store — or side-loaded from a file on air-gapped sites.
Configuration
The whole configurator is a Svelte single-page app living on the device: components, blocks, flows, Modbus, store and system — live over WebSocket at http://noesis.local.
Illustrative mockup — not a final UI design.
RPC API
Every component and block exposes methods in its own namespace — callable over HTTP GET, JSON-RPC 2.0 on WebSocket, or MQTT. Status changes push to every connected client as NotifyStatus frames — no polling, ever.
Platform services
Cron-style timers plus sunrise / sunset from the site's coordinates.
A/B partitions, staged rollout, automatic rollback on a bad boot.
Per-user roles, digest auth, optional TLS, signed store packages.
The whole room — config, blocks, scenes, datasheets — one JSON export.
Ring-buffered log of inputs, RPC calls and block decisions, filterable per component.
Native MQTT client with HA discovery: every component announces itself.
First-boot provisioning from a phone: network, room name, admin key.
Heap, latency and bus-health counters; the supervisor restarts what misbehaves.
Summary
Integrators get firmware access, datasheet tooling and store publishing through the Roomio Partner Portal. Operators get a demo room wired to their PMS.
Concept preview. Functionality and specifications subject to change.