Only this pageAll pages
Powered by GitBook
1 of 76

Public Documentation

Loading...

Loading...

User Guides

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Deploying MobiusFlow On-Prem

These subsections explain deploy MobiusFlow On-Prem.

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

MobiusFlow Raspberry Pi Connector

Loading...

Loading...

Technical Training Guides

Repository of Technical Training walkthrough guides

Loading...

Technical Docs

Loading...

Loading...

Loading...

Loading...

Loading...

Security

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

MobiusFlow Services

DALI Lighting

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Flows

Loading...

Loading...

Loading...

Loading...

Licencing

Loading...

Loading...

Welcome

Welcome to the MobiusFlow® documentation

MobiusFlow® connects, controls and communicates with 1000s of sensors and control devices to provide actionable insights and automated responses. Developed and successfully deployed with many projects over the past 17 years by engineers with first-hand experience in project management and installation such as CBRE, Ingram Micro, TD Synnex and IBM.

Whether you are looking for a full walkthrough or just dipping in to get more information about a single topic, our documentation site is the perfect companion to the training courses on our main site.

📖 User Guides

The user guides are instructional walkthroughs. Follow these guides from start to finish or jump to a section to learn how to perform specific tasks.

⚙️ Technical Docs

Looking for more detailed technical information? These articles dive deeper into the more technical aspects of MobiusFlow®, from Architecture to API details, ports, protocols, configuring services creating flows, and more.

Our documentation is always improving and we are adding new articles each week, so come back often to see whats new.

We need your help to improve. Please rate the articles and raise support tickets to tell us where we can improve, what articles are missing, and point out any errors.

Getting Started

What is MobiusFlow®?

MobiusFlow® is a middleware software application

MobiusFlow® connects, controls and communicates with 1000s of sensors and control devices to provide actionable insights and automated responses. Developed and successfully deployed with many projects over the past 17 years by engineers with first-hand experience in project management and installation such as CBRE, Ingram Micro, TD Synnex and IBM.

Administration

The Administration page covers user management, backup and restore, licence settings, security as well as setting the node's Hub ID. The page is divided into corresponding tabs accordingly.

User administration

Users can be added, modified and deleted from within the User Management Tab on the Administration page.

Backup/Restore

Setting the Hub ID

MobiusFlow Toolbox

MobiusFlow Toolbox is the User Interface allowing users to configure and interact with MobiusFlow engine.

MobiusFlow Manager

MobiusFlow Manager is the management platform MobiusFlow customers can use to the self-manage their MobiusFlow instances.

Service and Object Configuration

For MobiusFlow 1.x.x only

  1. The main menu

  2. The services palette

  3. The objects palette

  4. The configuration tree

  5. The service and object configuration section

The main menu

The main menu is displayed on all pages. It allows switching between Configuration, Diagnostics, Node-RED Flows and Administration. The Administration option is only shown for users who have admin privileges.

The services palette

The services palette shows the list of Mobius services that can be added to the configuration. To add a service to your configuration drag it from the services palette and drop it on to the configuration tree.

The objects palette

The objects palette shows the list of Mobius objects that can be added to the configuration. To add an object to your configuration drag it from the objects palette and drop it on to a service in the configuration tree.

The configuration tree

The configuration tree shows the services and objects currently added to the configuration. Clicking on the triangles on the left of the tree either expands or contracts a branch of the tree. The currently selected item is shown as highlighted in orange.

To delete a service or object, hover over the item and click on the dustbin icon which appears to the right of the item.

Deleting a service deletes all associated objects

The service and object configuration section

This section is dynamic and updates depending on which item has been selected in the configuration tree. If a service has been selected the service's configuration properties are displayed. Similarly, selecting an object or object resource shows the relevant configuration options.

Always click the Save Changes button to persist changes to a service, object or resource configuration. Any changes to a service, object or resource only become active after the service has been restarted on the diagnostics page.

Diagnostics and Service Control

For MobiusFlow 1.x.x only

Service diagnostics and control

The service diagnostics and control page shows all of the configured services, their current status and controls to start and stop services.

Run state column

The Run State column (2) shows the current run state of the services in a traffic light. The colours are defined as follows:

  • Grey - Not running, never started

  • Red - Not running, manually stopped

  • Amber - Starting or attempting to start

  • Green - Running

Actions column

The Actions column (3) has start / stop buttons for each service. Services can be manually started or stopped by clicking on the action buttons.

Service status column

The service status column (4) shows the current status of all running services. In addition to a text message, the statuses are colour coded as follows:

  • Amber - starting or status unknown

  • Red - service is running but in fault (see text message for details)

  • Green - service is running and not in fault

The values shown in the Service Status column are tied to the service status object associated with the service. These status objects are automatically created and updated by the services as object profile ID 0001 with instance 0001. You can read the status of these objects but should not write to them.

View objects column

The View Objects column (5) are hot-links to the Objects Diagnostics page, but filtered to only show objects belonging the the relevant service.

Object and resource diagnostics

The Objects diagnostics page can be shown by clicking on the Objects button on the left of the screen (section 1 in image below) or by clicking on the View Objects hot-link described above. To view all objects belonging to all services use the Objects button (section 1 in image below).

Clicking on the plus sign (3) next to an object expands it to show all of its resources and their current values (2).

Modifying a resource value

Resource value modifications are temporary and could be overwritten by a service or Node-RED flow, and do not persist between service restarts or node reboots.

Running MobiusFlow via Docker

MobiusFlow has been containerised and is run via docker.

Mobius v1.X.X

Below is an example docker-compose.yml file you could use when running MobiusFlow. In this example, an online version of MobiusFlow 1.19.1 is used. Note that, as well as the MobiusFlow service (labelled simply 'mobius'), the file also containers a reference to an nginx and mongodb containers.

The nginx container is used for port mapping, and mongodb container used as a database. Neither of these are required to run MobiusFlow.

This file can also be downloaded here:

Licensing

It is important to include the correct licensing information within the environment variables of your docker-compose.yml file.

Backup and restore functionality is accessed via the settings tab on the Administration page. A full article covering backup and restore can be found .

All Mobius nodes are identified by their hub ID. This is a six character hexadecimal number and should be unique within any group of Mobius nodes. See and for more information about Hub IDs.

The full training course on the MobiusFlow Toolbox can be found .

The full MobiusFlow Manager training course can be .

The configuration page is used to create and configure the MobiusFlow configuration for a Mobius node (see ). The page is split into five main sections:

These action buttons do not modify the value of the Run on Start checkbox on the page.

It is possible to manually modify a resource's value by writing to, or clearing a value in its priority array (see ). Click on a resource to display its full priority array. Click on a priority to modify its value or clear it.

See the main on licensing for a full explanation of what is required for online and offline licensing as well updating a given licence.

here
MobiusFlow Architecture
MobiusFlow Uniform Resource Identifiers
version: "3.8"

volumes:
  mobius-data:
  mobius-licence:
  mongodb:

networks:
  frontend:
  backend:

services:
  mobius:
    platform: linux/amd64
    build: ./dist
    image: local/mobiusflow-docker:1.19.1_1.19.1
    container_name: mobiusflow
    privileged: false
    restart: always
    environment:
      - MOBIUS_HUB_RESET_PSKS=true
      - MOBIUS_ENABLE_CONFIG_UI=true
      - MOBIUS_HUB_ID=000001
      - MOBIUS_LOCAL_TIMEOUT=10000
      - MOBIUS_LOG_SERVICE_STATUS=
      - MOBIUS_LICENCE=38782095-410e7ab5-c3c36a84-dd39683f-c5a8062b-78f846c2-52588c49-fc8eecf4
      # - MOBIUS_LICENCE_KEY=
      # - MOBIUS_LICENCE_TOKEN=
      # - MOBIUS_LICENCE_RESET=
      - MOBIUS_ENGINE_API_PORT=8443
      - MOBIUS_ENGINE_API_AUTH_PROVIDER=local
    volumes:
      - mobius-data:/data
      - mobius-licence:/.licence
    networks:
      - backend
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "10"
  nginx:
    image: ghcr.io/mobiusflow/nginx-cloud:1.1.0
    container_name: nginx
    privileged: false
    restart: always
    environment:
      - NGINX_UI_CONTAINER=mobius
    ports:
      # these ports are for use with the nginx TLS terminator use in mobius-cloud-install
      - 8080:8080
      - 8443:8443
      - 1883:1883
      - 30814:30815
      - 30817:30817
    networks:
      - frontend
      - backend
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "10"
  mongodb:
    image: bitnami/mongodb:latest
    container_name: mongodb
    restart: always
    environment:
      - MONGODB_ROOT_PASSWORD=r5DybE57qug3WaHebeUy2bAvvVhKXUWHD
      - MONGODB_USERNAME=mobius
      - MONGODB_PASSWORD=RmzsXQYReLHaCS5wWGjAPjtJ7VnTw4qL
      - MONGODB_DATABASE=mobius
    volumes:
      - mongodb:/bitnami/mongodb
    networks:
      - backend
    logging:
      driver: none

Deploying MobiusFlow on Customer Servers / Cloud

Deploy MobiusFlow to on pre-existing hardware either On-Prem or in the Cloud

Page coming soon. Please contact support@mobiusflow.com to arrange a support call on this topic.

here
here
MobiusFlow Architecture
services configuration
MobiusFlow Architecture
article

Configuring a Connector

Configure a connector to connect to a MobiusFlow® instance

What You Will Need?

  1. A device with a web browser such as a laptop, tablet or smart phone, capable of connecting to a 2.4GHz WiFi access point

  2. A SIM card removal tool, large paper clip or pin to push the configuration mode button

  3. A powered MobiusFlow® connector

  4. The connector's Serial Number

Enabling Configuration Mode

If you leave the connector in configuration mode for more than 5 minutes it will automatically reboot and leave configuration mode

The connector's configuration mode can be enabled in two ways:

Using the Configuration button

Using a pin hold in the configuration mode button (inside the small hole to the right of the USB connector) on the front panel for 2 seconds

Release the button and the green LED will flash rapidly

Using your laptop / tablet / smartphone look for a WiFi network with the same name as the connectors serial number

Connect to this network and enter the connector's Config Mode Password. The default is mobiusflow

Open a web browser on your laptop / tablet / smartphone and enter http://192.168.4.1 into the browsers address bar and hit enter

The web browser will show the connector's configuration Home page

Using a Web Browser

This method is only available if you already know the IP address of the connector

Make sure that the connector and your laptop / tablet / smart phone are connected to the same Ethernet network

Open a web browser and browse to <your connector IP address>:8080 e.g. 192.168.1.20:8080

You will need to enter a user name and password. The user name is admin and the password is the same as the connector's Config Mode Password. The default is mobiusflow

After a short delay the web browser will redirect to the connector's configuration Home page

Creating a Fleet

Create a new balenaCloud fleet

What You Will Need?

This guide assumes you will be using a Raspberry Pi 4. The instructions are the same for the UP and Intel NUC devices with the exception of loading the initial balenaOS onto your device.

  1. A balenaCloud account with Microservices access (this requires a paid account)

Creating a New Fleet

A fleet is a collection of devices with the same device type (or architecture). Fleets allow simple management of a group of devices

Navigate to the Fleets page

Click on the Create Fleet button

Enter a fleet name

Choose device type Raspberry Pi 4 (using 64bit OS)

Select fleet type Microservices

Click on the Create new fleet button

Deploying MobiusFlow to approved Hardware (Using BalenaCloud)

Deploy MobiusFlow or MobiusFlow RPI Connector software to a new balenaCloud device or update existing devices

You must be signed up to balena.io and have a paid plan as these MobiusFlow® images use the Microservices fleet type which is only available on a paid plan

What is balenaCloud?

What Device Types are Supported?

MobiusFlow

We currently have software images for thee different device types for balenaCloud. These are:

MobiusFlow RPI Connector

The MobiusFlow RPI Connector works with the following Raspberry Pi types:

  • Raspberry Pi 4

  • Raspberry Pi 5

We reccomend at least 1Gb of RAM and 8Gb of storage for all devices

Device Variables

Understanding the MobiusFlow® balenaCloud Device Variables

For most devices the only Device Variables that require changing are listed below. The rest can be left at their default values.

  • MOBIUS_LICENCE

  • MOBIUS_HUB_ID

Remember to override the Device Variables at the device level and not at the fleet level.

Any changes at the fleet level will apply to all devices in the fleet.

MobiusFlow Device Variables

The image below shows the Device Variables created when MobiusFlow® is deployed to balenaCloud.

Expand the items below for detailed information on each Device Variable

MOBIUS_ENABLE_CONFIG_UI

Enable or disable the MobiusFlow® configuration user interface

Possible Values: (default shown in bold)

  • true - Enable the configuration user interface

  • false - Disable the configuration user interface

MOBIUS_ENGINE_API_AUTH_PROVIDER

Select which authentication provider to use for the Engine Rest API.

Possible Values: (default shown in bold)

  • local - Use the local user database

MOBIUS_ENGINE_API_PORT

The Engine Rest API port

Possible Values: (default shown in bold)

  • 8443

MOBIUS_HUB_ID

The HUB ID used by this MobiusFlow® instance

Possible Values: (default shown in bold)

  • 000001 - Can be any six digit hex number

MOBIUS_HUB_RESET_PSKS

Reset all MobiusFlow® Service pre-shared keys on startup

Possible Values: (default shown in bold)

  • true - reset the pre-shared keys on startup

  • false - do not reset the pre-shared keys on startup

MOBIUS_LICENCE

The MobiusFlow® licence code for this device

Possible Values: a valid licence code

MOBIUS_LICENCE_RENEW

Change the MobiusFlow® licence code. Set this to true when replacing an licence code

Possible Values: (default shown in bold)

  • true - Change the licence code

  • false - Use existing licence code

MOBIUS_LOCAL_TIMEOUT

The maximum time in milliseconds that any MobiusFlow® Service will wait for a response to a MobiusFlow® message

Possible Values: (default shown in bold)

  • 10000 - any number greater than 1000

MOBIUS_LOG_SERVICE_STATUS

Log changes of MobiusFlow® Services status to the standard logs

Possible Values: (default shown in bold)

  • true - log the service status changes to the standard logs

  • false - do not log the service statis changes to the standard logs

Adding Your Licence

License your MobiusFlow® instance

What You Will Need?

  1. A valid MobiusFlow® licence (licences can only be used on one device)

Adding Your Licence to a BalenaCloud Device

Licences must be added by overriding a device's licence variable and NOT changing the fleet's variables.

Navigate to the correct fleet and device

Select the Device Variables page. You will see a list of all of the device's variables with override buttons next to each variable

Click the override button next to the MOBIUS_LICENCE variable

In the popup delete the text <replace with your licence code> and enter your licence code

Leave all other settings as their default values and click the Add button

MobiusFlow® will restart to install the licence

Updating or Replacing a Licence

If you extend an expired licence or you purchase a larger licence you do not need to update the licence code

Under some circumstances it may be necessary to enter a new licence code. In order to make the new licence code work follow the procedure above to enter a new code

You will also need to tell MobiusFlow® to renew its licence by setting the Device Variable MOBIUS_LICENCE_RENEW to true

Click the override button next to the MOBIUS_LICENCE_RENEW variable

In the popup change the value from false to true

Leave all other settings as their default values and click the Add button

Wait for MobiusFlow® to restart, confirm that the new licence is working and reset the Device Variable MOBIUS_LICENCE_RENEW to false

Click the override button next to the MOBIUS_LICENCE_RENEW variable

In the popup change the value from true to false

Leave all other settings as their default values and click the Add button

Congratulations, you have deployed your first MobiusFlow® device on balenaCloud.

Deploy MobiusFlow to Your Fleet

Deploy MobiusFlow® to a balenaCloud fleet

What You Will Need?

  1. A balenaCloud account with Microservices access (this requires a paid account)

  2. A compatible balenaCloud fleet (Up Board, Intel NUC or Raspberry Pi 4)

You should always backup your MobiusFlow® device before deploying a new version.

Deploying from balenaHub

Navigate to the Apps page

Search for MobiusFlow

If this guide is being followed in the context of deploying MobiusFlow Connector software to as Raspberry Pi, ensure MobiusFlow Connector apps are used instead of the standard MobiusFlow App.

Select the correct device type

Click on the Deploy button

Balena will switch to your balenaCloud dashboard

If you already have a new fleet or want to upgrade the MobiusFlow® version on existing devices, select Use an existing fleet instead

Select the fleet from the drop down and click on the Deploy to fleet button

After a few seconds you will see the new release being built for your fleet

This will take a minute or two. Once the build is complete you will see the release on the dashboard. All devices, which have not been pinned to a specific release, in your fleet will automatically start to update to the new release.

You can also view the release history in the Releases page of your fleet.

Click on a device Summary to see which release it is running. You can also pin device to specific releases on this screen

Configure Networks

Configure the network interfaces for a balenaCloud device

The configuration of the network interfaces of a MobiusFlow® balenaCloud device is handled by the manage microservice. All configuration is stored in a JSON file which can be updated by plugging in a properly configured USB memory stick or through the balenaCloud device terminal.

Network Configuration File Structure

As each device type has different configurations and names for the underlying network interfaces, the structure of the network configuration may differ depending on the device type you are using

Editing the Network Configuration

Using the balenaCloud Device Terminal

Navigate to the Device Summary page of the device you want to configure

Open a terminal in the manage microservice

Change to the /data/.mobius/manage directory and edit the networks.json file by running the following commands:

This will open the network configuration file for editing using the vi editor

Make any required changes and save the file

Exit the terminal and restart the manage microservice by clicking on the restart icon next to the manage service

Be careful when changing the network interface you are using to connect the device to the internet as you could prevent the device from connecting to balenaCloud.

Using a USB Memory Stick

Using a USB memory stick to update the network interfaces is useful when none of the network interfaces is configured to connect to the internet so it is not possible to use the balenaCloud device terminal. You will obviously need physical access to the device to use this method.

Format the USB memory stick as FAT32

Rename the USB memory to MOBIUSCONF

Create a file on the USB memory stick called networks.json

Open the file on your laptop or PC in your favourite text editor and paste in the correct JSON configuration from the examples above

Make any required changes

Save the file and unplug the USB memory stick from your laptop or PC

Plug the USB memory stick into any of the USB ports on your device

Reboot your device

When the device reboots it will copy the networks.json onto the device and use the new configuration for its network interfaces (this will take a minute or two)

You can then remove the USB memory stick and your device will continue to use the new network configuration.

Installed Services

What are the mobius, manage, and mongodb microservices?

balenaCloud devices can run multiple microservices in separate Docker containers. Deploying MobiusFlow® to your device will create three microservices. You can start, stop and view logs for each service on the balenaCloud device summary page.

mobius

This microservice runs the MobiusFlow® application.

manage

mongodb

A full version of MongoDB which you can use to store / retrieve data in flows.

The default settings are

Home Page

The Home page has the following buttons

Configure Network

Configure the wired or wireless Ethernet network settings

Manage Certificates

Manage all certificates for TLS connections. The default certificates are for MobiusFlow® cloud hosted instances but you can add your own if required

Configure MQTT

Set Config Mode Password

Change the configuration mode password

About

See information about the connector such as the software version, serial number, andwhich modules are installed

You can also update the firmware on this page

Reboot Device

Reboot the device to exit configuration mode and use the new settings

Configuring MobiusFlow for use with Connectors

Configure a MobiusFlow instance for connectors

MobiusFlow Connectors

Overview of MobiusFlow Connectors

The Connector collects data from sensors and sends data to actuators via standard wireless sensor protocols such as EnOcean and Workplace Occupancy, and sends this data securely to a MobiusFlow using an MQTT based Protocol.

Once the data has been received by a MobiusFlow instance, it is decoded and the associated MobiusFlow object is updated with the latest sensor readings which can then be processed by the gateway.

Connector Options

There are several hardware options for the MobiusFlow Connector software:

Connection Details and LED Indicators

Power Options

You have three options to power the connector

Network Options

You can connect to your network via wired Ethernet or 2.4GHz WiFi

Front Panel

The image and table below describe the connections and LED indicators on the front panel of the connector.

Product Label

The serial number is required when configuring both the connector and your MobiusFlow® instance. Make sure you take a note of the serial number before starting

MobiusFlow Official Connector

Configure your MobiusFlow Connector and connect it to a MobiusFlow instance

Part Numbers

It is possible to have up to two radios for wireless sensors in a single connector. This is useful when you have combination of sensors using different protocols.

The current options are EnOcean and Workplace Occupancy using either 868MHz for the EMEA region of 915MHz for the USA and Canada.

Download Connector Firmware

v3.1.1

v3.2.0

After signing up to follow their instructions to create a fleet and add your first device. We have simplified the process so you will only need to perform some of the actions they list. The steps below outline the process but for more information see the balena.io .

Navigate to your and login in

You have created your first balenaCloud fleet! Now go to to add a device to this fleet

BalenaCloud is a small device fleet management platform which simplifies the process of managing and maintaining 1000s of edge devices. It allows secure remote access and monitoring of each device and installing and updating product firmware of an entire fleet with a few simple clicks. See for more information.

If you have a requirement for a different device type on balenaCloud contact us at or submit a support ticket by clicking on the support link above

If you are ready to get started, jump into the section to begin creating your first fully managed MobiusFlow® device on balenaCloud.

balenaCloud devices are configured using Device Variables. When deploying MobiusFlow® to a balenaCloud fleet a number of Device Variables are created with default values. These are defined at the fleet level but can be overridden at the device level. More information about working with balenaCloud Device Variables can be found .

All MobiusFlow® instances require a valid licence to run. Licences define the maximum number of MobiusFlow® objects that you can add to an instance. For more information about MobiusFlow® licences refer to the page.

Licences are added to balenaCloud devices by setting a device variable. All required device variables are created automatically when you deploy MobiusFlow® to a fleet. For more information see .

Navigate to your and login in

Your licence code will be shown in the Device Variables list (see for more information on all of the device variables shown in this list)

See for more details

is a market place for balena.io compatible applications ready to be deployed to your device with just a few clicks.

Navigate to your and login in

Navigate to to select which version of MobiusFlow® to deploy

You can create a new fleet here or deploy to an existing fleet. If creating a new fleet refer to the section for details on what settings are required

Navigate to your and login in

Manages network interfaces. See for more information

Setting
Default Value

Configure the connection to the MQTT broker you chose when

Configuring MobiusFlow for use with Connectors uses the MobiusFlow Connectors service. A full guide on how to use this service can be found .

A full guide on configuring MobiusFlow for use with Connectors can be found .

Power Option
Details
Item
Description
Comments

The product label is on the bottom of the connector. It shows the , software version and serial number of the product.

Part Number
Region
EnOcean
Workplace Occupancy
balenaCloud
documentation
balenaCloud dashboard
Adding Your First Device
balenaCloud
www.mobiusflow.com
Creating a Fleet
here
Licensing
Device Variables
balenaCloud dashboard
Device Variables
Backup and Restore
BalenaHub
balenaCloud dashboard
balenaHub
Creating a Fleet
[
  {
    "connection": {
      "enabled": true,
      "type": "ethernet",
      "id": "Wired connection 1",
      "interface-name": "enp2s0"
    },
    "ipv4": {
      "method": "auto",
      "address": "",
      "prefix": 24,
      "gateway": "",
      "dns": ""
    }
  },
  {
    "connection": {
      "enabled": true,
      "type": "ethernet",
      "id": "Wired connection 2",
      "interface-name": "enp3s0"
    },
    "ipv4": {
      "method": "manual",
      "address": "192.168.1.100",
      "prefix": 24,
      "gateway": "",
      "dns": ""
    }
  },
  {
    "connection": {
      "enabled": false,
      "type": "wifi",
      "id": "WiFi connection 1",
      "interface-name": "wlp4s0"
    },
    "ipv4": {
      "method": "auto",
      "address": "",
      "prefix": 24,
      "gateway": "",
      "dns": ""
    },
    "wifi": {
      "ssid": ""
    },
    "wifi-security": {
      "psk": "",
      "auth-alg": "open",
      "key-mgmt": "wpa-psk"
    }
  },
  {
    "connection": {
      "enabled": false,
      "type": "hotspot",
      "id": "WiFi hotspot 1",
      "interface-name": "wlp4s0"
    },
    "wifi": {
      "ssid": "",
      "channel": 6
    },
    "wifi-security": {
      "psk": "",
      "key-mgmt": "wpa-psk"
    }
  },
  {
    "connection": {
      "enabled": true,
      "type": "gsm",
      "id": "GSM connection 1",
      "interface-name": "cdc-wdm0"
    },
    "gsm": {
      "apn": "arkessa.com",
      "username": "arkessa",
      "password": "arkessa"
    }
  }
]
[
  {
    "connection": {
      "enabled": true,
      "type": "ethernet",
      "id": "Wired connection 1",
      "interface-name": "eth0"
    },
    "ipv4": {
      "method": "auto",
      "address": "",
      "prefix": 24,
      "gateway": "",
      "dns": ""
    }
  },
  {
    "connection": {
      "enabled": false,
      "type": "wifi",
      "id": "WiFi connection 1",
      "interface-name": "wlan0"
    },
    "ipv4": {
      "method": "auto",
      "address": "",
      "prefix": 24,
      "gateway": "",
      "dns": ""
    },
    "wifi": {
      "ssid": ""
    },
    "wifi-security": {
      "psk": "",
      "auth-alg": "open",
      "key-mgmt": "wpa-psk"
    }
  },
  {
    "connection": {
      "enabled": false,
      "type": "hotspot",
      "id": "WiFi hotspot 1",
      "interface-name": "wlan0"
    },
    "wifi": {
      "ssid": "",
      "channel": 6
    },
    "wifi-security": {
      "psk": "",
      "key-mgmt": "wpa-psk"
    }
  }
]
cd /data/.mobius/manage
vi networks.json

Database

mobius

Username

mobius

Password

RmzsXQYReLHaCS5wWGjAPjtJ7VnTw4qL

PoE

Power over Ethernet (30 watts)

DC Supply via screw terminals

5 to 24Vdc 500mA

USB

5V 500mA via micro USB

1

Ethernet port and PoE Supply

2

5 to 24vdc screw terminals

3

USB power

4

Configuration button

Push and hold to enter config mode or factory reset

5

Power OK indicator

Connector is powered

6

5 to 24vdc power OK

7

USB power OK

8

PoE power OK

9

MobiusFlow® connected

Connected to MobiusFlow® gateway

10

Network connected (upstream)

Network connection established

11

Module present in slot 1

12

Module 1 activity

Flashes when module 1 sends or receives data

13

Module present in slot 2

14

Module 2 activity

Flashes when module 2 sends or receives data

EXT00102

EMEA (868MHz)

EXT00110

EMEA (868MHz)

EXT00112

EMEA (868MHz)

EXT10102

US (915MHz)

EXT10110

US (915MHz)

EXT10112

US (915MHz)

balenaCloud dashboard
Configure Networks
configuring MobiusFlow® for connectors
here
here
Official Connector
Raspberry Pi
part number

Factory Resetting a Connector

Return all settings to factory default

If you forget your connector's Config Mode Password or want to fully reset all settings to the factory default follow the procedure below

What You Will Need?

  1. A SIM card removal tool, large paper clip or pin to push the configuration mode button

Factory Reset

Using a pin hold in the configuration mode button (inside the small hole to the right of the USB connector) on the front panel for 10 seconds

While you are holding the button in the green LED will start to flash rapidly and after 10 seconds the connector will reboot. Once you see the power on LED sequence release the configuration mode button

MobiusFlow Basics

Learn how to use the full version of MobiusFlow

Manage Certificates Page

Manage certificates for TLS connections

Setting CA / Server Certificates

When using TLS you will need to set the correct CA / Server certificates. You can have up to three certificates set. If the connector fails to connect using one of the certificates it will cycle through all three, trying each one until it connects

The default certificates are ISRG Root X1 certificates which are used when connecting to MobiusFlow® hosted instances of MobiusFlow®

You can set the certificate by pasting the certificate text into the selected certificate slot

Setting Client Certificate and Keys

If your setup requires the use of Client certificates you can set up to four different certificates and keys. Paset these into the selected certificate and key slots

Converting Raspberry Pi to a MobiusFlow Connector

How to convert a Raspberry Pi into a MobiusFlow Connector

Hardware Requirements

Raspberry Pi

A Raspberry Pi is required. Currently supported Raspberry Pi models include:

  • Raspberry Pi 4

  • Raspberry Pi 5

An SD card for each Raspberry Pi is required to store the connector image. We recommend a minimum storage of 8GB.

Transceiver Hardware

Most protocol types require specific hardware to translate that protocol to the Raspberry Pi.

EnOcean

The following transceiver types are supported. Only 1 is required per Pi:

Etching SD Image

BalenaCloud

MobiusFlow Raspberry Pi connectors run Balena OS. Athlough not required, if your organisation registers with BalenaCloud, Balena OS grants a direct VPN link to the connector, allowing configuration changes to be made over the internet.

When using more than 5 devices, BalenaCloud becomes a piad service. As such, we offer versions of the Balena images which do not support remote access and therefore do not require a subscription to BalneaCloud.

Without Remote Access

The following, no remote access images can be downloaded:

With Remote Acccess

The following is an overview of the steps involved to use BalenaCloud with MobiusFlow RPI connectors:

  1. Create BalenaCloud Account

  2. Create BalenaCloud Fleet

  3. Attach BalenaCloud Fleet to the corresponding MobiusFlow Connector Balena Application

  4. Add a new device to the fleet and download the subsequent Balena image

  5. Etch the image

The above guide differs in the context of MobiusFlow Connectors because the BalenaCloud Fleets should be linked to the MobiusFlow Connector BalenaCloud applications, instead of the standard MobiusFlow BalenaCloud applications.

Etching

BalenaCloud charges hosting fees when more than 5 devices are associated to the account. If remote access to the Connector confiruation is not required, the device can be deleted from the BalenCloud fleet. The Connector software running on the device will remain, and the device will operate as normal.

Configuring Raspberry Pi Connector

Page covers how to configure a Raspberry Pi Connector

Accessing Configuration Page

Via Balena Fleet

If the Connector is hosted via BalenaCloud and has an internet connection, the configuration can be accessed anywhere via the BalenaCloud Public Device URL.

MobiusFlow Hosted

If the connector is hosted by MobiusFlow, please contact support to receive the Public Device URL.

Self Hosted

The BalenaCloud Public Device URL can be found by Navigating to the connector device on the BalenaCloud fleet.

Via Raspberry Pi Access Point

By default, the MobiusFlow connector will broadcast a WiFi access point, the name of which matches the connector's serial number (in the form of MF_XXXXX). Connect to this access point on a computer or mobile device. Then the configuration window is accessible by browsing to 10.42.0.1.

Via Local Network

If the connector is connected to a local network via Ethernet or WiFi (with a known IP address) and you're able to also connect to this network using a computer or mobile device, then simple browse to the local IP of the connector.

Login & Home

Login

When browsed to the configuration window of the connector, a login screen is presented.

The default password of all new MobiusFlow connectors is:

mobiusflow

Note that, if the connector is not new, this login password may have been changed.

Home Page

When on the the home page, the current status of the connector is shown. This includes:

The main menu also allows navigation to the connectors configuration pages. These includes those for Network Configuration, MQTT Configuration, Certification Configuration, and the Change Password page (allows the connector configuration password to be changed).

Configure Network

It is critical that the MobiusFlow connector's network situation is such that it can access the target MobiusFlow instance over the network. This may be over the internet or simply over a local network.

In either situation, the connector must be connected to the network and the configure network page allows for this.

Connection Type

The connection type allows choosing between a Wired or WiFi connection.

If using a Wired connection, ensure the Raspberry Pi is plugged in via Ethernet.

If using WiFi mode, the WiFi SSID and corresponding password must be populated.

Note that: In WiFi mode, the Wired network interface will remain enabled in the background. This acts as a secondary fall back interface, useful for accessing the connector the WiFi has failed to connect.

Note that: If using in WiFi mode, using the Connector as WiFi access point is no longer possible. This is because the Raspberry Pi only contains a single WiFi adapter and therefore it can only be used to either connect to WiFi or as an access point.

TCP/IP Settings

The TCP/IP settings allow switching between DHCP and Static IP allocation. Unless there are specific reasons to set the connector on a static IP address, using DHCP is recommended.

If using the connector in Static mode, the Subnet Mask, Default Gateway and DNS 1 can be set. If it is not clear what to use here, use the default settings as shown below.

Note that, the default gateway is not required however if the connector required access to the internet, the local IP address of the internet providing gateway (Network router / modem) must be populated here. This is often in the form XXX.XXX.XXX.1 or XXX.XXX.XXX.0 .

WiFi Access Point

Setting the connector up to be a WiFi access point is useful for two reasons.

Firstly, it allows you to connect to it, allowing for easy wireless access to its configuration page. Secondly, if this connector has internet access via ethernet, it can act as an internet enabled hotspot to connect WiFi device to, in-turn giving them internet access.

Note that: If using in WiFi mode, using the Connector as WiFi access point is no longer possible. This is because the Raspberry Pi only contains a single WiFi adapter and therefore it can only be used to either connect to WiFi or as an access point.

If the WiFi access point is enabled, a WiFi SSID and Password must be set. It is recommended the default SSID is used (This matches the the connectors Serial Number)

Saving Changes

To save the changes click the save button. If there are an issues with the configuration, such as an invalid input in one of the fields, the form will show this and the changes will not be saved. If the settings were saved correctly, a pop up will show this after the save button has been clicked.

Note that, when changes are saved here, they're only being saved to the local changes within the browser window. To realise the changes in the connector, the Reconfigure and Reboot button must be clicked on the main menu

Configure MQTT

Overview

Connectors use MQTT to communicate with MobiusFlow. As such, the Configure MQTT page allows the connector to be pointed at a specific MQTT broker. In almost all cases, the broker will be running the MobiusFlow instance itself.

Configuration Window

The configuration window shows the key 6 properties which must configured to allow an authorised connection to the MQTT broker.

Explanation of Properties

Saving Changes

To save the changes click the save button. If there are an issue with the configuration, such as an invalid input in one of the fields, the form will show this and the changes will not be saved. If the settings were saved correctly, a pop up will show this after the save button has been clicked.

Note that, when changes are saved here, they're only being saved to the local changes within the browser window. To realise the changes in the connector, the Reconfigure and Reboot button must be clicked on the main menu

Realising Changes

Once the changes have been made locally, to implement the changes within the connector, click the Reconfigure and Reboot button.

This will cause the connector to reboot. As such, the configuration window's connection to the connector will be lost. This may automatically be restored once the connector reboots, but this may not be the case if the connector's configuration has changed such that it is no longer accessible over the network.

Set Config Mode Password Page

Set the configuration mode password

The Config Mode Password is used to login to the configuration pages of the connector. The default password is mobiusflow

You can change the password on this page

Save Settings

Click the Save button

Click the Home button on the settings saved confirmation page to return to the Home page

Technical Training 1

Training material used in conjunction or reference following a standard MobiusFlow training session 1.

Technologies Referenced

This section outlines the major technologies reference in this training. Learning about this technologies is recommended.

MQTT

MQTT (Message Queuing Telemetry Transport) is a lightweight and efficient publish-subscribe messaging protocol, commonly used in IoT (Internet of Things) applications.

MQTT is widely used for data transport throughout the MobiusFlow software.

JSON

JSON (JavaScript Object Notation) is a lightweight data interchange format that is easy for humans to read and write, and easy for machines to parse and generate.

A basic knowledge of JSON is required when using the Flows (logic engine) within MobiusFlow.

EnOcean

EnOcean is a short distance wireless communication protocol used widely within the IoT space. Each EnOcean device has a unique identifier (UID) which is used to identify the sender of all EnOcean wireless telegrams.

During this training, EnOcean will be used as an exemplar IoT technology to demonstrate MobiusFlow from the device level.

MobiusFlow Overview

Structure

A MobiusFlow instance runs a central MobiusFlow Hub. Services, each of which have a function within the overall solution, reside on the hub, and use it as a relay to communicate information.

A MobiusFlow object often represents a virtual equivalent of a real-world device, however can represent non-physical entities such as calculated data.

Some services can have MobiusFlow objects reside on them, often when the service needs to directly interact with those objects in some way. For example, objects representing EnOcean devices will always reside on an EnOcean devices service.

Points / Resources

A MobiusFlow object contains many resources, each being its own individual data stream representing something about that object.

Below shows a screenshot from the MobiusFlow software of the list of resources associated to an EnOcean Temperature / Humidity / C02 sensor.

A point is a chargeable resource. Notice in the above screenshot, the points column is only populated for Temperature, Humidity and CO2.

Also notice how the MobiusFlow software calculates your total point usage and displays this at the bottom right hand corner.

URIs

All parts of the MobiusFlow hierarchy are assigned a unique URI with the following structure:

HID/SID/PID/INS/RID

Example URIs

Service

Full example URI of a service:

000001/020

Representing service 020 on hub 000001.

Object

Full example URI of an object:

000001/020/0028/0001

Representing instance 0001 of object type (profile) 0028 on service 020 on hub 000001.

Resource

Full example URI of a resource:

000001/020/0028/0001/40

Representing resource 40 on instance 0001 of object type (profile) 0028 on service 020 on hub 000001.

Conclusion

Using the URI system, it is therefore possible to reference any component of a given MobiusFlow configuration.

Configuration Example

Example Overview

This aims to show how data taken from EnOcean sensors at a hardware level, is brought into and through the MobiusFlow system, and then presented in the form of a dashboard.

Project Schematic

The following shows a colorless project schematic representing lack of implementation. As the project is implemented, this diagram will be colored in so progress can easily shown.

Note that the EnOcean devices have been dropped from the diagram for simplicity

Explanation of Services

MobiusFlow Configuration

MQTT Broker

Add and start MQTT Broker service:

The MQTT Broker service has been added, configured and started.

Connector Service

Add connectors service, add a connector to the service, and finally start the service.

Add and start service:

Add a MobiusFlow connector object to the connectors service and configure:

The Connector service has been added, configured and started.

EnOcean Devices Service

Add EnOcean Devices service, add EnOcean device objects to the service, and finally start the service.

The EnOcean devices service has been added, configured and started.

Connecting Hardware

MobiusFlow connector is connected.

Service Status and Data

The status of all service can viewed. This is a helpful insight into the current state of the solution as well as aiding with diagnostics.

The data of any live object can viewed by navigating to that object and then clicking on resources.

Flows

Dashboard

In this example, the live state of the buttons on a 4-Rocker EnOcean switch is shown on a basic dashboard.

MobiusFlow Overview

The MobiusFlow software has been developed as an MQTT object bus which normalises all device data into standardised MobiusFlow objects which allow interoperability between all devices either real or virtual in the field or Cloud.

MobiusFlow enables actuators, sensors & controllers to connect, control and communicate with each other and to the Cloud so that IoT solutions using scalable monitoring, visualisation and predictive analytics can provide valuable insights into your business and act upon them automatically.

  • A complete control and communications platform

  • Microservice based architecture

  • Secure, open protocol based on MQTT

  • Scalable to 1000s of devices

  • Platform and language independent

  • Does not depend on a network connection for local control

  • Provides full discovery of nodes, objects and resources in all directions

  • Pub / Sub change of value notifications

MobiusFlow has been designed from the ground up as a micro service based design with a simple but common set of API commands. All communication between micro services is performed using the MQTT protocol, ensuring that micro services can be written in any programming language and will run on any device capable of TCP/IP network communications. The only requirement for any MobiusFlow system is that it contains at least one Node. This Node consists of a MobiusFlow Hub which initiates and facilitates communication between micro services in a secure way. Micro services can run on the same device as the Hub, or on another device such as a temperature sensor, connected to the Hub via a connection capable of transmitting via TCP/IP (provision has been made for future expansion, by adding translation services, to allow micro services to communicate with the Hub over any transmission medium capable to transmitting binary data).

Each Node is typically a stand-alone island which does not require any connection to any other device in order to perform local control. Nodes can be connected together via secure MobiusFlow Routers allowing the creation of a network of interconnected Nodes. When used in this configuration, Nodes can share data with each other and influence the control algorithms running on any connected Node.

Vanilla MQTT has some limitations in its usefulness as a peer to peer messaging and control protocol. It is based around the Publish / Subscribe pattern which is ideal where multiple devices are sending data to a single end point for logging etc. MQTT can be used where devices or services need to have a two way peer to peer flow of communication but the different services need to be aware of each other at design time. MobiusFlow defines a protocol layer above MQTT which enables discovery of devices and services at runtime and then allows two way peer to peer communication to take place, ensuring that new devices and services can be added at any time without having any design time knowledge of the other devices and services in a system.

MobiusFlow Cloud Hosted Environment

Reference material for the environment in which MobiusFlow Cloud Instances exist

MobiusFlow with LoRaWAN Stack

Port Mappings (Simple)

The table below shows a simple overview illustrating how the ports are mapped. This is a simple overview suitable for most users.

Port Mappings (Advance)

Docker & Docker Routing

Different parts of the MobiusFlow solution run in different docker containers. These communicate via docker routing. Docker routing allows container names to be resolved in the Host OS, for example, to refer to the Mobius Engine API from the Host OS or a container that is not the mobius container, one could use mobius:8442 (container name followed by Host OS Port).

This means that, if communication between containers is required, the Host OS port and container is required. As such, these are included in the advanced port mappings table below.

Full Mappings

The table below gives a full description of the port mappings a MobiusFlow Cloud hosted environment is subject to.

MobiusFlow Architecture

Mobius system

A typical MobiusFlow system consists of a single or multiple MobiusFlow nodes connected together via a TCP/IP network. Each node is capable of operating independently of the rest of the system, but nodes can interact with each other to form a complex system. All node interaction takes place through one or more brokers via a node’s router.In a multi-node system, the location of the broker is not important. It can reside on the same device as one of the nodes or on an independent device.

Mobius nodes

A Mobius node consists of a central Mobius hub, one or more Mobius services and optionally one or more Mobius routers.

Services contain the service logic and an object data store. Connections to sensors, actuators and other communication interfaces such as Modbus or BACnet can be added depending on the service’s purpose and controlled through the service's logic.

The object data store models the physical or virtual connections and provides a standardised method for services and other nodes to communicate and share data with each other through Mobius objects.

Routers are used to cross node boundaries. They provide a secure mechanism for nodes to share data using the MobiusFlow protocol.

Logical structure of a node

The logical structure of a node is detailed below. This diagram shows the hierarchical relationship between all of the parts which make up a node and how objects contain resources, services contain objects and hubs connect to services and routers.

The Mobius URI structure allows addressing any part of a node at any depth.

Hubs

A Mobius hub is the foundation of a node. At its heart, a Mobius hub is just an MQTT broker which manages and links Mobius services and Mobius routers. Hubs are responsible for ensuring that all services and routers are valid members of a node by verifying their pre-shared authentication key on connection.

When service or router connects to a hub, and has been validated, the hub provides it with a copy of the Mobius object profiles and pre-shared keys files, ensuring that all services and routers connected to the hub are able to communicate and understand one another.

Services

Mobius services are the engines which drive MobiusFlow. Each service is essentially a microservice performing a specific task and possibly acting as an interface to a piece of hardware or a 3rd party service such as Microsoft's Azure platform or the IBM Cloud.

All services MUST implement the full MobiusFlow protocol to enable them to connect to hub and communicate with other services. In addition to implementing the MobiusFlow protocol, services can create Mobius objects to store and share data and can also contain service specific logic to perform the task that they are designed for. When creating services, try an keep them focused on one task and create additional services to perform other tasks. This ensures that services are reusable and Mobius systems can be configured to only contain the logic that they require.

Routers

Mobius routers control all MobiusFlow communication into and out of a node. This ensures that nodes are secure and allows nodes to discover each other within a MobiusFlow system.

Routers are capable of routing messages between services belonging to different nodes, essentially allowing a service on one node to read, write and subscribe to change-of-value events on objects in another node.

Mobius objects

Mobius objects are predefined in an object profiles file which is passed to a services by the hub when a service connects.

Object resources

Mobius objects contain one or more resources. It is these resources which are used to define objects that mimic or represent real-world objects. An example of a single object is a room temperature sensor. This object may have resources which define the sensor’s name, location, asset reference, engineering units, set point and actual measured value.

Each resource is capable of storing a single value which can currently be of type Boolean, Number, String, DateTime or TimeSpan. Resources also store meta-data about the value. The actual meta-data depends on the value type chosen. Resources can be read only or read/write. Read only resources have their values set when they are created.

Present value and the priority array

When reading the value of a resource the actual value is returned in the PV(present value) property. The PV is always equal to the value of the highest active (non null) priority in the resource's priority array.

MobiusFlow Uniform Resource Identifiers (URIs)

Within a MobiusFlow system all hubs, services, objects and resources are identified by a unique address known as a Uniform Resource Identifier or URI. These URIs are hierarchical so given the URI for a Mobius resource it is possible to identify which object the resource belongs to, what the object type is, which service the object belongs to and which Mobius node the service is running on.

Mobius URI Definition

An object’s URI (or name) is defined in 4 parts, namely the hub ID (HID), service ID (SID), object profile ID (PID) and instance number (INS). A fifth part is added when accessing a specific resource, the resource ID (RID).

A full URI is typically defined as HID/SID/PID/INS/RID.

It is possible to address any part of the system by only using the required parts of the URI. e.g. to address a service only the first two parts of the URI are used HID/SID and to address an object only the first four parts are used HID/SID/PID/INS.

An example of an object URI for an object of instance 1, profile 3A, created by service 1F connected to hub 1 is:

000001/01F/003A/0001

and if addressing resource 40 on that object the full URI would be:

000001/01F/003A/0001/40

Mobius URI Wildcards

Under certain conditions, such as subscribing to a resource’s change of value event, it is possible to use wildcards in the URI. These wildcards are described in the table below and follow the MQTT standard.

Transceiver
Notes

We have a full guide on how to use the BalenaCloud with MobiusFlow itself . Please note

We recommend using the to etch the images onto an SD Card. The tool is self-explanatory, but full full documentation of how to use the tool can be found .

Property
Notes

Before setting up the connector's MQTT configuration, ensure you first set up the MobiusFlow instance ready for this connection. A guide on how to do this can be found .

Property
Explanation

If you forget your password you will have to the connector

Learn how JSON works .

Explanation
Format
Service
Explanation of requirement

For full information on how to configure a MobiusFlow connector see .

Connecting the flows to the MobiusFlow engine, as well as the baseline principles of pulling into the flows is covered .

Using dashboard in the way illustrated can be as simple or as complex as required. Display widgets include graphs, charts and tables, as well input widgets such as switches, buttons, drop-downs and text inputs. Full documentation of the Flows dashboard can be found .

All sensor and actuator data is normalised from any source such as / / / / LoRaWAN / Analog / Digital etc.

It is optional to include the LoRaWAN Stack when specifying the hosting type on instance creation. This Stack will grant the ability to use the .

If included, an instance of and it associated infrastructure will be hosted in the background. Accessing this is not necessary to use the LNS, however it is accessible if required. Full details can be found within the .

Exposed Port
Internal
Usage
Version
Exposed Port
Host OS Port
Container Name
Internal
Usage
Version

Each node is classed as, and exhibits the behavior of, an device. In this context edge devices are not only field devices but could also be on the edge of a server or cloud server providing the server with connectivity to all of the true edge or field devices.

All of the communications between services through the hub or nodes through routers and brokers is based on the protocol. The MobiusFlow protocol has been defined on top of this MQTT protocol providing a well-defined API enabling different physical devices and protocols to communicate with each other in a consistent way.

Mobius nodes follow the architecture pattern, where each service is a stand-alone process capable of communication with other microservices creating a large application from small manageable pieces.

Each hub within a Mobius system is given a unique ID. This is a six digit hex number which forms the first part of the Mobius URI hierarchy. When referencing a hub, for example during a discovery process, this unique ID must be used (see ).

Each service within a Mobius node is given a unique ID. This is a three digit hex number which forms the second part of the Mobius URI hierarchy. When referencing a service, for example during a discovery process, this unique ID must be used (see ).

Routers are split into two parts, one side of the router communicates internally with its associated hub and all of the services within a node, while the other side of the router communicates externally through a 'no-mans' broker to other routers on other nodes. All external communication is done using MQTT over the protocol. This could be done over a secure or non-secure connection (ws:// or wss://).

The key to the MobiusFlow system is Mobius objects. These objects typically model real-world objects and provide a mechanism for sharing data and storing state in a consistent way. Each object has a unique identifier or which can be discovered and used by any part of the MobiusFlow system.

Each object within a Mobius node is given a unique ID. This ID consists of two parts and is made up of the object profile ID (PID) which describes the object's type, and the object's instance number (INS). The PID is a four digit hex number which forms the third part of the Mobius URI hierarchy and the INS is a four digit hex number which forms the fourth part of the Mobius URI hierarchy. When referencing an object, for example during a discovery process, this unique ID must be used (see ).

Each resource within an object is given a unique ID. This is a two digit hex number which forms the fifth and final part of the Mobius URI hierarchy. When referencing a resource, for example during a read, this unique ID must be used (see ).

Resources store their values in a priority array. This priority array works in a similar manner to a priority array. The array has 16 possible locations with location 1 being the highest priority and location 16 being the lowest priority.

Each part of an object’s URI is a uppercase string of a defined length (as shown in the table below). The URI’s parts are separated with a forward slash (/).

TCM310 (Pi Hat)

868MHz (Europe) EnOcean transceiver to plug into Raspberry Pi header

TCM310U (Pi Hat)

902MHz (North America) EnOcean transceiver to plug into Raspberry Pi header

USB 300 (USB Stick)

868MHz (Europe) EnOcean transceiver to plug into Raspberry Pi USB Port

USB 500U (USB Stick)

902MHz (North America) EnOcean transceiver to plug into Raspberry Pi USB Port

Serial Number

Required in the MobiusFlow connectors service. Note that this is copyable using the copy button displayed next to the number is itself

Ethernet Connection Status

The IP address will be displayed if connected

WiFI Connection Status

The IP address will be displayed if connected

On-Board WiFi Hotspot (Labelled WiFi AP)

Will show a green tick if the On-Board WiFi Access point is enabled

MQTT Connected

Will show a green tick to indicate the connector is has connected to MobiusFlow

Module 1 / Module 2

Will show which types of transceivers are physically connected to the Raspberry Pi

Address

The IP location of the MQTT broker. This may be a local IP address, an internet IP address or a DNS name. Do not include any protocol prefix (such as mqtt:// or https://)

Port

The port the MQTT broker is running on. If using the MQTT broker within MobiusFlow, this port number is set and shown within the service settings within the MQTT broker service within MobiusFlow. This is often 1883. Note that, if the MobiusFlow instance is hosted in the MobiusFlow cloud, port 1883 is externally exposed on 8883 (i.e. use 8883 even if MobiusFlow shows 1883)

Username

The username of any MQTT user set up on the MQTT broker (if using the broker within MobiusFlow, this can be set up within the MQTT broker service settings within MobiusFlow)

Password

The password of any MQTT user set up on the MQTT broker (if using the broker within MobiusFlow, this can be set up within the MQTT broker service settings within MobiusFlow)

PSK

The pre-shared key of the connector. This can be anything however it must match the pre-shared key set up within the target connector object within the connectors service within the MobiusFlow instance.

Use TLS

A true / false property determining if the connection will attempt to use MQTT of TLS. This depends on how MobiusFlow is hosted and where the connector is accessing it from. Most set ups which involving accessing MobiusFlow over the internet will use TLS. If using an instance of MobiusFlow hosted via the MobiusFlow cloud, always enable TLS.

HID

Hub ID

6-Digit Hex

SID

Service ID

3-Digit Hex

PID

Profile ID (A MobiusFlow profile can be thought of as an object type)

4-Digit Hex

INS

Instance ID (The ID of that object instance)

4-Digit Hex

RID

Resource ID

2-Digit Hex

MQTT Broker

To allow MobiusFlow connectors to connect to and send data to

Connector Service

To collect incoming messages from MobiusFlow connectors and bring the data into the MobiusFlow Hub

EnOcean Devices Service

To decode raw EnOcean messages from the MobiusFlow hub and populate this service's child MobiusFlow objects with human-readable data.

8443

8443

Mobius Engine API

All

8080

8080

MobiusFlow UI (Toolbox)

All

1880

1880

Flows access

All

8883

1883

Suggested use for MQTT Broker. If the port is set to 1883 within the service, it will be accessible in the outside via 8883.

All

30815

30815

Free

All

30817

30817

Free

All

8081

8082

Chirpstack UI

MobiusFlow with LoRaWAN Stack

1700

1700

EU868 Chirpstack LoRaWAN Gateway Bridge

MobiusFlow with LoRaWAN Stack

1701

1700

US915_0 Chirpstack LoRaWAN Gateway Bridge

MobiusFlow with LoRaWAN Stack

1702

1700

US915_1 Chirpstack LoRaWAN Gateway Bridge

MobiusFlow with LoRaWAN Stack

8443

8442

mobius

8443

Mobius Engine API

All

8080

8080

toolbox

8080

MobiusFlow UI (Toolbox)

All

1880

1879

mobius

1880

Flows access

All

8883

1883

mobius

1883

Free - Normally MF MQTT Broker

All

30815

30814

mobius

30815

Free

All

30817

30816

mobius

30817

Free

All

8081

8082

chirpstack

8082

Chirpstack UI

MobiusFlow with LoRaWAN Stack Only

/

1884

mosquitto

1884

Chirpstack MQTT broker

MobiusFlow with LoRaWAN Stack Only

/

8090

chirpstack-rest-api

8090

Chripstack Rest API

MobiusFlow with LoRaWAN Stack Only

1700

1700

chirpstack-gateway-bridge-eu868

1700

EU868 Chirpstack LoRaWAN Gateway Bridge

MobiusFlow with LoRaWAN Stack Only

1701

1701

chirpstack-gateway-bridge-us915_0

1700

US915_0 Chirpstack LoRaWAN Gateway Bridge

MobiusFlow with LoRaWAN Stack Only

1702

1702

chirpstack-gateway-bridge-us915_1

1700

US915_1 Chirpstack LoRaWAN Gateway Bridge

MobiusFlow with LoRaWAN Stack Only

{null,null,null,null,null,null,null,null,null,null,null,null,null,null,12,null} -> PV = 12 (priority 15)
{null,null,null,null,null,null,null,null,56,null,null,null,null,null,12,null} -> PV = 56 (priority 9)
{null,null,78.5,null,null,null,null,null,56,null,null,null,null,null,12,null} -> PV = 78.5 (priority 3)

URI Section

Length

Example

Description

HID

6

000001

The Mobius Hub or node ID. This should be unique within a MobiusFlow system.

SID

3

01F

The microservice ID. This must be unique for all services on a single node.

PID

4

003A

The object's profile ID. This describes the objects type. Object profiles determine what resources an object has available.

INS

4

0001

The object's instance number. This is unique for each object of a specific type belonging to a service.

RID

2

40

The resource ID

Wildcard

Meaning

Example

+

Any value in this location

000001/+/003A/+/40

#

Any value in this location and all subsequent locations

000001/01F/#

Ports and Endpoints

The ports in used by Mobius Gateways. These are for services that can be hosted on the Gateway.

Port
Protocol
L4 Protocol
Description

80

http

TCP

443

https

TCP

502

modbus

TCP

not enabled by default, only on physical gateway

1883

mqtt

TCP

not enabled by default

4840

opc-ua

TCP

not enabled by default, only on physical gateway

8883

mqtts

TCP

not enabled by default

8443

http / https

TCP

Engine RESTful API

30815

mqtt

TCP

mobius sensor gateway

The physical gateways fleet management and remote connectivity service require outbound access to these services

Port
Protocol
Description

53

UDP

DNS: used by devices to resolve hostnames for connection to the service

123

UDP

NTP: used by devices to synchronize time

443

TCP

HTTPS: used by devices to poll for updates and to download application and host OS updates. OpenVPN: used by devices to provide real-time status and control

Raspberry Pi 4
Raspberry Pi 5
Raspberry Pi 4 Application
Raspberry Pi 5 Application
here
Balena Etcher tool
here
here
factory reset
here
here
here
here
OPC UA
BACnet
DALI
EnOcean
MobiusFlow LoRaWAN LNS
edge computing
MQTT
microservice
MobiusFlow Uniform Resource Identifiers
MobiusFlow Uniform Resource Identifiers
WebSocket
Mobius URI
MobiusFlow Uniform Resource Identifiers
MobiusFlow Uniform Resource Identifiers
BACnet
hexadecimal

Discover

API Discover calls

The discover calls are used to learn about the present state of a given MobiusFlow instance

Authorization

API Authorization calls

The authorization controller is used to login to the API, in addition user management.

When a login call is completed, the API will return a bearer token which should be used in the auth header of all future calls. This token is set to expire 10 minutes after its generation.

A refresh token is also included in the login response, and this is used in the body of the refresh call to get new tokens with refreshed expiry times. Ensure a refresh call is made prior to any given bearer token's expiry to avoid having to login again.

MobiusFlow Internal Security

Introduction

Node Internal Communication

With Each node consisting of the base of a hub and one or more services, and optionally routers. If for the purpose of this initial discussion assume that the services are only communicating with local hardware, or handling logic, therefore having no mechanism for communicating off of the local hardware. We will discuss how this can be achieved later on.

Service Authentication

If the service signs its JWT with the same psk as is stored in the hub's psk file it will successfully complete the authentication process to the hub. On doing this it will be sent a copy of the hubs psk file, giving the service the ability to the received directly signed messages from authorised services.

After successful authentication the service will have a copy of the psk of all services that are authorised to communicate through the hub. The service will then with no further action from the hub be able to validate the authenticity and integrity of messages that have come from a service on the same node.

Service Communication

Once passing traffic the MQTT message will consist of:

The time stamp will allow for the message to have a validity life span that can be configured for all services connected to the hub. Internally all messages will be signed in this way and therefore provide a high degree of integrity to the internal communication.

Services may be intentionally created to connect to external interfaces such as a service the connects to remote I/O via TCP/IP or an Azure IoT hub Client, if it is desired to configure a node in this scenario, it is recommended to utilise two interconnected nodes one that handles the external communications and one that handles the more trusted internal communication, the nodes could exist on the same hardware. doing so would allow the creation of multiple trust boundaries

Node External Communication

The internal side of the router acts in exactly the same way as a service, but will automatically subscribe to all messages from every other service within that node.

The external side of the router will have the ability to sign its messages in the same fashion as the services do for internal communication, it will have two pre shared keys and internal or service psk and an external psk.

Node Peering

To allow router to validate the authenticity and integrity of messages form other routers, the external psks will be required to be manually shared between all the routers that want to take part in this communication. the result is that the external psk file will contain the keys of all authorised routers and therefore nodes.

This communication is done over the WebSocket protocol as it reduces the need to configure firewalls to allow MQTT communication. node peering is best used in an enclosed environment where there is a high degree of confidence in the integrity of the network with which the communication is taking place. This is like to require the input of network and cyber security professionals.

Larger Node Deployments

In larger deployments of nodes peering may not be viable because of the administrative overhead, or there may be low confidence in the network integrity. there may also be a require to not only ensure Authenticity and Integrity of messages, but also confidentiality.

In this case it will almost always be easier to provide the node with access to the public internet where things like server name resolution and certificate control are well practised and understood.

Due to the large complexity in provisioning the system in this scenario, It is envisaged at this stage that IAconnects will provide the service that provides the functions of the architecture shown above.

MobiusFlow Engine API

Description of MobiusFlow Engine RESTful API V1

The MobiusFlow Engine API is used interface with MobiusFlow via http and https. The API allows clients to perform all functions within MobiusFlow, from managing user accounts, to getting and setting data, as well as manipulating the MobiusFlow configuration by adding, removing and editing MobiusFlow objects, services and flows.

Controllers

Protocols, Endpoints and Ports

If connecting to a local instance of MobiusFlow, the http protocol can be used. If connecting to an instance of MobiusFlow via the internet, https should be used. The API is always exposed on port 8443.

All endpoints lead with:

{{protocol}}://{{hostname}}:8443/api/v1

Where the protocol and hostname parameters are replaced with the true protocol and hostname. For example, in the case of connecting to a local instance of MobiusFlow, the leading path would look like:

http://localhost:8443/api/v1

Further Documentation & Postman Collection

Object

API Object & Resource Calls

The object calls are used to read, add, remove and manipulate MobiusFlow objects and resources.

Service

API Service Calls

The service calls are used to read, add, remove and manipulate MobiusFlow services.

Node

API Node Calls

The node calls are for reading a MobiusFlow hub as well as resetting the pre-shared keys on a given hub

Backup

Subscription

API Subscription Websocket

Full functionality of Subscription Websocket is described in the connect call below.

Flows

API Calls for Node-RED Flows

Used get and set the full configuration the flows.

Command

API Send Command Calls

Backup and Restore

You can use the backup and restore feature to backup the full configuration of a MobiusFlow instance, and to restore the configuration of a MobiusFlow instance to a previously saved backup.

Overview

In summary, all configuration data of a MobiusFlow instance can be stored within a single .zip file. This means the current configuration of any MobiusFlow instance can be backed up by simply downloading this backup file and saving it in a safe location of your choice. Similarly, the configuration of any MobiusFlow instance can restored by uploading one of your previously saved backup files.

All backup and restore functionality is accessed through the 'Backup/Restore' menu located on the 'Administration' Tab.

Backup

On the 'Backup/Restore' menu, you can create a backup by clicking 'Backup'.

Giving the backup an appropriate name is recommended. In the above example, the name 'example-backup' has been set. The system will automatically append date/time information to the file name.

Once the backup file has been created, click 'Download Zip' to download it.

Alternatively, the you can click 'Request new backup' to return to the previous menu and generate an updated backup file.

Be sure to save your backup file in a safe location! There is nothing worse than not being able to find a much needed backup file.

Restore

The restore feature is particularly useful if you want to copy a MobiusFlow configuration onto to other MobiusFlow instances, however it also useful if you've managed to break everything.

The 'Backup/Restore' menu is also used for restoring. You can restore by first clicking 'Upload Zip' and then browsing to the .zip backup file you previously saved in a safe place.

Once uploaded, the menu will show the backup information as well as allowing you to click 'Restore'.

Accept the a confirmation dialog to proceed.

You will be notified that the restoration process has started and then MobiusFlow will then reboot, completing the restore process.

Congratulations for completing your restore!

Licence

API Calls for Licence Management

Profiles

API Calls for Service Profiles, Object Profiles and Command Profiles

INGY Lighting

Article explaining how to use MobiusFlow INGY service. It is recommended you read this article in its entirety before using the MobiusFlow INGY integration.

Overview

The MobiusFlow INGY integration implements the following features:

  • Changing lighting level set points of group scenes

  • Switching between lighting scenes of a given group

  • Adding / removing devices from groups

  • Acquisition of data from INGY devices

  • Direct interfacing with INGY API and Datastream

This article explains how to use the INGY service to achieve all of the above.

Connecting to INGY Gateway

To interface with an INGY system, an INGY gateway must be present on the project site. These INGY gateways can be acquired directly from INGY.

MQTT

The INGY gateway host's and MQTT broker, and as such, MobiusFlow uses an MQTT connection to this broker to allow two-way communication between MobiusFlow and INGY.

INGY gateways create 3 MQTT users, each with different sets of permissions. MobiusFlow requires usage of the datastream and MQTT JSON server (API) users. These user credentials can be found in the Gateway MQTT server section of the INGY gateway configuration page.

Network Requirements

Ensure the INGY gateway is accessible by MobiusFlow over an on-site (or otherwise) network. As it is likely the local IP address of the INGY gateway will be directly referenced within MobiusFlow, it is recommended that this should be set up on the network with a static local IP address. This means the connection will not break due to DHCP reassignment.

INGY Service Settings / Requirements

Once the INGY service has been added, the following configuration window is shown:

The following fields must be populated to allow MobiusFlow the connect the INGY gateway.

Checking connection

The INGY service will attempt to connect via MQTT to the INGY gateway when the service is started. As such, to test the connection, start the service and observe the service status:

Lighting Control

Lighting control is exclusively performed by commanding lighting groups to change to different scenes.

For every INGY lighting group, add an ingy_group (PID 028A) MobiusFlow object to represent the group within MobiusFlow. The group number of the INGY group can be set in the object settings.

Viewing the resources on an INGY group object shows:

Groups pre-configured using INGY App

If using a group the has been pre-configured using the INGY App, ensure the group number is MobiusFlow is set equal to the group number of the group previously created in the INGY App.

If a group with a matching group number has been set up within the INGY App, MobiusFlow will automatically pull (given some time) the sceneSetLevel values of any scenes which have already been set up using the app.

The scene number matches the display order shown in the INGY App. As such, the first scene shown in the list on the INGY App is scene 0, the second is scene 1, the third is scene 2, and so on.

Scene Settings

Each lighting group supports 8 different scenes (numbered 0 - 7). These may have been previously set up using the INGY app. MobiusFlow will automatically query the level set point of each scene and will display this in the corresponding knownLevel resource. MobiusFlow can also be used to change each scene's level set point (0% - 100%) by setting that scene's corresponding setLevel resource.

Note that: If the INGY App has been used to pre-set up some scenes, MobiusFlow will still allow you to change these settings. As such, it as advised to adhere to a common source of truth, either configuring all scenes within the INGY App or within MobiusFlow.

It may be possible that the real-world scene setting levels or MobiusFlow have become out of synchronous. This could have been caused if they were changed by something that was not MobiusFlow, such the INGY app or INGY API. To ensure the real-world scene level settings do match the settings within MobiusFlow, set the resendSetLevelCommands (RID 83) to true. Note that MobiusFlow will immediately reset this back to false, whilst also resending the command to set the scene level settings of all scenes.

Changing Scene

MobiusFlow automatically queries which scene is currently being exhibited by the group, and shows this information in the knownScene resource.

Changing the currently exhibited scene on a given group is done in two steps:

  1. Set the sceneSetting resource to scene number of the desired scene (if the resource currently shows the desired scene, this step can be skipped)

  2. Set the send trigger to true (the service will automatically set this back to false immediately afterwards). This will cause MobiusFlow to command the INGY group to change to the desired scene.

Alternatively, these steps can be handled in one by using the INGY Set Scene flows node.

When configured, this node is pointed at an INGY group object, and will receive an input payload (0 - 7) representing the desired scene number. The node automatically handles the resource changes to cause the group to change scene.

Devices and Querying

MobiusFlow objects can added to represent real-world INGY devices. These objects are used to query and encapsulate the data coming from these devices in addition to control which group a given device is a member of.

Searching ingy in the objects library will display the list of options of MobiusFlow objects that can represent the real-world INGY devices.

Add these options in the correct quantities to represent the INGY devices within MobiusFlow.

Every INGY object type will require the entry of the INGY node address (wirepas address) as well some other information:

If knowing the current lighting level of any lighting device is required, ensure Auto Query Level is checked to ensure MobiusFlow automatically pulls current level data from this device.

INGY Partition

Some INGY nodes can be partitioned to act as separate controllable devices. Represent these partitions using multiple MobiusFlow objects with the same Node Address but different partition numbers. If the INGY node has not been partitioned, the partition number should be set to the default of 0.

Grouping

The known group membership of all devices is automatically queried by MobiusFlow and this data is stored into knownGroupMembership resource.

The group membership of a given device can be changed by setting the setGroup resource. The knownGroupMembership resource should reflect this change after a period of time.

Sometimes it may be required that the command to group a given INGY device needs to be re-sent. This often can occur if the device is offline when the original setGroup command is sent. In this situation, set the sendRegroup resource to true. Note that, MobiusFlow will immediately set this resource back to false whilst sending the regroup command.

Data

MobiusFlow will automatically pull all possible data from the known INGY nodes into corresponding MobiusFlow objects.

Direct interfacing with INGY API

Two flow nodes have been written to aid direct interfacing with the INGY API.

Note that all INGY flow nodes share the MobiusFlow connection configuration node. If this has not been created already, the node will prompt you to set up the connection between flows and MobiusFlow.

INGY Spy Node

The INGY Spy node is used to view all the Datastream and API messages coming from INGY gateway. This includes data sent out over the INGY gateway's datastream as well as directly viewing all API commands and responses.

The INGY spy node can be aimed to a given MobiusFlow INGY service within it's config, and set up with debug nodes as shown above. The two outputs map to the datastream and api respectively.

INGY Send API Command Node

The INGY send raw command node is used to send direct API command to the INGY API.

The node must be aimed at a specific MobiusFlow INGY service within the node's configuration.

The node takes input messages who's payload must be formatted to be a valid INGY API command as shown in the INGY API documentation. The response to this command will be outputted from the nodes output.

It is recommended a function is used to set the command body as shown in the example flow below:

In the above example the code in the function node is a as follows:

Chirpstack

MobiusFlow is a software platform designed for control and monitoring of sensors and actuators in simple (single instance) or complex (multiple instances working together) systems (see for more info). It has a microservice based architecture where each microservice can contain both application logic and object state. Object types are predefined and contain any number of resources which represent the values associated to an object’s attributes (e.g. a temperature sensor may contain resources for Name, Location, Temperature etc.). A MobiusFlow node (a single instance of the software) contains a central hub and one or more microservices. All microservices contain an MQTT client and communicate with each other via the hub which is an MQTT broker. The broker is responsible for authenticating the services when they connect. The TCP/IP port used for internal MQTT comms is normally firewalled off to prevent any external traffic and all messages passed between microservices are encoded using to ensure message integrity. If communication is required between Mobius nodes, a Mobius router is added to the configuration. This is a special microservice which handles external traffic between Mobius nodes. All traffic passed through a router is encoded with JWTs using pre-shared keys (PSKs) specifically for this purpose ensuring that no internal PSKs leave a Mobius node. External traffic is also MQTT based and can be secured with TLS if required. One of the most important part of MobiusFlow is the “ Mobius protocol” over MQTT. This is a predefined set of MQTT topics based around the Mobius object URIs which allows “two way point to point” messaging via MQTT. This means that Mobius nodes and microservices can discover other nodes, services, objects and resources and microservices can read and write resource values on objects belonging to any other microservice on any node within a Mobius system. In addition to reading a writing, a microservice can subscribe to object or resource level change of value (COV) messages. The MobiusFlow protocol is similar to the LWM2M protocol but over MQTT.

The is designed to allow efficient communication for IoT Devices whilst providing structure and definable trust boundaries.

There are 2 ways to move messages to and from a one is via the designed for this task, and preserving the integrity of the the message within the node. the other is with a dedicated , this breaches that integrity to a degree but may be desirable and even necessary in some situations.

As the hub is created a pre-shared key (psk) file is generated, these can also be changed using the configuration service. each valid service must have a copy of its psk, to successfully authenticate with the hub. The hub will have the corresponding psk in its psk file. This key is used as a secret key as part of a .

When a service connects to a hub it uses the . The MQTT username is the service's and 001F/01F and the MQTT password is a JSON object containing the services PID and SID with a timestamp which is then converted into a JWT (JSON Web Token). The time stamp ensures tight time synchronisation is a requirement and provides greater integrity.

the JSON Web Token will also carry the topic, the message payload itself, and a timestamp this will all be hashed along with the service own key creating a to allow integrity checking:

Although as just discussed it is not impossible to create service that communicate to external interfaces, it is not recommended to use these on the same node as it compromises the integrity of the node. It is preferable to utilise a known route into and out from the node, it is recommended that this route is a .

Routers are split into two parts, one side of the router communicates internally with its associated hub and all of the services within a node, while the other side of the router communicates externally through a 'no-mans' broker to other routers on other nodes. All external communication is done using MQTT over the protocol. This could be done over a secure or non-secure connection (ws:// or ws s://).

Node Peering will require the provision of a MQTT broker capable of using . this will be a function that will be optionally provided by the mobius router.

to achieve this the nodes should utilise WebSockets over (TLS), this is in fact simply a upgrade in the same way WebSockets are used, on a connection

Additionally, the API allows clients to subscribe to specific real-time events within happening within a given MobiusFlow instance (see ). In this use case, the API will upgrade the client to use the Websocket protocol (ws / wss).

All API endpoints are described in the following subsections. The subsections are divided into the functional groups (controllers); , , , , , , , and .

Swagger documentation describing the API in full, can be found . This documentation includes example bodies and responses for every endpoint. Finally, a postman collection containing parameterised examples of all client calls can be downloaded below.

Setting
Explanation

Note that: If INGY groups have been pre-configured in the using the INGY App, ensure the group number matches that of group number displayed in the INGY App. See full section .

Mobius Overview
JSON Web Token (JWT)
Mobius architecture
mobius node
mobius router
service
JSON Web Token (JWT)
MQTT built in username / password authentication
profile ID (PID)
service (SID)
HMAC
mobius router
WebSocket
MQTT over WebSockets
Transport Layer Security
HTTP
HTTPS
subscription controller
Authorization
Discover
Node
Service
Object
Profiles
Command
Flows
Subscription
here

MQTT Broker

The IP location of the MQTT broker (IP address, DNS name, or otherwise). For MQTT over TLS include mqtts:// prefix, otherwise, inclusion of protocol is not required.

MQTT Port

Run by INGY on 1883 by default.

MQTT Username (Datastream)

Found on INGY gateway configuration page.

MQTT Password (Datastream)

Found on INGY gateway configuration page.

MQTT Username (JSON API)

Found on INGY gateway configuration page.

MQTT Password (JSON API)

Found on INGY gateway configuration page.

INGY Firmware Version

85, 94, etc. To use mixed firmware versions, use multiple INGY services each with different firmware versions.

msg.payload = {
    version: 85,
    type: "volatile_partition",
    command: "QUERY_CAPABILITIES",
    destination: 'broadcast'
}
return msg;
here
LNS Service documentation

EnOcean Equipment Profiles (EEPs)

These EEPs detail communication protocols for energy-harvesting wireless devices, enhancing MobiusFlow's offerings in smart buildings, industrial automation, and beyond.

Switches and Rocker Profiles (F6-XX-XX)

  • F6-02-XX: Standardized rocker switch functionality, perfect for wireless and battery-free light switches.

  • F6-01-01: Classic single rocker switch for versatile applications.

  • F6-05-01 & F6-05-02: Advanced switches supporting multi-rocker configurations.

  • F6-04-01: Specialised profile for unique switch requirements.

Temperature and Humidity Sensors (A5-XX-XX)

  • A5-02-01 to A5-02-20: Comprehensive profiles for temperature and humidity sensing across varied ranges and resolutions.

  • A5-04-01 to A5-04-03: Focused on precise temperature monitoring for HVAC and building automation.

  • A5-06-02: Compact profile for humidity measurement.

  • A5-07-01 to A5-07-03: Temperature and humidity combined for indoor climate monitoring.

  • A5-08-01 & A5-08-08: Advanced temperature sensors for outdoor and industrial use.

Light and Occupancy Sensors

  • A5-09-04 & A5-09-02: Profiles for daylight harvesting and light level monitoring.

  • A5-10-03, A5-10-06, A5-10-12, A5-10-19: Advanced occupancy and motion detection sensors.

  • A5-11-01 & A5-11-02: Multi-functional sensors for light, motion, and temperature.

Energy and Utility Monitoring

  • A5-12-01 to A5-12-03: Profiles tailored for energy consumption and utility monitoring.

  • A5-14-58 & A5-14-05: Energy efficiency sensors for load and power monitoring.

  • A5-20-01: Compact profile for energy harvesting applications.

People Counting and Building Analytics

  • IMBUILDINGS PEOPLE COUNTER: A specialised profile for tracking occupancy and people flow in smart buildings.

  • D1-03-C1, D1-03-C2, D1-03-C0: Advanced profiles for presence detection and people counting.

Advanced Actuator and HVAC Controls

  • D2-32-00 to D2-32-02: Actuator profiles for heating, ventilation, and air conditioning systems.

  • D2-14-5C, D2-14-40 to D2-14-53: Comprehensive profiles for valve and motorised actuator control.

  • D2-03-OA: Specialised actuator profile for unique applications.

Miscellaneous Profiles

  • D2-05-00: General-purpose profile for binary data transmission.

  • D2-01-0A to D2-01-12: Profiles for advanced control systems.

  • D2-15-00: Versatile profile for industrial applications.

Specialised Devices

  • ECHOFLEX MOS MT: Tailored profile for motion sensing in smart building environments.

Why Use MobiusFlow for EnOcean EEPs?

MobiusFlow provides a powerful and flexible platform for integrating EnOcean devices. Its library’s support for a wide range of EEPs ensures compatibility with various devices and applications, making it ideal for:

  • Smart Building Automation: Efficiently manage lighting, HVAC, and energy systems.

  • Industrial Automation: Enhance operational efficiency with precision monitoring and control.

  • Energy Efficiency: Monitor and reduce energy consumption with advanced sensors.

By leveraging MobiusFlow’s extensive EEP library, businesses can create scalable, efficient, and energy-saving IoT solutions tailored to their needs. Whether you’re looking to optimise a single building or manage a global network of properties, MobiusFlow and its EnOcean integration make it possible.

LoRaWAN Local Network Server

Technical Documentation of how to use LoRaWAN Local Network Server

Overview

You can add the LoRaWAN LNS Service (labelled as lorawan local network server) to the MobiusFlow from the service library.

The service requires the region to be set. If mulitple regions are required, using muliple LoRaWAN LNS services is neccessary.

If muliple LoRaWAN LNS service are used on the same instance, both will use the same LNS backend.

Integrated Device Types

If a device is integrated, MobiusFlow will atomically handle the decoding of device data and the movement of this data into corresponding MobiusFlow objects (Uplink). Some devices also support downlink, i.e. sending data from MobiusFlow to the device. For integrated device types, if there is a public downlink encoder available, MobiusFlow will automatically handle the encoding and sending of data to devices of that type.

List of Integrated Device Types

The list will be populated soon. Please contact support for enquires about specific devices.

Unintegrated Device Types

All LoRaWAN devices intend to be integrated in future. To request integration of a new device type, please contact MobiusFlow support at info@mobiusflow.com.

Supported Regions

Currently supported regions are shown in the following list:

  • EU868

  • US915_0

  • US915_1

Support for all regions is planned for the near future. To request support for a specific region, please contact MobiusFlow support at info@mobiusflow.com.

Connecting a LoRaWAN Gateway to MobiusFlow

Adding the Gateway to MobiusFlow

LoRaWAN gateways are added as MobiusFlow objects to the LoRaWAN LNS service. When viewing the configuration of LoRaWAN LNS service, search for lorawan_gateway in the object library. A lorawan_gateway object (PID 028D) should be added for each physical LoRaWAN gateway MobiusFlow will connect to.

For each lorawan_gateway object, the 16 character (Hex) Gateway ID must be populated to match that of the ID of the physical LoRaWAN gateway. Ensure the object settings are saved. As with all MobiusFlow services, a stop/start cycle or hot reload must be performed if any settings are changed or objects are added or removed.

Setting up the Connection on the Gateway

Ensure the MobiusFlow is accessible by the LoRaWAN gateway, i.e. if MobiusFlow is running in the cloud, ensure the gateway has an internet connection. Alternatively, if MobiusFlow is running on-prem, ensure the LoRaWAN gateway has access to it over the local network.

The connection between LoRaWAN gateway and MobiusFlow uses Semtech UDP. Set up a Semtech UDP packet forwarder on each gateway with the following paramaters.

Hostname

Use the standard TCP/IP hostname of the gateway. If the gateway is running in the cloud and hosted by MobiusFlow, it will be in the form xxx.mobiusflow.io e.g. grand-eagle-11.mobiusflow.io. If MobiusFlow is being hosted on-prem or elsewhere, use the IP address of the host or DNS designation of the host. Do not include any protocol or a port in the hostname.

Port Number

The Semtech UDP packet forwarded allows both an inbound and outbound port to be specified in the configuration. Ensure the same port number is used for both inbound and outbound.

The exact port number depends on which region the gateway is operating in. See the table below for all port numbers by region.

Region
Port

EU868

1700

US915_0

1701

US915_1

1702

It is critical the correct port i used. The gateway may still be able to connect if the incorrect port is used, however this will cause the LNS to confuse the region of this gateway causing further problems.

Opening of Network Ports

Ensure the required ports are open on the gateway's network. Also ensure the required ports are open on the network where MobiusFlow is running. If the instance of MobiusFlow is hosted in the MobiusFlow cloud, the ports for all region types will be open by default.

Connecting a LoRaWAN Device

To add a device, when inside the LoRaWAN LNS Service's configuration, search for that device type in the objects library and add instance of it.

For each new object, the Device EUI and Device App Key (OTAA Key) must be populate to match that of the device.

Ensure the settings are saved. As with all MobiusFlow services, a stop/start cycle or hot reload must be performed if any settings are changed or objects are added or removed.

If the credentials are set correctly, the device is in range of the LoRaWAN gateway, and the LoRaWAN gateway is connected to MobiusFlow, live decoded data from the device will now appear within the new object's resources.

Downlink (Sending commands to a device)

The flows can be used to enqueue downlink messages to some device types. MobiusFlow is packaged with a set of MobiusFlow/LoRaWAN specific nodes designed to work with the LoRaWAN LNS service.

LoRaWAN Send Downlink Node

To enqueue downlink messages to device types that have been integrated with MobiusFlow, use the lorawan send downlink node type shown below.

This node will accept into its input an incoming unencoded payload as per how the manufacture's downlink encoder accepts the messages.

Inside the node's configuration allows specification of which device the downlink messages will be enqueued on. This is done by specifying the device's MobiusFlow URI which can either be pasted in or searched for.

The node's output will send messages informing the user of the result of the attempted downlink enqueue action.

Results include a success, a failure due to an incorrectly structured input payload (included in the error message is information regarding the correct payload structure), or failure due to this device type not supporting downlink all together.

Checking Enqueued Messages

The number of currently enqueued messages can be found for each device by viewing resource 21 of that object representing that device.

Example Flow

The following example uses an inject input to trigger the inital message. Then a function node formats to message's payload into the correct format for the device type. The lorawan send downlink node has been set to connect to a specific MobiusFlow object. The debug is used to monitor the output of the lorawan send downlink node so the user is informed if the action was a success or failure.

The contents of the function node using to format the payload is follows:

// this is an example
msg.payload = {
    config1: 0,
    config2: 3,
    mode: 'normal',
    action: 'open'
}
return msg;

Raw Downlink

For some device types, manufactures do not release downlink encoders, and as such it is not possible to integrate this functionality into MobiusFlow. It is however possible to write your own in the flows and then send this via the LoRaWAN LNS service to be enqueued directly to a LoRaWAN device. This is done using same basic flow as regular downlink however using the lorawan send raw node.

The lorawan send raw node bypasses helpers and checks provided by MobiusFlow objects. As such, the node's configuration requires the specification of a LoRaWAN device EUI instead of a MobiusFlow object's URI.

The node does not have an output. This is because it uses a 'fire-and-forget' style mechanism and therefore cannot monitor if the enqueue action was successful or not.

The message payload must be built inside the function node. The result of this encoding must be an object containing the required LoRaWAN fPort as well the data property. This data property contains the raw data that will be enqueued (hex bytes in string).

The contents of the above example function node are shown below.

// ensure payload contains fPort and data (hex bytes in string format)
msg.payload = {
    fPort: 0,
    data: '0C1A01230024',
    confirmed: true
}
return msg;

Using Unintegrated Device Types

For unintegrated device types, that is device types that MobiusFlow does not feature inbuilt uplink decoders, downlink encoders and shaped MobiusFlow objects, the lorawan_generic_device object type can be used.

As with all LoRaWAN object, the device EUI and App Key must be set to match of the LoRaWAN device.

Uplink

To the object's configuration is set with the correct device EUI and App Key, data will be pulled into the MobiusFlow object as with all other LoRaWAN object types. Unlike these object types, the data will not be decoded and left a raw string in resource 40. The data can then be handled / post-processed by the user in the flows at will.

Downlink

Downlink is handled in the same manner as for integrated device types. If using the lorawan_send_downlink node, for the lorawan_generic_device object type, no checks are made regarding the format of the payload. As such, ensure the message is pre-encoded into an object containing the fPort and data (hex bytes as string) properties.

The lorawan_send_raw node can also be used as before, to enqueue downlink message to unintegrated device types.

LNS Backend (Chirpstack)

The MobiusFlow LNS Service uses Chirpstack V4 as an LNS backend. As such, for debugging purposes it is possible to log into this backend if required. Chirpstack runs on port 8081, to browse to this port to access chirpstack.

Every MobiusFlow LNS Service contains a statistics object. This includes some information about the health of the LNS as well as the chirpstack login credentials.

Further Data Transfer between Flows and MobiusFlow Engine

This article explains how to use some of more advanced MobiusFlow nodes used for data transfer to and from the MobiusFlow Engine.

Understanding the following articles is recommended before reading this article:

This article includes information on the following nodes:

Node
Function

Injects object information on object change of value. Based on user defined list of object subscriptions to COV (change of value) events. Defined as list of URIs (including wildcards)

Gets multiple objects based on a list of object URIs (no wildcards)

Gets multiple resources based on a list of resource URIs (no wildcards)

Returns a list of children of a given Hub, Service, Profile or Instance, specified by URI

Returns a list of objects based on a URI or URIs (including wildcards)

Returns a list of resources on a specified service filtered by applying a user defined filtering function on a specified RID of each object

Clears a resource value at a specified priority level

MobiusFlow Inject

The MobiusFlow inject node injects MobiusFlow objects into the flows based on when there is a change of value within that object. The object range the MobiusFlow inject node covers is specified as a list of included / excluded URIs or wildcard URIs.

Config

The node allows a list of subscriptions to be specified in the subscriptions table. These subscriptions tell the node which objects to subscribe to change of value events from. As such, this table is specified as a list of URIs or URI wildcards.

The add button at the bottom of the table can used to add more subscription rows

Each subscription can be specified as an include or an exclude. This will either include or exclude that subscription group from the object selection respectively.

In the config window screenshot above, the 1st subscription row is used to select everything on service 022. The 2nd subscription row is then used to exclude specifically instance 000001/022/000B/0001 from the selection.

Output

The flow below is used to demonstrate the out of the MobiusFlow inject node:

Following a COV event, the debug window showed the following output:

The full JSON response is copyable in the code block below:

{"pid":"0028","ins":"0002","profileName":"enocean_A5-09-04","description":"EnOcean temperature, humidity and CO2 sensor","resources":{"40":{"rid":"40","type":"number","pv":19.2,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,19.2,0],"name":"temperature","settings":{"access":"r","min":0,"max":51,"precision":1,"units":"C"},"config":{"access":"r","min":0,"max":51,"precision":1,"units":"C"}},"41":{"rid":"41","type":"number","pv":54.5,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,54.5,0],"name":"humidity","settings":{"access":"r","min":0,"max":100,"precision":1,"units":"%"},"config":{"access":"r","min":0,"max":100,"precision":1,"units":"%"}},"42":{"rid":"42","type":"number","pv":2550,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,2550,0],"name":"co2","settings":{"access":"r","min":0,"max":2550,"precision":0,"units":"ppm"},"config":{"access":"r","min":0,"max":2550,"precision":0,"units":"ppm"}},"43":{"rid":"43","type":"bool","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"name":"hasTemperatureSensor","settings":{"access":"r"},"config":{"access":"r"}},"44":{"rid":"44","type":"bool","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"name":"hasHumiditySensor","settings":{"access":"r"},"config":{"access":"r"}},"00":{"rid":"00","type":"string","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"name":"parentObject","settings":{"access":"rw","tags":{"attribute":"true"}},"config":{"access":"rw","tags":{"attribute":"true"}}},"01":{"rid":"01","type":"string","pv":"Air Quality Sensor 2","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Air Quality Sensor 2",""],"name":"name","settings":{"access":"r","tags":{"attribute":"true"}},"config":{"access":"r","tags":{"attribute":"true"},"pv":"Air Quality Sensor 2"}},"02":{"rid":"02","type":"datetime","pv":"2024-12-10T19:12:47.430Z","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"2024-12-10T19:12:47.430Z","1970-01-01T00:00:00.000Z"],"name":"objectLastUpdated","settings":{"access":"r"},"config":{"access":"r"}},"03":{"rid":"03","type":"string","pv":"Air Quality Sensor","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Air Quality Sensor",""],"name":"description","settings":{"access":"r","tags":{"attribute":"true"}},"config":{"access":"r","tags":{"attribute":"true"},"pv":"Air Quality Sensor"}},"04":{"rid":"04","type":"string","pv":"MobiusFlow Studio Henley","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"MobiusFlow Studio Henley",""],"name":"location","settings":{"access":"r","tags":{"attribute":"true"}},"config":{"access":"r","tags":{"attribute":"true"},"pv":"MobiusFlow Studio Henley"}},"0A":{"rid":"0A","type":"string","pv":"A5-09-04","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"A5-09-04",""],"name":"eep","settings":{"access":"r","tags":{"attribute":"true"}},"config":{"access":"r","pv":"A5-09-04","tags":{"attribute":"true"}}},"0B":{"rid":"0B","type":"string","pv":"01879DE6","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"01879DE6",""],"name":"uid","settings":{"access":"r","maxlen":8,"tags":{"attribute":"true"}},"config":{"access":"r","maxlen":8,"tags":{"attribute":"true"},"pv":"01879DE6"}},"0C":{"rid":"0C","type":"number","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"name":"status","settings":{"access":"r"},"config":{"access":"r"}},"0D":{"rid":"0D","type":"number","pv":-77,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,-77,0],"name":"dBm","settings":{"access":"r","units":"dBm"},"config":{"access":"r","units":"dBm"}},"0E":{"rid":"0E","type":"bool","pv":true,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,true,false],"name":"lrn","settings":{"access":"r"},"config":{"access":"r"}}},"families":["EnOcean","CO2Sensor","HumiditySensor","TemperatureSensor"],"timestamp":"2024-12-10T19:12:47.431Z","changed":["02"]}

Get Multi-Object

The get Multi-Object node gets multiple objects based on a defined set of object URIs.

Config

The Get-Multi Object requires a list of object URIs to be specified within the objects table. Each row will point to a single object URI.

More URI rows can be added using the add button at the bottom left of the Objects table. The following screenshot shows an example node's config populated with 3 object URIs:

Input

Any input message can trigger the node.

Output

The node outputs an array of MobiusFlow objects. The following code block is a copyable JSON response example:

[{"pid":"FFC0","ins":"0001","profileName":"mobiusFlowConnector","description":"","resources":[{"rid":"00","type":"string","name":"parentObject","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"rw","tags":{"attribute":"true"}}},{"rid":"01","type":"string","name":"name","pv":"Elliot's Connector","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Elliot's Connector",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"02","type":"datetime","name":"objectLastUpdated","pv":"2024-12-11T17:07:49.628Z","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"2024-12-11T17:07:49.628Z","1970-01-01T00:00:00.000Z"],"settings":{"access":"r"}},{"rid":"03","type":"string","name":"description","pv":"EnOcean + WorkOcc connector for Elliot's house","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"EnOcean + WorkOcc connector for Elliot's house",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"04","type":"string","name":"location","pv":"Elliot's desk","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Elliot's desk",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0A","type":"string","name":"partNumber","pv":"EXT00112","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"EXT00112",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0B","type":"string","name":"serialNumber","pv":"MF_00BCC0","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"MF_00BCC0",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0C","type":"string","name":"psk","pv":"elliotConnector","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"elliotConnector",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0D","type":"string","name":"firmwareVersion","pv":"3.2.1","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"3.2.1",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0E","type":"string","name":"module1Type","pv":"WorkOcc","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"WorkOcc",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0F","type":"string","name":"module2Type","pv":"EnOcean","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"EnOcean",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"10","type":"string","name":"enOceanChipID","pv":"FFC23F80","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"FFC23F80",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"11","type":"string","name":"macAddress","pv":"24:0A:C4:8A:C0:BF","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"24:0A:C4:8A:C0:BF",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"12","type":"string","name":"ipAddress","pv":"192.168.0.88","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"192.168.0.88",""],"settings":{"access":"r"}},{"rid":"13","type":"string","name":"subnetMask","pv":"255.255.255.0","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"255.255.255.0",""],"settings":{"access":"r"}},{"rid":"14","type":"string","name":"dnsAddress","pv":"194.168.4.100","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"194.168.4.100",""],"settings":{"access":"r"}},{"rid":"15","type":"string","name":"defaultGateway","pv":"192.168.0.1","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"192.168.0.1",""],"settings":{"access":"r"}},{"rid":"16","type":"string","name":"ssid","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"r"}},{"rid":"17","type":"number","name":"rssi","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r"}},{"rid":"18","type":"string","name":"bssid","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"r"}},{"rid":"40","type":"bool","name":"online","pv":true,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,true,false],"settings":{"access":"r"}},{"rid":"41","type":"string","name":"uptime","pv":"2:04:19","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"2:04:19",""],"settings":{"access":"r"}},{"rid":"42","type":"string","name":"lastEnOceanUID","pv":"002E236A","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"002E236A",""],"settings":{"access":"r"}},{"rid":"43","type":"string","name":"lastWorkOccUID","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"r"}}],"families":[],"isFromConfig":1},{"pid":"0279","ins":"0001","profileName":"lorawan_MileSight_VS121_OccupancySensor","description":"LoRaWAN MileSight VS121 Occupancy Sensor","resources":[{"rid":"00","type":"string","name":"parentObject","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"rw","tags":{"attribute":"true"}}},{"rid":"01","type":"string","name":"name","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"02","type":"datetime","name":"objectLastUpdated","pv":"2024-12-10T17:42:07.184Z","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"2024-12-10T17:42:07.184Z","1970-01-01T00:00:00.000Z"],"settings":{"access":"r"}},{"rid":"03","type":"string","name":"description","pv":"Occupancy sensor in Elliot's room","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Occupancy sensor in Elliot's room",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"04","type":"string","name":"location","pv":"Elliot's room","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Elliot's room",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0A","type":"string","name":"eui","pv":"24E124600C124962","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"24E124600C124962",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0B","type":"string","name":"deviceName","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0C","type":"string","name":"applicationName","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0D","type":"string","name":"gatewayName","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0E","type":"string","name":"gatewayID","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0F","type":"number","name":"rssi","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","units":"dBm"}},{"rid":"10","type":"number","name":"loraSNR","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r"}},{"rid":"20","type":"string","name":"appKey","pv":"5572404C696E6B4C6F52613230313823","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"5572404C696E6B4C6F52613230313823",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"21","type":"number","name":"enqueuedCount","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"precision":0}},{"rid":"40","type":"string","name":"protocolVersion","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"r"}},{"rid":"41","type":"string","name":"serialNumber","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"r"}},{"rid":"42","type":"string","name":"hardwareVersion","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"r"}},{"rid":"43","type":"string","name":"firmwareVersion","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"r"}},{"rid":"44","type":"number","name":"peopleCountAll","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"45","type":"number","name":"regionCount","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":16,"precision":0}},{"rid":"46","type":"number","name":"peopleIn","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"47","type":"number","name":"peopleOut","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"48","type":"number","name":"poepleCountMax","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"49","type":"number","name":"region1Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"4A","type":"number","name":"region2Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"4B","type":"number","name":"region3Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"4C","type":"number","name":"region4Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"4D","type":"number","name":"region5Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"4E","type":"number","name":"region6Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"4F","type":"number","name":"region7Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"50","type":"number","name":"region8Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"51","type":"number","name":"region9Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"52","type":"number","name":"region10Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"53","type":"number","name":"region11Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"54","type":"number","name":"region12Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"55","type":"number","name":"region13Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"56","type":"number","name":"region14Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"57","type":"number","name":"region15Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"58","type":"number","name":"region16Count","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":255,"precision":0}},{"rid":"59","type":"number","name":"flowAtoA","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"5A","type":"number","name":"flowAtoB","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"5B","type":"number","name":"flowAtoC","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"5C","type":"number","name":"flowAtoD","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"5D","type":"number","name":"flowBtoA","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"5E","type":"number","name":"flowBtoB","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"5F","type":"number","name":"flowBtoC","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"60","type":"number","name":"flowBtoD","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"61","type":"number","name":"flowCtoA","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"62","type":"number","name":"flowCtoB","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"63","type":"number","name":"flowCtoC","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"64","type":"number","name":"flowCtoD","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"65","type":"number","name":"flowDtoA","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"66","type":"number","name":"flowDtoB","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"67","type":"number","name":"flowDtoC","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}},{"rid":"68","type":"number","name":"flowDtoD","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":65536,"precision":0}}],"families":["LoRaWAN","OccupancySensor"],"isFromConfig":1},{"pid":"028B","ins":"0001","profileName":"ingy_dimmable_relay","description":"INGY Dimmable Relay","resources":[{"rid":"00","type":"string","name":"parentObject","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"rw","tags":{"attribute":"true"}}},{"rid":"01","type":"string","name":"name","pv":"Elliot's Lamp","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Elliot's Lamp",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"02","type":"datetime","name":"objectLastUpdated","pv":"2024-12-06T13:23:52.259Z","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"2024-12-06T13:23:52.259Z","1970-01-01T00:00:00.000Z"],"settings":{"access":"r"}},{"rid":"03","type":"string","name":"description","pv":"Elliot's Lamp","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Elliot's Lamp",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"04","type":"string","name":"location","pv":"Elliot's Room","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Elliot's Room",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0A","type":"number","name":"nodeAddress","pv":337395361,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,337395361,0],"settings":{"access":"r","min":0,"max":4294967295,"precision":0,"tags":{"attribute":"true"}}},{"rid":"0B","type":"number","name":"partition","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":15,"precision":0,"tags":{"attribute":"true"}}},{"rid":"0C","type":"number","name":"setGroup","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,0],"settings":{"access":"rw","min":0,"max":4294967295,"precision":0,"tags":{"attribute":"true","pv":0}}},{"rid":"0E","type":"bool","name":"autoQueryLevel","pv":true,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,true,false],"settings":{"access":"r"}},{"rid":"40","type":"number","name":"knownLevel","pv":100,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,100,0],"settings":{"access":"r","min":0,"max":100,"precision":0,"unit":"%"}},{"rid":"42","type":"number","name":"knownGroupMembership","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":4294967295,"precision":0}},{"rid":"43","type":"number","name":"activePower","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":5000,"precision":0,"unit":"W"}},{"rid":"44","type":"bool","name":"relayState","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"rw"}},{"rid":"4E","type":"bool","name":"sendRegroup","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"rw"}}],"families":["INGY","Luminaire"],"isFromConfig":1}]

Get Multi-Resource

The get Multi-Resource node returns multiple resources based on a specified set of resource URIs.

Config

The node requires of one or more resource URIs to be defined in the resources table.

The use of URI Wildcards is NOT valid here.

Additionally, the send property allows control of how the resources are outputted.

Input

Any input message can trigger the node.

Output

The format of outputted resources can be switched between simply showing the resource values, or including the resources name and URI with each resource. Example JSON outputs are as follows:

PV (present value) Only

Simple array of PVs, one for each resource defined in the nodes config:

["059663D1",0,"Elliot's Lamp"]

PV, Name & URI

Object keyed by URI, one key for each resource defined in the node's config. Each containing resources PV and name:

{"000001/025/0028/0002/0B":{"pv":"059663D1","name":"uid"},"000001/026/028A/0001/41":{"pv":0,"name":"sceneSetting"},"000001/026/028B/0001/03":{"pv":"Elliot's Lamp","name":"description"}}

Discover

The discover node returns a list of children of a given Hub, Service, Profile or Instance, specified by URI. The following table shows the return type based on which level the URI is specified to.

URI Level
Example URI
Return Type

Hub

000001

List of service of the specified hub

Service

000001/022

List of profiles on the specified service

Profile

000001/022/000B

List of instances on the specified profile

Instance

000001/022/000B/0001

The specified instances and all its resources

Config

The node allows the discovery URI to be specified via the configuration window.

Specifying the discovery URI within the configuration window is not required. This is because it is also possible to specify the discovery URI dynamically via the input topic. If a valid URI is found in both the input topic and the node's configuration, the node's configuration takes precedence.

Input

Any input message can trigger the node. It also possible to define the discovery URI in the topic of the input message. This allows the discovery URI to be dynamically changed. If a valid URI is found in both the input topic, and the node's configuration, the node's configuration takes precedence.

Output

The output type of the discover node varies depending on which level the discovery is made. For all types, the data is packaged within data sub property of the response property of the output payload. See the following screenshot as an example:

Here are example copyable JSON responses at all discovery levels:

Hub

{"error":false,"response":{"ts":"2024-12-11T13:13:24.325Z","uri":"000001/022","data":["0001","000B","0028","002E","0030"]}}

Service

{"error":false,"response":{"ts":"2024-12-11T13:05:27.824Z","uri":"000001/022","data":["0001","000B","0028","002E","0030"]}}

Profile

{"error":false,"response":{"ts":"2024-12-11T13:16:06.751Z","uri":"000001/022/000B","data":["0001","0002"]}}

Instance

{"error":false,"response":{"ts":"2024-12-11T13:16:46.213Z","uri":"000001/022/000B/0001","data":[{"pid":"000B","ins":"0001","profileName":"enocean_F6-02-XX","description":"EnOcean 4 way switch","resources":[{"rid":"00","type":"string","name":"parentObject","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"rw","tags":{"attribute":"true"}}},{"rid":"01","type":"string","name":"name","pv":"Elliot's Switch","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Elliot's Switch",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"02","type":"datetime","name":"objectLastUpdated","pv":"2024-12-11T11:13:34.964Z","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"2024-12-11T11:13:34.964Z","1970-01-01T00:00:00.000Z"],"settings":{"access":"r"}},{"rid":"03","type":"string","name":"description","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"04","type":"string","name":"location","pv":"Elliot House","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Elliot House",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0A","type":"string","name":"eep","pv":"F6-02-XX","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"F6-02-XX",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0B","type":"string","name":"uid","pv":"002E236A","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"002E236A",""],"settings":{"access":"r","maxlen":8,"tags":{"attribute":"true"}}},{"rid":"0C","type":"number","name":"status","pv":32,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,32,0],"settings":{"access":"r"}},{"rid":"0D","type":"number","name":"dBm","pv":-49,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,-49,0],"settings":{"access":"r","units":"dBm"}},{"rid":"40","type":"bool","name":"button_A0","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"41","type":"bool","name":"button_AI","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"42","type":"bool","name":"button_B0","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"43","type":"bool","name":"button_BI","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"44","type":"bool","name":"bowPushed","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}}],"families":["EnOcean","Switch"],"isFromConfig":1}]}}

Discover Object List

The discover object list node returns a list of MobiusFlow objects based on a URI or URIs (including wildcards).

Config

The node takes the following config properties:

Configuration Field
Explanation

HID

The MobiusFlow hub to discover on (in most cases 000001).

Output

Controls if the output should be MobiusFlow objects or just the URIs of the objects.

Send

Decides if the output is sent as an array packaged in one message or a set of individual messages.

Discover

Allows listing of the discovery URIs. If URIs are specified to hub, service or profile level, URI wildcarding should be used e.g. 000001/#. Each URI can be specified as an include or an exclude. This will either include or exclude that URI group from the object selection respectively.

Input

The node can be triggered by any input message.

Output

Depending on the setting of the output property in the node's configuration, the node will either send whole MobiusFlow objects, or just their URIs. Below are copyable example JSON responses in both cases, based on the following example:

URIs

["000001/022/0001/0001","000001/022/000B/0001","000001/022/000B/0002","000001/022/0028/0001","000001/022/0028/0002","000001/022/0028/0003","000001/022/002E/0001","000001/022/0030/0001"]

MobiusFlow Objects

[{"pid":"0001","ins":"0001","profileName":"serviceStatus","description":"","resources":[{"rid":"00","type":"string","name":"parentObject","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"rw","tags":{"attribute":"true"}}},{"rid":"01","type":"enum","name":"status","pv":"OK","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"OK","UNKNOWN"],"settings":{"access":"r","enum":{"Unknown":-1,"Fault":0,"OK":1}}},{"rid":"02","type":"string","name":"statusText","pv":"Listening for EnOcean devices","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Listening for EnOcean devices",""],"settings":{"access":"r"}},{"rid":"03","type":"datetime","name":"lastChanged","pv":"2024-11-18T17:43:47.609Z","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"2024-11-18T17:43:47.609Z","1970-01-01T00:00:00.000Z"],"settings":{"access":"r"}}],"families":[],"isFromConfig":0,"uri":"000001/022/0001/0001"},{"pid":"000B","ins":"0001","profileName":"enocean_F6-02-XX","description":"EnOcean 4 way switch","resources":[{"rid":"00","type":"string","name":"parentObject","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"rw","tags":{"attribute":"true"}}},{"rid":"01","type":"string","name":"name","pv":"Elliot's Switch","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Elliot's Switch",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"02","type":"datetime","name":"objectLastUpdated","pv":"2024-12-11T11:13:34.964Z","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"2024-12-11T11:13:34.964Z","1970-01-01T00:00:00.000Z"],"settings":{"access":"r"}},{"rid":"03","type":"string","name":"description","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"04","type":"string","name":"location","pv":"Elliot House","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Elliot House",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0A","type":"string","name":"eep","pv":"F6-02-XX","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"F6-02-XX",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0B","type":"string","name":"uid","pv":"002E236A","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"002E236A",""],"settings":{"access":"r","maxlen":8,"tags":{"attribute":"true"}}},{"rid":"0C","type":"number","name":"status","pv":32,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,32,0],"settings":{"access":"r"}},{"rid":"0D","type":"number","name":"dBm","pv":-49,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,-49,0],"settings":{"access":"r","units":"dBm"}},{"rid":"40","type":"bool","name":"button_A0","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"41","type":"bool","name":"button_AI","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"42","type":"bool","name":"button_B0","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"43","type":"bool","name":"button_BI","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"44","type":"bool","name":"bowPushed","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}}],"families":["EnOcean","Switch"],"isFromConfig":1,"uri":"000001/022/000B/0001"},{"pid":"000B","ins":"0002","profileName":"enocean_F6-02-XX","description":"EnOcean 4 way switch","resources":[{"rid":"00","type":"string","name":"parentObject","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"rw","tags":{"attribute":"true"}}},{"rid":"01","type":"string","name":"name","pv":"Office Blue Switch","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Office Blue Switch",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"02","type":"datetime","name":"objectLastUpdated","pv":"1970-01-01T00:00:00.000Z","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"1970-01-01T00:00:00.000Z","1970-01-01T00:00:00.000Z"],"settings":{"access":"r"}},{"rid":"03","type":"string","name":"description","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"04","type":"string","name":"location","pv":"MF Office","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"MF Office",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0A","type":"string","name":"eep","pv":"F6-02-XX","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"F6-02-XX",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0B","type":"string","name":"uid","pv":"0031C26E","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"0031C26E",""],"settings":{"access":"r","maxlen":8,"tags":{"attribute":"true"}}},{"rid":"0C","type":"number","name":"status","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r"}},{"rid":"0D","type":"number","name":"dBm","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","units":"dBm"}},{"rid":"40","type":"bool","name":"button_A0","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"41","type":"bool","name":"button_AI","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"42","type":"bool","name":"button_B0","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"43","type":"bool","name":"button_BI","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"44","type":"bool","name":"bowPushed","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}}],"families":["EnOcean","Switch"],"isFromConfig":1,"uri":"000001/022/000B/0002"},{"pid":"0028","ins":"0001","profileName":"enocean_A5-09-04","description":"EnOcean temperature, humidity and CO2 sensor","resources":[{"rid":"00","type":"string","name":"parentObject","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"rw","tags":{"attribute":"true"}}},{"rid":"01","type":"string","name":"name","pv":"Air Quality Sensor 1","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Air Quality Sensor 1",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"02","type":"datetime","name":"objectLastUpdated","pv":"2024-12-11T14:38:09.169Z","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"2024-12-11T14:38:09.169Z","1970-01-01T00:00:00.000Z"],"settings":{"access":"r"}},{"rid":"03","type":"string","name":"description","pv":"Air Quality Sensor","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Air Quality Sensor",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"04","type":"string","name":"location","pv":"MobiusFlow Office Henley","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"MobiusFlow Office Henley",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0A","type":"string","name":"eep","pv":"A5-09-04","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"A5-09-04",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0B","type":"string","name":"uid","pv":"018C18E9","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"018C18E9",""],"settings":{"access":"r","maxlen":8,"tags":{"attribute":"true"}}},{"rid":"0C","type":"number","name":"status","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r"}},{"rid":"0D","type":"number","name":"dBm","pv":-79,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,-79,0],"settings":{"access":"r","units":"dBm"}},{"rid":"0E","type":"bool","name":"lrn","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"40","type":"number","name":"temperature","pv":19.2,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,19.2,0],"settings":{"access":"r","min":0,"max":51,"precision":1,"units":"C"}},{"rid":"41","type":"number","name":"humidity","pv":56.5,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,56.5,0],"settings":{"access":"r","min":0,"max":100,"precision":1,"units":"%"}},{"rid":"42","type":"number","name":"co2","pv":1910,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,1910,0],"settings":{"access":"r","min":0,"max":2550,"precision":0,"units":"ppm"}},{"rid":"43","type":"bool","name":"hasTemperatureSensor","pv":true,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,true,false],"settings":{"access":"r"}},{"rid":"44","type":"bool","name":"hasHumiditySensor","pv":true,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,true,false],"settings":{"access":"r"}}],"families":["EnOcean","CO2Sensor","HumiditySensor","TemperatureSensor"],"isFromConfig":1,"uri":"000001/022/0028/0001"},{"pid":"0028","ins":"0002","profileName":"enocean_A5-09-04","description":"EnOcean temperature, humidity and CO2 sensor","resources":[{"rid":"00","type":"string","name":"parentObject","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"rw","tags":{"attribute":"true"}}},{"rid":"01","type":"string","name":"name","pv":"Air Quality Sensor 2","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Air Quality Sensor 2",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"02","type":"datetime","name":"objectLastUpdated","pv":"2024-12-11T14:31:23.591Z","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"2024-12-11T14:31:23.591Z","1970-01-01T00:00:00.000Z"],"settings":{"access":"r"}},{"rid":"03","type":"string","name":"description","pv":"Air Quality Sensor","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Air Quality Sensor",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"04","type":"string","name":"location","pv":"MobiusFlow Studio Henley","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"MobiusFlow Studio Henley",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0A","type":"string","name":"eep","pv":"A5-09-04","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"A5-09-04",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0B","type":"string","name":"uid","pv":"01879DE6","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"01879DE6",""],"settings":{"access":"r","maxlen":8,"tags":{"attribute":"true"}}},{"rid":"0C","type":"number","name":"status","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r"}},{"rid":"0D","type":"number","name":"dBm","pv":-77,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,-77,0],"settings":{"access":"r","units":"dBm"}},{"rid":"0E","type":"bool","name":"lrn","pv":true,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,true,false],"settings":{"access":"r"}},{"rid":"40","type":"number","name":"temperature","pv":19.2,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,19.2,0],"settings":{"access":"r","min":0,"max":51,"precision":1,"units":"C"}},{"rid":"41","type":"number","name":"humidity","pv":56,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,56,0],"settings":{"access":"r","min":0,"max":100,"precision":1,"units":"%"}},{"rid":"42","type":"number","name":"co2","pv":2550,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,2550,0],"settings":{"access":"r","min":0,"max":2550,"precision":0,"units":"ppm"}},{"rid":"43","type":"bool","name":"hasTemperatureSensor","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"44","type":"bool","name":"hasHumiditySensor","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}}],"families":["EnOcean","CO2Sensor","HumiditySensor","TemperatureSensor"],"isFromConfig":1,"uri":"000001/022/0028/0002"},{"pid":"0028","ins":"0003","profileName":"enocean_A5-09-04","description":"EnOcean temperature, humidity and CO2 sensor","resources":[{"rid":"00","type":"string","name":"parentObject","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"rw","tags":{"attribute":"true"}}},{"rid":"01","type":"string","name":"name","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"02","type":"datetime","name":"objectLastUpdated","pv":"1970-01-01T00:00:00.000Z","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"1970-01-01T00:00:00.000Z","1970-01-01T00:00:00.000Z"],"settings":{"access":"r"}},{"rid":"03","type":"string","name":"description","pv":"Air Quality Sensor","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Air Quality Sensor",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"04","type":"string","name":"location","pv":"MobiusFlow Office Henley","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"MobiusFlow Office Henley",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0A","type":"string","name":"eep","pv":"A5-09-04","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"A5-09-04",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0B","type":"string","name":"uid","pv":"018C18E7","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"018C18E7",""],"settings":{"access":"r","maxlen":8,"tags":{"attribute":"true"}}},{"rid":"0C","type":"number","name":"status","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r"}},{"rid":"0D","type":"number","name":"dBm","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","units":"dBm"}},{"rid":"0E","type":"bool","name":"lrn","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"40","type":"number","name":"temperature","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":51,"precision":1,"units":"C"}},{"rid":"41","type":"number","name":"humidity","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":100,"precision":1,"units":"%"}},{"rid":"42","type":"number","name":"co2","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r","min":0,"max":2550,"precision":0,"units":"ppm"}},{"rid":"43","type":"bool","name":"hasTemperatureSensor","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"44","type":"bool","name":"hasHumiditySensor","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}}],"families":["EnOcean","CO2Sensor","HumiditySensor","TemperatureSensor"],"isFromConfig":1,"uri":"000001/022/0028/0003"},{"pid":"002E","ins":"0001","profileName":"enocean_A5-07-01","description":"EnOcean occupancy sensor","resources":[{"rid":"00","type":"string","name":"parentObject","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"rw","tags":{"attribute":"true"}}},{"rid":"01","type":"string","name":"name","pv":"Occupancy Sensor","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Occupancy Sensor",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"02","type":"datetime","name":"objectLastUpdated","pv":"2024-12-08T02:51:34.061Z","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"2024-12-08T02:51:34.061Z","1970-01-01T00:00:00.000Z"],"settings":{"access":"r"}},{"rid":"03","type":"string","name":"description","pv":"Occupancy Sensor","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Occupancy Sensor",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"04","type":"string","name":"location","pv":"MobiusFlow Office Henley","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"MobiusFlow Office Henley",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0A","type":"string","name":"eep","pv":"A5-07-01","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"A5-07-01",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0B","type":"string","name":"uid","pv":"01A90FC7","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"01A90FC7",""],"settings":{"access":"r","maxlen":8,"tags":{"attribute":"true"}}},{"rid":"0C","type":"number","name":"status","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r"}},{"rid":"0D","type":"number","name":"dBm","pv":-74,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,-74,0],"settings":{"access":"r","units":"dBm"}},{"rid":"0E","type":"bool","name":"lrn","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"40","type":"bool","name":"occupancy","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"41","type":"bool","name":"supplyVoltageAvailable","pv":true,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,true,false],"settings":{"access":"r"}},{"rid":"42","type":"number","name":"supplyVoltage","pv":3.1,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,3.1,0],"settings":{"access":"r","min":0,"max":5,"precision":1,"units":"V"}}],"families":["EnOcean","OccupancySensor"],"isFromConfig":1,"uri":"000001/022/002E/0001"},{"pid":"0030","ins":"0001","profileName":"enocean_A5-07-03","description":"EnOcean occupancy and lux sensor","resources":[{"rid":"00","type":"string","name":"parentObject","pv":"","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",""],"settings":{"access":"rw","tags":{"attribute":"true"}}},{"rid":"01","type":"string","name":"name","pv":"Occupancy Sensor 2","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"Occupancy Sensor 2",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"02","type":"datetime","name":"objectLastUpdated","pv":"2024-12-11T14:11:01.819Z","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"2024-12-11T14:11:01.819Z","1970-01-01T00:00:00.000Z"],"settings":{"access":"r"}},{"rid":"03","type":"string","name":"description","pv":"PIR Motion Sensor","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"PIR Motion Sensor",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"04","type":"string","name":"location","pv":"MobiusFlow Office Henley","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"MobiusFlow Office Henley",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0A","type":"string","name":"eep","pv":"A5-07-03","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"A5-07-03",""],"settings":{"access":"r","tags":{"attribute":"true"}}},{"rid":"0B","type":"string","name":"uid","pv":"018AFE2B","prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,"018AFE2B",""],"settings":{"access":"r","maxlen":8,"tags":{"attribute":"true"}}},{"rid":"0C","type":"number","name":"status","pv":0,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,0,0],"settings":{"access":"r"}},{"rid":"0D","type":"number","name":"dBm","pv":-82,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,-82,0],"settings":{"access":"r","units":"dBm"}},{"rid":"0E","type":"bool","name":"lrn","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"40","type":"bool","name":"occupancy","pv":false,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,false,false],"settings":{"access":"r"}},{"rid":"41","type":"number","name":"lux","pv":7,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,7,0],"settings":{"access":"r","min":0,"max":1000,"precision":1,"units":"lx"}},{"rid":"42","type":"number","name":"supplyVoltage","pv":3,"prar":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,3,0],"settings":{"access":"r","min":0,"max":5,"precision":1,"units":"V"}}],"families":["EnOcean","OccupancySensor","LightSensor"],"isFromConfig":1,"uri":"000001/022/0030/0001"}]

The node type also allows the output to be in the form of a single message, or a message for each discovered object. This is controlled by the send configuration property. The screenshots below show this action via use of the following flow:

Single Message (Array format)

Multiple Messages (Individual format)

Filter By Rid Value

The Filter By Rid Value node returns a list of object URIs on a specified service, filtered by a user defined filtering function. This filtering function is applied to a user specified resource on each object and is written in Javascript.

Config

The node takes the following configuration properties:

Configuration Field
Explanation

URI

URI of the MobiusFlow service to search in (HID/SID)

PIDs

An JSON array of profile IDs the search will cover. Suppose IDs 0258 and 0259 were to be covered, this field would be written as ["0258", "0259"].

RID

The resource ID of the resource on each object the filtering function will evaluate.

Limit

Maximum number of results to return from search.

Function

Filtering function written in Javascript taking a parameter v, representing the value to apply the filtering function to.

Input

The node is triggered via any input message.

Output

The node will return a list of resources matching the criteria specified in the configuration.

The following is a simple flow to trigger the Filter By Rid Value node and display the output in the debug window.

In this example, the config of the Filter By Rid Value node is set to the following:

The filtering function is also shown in the following code block:

(v) => {
    return v > 0;
}

The node has been setup to search on MobiusFlow Hub 000001, service 02A. The search has been specified to only cover PID 0201. Resource 40 has been selected as the resource to which the filtering function will be applied.

In this example, the filtering functional itself has been coded to return a true result if the resource's value is greater than 0.

Triggering flow yields the following in the debug panel:

The results is the URIs of the objects which passed the filtering function when applied to resource 40 on each object.

Clear Resource

The clear resource node clears the value of a resource at a specified priority.

Config

The node takes the following configuration:

Configuration Field
Explanation

URI

URI of resource value to be cleared. This can left blank because this can also by specified in the input topic.

Priority

Priority level within priority array to be cleared, default 15. (If you do not understand this leave this at 15)

Input

The node is triggered via any input message. The URI of the resource to be cleared can be specified in the topic of the input message. This allows the target resource of the node to become dynamic.

If the target URI is defined both in the node config and the topic of the input message, the node will use URI specified in the config.

Output

Following the use of this node, the node will output the new value of the resource. If priority 15 was cleared, this will likely be the falling back value residing in priority slot 16.

DALI via AFDWeb MQTT

This page covers how to use the ADFWeb HD67941-B2 DALI/MQTT converter with MobiusFlow. The article covers control, querying and configuration for both standard luminaires and emergency lights.

rchitecture Overview

The ADFWeb HD67941-B2 DALI/MQTT bridge acts as a converter between MQTT and DALI protocols. The bridge connects to an MQTT broker via either ethernet or WiFi. The bridge acts as a DALI master and therefore the pair of DALI lines is run directly into it. This completes the DALI/MQTT connection.

MobiusFlow can be connected to the same MQTT broker as DALI/MQTT bridge, allowing the two the communicate via MQTT. This allows MobiusFlow achieve to two-way communication with a given DALI circuit, hence allowing control, querying and configuration to be achieved.

The overall architecture is shown in the diagram below.

Service - adfweb dali mqtt

A MobiusFlow service called 'adfweb dali mqtt' has been made to specifically to allow control, querying and configuration to be performed simply and easily from MobiusFlow. Each adfweb dali mqtt service connects to a single HD67941-B2, so if your application uses mutliple HD67941-B2 then multiple adfweb dali mqtt services should be used.

For some use cases that will be covered later in this article, MobiusFlow direct commands (DCMDs) can be used to control some functions of service. These DCMDs are sent via the MobiusFlow engine API most commonly from the Flows, however direct HTTP requests can also be used.

As such, a lower-level system architecture diagram looks as follows:

MQTT Broker

The MQTT broker can be run anywhere which is accessible over a network to both the HD67941-B2 and MobiusFlow. For ease, in most cases the MQTT broker is run within MobiusFlow itself. As such, the architecture diagram becomes the following:

HD67941-B2 Configuration

Navigate to the the MQTT Set Topic menu:

MQTT Publish

Once on the MQTT Set Topic menu, navigate to the MQTT publish tab. Create a single entry the following settings:

Topic

mobiusDALIquery/{MACID}

Note that {MACID} should be replaced with the MAC ID of the HD67941-B2 you're using. For example:

mobiusDALIquery/1064E209AD03

Template

The template should be set to the following JSON string:

{
    "channel": $CHANNEL$, 
    "adv": $ADV$, 
    "grp1": $GRP1$, 
    "grp2": $GRP2$, 
    "ans": $ANSWER$, 
    "status": $STATUS$, 
    "type": $TYPE$, 
    "min": $MIN$, 
    "max": $MAX$  
}

All remaining fields should be populated as shown in the screenshot below:

MQTT Subscribe

Navigate to the MQTT Subscribe tab.

Topic

The topic should be set as follows

mobiusDALIwrite/{MACID}

As before, {MACID} should be replaced with the MAC ID of the HD67941-B2 you're using. For example:

mobiusDALIwrite/1064E209AD03

The remainder of the row should be populated as shown in the screenshot below:

This completes the configuration required for MobiusFlow. Ensure all MQTT changes are saved before flashing the new configuration to the HD67941-B2.

Luminaires and Groups

Overview

Within MobiusFlow, a given DALI luminaire or DALI group is represented by an equivalent luminaire and group object. Both object types are designed to reside on the adfweb dali mqtt. This service is shown configured and running in the screenshot below.

The two object types are tabulated below.

Object
Profile ID (PID)
Name in MobiusFlow
Parent Service

DALI Luminaire

027A

dali_Luminiaire_v2

adfweb dali mqtt

DALI Group

027B

dali_group

adfweb dali mqtt

A single instance of both of these objects is shown live on an adfweb dali mqtt service in the screenshot below. The screenshot also shows the configuration page for the luminaire object. A DALI short address should be entered to match that of a real-world DALI luminaire.

The configuration window of a group object is shown in the screenshot below. Similarly to a luminaire, a group address should be added to represent the group number of the DALI group this object will represent.

Control

Overview

Both Luminaire objects and Group objects feature a setPoint resource (rid: 41). To change the lighting level, this resource should be simply be set in the same manner as any other MobiusFlow resource.

In the case of the Luminaire object, a knowLevel resource is also present. This populated as a result of the the current level being queried. It exists because sometimes due to issues with the system, there may be a discrepancy between the demanded level and actual level.

Within a luminaire, a resource exists for each group, allowing you to choose which groups the luminaire is a member of.

The screenshot below partially shows the resource list for the luminaire object.

Note that, the group membership of all luminaires should be set via changing the default value of any group membership resource prior to starting the adfweb dali mqtt service. Do not make the mistake of changing the live value of these resources after the service has started. Although this will work, if the service is restarted, this group membership information will not be saved.

The group object is simpler. As querying the level of a whole group is not possible in DALI, no known level resource exists. As with the luminaire, the lighting level of the DALI group can be changed by setting the setPoint resource.

Flows Examples

Below is an example of a simple flow with two inject buttons, one to set the level to 95% and the other to 5%. The inject nodes are linked to a setResource node which setup to set the setPoint resource of a live DALI luminaire (resource 000001/020/027A/41).

A very similar flow is shown to change the level of a group between 80% and 10%. In this case the setResource has been set to set the setPoint resource of the DALI group (resource 000001/020/027B/0001/41.

A more typical use case may be to have the lights automatically controlled. As well as this, it may be required that groups and single luminaires may need to be controlled as one. In the below flow, an EnOcean PIR is linked to a 'local control' zone node, which is then linked both a setResource node linking to a single DALI luminaire, and a DALI group.

The local control node us used in this case to set time periods of when the lights should be at given levels. The config window for this node is shown below

Note that is node is included within the node-red-contrib-mobius-flow-lighting package and may not be included within your Flows palette by default. If this is the case, it can be instantly added using the palette manager.

Querying

Overview

The system has been setup to automatically query several key properties of all luminaires. These are as follows:

  • Group Membership (returned as raw 2 byte, bit-array)

  • Ballast Status

  • Lamp failure status

  • Lamp arc power status

  • Power failure status

  • Raw status (all status information returned as 1 byte, bit-array)

  • Device Type

  • Max lighting level

  • Min lighting level

Each luminaire object has resources to store this data. These resources are populated automatically when information is received from the HD67941-B2 DALI/MQTT bridge.

The system also allows the user to perform some additional queries manually. The queries can be sent by sending the adfweb dali mqtt service a recognised MobiusFlow direct command (DCMD). These DCMDs can be sent directly using the MobiusFlow engine API or by using the DCMD node within the Flows. Ensure the DCMD is setup with a timeout time of at least 10,000ms. All queries use the DCMD command name:

GENERIC_DCMD

Supported queries and their associated DCMD data are tabulated below:

Query Type
Example DCMD Data

Query power up level

Query system failure level

Query fade time / rate

Query power failure

Query dtr content

In the above table, all payloads were shown for a target DALI luminaire with a DALI short address of 0, however this should be replaced with the DALI short address of whichever luminaire is the target of the query (0-63).

After sending the DCMD, if correct, you should receive a response. This response will be in the form of a raw byte. The DALI documentation should be used to interpret this data.

Flows Examples

Data that is automatically queried from all luminaires can be found in that luminaire's resource list.

In the example flow below, a resource COV node has been used to respond to the change of value of the lamp failure status (resource 54). This may be useful if actions need to be taken in such an event, e.g. notifying maintenance. A similar flow could be made to respond to the data from any of the resources.

In the case of special queries (queries which are not automatically run), as explained before, DCMDs should be sent. The flow below shows how this could be set up.

The function node labelled function 1, is used to set the correct DCMD data for the query. The configuration is shown below:

The DCMD node is setup as follows:

Note that the URI property should be set to target the adfweb dali mqtt service. In this case, the service id of the adfweb dali mqtt service is 020 and the hub id the MobiusFlow instance that service is running on is 000001, hence the target URI of 000001/020.

Configuration

Overview

Configuration is performed in the same manner as manual querying, using DCMDs to directly interface with adfweb dali mqtt service, sent either directly to the MobiusFlow engine API or using the Flows.

Ensure the DCMD is setup with a timeout time of at least 10,000ms. All queries use the DCMD command name:

GENERIC_DCMD

Supported queries and their associated DCMD data are tabulated below:

Query Type
Example DCMD Data

Set maximum allowed lighting level

Set minimum allowed lighting level

Set power up lighting level

Set system failure level

Set fade time

Set fade rate

Store current lighting level in dtr

In the above table, all data packets were shown for a target DALI luminaire with a DALI short address of 0, however this should be replaced with the DALI short address of whichever luminaire is the target of the query (0-63).

The level parameter should be varied to set the desired quantity accordingly.

The group property can be set to true if an entire DALI group is being configured at once. Note, in this case, the address property will represent the group number (0-15) instead of a DALI short address.

Flows Examples

The flow below shows how a DCMD node could be used to send configuration commands, in this case setting the maximum lighting level:

The node function node labelled function 4 is used to set the DCMD data. The configuration for this node is as follows:

The DCMD node is setup as follows:

Note that the URI property should be set to target the adfweb dali mqtt service. In this case, the service id of the adfweb dali mqtt service is 020 and the hub id the MobiusFlow instance that service is running on is 000001, hence the target URI of 000001/020.

Emergency Lights

Overview

A MobiusFlow object type has been created to represent DALI emergency lights. This object type contains resources to capture information regarding the status of the emergency light as well as test results. As with all other DALI object types, the DALI emergency light is designed to be a child of the adfweb dali mqtt service. It's details are tabulated below.

Object
Profile ID (PID)
Name in MobiusFlow
Parent Service

DALI Emergency Light

0259

dali_emergency

adfweb dali mqtt

The screenshot below shows a DALI emergency light object within an adfweb dali mqtt.

Like all DALI objects, the DALI emergency object requires a DALI short address to be assigned to it:

Control & Querying

No automatic control or querying of DALI emergency lights is performed. As such, all interfacing is performed using MobiusFlow direct commands (DCMDs) sent to the adfweb dali mqtt service, either via the MobiusFlow engine API or using the Flows.

In case of queries, data received as a result of the query automatically populates the corresponding MobiusFlow object. The data is also returned to the user via the DCMD response as normal.

Ensure the DCMD is setup with a timeout time of at least 10,000ms. All queries use the DCMD command name:

GENERIC_DCMD

Supported actions and their associated DCMD data are tabulated below:

Action
Example DCMD data

Rest

Inhibit

ReLight Inhibit

Start function test

Start duration test

Stop test

Reset function test done flag

Reset duration test done flag

Reset lamp time

Store DTR as emergency level

Store test delay time high byte

Store test dalay time low byte

Store function test interval

Store duration test interval

Store test execuation timeout

Store prolong time

Start indentification

Query battery charge

Query duration test result

Query lamp operational time

Query emergency mode

Query failure mode

Query emergency status

In the above table, all data packets were shown for a target DALI emergency light with a DALI short address of 0, however this should be replaced with the DALI short address of whichever emergency light is the target of the action (0-63).

Flows Examples

The flows can be used to easily send DCMDs to the adfweb dali mqtt service to complete any desired actions. The flow below has been set to automatically query the potential failure mode on interval.

The function node labelled function 8 is used to set the DCMD data prior to the request. The configuration for the node is as follows:

The DCMD node is setup as follows:

Note that the URI property should be set to target the adfweb dali mqtt service. In this case, the service id of the adfweb dali mqtt service is 020 and the hub id the MobiusFlow instance that service is running on is 000001, hence the target URI of 000001/020.

Note that, no debug node is used here to display query results. This is because, in the case of DALI emergency lights, the data is auto-populated into the corresponding DALI emergency light object.

Data Transfer between Flows and MobiusFlow Engine

This page explains how to use the MobiusFlow specific Node-RED nodes to pull data from the MobiusFlow Engine into the flows, as well as how to move data from the flows back into the MobiusFlow Engine.

Understanding the following articles is recommended before reading this article:

All specific information on how to use each node can also be found within that nodes help pane within Node-RED. As well as this guide, we recommend using the help panes as a close reference when first learning how these nodes are used.

Moving data into Flows

Pulling data into a given flow can be triggered in two ways. Firstly, a message within the flows can cause a 'Get', where data is pulled from the MobiusFlow Engine on demand. Alternatively, flows can be setup to respond to a change of value (COV) of a given MobiusFlow resource or object within the MobiusFlow Engine.

Basic Get

The simplest 'Get' nodes come in the form of getResource and getObject nodes, which get the current value of a specified MobiusFlow resource or object respectively. An example flow using the getResource node is shown below.

Both the getResource and getObject nodes require a MobiusFlow URI to be specified to control which data they fetch. This is set within the node configuration.

In the above example, the URI has been set to the resource 000001/027/0201/0001/40. Upon clicking done, the node label reflects this specification.

When the getResource or getObject nodes receive an input message, the 'Get' will be performed and the results will be sent out of the node's outputs. In the above case, clicking the inject button will trigger the flow causing the 'Get' to occur, and the output of this will be detected and displayed by the debug node.

The getObject node works in an identical way however an object URI is specified instead of a resource URI.

Note that the output from a getObject node is more complex due to the data from a whole MobiusFlow object (including all resources) being pulled rather than just a specified resource.

Basic COV

Basic COV nodes include the resourceCov and objectCov nodes. These directly reflect how the getResource and getObject nodes work respectively however respond to a change of value within the MobiusFlow Engine, rather than a trigger message.

The nodes are configured in the same way, by specifying either a resource URI or object URI.

In the above example, the resourceCov node has responded the resource of URI 000001/027/0201/0001/40 changing to value of 1. This is reflected in the debug window.

The equivalent flow can also be constructed for the objectCov node. This flow will a respond to a change of any of the resources contained within the specified object.

Notice, in the case of the objectCov node, in the debug window only changed resource are shown (in this case the objectLastUpated time and the value). It can be changed in the nodes configuration so all resources are contained in the output message if this is required.

Additional Outputs

You may have noticed that in the case of the some nodes, an extra output is present. This output provides a response with an increased level of information if this is required in your flow.

Notice in the above debug window, the resultant response contains both the name of the resource as well as its new value, instead of just the value itself.

Increasing the level of detail of the output response can be further expanded for almost all MobiusFlow nodes by enabling the 'Use detailed outputs' option in the node configuration.

Notice now in the flow below that the node now has four outputs. Each output has an ever increasing level of detail and this is shown in the four responses in the debug window.

Further Get and COV nodes

There is an array of other node types which allow data fetching from the MobiusFlow Engine in a variety of specific ways. These will not be explained in full but will be summarised here.

Node Type
Type
Explanation

Mobius Flow Inject

COV

Get Multi-Object

Get

Filter by Rid Value

Get

Allows a set of objects to be specified as well as a single resource. When triggered, the node will test the specified resource of all objects against a user defined filtration function and will output a list of all objects which passed the filter.

Discover

Get

Allows a the discovery of MobiusFlow entities based on a URI specified within the input topic. The discovery will work on any level (service / profile / object / etc. ) based on how specified the input URI is.

Discover Object List

Get

Moving data from Flows to MobiusFlow Engine

Often useful data will be in your flows from an external sources or maybe simply the result of a calculation based on several other pieces of data. Either way, it is often useful to put this data back into a MobiusFlow resource so it can be used in the same way as any other data within MobiusFlow.

A 'Set' can be performed as a single resource or a group of multiple resource at once using the setResource and setMultiResource nodes respectively.

Set Resource

The setResource node allows the user to specify a target resource URI, and if valid, will set that resource to whatever the payload of the input message is.

In the above case, the inject node has been set up to inject a message with a payload of 10, causing the setResource node to set the MobiusFlow resource of URI 000001/027/0201/0001/40 to a value of 10.

You may notice the setResource node also contains outputs of its own. These allow the message to continue to trigger further actions if required.

Set Multi-Resource

The setMultiResource requires specification of a target object URI. It expects the input payload to contain an array of JSON objects each containing a resource / priority / value (RPV) triplet. More information can be found in the nodes help pane. An example payload to set resource 40 to a value of 1 and a resource 41 to a value of True may look like the following.


[
    { "r": 40, p: 15, v: 1},
    { "r": 41, p: 15, v: true }
]

Input Topic

It is very important to note that most of the node's functionality depend on input topic. If any of the nodes detect that the input topic is the form of a MobiusFlow URI, this input topic will override the URI specified within the nodes own configuration. This can often cause problem if you're stringing multiple MobiusFlow nodes together which relate to different URIs. These issues can be circumvented by using a change node to delete or change message topics where necessary.

The behaviour can also be very useful. This is because you can leave a given MobiusFlow node's URI field unspecific an rely solely on input topic to control its function. This means that the function of a single node can be dynamically change based on the state of other parts of your flows, avoiding the need for long lists of of the same type of node and complex switching logic.

EnOcean Devices

Article covering MobiusFlow EnOcean Devices service

Overview & Purpose

The EnOcean Devices service handles the decoding of incoming data from EnOcean devices. All EnOcean Devices services listen for EnOcean message broadcasts from the MobiusFlow hub. If any incoming EnOcean messages correspond to any EnOcean device object on a given EnOcean Devices service, the service will decode the data and populate that object.

EnOcean Objects

Each real-world EnOcean device must be represented in MobiusFlow by a corresponding EnOcean device object. To work correctly, these objects must exists within an EnOcean Devices service.

To add new EnOcean device objects, navigate to the object configuration page of the EnOcean Devices service.

EnOcean device objects can added via the Object Library:

All EnOcean device objects require the EnOcean UID of the corresponding real-world EnOcean device to entered:

To realise any changes, the object settings must be saved and the service started / restarted:

Once the object is live, any decoded data from the corresponding EnOcean device can viewed by navigating to that objects resources:

Dataflow & Connectors

Sending Data to EnOcean Devices

Receiving and Sending Raw EnOcean Telegrams

This article aims to explain how raw EnOcean telegrams can be sent and received within MobiusFlow. The article briefly covers the supported telegram types and illustrates how these types affect the setup of a given flow.

Receiving

Overview

EnOcean telegrams can be received and injected into a given flow using the Subscribe to Broadcast Command node, labeled 'sub bcmd'. This node is shown below.

Within the node's configuration, you can specify a Mobius Command ID. This Command ID controls which type of incoming telegrams the node receives.

Once an incoming telegram of the specified type is detected by the sub bcmd node, the node will forward this telegram out of its output.

Command Types

The table below shows which Command ID entries relate to which telegram types. The table also shows screenshots of each Command ID being used within the sub bcmd node configuration.

Type

Command ID

Example Screenshot

ERP1

(EnOcean Radio Protocol 1- Fixed Length)

ENOCEAN_RADIO_ERP1

ERP1 VLD (EnOcean Radio Protocol 1 - Variable Length

ENOCEAN_RADIO_ERP1_VLD

MSC (Manufactuere Specific Commands)

ENOCEAN_RADIO_MSC

RMC (Remote Management Command)

ENOCEAN_RADIO_RMC

Example

In this example, a Sub BCMD node is used to subscribe to incoming EnOcean RMC telegrams. The sub bcmd node is linked to a debug node to allow the telegram to be displayed. This setup is shown in the flow below.

The configuration of the sub bcmd node is shown below.

Sending

This sections covers how to send EnOcean telegrams using the MobiusFlow Connector hardware.

MobiusFlow Versions v1.x.x (v1.19.9 and newer)

EnOcean telegrams can be sent from the flows using the Send Broadcast Command node, labeled 'send bcmd'. This node is shown below.

On opening the node's configuration, a Command ID is required to specify the function of the node. To allow the node to send EnOcean telegrams, the Command ID should read 'ENOCEAN_RADIO_TX'. This is shown in the configuration window below.

The node accepts and forwards data contained within the payload of incoming messages. The appropriate incoming message structure is shown below.

msg.payload = {
 connectorURI: /*(Connector MobiusFlow URI)*/,
 rawData: /*(Command Data)*/,
}
Property
Explanation

connectorURI

The URI of the MobiusFlow Connector that will be used to transmit the EnOcean telegram.

rawData

An array of single-byte numbers containing the transmission data. The length of this array will depend on the telegram type.

Below is shown an example configuration of a function node that can be used to generate a payload of the required format.

This data is also shown in the following code block.

msg.payload = {
    connectorURI: '000001/024/FFC0/0001',
    rawData: [
        0x00,
        0x07,
        0x07,
        0x01,
        0xf6,
        0x70,
        0x00,
        0x00,
        0x00,
        0x0A,
        0x30,
        0x01,
        0xff,
        0xff,
        0xff,
        0xff,
        0xff,
        0x00
    ]
}
return msg;

MobiusFlow Versions v2.x.x

As well as supporting the Sub BCMD node method from MobiusFlow versions 1.x.x, MobiusFlow 2.x.x introduces the EnOcean Connector TX node for further ease of sending EnOcean telegrams.

Within the node's configuration, you must specify a MobiusFlow connector in which telegrams will be sent from.

The URI of the connector can either be typed in, or it can be searched for using the search button. In the above example, the connector with URI '000001/024/FFC0/0001' has been selected.

The node will send any data within the payload of the incoming message. A screenshot of example code of a function node used to set this payload is given below.

This code is also given in the following code block.

msg.payload = [
    0x00,
    0x07,
    0x07,
    0x01,
    0xf6,
    0x70,
    0x00,
    0x00,
    0x00,
    0x0B,
    0x30,
    0x01,
    0xff,
    0xff,
    0xff,
    0xff,
    0xff,
    0x00
]
return msg;

Checksums and Sync Byte

All EnOcean telegram types feature a sync byte and some checksum bytes to ensure message integrity. When forming a telegram, the user does not need to include the sync byte or checksum bytes, as these are automatically added by MobiusFlow.

For further information about EnOcean telegrams structures we recommend consulting documentation provided by EnOcean.

Licensing (v1.19.1 and later)

Licence information is included within the the environment variables of the Mobius service in the docker-compose.yml file

Online Licence

  • For online licences only the licence code itself needs to be included

  • The environment variable used for this MOBIUS_LICENCE

  • For example:

Offline Licence

  • As well as the licence code, offline licences must include a licence key and licence token

  • These are included in the environment environment variables MOBIUS_LICENCE_KEY and MOBIUS_LICENCE_TOKEN respectively For example:

Updating a Licence

  • If the licence information is replaced, the environment variable MOBIUS_LICENCE_RESET must be set to true as shown below

  • This forces MobiusFlow to reload and update it's licence information

  • Once MobiusFlow has started, ensure that this environment variable is set back to false for any subsquent restarts where the licence information has not been changed

  • For offline licences, if you are updating the licence code, you must also update the licence token

Glossary

Sick of the jargon? Lost in a sea of terms and acronyms? This glossary will help you smash your way through it.

API

The Edge

Edge computing is a computing architecture focused on bringing computing as close to the source of data as possible in order to reduce latency and bandwidth use. In simpler terms, edge computing means running fewer processes in the cloud and moving those processes to local places, such as on a user’s computer, an IoT device, or an edge server.

Endpoint

Gateway

HTTP(s)

Hypertext Transfer Protocol (HTTP) - This is the most widely used communication protocol used transfer data between computers over the internet.

IIoT

IoT

The Internet of Things (IoT) describes the network of objects or things that are connected together to provide or consume data to you, your business or processes. Things include sensors, actuators, software and other devices that form part of this network.

The term IoT has grown to include systems and devices connected via the internet and via private offline networks.

Microservices

A software architecture where small independent software modules, responsible for a single, specific task, communicate through well-defined APIs to create a more complex system.

Middleware

A piece of software that acts as a bridge between devices, an operating system, or database and applications, especially on a network. It can be described as "software glue"

MQTT

MQTT originally stood for Message Queue Telemetry Transport, but this definition has since been dropped.

Recursion

RESTful API

SaaS

Software as a Service - a method of software delivery and licensing in which software is accessed online via a subscription, rather than bought and installed on individual computers.

TLA

Three Letter Acronym - IT teams love acronyms. Sometimes we have to laugh at ourselves!

TLS

Connecting the Flows to MobiusFlow Engine

Description of how to setup connection between Node-RED Flows and MobiusFlow Engine

The flows are powered by Node-RED. Use the link below to learn more about Node-RED specifically.

Node-RED can be used independently of MobiusFlow, however if you want move data between the MobiusFlow Engine and the Node-RED flows, you will need to link the two.

MobiusFlow Specific Nodes

Setting up MobiusFlow Connection

A MobiusFlow connection is defined within a Node-RED configuration node. Once defined, all MobiusFlow specific nodes in your flows can use this connection to interface with the MobiusFlow Engine.

To create a new connection, open the config window of any MobiusFlow node. If no connection has yet been defined, the node will prompt you to add a new one.

Clicking the pencil icon will open the new connection's configuration window.

Authorisation

All connections require a valid API username and password to ensure this instance of Node-RED is authorised to connect to MobiusFlow.

The default cradentials are:

Username: admin

Password: adm123

We heavily recommend you change the default admin password. If your MobiusFlow instance is not brand new it's very likely this will have been changed already.

Using Node-RED pre-packaged with MobiusFlow

If you're using the instance of Node-RED that has come pre-packaged with MobiusFlow, that means Node-RED and the MobiusFlow Engine and running locally to one another in parallel docker containers . As such, the following settings must be used:

Host

mobius:8443

Use SSL/TLS

This controls if the connection uses HTTP or HTTPS. As Node-RED is running locally relative to the MobiusFlow Engine, this should be left unchecked to ensure the connection uses HTTP.

Using external Node-RED

When running Node-RED remotely relative to the MobiusFlow Engine, we recommend SSL/TLS is enabled so the connection is secure. Also ensure the port is appended to the hostname if required.

Checking the Connection

Once set up, you should check that the flows are successfully connected to the MobiusFlow Engine.

On any MobiusFlow node, select the newly added connection. If this is the only connection you have set up, it will be selected by default.

Upon clicking done and deploying your flows, all MobiusFlow nodes using this connection should show the status 'Connected' if the connection to the MobiusFlow Engine has been made.

If you the connection has not successfully been made, the status of all nodes using that connection will reflect this.

Deploying MobiusFlow in MobiusFlow Cloud

For most use cases, Deploying MobiusFlow in the MobiusFlow Cloud is simplest and most cost effective hosting option.

MobiusFlow a hosting fee for hosting instances in the MobiusFlow cloud. As such, purchaser permissions are required.

When creating a new MobiusFlow instance using manager ensure the Host instance on MobiusFlow Cloud option is checked:

If this option is not available, this is because you do not have purchaser permissions within this fleet.

On creation, there are several options that must be populated:

Hostname

This is the URL the new MobiusFlow cloud instance will be hosted on. In the above example, Manager has automatically suggested average-pug-2488. As such, new Cloud instance will be accessible at the URL average-pug-2488.mobiusflow.io.

Build Type

This selects the version of MobiusFlow to use. If use for the MobiusFlow LoRaWAN LNS is required, ensure the MobiusFlow V2 with LoRaWAN Stack option is selected.

Region

This specifies the region of the world the new Cloud instance is to be hosted on. It is recommended to host the instance as near to where it will be used as possible.\

About Page

Get connector details and update firmware

The about page shows you information about the connector. You can also update the connector's firmware by clicking on the Update Firmware button

Updating Firmware

Click on the Update Firmware button on the About page

Click on Choose File and select the firmware file you want to upload

Click on the Update button

After a few minutes the connector will reboot and start running the new firmware

Make sure that you choose firmware with the same model number as your connector!

Configure Network Page

Configure the wired or wireless Ethernet connection

Select Network Type

You can choose to use a wired or wireless (2.4GHz WiFi) connection to connect a connector to your MobiusFlow® instance

Select your network type using the Connect Via dropdown. The page layout will change depending on the option selected

When using a wireless connection you need to enter the WiFi network's SSID (name) and password. You can click on the Scan WiFi Networks button to get a list of available WiFi networks

You can set a connection timeout in minutes. If the connector fails to connect to a network within this time it will reboot and try again

Select TCP/IP Mode

You can choose to use a DHCP server to allocate the connector an IP Address or set a static IP Address. If you choose to use a static IP Address a few more options will be shown. Set these according to your network

Save Settings

Once you have configured all network settings click the Save button

Click the Home button on the settings saved confirmation page to return to the Home page

Configure MQTT Page

Configure the MQTT connection to MobiusFlow®

MQTT Broker Settings

You can choose any MQTT client ID but this must be unique for your MQTT broker. The default is the connector's serial number

Enter the IP Address or URL of the MQTT broker. You do not need to specify MQTT:// or MQTTS:// before the URL

Enter the MQTT Port number. This is normally 1883 or 8883 for TLS enabled connections

If required enter the MQTT broker authorisation Username and Password. These can be left blank if no authentication is required

Security

Save Settings

Once you have configured all MQTT settings click the Save button

Click the Home button on the settings saved confirmation page to return to the Home page

Adding Your First Device

Add your device to a balenaCloud fleet

What You Will Need?

This guide assumes you will be using a Raspberry Pi 4. The instructions are the same for the UP and Intel NUC devices with the exception of loading the initial balenaOS onto your device.

  1. A balenaCloud account with Microservices access (this requires a paid account)

  2. A Raspberry Pi 4 with minimum 1Gb RAM and 8Gb storage (eMMC or microSD card. The following instructions are for an SD card)

  3. A power supply for your Raspberry Pi 4

  4. An Ethernet network cable

  5. An internet router with a free Ethernet port (or an Ethernet port on your LAN with internet access)

  6. An SD card adaptor for your laptop or PC

Adding a Device

Navigate to the Fleets page

Click on the fleet you want to add a device to

Click on the Add device button

Leave all of the default settings. You can add a WiFi network (client or AP) later.

Select the Download balenaOS option in the drop down button. The balenaOS will start to download

Burning the balenaOS onto the SD Card

Place your microSD card into your SD card adaptor and connect it to your laptop or PC

All data on your SD card will be overwritten!

Open balenaEtcher

Select Flash from file and choose the balenaOS image you downloaded above

Select your SD card as the target

Click on the Flash button

balenaEtcher will burn the balenaOS to your SD card and make it a bootable image. Wait for this to complete and for the image to be verified

Remove the SD card from the SD card adaptor and insert it into your Raspberry Pi 4's SD card slot

Plug the Ethernet cable into your Raspberry Pi 4's Ethernet port and your network

Power up your Raspberry Pi 4

Confirming Your Device is Connected to balenaCloud

After a few minutes your new device will appear in the balenaCloud dashboard. Navigate to your balenaCloud dashboard, select your fleet and view the fleet's Summary page.

You device will be added to the list at the bottom of the page. It will be given a random name which you can change on the device's summary page

If your device does not appear in the list, check that it is powered up and that the network port you have it plugged into has an internet connection.

Data can still be received from and sent to unintegrated device types, however the users must handle data decoding and encoding manually. A full explanation of working with unintegrated device types can be found in .

Reading the sections on and are recommended before reading this section.

All nodes are part of the Node-RED package. All the nodes require a connection to the MobiusFlow Engine.

The use of URI Wildcards is NOT valid here. For this feature, consider using the node

To configure the HD67941-B2, ADFWeb's documentation on HD67941-B should be followed . Use the instructions to get the HD67941-B2 to connect to your MQTT broker. To work with MobiusFlow correctly, specific MQTT settings must be set using the configurator tool.

All Node-RED nodes that facilitate the data transfer between the MobiusFlow Engine and the Flows are contained in the package. Ensure you add this package to your palette to continue. Also ensure you have setup a connection between the MobiusFlow engine and the Flows by following this .

The getResource, getObject, resourceCov and objectCov nodes can also make use or , allowing for a group of objects or resources to be selected instead of a just one.

Allows the definition of a set included or exluded URIs (including ). The node will act similar to an objectCov node for all of these included (but not excluded) URIs and output their data into your flow in the MobiusFlow Inject standard format. Nodei s very useful when linked with a Cloud Format node to allow data to be send to cloud application.

Get several objects in a single message when triggered based on a pre-specified set of URIs (including ).

Works the same as the discover node however allows a set of URIs to specified (including ). Node outputs all discovered MobiusFlow entities as either individual messages or a single array packaged message.

In most cases data is brought in through MobiusFlow connectors. A full guide on setting up MobiusFlow connectors can be found .

The following diagram shows the full data flow between the EnOcean devices and their corresponding MobiusFlow objects. This is explained in full in the .

It is possible to send data from MobiusFlow to EnOcean devices via the flows using the MobiusFlow connectors service. The full article covering Receiving and Sending Raw EnOcean Telegrams in the Flows can be found .

Note that, sending is only support for MobiusFlow Connectors running firmware version v3.2.0 or later. Downloads links to the firmware version can be found .

Application Programming Interface (API) - A well-defined language to allow different software modules to communicate with each other to share data or commands. (see )

Endpoints are the start and end of a data flow in an application. These can include sensors, gateways, cloud servers, applications, and databases. In the context of a complex solution, an endpoint may also be defined as the end of a sub-section of that solution.

An gateway is a small computing device, normally installed at the , for collecting and processing sensor data. It is mostly used where direct communication with a cloud server is undesirable, for instance, when performing local control, a reliable internet connection is unavailable, or when security concerns dictate data should not be published on the internet.

HTTPS is a secure version of HTTP where all data is encrypted using (transport layer security)

The Industrial Internet of Things (IIoT) is a subset of for industrial rather than consumer or commercial applications.

MQTT is an OASIS standard messaging protocol for the Internet of Things (). It is designed as an extremely lightweight publish/subscribe messaging transport that is ideal for connecting remote devices with a small code footprint and minimal network bandwidth. MQTT today is used in a wide variety of industries, such as automotive, manufacturing, telecommunications, oil and gas, etc.

See

A RESTful API is an architectural style for an application program interface () that uses HTTP requests to access and use data. That data can be used to GET, PUT, POST and DELETE data types, which refers to the reading, updating, creating and deleting of operations concerning resources.

Transport Layer Security is a cryptographic protocol typically used with to secure data transferred between computers or the internet or your private network.

A set of MobiusFlow specific nodes have been created to facilitate data transmission between the Flows and the MobiusFlow Engine. The nodes are found in the Node-RED package . If you're using Node-RED pre-packaged with MobiusFlow, this package will be installed by default however if you're using Node-RED running elsewhere, you will need to add this to your palette using the Node-RED palette manager.

Customers can create new MobiusFlow instances themselves using the MobiusFlow manager platform. A full guide on how to use this platform can be found .

Once a MobiusFlow Cloud hosted instance as online, an Environment is created, in-turn controlling how the instance can communicate with the outside world. A full article on this environment can be found .

MobiusFlow® connectors send and receive data via MQTT. You need to configure the MQTT settings to match the configuration you set in the section of this guide.

Enter the same pre-shared key (PSK) as you entered in the section of this guide

If you are using TLS make sure you check the TLS using CA Certificate option. You must also set the correct CA Server Certificate on the page

You may also choose to use a Client Certificate and Key. Check this option if required and ensure that you have setup your client certificate and key on the page

More information and instructions for adding other device types can be found .

A balenaCloud Raspberry Pi 4 Fleet (see )

balenaEtcher installed on your laptop or PC. You can download balenaEtcher

Navigate to your and login in

You have successfully added a new device to your balenaCloud fleet. To deploy MobiusFlow® to this device go to

{
    command: 'queryPowerUpLevel',
    payload: {
        address: 0
    }
}
{
    command: 'queryPowerUpLevel',
    payload: {
        address: 0
    }
}
{
    command: 'queryPowerUpLevel',
    payload: {
        address: 0
    }
}
{
    command: 'queryPowerUpLevel',
    payload: {
        address: 0
    }
}
{
    command: 'queryPowerUpLevel',
    payload: {
        address: 0
    }
}
{
    command: 'setMaxLevel',
    payload: {
        address: 0,
        level: 80,
        group: false
    }
}
{
    command: 'setMinLevel',
    payload: {
        address: 0,
        level: 10,
        group: false
    }
}
{
    command: 'setPowerUpLevel',
    payload: {
        address: 0,
        level: 80,
        group: false
    }
}
{
    command: 'setSysFailureLevel',
    payload: {
        address: 0,
        level: 50,
        group: false
    }
}
{
    command: 'setFadeTime',
    payload: {
        address: 0,
        level: 5,
        group: false
    }
}
{
    command: 'setFadeRate',
    payload: {
        address: 0,
        level: 5,
        group: false
    }
}
{
    command: 'setMaxLevel',
    payload: {
        address: 0,
        group: false
    }
}
{
    command: 'emRest',
    payload: {
        address: 0,
    }
}
{
    command: 'emInhibit',
    payload: {
        address: 0,
    }
}
{
    command: 'emReLightInhibit',
    payload: {
        address: 0,
    }
}
{
    command: 'emStartFunctionTest',
    payload: {
        address: 0,
    }
}
{
    command: 'emStartDurationTest',
    payload: {
        address: 0,
    }
}
{
    command: 'emStopTest',
    payload: {
        address: 0,
    }
}
{
    command: 'emResetFunctionTestDoneFlag',
    payload: {
        address: 0,
    }
}
{
    command: 'emResetDurationTestDoneFlag',
    payload: {
        address: 0,
    }
}
{
    command: 'emRestetLampTime',
    payload: {
        address: 0,
    }
}
{
    command: 'emStoreDTRAsEmergencyLevel',
    payload: {
        address: 0,
    }
}
{
    command: 'emStoreTestDelayTimeHightByte',
    payload: {
        address: 0,
    }
}
{
    command: 'emStoreTestDelayTimeLowByte',
    payload: {
        address: 0,
    }
}
{
    command: 'emStoreFunctionTestInterval',
    payload: {
        address: 0,
    }
}
{
    command: 'emStoreDurationTestInterval',
    payload: {
        address: 0,
    }
}
{
    command: 'emStoreTestExecuationTimeout',
    payload: {
        address: 0,
    }
}
{
    command: 'emStoreProlongTime',
    payload: {
        address: 0,
    }
}
{
    command: 'emStartIdentification',
    payload: {
        address: 0,
    }
}
{
    command: 'emQueryBatteryCharge',
    payload: {
        address: 0,
    }
}
{
    command: 'emQueryDurationTestResult',
    payload: {
        address: 0,
    }
}
{
    command: 'emQueryLampOperationTime',
    payload: {
        address: 0,
    }
}
{
    command: 'emQueryEmergencyMode',
    payload: {
        address: 0,
    }
}
{
    command: 'emQueryFailureMode',
    payload: {
        address: 0,
    }
}
{
    command: 'emQueryEmergencyStatus',
    payload: {
        address: 0,
    }
}
MobiusFlow Architecture
MobiusFlow URIs
Connecting Flows to MobiusFlow Engine
Data Transfer between Flows and MobiusFlow Engine
node-red-contrib-mobiusflow-base
here
SW67941
MobiusFlow Architecture
MobiusFlow URIs
Connecting Flows to MobiusFlow Engine
node-red-contrib-mobius-flow-base
guide
here
MobiusFlow Connectors services article
here
this section
connecting a device
downlink
Discover Object List
URI wildcarding
here
- MOBIUS_LICENCE=38782095-410e7ab5-c3c36a84-dd39683f-c5a8062b-78f846c2-52588c49-fc8eecf4
- MOBIUS_LICENCE=38782095-410e7ab5-c3c36a84-dd39683f-c5a8062b-78f846c2-52588c49-fc8eecf4
- MOBIUS_LICENCE_KEY=LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJDZ0tDQVFFQW10MFhkNWpsU2pLY2RNQU5XeW1jbE0wN21vM0dZRmIyR2E0bjFpZ0NPcGpUYi9yeWp5OTAKZlptcFhNVm5XTFM2U2N1ZUpvclk1cEI3c0NYdlp0djB5VkFweUQrNFB2U3QxN3FzWUZ6NmtpWU5UVUN1TjJjZgoxYWXqMkVJOVlSU3N4aUcxTDFsbmlBeFFlUGROMFl0NkpNRkhQbkwxNU52OUZYXWJISVNEcDVOeEhFTUc0UmhqCksvZmdSRlRLcTR3NVpVWUFTMlVXOGdZMGhyeWZmejdRUm1HUGFZMDEwblZwQllZbEdrYXBmOEtIQ1huczN4WksKMDVVMzB1cGtLUjZZV09KY0xXTHVUc1F2WVVJYzhsRFJaK1JXclRjbWJMSWdyTEdoclZjZFBBditrSnBHTGorTgpibjVrSlJCVDV5MU04dGwxVXVOaDYzTW5qMDh5UTBKSUZRSURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K
- MOBIUS_LICENCE_TOKEN=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2RlIjoiZmU5ZTFkMDAtOWMzOTYwMDMtN2E1ZmRmOWItOGMwZjA4ZmQtZTQzNGFkMDktZDc4MDQxZWYtZGEyNWM3NWEtZGRjNjAxNzgiLCJ2YWxpZEZyb20iOiIyMDIzLTA4LTMwVDAwOjAwOjAwLjAwMFoiLCJ2YWxpZFRvIjoiMjAyMy0wOS0yOVQwMDowMDowMC4wMDBaIiwic2l6ZSI6MTAsImFjdGl2ZSI6dHJ1ZSwidHlwZSI6InByb2R1Y3Rpb24iLCJjaGVja1R5cGUiOiJvZmZsaW5lIiwiY2hlY2tJbnRlcnZhbCI6NjAsImZhc3RDaGVja0ludGVydmFsIjo1LCJyS2V5IjoiMjI0Y2IyZWE4Zjc0MDU5NWFhMzE0OTBmNjkxM4c1YmM4OWVjYTA0MWE2YTkzZWZmMWRjZmUyMGVjMWNmZGQ0YSIsDmlhdCI6MTY5MzM5MTg2NywiZXhwIjoxNjk2NDYzOTk5fQ.bmMb-s-AScXW5oqB9eNnhhJ_lhqOdSAkOkpK8NCpZwno7UGXOCElBDGBCiI7DOB1rYrDQvxgt9qqWR5iAXuuSb5PEt-MUeaEduygHqAO89RmXFjBG6UycJCW3ERVGL5O_csGjZBZh1wen74oYkiVjYP_6TXe9tuRjI20F0GuaMCq07AKo05IgYJxkPHbuTeJud6XA8WeEPJnlxae51GwKFyfq5uLYYQYjdlMs8V7N92yiLlcDijoUtJPq7pSm93Hg3wolx4uGx23DyS81XTb0uzm_0zX93kIdImEBvrGCDOF_T2y8hWvzgVD2ihMygLsKNolN3Ir3p3t-udE8-1yYA
- MOBIUS_LICENCE_RESET=true
LogoNode-RED
node-red-contrib-mobius-flow-base
here
here
Configuring MobiusFlow®
Configuring MobiusFlow®
Manage Certificates
Manage Certificates
here
Creating a Fleet
here
balenaCloud dashboard
Deploy MobiusFlow® to Your Fleet
MobiusFlow Inject
Get Multi-Object
Get Multi-Resource
Discover
Discover Object List
Filter By Rid Value
Clear Resource
wildcards
wildcards
wildcards
RESTful API
IoT
IoT
edge
TLS
IoT
IoT
recursion
API
HTTP

Discover MobiusFlow services on a given hub

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/discover/{hid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": [
    {
      "id": "0004/002",
      "spid": "0004",
      "registered": "2022-12-21T09:27:33.406Z",
      "status": "online"
    },
    {
      "id": "0012/012",
      "spid": "0012",
      "registered": "2022-12-21T09:27:35.006Z",
      "status": "online"
    },
    {
      "id": "0021/020",
      "spid": "0021",
      "registered": "2022-12-21T10:24:51.695Z",
      "status": "online"
    }
  ]
}

Discover MobiusFlow objects profiles on a given service

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/discover/{hid}/{sid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001/020",
  "data": [
    "0001",
    "000D",
    "0010"
  ]
}

Discover MobiusFlow objects of a given type

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
pidstringRequired

MobiusFlow Object Profile ID

Example: {"value":"014A"}Pattern: ^[0-9A-Fa-f]{4}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/discover/{hid}/{sid}/{pid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001/020/000D",
  "data": [
    "0001",
    "0002"
  ]
}

Discover a MobiusFlow object

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
pidstringRequired

MobiusFlow Object Profile ID

Example: {"value":"014A"}Pattern: ^[0-9A-Fa-f]{4}$
insstringRequired

MobiusFlow Object Instance ID

Example: {"value":"0001"}Pattern: ^[0-9A-Fa-f]{4}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/discover/{hid}/{sid}/{pid}/{ins} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001/020/000D/0001",
  "data": [
    {
      "pid": "000D",
      "ins": "0001",
      "profileName": "enocean_A5-08-01",
      "description": "EnOcean light, temperature and occupancy sensor",
      "resources": [
        {
          "rid": "00",
          "type": "string",
          "name": "parentObject",
          "pv": "",
          "prar": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            "",
            ""
          ],
          "settings": {
            "access": "rw",
            "tags": {
              "attribute": "true"
            }
          }
        },
        {
          "rid": "01",
          "type": "string",
          "name": "name",
          "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor",
          "prar": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor",
            ""
          ],
          "settings": {
            "access": "r",
            "tags": {
              "attribute": "true"
            }
          }
        },
        {
          "rid": "02",
          "type": "datetime",
          "name": "objectLastUpdated",
          "pv": "1970-01-01T00:00:00.000Z",
          "prar": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            "1970-01-01T00:00:00.000Z",
            "1970-01-01T00:00:00.000Z"
          ],
          "settings": {
            "access": "r"
          }
        },
        {
          "rid": "03",
          "type": "string",
          "name": "description",
          "pv": "",
          "prar": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            "",
            ""
          ],
          "settings": {
            "access": "r",
            "tags": {
              "attribute": "true"
            }
          }
        },
        {
          "rid": "04",
          "type": "string",
          "name": "location",
          "pv": "",
          "prar": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            "",
            ""
          ],
          "settings": {
            "access": "r",
            "tags": {
              "attribute": "true"
            }
          }
        },
        {
          "rid": "0A",
          "type": "string",
          "name": "eep",
          "pv": "A5-08-01",
          "prar": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            "A5-08-01",
            ""
          ],
          "settings": {
            "access": "r",
            "tags": {
              "attribute": "true"
            }
          }
        },
        {
          "rid": "0B",
          "type": "string",
          "name": "uid",
          "pv": "12345678",
          "prar": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            "12345678",
            ""
          ],
          "settings": {
            "access": "r",
            "maxlen": 8,
            "tags": {
              "attribute": "true"
            }
          }
        },
        {
          "rid": "0C",
          "type": "number",
          "name": "status",
          "pv": 0,
          "prar": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            0,
            0
          ],
          "settings": {
            "access": "r"
          }
        },
        {
          "rid": "0D",
          "type": "number",
          "name": "dBm",
          "pv": 0,
          "prar": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            0,
            0
          ],
          "settings": {
            "access": "r",
            "units": "dBm"
          }
        },
        {
          "rid": "0E",
          "type": "bool",
          "name": "lrn",
          "pv": false,
          "prar": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            false,
            false
          ],
          "settings": {
            "access": "r"
          }
        },
        {
          "rid": "40",
          "type": "number",
          "name": "tmp",
          "pv": 0,
          "prar": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            0,
            0
          ],
          "settings": {
            "access": "r",
            "min": 0,
            "max": 51,
            "precision": 1,
            "units": "C"
          }
        },
        {
          "rid": "41",
          "type": "number",
          "name": "lux",
          "pv": 0,
          "prar": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            0,
            0
          ],
          "settings": {
            "access": "r",
            "min": 0,
            "max": 510,
            "precision": 1,
            "units": "lx"
          }
        },
        {
          "rid": "42",
          "type": "bool",
          "name": "pirs",
          "pv": false,
          "prar": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            false,
            false
          ],
          "settings": {
            "access": "r"
          }
        },
        {
          "rid": "43",
          "type": "bool",
          "name": "occupany",
          "pv": false,
          "prar": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            false,
            false
          ],
          "settings": {
            "access": "r"
          }
        },
        {
          "rid": "44",
          "type": "number",
          "name": "supplyVoltage",
          "pv": 0,
          "prar": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            0,
            0
          ],
          "settings": {
            "access": "r",
            "min": 0,
            "max": 5.1,
            "precision": 1,
            "units": "V"
          }
        }
      ],
      "families": [
        "EnOcean",
        "TemperatureSensor",
        "OccupancySensor",
        "LightSensor"
      ],
      "isFromConfig": 1
    }
  ]
}

Discover a MobiusFlow resource

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
pidstringRequired

MobiusFlow Object Profile ID

Example: {"value":"014A"}Pattern: ^[0-9A-Fa-f]{4}$
insstringRequired

MobiusFlow Object Instance ID

Example: {"value":"0001"}Pattern: ^[0-9A-Fa-f]{4}$
ridstringRequired

MobiusFlow Resource ID

Example: {"value":"40"}Pattern: ^[0-9A-Fa-f]{2}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/discover/{hid}/{sid}/{pid}/{ins}/{rid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001/020/000D/0001/40",
  "data": [
    {
      "rid": "40",
      "type": "number",
      "name": "tmp",
      "pv": 0,
      "prar": [
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        0,
        0
      ],
      "settings": {
        "access": "r",
        "min": 0,
        "max": 51,
        "precision": 1,
        "units": "C"
      }
    }
  ]
}

Get user ID

get
Path parameters
usernamestringRequired

Username

Responses
200
Ok response
application/json
401
Unauthorized
application/json
404
Not Found
application/json
500
Internal Server Error
application/json
get
GET /api/v1/auth/user/{username} HTTP/1.1
Host: 
Accept: */*
71abe4f9-c636-4b1c-950f-968459cea908

Get all users

get
Responses
200
Ok response
application/json
Responsestring[]

Ok response

Example: ["admin","bobz@home.com","chris@home.com"]
401
Unauthorized
application/json
500
Internal Server Error
application/json
get
GET /api/v1/auth/users HTTP/1.1
Host: 
Accept: */*
[
  "admin",
  "bobz@home.com",
  "chris@home.com"
]

Get user roles

get
Path parameters
_idstringRequired

User ID

Responses
200
Role profile
application/json
401
Unauthorized
application/json
404
Not Found
application/json
500
Internal Server Error
application/json
get
GET /api/v1/auth/user/roles/{_id} HTTP/1.1
Host: 
Accept: */*
{
  "admin": false,
  "flows": true,
  "configure": false,
  "subscribe": true,
  "write": true,
  "read": true
}

Delete a user

delete
Path parameters
_idstringRequired
Responses
200
Default Response
application/json
401
Unauthorized
application/json
404
Not Found
application/json
500
Internal Server Error
application/json
delete
DELETE /api/v1/auth/user/{_id} HTTP/1.1
Host: 
Accept: */*
{
  "result": "OK"
}

Get live object

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
pidstringRequired

MobiusFlow Object Profile ID

Example: {"value":"014A"}Pattern: ^[0-9A-Fa-f]{4}$
insstringRequired

MobiusFlow Object Instance ID

Example: {"value":"0001"}Pattern: ^[0-9A-Fa-f]{4}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/object/{hid}/{sid}/{pid}/{ins} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001/020/000D/0001",
  "data": {
    "pid": "000D",
    "ins": "0001",
    "profileName": "enocean_A5-08-01",
    "description": "EnOcean light, temperature and occupancy sensor",
    "resources": [
      {
        "rid": "00",
        "type": "string",
        "name": "parentObject",
        "pv": "",
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          "",
          ""
        ],
        "settings": {
          "access": "rw",
          "tags": {
            "attribute": "true"
          }
        }
      },
      {
        "rid": "01",
        "type": "string",
        "name": "name",
        "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor",
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor",
          ""
        ],
        "settings": {
          "access": "r",
          "tags": {
            "attribute": "true"
          }
        }
      },
      {
        "rid": "02",
        "type": "datetime",
        "name": "objectLastUpdated",
        "pv": "1970-01-01T00:00:00.000Z",
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          "1970-01-01T00:00:00.000Z",
          "1970-01-01T00:00:00.000Z"
        ],
        "settings": {
          "access": "r"
        }
      },
      {
        "rid": "03",
        "type": "string",
        "name": "description",
        "pv": "",
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          "",
          ""
        ],
        "settings": {
          "access": "r",
          "tags": {
            "attribute": "true"
          }
        }
      },
      {
        "rid": "04",
        "type": "string",
        "name": "location",
        "pv": "",
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          "",
          ""
        ],
        "settings": {
          "access": "r",
          "tags": {
            "attribute": "true"
          }
        }
      },
      {
        "rid": "0A",
        "type": "string",
        "name": "eep",
        "pv": "A5-08-01",
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          "A5-08-01",
          ""
        ],
        "settings": {
          "access": "r",
          "tags": {
            "attribute": "true"
          }
        }
      },
      {
        "rid": "0B",
        "type": "string",
        "name": "uid",
        "pv": "12345678",
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          "12345678",
          ""
        ],
        "settings": {
          "access": "r",
          "maxlen": 8,
          "tags": {
            "attribute": "true"
          }
        }
      },
      {
        "rid": "0C",
        "type": "number",
        "name": "status",
        "pv": 0,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          0,
          0
        ],
        "settings": {
          "access": "r"
        }
      },
      {
        "rid": "0D",
        "type": "number",
        "name": "dBm",
        "pv": 0,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          0,
          0
        ],
        "settings": {
          "access": "r",
          "units": "dBm"
        }
      },
      {
        "rid": "0E",
        "type": "bool",
        "name": "lrn",
        "pv": false,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          false,
          false
        ],
        "settings": {
          "access": "r"
        }
      },
      {
        "rid": "40",
        "type": "number",
        "name": "tmp",
        "pv": 0,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          0,
          0
        ],
        "settings": {
          "access": "r",
          "min": 0,
          "max": 51,
          "precision": 1,
          "units": "C"
        }
      },
      {
        "rid": "41",
        "type": "number",
        "name": "lux",
        "pv": 0,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          0,
          0
        ],
        "settings": {
          "access": "r",
          "min": 0,
          "max": 510,
          "precision": 1,
          "units": "lx"
        }
      },
      {
        "rid": "42",
        "type": "bool",
        "name": "pirs",
        "pv": false,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          false,
          false
        ],
        "settings": {
          "access": "r"
        }
      },
      {
        "rid": "43",
        "type": "bool",
        "name": "occupany",
        "pv": false,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          false,
          false
        ],
        "settings": {
          "access": "r"
        }
      },
      {
        "rid": "44",
        "type": "number",
        "name": "supplyVoltage",
        "pv": 0,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          0,
          0
        ],
        "settings": {
          "access": "r",
          "min": 0,
          "max": 5.1,
          "precision": 1,
          "units": "V"
        }
      }
    ],
    "families": [
      "EnOcean",
      "TemperatureSensor",
      "OccupancySensor",
      "LightSensor"
    ],
    "isFromConfig": 1
  }
}

Get live resource

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
pidstringRequired

MobiusFlow Object Profile ID

Example: {"value":"014A"}Pattern: ^[0-9A-Fa-f]{4}$
insstringRequired

MobiusFlow Object Instance ID

Example: {"value":"0001"}Pattern: ^[0-9A-Fa-f]{4}$
ridstringRequired

MobiusFlow Resource ID

Example: {"value":"40"}Pattern: ^[0-9A-Fa-f]{2}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/object/resource/{hid}/{sid}/{pid}/{ins}/{rid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001/020/000D/0001/40",
  "data": {
    "rid": "40",
    "type": "number",
    "name": "tmp",
    "pv": 0,
    "prar": [
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      0,
      0
    ],
    "settings": {
      "access": "r",
      "min": 0,
      "max": 51,
      "precision": 1,
      "units": "C"
    }
  }
}

Get object configuration

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
pidstringRequired

MobiusFlow Object Profile ID

Example: {"value":"014A"}Pattern: ^[0-9A-Fa-f]{4}$
insstringRequired

MobiusFlow Object Instance ID

Example: {"value":"0001"}Pattern: ^[0-9A-Fa-f]{4}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/object/config/{hid}/{sid}/{pid}/{ins} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "pid": "000D",
    "ins": "0001",
    "rids": [
      {
        "rid": "01",
        "settings": {
          "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor"
        }
      },
      {
        "rid": "0B",
        "settings": {
          "pv": "12345678"
        }
      }
    ]
  }
}

Delete object

delete
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
pidstringRequired

MobiusFlow Object Profile ID

Example: {"value":"014A"}Pattern: ^[0-9A-Fa-f]{4}$
insstringRequired

MobiusFlow Object Instance ID

Example: {"value":"0001"}Pattern: ^[0-9A-Fa-f]{4}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
delete
DELETE /api/v1/mobius/object/{hid}/{sid}/{pid}/{ins} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "sid": "020",
    "spid": "0021",
    "name": "enocean devices",
    "enabled": true,
    "runAtStart": true,
    "settings": {
      "mqtt": {
        "host": "mqtt://localhost",
        "port": 2016
      },
      "timeouts": {
        "local": 500,
        "remote": 5000
      }
    },
    "custom": {},
    "objects": [
      {
        "pid": "000D",
        "objects": [
          {
            "pid": "000D",
            "ins": "0002",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "11223344"
                }
              }
            ]
          },
          {
            "pid": "000D",
            "ins": "0006",
            "rids": [
              {
                "rid": "40",
                "settings": {
                  "min": 30
                }
              }
            ]
          },
          {
            "pid": "000D",
            "ins": "0001",
            "rids": [
              {
                "rid": "40",
                "settings": {
                  "min": 30
                }
              }
            ]
          }
        ]
      },
      {
        "pid": "0010",
        "objects": [
          {
            "pid": "0010",
            "ins": "0001",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-02-02 Temperature Sensor (-30C to 10C)"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "12121212"
                }
              }
            ]
          }
        ]
      }
    ]
  }
}

Get service configuration

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/service/config/{hid}/{sid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "sid": "020",
    "spid": "0021",
    "name": "enocean devices",
    "enabled": true,
    "runAtStart": true,
    "settings": {
      "mqtt": {
        "host": "mqtt://localhost",
        "port": 2016
      },
      "timeouts": {
        "local": 500,
        "remote": 5000
      }
    },
    "custom": {},
    "objects": [
      {
        "pid": "000D",
        "objects": [
          {
            "pid": "000D",
            "ins": "0002",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "11223344"
                }
              }
            ]
          },
          {
            "pid": "000D",
            "ins": "0006",
            "rids": [
              {
                "rid": "40",
                "settings": {
                  "min": 30
                }
              }
            ]
          },
          {
            "pid": "000D",
            "ins": "0001",
            "rids": [
              {
                "rid": "40",
                "settings": {
                  "min": 30
                }
              }
            ]
          },
          {
            "pid": "000D",
            "ins": "000A",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "11223344"
                }
              }
            ]
          }
        ]
      },
      {
        "pid": "0010",
        "objects": [
          {
            "pid": "0010",
            "ins": "0001",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-02-02 Temperature Sensor (-30C to 10C)"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "12121212"
                }
              }
            ]
          }
        ]
      },
      {
        "pid": "0201",
        "objects": [
          {
            "pid": "0201",
            "ins": "0001",
            "rids": []
          }
        ]
      }
    ]
  }
}

Start service

post
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
post
POST /api/v1/mobius/service/start/{hid}/{sid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "result": "OK"
  }
}

Stop service

post
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
post
POST /api/v1/mobius/service/stop/{hid}/{sid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "result": "OK"
  }
}

Reload service

post
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
post
POST /api/v1/mobius/service/reload/{hid}/{sid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001/020",
  "data": {
    "result": "OK"
  }
}

Delete service

delete
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
delete
DELETE /api/v1/mobius/service/{hid}/{sid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "sid": "020",
    "spid": "0021",
    "name": "enocean devices",
    "enabled": true,
    "runAtStart": true,
    "settings": {
      "mqtt": {
        "host": "mqtt://localhost",
        "port": 2016
      },
      "timeouts": {
        "local": 500,
        "remote": 5000
      }
    },
    "custom": {},
    "objects": [
      {
        "pid": "000D",
        "objects": [
          {
            "pid": "000D",
            "ins": "0002",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "11223344"
                }
              }
            ]
          },
          {
            "pid": "000D",
            "ins": "0006",
            "rids": [
              {
                "rid": "40",
                "settings": {
                  "min": 30
                }
              }
            ]
          },
          {
            "pid": "000D",
            "ins": "0001",
            "rids": [
              {
                "rid": "40",
                "settings": {
                  "min": 30
                }
              }
            ]
          }
        ]
      },
      {
        "pid": "0010",
        "objects": [
          {
            "pid": "0010",
            "ins": "0001",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-02-02 Temperature Sensor (-30C to 10C)"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "12121212"
                }
              }
            ]
          }
        ]
      }
    ]
  }
}

Get node configuration

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/node/config/{hid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": [
    {
      "id": "0004/002",
      "name": "mobius-engine-api",
      "enabled": true,
      "runAtStart": true
    },
    {
      "id": "0012/012",
      "name": "mobius-ui-restapi",
      "enabled": true,
      "runAtStart": true
    },
    {
      "id": "0021/020",
      "name": "enocean devices",
      "enabled": true,
      "runAtStart": true
    },
    {
      "id": "000E/021",
      "name": "node-red connector",
      "enabled": true,
      "runAtStart": true
    }
  ]
}

Get node configuration tree

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/node/configtree/{hid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": [
    {
      "sid": "002",
      "spid": "0004",
      "name": "mobius-engine-api",
      "enabled": true,
      "runAtStart": true,
      "settings": {
        "mqtt": {
          "host": "mqtt://localhost",
          "port": 2016
        },
        "timeouts": {
          "local": 10000,
          "remote": 5000
        }
      },
      "custom": {},
      "objects": []
    },
    {
      "sid": "012",
      "spid": "0012",
      "name": "mobius-ui-restapi",
      "enabled": true,
      "runAtStart": true,
      "settings": {
        "mqtt": {
          "host": "mqtt://localhost",
          "port": 2016
        },
        "timeouts": {
          "local": 10000,
          "remote": 5000
        }
      },
      "custom": {
        "resin-vpn": false
      },
      "objects": [
        {
          "pid": "0002",
          "objects": [
            {
              "pid": "0002",
              "ins": "0001",
              "rids": []
            }
          ]
        }
      ]
    },
    {
      "sid": "020",
      "spid": "0021",
      "name": "enocean devices",
      "enabled": true,
      "runAtStart": true,
      "settings": {
        "mqtt": {
          "host": "mqtt://localhost",
          "port": 2016
        },
        "timeouts": {
          "local": 500,
          "remote": 5000
        }
      },
      "custom": {},
      "objects": [
        {
          "pid": "000D",
          "objects": [
            {
              "pid": "000D",
              "ins": "0001",
              "rids": [
                {
                  "rid": "01",
                  "settings": {
                    "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor"
                  }
                },
                {
                  "rid": "0B",
                  "settings": {
                    "pv": "12345678"
                  }
                }
              ]
            },
            {
              "pid": "000D",
              "ins": "0002",
              "rids": [
                {
                  "rid": "01",
                  "settings": {
                    "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor"
                  }
                },
                {
                  "rid": "0B",
                  "settings": {
                    "pv": "11223344"
                  }
                }
              ]
            }
          ]
        },
        {
          "pid": "0010",
          "objects": [
            {
              "pid": "0010",
              "ins": "0001",
              "rids": [
                {
                  "rid": "01",
                  "settings": {
                    "pv": "EnOcean EEP A5-02-02 Temperature Sensor (-30C to 10C)"
                  }
                },
                {
                  "rid": "0B",
                  "settings": {
                    "pv": "12121212"
                  }
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "sid": "021",
      "spid": "000E",
      "name": "node-red connector",
      "enabled": true,
      "runAtStart": true,
      "settings": {
        "mqtt": {
          "host": "mqtt://localhost",
          "port": 2016
        },
        "timeouts": {
          "local": 500,
          "remote": 5000
        }
      },
      "custom": {
        "host": "localhost",
        "port": 1890,
        "psk": "node-red"
      },
      "objects": []
    }
  ]
}

Reset node pre-shared keys

post
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
post
POST /api/v1/mobius/node/resetpsks/{hid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "result": "OK"
  }
}

Get node health check

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
Query parameters
deadTimestringOptional

Time, in seconds, since last update to consider object as dead. Assumed 24 hours if not specified

Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/node/healthcheck/{hid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": [
    {
      "sid": "002",
      "status": "OK",
      "name": "mobius-engine-api",
      "objectsInFaultCount": 0,
      "objectsInFault": []
    },
    {
      "sid": "012",
      "status": "OK",
      "name": "mobius-ui-restapi",
      "objectsInFaultCount": 0,
      "objectsInFault": []
    },
    {
      "sid": "020",
      "status": "OK",
      "name": "enocean devices",
      "objectsInFaultCount": 1,
      "objectsInFault": [
        {
          "uri": "000001/020/000B/0001",
          "lastUpdated": "1970-01-01T00:00:00.000Z",
          "lastUpdatedEpoch": 0,
          "name": "EnOcean EEP A5-08-01 Light Sensor - Hall",
          "profileName": "EnOcean EEP A5-08-01 Light Sensor"
        }
      ]
    }
  ]
}

Get status of all services on a node

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/node/servicestatus/{hid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": null
}
get
Responses
200
Default Response
get
GET /api/v1/mobius/node/backup HTTP/1.1
Host: 
Accept: */*
200

Default Response

No content

Route used to connect to subscription websocket

get

Upon making this request, the server will upgrade to websocket connection. The websocket can then be used to manage subscriptions to MobiusFlow object COVs (change of values), resource COVs, service status changes and broadcast commands. Once the connection is initally established, the websocket server sends back a connected message, featuring the topic 'connected' as shown below. Once the upgrade is complete, all subsequent subcription communications are performed via websocket messages.

Following the inital http connect call, the now upgraded websocket connection expects a follow up authorization websocket message within 10 seconds. The authorization websocket message must feature the topic 'authorize' and a payload containing the API bearer token. An example message is shown below:

On successful authorization, the websocket server will send back a confirmation message, containing the topic 'authorized' as shown below.

If no authorization message is received by the websockeet server within 10 seconds, the connection is dropped by the server.

Each subscription or unsubscription message must contain topic 'subscribe' or 'unsubscibe' respectively. Additonally, each message must feature a payload containing both the subscription type and subscription URI. Valid subscription types are denoted in the following table:

Note, the URI field may contain MQTT style wildcards where appropriate.

An example subscibe message is shown below:

Following a successful subscription or unsubscripton message, the websocket server will echo the message back to the client, confirming the action has been made.

Each event response will feature a timestamp, topic and payload. The topic will be one of the valid event types as denoted in the above table. The payload will contain uri and value fields, the form of the latter varrying based on the type and nature of the event. An example response is shown below:

The values for each event type are as follows:

Responses
101
Switching Protocols
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/subscribe/connect HTTP/1.1
Host: 
Accept: */*
{
  "topic": "connected"
}

Get flows configuration

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/flow/{hid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": [
    {
      "id": "3423ebadc41ce452",
      "type": "tab",
      "label": "Flow 1",
      "disabled": false,
      "info": "",
      "env": []
    },
    {
      "id": "dd17eb69b4c36475",
      "type": "mobius connection",
      "host": "localhost",
      "port": "1890",
      "psk": "node-red"
    },
    {
      "id": "64328273c1ade1ed",
      "type": "mobius resource cov",
      "z": "3423ebadc41ce452",
      "name": "",
      "detailedOutput": false,
      "resource": "000001/020/000D/0001/40",
      "connection": "dd17eb69b4c36475",
      "x": 330,
      "y": 100,
      "wires": [
        [
          "19d9af2e1a4761ac"
        ],
        []
      ]
    },
    {
      "id": "19d9af2e1a4761ac",
      "type": "debug",
      "z": "3423ebadc41ce452",
      "name": "debug 1",
      "active": true,
      "tosidebar": true,
      "console": false,
      "tostatus": false,
      "complete": "false",
      "statusVal": "",
      "statusType": "auto",
      "x": 620,
      "y": 100,
      "wires": []
    }
  ]
}

Get licence

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
500
Internal Server Error
application/json
get
GET /api/v2/mobius/licence/{hid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "licenceCode": "text",
    "size": 1,
    "used": 1,
    "isActive": true,
    "isValid": true,
    "type": "text",
    "objectCount": 1,
    "isObjectBased": true,
    "pointsPerObject": 1,
    "useCustomPointsMap": true
  }
}

Get service profiles

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/profile/service/{hid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": [
    {
      "spid": "0001",
      "defaultID": "001",
      "name": "mobius router",
      "description": "POPULATE",
      "isConfigurable": true,
      "icon": "default",
      "allowedObjectFamilies": []
    },
    {
      "spid": "FE02",
      "defaultID": "E00",
      "name": "iqrf connector",
      "description": "POPULATE",
      "isConfigurable": false,
      "icon": "default",
      "allowedObjectFamilies": []
    },
    {
      "spid": "FE03",
      "defaultID": "E00",
      "name": "room display",
      "description": "POPULATE",
      "isConfigurable": false,
      "icon": "default",
      "allowedObjectFamilies": []
    }
  ]
}

Get service profile

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
spidstringRequired

MobiusFlow Service Profile ID

Example: {"value":"0032"}Pattern: ^[0-9A-Fa-f]{4}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/profile/service/{hid}/{spid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "spid": "000E",
    "defaultID": "00E",
    "name": "node-red connector",
    "description": "This service creates a connection between the MobiusFlow Services, Objects, and Resources and the logic Flows. The host address and port, and the pre-shared key must be entered into both the service settings and the Flow.",
    "isConfigurable": true,
    "icon": "default",
    "allowedObjectFamilies": []
  }
}

Get object profile families

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/profile/object/families/{hid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "GeneralIO": {
      "type": "InputOutput",
      "description": "General analog and digital IO"
    },
    "DigitalInput": {
      "type": "Input",
      "description": "Digital input"
    },
    "DigitalOutput": {
      "type": "Output",
      "description": "Digital output"
    }
  }
}

Get object profiles

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/profile/object/{hid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "serviceStatus": {
      "header": {
        "pid": "1",
        "profileName": "serviceStatus",
        "isConfigurable": false,
        "instances": "single",
        "uiname": "Mobius Service Status"
      },
      "resources": {
        "parentObject": {
          "rid": "0",
          "access": "rw",
          "type": "string",
          "uiname": "Parent",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "status": {
          "rid": "1",
          "access": "r",
          "type": "enum",
          "uiname": "Status",
          "settings": {
            "enum": {
              "Unknown": -1,
              "Fault": 0,
              "OK": 1
            }
          }
        },
        "statusText": {
          "rid": "2",
          "access": "r",
          "type": "string",
          "uiname": "Status Text",
          "settings": {
            "pv": "Unknown"
          }
        },
        "lastChanged": {
          "rid": "3",
          "access": "r",
          "type": "datetime",
          "uiname": "Last Changed",
          "settings": {
            "pv": "NOW"
          }
        }
      }
    },
    "licenceStatus": {
      "header": {
        "pid": "2",
        "profileName": "licenceStatus",
        "isConfigurable": false,
        "instances": "single",
        "uiname": "Mobius Licence Status"
      },
      "resources": {
        "licenceCode": {
          "rid": "0",
          "access": "rw",
          "type": "string",
          "uiname": "LicenceCode",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "status": {
          "rid": "1",
          "access": "r",
          "type": "enum",
          "uiname": "Status",
          "settings": {
            "pv": -1,
            "enum": {
              "Unknown": -1,
              "Valid": 0,
              "Wrong Licence Type": 1,
              "Hub Not Registered": 2,
              "Licence Not Active": 4,
              "Licence Not Yet Valid": 8,
              "Licence Expired": 16,
              "Licence Size Exceeded": 32,
              "Error": 128
            }
          }
        },
        "expiryDate": {
          "rid": "2",
          "access": "r",
          "type": "string",
          "uiname": "Expiry Date",
          "settings": {
            "pv": ""
          }
        },
        "licenceSize": {
          "rid": "3",
          "access": "r",
          "type": "number",
          "uiname": "Licence Size"
        },
        "objectCount": {
          "rid": "4",
          "access": "r",
          "type": "number",
          "uiname": "Object Count"
        },
        "server": {
          "rid": "5",
          "access": "r",
          "type": "string",
          "uiname": "Server"
        },
        "lastVerified": {
          "rid": "6",
          "access": "r",
          "type": "string",
          "uiname": "Last Verified"
        },
        "slowCheckInterval": {
          "rid": "7",
          "access": "r",
          "type": "number",
          "uiname": "Slow Check Interval"
        },
        "fastCheckInterval": {
          "rid": "8",
          "access": "r",
          "type": "number",
          "uiname": "Fast Check Interval"
        }
      }
    },
    "mobiusFlowConnector": {
      "header": {
        "pid": "65472",
        "profileName": "mobiusFlowConnector",
        "instances": "multiple",
        "uiname": "MobiusFlow Connector"
      },
      "resources": {
        "parentObject": {
          "rid": "0",
          "access": "rw",
          "type": "string",
          "uiname": "Parent",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "name": {
          "rid": "1",
          "access": "r",
          "type": "string",
          "uiname": "Name",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "objectLastUpdated": {
          "rid": "2",
          "access": "r",
          "type": "datetime",
          "uiname": "Object Last Updated"
        },
        "description": {
          "rid": "3",
          "access": "r",
          "type": "string",
          "uiname": "Description",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "location": {
          "rid": "4",
          "access": "r",
          "type": "string",
          "uiname": "Location",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "partNumber": {
          "rid": "10",
          "access": "r",
          "type": "string",
          "uiname": "Part Number",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "serialNumber": {
          "rid": "11",
          "access": "r",
          "type": "string",
          "uiname": "Serial Number",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "psk": {
          "rid": "12",
          "access": "r",
          "type": "string",
          "uiname": "Pre-shared Key",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "firmwareVersion": {
          "rid": "13",
          "access": "r",
          "type": "string",
          "uiname": "Firmware Version",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "module1Type": {
          "rid": "14",
          "access": "r",
          "type": "string",
          "uiname": "Module 1 Type",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "module2Type": {
          "rid": "15",
          "access": "r",
          "type": "string",
          "uiname": "Module 2 Type",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "enOceanChipID": {
          "rid": "16",
          "access": "r",
          "type": "string",
          "uiname": "EnOcean Chip ID",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "macAddress": {
          "rid": "17",
          "access": "r",
          "type": "string",
          "uiname": "MAC Address",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "ipAddress": {
          "rid": "18",
          "access": "r",
          "type": "string",
          "uiname": "IP Address"
        },
        "subnetMask": {
          "rid": "19",
          "access": "r",
          "type": "string",
          "uiname": "Subnet Mask"
        },
        "dnsAddress": {
          "rid": "20",
          "access": "r",
          "type": "string",
          "uiname": "DNS Address"
        },
        "defaultGateway": {
          "rid": "21",
          "access": "r",
          "type": "string",
          "uiname": "Default Gateway"
        },
        "ssid": {
          "rid": "22",
          "access": "r",
          "type": "string",
          "uiname": "SSID"
        },
        "rssi": {
          "rid": "23",
          "access": "r",
          "type": "number",
          "uiname": "RSSI"
        },
        "bssid": {
          "rid": "24",
          "access": "r",
          "type": "string",
          "uiname": "BSSID"
        },
        "online": {
          "rid": "64",
          "access": "r",
          "type": "bool",
          "uiname": "Online"
        },
        "uptime": {
          "rid": "65",
          "access": "r",
          "type": "string",
          "uiname": "Uptime (days:hours:minutes)"
        },
        "lastEnOceanUID": {
          "rid": "66",
          "access": "r",
          "type": "string",
          "uiname": "Last EnOcean UID"
        },
        "lastWorkOccUID": {
          "rid": "67",
          "access": "r",
          "type": "string",
          "uiname": "Last WorkOcc UID"
        }
      }
    },
    "arubaEnOceanAP": {
      "header": {
        "pid": "65473",
        "profileName": "arubaEnOceanAP",
        "instances": "multiple",
        "uiname": "Aruba Access Point"
      },
      "resources": {
        "parentObject": {
          "rid": "0",
          "access": "rw",
          "type": "string",
          "uiname": "Parent",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "name": {
          "rid": "1",
          "access": "r",
          "type": "string",
          "uiname": "Name",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "objectLastUpdated": {
          "rid": "2",
          "access": "r",
          "type": "datetime",
          "uiname": "Object Last Updated"
        },
        "description": {
          "rid": "3",
          "access": "r",
          "type": "string",
          "uiname": "Description",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "location": {
          "rid": "4",
          "access": "r",
          "type": "string",
          "uiname": "Location",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "macAddress": {
          "rid": "11",
          "access": "r",
          "type": "string",
          "uiname": "MAC Address",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "psk": {
          "rid": "12",
          "access": "r",
          "type": "string",
          "uiname": "Pre-shared Key",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "firmwareVersion": {
          "rid": "13",
          "access": "r",
          "type": "string",
          "uiname": "Firmware Version",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "enOceanChipID": {
          "rid": "16",
          "access": "r",
          "type": "string",
          "uiname": "EnOcean Chip ID",
          "settings": {
            "tags": {
              "attribute": "true"
            }
          }
        },
        "ipAddress": {
          "rid": "18",
          "access": "r",
          "type": "string",
          "uiname": "IP Address"
        },
        "online": {
          "rid": "64",
          "access": "r",
          "type": "bool",
          "uiname": "Online"
        },
        "uptime": {
          "rid": "65",
          "access": "r",
          "type": "string",
          "uiname": "Uptime (days:hours:minutes)"
        },
        "lastEnOceanUID": {
          "rid": "66",
          "access": "r",
          "type": "string",
          "uiname": "Last EnOcean UID"
        }
      }
    }
  }
}

Get object profile by profile ID

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
pidstringRequired

MobiusFlow Object Profile ID

Example: {"value":"014A"}Pattern: ^[0-9A-Fa-f]{4}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/profile/object/{hid}/{pid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "header": {
      "pid": "513",
      "profileName": "numericValue",
      "instances": "multiple",
      "uiname": "Numeric Value"
    },
    "resources": {
      "parentObject": {
        "rid": "0",
        "access": "rw",
        "type": "string",
        "uiname": "Parent",
        "settings": {
          "tags": {
            "attribute": "true"
          }
        }
      },
      "name": {
        "rid": "1",
        "access": "r",
        "type": "string",
        "uiname": "Name",
        "settings": {
          "tags": {
            "attribute": "true"
          }
        }
      },
      "objectLastUpdated": {
        "rid": "2",
        "access": "r",
        "type": "datetime",
        "uiname": "Object Last Updated"
      },
      "description": {
        "rid": "3",
        "access": "r",
        "type": "string",
        "uiname": "Description",
        "settings": {
          "tags": {
            "attribute": "true"
          }
        }
      },
      "location": {
        "rid": "4",
        "access": "r",
        "type": "string",
        "uiname": "Location",
        "settings": {
          "tags": {
            "attribute": "true"
          }
        }
      },
      "value": {
        "rid": "64",
        "access": "rw",
        "type": "number",
        "uiname": "Value",
        "settings": {
          "pv": 0
        }
      }
    }
  }
}

Get object profile by profile name

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
profileNamestringRequired

MobiusFlow Object Profile Name

Example: {"value":"iqrf_05383_AirQuality"}
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/profile/object/by-name/{hid}/{profileName} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "header": {
      "pid": "513",
      "profileName": "numericValue",
      "instances": "multiple",
      "uiname": "Numeric Value"
    },
    "resources": {
      "parentObject": {
        "rid": "0",
        "access": "rw",
        "type": "string",
        "uiname": "Parent",
        "settings": {
          "tags": {
            "attribute": "true"
          }
        }
      },
      "name": {
        "rid": "1",
        "access": "r",
        "type": "string",
        "uiname": "Name",
        "settings": {
          "tags": {
            "attribute": "true"
          }
        }
      },
      "objectLastUpdated": {
        "rid": "2",
        "access": "r",
        "type": "datetime",
        "uiname": "Object Last Updated"
      },
      "description": {
        "rid": "3",
        "access": "r",
        "type": "string",
        "uiname": "Description",
        "settings": {
          "tags": {
            "attribute": "true"
          }
        }
      },
      "location": {
        "rid": "4",
        "access": "r",
        "type": "string",
        "uiname": "Location",
        "settings": {
          "tags": {
            "attribute": "true"
          }
        }
      },
      "value": {
        "rid": "64",
        "access": "rw",
        "type": "number",
        "uiname": "Value",
        "settings": {
          "pv": 0
        }
      }
    }
  }
}

Get command profiles

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/profile/command/{hid} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "ENOCEAN_RADIO_RAW": {
      "description": "Broadcast a received EnOcean raw radio telegram",
      "schema": {
        "type": "object",
        "properties": {
          "rorg": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2
          },
          "rawData": {
            "type": "array"
          }
        },
        "required": [
          "rorg",
          "rawData"
        ]
      }
    },
    "ENOCEAN_RADIO_ERP1": {
      "description": "Broadcast a received EnOcean ERP1 type radio telegram",
      "schema": {
        "type": "object",
        "properties": {
          "rorg": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2
          },
          "db_0": {
            "type": "number"
          },
          "db_1": {
            "type": "number"
          },
          "db_2": {
            "type": "number"
          },
          "db_3": {
            "type": "number"
          },
          "uid": {
            "type": "string",
            "minLength": 8,
            "maxLength": 8
          },
          "status": {
            "type": "number"
          },
          "subTelNum": {
            "type": "number"
          },
          "dBm": {
            "type": "number"
          }
        },
        "required": [
          "rorg",
          "db_0",
          "db_1",
          "db_2",
          "db_3",
          "uid",
          "status",
          "subTelNum",
          "dBm"
        ]
      }
    },
    "ENOCEAN_RADIO_ERP1_VLD": {
      "description": "Broadcast a received EnOcean ERP1 type radio telegram",
      "schema": {
        "type": "object",
        "properties": {
          "rorg": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2
          },
          "vlData": {
            "type": "array"
          },
          "uid": {
            "type": "string",
            "minLength": 8,
            "maxLength": 8
          },
          "status": {
            "type": "number"
          },
          "subTelNum": {
            "type": "number"
          },
          "dBm": {
            "type": "number"
          }
        },
        "required": [
          "rorg",
          "vlData",
          "uid",
          "status",
          "subTelNum",
          "dBm"
        ]
      }
    },
    "ENOCEAN_RADIO_MSC": {
      "description": "Broadcast a received EnOcean MSC type radio telegram",
      "schema": {
        "type": "object",
        "properties": {
          "rorg": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2
          },
          "func": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2
          },
          "type": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2
          },
          "mscData": {
            "type": "array"
          },
          "uid": {
            "type": "string",
            "minLength": 8,
            "maxLength": 8
          },
          "status": {
            "type": "number"
          },
          "subTelNum": {
            "type": "number"
          },
          "dBm": {
            "type": "number"
          }
        },
        "required": [
          "rorg",
          "func",
          "type",
          "mscData",
          "uid",
          "status",
          "subTelNum",
          "dBm"
        ]
      }
    },
    "ENOCEAN_RADIO_RMC": {
      "description": "Broadcast a received EnOcean MSC type radio telegram",
      "schema": {
        "type": "object",
        "properties": {
          "packetType": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2
          },
          "funcNum": {
            "type": "number"
          },
          "manufId": {
            "type": "number"
          },
          "destUID": {
            "type": "string",
            "minLength": 8,
            "maxLength": 8
          },
          "srcUID": {
            "type": "string",
            "minLength": 8,
            "maxLength": 8
          },
          "dBm": {
            "type": "number"
          },
          "cmdData": {
            "type": "array"
          }
        },
        "required": [
          "packetType",
          "funcNum",
          "manufId",
          "destUID",
          "srcUID",
          "dBm",
          "cmdData"
        ]
      }
    }
  }
}

Get command profile

get
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
commandstringRequired

MobiusFlow Command ID

Example: {"value":"ENOCEAN_RADIO_ERP1"}Pattern: ^[0-9A-Za-z_]*$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
get
GET /api/v1/mobius/profile/command/{hid}/{command} HTTP/1.1
Host: 
Accept: */*
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "description": "Broadcast a received EnOcean raw radio telegram",
    "schema": {
      "type": "object",
      "properties": {
        "rorg": {
          "type": "string",
          "minLength": 2,
          "maxLength": 2
        },
        "rawData": {
          "type": "array"
        }
      },
      "required": [
        "rorg",
        "rawData"
      ]
    }
  }
}

Login to engine API

post
Body

Engine API Login credentials

usernamestringRequired

Username

passwordstringRequired

Password

Responses
200
Ok response
application/json
401
Unauthorized
application/json
500
Internal Server Error
application/json
post
POST /api/v1/auth/login HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 55

{
  "username": "exampleUser",
  "password": "examplePassword"
}
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiIyYTZlMzQzNC1kZjI4LTQ1NDQtOTYzYS1mZTViMmQ1NTg0ZWIiLCJyb2xlcyI6MjU1LCJpYXQiOjE2NzMyODY1MjYsImV4cCI6MTY3MzI5MDEyNn0.eDnLoBQSp8mkI6C4rkgm1iBFL_dSPAWoYiXOtitaCAs",
  "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiIyYTZlMzQzNC1kZjI4LTQ1NDQtOTYzYS1mZTViMmQ1NTg0ZWIiLCJyZWZyZXNoVG9rZW4iOnRydWUsImlhdCI6MTY3MzI4NjUyNiwiZXhwIjoxNjczMzI5NzI2fQ.TsB2JUhjh8I8dvJrXxVNL4anJKUO5j_sS2EL3x4c5SE"
}

Refresh API tokens

post
Body

Refresh token data

refreshTokenstringRequired

Refresh token

Responses
200
Ok response
application/json
401
Unauthorized
application/json
500
Internal Server Error
application/json
post
POST /api/v1/auth/refresh HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 234

{
  "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiIyYTZlMzQzNC1kZjI4LTQ1NDQtOTYzYS1mZTViMmQ1NTg0ZWIiLCJyZWZyZXNoVG9rZW4iOnRydWUsImlhdCI6MTY3MTYxNzY2MiwiZXhwIjoxNjcxNjYwODYyfQ.Mwjbo13AQH-wyfuK_HI5sjwikUZSRboyHa6nkrkm-Xg"
}
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiIyYTZlMzQzNC1kZjI4LTQ1NDQtOTYzYS1mZTViMmQ1NTg0ZWIiLCJyb2xlcyI6MjU1LCJpYXQiOjE2NzMyODcyMDUsImV4cCI6MTY3MzI5MDgwNX0.T2D6l1AMMEbBJXshJjyyHjt1t7XUB5k35Vegusg2HZc",
  "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiIyYTZlMzQzNC1kZjI4LTQ1NDQtOTYzYS1mZTViMmQ1NTg0ZWIiLCJyZWZyZXNoVG9rZW4iOnRydWUsImlhdCI6MTY3MzI4NzIwNSwiZXhwIjoxNjczMzMwNDA1fQ.AJxGVcUr0raGWYYUDY8hxq9It_gd7byodocjKuzo35I"
}

Add a new user

post
Body

New user data

usernamestringRequired

Username

passwordstring · min: 8Required

Password

Responses
200
Ok response
application/json
401
Unauthorized
application/json
500
Internal Server Error
application/json
post
POST /api/v1/auth/user HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 147

{
  "username": "bobz@home.com",
  "password": "12345678",
  "roles": {
    "admin": false,
    "flows": true,
    "configure": false,
    "subscribe": true,
    "write": true,
    "read": true
  }
}
{
  "_id": "71abe4f9-c636-4b1c-950f-968459cea908"
}

Set user roles

patch
Path parameters
_idstringRequired

User ID

Body

New roles information

Responses
200
Ok response
application/json
401
Unauthorized
application/json
404
Not Found
application/json
500
Internal Server Error
application/json
patch
PATCH /api/v1/auth/user/roles/{_id} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 97

{
  "roles": {
    "admin": true,
    "flows": true,
    "configure": false,
    "subscribe": true,
    "write": true,
    "read": true
  }
}
{
  "roles": {
    "admin": true,
    "flows": true,
    "configure": false,
    "subscribe": true,
    "write": true,
    "read": true
  }
}

Set user password

patch
Path parameters
_idstringRequired

User ID

Body

New password information

passwordstring · min: 8Required

New password

Responses
200
Ok response
application/json
401
Unauthorized
application/json
404
Not Found
application/json
500
Internal Server Error
application/json
patch
PATCH /api/v1/auth/user/password/{_id} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 19

{
  "password": "text"
}
{
  "result": "text"
}

Add object

post
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
pidstringRequired

MobiusFlow Object Profile ID

Example: {"value":"014A"}Pattern: ^[0-9A-Fa-f]{4}$
Body

Array of resources

ridstringOptional
Responses
201
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
post
POST /api/v1/mobius/object/{hid}/{sid}/{pid} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 36

[
  {
    "rid": "40",
    "settings": {
      "min": 30
    }
  }
]
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "sid": "020",
    "spid": "0021",
    "name": "enocean devices",
    "enabled": true,
    "runAtStart": true,
    "settings": {
      "mqtt": {
        "host": "mqtt://localhost",
        "port": 2016
      },
      "timeouts": {
        "local": 500,
        "remote": 5000
      }
    },
    "custom": {},
    "objects": [
      {
        "pid": "000D",
        "objects": [
          {
            "pid": "000D",
            "ins": "0005",
            "rids": [
              {
                "rid": "40",
                "settings": {
                  "min": 22
                }
              }
            ]
          },
          {
            "pid": "000D",
            "ins": "0002",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "11223344"
                }
              }
            ]
          },
          {
            "pid": "000D",
            "ins": "0006",
            "rids": [
              {
                "rid": "40",
                "settings": {
                  "min": 30
                }
              }
            ]
          }
        ]
      },
      {
        "pid": "0010",
        "objects": [
          {
            "pid": "0010",
            "ins": "0001",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-02-02 Temperature Sensor (-30C to 10C)"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "12121212"
                }
              }
            ]
          }
        ]
      }
    ]
  }
}

Add object with specified instance ID

post
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
pidstringRequired

MobiusFlow Object Profile ID

Example: {"value":"014A"}Pattern: ^[0-9A-Fa-f]{4}$
insstringRequired

MobiusFlow Object Instance ID

Example: {"value":"0001"}Pattern: ^[0-9A-Fa-f]{4}$
Body

Array of resources

ridstringOptional
Responses
201
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
post
POST /api/v1/mobius/object/{hid}/{sid}/{pid}/{ins} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 36

[
  {
    "rid": "40",
    "settings": {
      "min": 30
    }
  }
]
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "sid": "020",
    "spid": "0021",
    "name": "enocean devices",
    "enabled": true,
    "runAtStart": true,
    "settings": {
      "mqtt": {
        "host": "mqtt://localhost",
        "port": 2016
      },
      "timeouts": {
        "local": 500,
        "remote": 5000
      }
    },
    "custom": {},
    "objects": [
      {
        "pid": "000D",
        "objects": [
          {
            "pid": "000D",
            "ins": "0005",
            "rids": [
              {
                "rid": "40",
                "settings": {
                  "min": 22
                }
              }
            ]
          },
          {
            "pid": "000D",
            "ins": "0002",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "11223344"
                }
              }
            ]
          },
          {
            "pid": "000D",
            "ins": "0006",
            "rids": [
              {
                "rid": "40",
                "settings": {
                  "min": 30
                }
              }
            ]
          }
        ]
      },
      {
        "pid": "0010",
        "objects": [
          {
            "pid": "0010",
            "ins": "0001",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-02-02 Temperature Sensor (-30C to 10C)"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "12121212"
                }
              }
            ]
          }
        ]
      }
    ]
  }
}

Clone object

post
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
pidstringRequired

MobiusFlow Object Profile ID

Example: {"value":"014A"}Pattern: ^[0-9A-Fa-f]{4}$
insstringRequired

MobiusFlow Object Instance ID

Example: {"value":"0001"}Pattern: ^[0-9A-Fa-f]{4}$
Body

Object cloning information

copiesnumberRequired

Number of copies to be created

startstringOptional

Starting instance ID of the 1st copy, subsequent copies will be incremented

Pattern: ^[0-9A-F]{4}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
post
POST /api/v1/mobius/object/clone/{hid}/{sid}/{pid}/{ins} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 27

{
  "copies": 1,
  "start": "000A"
}
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "sid": "020",
    "spid": "0021",
    "name": "enocean devices",
    "enabled": true,
    "runAtStart": true,
    "settings": {
      "mqtt": {
        "host": "mqtt://localhost",
        "port": 2016
      },
      "timeouts": {
        "local": 500,
        "remote": 5000
      }
    },
    "objects": [
      {
        "pid": "000D",
        "objects": [
          {
            "ins": "0002",
            "pid": "000D",
            "uiname": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "11223344"
                }
              }
            ],
            "timestamp": 1671618304292
          },
          {
            "ins": "0006",
            "pid": "000D",
            "rids": [
              {
                "rid": "40",
                "settings": {
                  "min": 30
                }
              }
            ]
          },
          {
            "ins": "0001",
            "pid": "000D",
            "rids": [
              {
                "rid": "40",
                "settings": {
                  "min": 30
                }
              }
            ]
          },
          {
            "ins": "000A",
            "pid": "000D",
            "uiname": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "11223344"
                }
              }
            ],
            "timestamp": 1671618304292
          }
        ]
      },
      {
        "pid": "0010",
        "objects": [
          {
            "ins": "0001",
            "pid": "0010",
            "uiname": "EnOcean EEP A5-02-02 Temperature Sensor (-30C to 10C)",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-02-02 Temperature Sensor (-30C to 10C)"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "12121212"
                }
              }
            ],
            "timestamp": 1671618299023
          }
        ]
      }
    ],
    "custom": {}
  }
}

Patch live resource

patch
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
pidstringRequired

MobiusFlow Object Profile ID

Example: {"value":"014A"}Pattern: ^[0-9A-Fa-f]{4}$
insstringRequired

MobiusFlow Object Instance ID

Example: {"value":"0001"}Pattern: ^[0-9A-Fa-f]{4}$
ridstringRequired

MobiusFlow Resource ID

Example: {"value":"40"}Pattern: ^[0-9A-Fa-f]{2}$
Body

Resource information

prioritynumberOptional

Priority of the resource value

valueany ofRequired

Value of the resource

stringOptional
or
numberOptional
or
booleanOptional
or
nullOptional
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
patch
PATCH /api/v1/mobius/object/resource/{hid}/{sid}/{pid}/{ins}/{rid} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 26

{
  "priority": 15,
  "value": 10
}
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001/020/000D/0001/40",
  "data": {
    "rid": "40",
    "type": "number",
    "name": "tmp",
    "pv": 10,
    "prar": [
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      10,
      0
    ],
    "settings": {
      "access": "r",
      "min": 0,
      "max": 51,
      "precision": 1,
      "units": "C"
    }
  }
}

Patch multiple live resources

patch
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
pidstringRequired

MobiusFlow Object Profile ID

Example: {"value":"014A"}Pattern: ^[0-9A-Fa-f]{4}$
insstringRequired

MobiusFlow Object Instance ID

Example: {"value":"0001"}Pattern: ^[0-9A-Fa-f]{4}$
Body

Array of patched live resources

rstringRequired

Resource ID

pnumberRequired

Priority of the resource value

vany ofRequired

Value of the resource

stringOptional
or
numberOptional
or
booleanOptional
or
nullOptional
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
patch
PATCH /api/v1/mobius/object/resource/{hid}/{sid}/{pid}/{ins} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 58

[
  {
    "r": "00",
    "p": 15,
    "v": "Hello"
  },
  {
    "r": "40",
    "p": 15,
    "v": 43.9
  }
]
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001/020/000D/0001",
  "data": {
    "pid": "000D",
    "ins": "0001",
    "profileName": "enocean_A5-08-01",
    "description": "EnOcean light, temperature and occupancy sensor",
    "resources": [
      {
        "rid": "00",
        "type": "string",
        "name": "parentObject",
        "pv": "Hello",
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          "Hello",
          ""
        ],
        "settings": {
          "access": "rw",
          "tags": {
            "attribute": "true"
          }
        }
      },
      {
        "rid": "01",
        "type": "string",
        "name": "name",
        "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor",
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor",
          ""
        ],
        "settings": {
          "access": "r",
          "tags": {
            "attribute": "true"
          }
        }
      },
      {
        "rid": "02",
        "type": "datetime",
        "name": "objectLastUpdated",
        "pv": "2022-12-21T12:12:40.566Z",
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          "2022-12-21T12:12:40.566Z",
          "1970-01-01T00:00:00.000Z"
        ],
        "settings": {
          "access": "r"
        }
      },
      {
        "rid": "03",
        "type": "string",
        "name": "description",
        "pv": "",
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          "",
          ""
        ],
        "settings": {
          "access": "r",
          "tags": {
            "attribute": "true"
          }
        }
      },
      {
        "rid": "04",
        "type": "string",
        "name": "location",
        "pv": "",
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          "",
          ""
        ],
        "settings": {
          "access": "r",
          "tags": {
            "attribute": "true"
          }
        }
      },
      {
        "rid": "0A",
        "type": "string",
        "name": "eep",
        "pv": "A5-08-01",
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          "A5-08-01",
          ""
        ],
        "settings": {
          "access": "r",
          "tags": {
            "attribute": "true"
          }
        }
      },
      {
        "rid": "0B",
        "type": "string",
        "name": "uid",
        "pv": "12345678",
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          "12345678",
          ""
        ],
        "settings": {
          "access": "r",
          "maxlen": 8,
          "tags": {
            "attribute": "true"
          }
        }
      },
      {
        "rid": "0C",
        "type": "number",
        "name": "status",
        "pv": 0,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          0,
          0
        ],
        "settings": {
          "access": "r"
        }
      },
      {
        "rid": "0D",
        "type": "number",
        "name": "dBm",
        "pv": 0,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          0,
          0
        ],
        "settings": {
          "access": "r",
          "units": "dBm"
        }
      },
      {
        "rid": "0E",
        "type": "bool",
        "name": "lrn",
        "pv": false,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          false,
          false
        ],
        "settings": {
          "access": "r"
        }
      },
      {
        "rid": "40",
        "type": "number",
        "name": "tmp",
        "pv": 43.9,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          43.9,
          0
        ],
        "settings": {
          "access": "r",
          "min": 0,
          "max": 51,
          "precision": 1,
          "units": "C"
        }
      },
      {
        "rid": "41",
        "type": "number",
        "name": "lux",
        "pv": 0,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          0,
          0
        ],
        "settings": {
          "access": "r",
          "min": 0,
          "max": 510,
          "precision": 1,
          "units": "lx"
        }
      },
      {
        "rid": "42",
        "type": "bool",
        "name": "pirs",
        "pv": false,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          false,
          false
        ],
        "settings": {
          "access": "r"
        }
      },
      {
        "rid": "43",
        "type": "bool",
        "name": "occupany",
        "pv": false,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          false,
          false
        ],
        "settings": {
          "access": "r"
        }
      },
      {
        "rid": "44",
        "type": "number",
        "name": "supplyVoltage",
        "pv": 0,
        "prar": [
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          null,
          0,
          0
        ],
        "settings": {
          "access": "r",
          "min": 0,
          "max": 5.1,
          "precision": 1,
          "units": "V"
        }
      }
    ],
    "families": [
      "EnOcean",
      "TemperatureSensor",
      "OccupancySensor",
      "LightSensor"
    ],
    "isFromConfig": 1
  }
}

Clear live resource

patch
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
pidstringRequired

MobiusFlow Object Profile ID

Example: {"value":"014A"}Pattern: ^[0-9A-Fa-f]{4}$
insstringRequired

MobiusFlow Object Instance ID

Example: {"value":"0001"}Pattern: ^[0-9A-Fa-f]{4}$
ridstringRequired

MobiusFlow Resource ID

Example: {"value":"40"}Pattern: ^[0-9A-Fa-f]{2}$
Body

Resource information

prioritynumberRequired

Priority of the resource value

Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
patch
PATCH /api/v1/mobius/object/resource/clear/{hid}/{sid}/{pid}/{ins}/{rid} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 15

{
  "priority": 15
}
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001/020/000D/0001/40",
  "data": {
    "rid": "40",
    "type": "number",
    "name": "tmp",
    "pv": 0,
    "prar": [
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      0
    ],
    "settings": {
      "access": "r",
      "min": 0,
      "max": 51,
      "precision": 1,
      "units": "C"
    }
  }
}

Update object in service

patch
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
pidstringRequired

MobiusFlow Object Profile ID

Example: {"value":"014A"}Pattern: ^[0-9A-Fa-f]{4}$
insstringRequired

MobiusFlow Object Instance ID

Example: {"value":"0001"}Pattern: ^[0-9A-Fa-f]{4}$
Body

Object information

insstringRequired

Replacement object instance ID

Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
patch
PATCH /api/v1/mobius/object/config/{hid}/{sid}/{pid}/{ins} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 58

{
  "ins": "0005",
  "rids": [
    {
      "rid": "40",
      "settings": {
        "min": 22
      }
    }
  ]
}
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "pid": "000D",
    "ins": "0005",
    "rids": [
      {
        "rid": "40",
        "settings": {
          "min": 22
        }
      }
    ]
  }
}

Add service

post
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
Body

New service information

sidstringOptional

Service ID

Pattern: ^[0-9A-F]{3}$
spidstringRequired

Service profile ID

Pattern: ^[0-9A-F]{4}$
namestringRequired

Service name

enabledbooleanRequired

Service enabled flag

runAtStartbooleanRequired

Service run at start flag

Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
post
POST /api/v1/mobius/service/{hid} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 91

{
  "spid": "000E",
  "name": "New example nr-connector service",
  "enabled": false,
  "runAtStart": true
}
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": [
    {
      "id": "0004/002",
      "name": "mobius-engine-api",
      "enabled": true,
      "runAtStart": true
    },
    {
      "id": "0012/012",
      "name": "mobius-ui-restapi",
      "enabled": true,
      "runAtStart": true
    },
    {
      "id": "0021/020",
      "name": "enocean devices",
      "enabled": true,
      "runAtStart": true
    },
    {
      "id": "000E/021",
      "name": "Test",
      "enabled": false,
      "runAtStart": true
    },
    {
      "id": "000E/022",
      "name": "New example nr-connector service",
      "enabled": false,
      "runAtStart": true
    }
  ]
}

Clone service

post
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
Body

Clone service information

copiesnumberRequired

Number of copies

startstringRequired

Starting service ID for 1st copy, subsequent copies will be incremented

Pattern: ^[0-9A-F]{3}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
post
POST /api/v1/mobius/service/clone/{hid}/{sid} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 26

{
  "copies": 1,
  "start": "030"
}
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": [
    {
      "id": "0004/002",
      "name": "mobius-engine-api",
      "enabled": true,
      "runAtStart": true
    },
    {
      "id": "0012/012",
      "name": "mobius-ui-restapi",
      "enabled": true,
      "runAtStart": true
    },
    {
      "id": "0021/020",
      "name": "enocean devices",
      "enabled": true,
      "runAtStart": true
    },
    {
      "id": "000E/021",
      "name": "Test",
      "enabled": false,
      "runAtStart": true
    },
    {
      "id": "0021/030",
      "name": "Clone of 020 0",
      "enabled": true,
      "runAtStart": true
    }
  ]
}

Update service ID of a service

patch
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
Body

New service ID information

newSIDstringRequired

New service ID

Pattern: ^[0-9A-F]{3}$
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
patch
PATCH /api/v1/mobius/service/config/sid/{hid}/{sid} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 16

{
  "newSID": "02A"
}
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": [
    {
      "id": "0004/002",
      "name": "mobius-engine-api",
      "enabled": true,
      "runAtStart": true
    },
    {
      "id": "0012/012",
      "name": "mobius-ui-restapi",
      "enabled": true,
      "runAtStart": true
    },
    {
      "id": "0021/020",
      "name": "enocean devices",
      "enabled": true,
      "runAtStart": true
    },
    {
      "id": "000E/02A",
      "name": "nr-connector",
      "enabled": true,
      "runAtStart": true
    }
  ]
}

Update service configuration

patch
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
Body

New service configuration

namestringOptional

Service name

enabledbooleanOptional

Service enabled flag

runAtStartbooleanOptional

Service run at start flag

Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
patch
PATCH /api/v1/mobius/service/config/{hid}/{sid} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 56

{
  "name": "nr-connector",
  "runAtStart": true,
  "enabled": true
}
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "sid": "021",
    "spid": "000E",
    "name": "nr-connector",
    "enabled": true,
    "runAtStart": true,
    "settings": {
      "mqtt": {
        "host": "mqtt://localhost",
        "port": 2016
      },
      "timeouts": {
        "local": 500,
        "remote": 5000
      }
    },
    "custom": {
      "host": "localhost",
      "port": 1890,
      "psk": "node-red"
    },
    "objects": []
  }
}

Replace all objects within a service

put
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
sidstringRequired

MobiusFlow Service ID

Example: {"value":"020"}Pattern: ^[0-9A-Fa-f]{3}$
Body

Array of configured objects on service

pidstringOptional

Object PID

Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
put
PUT /api/v1/mobius/service/config/replaceAllObjects/{hid}/{sid} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 538

[
  {
    "pid": "000D",
    "objects": [
      {
        "pid": "000D",
        "ins": "0002",
        "rids": [
          {
            "rid": "01",
            "settings": {
              "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor"
            }
          },
          {
            "rid": "0B",
            "settings": {
              "pv": "11223344"
            }
          }
        ]
      },
      {
        "pid": "000D",
        "ins": "0006",
        "rids": [
          {
            "rid": "40",
            "settings": {
              "min": 30
            }
          }
        ]
      },
      {
        "pid": "000D",
        "ins": "0001",
        "rids": [
          {
            "rid": "40",
            "settings": {
              "min": 30
            }
          }
        ]
      }
    ]
  },
  {
    "pid": "0010",
    "objects": [
      {
        "pid": "0010",
        "ins": "0001",
        "rids": [
          {
            "rid": "01",
            "settings": {
              "pv": "EnOcean EEP A5-02-02 Temperature Sensor (-30C to 10C)"
            }
          },
          {
            "rid": "0B",
            "settings": {
              "pv": "12121212"
            }
          }
        ]
      }
    ]
  }
]
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "sid": "020",
    "spid": "0021",
    "name": "enocean devices",
    "enabled": true,
    "runAtStart": true,
    "settings": {
      "mqtt": {
        "host": "mqtt://localhost",
        "port": 2016
      },
      "timeouts": {
        "local": 500,
        "remote": 5000
      }
    },
    "custom": {},
    "objects": [
      {
        "pid": "000D",
        "objects": [
          {
            "pid": "000D",
            "ins": "0002",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-08-01 Light, Temperature and Occupancy Sensor"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "11223344"
                }
              }
            ]
          },
          {
            "pid": "000D",
            "ins": "0006",
            "rids": [
              {
                "rid": "40",
                "settings": {
                  "min": 30
                }
              }
            ]
          },
          {
            "pid": "000D",
            "ins": "0001",
            "rids": [
              {
                "rid": "40",
                "settings": {
                  "min": 30
                }
              }
            ]
          }
        ]
      },
      {
        "pid": "0010",
        "objects": [
          {
            "pid": "0010",
            "ins": "0001",
            "rids": [
              {
                "rid": "01",
                "settings": {
                  "pv": "EnOcean EEP A5-02-02 Temperature Sensor (-30C to 10C)"
                }
              },
              {
                "rid": "0B",
                "settings": {
                  "pv": "12121212"
                }
              }
            ]
          }
        ]
      }
    ]
  }
}

Set flows configuration

put
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
Body

Array of flow configurations

Other propertiesanyOptional
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
put
PUT /api/v1/mobius/flow/{hid} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 611

[
  {
    "id": "6aa8ab4d100707b8",
    "type": "tab",
    "label": "Pigs will fly",
    "disabled": false,
    "info": "",
    "env": []
  },
  {
    "id": "f3e2539aafeaa03c",
    "type": "azureiotdevice",
    "z": "6aa8ab4d100707b8",
    "deviceid": "A00001_021_012D_0001",
    "pnpModelid": "",
    "connectiontype": "dps",
    "authenticationmethod": "sas",
    "iothub": "",
    "isIotcentral": true,
    "scopeid": "0ne004C4815",
    "enrollmenttype": "device",
    "saskey": "UhjPQxY299AdQ3/TVL2kHFIi36a/cpWTUT/0BJvZjAg=",
    "certname": "",
    "keyname": "",
    "passphrase": "",
    "protocol": "mqtt",
    "retryInterval": 10,
    "methods": [],
    "DPSpayload": "",
    "gatewayHostname": "",
    "caname": "",
    "cert": "",
    "key": "",
    "ca": "",
    "x": 920,
    "y": 120,
    "wires": [
      []
    ]
  }
]
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": "OK"
}

Send broadcast command

post
Path parameters
cidstringRequired

MobiusFlow Command ID

Example: {"value":"ENOCEAN_RADIO_ERP1"}
Body
objectOptional

Payload of command

Example: {"rorg":"F6","db_0":100,"db_1":80,"db_2":60,"db_3":40,"uid":"12345678","status":23,"subTelNum":1,"dBm":-5}
Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
404
Not Found
application/json
408
Request Timeout
application/json
500
Internal Server Error
application/json
post
POST /api/v1/mobius/command/{cid} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 106

{
  "rorg": "F6",
  "db_0": 100,
  "db_1": 80,
  "db_2": 60,
  "db_3": 40,
  "uid": "12345678",
  "status": 23,
  "subTelNum": 1,
  "dBm": -5
}
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "ENOCEAN_RADIO_ERP1",
  "data": {
    "result": "OK"
  }
}

Update licence code

put
Path parameters
hidstringRequired

MobiusFlow Hub ID

Example: {"value":"000001"}Pattern: ^[0-9A-Fa-f]{6}$
Body

Licence code data

licenceCodestringRequired

Licence code

Responses
200
Ok response
application/json
400
Bad Request
application/json
401
Unauthorized
application/json
500
Internal Server Error
application/json
put
PUT /api/v2/mobius/licence/{hid} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 153

{
  "licenceCode": "c2480687816cf833-20e44db08a00df1c-62fff13ac04f16e4-9066e16d9b185417-9ef8fce8c3115e69-bd5f6186a806e4dd-256e3a2b53ee1b1d-9fd943dbd60a58b2"
}
{
  "ts": "2022-12-21T10:25:54.585Z",
  "uri": "000001",
  "data": {
    "licenceCode": "c2480687816cf833-20e44db08a00df1c-62fff13ac04f16e4-9066e16d9b185417-9ef8fce8c3115e69-bd5f6186a806e4dd-256e3a2b53ee1b1d-9fd943dbd60a58b2"
  }
}
2KB
docker-compose.yml
Cover

UP Board from Aaeon

Image supports:

  • UP2 Edge

  • UP2 Edge Pro

  • Up Extreme Edge

  • and more..

Cover

Raspberry Pi 4

Perfect for:

  • Low cost deployments

  • Proof of Concept applications

  • Testing and demonstrations

Cover

Intel NUC

  • Many different manufacturers

  • Wide range of prices depending on specification

  • Always available

10MB
EXTxxxxx_v3.1.1.zip
archive
10MB
EXTxxxxx_v3.2.0.zip
archive
39KB
Mobius Engine API.postman_collection.json
Create your first Fleet
Create new fleet details
Device Variables for a device
Add a licence code
Licence entered
balenaHub search
Deploy MobiusFlow® to fleet
Create new fleet or deplot to existing fleet
Choose an existing fleet
New release building
New release deployed
Device details
balenaCloud device manage terminal
Edit networks.json file
Restart the manage microservice
MobiusFlow® Microservices
Home page
MobiusFlow Connector
Architecture
MobiusFlow Offical Connector
Connector configuration login Page
Connector configuration home page
Connector configuration networks page, in wired network mode
Connector configuration networks page, in WiFi network mode
Connector configuration networks page, using DHCP
Connector configuration networks page, using static IP
Connector configuration networks page, with AP Enabled
Connector configuration MQTT page
Connector configuration Home page
Set the config mode password
MQTT Diagram
Diagram of EnOcean devices and a MobiusFlow connector (EnOcean Transceiver / MQTT Converter)
MobiusFlow Hub / Service / Object hierarchy
MobiusFlow Object / Resource hierarchy
Completed project schematic
MobiusFlow node, logical structure
Backup/Restore Menu
Backup button
Location of backup file download button
Downloaded backup file
Upload Zip button
Browsing to backup file
Uploaded backup file information and restore button
Confirmation Dialog
Service status showing successful MQTT connection
New INGY group object with a group number 7001486
LoRaWAN LNS Service config, showing a newly added lorawan_gateway object and populated Gateway ID of AABBCCDDEE112233
LoRaWAN LNS Service config, showing a newly added MileSight VS121 Occupancy object and populated Device EUI of 112233445566AABB & Device App Key of 00000000000000000000000000000011
Populated node configuration with example URI 000001/020/0291/0002
Viewing the resources of a LoRaWAN device object on a LoRaWAN LNS service, noting resource 21 (enqueued count)
Simplest use of lorawan send downlink node
Example flow use lorawan send raw node
Configuration of lorawan send raw node showing example device EUI of AABBCCDDEEFF1122
lorawan_generic_device object configuration pane
LNS Stats Object Resources
Config window of MobiusFlow Inject with some populated subscriptions
Config window of the Get-Multi Object node
Example populated config window of Get Multi-Object Node
Config window for the Get Multi-Resource node
Config window of Discover node
Example discover response at service level
Config window of Discover Object List node
000001/022/# wildcard URI used as discovery URI
Example flow to show responses from Discover Object List node in debug window
Config window Filter By Rid Value node
Example configuration of the Filter By Rid Value node
Config window for the Clear Resource node
High-Level System Architecture Diagram
Lower-level system architecture diagram
Lower-level system architecture diagram with the MQTT broker running within MobiusFlow
The main menu of the SW67941 configurator tool with the MQTT Set Topic button highlighted
Correctly populated MQTT Publish tab
Correctly populated MQTT Subscribe tab
An adweb dali mqtt service and mqtt broker service running within MobiusFlow
Configuration page for a DALI luminaire MobiusFlow object
The configuration of page of a DALI group MobiusFlow object
Resource list of the DALI luminaire oject
Resource list for DALI group object
Populated DALI luminaire resource list as a result of auto-querying
Function 1 node configuration
DCMD node configuration
Function 4 configuration window
DCMD node configuration window
DALI emergency light MobiusFlow object on an adfweb dali mqtt service
Configuration screen for a DALI emergency MobiusFlow object
Functon 8 node configuration
DCMD node configuration
Example of how to use a getResource node
Configuration window of the getResource node
Node label of the getResource node reflecting the specified resource URI
Debug window showing the result of the triggered flow. In this case the current value of specified resource was 0
Result of equivalent flow when using getObject node
Example flow of a resourceCov node
Example flow of the objectCov node
Example usage of second output
ResourceCov node with 'Use detailed outputs' enabled
Example of usage of all detailed outputs
Example flow using setResource node to set resource with URI 000001/027/0201/0001/40
MobiusFlow EnOcean dataflow
Sub bcmd node
Sub bcmd node configuration pane
Sub bcmd node configured to respond to ENOCEAN_RADIO_RMC telegrams
Send bcmd node
Send bcmd node configured EnOcean telegrams
EnOcean Connector TX node
Configuration of EnOcean Connector TX node
The correct package shown in the Node-RED palette manager search results
Prompt to add a new connection shown here within a getResource node configuration window
The configuration window of the new connection
The configuration window of a getResource node showing the selected connection labelled mobius:8443
GetResource node showing 'Connected' status
GetResource node showing 'Disconnected' status
MobiusFlow manager Instance creation wizard
About page
Update firmware page
Wired connection
Wireless connection
DHCP address
Static address
MQTT configuration
Add a new device
Add new device details
Viewing the fleet's device list

Object Store

Article covering MobiusFlow Object Store service

The Object Store service can be considered a service type only for storing MobiusFlow objects. It has no functional backend. This means, unlike most other MobiusFlow services, the service will not interact with the objects stored on it.

Uses

  • For storing non-service specific objects such as the Numeric Value objects or String Value objects (Often these will be used if values are being calculated based on other objects)

  • Manually writing to an object type, instead of relying on its functional parent service (e.g. manually writing the data into a LoRaWAN device object from the Flows, instead of using the LoRaWAN LNS service)

  • Testing

  • Diagnostics

Limitation

Although it is possible to place any object type in an Object Store service, because the service has no functional backend, it cannot interact with most object types in fully functional way. For example, adding a LoRaWAN device object to an Object Store service is possible, however the object will not be automatically populated by incoming LoRaWAN messages. If the LoRaWAN device object was placed into its functional parent service (LoRaWAN LNS service / LoRaWAN Devices service) instead, it would function as normal, as these service types have the correct backend to work with this object type.

MobiusFlow Connectors

Article covering MobiusFlow Connectors service

Purpose of Connector Service

MobiusFlow connectors are transceiver hardware that connect to the following technologies:

Connectors are designed to bridge the gap between these technologies and MobiusFlow via the MobiusFlow Connectors service.

Service Configuration & MQTT

The Connectors service uses MQTT to communicate with the Connectors. As such, the service must be pointed to and authenticated with an MQTT broker.

The service configuration pane requires entry of the following:

Config Setting
Notes

MQTT Broker

IP address / DNS name of where the broker is running. The service will assume MQTT (no TLS) however MQTTS (TLS) can be used by adding the mqtts:// prefix. In the most cases, the service will be set up to connect to the local MQTT broker running within MobiusFlow. As such, in this situation, the address of the broker will be localhost.

MQTT Port

The MQTT broker port. This will have been setup within the MQTT broker. Likely 1883 if using MQTT or 8883 if using MQTTS

MQTT Username

The username of the MQTT user set up within the MQTT broker

MQTT Password

The password of the MQTT user set up within the MQTT broker

Once these fields have been populated, save and start the service:

The MQTT connection status can then be observed within the service status:

The above screenshot shows a running example of a Connectors service connected to a local MQTT broker.

Connector Objects

Each real-world connector must be represented in MobiusFlow using a connector object. The object settings require connector details such Serial Number and Pre-Shared Key (PSK) to be specified. It also allows the viewing of live connector status.

To add a connector object to the Connectors service, first navigate the to the service's object configuration page.

Once navigated to service's object configuration page, a MobiusFlowConnector object for each real-world connector should be added.

Each connector object requires the following configuration settings to be specified:

Config setting
Notes

Serial Number

The serial number of the connector. In the form of MF_XXXXX. Can be found within the connector's configuration.

Pre-Shared Key (Key)

The unique pre-shared key of the connector. This can be anything however the key must be set to match within both the Connector object and the real-world Connector.

Ensure the service is restarted or hot-reloaded to realise changes made to objects

Connector Status

Once the connector object is live, the status of it can be checked by navigating to the resources of that object:

The above screenshots shows the useful status information a connected connector makes available. Checking if the connector is connected is possible by observing the objectLastUpdate resource.

Sensor Data

Raw sensor data is not displayed anywhere within the Connector object. Instead, the service automatically relays incoming data from authorised connectors to the MobiusFlow hub, where it is then broadcast to all MobiusFlow services.

Some service types such as the EnOcean service, listen for and decode these messages into useable data. If the sensor data is valid, those service will then go on to populate corresponding device objects based.

The flowchart below shows how data flows from device level into the corresponding MobiusFlow objects via the Connectors and Connectors service:

Sending Data to Devices via Connectors

An example Numeric Value object residing on an Object Store Service

Connectors service configuration pane
Running connected Connectors service
An unconfigured Connector object within the Connectors service
Live status information from a Connector shown within the Connector object's resources
Connector Dataflow

The EnOcean technology sometimes requires messages /commands to be sent the devices. This is possible is MobiusFlow using the Flows. A full article on receiving and sending EnOcean telegrams within the flows can be found .

WorkPlace Occupancy
EnOcean
here