Only this pageAll pages
Powered by GitBook
1 of 76

Public Documentation

Loading...

Loading...

User Guides

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Technical Docs

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

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.

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.

Deploying MobiusFlow On-Prem

These subsections explain deploy MobiusFlow On-Prem.

MobiusFlow Toolbox

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

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

MobiusFlow Manager

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

The full MobiusFlow Manager training course can be .

Service and Object Configuration

For MobiusFlow 1.x.x only

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:

  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.

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

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

Setting the Hub ID

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.

Deploying MobiusFlow in MobiusFlow Cloud

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

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

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.\

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 Architecture
here
here
MobiusFlow Architecture
MobiusFlow Uniform Resource Identifiers
here
here
MobiusFlow manager Instance creation wizard

Security

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.

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

This file can also be downloaded here:

2KB
docker-compose.yml

Licensing

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

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

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 [email protected] to arrange a support call on this topic.

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

Technical Training Guides

Repository of Technical Training walkthrough guides

Configuring MobiusFlow for use with Connectors

Configure a MobiusFlow instance for connectors

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

Licencing

MobiusFlow Raspberry Pi Connector

DALI Lighting

Flows

MobiusFlow Basics

Learn how to use the full version of MobiusFlow

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

About page
Update firmware page

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!

Licence

API Calls for Licence Management

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

Manages network interfaces. See for more information

mongodb

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

The default settings are

Setting
Default Value

Creating a Fleet

Create a new balenaCloud fleet

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 .

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 your and login in

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

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

Subscription

API Subscription Websocket

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

Command

API Send Command Calls

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

Flows

API Calls for Node-RED Flows

Used get and set the full configuration the flows.

Profiles

API Calls for Service Profiles, Object Profiles and Command Profiles

Database

mobius

Username

mobius

Password

RmzsXQYReLHaCS5wWGjAPjtJ7VnTw4qL

Configure Networks
MobiusFlow® Microservices
balenaCloud
documentation
balenaCloud dashboard
Adding Your First Device
Create your first Fleet
Create new fleet details

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

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.

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

Controllers

All API endpoints are described in the following subsections. The subsections are divided into the functional groups (controllers); Authorization, Discover, Node, Service, Object, Profiles, Command, Flows and Subscription.

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

Swagger documentation describing the API in full, can be found here. 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.

39KB
Mobius Engine API.postman_collection.json

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.

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:

- MOBIUS_LICENCE=38782095-410e7ab5-c3c36a84-dd39683f-c5a8062b-78f846c2-52588c49-fc8eecf4

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:

- 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

Updating a Licence

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

- MOBIUS_LICENCE_RESET=true
  • 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

MobiusFlow Services

MobiusFlow Official Connector

Configure your MobiusFlow Connector and connect it to a MobiusFlow instance

MobiusFlow Offical Connector

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.

Part Number
Region
EnOcean
Workplace Occupancy

EXT00102

EMEA (868MHz)

EXT00110

EMEA (868MHz)

EXT00112

EMEA (868MHz)

EXT10102

US (915MHz)

EXT10110

US (915MHz)

EXT10112

US (915MHz)

Download Connector Firmware

v3.1.1

10MB
EXTxxxxx_v3.1.1.zip
archive

v3.2.0

10MB
EXTxxxxx_v3.2.0.zip
archive

Configure MQTT Page

Configure the MQTT connection to MobiusFlow®

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

MQTT configuration

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

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

Security

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 Manage Certificates 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 Manage Certificates page

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 Licence

License your MobiusFlow® instance

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 Licensing page.

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 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 Device Variables.

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

Navigate to your balenaCloud dashboard and login in

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

Device Variables for a device

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

Add a licence code

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

MobiusFlow® will restart to install the licence

Licence entered

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.

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/Restore Menu

Backup

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

Backup button

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.

Location of backup file download button

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

Downloaded 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.

Upload Zip button
Browsing to backup file

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

Uploaded backup file information and restore button

Accept the a confirmation dialog to proceed.

Confirmation Dialog

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!

Home Page

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

Configure the connection to the MQTT broker you chose when configuring MobiusFlow® for connectors

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

Object

API Object & Resource Calls

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

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

If you forget your password you will have to factory reset the connector

Set the config mode password

Save Settings

Click the Save button

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

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.

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

An example Numeric Value object residing on an Object Store Service

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.

Discover

API Discover calls

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

Service

API Service Calls

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

MobiusFlow Connectors

Overview of MobiusFlow Connectors

MobiusFlow Connector

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.

Architecture

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

Connector Options

There are several hardware options for the MobiusFlow Connector software:

  • Official Connector

  • Raspberry Pi

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:

Transceiver
Notes

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

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

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

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 .

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.

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?

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.

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

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.

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

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

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.

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

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 .

Sending Data to EnOcean Devices

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 .

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

Raspberry Pi 4
Raspberry Pi 5
Raspberry Pi 4 Application
Raspberry Pi 5 Application
here
Balena Etcher tool
here
balenaCloud
www.mobiusflow.com
Creating a Fleet
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

OPC UA
BACnet
DALI
EnOcean
here
MobiusFlow Connectors services article
here
MobiusFlow EnOcean dataflow

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

Glossary

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

API

Application Programming Interface (API) - A well-defined language to allow different software modules to communicate with each other to share data or commands. (see RESTful 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

Endpoints are the start and end of a data flow in an IoT 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.

Gateway

An IoT gateway is a small computing device, normally installed at the edge, 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.

HTTP(s)

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

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

IIoT

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

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 is an OASIS standard messaging protocol for the Internet of Things (IoT). 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.

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

Recursion

See recursion

RESTful API

A RESTful API is an architectural style for an application program interface (API) 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.

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

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

Device Variables

Understanding the MobiusFlow® balenaCloud Device Variables

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 here.

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 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.

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

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

  2. A balenaCloud Raspberry Pi 4 Fleet (see Creating a Fleet)

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

  4. A power supply for your Raspberry Pi 4

  5. An Ethernet network cable

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

  7. An SD card adaptor for your laptop or PC

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

Adding a Device

Navigate to your balenaCloud dashboard and login in

Navigate to the Fleets page

Click on the fleet you want to add a device to

Click on the Add device button

Add a new device

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

Add new device details

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.

Viewing the fleet's device list

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

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

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 node-red-contrib-mobius-flow-base. 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.

The correct package shown in the Node-RED palette manager search results

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.

Prompt to add a new connection shown here within a getResource node configuration window

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

The configuration window of the new connection

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.

The configuration window of a getResource node showing the selected connection labelled mobius:8443

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.

GetResource node showing 'Connected' status

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

GetResource node showing 'Disconnected' status

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).

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 (/).

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.

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.

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.

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.

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.

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.

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 ).

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.

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

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 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://).

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

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.

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

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 ).

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.

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 ).

Present value and the priority array

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.

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.

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/#

hexadecimal
{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)
edge computing
MQTT
microservice
MobiusFlow Uniform Resource Identifiers
MobiusFlow Uniform Resource Identifiers
WebSocket
Mobius URI
MobiusFlow Uniform Resource Identifiers
MobiusFlow Uniform Resource Identifiers
BACnet
MobiusFlow node, logical structure

Connection Details and LED Indicators

Power Options

You have three options to power the connector

Power Option
Details

PoE

Power over Ethernet (30 watts)

DC Supply via screw terminals

5 to 24Vdc 500mA

USB

5V 500mA via micro USB

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.

Item
Description
Comments

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

Product Label

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

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 Connectors

Article covering MobiusFlow Connectors service

Purpose of Connector Service

MobiusFlow connectors are transceiver hardware that connect to the following technologies:

  • WorkPlace Occupancy

  • EnOcean

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.

Connectors service configuration pane

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:

Running connected Connectors service

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.

An unconfigured Connector object within the Connectors service

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:

Live status information from a Connector shown within the Connector object's resources

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:

Connector Dataflow

Sending Data to Devices via Connectors

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 here.

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:

Property
Notes

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.

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 .

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

Property
Explanation

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.

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.

here
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

MobiusFlow Internal Security

Introduction

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 Mobius Overview 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 JSON Web Token (JWT) 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 Mobius architecture 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 mobius node one is via the mobius router designed for this task, and preserving the integrity of the the message within the node. the other is with a dedicated service, this breaches that integrity to a degree but may be desirable and even necessary in some situations.

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.

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 JSON Web Token (JWT).

Service Authentication

When a service connects to a hub it uses the MQTT built in username / password authentication. The MQTT username is the service's profile ID (PID) and service (SID) 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.

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 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 HMAC to allow integrity checking:

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

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 mobius router.

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 WebSocket protocol. This could be done over a secure or non-secure connection (ws:// or ws s://).

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.

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

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.

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

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.

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 your and login in

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.

[
  {
    "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
balenaCloud dashboard
balenaCloud device manage terminal
Edit networks.json file
Restart the manage microservice
[
  {
    "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"
    }
  }
]

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:

  • MobiusFlow Architecture

  • MobiusFlow URIs

  • Connecting Flows to MobiusFlow Engine

All Node-RED nodes that facilitate the data transfer between the MobiusFlow Engine and the Flows are contained in the node-red-contrib-mobius-flow-base 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 guide.

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.

Example of how to use a getResource node

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.

Configuration window of the getResource node

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.

Node label of the getResource node reflecting the specified resource URI

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.

Debug window showing the result of the triggered flow. In this case the current value of specified resource was 0

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

Result of equivalent flow when using getObject node

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.

Example flow of a resourceCov node

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.

Example flow of the objectCov node

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.

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

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.

Example usage of second output

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.

ResourceCov node with 'Use detailed outputs' enabled

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.

Example of usage of all detailed outputs

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

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 Multi-Object

Get

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

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

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.

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.

Example flow using setResource node to set resource with URI 000001/027/0201/0001/40

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.

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.

Sub bcmd node

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

Sub bcmd node configuration pane

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.

Sub bcmd node configured to respond to ENOCEAN_RADIO_RMC telegrams

Sending

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

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 here.

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.

Send bcmd node

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.

Send bcmd node configured EnOcean telegrams

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.

EnOcean Connector TX node

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

Configuration of EnOcean Connector TX node

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.

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.

Setting
Explanation

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.

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:

Service status showing successful MQTT connection

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.

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 here.

New INGY group object with a group number 7001486

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:

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

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 [email protected].

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 this section.

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 [email protected].

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.

LoRaWAN LNS Service config, showing a newly added lorawan_gateway object and populated Gateway ID of AABBCCDDEE112233

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.

LoRaWAN LNS Service config, showing a newly added MileSight VS121 Occupancy object and populated Device EUI of 112233445566AABB & Device App Key of 00000000000000000000000000000011

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.

Populated node configuration with example URI 000001/020/0291/0002

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.

Viewing the resources of a LoRaWAN device object on a LoRaWAN LNS service, noting resource 21 (enqueued count)

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.

Simplest use of lorawan send downlink node

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.

Example flow use 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.

Configuration of lorawan send raw node showing example device EUI of AABBCCDDEEFF1122

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

Reading the sections on connecting a device and downlink are recommended before reading this section.

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.

lorawan_generic_device object configuration pane

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.

LNS Stats Object Resources

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

Wired connection
Wireless connection

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

DHCP address
Static address

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

Node-RED

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.

See for more details

Deploying from balenaHub

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

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

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

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

Backup and Restore
BalenaHub
balenaCloud dashboard
balenaHub
Creating a Fleet
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
wildcards
wildcards
wildcards
Logo

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 Diagram

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.

Learn how JSON works here.

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.

Diagram of EnOcean devices and a MobiusFlow connector (EnOcean Transceiver / MQTT Converter)

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.

MobiusFlow Hub / Service / Object hierarchy

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.

MobiusFlow Object / Resource hierarchy

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

Explanation
Format

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

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

Service
Explanation of requirement

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.

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

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

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

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

Dashboard

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

Completed project schematic

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 here.

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

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

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.

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

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

Template

The template should be set to the following JSON string:

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

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

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

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:

Supported queries and their associated DCMD data are tabulated below:

Query Type
Example DCMD Data

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:

Supported queries and their associated DCMD data are tabulated below:

Query Type
Example DCMD Data

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

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:

Supported actions and their associated DCMD data are tabulated below:

Action
Example DCMD data

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.

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

DALI Luminaire

027A

dali_Luminiaire_v2

adfweb dali mqtt

DALI Group

027B

dali_group

adfweb dali mqtt

GENERIC_DCMD

Query power up level

{
    command: 'queryPowerUpLevel',
    payload: {
        address: 0
    }
}

Query system failure level

{
    command: 'queryPowerUpLevel',
    payload: {
        address: 0
    }
}

Query fade time / rate

{
    command: 'queryPowerUpLevel',
    payload: {
        address: 0
    }
}

Query power failure

{
    command: 'queryPowerUpLevel',
    payload: {
        address: 0
    }
}

Query dtr content

{
    command: 'queryPowerUpLevel',
    payload: {
        address: 0
    }
}
GENERIC_DCMD

Set maximum allowed lighting level

{
    command: 'setMaxLevel',
    payload: {
        address: 0,
        level: 80,
        group: false
    }
}

Set minimum allowed lighting level

{
    command: 'setMinLevel',
    payload: {
        address: 0,
        level: 10,
        group: false
    }
}

Set power up lighting level

{
    command: 'setPowerUpLevel',
    payload: {
        address: 0,
        level: 80,
        group: false
    }
}

Set system failure level

{
    command: 'setSysFailureLevel',
    payload: {
        address: 0,
        level: 50,
        group: false
    }
}

Set fade time

{
    command: 'setFadeTime',
    payload: {
        address: 0,
        level: 5,
        group: false
    }
}

Set fade rate

{
    command: 'setFadeRate',
    payload: {
        address: 0,
        level: 5,
        group: false
    }
}

Store current lighting level in dtr

{
    command: 'setMaxLevel',
    payload: {
        address: 0,
        group: false
    }
}

DALI Emergency Light

0259

dali_emergency

adfweb dali mqtt

GENERIC_DCMD

Rest

{
    command: 'emRest',
    payload: {
        address: 0,
    }
}

Inhibit

{
    command: 'emInhibit',
    payload: {
        address: 0,
    }
}

ReLight Inhibit

{
    command: 'emReLightInhibit',
    payload: {
        address: 0,
    }
}

Start function test

{
    command: 'emStartFunctionTest',
    payload: {
        address: 0,
    }
}

Start duration test

{
    command: 'emStartDurationTest',
    payload: {
        address: 0,
    }
}

Stop test

{
    command: 'emStopTest',
    payload: {
        address: 0,
    }
}

Reset function test done flag

{
    command: 'emResetFunctionTestDoneFlag',
    payload: {
        address: 0,
    }
}

Reset duration test done flag

{
    command: 'emResetDurationTestDoneFlag',
    payload: {
        address: 0,
    }
}

Reset lamp time

{
    command: 'emRestetLampTime',
    payload: {
        address: 0,
    }
}

Store DTR as emergency level

{
    command: 'emStoreDTRAsEmergencyLevel',
    payload: {
        address: 0,
    }
}

Store test delay time high byte

{
    command: 'emStoreTestDelayTimeHightByte',
    payload: {
        address: 0,
    }
}

Store test dalay time low byte

{
    command: 'emStoreTestDelayTimeLowByte',
    payload: {
        address: 0,
    }
}

Store function test interval

{
    command: 'emStoreFunctionTestInterval',
    payload: {
        address: 0,
    }
}

Store duration test interval

{
    command: 'emStoreDurationTestInterval',
    payload: {
        address: 0,
    }
}

Store test execuation timeout

{
    command: 'emStoreTestExecuationTimeout',
    payload: {
        address: 0,
    }
}

Store prolong time

{
    command: 'emStoreProlongTime',
    payload: {
        address: 0,
    }
}

Start indentification

{
    command: 'emStartIdentification',
    payload: {
        address: 0,
    }
}

Query battery charge

{
    command: 'emQueryBatteryCharge',
    payload: {
        address: 0,
    }
}

Query duration test result

{
    command: 'emQueryDurationTestResult',
    payload: {
        address: 0,
    }
}

Query lamp operational time

{
    command: 'emQueryLampOperationTime',
    payload: {
        address: 0,
    }
}

Query emergency mode

{
    command: 'emQueryEmergencyMode',
    payload: {
        address: 0,
    }
}

Query failure mode

{
    command: 'emQueryFailureMode',
    payload: {
        address: 0,
    }
}

Query emergency status

{
    command: 'emQueryEmergencyStatus',
    payload: {
        address: 0,
    }
}
here
SW67941
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

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
  }
}

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"
  }
}

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"
}

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"
  }
}

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": []
    }
  ]
}

Set flows configuration

put
Path parameters
hidstringRequired

MobiusFlow Hub ID

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

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"
}

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"
      ]
    }
  }
}

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"
        }
      }
    ]
  }
}

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}$
Bodyobject[]

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}$
Bodyobject[]

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}$
Bodyobject[]

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
        }
      }
    ]
  }
}

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"
                }
              }
            ]
          }
        ]
      }
    ]
  }
}

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": "[email protected]",
  "password": "12345678",
  "roles": {
    "admin": false,
    "flows": true,
    "configure": false,
    "subscribe": true,
    "write": true,
    "read": true
  }
}
{
  "_id": "71abe4f9-c636-4b1c-950f-968459cea908"
}

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","[email protected]","[email protected]"]
401
Unauthorized
application/json
500
Internal Server Error
application/json
get
GET /api/v1/auth/users HTTP/1.1
Host: 
Accept: */*
[
  "admin",
  "[email protected]",
  "[email protected]"
]

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
}

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"
}

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"
}

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 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"
  }
}

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}$
Bodyobject[]

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"
                }
              }
            ]
          }
        ]
      }
    ]
  }
}

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

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.

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

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

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

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.

MobiusFlow Cloud Hosted Environment

Reference material for the environment in which MobiusFlow Cloud Instances exist

MobiusFlow with LoRaWAN Stack

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 MobiusFlow LoRaWAN LNS.

If included, an instance of Chirpstack 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 LNS Service documentation.

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.

Exposed Port
Internal
Usage
Version

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

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.

Exposed Port
Host OS Port
Container Name
Internal
Usage
Version

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

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:

  • MobiusFlow Architecture

  • MobiusFlow URIs

  • Connecting Flows to MobiusFlow Engine

  • Data Transfer between Flows and MobiusFlow Engine

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

All nodes are part of the node-red-contrib-mobiusflow-base Node-RED package. All the nodes require a connection to the MobiusFlow Engine.

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

Config window of MobiusFlow Inject with some populated subscriptions

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

Config window of the Get-Multi Object node

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.

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

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:

Example populated config window of Get Multi-Object Node

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

Config window for the Get Multi-Resource node

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

Config window of Discover node

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:

Example discover response at service level

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

Config window of Discover Object List node

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:

000001/022/# wildcard URI used as discovery URI

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:

Example flow to show responses from Discover Object List node in debug window

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

Config window Filter By Rid Value node

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:

Example configuration of the Filter By Rid Value node

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

Config window for the Clear Resource node

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.

MobiusFlow Inject
Get Multi-Object
Get Multi-Resource
Discover
Discover Object List
Filter By Rid Value
Clear Resource