Backend Architecture

OpenEMS Backend runs on a (cloud) server. It connects the decentralized OpenEMS Edge systems and provides aggregation, monitoring and control via the internet. Internally it is built from loosely coupled OSGi services, most importantly:

  • Metadata (Metadata) - identification and authorization of Edges and Users.

  • Timedata (Timedata) - persistence and query of historic data.

  • Ui.Websocket - the WebSocket endpoint for the OpenEMS UI.

  • Edge.Manager - the service that manages the connected OpenEMS Edges.

  • Backend-to-Backend (Backend-to-Backend) - APIs for third-party systems.

1. Connecting OpenEMS Edge

An OpenEMS Edge connects to the Backend using its Controller.Api.Backend over a WebSocket connection. Historically the Edge-facing endpoint was a component running inside the central Backend server. To be able to scale to a large number of Edges, this endpoint was separated into its own application, the Backend.Edge.App, which can be deployed on one or more independent servers.

The general setup is:

   [OpenEMS Edge]        [OpenEMS Edge]        [OpenEMS Edge]      ...
        |                     |                     |
        |  WebSocket (Controller.Api.Backend)       |
        v                     v                     v
 +--------------------------------------------------------------+
 |                      Backend.Edge.App                        |   <- Edge-facing server(s)
 |         (accepts Edge connections, relays messages)          |      (one or more, scalable)
 +--------------------------------------------------------------+
        |
        |  WebSocket
        v
 +--------------------------------------------------------------+
 |                    OpenEMS Backend (central)                 |   <- Central server
 |   Edge.Manager  ·  Metadata  ·  Timedata  ·  Ui.Websocket    |
 +--------------------------------------------------------------+

The Backend.Edge.App acts as a proxy/relay between the OpenEMS Edges and the central Backend:

  • it accepts the incoming WebSocket connections from the Edges (authenticating each Edge by its API-key),

  • it relays messages in both directions between the Edge and the central Backend’s Edge.Manager, and

  • it keeps a local cache of connection state (e.g. the mapping of API-key to Edge-ID that it receives from the central Backend’s Metadata service).

Because the Backend.Edge.App handles the protocol towards the central Backend, the Edge Controller.Api.Backend does not need to be modified: an Edge always connects to a Backend.Edge.App, regardless of how many Edge-facing servers are deployed.

1.1. Deployment options

  • Scaled setup: run one or more Backend.Edge.App instances on separate physical servers, each connecting back to the central Backend’s Edge.Manager. This distributes the Edge connections across several machines.

  • Single-server setup: run a single Backend.Edge.App on the central server itself and let it connect to the Backend’s Edge.Manager on localhost. This is the simplest setup for small deployments.

The Metadata service on the central Backend supplies the Backend.Edge.App with the API-key to Edge-ID mapping. When using File-based Metadata, make sure it provides this mapping (see Metadata); the Odoo and Dummy Metadata implementations already do.