Skip to content
Internet of Things data server implementing Open Messaging Interface and Open Data Format
Branch: master
Clone or download
Pull request Compare This branch is 93 commits behind AaltoAsia:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

O-MI Node Server Latest release Build Status Coverage Status Codacy Badge Join the chat at

Table of Contents

  1. Introduction
  2. Development status
  3. Resources
  4. Dependencies
  5. Running
  6. Compiling and Packaging
  7. Setting up a development environment
    1. Setting up IDE
  8. sbt help
  9. Configuration
  10. FAQ


Internet of Things data server. Implementation of O-MI Node as specified in Open Messaging Interface (O-MI) v1.0 standard with Open Data Format (O-DF) standard. It is intended to be as reference implementation that shows how these standards work in more detail. See for more details.

O-MI can be used to query or update data, but also to set up data streams with subscriptions. It means that the standard can be used to make peer-to-peer like connections, but it can also be used in traditional client-server setup. O-MI standardises the requests with XML, and they can be sent with almost any text based protocol. This implementation supports http, https and websocket.

O-DF is a simple object hierarchy format defined in XML. O-DF is used as data payload in O-MI. O-DF can be thought as a file structure with directories which are Objects and files which are InfoItems. O-MI also supports use of any text based data format, but request semantics might be more ambigious. Payloads other than O-DF are not yet supported in this implementation.

Questions or problems with the server or the standards can be posted to Issues, email or gitter chat. Join the chat at

Development status

All important features are working, but the project is in kind of beta phase where things are not yet very optimized and malicious requests might cause crashing. However, the project can be used in production if the server has low risk profile or authentication.

For large amounts of data, it is not recommended to use the default value history database. Instead, it can be disabled or changed to InfluxDB, see FAQ for instructions.

O-MI Node can be extended with special request logic which can be implemented with "agents". Different authentication and authorization mechanisms can be implemented via auth apis. New databases can be implemented with DB interface. Other payloads than O-DF cannot yet be implemented.

See development branch for latest progress.




Download the pre-compiled zip, tgz or debian package from latest git releases here. Latest release

Extract the zip file and navigate to the /bin directory To run O-MI Node run the corresponding startup script from the bin directory for your OS:

  • bin/o-mi-node.bat for Windows
  • bin/o-mi-node for Unix and Mac

This will run O-MI Node with configuration in /conf/application.conf. By default it will start at url http://localhost:8080/ and has some example and demo agents. More Information in the Configuration section.

Compiling and packaging

  1. Follow the instructions 1-4 in Setup development environment below
  2. run sbt universal:packageBin (For other package types, use sbt release)
  3. Result can be found in ./target/universal/

See SBT Universal Plugin for more packaging methods.

Setting up a development environment

  1. git clone
  2. Install sbt
  3. (on windows: logout, or put sbt into PATH yourself)
  4. Open a cmd or shell to the O-MI project directory
  5. Then run sbt and in opened the ">" prompt run reStart to compile and run the Node
  6. Visit http://localhost:8080/ to see that it's working

You can check the Simple Build Tool cheat sheet section to learn more

Setting up IDE

  • IntelliJ IDEA
    1. Install the IDE
      1. Download and install IntelliJ IDEA
      2. When running for the first time install Scala from the 'Featured plugins' tab (you can also install Scala plugin later from Settings/plugins)
      3. Open the IDE
    2. Import the project
      1. Select import project -> select O-MI directory and click OK
      2. Select import project from external model and select SBT and then click Next
      3. For the 'Project JDK' select 'New...' and select JDK and then locate your JDK 1.8 folder and select it and click Finish
      4. When prompted to select modules to include in the project, select: root, agents and omiNode and then click OK
      5. Wait for the IDE to finish indexing the files (might take a few minutes)
  • Eclipse
    1. Run sbt eclipse
    2. Open Eclipse IDE
    3. Select File->import Existing Projects into Workspace

Simple Build Tool cheat sheet

Native SBT commands

  • sbt compile: just compile the project
  • sbt clean: remove compiled and temporary files
  • sbt run: run the project; We don't use this much, so sometimes it's broken and we don't even notice. We use re-start from Revolver which allows us to recompile and restart the node without exiting sbt, because restarting sbt takes unnecessary extra time.
  • sbt doc: compile api documentation
  • sbt test: run all tests

Extra commands from plugins and other

  • We use sbt-revolver: run sbt and then write
    • reStart: compile&run the project in background
    • reStop: close the background process
  • We use sbt-native-packager:
    • sbt stage: creates file structure, used in packaged version, to the ./target/universal/stage/ directory
    • sbt debian:packageBin: create release debian package (requires dpkg program installed)
    • See native packager docs for configuring other packages. Our sbt configuration is in ./build.sbt.
  • We use sbt-scoverage:
    • sbt clean coverage test coverageReport: calculate test coverage and generate reports in O-MI-Node/target/scala-2.11/scoverage-report/
  • We also have some extra commands for convenience:
    • sbt systemTest: run only system tests (the used requests and responses can be found in ImplementationDetails.html)
    • sbt release: create release tar and zip packages

extra info:

  • automatically run any of above commands when there is a file change by adding ~ in front, like sbt ~re-start
  • all commands above compiles the needed files that are not yet compiled
  • run many commands in sequence faster if you open a single sbt command line with sbt


Basic configuration

See reference.conf for the defaults and configuration documentation.

Configuration Location

  • In package releases: /etc/o-mi-node/application.conf
  • In tar and zip releases: ./conf/application.conf
  • In development environment: ./O-MI-Node/src/main/resources/application.conf (create a new file if not found)
    • Default values are stored in ./O-MI-Node/src/main/resources/reference.conf

Library Config

application.conf can also have a lot of Akka (threading framework and HTTP server) and Slick (database) specific settings:

Optional components

  • branch warp10integration has experimental integration to Warp10 as the DB backend.
You can’t perform that action at this time.