Jump to content

SENSBLUE ATLAS: Difference between revisions

From ATRONIA Wiki
No edit summary
No edit summary
 
(54 intermediate revisions by the same user not shown)
Line 1: Line 1:
[[File:SENSBLUE-ATLAS-Gateway.png|center|frameless|360x360px]]
[[File:SENSBLUE-ATLAS-Gateway.png|center|frameless|360x360px]]
<div style="margin: 15px 0;">
<span class="atlas-btn">[[SENSBLUE ATLAS/Technical Resources|Technical Resources]]</span>
</div>


== '''Datasheet''' ==
== '''Datasheet''' ==


=== 2. Table of SENSBLUE ATLAS Reference ID Model Number ===
=== 1. Table of SENSBLUE ATLAS Reference ID Model Number ===
{| class="wikitable"
{| class="wikitable"
|
|
Line 27: Line 31:
|}
|}


=== 3. General Description ===
=== 2. General Description ===
SENSBLUE ATLAS is a single board computer that connects sensors and assets, runs control logic and ships to production without platform changes.
SENSBLUE ATLAS is a single board computer that connects sensors and assets, runs control logic and ships to production without platform changes.


Designed for industrial teams who need one dependable path from experiments to operations.
Designed for industrial teams who need one dependable path from experiments to operations.


==== 3.1 Key Features ====
==== 2.1 Key Features ====
'''Processor:'''
'''Processor:'''


Line 39: Line 43:
'''I/O:'''
'''I/O:'''


* 12 DO (Digital Outputs)
* 12 DIO (8 Digital Outputs and 4 Digital Input)
* 6 AI (Analog Inputs)
* 6 AIO (4 Analog Inputs and 2 Analog Outputs)
* 2 relays
* 2 relays


Line 63: Line 67:
* Other versions under request.
* Other versions under request.


=== 4. Hardware Specifications ===
=== 3. Hardware Specifications ===
{| class="wikitable tech-table" style="width: 100%;"
{| class="wikitable tech-table" style="width: 100%;"
!style="width: 50%;"|'''Parameter'''
!style="width: 50%;"|'''Parameter'''
Line 96: Line 100:
|}
|}


=== 5. Power ===
=== 4. Power ===
{| class="wikitable tech-table" style="width: 100%;"
{| class="wikitable tech-table" style="width: 100%;"
!style="width: 50%;"|'''Parameter'''
!style="width: 50%;"|'''Parameter'''
Line 123: Line 127:
|}
|}


=== 6. Digital Inputs ===
=== 5. Digital Inputs ===
{| class="wikitable tech-table" style="width: 100%;"
{| class="wikitable tech-table" style="width: 100%;"
!style="width: 50%;"|'''Parameter'''
!style="width: 50%;"|'''Parameter'''
Line 162: Line 166:
|}
|}


=== 7. Digital Outputs (Relay) ===
==== 5.1 Wiring ====
[[File:DIG IN.svg|center|frameless|500x500px]]
 
=== 6. Digital Outputs (Relay) ===
{| class="wikitable tech-table" style="width: 100%;"
{| class="wikitable tech-table" style="width: 100%;"
!style="width: 50%;"|'''Parameter'''
!style="width: 50%;"|'''Parameter'''
Line 186: Line 193:
|}
|}


=== 8. Digital Outputs (Transistor/ SSR) ===
==== 6.1 Wiring ====
[[File:RELAY.svg|center|frameless|500x500px]]
 
=== 7. Digital Outputs (Transistor/ SSR) ===
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!style="width: 50%;"|'''Parameter'''
!style="width: 50%;"|'''Parameter'''
Line 210: Line 220:
|}
|}


=== 9. Analog Inputs ===
==== 7.1 Wiring ====
[[File:DIG OUT.svg|center|frameless|500x500px]]
 
=== 8. Analog Inputs ===
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!style="width: 50%;"|'''Parameter'''
!style="width: 50%;"|'''Parameter'''
Line 255: Line 268:
|}
|}


=== 10. Analog Outputs ===
==== 8.1 Wiring ====
[[File:ANL IN.svg|center|frameless|500x500px]]
 
=== 9. Analog Outputs ===
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!style="width: 50%;"|'''Parameter'''
!style="width: 50%;"|'''Parameter'''
Line 285: Line 301:
|}
|}


=== 11. Communication Interfaces ===
==== 9.1 Wiring ====
[[File:ANL OUT.svg|center|frameless|500x500px]]
 
=== 10. Communication Interfaces ===


==== 11.1 Ethernet ====
==== 10.1 Ethernet ====
{| class="wikitable tech-table"
{| class="wikitable tech-table"
! style="width: 50%;" | '''Parameter'''
! style="width: 50%;" | '''Parameter'''
Line 305: Line 324:
|}
|}


==== 11.2 RS-485 ====
==== 10.2 RS-485 ====
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!style="width: 50%;"|'''Parameter'''
!style="width: 50%;"|'''Parameter'''
Line 323: Line 342:
|}
|}


==== 11.3 USB ====
===== 10.2.1 Wiring =====
[[File:RS485.svg|center|frameless|500x500px]]
 
==== 10.3 USB ====
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!style="width: 50%;"|'''Parameter'''
!style="width: 50%;"|'''Parameter'''
Line 344: Line 366:
|}
|}


==== 11.4 HDMI ====
==== 10.4 HDMI ====
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!style="width: 50%;"|'''Parameter'''
!style="width: 50%;"|'''Parameter'''
Line 359: Line 381:
|}
|}


=== 12. RF Communications ===
=== 11. RF Communications ===
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!style="width: 50%;"|'''Technology'''  
!style="width: 50%;"|'''Technology'''  
Line 377: Line 399:
|}
|}


==== 12.1  Antenna Connectors ====
==== 11.1  Antenna Connectors ====
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!style="width: 50%;"|'''Connector'''  
!style="width: 50%;"|'''Connector'''  
Line 389: Line 411:
|}
|}


=== 13. Local Peripherals ===
=== 12. Local Peripherals ===
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!style="width: 50%;"|'''Peripheral'''
!style="width: 50%;"|'''Peripheral'''
Line 407: Line 429:
|}
|}


=== 14. HDMI ===
=== 13. HDMI ===


==== 14. 1 Display ====
==== 13. 1 Display ====
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!style="width: 50%;"|'''Parameter'''
!style="width: 50%;"|'''Parameter'''
Line 433: Line 455:
|}
|}


==== 14. 2 Joystick ====
==== 13. 2 Joystick ====
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!style="width: 50%;"|'''Parameter'''
!style="width: 50%;"|'''Parameter'''
Line 448: Line 470:
|}
|}


=== 15. Mechanical ===
=== 14. Mechanical ===
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!style="width: 50%;"|'''Parameter'''
!style="width: 50%;"|'''Parameter'''
Line 466: Line 488:
|}
|}


=== 16. Environmental ===
=== 15. Environmental ===
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!'''Parameter'''
!'''Parameter'''
Line 487: Line 509:
|}
|}


=== 17. Certifications ===
=== 16. Certifications ===
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!style="width: 50%;"|'''Certification'''
!style="width: 50%;"|'''Certification'''
Line 505: Line 527:
|}
|}


=== 18. Connectivity ===
=== 17. Connectivity ===
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!style="width: 50%;"|'''Parameter'''
!style="width: 50%;"|'''Parameter'''
Line 529: Line 551:
|}
|}


=== 19. Expansion ===
=== 18. Expansion ===
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!style="width: 50%;"|'''Feature'''  
!style="width: 50%;"|'''Feature'''  
Line 553: Line 575:
|}
|}


=== 20. Mechanical Drawings ===
=== 19. External Interfaces ===


==== Front View ====
==== Front View ====
Line 562: Line 584:
[[File:Atlas bottomview.png|center|frameless|590x590px]]
[[File:Atlas bottomview.png|center|frameless|590x590px]]


=== 20. Pinouts ===


==== Top View ====
==== Top View ====
Line 629: Line 654:
login <not needed>  
login <not needed>  


=== 25. Relay Outputs Actor ===
==== <big>24.1 Relay Outputs Actor</big> ====


==== 25.1 App Interfacing ====
===== 24.1.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credentials.
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credentials.


===== 25.1.1 Set/reset digital output pin/pins state =====
====== a) Set/reset digital output pin/pins state ======
Both relays '''default''' state is '''open'''.  
Both relays '''default''' state is '''open'''.  


Req-Topic: relayOutputs/config/in
Req-Topic: relayOutputs/config/in


<syntaxhighlight lang="json">
<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 656: Line 681:
</syntaxhighlight>Reply-Topic: relayOutputs/config/out
</syntaxhighlight>Reply-Topic: relayOutputs/config/out


<syntaxhighlight lang="json">{
<syntaxhighlight lang="json" line="1">{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
   "origin": "APP",
   "origin": "APP",
Line 673: Line 698:
}</syntaxhighlight>
}</syntaxhighlight>


===== 25.1.2 Get all relays state =====
====== b) Get all relays state ======
Req-Topic: relayOutputs/runtime/in<syntaxhighlight lang="json">
 
Req-Topic: relayOutputs/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 682: Line 708:
   }
   }
}
}
</syntaxhighlight>Reply-Topic: relayOutputs/runtime/out <syntaxhighlight lang="json">
</syntaxhighlight>Reply-Topic: relayOutputs/runtime/out <syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 701: Line 727:
</syntaxhighlight>
</syntaxhighlight>


===== 25.1.3 Set all relays state =====
====== c) Set all relays state ======
Req-Topic: relayOutputs/runtime/in<syntaxhighlight lang="json">
 
Req-Topic: relayOutputs/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 718: Line 745:
   }
   }
}
}
</syntaxhighlight>Reply-Topic: relayOutputs/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>Reply-Topic: relayOutputs/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 737: Line 764:
</syntaxhighlight>
</syntaxhighlight>


=== 26. RTC Actor ===
==== <big>24.2 RTC Actor</big> ====


==== 26.1 App Interfacing ====
===== 24.2.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.


===== 26.1.1 Set timer/alarm interruption =====
====== a) Set timer/alarm interruption ======
'''mode:''' Timer, alarm or none.
'''mode:''' Timer, alarm or none.


Line 749: Line 776:
'''timerSetSeconds:''' Period in seconds for timer interruption (No effect if mode is alarm or none).
'''timerSetSeconds:''' Period in seconds for timer interruption (No effect if mode is alarm or none).


Req-Topic: clock/config/in<syntaxhighlight lang="json">
Req-Topic: clock/config/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 763: Line 790:
   }
   }
}
}
</syntaxhighlight>Req-Topic: clock/config/out<syntaxhighlight lang="json">
</syntaxhighlight>Req-Topic: clock/config/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 780: Line 807:
</syntaxhighlight>
</syntaxhighlight>


===== 26.1.2 Toggle RTC sync logic (described below) =====
====== b) Toggle RTC sync logic (described below) ======
'''tcState:''' State of the synchronization logic of the RTC, this value is '''non-persistent''' so every-time a reboot happens the value return to default (by default the value is '''ON''')
'''tcState:''' State of the synchronization logic of the RTC, this value is '''non-persistent''' so every-time a reboot happens the value return to default (by default the value is '''ON''')


Req-Topic: clock/config/in<syntaxhighlight lang="json">
Req-Topic: clock/config/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 791: Line 818:
   }
   }
}
}
</syntaxhighlight>Req-Topic: clock/config/out<syntaxhighlight lang="json">
</syntaxhighlight>Req-Topic: clock/config/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 805: Line 832:
</syntaxhighlight>
</syntaxhighlight>


===== 26.1.3 Read clock configs =====
====== c) Read clock configs ======
'''mode:''' Timer, alarm or none.
'''mode:''' Timer, alarm or none.


Line 814: Line 841:
'''rtcState:''' Current state of the synchronization logic of the RTC.
'''rtcState:''' Current state of the synchronization logic of the RTC.


Req-Topic: clock/config/in<syntaxhighlight lang="json">
Req-Topic: clock/config/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 823: Line 850:
}
}


</syntaxhighlight>Reply-Topic: clock/config/out<syntaxhighlight lang="json">
</syntaxhighlight>Reply-Topic: clock/config/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 842: Line 869:
</syntaxhighlight>
</syntaxhighlight>


===== 26.1.4 Read clock =====
====== d) Read clock ======
Req-Topic: clock/runtime/in <syntaxhighlight lang="json">
 
Req-Topic: clock/runtime/in <syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 857: Line 885:
</syntaxhighlight>
</syntaxhighlight>


==== 26.2 Synchronization loop flowchart (every 30 seconds) ====
===== 24.2.2 Synchronization loop flowchart (every 30 seconds) =====




'''RTC Actor - Overview'''
'''RTC Actor - Overview'''
[[File:RTCActor Overview.svg|center|frameless|774x774px]]
[[File:RTCActor Overview.svg|center|frameless|903x903px]]


=== 27. Core System Health Actor ===
==== <big>24.3 Core System Health Actor</big> ====


==== 27.1 App Interfacing ====
===== 24.3.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker.
User App interface and functionalities exposed to the open part of the MQTT broker.


This interface allows any external App to receive system-level metrics such as CPU load, RAM usage, disk usage, temperature, core frequency, system throttle status and uptime. No credentials are required to subscribe to this topic. The System Health Actor does not receive commands. It is fully autonomous and publishes its metrics every 1 second.
This interface allows any external App to '''receive system-level metrics''' such as CPU load, RAM usage, disk usage, temperature, core frequency, system throttle status and uptime.
 
No credentials are required to subscribe to this topic.
 
The System Health Actor '''does not receive commands'''. It is fully autonomous and publishes its metrics every '''1 second'''.


==== 27.2 Runtime Data ====
===== 24.3.2 Runtime Data =====
'''Topic: systemHea l th/runtime/ out'''
'''Topic: systemHealth/runtime/out'''


Publish rate: '''1 Hz''' (one message per second, clock-jump safe)
Publish rate: '''1 Hz''' (one message per second, clock-jump safe)


===== 27.2.1 Metrics Provided =====
====== a) Metrics Provided ======
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!'''Key'''
!'''Key'''
Line 921: Line 953:
|seconds
|seconds
|}
|}
Example Payload (systemHealth/runtime/out) <syntaxhighlight lang="json">
Example Payload (systemHealth/runtime/out) <syntaxhighlight lang="json" line="1">
{
{
   "id": 1736022028123,
   "id": <TIMESTAMP>,
   "origin": "system-health",
   "origin": "system-health",
   "task": {
   "task": {
Line 943: Line 975:
</syntaxhighlight>
</syntaxhighlight>


==== 27.3 Peripherals health ====
===== 24.3.3 Peripherals health =====
  In order get the peripherals health we had to implement a SystemHealth actor in each bus manager (busi2c­O, busi2c-1, etc. ... ).
  In order get the peripherals health we had to implement a SystemHealth actor in each bus manager (busi2c­O, busi2c-1, etc. ... ).


Line 949: Line 981:
[[File:Peripherals health.svg|center|frameless|792x792px]]
[[File:Peripherals health.svg|center|frameless|792x792px]]


===== 27.3.1 Example =====
====== a) Example ======
'''For busi2c-0:'''
'''For busi2c-0:'''


Reply topic: '''systemHealth/busi2c-0/runtime/out'''  
Reply topic: '''systemHealth/busi2c-0/runtime/out'''  


Payload:<syntaxhighlight lang="json">
Payload:<syntaxhighlight lang="json" line="1">
{
{
   "id": 1770378753024,
   "id": <TIMESTAMP>,
   "origin": "system-health-busi2c-0",
   "origin": "system-health-busi2c-0",
   "task": {
   "task": {
Line 1,034: Line 1,066:
Reply topic: '''systemHealth/busi2c-1/runtime/out'''  
Reply topic: '''systemHealth/busi2c-1/runtime/out'''  


Payload:<syntaxhighlight lang="json">
Payload:<syntaxhighlight lang="json" line="1">
{
{
   "id": 1770382405107,
   "id": <TIMESTAMP>,
   "origin": "system-health-busi2c-1",
   "origin": "system-health-busi2c-1",
   "task": {
   "task": {
Line 1,156: Line 1,188:
</syntaxhighlight>
</syntaxhighlight>


=== 28. TempSensor Actor ===
===== 24.3.4 Commands =====


==== 28.1 App Interfacing ====
====== a) List usb devices ======
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.
The list_usb_devices action returns a parsed list of USB devices detected on the system using the lsusb command.  


===== 28.1.1 Set temperature sensor configurations =====
'''Req-topic''': systemHealth/runtime/in<syntaxhighlight lang="json" line="1">
Req-Topic: tempSensor/config/in
{
 
"id": <TIMESTAMP>,
ALERT:
"origin": "Dev",
 
"task": {
* activate: true(active)/false
  "action": "LIST_USB_DEVICES"
* templow: alert temperature lower limit
}
* tempHigh: alert temperature upper limit
}
<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-topic''': systemHealth/runtime/usb/devices/out<syntaxhighlight lang="json" line="1">
{
{
  "id": "<TIMESTAMP>",
"id": <TIMESTAMP>,
   "origin": "APP",
"origin": "system-health",
   "task": {
"task": {
    "taskParams": {
   "action": "list_usb_devices",
      "ALERT": {
   "taskResult": {
        "activate": true,
    "usb_devices": {
        "tempLow": 0,
      "success": true,
        "tempHigh": 80
      "command": "lsusb",
       }
      "returncode": 0,
     }
      "devices": [
   }
        {
          "bus": "001",
          "device": "001",
          "vendor_id": "1d6b",
          "product_id": "0002",
          "description": "Linux Foundation 2.0 root hub",
          "parsed": true
        },
        {
          "bus": "001",
          "device": "002",
          "vendor_id": "0424",
          "product_id": "9514",
          "description": "Microchip Technology, Inc. (formerly SMSC) SMC9514 Hub",
          "parsed": true
        },
        {
          "bus": "001",
          "device": "003",
          "vendor_id": "0424",
          "product_id": "ec00",
          "description": "Microchip Technology, Inc. (formerly SMSC) SMSC9512/9514 Fast Ethernet Adapter",
          "parsed": true
        },
        {
          "bus": "001",
          "device": "004",
          "vendor_id": "1e0e",
          "product_id": "9001",
          "description": "Qualcomm / Option SimTech, Incorporated",
          "parsed": true
        }
      ],
      "stderr": ""
       }
     }
   }
}
}
</syntaxhighlight>Reply-Topic: tempSensor/config/out<syntaxhighlight lang="json">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true,
      "ALERT": {
        "activate": true,
        "tempLow": 0,
        "tempHigh": 80
      }
    }
  }
}
</syntaxhighlight>
</syntaxhighlight>
{| class="wikitable tech-table"
!'''JSON Path'''
!'''Type'''
!Example
!'''Description'''
|-
|id
|string /number
|"get-hw-info-001"
|Request identifier echoed back in the response.
|-
|origin
|string
|"system-health"
|Actor/device that generated the response.
|-
|task
|object
|{...}
|Container for the action response.
|-
|task.action
|string
|"list_usb_devices"
|Action executed by the actor.
|-
|task.taskResult
|object
|{...}
|Main result object for the action.
|-
|task.taskResult.usb_devices
|object
|{...}
|Contains the USB device scan result.
|-
|task.taskResult.usb_devices.success
|boolean
|true
|Indicates whether the lsusb
commandexecuted successfully.
|-
|task.taskResult.usb_devices.command
|string
|"lsusb"
|Command used to collect USB information.
|-
|task.taskResult.usb_devices.returncode
|number /null
|0
|Process return code. 0 means success. null
means the command was not executed ortimed out.
|-
|task.taskResult.usb_devices.devices
|array
|[...]
|List of USB devices detected by lsusb.
|-
|task.taskResult.usb_devices.devices[ ].bus
|string
|"001"
|USB bus number where the device wasdetected.
|-
|task.taskResult.usb_devices.devices[ ].device
|string
|"004"
|USB device number assigned on that bus.
|-
|task.taskResult.usb_devices.devices[ ].vendor_id
|string
|"1e0e"
|USB vendor ID in hexadecimal format.
|-
|task.taskResult.usb_devices.devices[ ].product_id
|string
|"9001"
|USB product ID in hexadecimal format.
|-
|task.taskResult.usb_devices.devices[ ].description
|string
|"Qualcomm / Option SimTech,Incorporated"
|Human-readable device description returnedby lsusb.
|-
|task.taskResult.usb_devices.devices[ ].parsed
|boolean
|true
|Indicates whether the lsusb line was parsed successfully.
|-
|task.taskResult.usb_devices.devices[ ].raw
|string
|Optional
|Present only when a device line could not beparsed.
Contains the original raw lsusb line.
|-
|task.taskResult.usb_devices.stderr
|string
|" "
|Error output from the command. Empty stringmeans no error.
|}


===== 28.1.2 Read temperature sensor configurations =====
====== b) List connectivity specs ======
Req-Topic: tempSensor/config/in
The list_connectivity_specs action allows the '''SystemHealth''' Actor to return connectivity information for the device, including the status of:
 
ALERT:
 
* activate: true(active)/false


LIMITS:
* Wi-Fi
* LTE modem
* eth0
* eth1
* Tunnel interfaces, for possible commissioning use


* templow: alert temperature lower limit
'''Req-topic''': systemHealth/runtime/in<syntaxhighlight lang="json" line="1">
* tempHigh: alert temperature upper limit
<syntaxhighlight lang="json">
{
{
  "id": "<TIMESTAMP>",
"id": "connectivity-001",
  "origin": "APP",
"origin": "APP",
  "task": {
"task": {
    "action": "READ"
  "action": "list_connectivity_specs"
  }
}
}
}
 
</syntaxhighlight>'''Reply-topic''': systemHealth/runtime/connectivity/out<syntaxhighlight lang="json" line="1">
</syntaxhighlight>Reply-Topic: tempSensor/config/out<syntaxhighlight lang="json">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
   "origin": "APP",
   "origin": "system-health",
   "task": {
   "task": {
    "action": "list_connectivity_specs",
     "taskResult": {
     "taskResult": {
       "success": true,
       "connectivity": {
      "ALERT": {
        "sources": {
         "activate": true,
          "sysfs": "/sys/class/net",
        "tempLow": 0,
          "ip_link": {
        "tempHigh": 80
            "available": true,
            "command": "ip -j -d link show",
            "error": null
          },
          "network_manager": {
            "available": true,
            "command": "nmcli -t -f DEVICE,TYPE,STATE,CONNECTION device status",
            "error": null
          }
        },
         "interfaces": {
          "wifi": {
            "available": true,
            "interfaces": [
              {
                "interface": "wlan0",
                "available": true,
                "status": "down",
                "operstate": "down",
                "admin_up": true,
                "carrier": false,
                "mtu": 1500,
                "type": 1,
                "link_kind": null,
                "mac_address": "2c:cf:67:fd:60:40",
                "ipv4": [],
                "ipv6": [],
                "network_manager": {
                  "device": "wlan0",
                  "type": "wifi",
                  "state": "disconnected",
                  "connection": null
                },
                "wifi": {
                  "available": true,
                  "command": "iw dev wlan0 link",
                  "connected": false
                }
              }
            ]
          },
          "lte_modem": {
            "available": true,
            "tool_available": true,
            "command": "mmcli -L",
            "modems": [
              {
                "id": "0",
                "success": true,
                "command": "mmcli -m 0 --output-json",
                "manufacturer": "QUALCOMM INCORPORATED",
                "model": "SIMCOM_SIM7600G-H",
                "revision": "LE20B04SIM7600G22",
                "hardware_revision": "10000",
                "device": "/sys/devices/platform/scb/fe9c0000.xhci/usb1/1-1/1-1.4",
                "drivers": [
                  "qmi_wwan",
                  "option"
                ],
                "plugin": "simtech",
                "primary_port": "cdc-wdm0",
                "ports": [
                  {
                    "name": "cdc-wdm0",
                    "type": "qmi"
                  },
                  {
                    "name": "ttyUSB0",
                    "type": "ignored"
                  },
                  {
                    "name": "ttyUSB1",
                    "type": "gps"
                  },
                  {
                    "name": "ttyUSB2",
                    "type": "at"
                  },
                  {
                    "name": "ttyUSB3",
                    "type": "at"
                  },
                  {
                    "name": "ttyUSB4",
                    "type": "audio"
                  },
                  {
                    "name": "wwan0",
                    "type": "net"
                  }
                ],
                "state": "failed",
                "power_state": "on",
                "access_technologies": [],
                "signal_quality": {
                  "recent": "yes",
                  "value": "0"
                },
                "current_capabilities": [
                  "gsm-umts, lte"
                ],
                "supported_capabilities": [
                  "gsm-umts, lte"
                ],
                "operator_code": "--",
                "operator_name": "--",
                "registration_state": "--",
                "packet_service_state": "--",
                "sim_path": null
              }
            ],
            "network_interfaces": [
              {
                "interface": "wwan0",
                "available": true,
                "status": "down",
                "operstate": "down",
                "admin_up": false,
                "carrier": null,
                "mtu": 1500,
                "type": 65534,
                "link_kind": null,
                "mac_address": null,
                "ipv4": [],
                "ipv6": [],
                "network_manager": null
              }
            ]
          },
          "eth0": {
            "interface": "eth0",
            "available": true,
            "status": "connected",
            "operstate": "up",
            "admin_up": true,
            "carrier": true,
            "mtu": 1500,
            "type": 1,
            "link_kind": null,
            "mac_address": "2c:cf:67:fd:60:3f",
            "ipv4": [
              {
                "address": "172.16.20.57",
                "prefixlen": 24,
                "scope": "global",
                "dynamic": true
              }
            ],
            "ipv6": [
              {
                "address": "fe80::7fc1:f65f:5729:d234",
                "prefixlen": 64,
                "scope": "link",
                "dynamic": false
              }
            ],
            "network_manager": {
              "device": "eth0",
              "type": "ethernet",
              "state": "connected",
              "connection": "wired-ip-dynamic"
            }
          },
          "eth1": {
            "interface": "eth1",
            "available": true,
            "status": "unavailable",
            "operstate": "down",
            "admin_up": true,
            "carrier": false,
            "mtu": 1500,
            "type": 1,
            "link_kind": null,
            "mac_address": "2c:cf:67:fd:60:41",
            "ipv4": [],
            "ipv6": [],
            "network_manager": {
              "device": "eth1",
              "type": "ethernet",
              "state": "unavailable",
              "connection": null
            }
          },
          "tunnel": {
            "available": false,
            "interfaces": []
          }
        }
       }
       }
     }
     }
   }
   }
}
}
</syntaxhighlight>
</syntaxhighlight>
 
{| class="wikitable tech-table"
===== 28.1.3 Read temperature and alert status =====
!'''Field'''
 
!'''Type'''
* unit: Temperature unit of measure
!'''Description'''
* alert: true (triggered) or false
|-
 
|id
Req-Topic: tempSensor/runtime/in<syntaxhighlight lang="json">
|string/number
{
|Request/response identifier used to correlate therequest with the response.
  "id": "<TIMESTAMP>",
|-
  "origin": "APP",
|origin
  "task": {
|string
    "action": "READ"
|Origin of the message. In the response, this is normallythe SystemHealth actor name.
  }
|-
}
|task.action
 
|string
</syntaxhighlight>Reply-Topic: tempSensor/runtime/out<syntaxhighlight lang="json">
|Executed action. For this feature, the value is list_connectivity_specs.
{
|-
  "id": "<TIMESTAMP>",
|task.taskResult.connectivity.sources.sysfs
  "origin": "APP",
|string
  "task": {
|Linux sysfs path used to discover network interfaces, usually/sys/class/net.
    "taskResult": {
|-
      "success": true,
|task.taskResult.connectivity.sources.ip_link.available
      "data": {
|boolean
        "temperature": <_FLOAT_>,
|Indicates whether the ip command was available andexecuted successfully.
        "unit": "C",
|-
        "alert": true
|task.taskResult.connectivity.sources.ip_link.command
      }
|string
    }
|Command used to retrieve detailed link information,for example ip -j -d link show.
  }
|-
}
|task.taskResult.connectivity.sources.ip_link.error
 
|string/null
</syntaxhighlight>
|Error returned by the ip command, or null if no erroroccurred.
 
|-
=== 29. TFT Actor ===
|task.taskResult.connectivity.sources.network_manager.available
 
|boolean
==== 29.1 App Interfacing ====
|Indicates whether NetworkManager / nmcli was available and executed successfully.
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to control and interact with the TFT display, or frontal panel LCD screen. Connecting to the broker for this Area requires no credentials.
|-
 
|task.taskResult.connectivity.sources.network_manager.command
==== 29.2 TFT Display Actor ====
|string
  The TFT Actor is responsible for:
|Command used to retrieve NetworkManager device status.
 
|-
* Rendering static and informative screens on the TFT display
|task.taskResult.connectivity.sources.network_manager.error
* Reacting to joystick input (LEFT/ RIGHT/ CENTER/ UP/ DOWN)
|string/null
* Managing screen navigation and user confirmation flows
|Error returned by nmcli, or null if no error occurred.
* Providing feedback to the application via MQTT
|-
 
|task.taskResult.connectivity.interfaces.wifi.available
===== 29.2.1 Screen Carousel Concept =====
|boolean
The TFT actor maintains an '''ordered list of screens''' (carousel).
|Indicates whether at least one Wi-Fi interface was found.
 
|-
* Screens are navigated using the joystick:
|task.taskResult.connectivity.interfaces.wifi.interfaces[ ]
 
|array
- LEFT --> Previous screen
|List of detected Wi-Fi interfaces, usually including '''wlan0''' when Wi-Fi exists.
 
|-
- RIGHT --> Next screen
|wifi.interfaces[ ].interface
 
|string
* The carousel wraps around:
|Linux interface name, for example '''wlan0'''.
 
|-
- LEFT on first screen --> last screen
|wifi.interfaces[ ].available
 
|boolean
- RIGHT on last screen --> first screen
|Indicates whether the Wi-Fi interface exists in the system.
 
|-
===== 29.2.2 Screen Types =====
|wifi.interfaces[ ].status
The TFT actor supports the following screen types:
|string
 
|Normalized interface status, for example '''connected, down, unavailable, no_carrier,''' or '''not_available'''.
'''a.) Image Screen'''
|-
 
|wifi.interfaces[ ].operstate
* Displays a static JPEG image
|string / null
* Default screen shown at boot
|Operational state reported by Linux, for example '''up, down,''' or '''unknown'''.
* No user interaction required
|-
 
|wifi.interfaces[ ].admin_up
'''b.) Network Information Screen'''
|boolean / null
 
|Indicates whether the interface is administratively enabled.
* Display a interface with information about the networks of the device
|-
* Updated on load
|wifi.interfaces[ ].carrier
* No user interaction required
|boolean / null
 
|Indicates whether carrier/link is detected.
===== 29.2.3 Joystick Navigation Logic =====
|-
'''Carousel Navigation:'''
|wifi.interfaces[ ].mtu
{| class="wikitable"
|number / null
|'''Joystick  Input'''
|Maximum Transmission Unit of the interface.
|'''Action'''
|-
|wifi.interfaces[ ].type
|number / null
|Linux interface type.
|-
|wifi.interfaces[ ].link_kind
|string / null
|Special link type, used mainly for virtual/tunnel interfaces. Usually null for normal Wi-Fi.
|-
|wifi.interfaces[ ].mac_address
|string / null
|MAC address of the Wi-Fi interface.
|-
|wifi.interfaces[ ].ipv4[ ]
|array
|List of IPv4 addresses configured on the Wi-Fi interface.
|-
|wifi.interfaces[ ].ipv6[ ]
|array
|List of IPv6 addresses configured on the Wi-Fi interface.
|-
|wifi.interfaces[ ].network_manager.device
|string
|NetworkManager device name.
|-
|wifi.interfaces[ ].network_manager.type
|string
|NetworkManager interface type, usually '''wifi'''.
|-
|wifi.interfaces[ ].network_manager.state
|string
|NetworkManager state, for example '''connected''', '''disconnected''', or '''unavailable'''.
|-
|wifi.interfaces[ ].network_manager.connection
|string / null
|Active NetworkManager profile name, or null if none is active.
|-
|wifi.interfaces[ ].wifi.available
|boolean
|Indicates whether Wi-Fi details could be queried using '''iw'''.
|-
|wifi.interfaces[ ].wifi.command
|string
|Command used to query Wi-Fi link state, for example '''iw dev wlan0 link'''.
|-
|wifi.interfaces[ ].wifi.connected
|boolean / null
|Indicates whether the Wi-Fi interface is associated with a Wi-Fi network.
|-
|wifi.interfaces[ ].wifi.ssid
|string
|SSID of the connected Wi-Fi network, when connected.
|-
|wifi.interfaces[ ].wifi.bssid
|string
|BSSID/MAC address of the connected access point, when connected.
|-
|wifi.interfaces[ ].wifi.frequency_mhz
|number
|Wi-Fi frequency in MHz, when connected.
|-
|wifi.interfaces[ ].wifi.signal_dbm
|number
|Wi-Fi signal strength in dBm, when available.
|-
|wifi.interfaces[ ].wifi.tx_bitrate
|string
|Wi-Fi transmit bitrate, when available.
|-
|wifi.interfaces[ ].wifi.rx_bitrate
|string
|Wi-Fi receive bitrate, when available.
|-
|task.taskResult.connectivity.interfaces.lte_modem.available
|boolean
|Indicates whether at least one LTE modem was detected.
|-
|task.taskResult.connectivity.interfaces.lte_modem.tool_available
|boolean
|Indicates whether '''mmcli''' / ModemManager is available.
|-
|task.taskResult.connectivity.interfaces.lte_modem.command
|string
|Command used to list LTE modems, usually '''mmcli -L'''.
|-
|task.taskResult.connectivity.interfaces.lte_modem.modems[ ]
|array
|List of LTE modems detected by ModemManager.
|-
|lte_modem.modems[ ].id
|string
|Modem ID in ModemManager, for example '''0'''.
|-
|lte_modem.modems[ ].success
|boolean
|Indicates whether detailed modem information wasread successfully.
|-
|lte_modem.modems[ ].command
|string
|Command used to read modem details, for example '''mmcli -m 0 --output-json'''.
|-
|lte_modem.modems[ ].manufacturer
|string / null
|Modem manufacturer.
|-
|lte_modem.modems[ ].model
|string / null
|Modem model.
|-
|lte_modem.modems[ ].revision
|string / null
|Modem firmware/software revision.
|-
|lte_modem.modems[ ].hardware_revision
|string / null
|Modem hardware revision.
|-
|lte_modem.modems[ ].device
|string / null
|Sysfs/USB path of the modem device.
|-
|lte_modem.modems[ ].drivers[ ]
|array
|Linux drivers associated with the modem, for example '''qmi_wwan''' or '''option'''.
|-
|lte_modem.modems[ ].plugin
|string / null
|ModemManager plugin used to manage the modem.
|-
|lte_modem.modems[ ].primary_port
|string / null
|Primary modem control port, for example '''cdc-wdm0'''.
|-
|lte_modem.modems[ ].ports[ ]
|array
|List of ports associated with the modem.
|-
|lte_modem.modems[ ].ports[ ].name
|string
|Port/interface name, for example '''cdc-wdm0''', '''ttyUSB2''', or '''wwan0'''.
|-
|lte_modem.modems[ ].ports[ ].type
|string / null
|Port type, for example '''qmi, at, gps, audio, net''', or '''ignored'''.
|-
|lte_modem.modems[ ].state
|string / null
|General modem state according to ModemManager,for example '''registered''', '''connected''', or '''failed'''.
|-
|lte_modem.modems[ ].power_state
|string / null
|Modem power state, for example '''on, off''', or '''low'''.
|-
|lte_modem.modems[ ].access_technologies[ ]
|array
|Current access technologies in use, for example LTE,UMTS, or GSM.
|-
|lte_modem.modems[ ].signal_quality.recent
|string / null
|Indicates whether the signal quality value is recent.
|-
|-
|LEFT
|lte_modem.modems[ ].signal_quality.value
|Previous screen
|string / number / null
|Signal quality value reported by the modem.
|-
|-
|RIGHT
|lte_modem.modems[ ].current_capabilities[ ]
|Next screen
|array
|Current modem capabilities.
|-
|-
|DOWN
|lte_modem.modems[ ].supported_capabilities[ ]
|Refresh current screen
|array
|}
|Capabilities supported by the modem.
 
|-
===== 29.2.4 Boot Behavior =====
|lte_modem.modems[ ].operator_code
At system boot:
|string / null
 
|MCC/MNC operator code.
# TFT actor initializes the display
|-
# Last available carousel is loaded
|lte_modem.modems[ ].operator_name
# First screen is rendered
|string / null
# Joystick subscriptions are activated
|Operator name.
# Actor waits for runtime commands
|-
 
|lte_modem.modems[ ].registration_state
===== 29.2.5 Design Notes & Constraints =====
|string / null
 
|Mobile network registration state.
* TFT actor does not expose joystick state
|-
* Joystick actor remains independent
|lte_modem.modems[ ].packet_service_state
* TFT actor internally consumes joystick events
|string / null
* Carousel state is local to the TFT actor
|Mobile packet data service state.
* Screen rendering is synchronous; input handling is asynchronous
|-
* Confirmation screens always require explicit CENTER press
|lte_modem.modems[ ].sim_path
 
|string / null
==== 29.3 User interaction through MQTT ====
|SIM path in ModemManager, when available.
Enabling interaction with the carousel using the topic tft/runtime/in . Actions available will be public to the user.
|-
 
|task.taskResult.connectivity.interfaces.lte_modem.network_interfaces[]
'''Runtime commands'''
|array
 
|List of Linux network interfaces associated with the LTE modem, usually '''wwan0'''.
'''Go to screen'''
|-
 
|lte_modem.network_interfaces[ ].interface
Req-Topic: tft/runtime/in<syntaxhighlight lang="json">
|string
{
|LTE network interface name, for example '''wwan0'''.
  "id": "<TIMESTAMP>",
|-
  "origin": "APP",
|lte_modem.network_interfaces[ ].available
  "task": {
|boolean
    "action": "SET_CAROUSEL",
|Indicates whether the LTE network interface exists.
    "params": {
|-
      "index": 2
|lte_modem.network_interfaces[ ].status
    }
|string
  }
|Normalized LTE network interface status.
}
|-
 
|lte_modem.network_interfaces[ ].operstate
</syntaxhighlight>Reply-Topic: tft/runtime/out<syntaxhighlight lang="json">
|string / null
{
|Operational state reported by Linux.
  "id": "<TIMESTAMP>",
|-
  "origin": "tft",
|lte_modem.network_interfaces[ ].admin_up
  "task": {
|boolean / null
    "taskResult": {
|Indicates whether the LTE network interface is administratively enabled.
      "success": true,
|-
      "index": 2
|lte_modem.network_interfaces[ ].carrier
    }
|boolean / null
  }
|Indicates whether carrier/link information is availableand active.
}
|-
 
|lte_modem.network_interfaces[ ].mtu
</syntaxhighlight>'''Set TFT Screen Carousel'''
|number / null
 
|Maximum Transmission Unit of the LTE network interface.
Req-Topic: tft/runtime/in<syntaxhighlight lang="json">
|-
|lte_modem.network_interfaces[ ].type
|number / null
|Linux interface type.
|-
|lte_modem.network_interfaces[ ].link_kind
|string / null
|Link kind, when available.
|-
|lte_modem.network_interfaces[ ].mac_address
|string / null
|MAC address, when available.
|-
|lte_modem.network_interfaces[ ].ipv4[ ]
|array
|IPv4 addresses configured on the LTE network interface.
|-
|lte_modem.network_interfaces[ ].ipv6[ ]
|array
|IPv6 addresses configured on the LTE network interface.
|-
|lte_modem.network_interfaces[ ].network_manager
|object / null
|NetworkManager information for the LTE interface, when available.
|-
|task.taskResult.connectivity.interfaces.eth0.interface
|string
|Ethernet interface name, '''eth0'''.
|-
|task.taskResult.connectivity.interfaces.eth0.available
|boolean
|Indicates whether '''eth0''' exists.
|-
|task.taskResult.connectivity.interfaces.eth0.status
|string
|Normalized '''eth0''' status.
|-
|task.taskResult.connectivity.interfaces.eth0.operstate
|string / null
|Operational state of '''eth0'''.
|-
|task.taskResult.connectivity.interfaces.eth0.admin_up
|boolean / null
|Indicates whether '''eth0''' is administratively enabled.
|-
|task.taskResult.connectivity.interfaces.eth0.carrier
|boolean / null
|Indicates whether '''eth0''' has physical link.
|-
|task.taskResult.connectivity.interfaces.eth0.mtu
|number / null
|MTU of '''eth0'''.
|-
|task.taskResult.connectivity.interfaces.eth0.type
|number / null
|Linux interface type of '''eth0'''.
|-
|task.taskResult.connectivity.interfaces.eth0.link_kind
|string / null
|Link kind of '''eth0''', usually '''null'''.
|-
|task.taskResult.connectivity.interfaces.eth0.mac_address
|string / null
|MAC address of '''eth0'''.
|-
|task.taskResult.connectivity.interfaces.eth0.ipv4[ ]
|array
|IPv4 addresses configured on '''eth0'''.
|-
|task.taskResult.connectivity.interfaces.eth0.ipv6[ ]
|array
|IPv6 addresses configured on '''eth0'''.
|-
|task.taskResult.connectivity.interfaces.eth0.network_manager
|object / null
|NetworkManager information for '''eth0'''.
|-
|task.taskResult.connectivity.interfaces.eth1.interface
|string
|Ethernet interface name, '''eth1'''.
|-
|task.taskResult.connectivity.interfaces.eth1.available
|boolean
|Indicates whether '''eth1''' exists.
|-
|task.taskResult.connectivity.interfaces.eth1.status
|string
|Normalized '''eth1''' status.
|-
|task.taskResult.connectivity.interfaces.eth1.operstate
|string / null
|Operational state of '''eth1'''.
|-
|task.taskResult.connectivity.interfaces.eth1.admin_up
|boolean / null
|Indicates whether '''eth1''' is administratively enabled.
|-
|task.taskResult.connectivity.interfaces.eth1.carrier
|boolean / null
|Indicates whether '''eth1''' has physical link.
|-
|task.taskResult.connectivity.interfaces.eth1.mtu
|number / null
|MTU of '''eth1'''.
|-
|task.taskResult.connectivity.interfaces.eth1.type
|number / null
|Linux interface type of '''eth1'''.
|-
|task.taskResult.connectivity.interfaces.eth1.link_kind
|string / null
|Link kind of '''eth1''', usually '''null'''.
|-
|task.taskResult.connectivity.interfaces.eth1.mac_address
|string / null
|MAC address of '''eth1'''.
|-
|task.taskResult.connectivity.interfaces.eth1.ipv4[ ]
|array
|IPv4 addresses configured on '''eth1'''.
|-
|task.taskResult.connectivity.interfaces.eth1.ipv6[ ]
|array
|IPv6 addresses configured on '''eth1'''.
|-
|task.taskResult.connectivity.interfaces.eth1.network_manager
|object / null
|NetworkManager information for '''eth1'''.
|-
|task.taskResult.connectivity.interfaces.tunnel.available
|boolean
|Indicates whether at least one tunnel interface was detected.
|-
|task.taskResult.connectivity.interfaces.tunnel.interfaces[ ]
|array
|List of detected tunnel interfaces, for example '''tun0, tap0, wg0''', or '''tailscale0'''.
|-
|tunnel.interfaces[ ].interface
|string
|Tunnel interface name.
|-
|tunnel.interfaces[ ].available
|boolean
|Indicates whether the tunnel interface exists.
|-
|tunnel.interfaces[ ].status
|string
|Normalized tunnel interface status.
|-
|tunnel.interfaces[ ].operstate
|string / null
|Operational state reported by Linux.
|-
|tunnel.interfaces[ ].admin_up
|boolean / null
|Indicates whether the tunnel interface isadministratively enabled.
|-
|tunnel.interfaces[ ].carrier
|boolean / null
|Carrier/link information, when available.
|-
|tunnel.interfaces[ ].mtu
|number / null
|Tunnel interface MTU.
|-
|tunnel.interfaces[ ].type
|number / null
|Linux interface type.
|-
|tunnel.interfaces[ ].link_kind
|string / null
|Tunnel link kind, for example '''tun, tap''', or '''wireguard'''.
|-
|tunnel.interfaces[ ].mac_address
|string / null
|MAC address, when available.
|-
|tunnel.interfaces[ ].ipv4[ ]
|array
|IPv4 addresses configured on the tunnel interface.
|-
|tunnel.interfaces[ ].ipv6[ ]
|array
|IPv6 addresses configured on the tunnel interface.
|-
|tunnel.interfaces[ ].network_manager
|object / null
|NetworkManager information for the tunnel interface, when available.
|-
|ipv4[ ].address
|string
|IPv4 address assigned to the interface.
|-
|ipv4[ ].prefixlen
|number
|IPv4 network prefix length. Example: '''24'''.
|-
|ipv4[ ].scope
|string
|IPv4 scope, for example '''global'''.
|-
|ipv4[ ].dynamic
|boolean
|Indicates whether the IPv4 address was dynamically assigned.
|-
|ipv6[ ].address
|string
|IPv6 address assigned to the interface.
|-
|ipv6[ ].prefixlen
|number
|IPv6 network prefix length.
|-
|ipv6[ ].scope
|string
|IPv6 scope, for example '''link''' or '''global'''.
|-
|ipv6[].dynamic
|boolean
|Indicates whether the IPv6 address was dynamically assigned.
|}
 
====== c) Get hardware info ======
'''Req-topic''': systemHealth/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "TIMESTAMP",
   "id": "<TIMESTAMP>",
   "origin": "APP",
   "origin": "Dev",
   "task": {
   "task": {
     "action": "SET_CAROUSEL",
     "action": "GET_HW_INFO"
     "params": {
  }
       "startIndex": 0,
}
       "screens": [
</syntaxhighlight>'''Reply-topic''': systemHealth/runtime/hw/info/out<syntaxhighlight lang="json" line="1">
        {
{
          "type": "image",
  "id": "<TIMESTAMP>",
          "image": "default.jpg"
  "origin": "system-health",
        },
  "task": {
         {
    "action": "get_hw_info",
           "type": "image",
    "taskResult": {
           "image": "status.jpg"
      "cpu": {......},
         },
      "ram": {......},
      "emmc": {......},
      "block_devices": {......},
      "filesystems": {......},
      "mmc_sysfs": {......},
      "emmc_extcsd": {......}
    }
  }
}
</syntaxhighlight>
{| class="wikitable tech-table"
|-
|'''Section'''
|'''Description'''
|-
|'''cpu'''
|CPU and board model information.
|-
|'''ram'''
|RAM total, used, and free memory.
|-
|'''emmc'''
|Filtered eMMC device and partition information.
|-
|'''block_devices'''
|Complete block device list from '''lsblk''', including eMMC, boot partitions, loop devices, zram, NVMe, USB storage, etc.
|-
|'''filesystems'''
|Mounted filesystem usage from '''df -h'''.
|-
|'''mmc_sysfs'''
|Low-level MMC/eMMC identity fields read from '''/sys/block/mmcblk*/device'''.
|-
|'''emmc_extcsd'''
|Parsed eMMC EXT_CSD information from '''mmc extcsd read''', including health, revision, RPMB, boot, and partitioning data.
|}
 
* '''CPU'''
 
The '''cpu''' object describes the detected board and CPU.<syntaxhighlight lang="json" line="1">
{
  "board_model": "Raspberry Pi Compute Module 4 Rev 1.1",
  "cpu": {
    "architecture": "aarch64",
    "op_modes": "32-bit, 64-bit",
    "byte_order": "Little Endian",
    "vendor": "ARM",
    "model_name": "Cortex-A72",
    "model": "3",
    "stepping": "r0p3",
    "cpu_count": 4,
    "online_cpus": "0-3",
    "threads_per_core": 1,
     "cores_per_cluster": 4,
    "clusters": 1,
    "frequency": {
       "scaling_percent": 60.0,
      "min_mhz": 600.0,
      "max_mhz": 1500.0,
       "bogomips": 108.0
    }
  }
}
</syntaxhighlight>
{| class="wikitable tech-table"
!'''Field'''
!'''Type'''
!'''Description'''
|-
|board_model
|string / null
|Hardware board model read from device-tree.
|-
|cpu.architecture
|string
|CPU architecture, for example '''aarch64'''.
|-
|cpu.op_modes
|string
|Supported CPU operation modes.
|-
|cpu.byte_order
|string
|CPU byte order.
|-
|cpu.vendor
|string
|CPU vendor.
|-
|cpu.model_name
|string
|CPU model name.
|-
|cpu.model
|string / number
|CPU model identifier.
|-
|cpu.stepping
|string
|CPU stepping/revision.
|-
|cpu.cpu_count
|number
|Number of detected CPU cores.
|-
|cpu.online_cpus
|string
|Online CPU list.
|-
|cpu.threads_per_core
|number
|Number of threads per core.
|-
|cpu.cores_per_cluster
|number
|Number of cores per cluster.
|-
|cpu.clusters
|number
|Number of CPU clusters.
|-
|cpu.frequency.scaling_percent
|number / null
|Current CPU frequency scaling percentage.
|-
|cpu.frequency.min_mhz
|number / null
|Minimum CPU frequency in MHz.
|-
|cpu.frequency.max_mhz
|number / null
|Maximum CPU frequency in MHz.
|-
|cpu.frequency.bogomips
|number / null
|BogoMIPS value reported by the system.
|}
 
* '''RAM'''
 
The '''ram''' object reports system memory usage.
{| class="wikitable tech-table"
!'''Field'''
!'''Type'''
!'''Description'''
|-
|'''total'''
|string
|Total system RAM.
|-
|'''used'''
|string
|Currently used RAM.
|-
|'''free'''
|string
|Currently free RAM.
|}
 
* '''EMMC'''
 
The '''emmc''' object is a '''filtered eMMC''' '''view'''. It focuses on the main eMMC disk and its partitions.<syntaxhighlight lang="json" line="1">
{
  "devices": [
    {
      "name": "mmcblk0",
      "model": null,
      "serial": "0x121b491e",
      "size": "29.1G",
      "type": "disk",
      "transport": "mmc",
      "filesystem": null,
      "mountpoints": [],
      "partitions": [
         {
          "name": "mmcblk0p1",
          "size": "512M",
           "type": "part",
          "filesystem": "vfat",
           "mountpoints": [
            "/boot/firmware"
          ]
         },
         {
         {
           "type": "confirm",
          "name": "mmcblk0p2",
          "size": "28.6G",
          "type": "part",
          "filesystem": "ext4",
          "mountpoints": [
            "/"
          ]
        }
      ]
    }
  ]
}
</syntaxhighlight>'''Device fields'''
{| class="wikitable tech-table"
!'''Field'''
!'''Type'''
!'''Description'''
|-
|devices[ ]
|array
|List of detected main eMMC devices.
|-
|devices[ ].serial
|string / null
|eMMC block device name, for example '''mmcblk0'''.
|-
|devices[ ].size
|string
|Device model, when available.
|-
|devices[ ].type
|string
|Device serial number.
|-
|devices[ ].transport
|string / null
|Device size.
|-
|devices[ ].filesystem
|string / null
|Device type, usually '''disk'''.
|-
|devices[ ].mountpoints
|array
|Transport type, usually '''mmc'''.
|-
|devices[ ].partitions
|array
|Filesystem directly on the disk. Usually null when partitions exist.
|-
|devices[ ].name
|string
|Mountpoints directly associated with the disk.
|-
|devices[ ].model
|string / null
|Partitions belonging to this eMMC disk.
|}
'''Partition fields'''
{| class="wikitable tech-table"
!'''Field'''
!'''Type'''
!'''Description'''
|-
|name
|string
|Partition name, for example '''mmcblk0p1'''.
|-
|size
|string
|Partition size.
|-
|type
|string
|Partition type, usually '''part'''.
|-
|filesystem
|string / null
|Filesystem type, for example '''vfat''' or '''ext4'''.
|-
|mountpoints
|array
|Mountpoints for the partition.
|}
 
====== d) block_devices ======
The '''block_devices''' object is the complete storage/device tree returned by '''lsblk'''.<syntaxhighlight lang="json" line="1">
{
  "devices": [
    {
      "name": "mmcblk0",
      "model": null,
      "serial": "0x121b491e",
      "size": "29.1G",
      "type": "disk",
      "transport": "mmc",
      "filesystem": null,
      "mountpoints": [],
      "children": [
        {
          "name": "mmcblk0p1",
          "model": null,
          "serial": null,
          "size": "512M",
          "type": "part",
          "transport": "mmc",
          "filesystem": "vfat",
          "mountpoints": [
            "/boot/firmware"
          ],
          "children": []
        }
      ]
    }
  ],
  "stderr": ""
}
</syntaxhighlight>
{| class="wikitable tech-table"
!'''Field'''
!'''Type'''
!'''Description'''
|-
|devices
|array
|List of block devices.
|-
|stderr
|string
|Command error output, if any.
|-
|devices[index].name
|string
|Device name.
|-
|devices[index].model
|string / null
|Device model.
|-
|devices[index].serial
|string / null
|Device serial number.
|-
|devices[index].size
|string
|Device size.
|-
|devices[index].type
|string
|Device type, for example '''disk''' , '''part''' , or '''loop'''.
|-
|devices[index].transport
|string / null
|Transport type, for example '''mmc''' , '''nvme''' , or '''usb'''.
|-
|devices[index].filesystem
|string / null
|Filesystem type, for example '''ext4''' , '''vfat''' , or '''swap'''.
|-
|devices[index].mountpoints
|array
|List of mountpoints. Empty if not mounted.
|-
|devices[index].children
|array
|Child block devices, usually partitions.
|}
 
====== e) file_systems ======
The '''file_systems''' object reports mounted filesystem usage, equivalent to '''df -h'''.<syntaxhighlight lang="json" line="1">
{
  "filesystems": [
    {
      "source": "/dev/mmcblk0p2",
      "filesystem": "ext4",
      "size": "29G",
      "used": "5.8G",
      "available": "23G",
      "use_percent": "21%",
      "mountpoint": "/",
      "parsed": true
    },
    {
      "source": "/dev/nvme0n1p1",
      "filesystem": "ext4",
      "size": "234G",
      "used": "2.1M",
      "available": "222G",
      "use_percent": "1%",
      "mountpoint": "/mnt/nvme",
      "parsed": true
    }
  ],
  "stderr": ""
}
</syntaxhighlight>
{| class="wikitable tech-table"
!'''Field'''
!'''Type'''
!'''Description'''
|-
|filesystems
|array
|List of mounted filesystems.
|-
|stderr
|string
|Command error output, if any.
|-
|filesystems[index].source
|string
|Filesystem source, for example '''/dev/mmcblk0p2''' , '''tmpfs''' , or '''udev'''.
|-
|filesystems[index].filesystem
|string
|Filesystem type, for example '''ext4''' , '''vfat''' , '''tmpfs''' , or '''devtmpfs'''.
|-
|filesystems[index].size
|string
|Total filesystem size.
|-
|filesystems[index].used
|string
|Used space.
|-
|filesystems[index].available
|string
|Available space.
|-
|filesystems[index].use_percent
|string
|Used percentage.
|-
|filesystems[index].mountpoint
|string
|Mount location.
|-
|filesystems[index].parsed
|boolean
|'''true''' if the parser successfully parsed this filesystem entry.
|}
 
====== f) mmc_sysfs ======
The '''mmc_sysfs''' object exposes low-level MMC/eMMC identity fields read from:
 
'''/sys/block/mmcblk*/device/'''
 
This is useful for production traceability, device identification and diagnostics.<syntaxhighlight lang="json" line="1">
{
  "source": "/sys/block",
  "fields": [
    "name",
    "cid",
    "csd",
    "date",
    "manfid",
    "oemid",
    "serial"
  ],
  "devices": [
    {
      "device": "mmcblk0",
      "base_path": "/sys/block/mmcblk0/device",
      "available": true,
      "fields": {
        "name": "BJTD4R",
        "cid": "150100424a5444345203121b491e7b00",
        "csd": "d02701320f5903fff6dbffef8e404000",
        "date": "07/2024",
        "manfid": "0x000015",
        "oemid": "0x0100",
        "serial": "0x121b491e"
      }
    }
  ]
}
</syntaxhighlight>
{| class="wikitable tech-table"
!'''Field'''
!'''Type'''
!'''Description'''
|-
|source
|string
|Base sysfs source path.
|-
|fields
|array
|List of sysfs fields collected.
|-
|devices
|array
|List of detected MMC/eMMC devices.
|-
|devices[index].device
|string
|MMC block device name, for example '''mmcblk0'''.
|-
|devices[index].base_path
|string
|Sysfs path used for this device.
|-
|devices[index].available
|boolean
|Indicates whether the sysfs path exists.
|-
|devices[index].fields.name
|string / null
|eMMC product name.
|-
|devices[index].fields.cid
|string / null
|Card Identification register.
|-
|devices[index].fields.csd
|string / null
|Card Specific Data register.
|-
|devices[index].fields.date
|string / null
|Manufacturing date.
|-
|devices[index].fields.manfid
|string / null
|Manufacturer ID.
|-
|devices[index].fields.oemid
|string / null
|OEM/application ID.
|-
|devices[index].fields.serial
|string / null
|eMMC serial number.
|}
 
====== e) emmc_extcsd ======
The '''emmc_extcsd''' object contains parsed information from:
 
'''mmc extcsd read /dev/mmcblk0'''
{| class="wikitable tech-table"
!'''Category'''
!'''Description'''
|-
|revision
|EXT_CSD and MMC version.
|-
|health
|eMMC lifetime and pre-EOL state.
|-
|boot
|Boot partition/protection configuration.
|-
|rpmb
|Replay Protected Memory Block information.
|-
|sector
|Sector count and capacity information, when available.
|-
|partitioning
|Partitioning and enhanced-area information.
|}
'''emmc_extcsd.devices[''' '''].revision'''<syntaxhighlight lang="json" line="1">
{
  "ext_csd_revision": "1.8",
  "mmc_version": "MMC 5.1"
}
</syntaxhighlight>
{| class="wikitable tech-table"
!'''Field'''
!Type
!'''Description'''
|-
|ext_csd_revision
|string
|EXT_CSD revision.
|-
|mmc_version
|string
|MMC/eMMC standard version.
|}
'''emmc_extcsd.devices[ ].health'''<syntaxhighlight lang="json" line="1">
{
  "life_time_estimation_a": {
    "field": {
      "register": "DEVICE_LIFE_TIME_EST_TYP_A",
      "index": null,
      "description": "eMMC Life Time Estimation A",
      "value": "0x01",
      "value_int": 1,
      "value_hex": "0x1"
    },
    "decoded": {
      "state": "normal",
      "used_percent_min": 0,
      "used_percent_max": 10
    }
  },
  "life_time_estimation_b": {
    "field": {
      "register": "DEVICE_LIFE_TIME_EST_TYP_B",
      "index": null,
      "description": "eMMC Life Time Estimation B",
      "value": "0x01",
      "value_int": 1,
      "value_hex": "0x1"
    },
    "decoded": {
      "state": "normal",
      "used_percent_min": 0,
      "used_percent_max": 10
    }
  },
  "pre_eol": {
    "field": {
      "register": "PRE_EOL_INFO",
      "index": null,
      "description": "eMMC Pre EOL information",
      "value": "0x01",
      "value_int": 1,
      "value_hex": "0x1"
    },
    "decoded": {
      "state": "normal"
    }
  }
}
</syntaxhighlight>
{| class="wikitable tech-table"
!'''Field'''
!'''Description'''
|-
|life_time_estimation_a
|Wear estimation for eMMC memory type A.
|-
|life_time_estimation_b
|Wear estimation for eMMC memory type B.
|-
|pre_eol
|Pre-end-of-life state.
|}
Lifetime Decoding
{| class="wikitable tech-table"
!'''Raw Value'''
!'''Decoded State'''
!Meaning
|-
|0x00
|not_defined
|Not defined by device.
|-
|0x01
|normal
|0% to 10% estimated lifetime used.
|-
|0x02
|normal
|10% to 20% estimated lifetime used.
|-
|0x03
|normal
|20% to 30% estimated lifetime used.
|-
|0x04
|normal
|30% to 40% estimated lifetime used.
|-
|0x05
|normal
|40% to 50% estimated lifetime used.
|-
|0x06
|normal
|50% to 60% estimated lifetime used
|-
|0x07
|normal
|60% to 70% estimated lifetime used.
|-
|0x08
|normal
|70% to 80% estimated lifetime used.
|-
|0x09
|normal
|80% to 90% estimated lifetime used.
|-
|0x0A
|normal
|90% to 100% estimated lifetime used.
|-
|0x0B
|exceeded
|Estimated maximum lifetime exceeded.
|}
Pre-EOL Decoding
{| class="wikitable tech-table"
!'''Raw Value'''
!'''Decoded State'''
!Meaning
|-
|0x00
|not_defined
|Not defined.
|-
|0x01
|normal
|Normal condition.
|-
|0x02
|warning
|Warning state. Monitor or plan replacement.
|-
|0x03
|urgent
|Urgent state. Replacement recommended.
|}
'''emmc_extcsd.devices[ ].boot'''<syntaxhighlight lang="json" line="1">
{
  "partition_config": {
    "field": null,
    "decoded": null
  },
  "boot_config_protection": null,
  "boot_bus_conditions": null,
  "boot_write_protection": {
    "register": "BOOT_WP",
    "index": null,
    "description": "Boot Area Write protection",
    "value": "0x00",
    "value_int": 0,
    "value_hex": "0x0"
  },
  "boot_size": {
    "field": null,
    "decoded": null
  }
}
</syntaxhighlight>
{| class="wikitable tech-table"
!'''Field'''
!'''Type'''
!Description
|-
|partition_config
|object / null
|Boot partition configuration, if available.
|-
|boot_config_protection
|object / null
|Boot configuration protection status.
|-
|boot_bus_conditions
|object / null
|Boot bus width/mode conditions.
|-
|boot_write_protection
|object / null
|Boot area write protection status.
|-
|boot_size
|object / null
|Boot partition size, if available.
|}
'''emmc_extcsd.devices[ ].rpmb'''
 
RPMB means '''Replay Protected Memory Block'''. It is a protected eMMC area often used for secure storage.<syntaxhighlight lang="json" line="1">
{
  "size": {
    "field": {
      "register": "RPMB_SIZE_MULT",
      "index": null,
      "description": "RPMB Size",
      "value": "0x20",
      "value_int": 32,
      "value_hex": "0x20"
    },
    "decoded": {
      "bytes": 4194304,
      "kb": 4194.3,
      "mb": 4.19,
      "gb": 0.0,
      "kib": 4096.0,
      "mib": 4.0,
      "gib": 0.0
    }
  }
}
</syntaxhighlight>
{| class="wikitable tech-table"
!'''Field'''
!'''Type'''
!Description
|-
|size.field
|object / null
|Raw RPMB size register information.
|-
|size.decoded.bytes
|number
|RPMB size in bytes.
|-
|size.decoded.kb
|number
|RPMB size in decimal KB.
|-
|size.decoded.mb
|number
|RPMB size in decimal MB.
|-
|size.decoded.gb
|number
|RPMB size in decimal GB.
|-
|size.decoded.kib
|number
|RPMB size in KiB.
|-
|size.decoded.mib
|number
|RPMB size in MiB.
|-
|size.decoded.gib
|number
|RPMB size in GiB.
|}
'''emmc_extcsd.devices[ ].sector'''<syntaxhighlight lang="json" line="1">
{
  "sector_count": null,
  "sector_size_bytes": 512,
  "user_capacity": null
}
</syntaxhighlight>
{| class="wikitable tech-table"
!'''Field'''
!'''Type'''
!Description
|-
|sector_count
|object / null
|Parsed sector count register, if available.
|-
|sector_size_bytes
|number
|Sector size used for capacity calculation.
|-
|user_capacity
|object / null
|Calculated user capacity, if sector count is available.
|}
'''emmc_extcsd.devices[ ].partitioning'''<syntaxhighlight lang="json" line="1">
{
  "partitioning_support": {
    "register": "PARTITIONING_SUPPORT",
    "index": null,
    "description": "Partitioning Support",
    "value": "0x07",
    "value_int": 7,
    "value_hex": "0x7"
  },
  "partition_setting_completed": {
    "register": "PARTITION_SETTING_COMPLETED",
    "index": null,
    "description": "Partitioning Setting",
    "value": "0x00",
    "value_int": 0,
    "value_hex": "0x0"
  },
  "partition_attribute": {
    "register": "PARTITIONS_ATTRIBUTE",
    "index": null,
    "description": "Partitions attribute",
    "value": "0x00",
    "value_int": 0,
    "value_hex": "0x0"
  },
  "max_enhanced_area_size": {
    "register": "MAX_ENH_SIZE_MULT",
    "index": null,
    "description": "Max Enhanced Area Size",
    "value": "0x000747",
    "value_int": 1863,
    "value_hex": "0x747"
  },
  "enhanced_user_area_start": {
    "register": "ENH_START_ADDR",
    "index": null,
    "description": "Enhanced User Data Start Address",
    "value": "0x00000000",
    "value_int": 0,
    "value_hex": "0x0"
  },
  "enhanced_user_area_size": {
    "register": "ENH_SIZE_MULT",
    "index": null,
    "description": "Enhanced User Data Area Size",
    "value": "0x000000",
    "value_int": 0,
    "value_hex": "0x0"
  }
}
</syntaxhighlight>
{| class="wikitable tech-table"
!'''Field'''
!'''Type'''
!Description
|-
|partitioning_support
|object / null
|Supported partitioning features.
|-
|partition_setting_completed
|object / null
|Indicates whether partition settings were finalized.
|-
|user_capacity
|object / null
|Partition attribute register.
|-
|max_enhanced_area_size
|object / null
|Maximum enhanced area size multiplier.
|-
|enhanced_user_area_start
|object / null
|Enhanced user data area start address.
|-
|enhanced_user_area_size
|object / null
|Enhanced user data area size.
|}
==== <big>24.4 TempSensor Actor</big> ====
 
===== 24.4.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.
 
====== a) Set temperature sensor configurations ======
Req-Topic: tempSensor/config/in
 
ALERT:
 
* activate: true(active)/false
* templow: alert temperature lower limit
* tempHigh: alert temperature upper limit
<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "ALERT": {
        "activate": true,
        "tempLow": 0,
        "tempHigh": 80
      }
    }
  }
}
</syntaxhighlight>Reply-Topic: tempSensor/config/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true,
      "ALERT": {
        "activate": true,
        "tempLow": 0,
        "tempHigh": 80
      }
    }
  }
}
 
</syntaxhighlight>
 
====== b) Read temperature sensor configurations ======
Req-Topic: tempSensor/config/in
 
ALERT:
 
* activate: true(active)/false
 
LIMITS:
 
* templow: alert temperature lower limit
* tempHigh: alert temperature upper limit
<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "READ"
  }
}
 
</syntaxhighlight>Reply-Topic: tempSensor/config/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true,
      "ALERT": {
        "activate": true,
        "tempLow": 0,
        "tempHigh": 80
      }
    }
  }
}
 
</syntaxhighlight>
 
====== c) Read temperature and alert status ======
* unit: Temperature unit of measure
* alert: true (triggered) or false
 
Req-Topic: tempSensor/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "READ"
  }
}
 
</syntaxhighlight>Reply-Topic: tempSensor/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true,
      "data": {
        "temperature": <_FLOAT_>,
        "unit": "C",
        "alert": true
      }
    }
  }
}
 
</syntaxhighlight>
 
==== <big>24.5 TFT Actor</big> ====
 
===== 24.5.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to control and interact with the TFT display, or frontal panel LCD screen. Connecting to the broker for this Area requires no credentials.
 
===== 24.5.2 TFT Display Actor =====
  The TFT Actor is responsible for:
 
* Rendering static and informative screens on the TFT display
* Reacting to joystick input (LEFT/ RIGHT/ CENTER/ UP/ DOWN)
* Managing screen navigation and user confirmation flows
* Providing feedback to the application via MQTT
 
====== a) Screen Carousel Concept ======
The TFT actor maintains an '''ordered list of screens''' (carousel).
 
* Screens are navigated using the joystick:
 
- LEFT --> Previous screen
 
- RIGHT --> Next screen
 
* The carousel wraps around:
 
- LEFT on first screen --> last screen
 
- RIGHT on last screen --> first screen
 
====== b) Screen Types ======
The TFT actor supports the following screen types:
 
'''Image Screen'''
 
* Displays a static JPEG image
* Default screen shown at boot
* No user interaction required
 
'''Network Information Screen'''
 
* Display a interface with information about the networks of the device
* Updated on load
* No user interaction required
 
====== c) Joystick Navigation Logic ======
'''Carousel Navigation:'''
{| class="wikitable"
|'''Joystick  Input'''
|'''Action'''
|-
|LEFT
|Previous screen
|-
|RIGHT
|Next screen
|-
|DOWN
|Refresh current screen
|}
 
====== d) Boot Behavior ======
At system boot:
 
# TFT actor initializes the display
# Last available carousel is loaded
# First screen is rendered
# Joystick subscriptions are activated
# Actor waits for runtime commands
 
====== e) Design Notes & Constraints ======
* TFT actor does not expose joystick state
* Joystick actor remains independent
* TFT actor internally consumes joystick events
* Carousel state is local to the TFT actor
* Screen rendering is synchronous; input handling is asynchronous
* Confirmation screens always require explicit CENTER press
 
===== 24.5.3 User interaction through MQTT =====
Enabling interaction with the carousel using the topic tft/runtime/in . Actions available will be public to the user.
 
'''Runtime commands'''
 
'''Go to screen'''
 
Req-Topic: tft/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SET_CAROUSEL",
    "params": {
      "index": 2
    }
  }
}
 
</syntaxhighlight>Reply-Topic: tft/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "tft",
  "task": {
    "taskResult": {
      "success": true,
      "index": 2
    }
  }
}
 
</syntaxhighlight>'''Set TFT Screen Carousel'''
 
Req-Topic: tft/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "TIMESTAMP",
  "origin": "APP",
  "task": {
    "action": "SET_CAROUSEL",
    "params": {
      "startIndex": 0,
      "screens": [
        {
          "type": "image",
          "image": "default.jpg"
        },
        {
          "type": "image",
          "image": "status.jpg"
        },
        {
           "type": "confirm",
           "question": "Do you want to continue?"
           "question": "Do you want to continue?"
         }
         }
       ]
       ]
     }
     }
   }
   }
}
}
 
 
</syntaxhighlight>'''Parameters:'''
</syntaxhighlight>'''Parameters:'''
{| class="wikitable"
{| class="wikitable"
|'''Field'''
|'''Field'''
|'''Description'''
|'''Description'''
|-
|-
|screens
|screens
|Ordered list of screens
|Ordered list of screens
|-
|-
|Start  lndex
|Start  lndex
|Initial active screen (optional,  default = 0)
|Initial active screen (optional,  default = 0)
|}
'''Reply'''
 
Reply-Topic: '''tft/runtime/out''' <syntaxhighlight lang="json" line="1">
{
  "id": "TIMESTAMP",
  "origin": "tft",
  "task": {
    "taskResult": {
      "success": true,
      "activeIndex": 0,
      "totalScreens": 3
    }
  }
}
 
</syntaxhighlight>
 
==== <big>24.6 AnalogInputs Actor</big> ====
 
===== 24.6.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.
 
====== a) Configurations ======
'''  Topic: analogInputs/config/in - Set ADC channels configurations'''
 
'''mode'''
 
* continuous
* single
 
'''type'''
 
* voltage
* current
<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "AI1": {
        "mode": "single",
        "type": "voltage"
      },
      "AI2": {
        "mode": "single",
        "type": "voltage"
      },
      "AI3": {
        "mode": "single",
        "type": "current"
      },
      "AI4": {
        "mode": "single",
        "type": "current"
      }
    }
  }
}
 
</syntaxhighlight>Reply-Topic: analogInputs/config/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "AI1": {
        "success": true
      },
      "AI2": {
        "success": true
      },
      "AI3": {
        "success": true
      },
      "AI4": {
        "success": true
      }
    }
  }
}
 
</syntaxhighlight>
 
====== b) Runtime Data ======
'''Topic: analogInputs/runtime/in.'''
 
action:
 
* READ
* PAUSE (only applicable in continuous mode)
* RESUME (only applicable in continuous mode)
<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "AI1": {
        "action": "READ"
      },
      "AI2": {
        "action": "READ"
      },
      "AI3": {
        "action": "READ"
      },
      "AI4": {
        "action": "READ"
      }
    }
  }
}
 
</syntaxhighlight>Reply-Topic: analogInputs/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "AI1": {
        "success": true,
        "value": <_FLOAT_>
      },
      "AI2": {
        "success": true,
        "value": <_FLOAT_>
      },
      "AI3": {
        "success": true,
        "value": <_FLOAT_>
      },
      "AI4": {
        "success": true,
        "value": <_FLOAT_>
      }
    }
  }
}
 
</syntaxhighlight>
 
===== 24.6.2 Usage Examples =====
 
==== <big>24.7 Analog Outputs Actor</big> ====
 
===== 24.7.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.
 
====== a) Set analog outputs signal ======
Req-Topic: analogOutputs/config/in
 
'''Output:''' current within 0-20 mA
 
'''mode:''' on/off<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "mode": "on",
      "AO1": {
        "current": <_FLOAT_>
      },
      "AO2": {
        "current": <_FLOAT_>
      }
    }
  }
}
 
</syntaxhighlight>Reply-Topic: analogOutputs/config/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "mode": "on",
      "AO1": {
        "success": true,
        "current": <_FLOAT_>
      },
      "AO2": {
        "success": true,
        "current": <_FLOAT_>
      }
    }
  }
}
 
</syntaxhighlight>
 
====== b) Set analog outputs ======
Req-Topic: analogOutputs/runtime/in
 
'''current:''' current within 0-20 mA<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "AO1": {
        "action": "SET",
        "current": <_FLOAT_>
      },
      "AO2": {
        "action": "SET",
        "current": <_FLOAT_>
      }
    }
  }
}
 
</syntaxhighlight>Reply-Topic: analoigOutputs/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "AO1": {
        "success": true,
        "current": <_FLOAT_>
      },
      "AO2": {
        "success": true,
        "current": <_FLOAT_>
      }
    }
  }
}
 
</syntaxhighlight>
 
====== c) Read analog outputs settings ======
Req-Topic: analogOutputs/runtime/in
 
'''current''': current within 0-20 mA<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "AO1": {
        "action": "READ"
      },
      "AO2": {
        "action": "READ"
      }
    }
  }
}
 
</syntaxhighlight>Reply-Topic: analogOutputs/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "AO1": {
        "success": true,
        "current": <_FLOAT_>
      },
      "AO2": {
        "success": true,
        "current": <_FLOAT_>
      }
    }
  }
}
 
</syntaxhighlight>
 
==== <big>24.8 Digital Inputs Actor</big> ====
 
===== 24.8.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credentials.
 
====== a) Set digital input pin/pins speed fast/slow ======
The '''fast''' speed setting supports edge detection speed up to 100 Hz and the '''slow''' speed settings supports up to 10 Hz.
 
'''Fast Mode''' generates a message on every I/O state change, which may result in a '''high message payload''' during operation. Fast Mode should therefore only be enabled when '''strictly required'''.
 
Req-Topic: digitalInputs/config/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "DI1": {
        "speed": "fast"
      },
      "DI2": {
        "speed": "slow"
      },
      "DI3": {
        "speed": "fast"
      },
      "DI4": {
        "speed": "fast"
      }
    }
  }
}
</syntaxhighlight>Reply-Topic: digitalInputs/config/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "DI1": {
        "success": true,
        "speed": "fast"
      },
      "DI2": {
        "success": true,
        "speed": "slow"
      },
      "DI3": {
        "success": true,
        "speed": "fast"
      },
      "DI4": {
        "success": true,
        "speed": "fast"
      }
    }
  }
}
</syntaxhighlight>
 
====== b) Get all digital input pins state ======
 
 
Req-Topic: digitalInputs/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "READ"
  }
}
 
</syntaxhighlight>Reply-Topic: digitalInputs/runtime/out
 
state: high/low<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "DI1": {
        "success": true,
        "state": "high"
      },
      "DI2": {
        "success": true,
        "state": "low"
      },
      "DI3": {
        "success": true,
        "state": "high"
      },
      "DI4": {
        "success": true,
        "state": "low"
      }
    }
  }
}
 
</syntaxhighlight>
 
==== <big>24.9 Digital Outputs Actor</big> ====
 
===== 24.9.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this area requires no credencials.
 
====== a) Get all digital output pins state ======
 
 
Req-Topic: digitalOutputs/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "READ"
  }
 
</syntaxhighlight>Reply-Topic: digitalOutputs/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "DO1": {
        "success": true,
        "state": "low"
      },
      "DO2": {
        "success": true,
        "state": "high"
      },
      "DO3": {
        "success": true,
        "state": "high"
      },
      "DO4": {
        "success": true,
        "state": "low"
      },
      "DO5": {
        "success": true,
        "state": "low"
      },
      "DO6": {
        "success": true,
        "state": "low"
      },
      "DO7": {
        "success": true,
        "state": "low"
      },
      "DO8": {
        "success": true,
        "state": "low"
      }
    }
  }
}
</syntaxhighlight>
 
====== b) Set all digital output pins state ======
 
 
Req-Topic: digitalOutputs/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "DO1": {
        "action": "SET",
        "state": "low"
      },
      "DO2": {
        "action": "SET",
        "state": "high"
      },
      "DO3": {
        "action": "SET",
        "state": "high"
      },
      "DO4": {
        "action": "SET",
        "state": "low"
      },
      "DO5": {
        "action": "SET",
        "state": "low"
      },
      "DO6": {
        "action": "SET",
        "state": "low"
      },
      "DO7": {
        "action": "SET",
        "state": "low"
      },
      "DO8": {
        "action": "SET",
        "state": "low"
      }
    }
  }
}
</syntaxhighlight>Reply-Topic: digitalOutputs/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "D01": {
        "success": true,
        "state": "low"
      },
      "D02": {
        "success": true,
        "state": "high"
      },
      "D03": {
        "success": true,
        "state": "high"
      },
      "D04": {
        "success": true,
        "state": "high"
      },
      "D05": {
        "success": true,
        "state": "high"
      },
      "D06": {
        "success": true,
        "state": "low"
      },
      "D07": {
        "success": true,
        "state": "low"
      },
      "D08": {
        "success": true,
        "state": "low"
      }
    }
  }
}
 
</syntaxhighlight>
 
===== 24.9.2 Notes =====
If the busi2c-3 is not powered, we will get this:
 
Topic: '''digit a lOutputs/runtime/ out''' <syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "DO1": {
        "success": false,
        "state": "DO_not_powered"
      },
      "DO2": {
        "success": false,
        "state": "DO_not_powered"
      },
      "DO3": {
        "success": false,
        "state": "DO_not_powered"
      },
      "DO4": {
        "success": false,
        "state": "DO_not_powered"
      },
      "DO5": {
        "success": false,
        "state": "DO_not_powered"
      },
      "DO6": {
        "success": false,
        "state": "DO_not_powered"
      },
      "DO7": {
        "success": false,
        "state": "DO_not_powered"
      },
      "DO8": {
        "success": false,
        "state": "DO_not_powered"
      }
    }
  }
}
 
</syntaxhighlight>
 
==== <big>24.10 Joystick Actor</big> ====
 
===== 24.10.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.
 
====== a) Get all joystick pins state ======
 
 
Req-Topic: joystick/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "READ"
  }
 
</syntaxhighlight>Reply-Topic: joystick//runtime/out
 
state: pressed/released<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "JLEFT": {
        "success": true,
        "state": "pressed"
      },
      "JRIGHT": {
        "success": true,
        "state": "released"
      },
      "JUP": {
        "success": true,
        "state": "released"
      },
      "JDOWN": {
        "success": true,
        "state": "released"
      },
      "JCENTER": {
        "success": true,
        "state": "released"
      }
    }
  }
}
 
</syntaxhighlight>
 
==== <big>24.11 Buzzer Actor</big> ====
 
===== 24.11.1 Overview =====
The '''Buzzer Actor''' is responsible for controlling the onboard buzzer through MQTT commands. It receives runtime commands on an MQTT input topic, validates the requested buzzer operation, drives the buzzerthrough GPIO using '''libgpiod''', and publishes status/final responses on an MQTT output topic.
 
The actor currently controls '''GPIO line 25''' on '''/dev/gpiochip0''', with '''ACTIVE_LOW = False'''. It creates a
 
'''GpiodBuzzerDriver''' instance and routes incoming MQTT actions to runtime handlers.
 
The supported runtime actions are:
{| class="wikitable"
|'''Action'''
|'''Description'''
|-
|BEEP
|Plays a finite beep sequence, an infinite beep sequence, or a continuous tone
|-
|STOP
|Stops the currently active buzzer playback
|}
 
===== 24.11.2 MQTT Topics =====
{| class="wikitable"
|'''Topic'''
|'''Direction'''
|'''Description'''
|-
|buzzer/runtime/in
|Input
|Receives buzzer commands
|-
|buzzer/runtime/out
|Output
|Publishes status messages and final command responses
|}
The actor subscribes to '''buzzer/runtime/in''' and publishes all status/final replies to '''buzzer/runtime/out'''.
 
===== 24.11.3 Hardware and Datasheet Notes =====
The buzzer used is the '''MLT-8530 electro-magnetic SMD buzzer.'''
 
According to the datasheet:
{| class="wikitable"
|'''Parameter'''
|'''Value'''
|-
|Rated voltage
|3.6 Vo-p
|-
|Operating voltage
|2.5 ~ 4.5 Vo-p
|-
|Rated current
|Max. 95 mA
|-
|Rated test frequency
|2700 Hz
|-
|Duty cycle
|50% square wave
|-
|Sound output
|Min. 80 dB at 10 cm
|-
|Coil resistance
|16 ± 3 Ω
|-
|Resonant frequency
|2700 Hz
|}
 
===== 24.11.4 BEEP =====
The BEEP action supports two modes:
{| class="wikitable"
|'''Mode'''
|'''Description'''
|-
|sequence
|Plays one or more beeps with gaps between them
|-
|continuous
|Plays one continuous tone until '''STOP''' is received
|}
If no mode is provided, the default mode is: '''sequence'''
 
All messages should be sent to the topic '''buzzer/runtime/in'''
 
====== a) Default Datasheet-Aligned Beep ======
<syntaxhighlight lang="json" line="1">
{
"id": <TIMESTAMP>,
"origin": "APP",
"task": {
  "action": "BEEP"
  }
}
 
</syntaxhighlight>
 
====== b) N Beeps ======
Play '''<BEEPS_QUANTITY>''' beeps at '''<FREQUENCY>''' Hz. Each beep lasts '''<BEEP_DURATION>''' seconds, with
 
'''<GAP_BETWEEN_BEEPS>''' seconds of silence between beeps.<syntaxhighlight lang="json" line="1">{
"id": <TIMESTAMP>,
"origin": "APP",
"task": {
  "action": "BEEP",
  "params": {
      "frequency_hz": <FREQUENCY>,
      "duration_s": <BEEP_DURATION>,
      "count": <BEEPS_QUANTITY>,
      "gap_s": <GAP_BETWEEN_BEEPS>
    }
  }
}</syntaxhighlight>If you want to play repeated beeps forever until a '''STOP''' command arrives then you only need to pass the '''count: 0'''
 
====== c) Continuous Tone ======
Play one continuous <FREQUENCY> Hz tone until '''STOP'''.<syntaxhighlight lang="json" line="1">
{
"id": <TIMESTAMP>,
"origin": "APP",
"task": {
  "action": "BEEP",
  "params": {
      "mode": "continuous",
      "frequency_hz": <FREQUENCY>
    }
  }
}
</syntaxhighlight>If '''frequency_hz''' is omitted, the handler uses the configured default frequency.
 
====== d) Stop Buzzer ======
If you want to stop the beep sequence, just send this payload to the '''buzzer/runtime/in'''<syntaxhighlight lang="json" line="1">
{
"id": <TIMESTAMP>,
"origin": "APP",
"task": {
  "action": "STOP",
  }
}
</syntaxhighlight>
 
====== e) Buzzer payload parameters table ======
{| class="wikitable"
!Field
!Required
!Type
!Default
!Applies to
!Description
|-
|task
|Yes
|object
| -
|All requests
|Main task object. Contains the requested action and
optional parameters.
|-
|task.action
|Yes
|string
| -
|All requests
|Action to execute. Supported values: "BEEP" and
"STOP".
|-
|task.params
|No
|object
|{}
|BEEP
|Optional parameters for configuring the buzzer
behavior. Not needed for STOP.
|-
|task.params.mode
|No
|string
|"sequence"
|BEEP
|Playback mode. Supported values: "sequence" and
"continuous".
|-
|task.params.frequency_hz
|No
|number
|2700.0
|BEEP
|Buzzer frequency in Hz. Recommended/default value
is 2700 Hz , matching the buzzer resonant frequency.
|-
|task.params.duration_s
|No
|number
|0.2
|BEEP with
mode="sequence"
|Duration of each beep, in seconds.
|-
|task.params.count
|No
|integer
|1
|BEEP with
mode="sequence"
|Number of beeps to play. 0 means repeat forever
until STOP.
|-
|task.params.gap_s
|No
|number
|0.15
|BEEP with
mode="sequence"
|Silence gap between beeps, in seconds.
|-
|task.params.mode ="continuous"
|No
|string
| -
|BEEP
|Plays one continuous tone until STOP . In this mode,
duration_s , count , and gap_s are ignored.
|}
 
===== 24.11.5 Buzzer - diagram =====
[[File:Buzzer - diagram.svg|center|frameless|901x901px]]
 
===== 24.11.6 Buzzer Command timing charts - Examples =====
The following charts represent the command-level buzzer state over time.
 
They do not show the internal 2700 Hz switching frequency.
 
Instead, they show when the buzzer is logically:
{| class="wikitable"
|'''State'''
|'''Meaning'''
|-
|1
|Buzzer active / sound ON
|-
|0
|Buzzer inactive / silence
|}
 
====== a) Default BEEP command ======
<syntaxhighlight lang="json" line="1">
{
"id": <TIMESTAMP>,
"origin": "APP",
"task": {
  "action": "BEEP",
  }
}
</syntaxhighlight>Default values used:
{| class="wikitable"
|'''Parameter'''
|'''Value'''
|-
|duration_s
|0.2 s
|-
|count
|1
|-
|gap_s
|0.15 s
|}
'''Buzzer State'''
 
[[File:Default_Beep.svg|frameless]]
 
duration_s = 0.2 s
 
count = 1
 
====== b) BEEP Sequence - 5 beeps ======
<syntaxhighlight lang="json" line="1">
{
"id": 1779789836000,
"origin": "APP",
"task": {
    "action": "BEEP",
    "params": {
      "duration_s": 1,
      "count": 5,
      "gap_s": <GAP_BETWEEN_BEEPS>
  }
}
}
</syntaxhighlight>'''Buzzer State'''
[[File:5 beeps.svg|left|frameless|700x700px]]
 
 
 
 
 
duration_s = 1.0s
 
gap_s = 0.5s
 
count = 5
 
====== c) Infinite BEEP Sequence ======
 
This happens when: "count": 0<syntaxhighlight lang="json" line="1">
{
"id": 1779789836000,
"origin": "APP",
"task": {
    "action": "BEEP",
    "params": {
      "duration_s": 1,
      "count": 0,
      "gap_s": 0.5
  }
}
}
</syntaxhighlight>'''Buzzer State'''
[[File:Infinite_Beeps.svg|frameless|606x606px]]
duration_s = 1.0
gap_s = 0.5
 
count = 0
 
====== d) Continuous BEEP ======
In continuous mode, the buzzer remains ON until a STOP command is received.<syntaxhighlight lang="json" line="1">
{
"id": 1779789836000,
"origin": "APP",
"task": {
    "action": "BEEP",
    "params": {
      "mode": "continuous",
  }
}
}
</syntaxhighlight>'''Buzzer State'''
 
[[File:Continous beep.svg|frameless|600x600px]]
 
mode = continuous
 
====== e) STOP ======
The STOP command immediately forces the buzzer to OFF.
 
'''Buzzer State'''
 
[[File:Stop beep.svg|frameless|600x600px]]
 
After STOP, the buzzer is forced to OFF.
 
==== 24.12 INA232 actor ====
 
===== 24.12.1 Overview =====
The '''INA Actor''' is responsible for reading the ATLAS INA232 power monitor and publishing the measuredelectrical values through MQTT.
 
The actor publishes:
{| class="wikitable"
|'''Value'''
|'''Unit'''
|'''Description'''
|-
|voltage_v
|V
|Measured bus/input voltage
|-
|current_a
|A
|Measured current
|-
|power_w
|W
|Measured/calculated power
|}
The INA232 is a current, voltage, and power monitor with an I²C/SMBus interface. It reports current, busvoltage, and power values through internal registers. The calibration register must be configured to obtainvalid current and power results.
 
===== 24.12.2 Actor Behaviour =====
The INA Actor shall:
 
1. Start with a valid INA configuration.
 
2. Configure the INA232 device.
 
3. Read voltage, current and power once per second.
 
4. Publish the values to: '''ina/runtime/out'''
 
The actor does '''not''' need a request every second.
 
The publication is automatic and periodic.
 
===== 24.12.3 Required Configuration =====
The actor requires a small configuration to correctly read and convert the INA232 measurements.
{| class="wikitable"
|'''Field'''
|'''Type'''
|'''Required'''
|'''Description'''
|-
|enabled
|boolean
|Yes
|Enables or disables the INA actor
|-
|address
|string /integer
|Yes
|I²C address of the INA232 device
|-
|shunt_ohm
|number
|Yes
|Value of the shunt resistor in ohms
|-
|max_current_a
|number
|Yes
|Maximum expected current, used forcalibration
|-
|adcrange
|integer
|No
|INA232 shunt voltage range selection
|-
|publish_interval_ms
|integer
|Yes
|Runtime publish interval in milliseconds
|-
|rail_name
|string
|No
|Logical name of the monitored power rail
|}
 
* '''Default configuration'''
<syntaxhighlight lang="json" line="1">
{
  "enabled": true,
  "address": "0x40",
  "shunt_ohm": 0.020,
  "publish_interval_ms": 1000,
  "rail_name": "atlas_input_power"
}
</syntaxhighlight>
 
===== 24.12.4 Configuration domain =====
Configuration messages are sent to:
 
'''ina/config/in'''
 
Configuration replies are published on:
 
'''ina/config/out'''
 
'''- GET_CONFIG'''
 
Returns the current INA Actor configuration
 
'''Request'''<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "GET_CONFIG"
  }
}
</syntaxhighlight>'''Response'''<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "INA",
  "task": {
    "action": "GET_CONFIG",
    "taskResult": {
      "success": true,
      "configured": true,
      "enabled": true,
      "address": "0x40",
      "shunt_ohm": 0.020,
      "publish_interval_ms": 1000
    }
  }
}
</syntaxhighlight>
 
===== 24.12.5 Runtime domain =====
Runtime messages are sent to:
 
'''ina/runtime/in'''
 
Runtime replies are published on:
 
'''ina/runtime/out'''
 
'''- Manual Runtime read'''
 
'''Request'''<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "GET_POWER"
  }
}
</syntaxhighlight>'''Response'''<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "INA",
  "task": {
    "action": "GET_POWER",
    "taskResult": {
      "success": true,
      "voltage_v": 24.12,
      "current_a": 0.481,
      "power_w": 11.6
    }
  }
}
</syntaxhighlight>'''- Automatic Runtime Publication'''
 
Publish topic:
 
'''ina/runtime/out'''
 
Period: 1000 ms === 1s
 
'''Response payload'''<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "INA",
  "task": {
    "action": "PUBLISH_POWER",
    "taskResult": {
      "success": true,
      "voltage_v": 24.12,
      "current_a": 0.481,
      "power_w": 11.6
    }
  }
}
</syntaxhighlight>
{| class="wikitable"
|'''Field'''
|'''Type'''
|'''Required'''
|'''Description'''
|-
|success
|boolean
| -
|Indicates whether the read operation succeeded
|-
|voltage_v
|number
|V
|Measured bus/input voltage
|-
|current_a
|number
|A
|Measured current
|-
|power_w
|number
|W
|Measured power
|}
 
==== <big>24.13 Modem Actor</big> ====
 
===== 24.13.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtainmodem (LTE) data. Connecting to the broker for this area requires no credentials.
 
===== 24.13.2 Mobile (LTE Modem) =====
The Mobile actor manages the LTE modem using ModemManager ('''mmcli'''). It allows monitoring modem status, configuring connectivity (APN, operator,network mode), and performing diagnostics.
 
===== 24.13.3 Scan Operators =====
Scans available network operators (requires SIM and modem enabled).
 
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SCAN_OPERATORS"
  }
}
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "operators": [
        {
          "id": "26801",
          "name": "vodafone P",
          "status": "available"
        },
        {
          "id": "26806",
          "name": "MEO",
          "status": "available"
        }
      ]
    }
  }
}
</syntaxhighlight>
 
===== 24.13.4 Set Operator =====
The supported modes are:
 
* auto → modem selects de operator automatically ('''default''').
* manual→ user forces a specific operator using '''operator_id'''.
 
- Operators are identified using '''MCC + MNC codes''':
{| class="wikitable"
|'''Operator'''
|'''Code'''
|'''Country'''
|-
|Vodafone PT
|26801
|Portugal
|-
|MEO
|26806
|Portugal
|-
|NOS
|26803
|Portugal
|}
These values are obtained dynamically via SCAN_OPERATORS
 
* '''Recommendations:'''
 
Default should always be '''auto'''
 
Use '''manual''' only when:
 
- You need to force roaming behavior
 
- You want to lock to a specific network for stability/testing
 
====== '''Auto Selection''' ======
'''Req-Topic''': modem/config/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SET_OPERATOR",
    "taskParams": {
      "mode": "auto"
    }
  }
}
</syntaxhighlight>'''Reply-Topic''': modem/config/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true
    }
  }
}
</syntaxhighlight>
 
====== Manual Selection ======
'''Req-Topic''': modem/config/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SET_OPERATOR",
    "taskParams": {
      "mode": "manual",
      "operator_id": "26801"
    }
  }
}
</syntaxhighlight>'''Reply-Topic''': modem/config/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true
    }
  }
}
</syntaxhighlight>
 
===== 24.13.5 Set APN Configuration =====
Supports automatic (predefined APN) or custom configuration.
 
====== Actual Behavior ======
When '''SET_APN''' is executed, the system performs the following sequence:
 
# '''Disconnects the current data connection''' (if connected)
# Applies the new APN configuration
# Initiates a new connection using the provided APN
# Waits until the modem reaches '''connected state'''
 
This means a '''full reconnection is automatically performed'''.
 
No additional RESET or manual reconnection is required.
 
====== Impact & Considerations ======
 
* Active data connection is '''interrupted'''
* Ongoing communications (MQTT, HTTP, VPN, etc.) will be '''dropped'''
* IP address may change after reconnection
* Operation may take '''several seconds (typically 5–20s)'''
* If connection fails, the modem may remain '''disconnected'''
 
====== Known APNs ======
{| class="wikitable"
|'''Operator'''
|'''APN CONF'''
'''NAME'''
|'''APN'''
|'''PROXY'''
|'''PORT'''
|'''MCC'''
|'''MNC'''
|'''AUTH'''
'''TYPE'''
|'''APN'''
'''TYPE'''
|'''CARRIER'''
|'''OBS.'''
|-
|MEO, UZO
| --
|internet
| --
| --
| --
| --
| --
| --
| --
| --
|-
|1nce
| --
|iot.1nce.net
| --
| --
| --
| --
| --
| --
| --
| --
|-
|Vodafone
|Vodafone
Internet
|net2.vodafone.pt
|iproxy.vodafone.pt
|80
|268
|01
|PAP
|default
|unspecified
|[https://ajuda.vodafone.pt/manuais/vodafone/smart-4g/explorar/configure-o-telefone-para-internet Docs]
|}
 
====== Supported Modes ======
 
* auto
* custom
 
{| class="wikitable"
|'''Mode'''
|'''Description'''
|-
|auto
|Uses modem default / SIM-provided APN
|-
|custom
|Uses user-defined APN credentials
|}
'''- Auto APN (e.g. 1NCE)'''
 
Uses the default APN embedded in the modem or provided by the SIM.
 
'''Req-Topic''': modem/config/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SET_APN",
    "taskParams": {
      "mode": "auto"
    }
  }
}
</syntaxhighlight>'''Reply-Topic''': modem/config/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "apn": "internet",
      "success": true
    }
  }
}
</syntaxhighlight>'''- Custom APN'''
 
Allows full control over APN configuration.
 
'''Req-Topic''': modem/config/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SET_APN",
    "taskParams": {
      "mode": "custom",
      "apn": "internet",
      "user": "user",
      "password": "pass"
    }
  }
}
</syntaxhighlight>'''Reply-Topic''': modem/config/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "apn": "internet",
      "success": true
    }
  }
}
</syntaxhighlight>
 
===== 24.13.6 Get Modem Status =====
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "GET_STATUS"
  }
}
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "modem": {
        "present": true,
        "enabled": true,
        "state": "registered",
        "signal": 34,
        "access_tech": "lte",
        "operator": "vodafone P",
        "sim": "ready"
      }
    }
  }
}
</syntaxhighlight>
 
===== 24.13.7 Enable / Disable Modem =====
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SET_MODEM_STATE",
    "taskParams": {
      "enabled": true
    }
  }
}
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "enabled": true,
      "success": true
    }
  }
}
</syntaxhighlight>
 
===== 24.13.8 Reset Modem =====
Performs a full modem reset and recovery sequence.
 
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "RESET"
  }
}
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true
    }
  }
}
</syntaxhighlight>
 
====== Actual Behavior ======
When RESET is executed, the system performs a '''complete modem restart flow''':
 
# Executes system-level reset: '''ltectl reset-modem'''
# The modem '''disappears from the system (USB re-enumeration)'''
# The system waits for the modem to '''reappear'''
# Re-discovers the modem path
# Waits until the modem becomes '''ready'''
# Waits until the modem is '''connected again'''
 
This is a '''full recovery sequence''', including automatic reconnection.
 
====== Impact on active connection ======
 
* Active data connection is '''immediately terminated'''
* All ongoing communications (MQTT, VPN, HTTP, etc.) will be '''interrupted'''
* Modem temporarily '''disappears from the system'''
* A new network registration is performed
* IP address will '''likely change'''
* Total recovery time may take '''10–120 seconds'''
 
====== When to use ======
Use '''RESET''' only when:
 
* Modem is stuck in '''searching''' or not registering
* Connected but no data traffic is possible
* APN/operator changes are not taking effect
* Modem becomes unresponsive or unstable
 
====== When NOT to Use ======
Avoid using RESET :
 
* During OTA updates or file uploads
* During critical real-time operations
* If a simple reconnect ( SET_MODEM_STATE ) is sufficient
 
====== Application Considerations ======
'''Before RESET'''
 
* Ensure no critical operations are ongoing
* Persist any unsent or buffered data
* Expect loss of connectivity
 
'''After RESET'''
 
* Wait for modem to fully recover (can take up to ~2 minutes)
* Re-check modem status using: '''GET_STATUS'''
* Re-establish application-level connections: '''MQTT'''; '''VPN''' an '''Cloud sessions'''
 
===== 24.13.9 Set Network Mode =====
Configures allowed radio technologies
 
Supported values:
 
* 2g
* 3g
* 4g
* auto
 
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SET_NETWORK_MODE",
    "taskParams": {
      "mode": "4g"
    }
  }
}</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "mode": "4g",
      "success": true
    }
  }
}
</syntaxhighlight>
 
===== 24.13.10 Get Signal Strength =====
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "GET_SIGNAL"
  }
}
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "signal": 34,
      "unit": "%"
    }
  }
}
</syntaxhighlight>
 
===== 24.13.11 Get SIM card info =====
'''GET_SIM_INFO''' is a '''runtime action''' used to read SIM card information from the modem through ModemManager.
 
This action is '''read-only'''. It does not change the modem state, APN, operator, bearer, or NetworkManager configuration.
 
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "GET_SIM_INFO"
  }
}
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "modem-actor",
  "task": {
    "taskResult": {
      "success": true,
      "sim": {
        "id": "0",
        "path": "/org/freedesktop/ModemManager1/SIM/0",
        "active": true,
        "iccid": "8935101234567890123",
        "imsi": "268060123456789",
        "operator_id": "26806",
        "operator_name": "MEO",
        "emergency_numbers": [
          "112"
        ],
        "preferred_networks": [
          "operator-code: 42507, access-technologies: gsm, umts, lte",
          "operator-code: 20810, access-technologies: gsm, umts, lte",
          "operator-code: 64710, access-technologies: gsm, umts, lte",
          "operator-code: 37001, access-technologies: gsm, umts, lte",
          "operator-code: 34002, access-technologies: gsm, umts, lte"
        ]
      }
    }
  }
}
</syntaxhighlight>
{| class="wikitable"
|'''Field'''
|'''Type'''
|'''Description'''
|-
|id
| number / string
|Same request ID received in the input payload.
|-
|origin
| string
|Actor name, usually '''modem-actor'''.
|-
|task.taskResult.success
|boolean
|Indicates if the SIM information was read successfully.
|-
|task.taskResult.sim.id
|string
|SIM object ID used by ModemManager. Usually 0.
|-
|task.taskResult.sim.path
|string
|ModemManager DBus path for the SIM object.
|-
|task.taskResult.sim.active
|boolean / null
|Indicates if the SIM is active, when available.
|-
|task.taskResult.sim.iccid
|string / null
|SIM ICCID / SIM identifier. This is the physical SIM card identifier.
|-
|task.taskResult.sim.imsi
|string / null
|IMSI associated with the SIM subscription.
|-
|task.taskResult.sim.operator_id
|string / null
|Mobile operator identifier from the SIM, when available.
|-
|task.taskResult.sim.operator_name
|string / null
|Operator name from the SIM, when available.
|-
|task.taskResult.sim.emergency_numbers
|array
|Emergency numbers reported by the SIM/modem.
|-
|task.taskResult.sim.preferred_networks
|array
|Preferred networks stored on the SIM, when available.
|}
 
===== 24.13.12 Test Modem =====
Performs a basic diagnostic test:
 
* Modem detection
* SIM presence
* Network registration
* Data connectivity
 
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "TEST"
  }
}
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "hw": true,
      "sim": true,
      "network": true,
      "data": true
    }
  }
}
</syntaxhighlight>
 
===== 24.13.13 Speed Test =====
Performs a '''low-data network speed test''' over the modem interface.
 
This command does '''not''' run a full bandwidth benchmark.
 
Instead, it performs a '''short and capped download burst''' on interface '''wwan0''' , measures the number of received bytes during a fixed time window, and
 
returns an '''estimated download speed''' together with '''latency''' and a '''confidence level'''.
 
This approach is designed for IoT / field devices using '''capped cellular SIM cards''', where a classic speed test would consume too much data.
 
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SPEED_TEST"
  }
}
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out
 
'''Success reply''':<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "download_mbps": 12.4,
      "success": true
    }
  }
}
</syntaxhighlight>'''Error reply'''
 
Example when the modem is not connected:<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "download_mbps": 12.4,
      "success": true
    }
  }
}
</syntaxhighlight>Example when an unexpected internal error occurs:<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "modem-actor",
  "task": {
    "taskResult": {
      "success": false,
      "reason": "unexpected_exception"
    }
  }
}
</syntaxhighlight>
 
====== '''Reply parameters''' ======
{| class="wikitable"
|'''Parameter'''
|'''Type'''
|'''Description'''
|-
|success
| boolean
|Indicates whether the speed test completed successfully. true = test executed, false = failed (see reason ).
|-
|download_mbps
| number
|Estimated download speed in '''megabits per second (Mbps)'''. Calculated from the number of bytes received on interface
'''wwan0''' during the measurement window.
|-
|bytes_sampled
|number
|Total number of '''received bytes''' measured on the modem interface ( '''wwan0''' ) during the test window. Used as the raw input
for speed calculation.
|-
|duration_s
|number
|Measurement window duration in seconds. Current implementation uses '''5 seconds'''.
|-
|latency_ms
|number
|null
|-
|confidence
|string
|Qualitative indicator of measurement reliability based on sampled bytes:• '''low''' → < 50,000 bytes• '''medium''' → 50,000–
299,999 bytes• '''high''' → ≥ 300,000 bytes
|-
|reason
|string
|Present only when '''success=false''' . Provides failure reason (e.g., '''not_connected (<state>)''' , '''unexpected_exception''' ).
|}
 
====== Data consumption notice ======
This command performs a '''real network download''' and therefore consumes mobile data.
 
Although the test is designed to be '''low-data''', it still generates traffic:
 
* Typical consumption per test: '''~100 KB to ~500 KB'''
* Latency measurement adds a negligible amount (ICMP ping)
 
'''Estimated data usage'''
{| class="wikitable"
|'''Frequency'''
|'''Estimated consumption'''
|-
|1 test/day (~100 KB)
| ~3 MB/month
|-
|1 test/day (~250 KB)
| ~7.5 MB/month
|-
|1 test/day (~500 KB)
|~15 MB/month
|}
 
====== Recommendation ======
For devices using '''capped SIM cards''', it is recommended to:
 
* Avoid running this test at high frequency
* Use signal and modem status ( '''mmcli''' ) for regular monitoring
* Reserve speed tests for:
 
- commissioning
 
- troubleshooting
 
- periodic health checks
 
'''Running frequent or extended tests may significantly impact the data allowance.'''
 
===== 24.13.14 Get Raw Modem Info (Reserved) =====
'''Req-Topic''': reserved/modem/runtime/in<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "modem-actor",
  "task": {
    "taskResult": {
      "success": false,
      "reason": "not_connected (registered)"
    }
  }
}
</syntaxhighlight>'''Reply-Topic''': reserved/modem/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "DEV",
  "task": {
    "taskResult": {
      "raw": "mmcli -m 0 output..."
    }
  }
}
</syntaxhighlight>
 
===== 24.13.15 Example: Raw Modem Output ( mmcli ) =====
Command:
 
mmcli -m 0 --output-json
 
Example output:<syntaxhighlight lang="json" line="1">
{
  "modem": {
    "3gpp": {
      "5gnr": {
        "registration-settings": {
          "drx-cycle": "--",
          "mico-mode": "--"
        }
      },
      "enabled-locks": [],
      "eps": {
        "initial-bearer": {
          "dbus-path": "--",
          "settings": {
            "apn": "--",
            "ip-type": "--",
            "password": "--",
            "user": "--"
          }
        },
        "ue-mode-operation": "--"
      },
      "imei": "862636056280785",
      "network-rejection-access-technology": "--",
      "network-rejection-error": "--",
      "network-rejection-operator-id": "--",
      "network-rejection-operator-name": "--",
      "operator-code": "--",
      "operator-name": "--",
      "packet-service-state": "--",
      "pco": "--",
      "registration-state": "--"
    },
    "cdma": {
      "activation-state": "--",
      "cdma1x-registration-state": "--",
      "esn": "--",
      "evdo-registration-state": "--",
      "meid": "--",
      "nid": "--",
      "sid": "--"
    },
    "dbus-path": "/org/freedesktop/ModemManager1/Modem/0",
    "generic": {
      "access-technologies": [],
      "bearers": [],
      "carrier-configuration": "ROW_Gen_VoLTE",
      "carrier-configuration-revision": "05010822",
      "current-bands": [
        "egsm",
        "dcs",
        "pcs",
        "g850",
        "utran-1",
        "utran-4",
        "utran-6",
        "utran-5",
        "utran-8",
        "utran-2",
        "eutran-1",
        "eutran-2",
        "eutran-3",
        "eutran-4",
        "eutran-5",
        "eutran-7",
        "eutran-8",
        "eutran-12",
        "eutran-13",
        "eutran-18",
        "eutran-19",
        "eutran-20",
        "eutran-25",
        "eutran-26",
        "eutran-28",
        "eutran-34",
        "eutran-38",
        "eutran-39",
        "eutran-40",
        "eutran-41",
        "eutran-66",
        "utran-19"
      ],
      "current-capabilities": [
        "gsm-umts, lte"
      ],
      "current-modes": "allowed: 4g; preferred: none",
      "device": "/sys/devices/platform/scb/fe9c0000.xhci/usb1/1-1/1-1.4",
      "device-identifier": "2c759b7021f62d2e26973150063ea040b3662a65",
      "drivers": [
        "option",
        "qmi_wwan"
      ],
      "equipment-identifier": "862636056280785",
      "hardware-revision": "10000",
      "manufacturer": "QUALCOMM INCORPORATED",
      "model": "SIMCOM_SIM7600G-H",
      "own-numbers": [],
      "physdev": "/sys/devices/platform/scb/fe9c0000.xhci/usb1/1-1/1-1.4",
      "plugin": "simtech",
      "ports": [
        "cdc-wdm0 (qmi)",
        "ttyUSB0 (ignored)",
        "ttyUSB1 (gps)",
        "ttyUSB2 (at)",
        "ttyUSB3 (at)",
        "ttyUSB4 (audio)",
        "wwan0 (net)"
      ],
      "power-state": "on",
      "primary-port": "cdc-wdm0",
      "primary-sim-slot": "1",
      "revision": "LE20B04SIM7600G22",
      "signal-quality": {
        "recent": "yes",
        "value": "0"
      },
      "sim": "/org/freedesktop/ModemManager1/SIM/0",
      "sim-slots": [
        "/org/freedesktop/ModemManager1/SIM/0",
        "/"
      ],
      "state": "failed",
      "state-failed-reason": "sim-missing",
      "supported-bands": [
        "egsm",
        "dcs",
        "pcs",
        "g850",
        "utran-1",
        "utran-4",
        "utran-6",
        "utran-5",
        "utran-8",
        "utran-2",
        "eutran-1",
        "eutran-2",
        "eutran-3",
        "eutran-4",
        "eutran-5",
        "eutran-7",
        "eutran-8",
        "eutran-12",
        "eutran-13",
        "eutran-18",
        "eutran-19",
        "eutran-20",
        "eutran-25",
        "eutran-26",
        "eutran-28",
        "eutran-34",
        "eutran-38",
        "eutran-39",
        "eutran-40",
        "eutran-41",
        "eutran-66",
        "utran-19"
      ],
      "supported-capabilities": [
        "gsm-umts, lte"
      ],
      "supported-ip-families": [
        "ipv4",
        "ipv6",
        "ipv4v6"
      ],
      "supported-modes": [
        "allowed: 2g; preferred: none",
        "allowed: 3g; preferred: none",
        "allowed: 4g; preferred: none",
        "allowed: 2g, 3g; preferred: 3g",
        "allowed: 2g, 3g; preferred: 2g",
        "allowed: 2g, 4g; preferred: 4g",
        "allowed: 2g, 4g; preferred: 2g",
        "allowed: 3g, 4g; preferred: 4g",
        "allowed: 3g, 4g; preferred: 3g",
        "allowed: 2g, 3g, 4g; preferred: 4g",
        "allowed: 2g, 3g, 4g; preferred: 3g",
        "allowed: 2g, 3g, 4g; preferred: 2g"
      ],
      "unlock-required": "--",
      "unlock-retries": []
    }
  }
}
</syntaxhighlight>
 
====== Field Reference - mmcli -m 0 --output-json ======
{| class="wikitable"
|'''JSON Path'''
|'''Meaning'''
|'''Example Value'''
|'''Notes / Interpretation'''
|-
|modem.dbus-path
| Internal modem path
|/org/.../Modem/0
|Used by mmcli ( -m 0 )
|-
|modem.generic.manufacturer
| Modem vendor
|QUALCOMM INCORPORATED
|Hardware info
|-
|modem.generic.model
|Modem model
|SIM7600G-H
|
|-
|modem.generic.revision
|Firmware version
|LE20B04SIM7600G22
|Useful for debugging
|-
|modem.generic.device
|Linux device path
|/sys/devices/...
|USB device
|-
|modem.generic.drivers
|Kernel drivers
|option, qmi_wwan
|Must be present
|-
|modem.generic.primary-port
|Control interface
|cdc-wdm0
|Critical (QMI control)
|-
|modem.generic.ports
|Available interfaces
|ttyUSB*, wwan0
|Data + AT + GPS
|-
|modem.generic.power-state
|Power status
|on
|
|-
|modem.generic.state
|Modem state
|failed
|Main status field
|-
|modem.generic.state-failed-reason
|Failure reason
|sim-missing
|Root cause of failure
|-
|modem.generic.signal-quality.value
|Signal strength (%)
|0
|0 = no signal
|-
|modem.generic.current-capabilities
|Active radio tech
|gsm-umts, lte
|
|-
|modem.generic.current-modes
|Active mode
|allowed: 4g
|Controlled via API
|-
|modem.generic.current-bands
|Active frequency bands
|[eutran-1, ...]
|Coverage related
|-
|modem.generic.supported-bands
|Supported bands
|[eutran-*, utran-*]
|Hardware capability
|-
|modem.generic.supported-ip-families
|IP support
|ipv4, ipv6, ipv4v6
|
|-
|modem.generic.sim
|SIM path
|/org/.../SIM/0
|
|-
|modem.generic.sim-slots
|SIM slots
|[slot1, slot2]
|Slot 2 empty here
|-
|modem.generic.primary-sim-slot
|Active SIM slot
|1
|
|-
|modem.generic.bearers
|Active data sessions
|[ ]
|Empty = no connection
|-
|modem.3gpp.imei
|Device IMEI
|862636056280785
|Unique identifier
|-
|modem.3gpp.operator-name
|Network name
| --
|Not available (no SIM)
|-
|modem.3gpp.operator-code
|MCC/MNC
| --
|Not available
|-
|modem.3gpp.registration-state
|Network state
| --
|Not registered
|-
|modem.3gpp.packet-service-state
|Data service state
| --
|No data session
|-
|modem.3gpp.eps.initial-bearer.settings.apn
|APN
| --
|Not set / no connection
|}
 
===== 24.13.16 Notes: =====
 
* If no modem is detected:
 
'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "modem": {
        "present": false
      }
    }
  }
}
</syntaxhighlight>
 
* If SIM is locked or missing: '''Reply-Topic''': modem/runtime/out
<syntaxhighlight lang="json" line="1">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "modem": {
        "sim": "locked"
      }
    }
  }
}
</syntaxhighlight>
 
* Operator scan may take several seconds and should be handled asynchronously.
* Some actions require:
 
- SIM card inserted
 
- Modem enabled
 
- '''cdc-wdm0''' interface available
 
* Signal strength is reported as percentage and may be cached by ModemActor.
 
=== 25. Included Software Stack ===
 
 
[[File:AtlasCode.svg|center|frameless|583x583px]]
 
=== 26. Hardware Libraries ===
[IMAGE PLACEHOLDER]
 
=== 27. Related Products ===
{| class="wikitable"
|'''PA'''
|'''Name'''
|'''Requirements'''
|-
|PA000000074
|[[SENSBLUE MONARCH|SENSBLUE MONARCH Gateway]]
|
|-
|}
{{SimilarProductsTable}}
 
=== 28. Accessories ===
{| class="wikitable"
|'''PA'''
|'''Name'''
|'''Requirements'''
|-
|
|
|
|-
|
|
|
|-
|
|
|
|-
|
|
|
|-
|
|
|
|}
 
=== 29. Document History ===
{| class="wikitable"
|'''Version'''
|'''Description'''
|'''Date'''
|-
|SBADATAv0.1
|First  version of SENSBLUE ATLAS Datasheet
|11/03/2026
|-
|
|
|
|-
|
|
|
|}
|}
'''Reply'''
Reply-Topic: '''tft/runtime/out''' <syntaxhighlight lang="json">
{
  "id": "TIMESTAMP",
  "origin": "tft",
  "task": {
    "taskResult": {
      "success": true,
      "activeIndex": 0,
      "totalScreens": 3
    }
  }
}
</syntaxhighlight>


=== 30. Analoglnputs Actor ===
=== 30. SENSBLUE ATLAS in-the-field ===
[IMAGE PLACEHOLDER]

Latest revision as of 15:47, 9 June 2026

Datasheet

1. Table of SENSBLUE ATLAS Reference ID Model Number

Paxxxxxxxx
PAxxxxxxxx

2. General Description

SENSBLUE ATLAS is a single board computer that connects sensors and assets, runs control logic and ships to production without platform changes.

Designed for industrial teams who need one dependable path from experiments to operations.

2.1 Key Features

Processor:

  • Raspberry Pi CM4 (quad-core Cortex-A72)

I/O:

  • 12 DIO (8 Digital Outputs and 4 Digital Input)
  • 6 AIO (4 Analog Inputs and 2 Analog Outputs)
  • 2 relays

Industrial Bus:

  • RS-485
  • CAN
  • 2× Ethernet port (Independently managed)

Communication:

  • Integrated LTE
  • Wi-Fi
  • BLE
  • USB

Interface & Services:

  • 1.47″ IPS TFT display + joystick for local setup and feedback.
  • Includes 1 GB of data (up to 500 MB LTE + 500 MB DB storage) via sensblue.cloud — no external SIM required.
  • EU-hosted servers, TLS, weekly backups, VPN on request.
  • Other versions under request.

3. Hardware Specifications

Parameter Specification
Platform Raspberry Pi Compute Module 4 (CM4)
Processor Broadcom BCM2711 Quad-core Cortex-A72 (ARM v8)
CPU Frequency 1.5 GHz
RAM 4GB LPDDR4
Storage 32 GB eMMC
Selected Variant CM4102032-4 GB RAM/ 32 GB eMMC / Wi-Fi / BLE
PCle 1 x PCle Gen 2.0 (1 lane)
HDMI 1 interfaces
USB 2 x USB 2.0

4. Power

Parameter Specification
Input voltage 12-24 VDC ± 5%
Reverse polarity protection Yes
Overcurrent protection Resettable PTC fuse
Surge protection TVS clamp for transient events
Isolation No isolation
Typical consumption < 15 W
Maximum consumption 25 W (all peripherals active)

5. Digital Inputs

Parameter Specification
Channels 4
Input voltage 0-24 VDC
Logic LOW Acording to EN 61131-2 Type I and Ill
Logic HIGH Acording to EN 61131-2 Type I and Ill
Input type Sourcing (PNP)
Input current Acording to EN 61131-2 Type I and Ill
Isolation Funcional Safety Gavanic isolation
Isolation Voltage Functional isolation between channels on the field side +- 60V
Isolation Voltage DIN VDE V 0884-11 Maximum working isolation voltage 400V RMS
Isolation Voltage DIN VDE V 0884-11 Maximum surge isolation voltage 1 kV RMS
Special feature Can be used as fast inputs until 100Hz

5.1 Wiring

6. Digital Outputs (Relay)

Parameter Specification
Channels 2
Type Mechanical relay
Switching capacity 2 A@ 30 VDC
Isolation 1000 VAC galvanic isolation
Lifetime (nominal load) ≥ 100,000 cycles
Lifetime (no load) ≥ 100,000,000 cycles

6.1 Wiring

7. Digital Outputs (Transistor/ SSR)

Parameter Specification
Channels 8
Type PNP (sourcing) SSR
Maximum current 300 mA per channel
Maximum voltage 24 VDC
Isolation Funcional Safety Gavanic isolation
Isolation Voltage DIN VDE V 0884-17 Maximum transient isolation voltage 1 kV RMS

7.1 Wiring

8. Analog Inputs

Parameter Specification
Channels 4
Mode Voltage or current configurable per channel
Voltage range 0-10 V
Current range 0/4-20 mA
ADC resolution 16 bits
ADC Sample Rate 32 samples/sec
Accuracy ≤ ±1.0% FSR
Input impedance (voltage) > 100 kΩ
Input impedance (current) 100 Ω
Protection TVS + analog filtering
Sampling rate ≥ 10 Hz per channel
Isolation Funcional Safety Gavanic isolation
Isolation Voltage Maximum transient isolation voltage 1 kV RMS

8.1 Wiring

9. Analog Outputs

Parameter Specification
Channels 2
Output type Current
Range 0-20 mA
Optional range 4-20 mA (software configurable)
Resolution 12
Accuracy ≤ ±1.0% FSR
Isolation Funcional Safety Gavanic isolation
Isolation Voltage Maximum transient isolation voltage 1 kV RMS

9.1 Wiring

10. Communication Interfaces

10.1 Ethernet

Parameter Specification
Ports 2 x RJ45
Port 1 10/100 Mbps
Port 2 0/100/1000 Mbps (native CM4)
Indicators Link + Activity LEDs

10.2 RS-485

Parameter Specification
Mode Half-duplex
Control TX_EN line
Protocol Transparent/ any
Isolation None
10.2.1 Wiring

10.3 USB

Parameter Specification
Ports 2
Type USB-A
Standard USB 2.0 Host
Maximum current 400 mA per port
Protection Overcurrent protection

10.4 HDMI

Parameter Specification
Ports 1
Connector HDMI full-size
Maximum resolution Depends on CM4 and OS

11. RF Communications

Technology Specification
Wi-Fi Integrated in CM4
BLE Integrated in CM4
LTE M.2 NGFF modem SIM7600G
SIM External access

11.1  Antenna Connectors

Connector Usage
RP-SMA Wi-Fi / BLE
SMA LTE

12. Local Peripherals

Peripheral Description
Temperature sensor Internal board temperature monitoring
Non-volatile memory Persistent storage
Security IC Microchip ATECC608A
RTC Real Time Clock with battery backup

13. HDMI

13. 1 Display

Parameter Specification 
Type IPS TFT LCD
Interface SPI
Size 1.47"
Resolution ≥ 172 X 320
Backlight LED
Mounting Front mounted with transparent window

13. 2 Joystick

Parameter Specification 
Positions 5 (Up/ Down/ Left/ Right/ Enter)
Type Mechanical tactile switch
Interface GPIO Expander

14. Mechanical

Parameter Specification 
Mounting DIN rail (EN 60715)
Enclosure MAT0091092 (same as iSense / iCee)
Protection rating IP20
Mounting method DIN rail snap-fit

15. Environmental

Parameter Specification 
Operating temperature -10 °C to +60 °C
Storage temperature -20 °C to +80 °C
Humidity 5-95% non-condensing
Vibration IEC 60068-2-6
Shock IEC 60068-2-27

16. Certifications

Certification Standard  
CE Yes
EMC 2014/30/EU
Radio 2014/53/EU (RED)
Ro HS 2011/65/EU

17. Connectivity

Parameter Specification  
Connector type Pluggable System Terminal Block
Pitch 3.5 mm
Layout Dual-row
Identification Side panel silk screen
Fixation Mechanical locking or spring clamp
Protection Mechanical reverse insertion protection

18. Expansion

Feature Description 
Piggyback area Reserved PCB area
Compatibility Fully compatible with existing FW
Power rails available Vin, 5 V, 3.3 V
Interfaces available 12C, SPI, UART, GPIO
External 1/0 lines 32 lines routed to external connectors
Storage expansion M.2 NVMe SSD connector

19. External Interfaces

Front View


Bottom View


20. Pinouts

Top View

21. System Type

Raspian

Debian GNU/Linux 13 (trixie) Version 13.2 Linux atlas 6.12.47 +rpt-rpi-v8 #1 SMP PREEMPT

Debian 1 :6.12.47-1 +rpt1 (2025-09-16) aarch64 GNU/Linux.

22. Network Information

There is three ways to connect to the device. IP and state of the connection be checked on the LCD Network Interface.

22.1 Eth1 (ethO)

Client dynamic IP obtained by DHCP server.

22.2 Eth2 (eth1)

Static IP: 93.48.86.253

22.3 Access Point (wlanO)

IP: 192.168.30.1

23. Software Information

Node-Red Grafana lnfluxDB
Version 4.1.4 12.3.1 2.8.0
Port 1880 3000 8086
State Clean Clean Clean
Authentication None User/Pass (admin/admin) Not defined, configured on first time interface login.
GUI on http://<device-ip>:1880 http://<device-ip>:3000 http://<device-ip>:8086

24. MQTT Broker

port: 1883

address: AP-> 192.168.30.1

Eth1: 93.48.86.253

user: < not needed>

login <not needed>

24.1 Relay Outputs Actor

24.1.1 App Interfacing

User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credentials.

a) Set/reset digital output pin/pins state

Both relays default state is open.

Req-Topic: relayOutputs/config/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "D01": {
        "state": "open"
      },
      "D02": {
        "state": "open"
      }
    }
  }
}

Reply-Topic: relayOutputs/config/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "D01": {
        "success": true,
        "state": "open"
      },
      "D02": {
        "success": true,
        "state": "open"
      }
    }
  }
}
b) Get all relays state

Req-Topic: relayOutputs/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "READ"
  }
}

Reply-Topic: relayOutputs/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "D01": {
        "success": true,
        "state": "open"
      },
      "D02": {
        "success": true,
        "state": "close"
      }
    }
  }
}
c) Set all relays state

Req-Topic: relayOutputs/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SET",
    "taskParams": {
      "D01": {
        "state": "open"
      },
      "D02": {
        "state": "close"
      }
    }
  }
}

Reply-Topic: relayOutputs/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "D01": {
        "success": true,
        "state": "open"
      },
      "D02": {
        "success": true,
        "state": "close"
      }
    }
  }
}

24.2 RTC Actor

24.2.1 App Interfacing

User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.

a) Set timer/alarm interruption

mode: Timer, alarm or none.

alarmSet: Date and time for alarm interruption (No effect if mode is timer or none).

timerSetSeconds: Period in seconds for timer interruption (No effect if mode is alarm or none).

Req-Topic: clock/config/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "CLOCK_SET_MODE": {
        "mode": "timer",
        "alarmSet": "[timestamp epoch ms]",
        "timerSetSeconds": "<INT>"
      }
    }
  }
}

Req-Topic: clock/config/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true,
      "CLOCK_SET_MODE": {
        "mode": "timer",
        "alarmSet": "[timestamp epoch ms]",
        "timerSetSeconds": "<INT>"
      }
    }
  }
}
b) Toggle RTC sync logic (described below)

tcState: State of the synchronization logic of the RTC, this value is non-persistent so every-time a reboot happens the value return to default (by default the value is ON)

Req-Topic: clock/config/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "TOGGLE"
  }
}

Req-Topic: clock/config/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true,
      "rtcState": "OFF"
    }
  }
}
c) Read clock configs

mode: Timer, alarm or none.

alarmSet: Date and time for alarm interruption (No effect if mode is timer or none).

timerSetSeconds: Period in seconds for timer interruption (No effect if mode is alarm or none).

rtcState: Current state of the synchronization logic of the RTC.

Req-Topic: clock/config/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "READ"
  }
}

Reply-Topic: clock/config/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true,
      "CLOCK_CONFIGS": {
        "mode": "timer",
        "alarmSet": "[timestamp epoch ms]",
        "timerSetSeconds": "<INT>",
        "rtcState": "ON"
      }
    }
  }
}
d) Read clock

Req-Topic: clock/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true,
      "timestamp": "[timestamp epoch ms]"
    }
  }
}
24.2.2 Synchronization loop flowchart (every 30 seconds)

RTC Actor - Overview

24.3 Core System Health Actor

24.3.1 App Interfacing

User App interface and functionalities exposed to the open part of the MQTT broker.

This interface allows any external App to receive system-level metrics such as CPU load, RAM usage, disk usage, temperature, core frequency, system throttle status and uptime.

No credentials are required to subscribe to this topic.

The System Health Actor does not receive commands. It is fully autonomous and publishes its metrics every 1 second.

24.3.2 Runtime Data

Topic: systemHealth/runtime/out

Publish rate: 1 Hz (one message per second, clock-jump safe)

a) Metrics Provided
Key Description Unit
cpu_percent Current CPU load %
cpu_tempC CPU temperature read from Linux thermal zones ºC
cpu0_freq CPU Core O current frequency Hz
cpul_freq CPU Core 1 current frequency Hz
cpu2_freq CPU Core 2 current frequency Hz
cpu3_freq CPU Core 3 current frequency Hz
cpu0_throttle System throttle status register Hex
ram_percent RAM usage %
disk_percent Disk usage for filesystem root / %
uptime_sec Time since last reboot seconds

Example Payload (systemHealth/runtime/out)

{
  "id": <TIMESTAMP>,
  "origin": "system-health",
  "task": {
    "taskResult": {
      "cpu_percent": 7.1,
      "cpu_tempC": 47.3,
      "cpu0_freq": 1500000000,
      "cpu1_freq": 1500000000,
      "cpu2_freq": 1500000000,
      "cpu3_freq": 1500000000,
      "cpu0_throttle": "0x0",
      "ram_percent": 32.9,
      "disk_percent": 41.2,
      "uptime_sec": 5321
    }
  }
}
24.3.3 Peripherals health

  In order get the peripherals health we had to implement a SystemHealth actor in each bus manager (busi2c­O, busi2c-1, etc. ... ).


a) Example

For busi2c-0:

Reply topic: systemHealth/busi2c-0/runtime/out

Payload:

{
  "id": <TIMESTAMP>,
  "origin": "system-health-busi2c-0",
  "task": {
    "taskResult": {
      "ADC": {
        "status": "ERROR",
        "description": "IRQ Retrying",
        "last_report": 1770378753006,
        "stats": {
          "AI1": {
            "samples": 563154,
            "retries": 760548,
            "discards": 253313
          },
          "AI2": {
            "samples": 563154,
            "retries": 760475,
            "discards": 253314
          },
          "AI3": {
            "samples": 563154,
            "retries": 760528,
            "discards": 253313
          },
          "AI4": {
            "samples": 563154,
            "retries": 760549,
            "discards": 253312
          }
        }
      },
      "DAC": {
        "status": "OK",
        "description": "Running....",
        "last_report": 1770378752576,
        "stats": {
          "AO1": {
            "samples": 240755,
            "retries": 0,
            "discards": 0
          },
          "AO2": {
            "samples": 240755,
            "retries": 0,
            "discards": 0
          }
        }
      },
      "RTC": {
        "status": "OK",
        "description": "",
        "last_report": 1770378752094,
        "stats": {
          "samples": 248710,
          "retries": 0,
          "discards": 0
        }
      },
      "TEMP": {
        "status": "OK",
        "description": "",
        "last_report": 1770378752579,
        "stats": {
          "samples": 240754,
          "retries": 0,
          "discards": 0
        }
      }
    }
  }
}

For busi2c-1:

Reply topic: systemHealth/busi2c-1/runtime/out

Payload:

{
  "id": <TIMESTAMP>,
  "origin": "system-health-busi2c-1",
  "task": {
    "taskResult": {
      "JOYSTICK": {
        "status": "OK",
        "description": "Running....",
        "last_report": 1770382405050,
        "stats": {
          "read_all": {
            "samples": 410154,
            "retries": 0,
            "discards": 0
          },
          "read_raw": {
            "samples": 0,
            "retries": 0,
            "discards": 0
          },
          "buttons": {
            "JDOWN": {
              "reads": 410154,
              "last_state": "pressed"
            },
            "JRIGHT": {
              "reads": 410154,
              "last_state": "pressed"
            },
            "JUP": {
              "reads": 410154,
              "last_state": "pressed"
            },
            "JLEFT": {
              "reads": 410154,
              "last_state": "pressed"
            },
            "JCENTER": {
              "reads": 410154,
              "last_state": "pressed"
            }
          }
        }
      },
      "RELAYS": {
        "status": "OK",
        "description": "Relay Output MQTT connected",
        "last_report": 1770298859099,
        "stats": {
          "read_all": {
            "samples": 0,
            "retries": 0,
            "discards": 0
          },
          "set": {
            "samples": 0,
            "retries": 0,
            "discards": 0
          },
          "set_many": {
            "samples": 0,
            "retries": 0,
            "discards": 0
          },
          "raw_read_all": {
            "samples": 0,
            "retries": 0,
            "discards": 0
          }
        },
        "outputs": {
          "DO1": {
            "writes": 0,
            "last_state": "unknown"
          },
          "DO2": {
            "writes": 0,
            "last_state": "unknown"
          }
        }
      },
      "DI": {
        "status": "OK",
        "description": "Running",
        "last_report": 1770382404832,
        "stats": {
          "read_all": {
            "samples": 181758,
            "retries": 0,
            "discards": 0
          },
          "read_raw": {
            "samples": 0,
            "retries": 0,
            "discards": 0
          },
          "inputs": {
            "DI1": {
              "reads": 181758,
              "last_state": "low"
            },
            "DI2": {
              "reads": 181758,
              "last_state": "low"
            },
            "DI3": {
              "reads": 181758,
              "last_state": "low"
            },
            "DI4": {
              "reads": 181758,
              "last_state": "low"
            }
          }
        }
      }
    }
  }
}
24.3.4 Commands
a) List usb devices

The list_usb_devices action returns a parsed list of USB devices detected on the system using the lsusb command.

Req-topic: systemHealth/runtime/in

{
"id": <TIMESTAMP>,
"origin": "Dev",
"task": {
   "action": "LIST_USB_DEVICES"
 }
}

Reply-topic: systemHealth/runtime/usb/devices/out

{
"id": <TIMESTAMP>,
"origin": "system-health",
"task": {
  "action": "list_usb_devices",
  "taskResult": {
     "usb_devices": {
       "success": true,
       "command": "lsusb",
       "returncode": 0,
       "devices": [ 
         {
           "bus": "001",
           "device": "001",
           "vendor_id": "1d6b",
           "product_id": "0002",
           "description": "Linux Foundation 2.0 root hub",
           "parsed": true
         },
         {
           "bus": "001",
           "device": "002",
           "vendor_id": "0424",
           "product_id": "9514",
           "description": "Microchip Technology, Inc. (formerly SMSC) SMC9514 Hub",
           "parsed": true
         },
         {
           "bus": "001",
           "device": "003",
           "vendor_id": "0424",
           "product_id": "ec00",
           "description": "Microchip Technology, Inc. (formerly SMSC) SMSC9512/9514 Fast Ethernet Adapter",
           "parsed": true
         },
         {
           "bus": "001",
           "device": "004",
           "vendor_id": "1e0e",
           "product_id": "9001",
           "description": "Qualcomm / Option SimTech, Incorporated",
           "parsed": true
         }
       ],
       "stderr": ""
      }
    }
  }
}
JSON Path Type Example Description
id string /number "get-hw-info-001" Request identifier echoed back in the response.
origin string "system-health" Actor/device that generated the response.
task object {...} Container for the action response.
task.action string "list_usb_devices" Action executed by the actor.
task.taskResult object {...} Main result object for the action.
task.taskResult.usb_devices object {...} Contains the USB device scan result.
task.taskResult.usb_devices.success boolean true Indicates whether the lsusb

commandexecuted successfully.

task.taskResult.usb_devices.command string "lsusb" Command used to collect USB information.
task.taskResult.usb_devices.returncode number /null 0 Process return code. 0 means success. null

means the command was not executed ortimed out.

task.taskResult.usb_devices.devices array [...] List of USB devices detected by lsusb.
task.taskResult.usb_devices.devices[ ].bus string "001" USB bus number where the device wasdetected.
task.taskResult.usb_devices.devices[ ].device string "004" USB device number assigned on that bus.
task.taskResult.usb_devices.devices[ ].vendor_id string "1e0e" USB vendor ID in hexadecimal format.
task.taskResult.usb_devices.devices[ ].product_id string "9001" USB product ID in hexadecimal format.
task.taskResult.usb_devices.devices[ ].description string "Qualcomm / Option SimTech,Incorporated" Human-readable device description returnedby lsusb.
task.taskResult.usb_devices.devices[ ].parsed boolean true Indicates whether the lsusb line was parsed successfully.
task.taskResult.usb_devices.devices[ ].raw string Optional Present only when a device line could not beparsed.

Contains the original raw lsusb line.

task.taskResult.usb_devices.stderr string " " Error output from the command. Empty stringmeans no error.
b) List connectivity specs

The list_connectivity_specs action allows the SystemHealth Actor to return connectivity information for the device, including the status of:

  • Wi-Fi
  • LTE modem
  • eth0
  • eth1
  • Tunnel interfaces, for possible commissioning use

Req-topic: systemHealth/runtime/in

{
"id": "connectivity-001",
"origin": "APP",
"task": {
  "action": "list_connectivity_specs"
 }
}

Reply-topic: systemHealth/runtime/connectivity/out

{
  "id": "<TIMESTAMP>",
  "origin": "system-health",
  "task": {
    "action": "list_connectivity_specs",
    "taskResult": {
      "connectivity": {
        "sources": {
          "sysfs": "/sys/class/net",
          "ip_link": {
            "available": true,
            "command": "ip -j -d link show",
            "error": null
          },
          "network_manager": {
            "available": true,
            "command": "nmcli -t -f DEVICE,TYPE,STATE,CONNECTION device status",
            "error": null
          }
        },
        "interfaces": {
          "wifi": {
            "available": true,
            "interfaces": [
              {
                "interface": "wlan0",
                "available": true,
                "status": "down",
                "operstate": "down",
                "admin_up": true,
                "carrier": false,
                "mtu": 1500,
                "type": 1,
                "link_kind": null,
                "mac_address": "2c:cf:67:fd:60:40",
                "ipv4": [],
                "ipv6": [],
                "network_manager": {
                  "device": "wlan0",
                  "type": "wifi",
                  "state": "disconnected",
                  "connection": null
                },
                "wifi": {
                  "available": true,
                  "command": "iw dev wlan0 link",
                  "connected": false
                }
              }
            ]
          },
          "lte_modem": {
            "available": true,
            "tool_available": true,
            "command": "mmcli -L",
            "modems": [
              {
                "id": "0",
                "success": true,
                "command": "mmcli -m 0 --output-json",
                "manufacturer": "QUALCOMM INCORPORATED",
                "model": "SIMCOM_SIM7600G-H",
                "revision": "LE20B04SIM7600G22",
                "hardware_revision": "10000",
                "device": "/sys/devices/platform/scb/fe9c0000.xhci/usb1/1-1/1-1.4",
                "drivers": [
                  "qmi_wwan",
                  "option"
                ],
                "plugin": "simtech",
                "primary_port": "cdc-wdm0",
                "ports": [
                  {
                    "name": "cdc-wdm0",
                    "type": "qmi"
                  },
                  {
                    "name": "ttyUSB0",
                    "type": "ignored"
                  },
                  {
                    "name": "ttyUSB1",
                    "type": "gps"
                  },
                  {
                    "name": "ttyUSB2",
                    "type": "at"
                  },
                  {
                    "name": "ttyUSB3",
                    "type": "at"
                  },
                  {
                    "name": "ttyUSB4",
                    "type": "audio"
                  },
                  {
                    "name": "wwan0",
                    "type": "net"
                  }
                ],
                "state": "failed",
                "power_state": "on",
                "access_technologies": [],
                "signal_quality": {
                  "recent": "yes",
                  "value": "0"
                },
                "current_capabilities": [
                  "gsm-umts, lte"
                ],
                "supported_capabilities": [
                  "gsm-umts, lte"
                ],
                "operator_code": "--",
                "operator_name": "--",
                "registration_state": "--",
                "packet_service_state": "--",
                "sim_path": null
              }
            ],
            "network_interfaces": [
              {
                "interface": "wwan0",
                "available": true,
                "status": "down",
                "operstate": "down",
                "admin_up": false,
                "carrier": null,
                "mtu": 1500,
                "type": 65534,
                "link_kind": null,
                "mac_address": null,
                "ipv4": [],
                "ipv6": [],
                "network_manager": null
              }
            ]
          },
          "eth0": {
            "interface": "eth0",
            "available": true,
            "status": "connected",
            "operstate": "up",
            "admin_up": true,
            "carrier": true,
            "mtu": 1500,
            "type": 1,
            "link_kind": null,
            "mac_address": "2c:cf:67:fd:60:3f",
            "ipv4": [
              {
                "address": "172.16.20.57",
                "prefixlen": 24,
                "scope": "global",
                "dynamic": true
              }
            ],
            "ipv6": [
              {
                "address": "fe80::7fc1:f65f:5729:d234",
                "prefixlen": 64,
                "scope": "link",
                "dynamic": false
              }
            ],
            "network_manager": {
              "device": "eth0",
              "type": "ethernet",
              "state": "connected",
              "connection": "wired-ip-dynamic"
            }
          },
          "eth1": {
            "interface": "eth1",
            "available": true,
            "status": "unavailable",
            "operstate": "down",
            "admin_up": true,
            "carrier": false,
            "mtu": 1500,
            "type": 1,
            "link_kind": null,
            "mac_address": "2c:cf:67:fd:60:41",
            "ipv4": [],
            "ipv6": [],
            "network_manager": {
              "device": "eth1",
              "type": "ethernet",
              "state": "unavailable",
              "connection": null
            }
          },
          "tunnel": {
            "available": false,
            "interfaces": []
          }
        }
      }
    }
  }
}
Field Type Description
id string/number Request/response identifier used to correlate therequest with the response.
origin string Origin of the message. In the response, this is normallythe SystemHealth actor name.
task.action string Executed action. For this feature, the value is list_connectivity_specs.
task.taskResult.connectivity.sources.sysfs string Linux sysfs path used to discover network interfaces, usually/sys/class/net.
task.taskResult.connectivity.sources.ip_link.available boolean Indicates whether the ip command was available andexecuted successfully.
task.taskResult.connectivity.sources.ip_link.command string Command used to retrieve detailed link information,for example ip -j -d link show.
task.taskResult.connectivity.sources.ip_link.error string/null Error returned by the ip command, or null if no erroroccurred.
task.taskResult.connectivity.sources.network_manager.available boolean Indicates whether NetworkManager / nmcli was available and executed successfully.
task.taskResult.connectivity.sources.network_manager.command string Command used to retrieve NetworkManager device status.
task.taskResult.connectivity.sources.network_manager.error string/null Error returned by nmcli, or null if no error occurred.
task.taskResult.connectivity.interfaces.wifi.available boolean Indicates whether at least one Wi-Fi interface was found.
task.taskResult.connectivity.interfaces.wifi.interfaces[ ] array List of detected Wi-Fi interfaces, usually including wlan0 when Wi-Fi exists.
wifi.interfaces[ ].interface string Linux interface name, for example wlan0.
wifi.interfaces[ ].available boolean Indicates whether the Wi-Fi interface exists in the system.
wifi.interfaces[ ].status string Normalized interface status, for example connected, down, unavailable, no_carrier, or not_available.
wifi.interfaces[ ].operstate string / null Operational state reported by Linux, for example up, down, or unknown.
wifi.interfaces[ ].admin_up boolean / null Indicates whether the interface is administratively enabled.
wifi.interfaces[ ].carrier boolean / null Indicates whether carrier/link is detected.
wifi.interfaces[ ].mtu number / null Maximum Transmission Unit of the interface.
wifi.interfaces[ ].type number / null Linux interface type.
wifi.interfaces[ ].link_kind string / null Special link type, used mainly for virtual/tunnel interfaces. Usually null for normal Wi-Fi.
wifi.interfaces[ ].mac_address string / null MAC address of the Wi-Fi interface.
wifi.interfaces[ ].ipv4[ ] array List of IPv4 addresses configured on the Wi-Fi interface.
wifi.interfaces[ ].ipv6[ ] array List of IPv6 addresses configured on the Wi-Fi interface.
wifi.interfaces[ ].network_manager.device string NetworkManager device name.
wifi.interfaces[ ].network_manager.type string NetworkManager interface type, usually wifi.
wifi.interfaces[ ].network_manager.state string NetworkManager state, for example connected, disconnected, or unavailable.
wifi.interfaces[ ].network_manager.connection string / null Active NetworkManager profile name, or null if none is active.
wifi.interfaces[ ].wifi.available boolean Indicates whether Wi-Fi details could be queried using iw.
wifi.interfaces[ ].wifi.command string Command used to query Wi-Fi link state, for example iw dev wlan0 link.
wifi.interfaces[ ].wifi.connected boolean / null Indicates whether the Wi-Fi interface is associated with a Wi-Fi network.
wifi.interfaces[ ].wifi.ssid string SSID of the connected Wi-Fi network, when connected.
wifi.interfaces[ ].wifi.bssid string BSSID/MAC address of the connected access point, when connected.
wifi.interfaces[ ].wifi.frequency_mhz number Wi-Fi frequency in MHz, when connected.
wifi.interfaces[ ].wifi.signal_dbm number Wi-Fi signal strength in dBm, when available.
wifi.interfaces[ ].wifi.tx_bitrate string Wi-Fi transmit bitrate, when available.
wifi.interfaces[ ].wifi.rx_bitrate string Wi-Fi receive bitrate, when available.
task.taskResult.connectivity.interfaces.lte_modem.available boolean Indicates whether at least one LTE modem was detected.
task.taskResult.connectivity.interfaces.lte_modem.tool_available boolean Indicates whether mmcli / ModemManager is available.
task.taskResult.connectivity.interfaces.lte_modem.command string Command used to list LTE modems, usually mmcli -L.
task.taskResult.connectivity.interfaces.lte_modem.modems[ ] array List of LTE modems detected by ModemManager.
lte_modem.modems[ ].id string Modem ID in ModemManager, for example 0.
lte_modem.modems[ ].success boolean Indicates whether detailed modem information wasread successfully.
lte_modem.modems[ ].command string Command used to read modem details, for example mmcli -m 0 --output-json.
lte_modem.modems[ ].manufacturer string / null Modem manufacturer.
lte_modem.modems[ ].model string / null Modem model.
lte_modem.modems[ ].revision string / null Modem firmware/software revision.
lte_modem.modems[ ].hardware_revision string / null Modem hardware revision.
lte_modem.modems[ ].device string / null Sysfs/USB path of the modem device.
lte_modem.modems[ ].drivers[ ] array Linux drivers associated with the modem, for example qmi_wwan or option.
lte_modem.modems[ ].plugin string / null ModemManager plugin used to manage the modem.
lte_modem.modems[ ].primary_port string / null Primary modem control port, for example cdc-wdm0.
lte_modem.modems[ ].ports[ ] array List of ports associated with the modem.
lte_modem.modems[ ].ports[ ].name string Port/interface name, for example cdc-wdm0, ttyUSB2, or wwan0.
lte_modem.modems[ ].ports[ ].type string / null Port type, for example qmi, at, gps, audio, net, or ignored.
lte_modem.modems[ ].state string / null General modem state according to ModemManager,for example registered, connected, or failed.
lte_modem.modems[ ].power_state string / null Modem power state, for example on, off, or low.
lte_modem.modems[ ].access_technologies[ ] array Current access technologies in use, for example LTE,UMTS, or GSM.
lte_modem.modems[ ].signal_quality.recent string / null Indicates whether the signal quality value is recent.
lte_modem.modems[ ].signal_quality.value string / number / null Signal quality value reported by the modem.
lte_modem.modems[ ].current_capabilities[ ] array Current modem capabilities.
lte_modem.modems[ ].supported_capabilities[ ] array Capabilities supported by the modem.
lte_modem.modems[ ].operator_code string / null MCC/MNC operator code.
lte_modem.modems[ ].operator_name string / null Operator name.
lte_modem.modems[ ].registration_state string / null Mobile network registration state.
lte_modem.modems[ ].packet_service_state string / null Mobile packet data service state.
lte_modem.modems[ ].sim_path string / null SIM path in ModemManager, when available.
task.taskResult.connectivity.interfaces.lte_modem.network_interfaces[] array List of Linux network interfaces associated with the LTE modem, usually wwan0.
lte_modem.network_interfaces[ ].interface string LTE network interface name, for example wwan0.
lte_modem.network_interfaces[ ].available boolean Indicates whether the LTE network interface exists.
lte_modem.network_interfaces[ ].status string Normalized LTE network interface status.
lte_modem.network_interfaces[ ].operstate string / null Operational state reported by Linux.
lte_modem.network_interfaces[ ].admin_up boolean / null Indicates whether the LTE network interface is administratively enabled.
lte_modem.network_interfaces[ ].carrier boolean / null Indicates whether carrier/link information is availableand active.
lte_modem.network_interfaces[ ].mtu number / null Maximum Transmission Unit of the LTE network interface.
lte_modem.network_interfaces[ ].type number / null Linux interface type.
lte_modem.network_interfaces[ ].link_kind string / null Link kind, when available.
lte_modem.network_interfaces[ ].mac_address string / null MAC address, when available.
lte_modem.network_interfaces[ ].ipv4[ ] array IPv4 addresses configured on the LTE network interface.
lte_modem.network_interfaces[ ].ipv6[ ] array IPv6 addresses configured on the LTE network interface.
lte_modem.network_interfaces[ ].network_manager object / null NetworkManager information for the LTE interface, when available.
task.taskResult.connectivity.interfaces.eth0.interface string Ethernet interface name, eth0.
task.taskResult.connectivity.interfaces.eth0.available boolean Indicates whether eth0 exists.
task.taskResult.connectivity.interfaces.eth0.status string Normalized eth0 status.
task.taskResult.connectivity.interfaces.eth0.operstate string / null Operational state of eth0.
task.taskResult.connectivity.interfaces.eth0.admin_up boolean / null Indicates whether eth0 is administratively enabled.
task.taskResult.connectivity.interfaces.eth0.carrier boolean / null Indicates whether eth0 has physical link.
task.taskResult.connectivity.interfaces.eth0.mtu number / null MTU of eth0.
task.taskResult.connectivity.interfaces.eth0.type number / null Linux interface type of eth0.
task.taskResult.connectivity.interfaces.eth0.link_kind string / null Link kind of eth0, usually null.
task.taskResult.connectivity.interfaces.eth0.mac_address string / null MAC address of eth0.
task.taskResult.connectivity.interfaces.eth0.ipv4[ ] array IPv4 addresses configured on eth0.
task.taskResult.connectivity.interfaces.eth0.ipv6[ ] array IPv6 addresses configured on eth0.
task.taskResult.connectivity.interfaces.eth0.network_manager object / null NetworkManager information for eth0.
task.taskResult.connectivity.interfaces.eth1.interface string Ethernet interface name, eth1.
task.taskResult.connectivity.interfaces.eth1.available boolean Indicates whether eth1 exists.
task.taskResult.connectivity.interfaces.eth1.status string Normalized eth1 status.
task.taskResult.connectivity.interfaces.eth1.operstate string / null Operational state of eth1.
task.taskResult.connectivity.interfaces.eth1.admin_up boolean / null Indicates whether eth1 is administratively enabled.
task.taskResult.connectivity.interfaces.eth1.carrier boolean / null Indicates whether eth1 has physical link.
task.taskResult.connectivity.interfaces.eth1.mtu number / null MTU of eth1.
task.taskResult.connectivity.interfaces.eth1.type number / null Linux interface type of eth1.
task.taskResult.connectivity.interfaces.eth1.link_kind string / null Link kind of eth1, usually null.
task.taskResult.connectivity.interfaces.eth1.mac_address string / null MAC address of eth1.
task.taskResult.connectivity.interfaces.eth1.ipv4[ ] array IPv4 addresses configured on eth1.
task.taskResult.connectivity.interfaces.eth1.ipv6[ ] array IPv6 addresses configured on eth1.
task.taskResult.connectivity.interfaces.eth1.network_manager object / null NetworkManager information for eth1.
task.taskResult.connectivity.interfaces.tunnel.available boolean Indicates whether at least one tunnel interface was detected.
task.taskResult.connectivity.interfaces.tunnel.interfaces[ ] array List of detected tunnel interfaces, for example tun0, tap0, wg0, or tailscale0.
tunnel.interfaces[ ].interface string Tunnel interface name.
tunnel.interfaces[ ].available boolean Indicates whether the tunnel interface exists.
tunnel.interfaces[ ].status string Normalized tunnel interface status.
tunnel.interfaces[ ].operstate string / null Operational state reported by Linux.
tunnel.interfaces[ ].admin_up boolean / null Indicates whether the tunnel interface isadministratively enabled.
tunnel.interfaces[ ].carrier boolean / null Carrier/link information, when available.
tunnel.interfaces[ ].mtu number / null Tunnel interface MTU.
tunnel.interfaces[ ].type number / null Linux interface type.
tunnel.interfaces[ ].link_kind string / null Tunnel link kind, for example tun, tap, or wireguard.
tunnel.interfaces[ ].mac_address string / null MAC address, when available.
tunnel.interfaces[ ].ipv4[ ] array IPv4 addresses configured on the tunnel interface.
tunnel.interfaces[ ].ipv6[ ] array IPv6 addresses configured on the tunnel interface.
tunnel.interfaces[ ].network_manager object / null NetworkManager information for the tunnel interface, when available.
ipv4[ ].address string IPv4 address assigned to the interface.
ipv4[ ].prefixlen number IPv4 network prefix length. Example: 24.
ipv4[ ].scope string IPv4 scope, for example global.
ipv4[ ].dynamic boolean Indicates whether the IPv4 address was dynamically assigned.
ipv6[ ].address string IPv6 address assigned to the interface.
ipv6[ ].prefixlen number IPv6 network prefix length.
ipv6[ ].scope string IPv6 scope, for example link or global.
ipv6[].dynamic boolean Indicates whether the IPv6 address was dynamically assigned.
c) Get hardware info

Req-topic: systemHealth/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "Dev",
  "task": {
    "action": "GET_HW_INFO"
  }
}

Reply-topic: systemHealth/runtime/hw/info/out

{
  "id": "<TIMESTAMP>",
  "origin": "system-health",
  "task": {
    "action": "get_hw_info",
    "taskResult": {
      "cpu": {......},
      "ram": {......},
      "emmc": {......},
      "block_devices": {......},
      "filesystems": {......},
      "mmc_sysfs": {......},
      "emmc_extcsd": {......}
    }
  }
}
Section Description
cpu CPU and board model information.
ram RAM total, used, and free memory.
emmc Filtered eMMC device and partition information.
block_devices Complete block device list from lsblk, including eMMC, boot partitions, loop devices, zram, NVMe, USB storage, etc.
filesystems Mounted filesystem usage from df -h.
mmc_sysfs Low-level MMC/eMMC identity fields read from /sys/block/mmcblk*/device.
emmc_extcsd Parsed eMMC EXT_CSD information from mmc extcsd read, including health, revision, RPMB, boot, and partitioning data.
  • CPU

The cpu object describes the detected board and CPU.

{
  "board_model": "Raspberry Pi Compute Module 4 Rev 1.1",
  "cpu": {
    "architecture": "aarch64",
    "op_modes": "32-bit, 64-bit",
    "byte_order": "Little Endian",
    "vendor": "ARM",
    "model_name": "Cortex-A72",
    "model": "3",
    "stepping": "r0p3",
    "cpu_count": 4,
    "online_cpus": "0-3",
    "threads_per_core": 1,
    "cores_per_cluster": 4,
    "clusters": 1,
    "frequency": {
      "scaling_percent": 60.0,
      "min_mhz": 600.0,
      "max_mhz": 1500.0,
      "bogomips": 108.0
    }
  }
}
Field Type Description
board_model string / null Hardware board model read from device-tree.
cpu.architecture string CPU architecture, for example aarch64.
cpu.op_modes string Supported CPU operation modes.
cpu.byte_order string CPU byte order.
cpu.vendor string CPU vendor.
cpu.model_name string CPU model name.
cpu.model string / number CPU model identifier.
cpu.stepping string CPU stepping/revision.
cpu.cpu_count number Number of detected CPU cores.
cpu.online_cpus string Online CPU list.
cpu.threads_per_core number Number of threads per core.
cpu.cores_per_cluster number Number of cores per cluster.
cpu.clusters number Number of CPU clusters.
cpu.frequency.scaling_percent number / null Current CPU frequency scaling percentage.
cpu.frequency.min_mhz number / null Minimum CPU frequency in MHz.
cpu.frequency.max_mhz number / null Maximum CPU frequency in MHz.
cpu.frequency.bogomips number / null BogoMIPS value reported by the system.
  • RAM

The ram object reports system memory usage.

Field Type Description
total string Total system RAM.
used string Currently used RAM.
free string Currently free RAM.
  • EMMC

The emmc object is a filtered eMMC view. It focuses on the main eMMC disk and its partitions.

{
  "devices": [
    {
      "name": "mmcblk0",
      "model": null,
      "serial": "0x121b491e",
      "size": "29.1G",
      "type": "disk",
      "transport": "mmc",
      "filesystem": null,
      "mountpoints": [],
      "partitions": [
        {
          "name": "mmcblk0p1",
          "size": "512M",
          "type": "part",
          "filesystem": "vfat",
          "mountpoints": [
            "/boot/firmware"
          ]
        },
        {
          "name": "mmcblk0p2",
          "size": "28.6G",
          "type": "part",
          "filesystem": "ext4",
          "mountpoints": [
            "/"
          ]
        }
      ]
    }
  ]
}

Device fields

Field Type Description
devices[ ] array List of detected main eMMC devices.
devices[ ].serial string / null eMMC block device name, for example mmcblk0.
devices[ ].size string Device model, when available.
devices[ ].type string Device serial number.
devices[ ].transport string / null Device size.
devices[ ].filesystem string / null Device type, usually disk.
devices[ ].mountpoints array Transport type, usually mmc.
devices[ ].partitions array Filesystem directly on the disk. Usually null when partitions exist.
devices[ ].name string Mountpoints directly associated with the disk.
devices[ ].model string / null Partitions belonging to this eMMC disk.

Partition fields

Field Type Description
name string Partition name, for example mmcblk0p1.
size string Partition size.
type string Partition type, usually part.
filesystem string / null Filesystem type, for example vfat or ext4.
mountpoints array Mountpoints for the partition.
d) block_devices

The block_devices object is the complete storage/device tree returned by lsblk.

{
  "devices": [
    {
      "name": "mmcblk0",
      "model": null,
      "serial": "0x121b491e",
      "size": "29.1G",
      "type": "disk",
      "transport": "mmc",
      "filesystem": null,
      "mountpoints": [],
      "children": [
        {
          "name": "mmcblk0p1",
          "model": null,
          "serial": null,
          "size": "512M",
          "type": "part",
          "transport": "mmc",
          "filesystem": "vfat",
          "mountpoints": [
            "/boot/firmware"
          ],
          "children": []
        }
      ]
    }
  ],
  "stderr": ""
}
Field Type Description
devices array List of block devices.
stderr string Command error output, if any.
devices[index].name string Device name.
devices[index].model string / null Device model.
devices[index].serial string / null Device serial number.
devices[index].size string Device size.
devices[index].type string Device type, for example disk , part , or loop.
devices[index].transport string / null Transport type, for example mmc , nvme , or usb.
devices[index].filesystem string / null Filesystem type, for example ext4 , vfat , or swap.
devices[index].mountpoints array List of mountpoints. Empty if not mounted.
devices[index].children array Child block devices, usually partitions.
e) file_systems

The file_systems object reports mounted filesystem usage, equivalent to df -h.

{
  "filesystems": [
    {
      "source": "/dev/mmcblk0p2",
      "filesystem": "ext4",
      "size": "29G",
      "used": "5.8G",
      "available": "23G",
      "use_percent": "21%",
      "mountpoint": "/",
      "parsed": true
    },
    {
      "source": "/dev/nvme0n1p1",
      "filesystem": "ext4",
      "size": "234G",
      "used": "2.1M",
      "available": "222G",
      "use_percent": "1%",
      "mountpoint": "/mnt/nvme",
      "parsed": true
    }
  ],
  "stderr": ""
}
Field Type Description
filesystems array List of mounted filesystems.
stderr string Command error output, if any.
filesystems[index].source string Filesystem source, for example /dev/mmcblk0p2 , tmpfs , or udev.
filesystems[index].filesystem string Filesystem type, for example ext4 , vfat , tmpfs , or devtmpfs.
filesystems[index].size string Total filesystem size.
filesystems[index].used string Used space.
filesystems[index].available string Available space.
filesystems[index].use_percent string Used percentage.
filesystems[index].mountpoint string Mount location.
filesystems[index].parsed boolean true if the parser successfully parsed this filesystem entry.
f) mmc_sysfs

The mmc_sysfs object exposes low-level MMC/eMMC identity fields read from:

/sys/block/mmcblk*/device/

This is useful for production traceability, device identification and diagnostics.

{
  "source": "/sys/block",
  "fields": [
    "name",
    "cid",
    "csd",
    "date",
    "manfid",
    "oemid",
    "serial"
  ],
  "devices": [
    {
      "device": "mmcblk0",
      "base_path": "/sys/block/mmcblk0/device",
      "available": true,
      "fields": {
        "name": "BJTD4R",
        "cid": "150100424a5444345203121b491e7b00",
        "csd": "d02701320f5903fff6dbffef8e404000",
        "date": "07/2024",
        "manfid": "0x000015",
        "oemid": "0x0100",
        "serial": "0x121b491e"
      }
    }
  ]
}
Field Type Description
source string Base sysfs source path.
fields array List of sysfs fields collected.
devices array List of detected MMC/eMMC devices.
devices[index].device string MMC block device name, for example mmcblk0.
devices[index].base_path string Sysfs path used for this device.
devices[index].available boolean Indicates whether the sysfs path exists.
devices[index].fields.name string / null eMMC product name.
devices[index].fields.cid string / null Card Identification register.
devices[index].fields.csd string / null Card Specific Data register.
devices[index].fields.date string / null Manufacturing date.
devices[index].fields.manfid string / null Manufacturer ID.
devices[index].fields.oemid string / null OEM/application ID.
devices[index].fields.serial string / null eMMC serial number.
e) emmc_extcsd

The emmc_extcsd object contains parsed information from:

mmc extcsd read /dev/mmcblk0

Category Description
revision EXT_CSD and MMC version.
health eMMC lifetime and pre-EOL state.
boot Boot partition/protection configuration.
rpmb Replay Protected Memory Block information.
sector Sector count and capacity information, when available.
partitioning Partitioning and enhanced-area information.

emmc_extcsd.devices[ ].revision

{
  "ext_csd_revision": "1.8",
  "mmc_version": "MMC 5.1"
}
Field Type Description
ext_csd_revision string EXT_CSD revision.
mmc_version string MMC/eMMC standard version.

emmc_extcsd.devices[ ].health

{
  "life_time_estimation_a": {
    "field": {
      "register": "DEVICE_LIFE_TIME_EST_TYP_A",
      "index": null,
      "description": "eMMC Life Time Estimation A",
      "value": "0x01",
      "value_int": 1,
      "value_hex": "0x1"
    },
    "decoded": {
      "state": "normal",
      "used_percent_min": 0,
      "used_percent_max": 10
    }
  },
  "life_time_estimation_b": {
    "field": {
      "register": "DEVICE_LIFE_TIME_EST_TYP_B",
      "index": null,
      "description": "eMMC Life Time Estimation B",
      "value": "0x01",
      "value_int": 1,
      "value_hex": "0x1"
    },
    "decoded": {
      "state": "normal",
      "used_percent_min": 0,
      "used_percent_max": 10
    }
  },
  "pre_eol": {
    "field": {
      "register": "PRE_EOL_INFO",
      "index": null,
      "description": "eMMC Pre EOL information",
      "value": "0x01",
      "value_int": 1,
      "value_hex": "0x1"
    },
    "decoded": {
      "state": "normal"
    }
  }
}
Field Description
life_time_estimation_a Wear estimation for eMMC memory type A.
life_time_estimation_b Wear estimation for eMMC memory type B.
pre_eol Pre-end-of-life state.

Lifetime Decoding

Raw Value Decoded State Meaning
0x00 not_defined Not defined by device.
0x01 normal 0% to 10% estimated lifetime used.
0x02 normal 10% to 20% estimated lifetime used.
0x03 normal 20% to 30% estimated lifetime used.
0x04 normal 30% to 40% estimated lifetime used.
0x05 normal 40% to 50% estimated lifetime used.
0x06 normal 50% to 60% estimated lifetime used
0x07 normal 60% to 70% estimated lifetime used.
0x08 normal 70% to 80% estimated lifetime used.
0x09 normal 80% to 90% estimated lifetime used.
0x0A normal 90% to 100% estimated lifetime used.
0x0B exceeded Estimated maximum lifetime exceeded.

Pre-EOL Decoding

Raw Value Decoded State Meaning
0x00 not_defined Not defined.
0x01 normal Normal condition.
0x02 warning Warning state. Monitor or plan replacement.
0x03 urgent Urgent state. Replacement recommended.

emmc_extcsd.devices[ ].boot

{
  "partition_config": {
    "field": null,
    "decoded": null
  },
  "boot_config_protection": null,
  "boot_bus_conditions": null,
  "boot_write_protection": {
    "register": "BOOT_WP",
    "index": null,
    "description": "Boot Area Write protection",
    "value": "0x00",
    "value_int": 0,
    "value_hex": "0x0"
  },
  "boot_size": {
    "field": null,
    "decoded": null
  }
}
Field Type Description
partition_config object / null Boot partition configuration, if available.
boot_config_protection object / null Boot configuration protection status.
boot_bus_conditions object / null Boot bus width/mode conditions.
boot_write_protection object / null Boot area write protection status.
boot_size object / null Boot partition size, if available.

emmc_extcsd.devices[ ].rpmb

RPMB means Replay Protected Memory Block. It is a protected eMMC area often used for secure storage.

{
  "size": {
    "field": {
      "register": "RPMB_SIZE_MULT",
      "index": null,
      "description": "RPMB Size",
      "value": "0x20",
      "value_int": 32,
      "value_hex": "0x20"
    },
    "decoded": {
      "bytes": 4194304,
      "kb": 4194.3,
      "mb": 4.19,
      "gb": 0.0,
      "kib": 4096.0,
      "mib": 4.0,
      "gib": 0.0
    }
  }
}
Field Type Description
size.field object / null Raw RPMB size register information.
size.decoded.bytes number RPMB size in bytes.
size.decoded.kb number RPMB size in decimal KB.
size.decoded.mb number RPMB size in decimal MB.
size.decoded.gb number RPMB size in decimal GB.
size.decoded.kib number RPMB size in KiB.
size.decoded.mib number RPMB size in MiB.
size.decoded.gib number RPMB size in GiB.

emmc_extcsd.devices[ ].sector

{
  "sector_count": null,
  "sector_size_bytes": 512,
  "user_capacity": null
}
Field Type Description
sector_count object / null Parsed sector count register, if available.
sector_size_bytes number Sector size used for capacity calculation.
user_capacity object / null Calculated user capacity, if sector count is available.

emmc_extcsd.devices[ ].partitioning

{
  "partitioning_support": {
    "register": "PARTITIONING_SUPPORT",
    "index": null,
    "description": "Partitioning Support",
    "value": "0x07",
    "value_int": 7,
    "value_hex": "0x7"
  },
  "partition_setting_completed": {
    "register": "PARTITION_SETTING_COMPLETED",
    "index": null,
    "description": "Partitioning Setting",
    "value": "0x00",
    "value_int": 0,
    "value_hex": "0x0"
  },
  "partition_attribute": {
    "register": "PARTITIONS_ATTRIBUTE",
    "index": null,
    "description": "Partitions attribute",
    "value": "0x00",
    "value_int": 0,
    "value_hex": "0x0"
  },
  "max_enhanced_area_size": {
    "register": "MAX_ENH_SIZE_MULT",
    "index": null,
    "description": "Max Enhanced Area Size",
    "value": "0x000747",
    "value_int": 1863,
    "value_hex": "0x747"
  },
  "enhanced_user_area_start": {
    "register": "ENH_START_ADDR",
    "index": null,
    "description": "Enhanced User Data Start Address",
    "value": "0x00000000",
    "value_int": 0,
    "value_hex": "0x0"
  },
  "enhanced_user_area_size": {
    "register": "ENH_SIZE_MULT",
    "index": null,
    "description": "Enhanced User Data Area Size",
    "value": "0x000000",
    "value_int": 0,
    "value_hex": "0x0"
  }
}
Field Type Description
partitioning_support object / null Supported partitioning features.
partition_setting_completed object / null Indicates whether partition settings were finalized.
user_capacity object / null Partition attribute register.
max_enhanced_area_size object / null Maximum enhanced area size multiplier.
enhanced_user_area_start object / null Enhanced user data area start address.
enhanced_user_area_size object / null Enhanced user data area size.

24.4 TempSensor Actor

24.4.1 App Interfacing

User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.

a) Set temperature sensor configurations

Req-Topic: tempSensor/config/in

ALERT:

  • activate: true(active)/false
  • templow: alert temperature lower limit
  • tempHigh: alert temperature upper limit
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "ALERT": {
        "activate": true,
        "tempLow": 0,
        "tempHigh": 80
      }
    }
  }
}

Reply-Topic: tempSensor/config/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true,
      "ALERT": {
        "activate": true,
        "tempLow": 0,
        "tempHigh": 80
      }
    }
  }
}
b) Read temperature sensor configurations

Req-Topic: tempSensor/config/in

ALERT:

  • activate: true(active)/false

LIMITS:

  • templow: alert temperature lower limit
  • tempHigh: alert temperature upper limit
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "READ"
  }
}

Reply-Topic: tempSensor/config/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true,
      "ALERT": {
        "activate": true,
        "tempLow": 0,
        "tempHigh": 80
      }
    }
  }
}
c) Read temperature and alert status
  • unit: Temperature unit of measure
  • alert: true (triggered) or false

Req-Topic: tempSensor/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "READ"
  }
}

Reply-Topic: tempSensor/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true,
      "data": {
        "temperature": <_FLOAT_>,
        "unit": "C",
        "alert": true
      }
    }
  }
}

24.5 TFT Actor

24.5.1 App Interfacing

User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to control and interact with the TFT display, or frontal panel LCD screen. Connecting to the broker for this Area requires no credentials.

24.5.2 TFT Display Actor

  The TFT Actor is responsible for:

  • Rendering static and informative screens on the TFT display
  • Reacting to joystick input (LEFT/ RIGHT/ CENTER/ UP/ DOWN)
  • Managing screen navigation and user confirmation flows
  • Providing feedback to the application via MQTT

The TFT actor maintains an ordered list of screens (carousel).

  • Screens are navigated using the joystick:

- LEFT --> Previous screen

- RIGHT --> Next screen

  • The carousel wraps around:

- LEFT on first screen --> last screen

- RIGHT on last screen --> first screen

b) Screen Types

The TFT actor supports the following screen types:

Image Screen

  • Displays a static JPEG image
  • Default screen shown at boot
  • No user interaction required

Network Information Screen

  • Display a interface with information about the networks of the device
  • Updated on load
  • No user interaction required
c) Joystick Navigation Logic

Carousel Navigation:

Joystick Input Action
LEFT Previous screen
RIGHT Next screen
DOWN Refresh current screen
d) Boot Behavior

At system boot:

  1. TFT actor initializes the display
  2. Last available carousel is loaded
  3. First screen is rendered
  4. Joystick subscriptions are activated
  5. Actor waits for runtime commands
e) Design Notes & Constraints
  • TFT actor does not expose joystick state
  • Joystick actor remains independent
  • TFT actor internally consumes joystick events
  • Carousel state is local to the TFT actor
  • Screen rendering is synchronous; input handling is asynchronous
  • Confirmation screens always require explicit CENTER press
24.5.3 User interaction through MQTT

Enabling interaction with the carousel using the topic tft/runtime/in . Actions available will be public to the user.

Runtime commands

Go to screen

Req-Topic: tft/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SET_CAROUSEL",
    "params": {
      "index": 2
    }
  }
}

Reply-Topic: tft/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "tft",
  "task": {
    "taskResult": {
      "success": true,
      "index": 2
    }
  }
}

Set TFT Screen Carousel Req-Topic: tft/runtime/in

{
  "id": "TIMESTAMP",
  "origin": "APP",
  "task": {
    "action": "SET_CAROUSEL",
    "params": {
      "startIndex": 0,
      "screens": [
        {
          "type": "image",
          "image": "default.jpg"
        },
        {
          "type": "image",
          "image": "status.jpg"
        },
        {
          "type": "confirm",
          "question": "Do you want to continue?"
        }
      ]
    }
  }
}

Parameters:

Field Description
screens Ordered list of screens
Start lndex Initial active screen (optional, default = 0)

Reply

Reply-Topic: tft/runtime/out

{
  "id": "TIMESTAMP",
  "origin": "tft",
  "task": {
    "taskResult": {
      "success": true,
      "activeIndex": 0,
      "totalScreens": 3
    }
  }
}

24.6 AnalogInputs Actor

24.6.1 App Interfacing

User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.

a) Configurations

  Topic: analogInputs/config/in - Set ADC channels configurations

mode

  • continuous
  • single

type

  • voltage
  • current
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "AI1": {
        "mode": "single",
        "type": "voltage"
      },
      "AI2": {
        "mode": "single",
        "type": "voltage"
      },
      "AI3": {
        "mode": "single",
        "type": "current"
      },
      "AI4": {
        "mode": "single",
        "type": "current"
      }
    }
  }
}

Reply-Topic: analogInputs/config/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "AI1": {
        "success": true
      },
      "AI2": {
        "success": true
      },
      "AI3": {
        "success": true
      },
      "AI4": {
        "success": true
      }
    }
  }
}
b) Runtime Data

Topic: analogInputs/runtime/in.

action:

  • READ
  • PAUSE (only applicable in continuous mode)
  • RESUME (only applicable in continuous mode)
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "AI1": {
        "action": "READ"
      },
      "AI2": {
        "action": "READ"
      },
      "AI3": {
        "action": "READ"
      },
      "AI4": {
        "action": "READ"
      }
    }
  }
}

Reply-Topic: analogInputs/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "AI1": {
        "success": true,
        "value": <_FLOAT_>
      },
      "AI2": {
        "success": true,
        "value": <_FLOAT_>
      },
      "AI3": {
        "success": true,
        "value": <_FLOAT_>
      },
      "AI4": {
        "success": true,
        "value": <_FLOAT_>
      }
    }
  }
}
24.6.2 Usage Examples

24.7 Analog Outputs Actor

24.7.1 App Interfacing

User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.

a) Set analog outputs signal

Req-Topic: analogOutputs/config/in

Output: current within 0-20 mA

mode: on/off

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "mode": "on",
      "AO1": {
        "current": <_FLOAT_>
      },
      "AO2": {
        "current": <_FLOAT_>
      }
    }
  }
}

Reply-Topic: analogOutputs/config/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "mode": "on",
      "AO1": {
        "success": true,
        "current": <_FLOAT_>
      },
      "AO2": {
        "success": true,
        "current": <_FLOAT_>
      }
    }
  }
}
b) Set analog outputs

Req-Topic: analogOutputs/runtime/in

current: current within 0-20 mA

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "AO1": {
        "action": "SET",
        "current": <_FLOAT_>
      },
      "AO2": {
        "action": "SET",
        "current": <_FLOAT_>
      }
    }
  }
}

Reply-Topic: analoigOutputs/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "AO1": {
        "success": true,
        "current": <_FLOAT_>
      },
      "AO2": {
        "success": true,
        "current": <_FLOAT_>
      }
    }
  }
}
c) Read analog outputs settings

Req-Topic: analogOutputs/runtime/in

current: current within 0-20 mA

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "AO1": {
        "action": "READ"
      },
      "AO2": {
        "action": "READ"
      }
    }
  }
}

Reply-Topic: analogOutputs/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "AO1": {
        "success": true,
        "current": <_FLOAT_>
      },
      "AO2": {
        "success": true,
        "current": <_FLOAT_>
      }
    }
  }
}

24.8 Digital Inputs Actor

24.8.1 App Interfacing

User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credentials.

a) Set digital input pin/pins speed fast/slow

The fast speed setting supports edge detection speed up to 100 Hz and the slow speed settings supports up to 10 Hz.

Fast Mode generates a message on every I/O state change, which may result in a high message payload during operation. Fast Mode should therefore only be enabled when strictly required.

Req-Topic: digitalInputs/config/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "DI1": {
        "speed": "fast"
      },
      "DI2": {
        "speed": "slow"
      },
      "DI3": {
        "speed": "fast"
      },
      "DI4": {
        "speed": "fast"
      }
    }
  }
}

Reply-Topic: digitalInputs/config/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "DI1": {
        "success": true,
        "speed": "fast"
      },
      "DI2": {
        "success": true,
        "speed": "slow"
      },
      "DI3": {
        "success": true,
        "speed": "fast"
      },
      "DI4": {
        "success": true,
        "speed": "fast"
      }
    }
  }
}
b) Get all digital input pins state

Req-Topic: digitalInputs/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "READ"
  }
}

Reply-Topic: digitalInputs/runtime/out state: high/low

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "DI1": {
        "success": true,
        "state": "high"
      },
      "DI2": {
        "success": true,
        "state": "low"
      },
      "DI3": {
        "success": true,
        "state": "high"
      },
      "DI4": {
        "success": true,
        "state": "low"
      }
    }
  }
}

24.9 Digital Outputs Actor

24.9.1 App Interfacing

User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this area requires no credencials.

a) Get all digital output pins state

Req-Topic: digitalOutputs/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "READ"
  }
}

Reply-Topic: digitalOutputs/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "DO1": {
        "success": true,
        "state": "low"
      },
      "DO2": {
        "success": true,
        "state": "high"
      },
      "DO3": {
        "success": true,
        "state": "high"
      },
      "DO4": {
        "success": true,
        "state": "low"
      },
      "DO5": {
        "success": true,
        "state": "low"
      },
      "DO6": {
        "success": true,
        "state": "low"
      },
      "DO7": {
        "success": true,
        "state": "low"
      },
      "DO8": {
        "success": true,
        "state": "low"
      }
    }
  }
}
b) Set all digital output pins state

Req-Topic: digitalOutputs/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "DO1": {
        "action": "SET",
        "state": "low"
      },
      "DO2": {
        "action": "SET",
        "state": "high"
      },
      "DO3": {
        "action": "SET",
        "state": "high"
      },
      "DO4": {
        "action": "SET",
        "state": "low"
      },
      "DO5": {
        "action": "SET",
        "state": "low"
      },
      "DO6": {
        "action": "SET",
        "state": "low"
      },
      "DO7": {
        "action": "SET",
        "state": "low"
      },
      "DO8": {
        "action": "SET",
        "state": "low"
      }
    }
  }
}

Reply-Topic: digitalOutputs/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "D01": {
        "success": true,
        "state": "low"
      },
      "D02": {
        "success": true,
        "state": "high"
      },
      "D03": {
        "success": true,
        "state": "high"
      },
      "D04": {
        "success": true,
        "state": "high"
      },
      "D05": {
        "success": true,
        "state": "high"
      },
      "D06": {
        "success": true,
        "state": "low"
      },
      "D07": {
        "success": true,
        "state": "low"
      },
      "D08": {
        "success": true,
        "state": "low"
      }
    }
  }
}
24.9.2 Notes

If the busi2c-3 is not powered, we will get this:

Topic: digit a lOutputs/runtime/ out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "DO1": {
        "success": false,
        "state": "DO_not_powered"
      },
      "DO2": {
        "success": false,
        "state": "DO_not_powered"
      },
      "DO3": {
        "success": false,
        "state": "DO_not_powered"
      },
      "DO4": {
        "success": false,
        "state": "DO_not_powered"
      },
      "DO5": {
        "success": false,
        "state": "DO_not_powered"
      },
      "DO6": {
        "success": false,
        "state": "DO_not_powered"
      },
      "DO7": {
        "success": false,
        "state": "DO_not_powered"
      },
      "DO8": {
        "success": false,
        "state": "DO_not_powered"
      }
    }
  }
}

24.10 Joystick Actor

24.10.1 App Interfacing

User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.

a) Get all joystick pins state

Req-Topic: joystick/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "READ"
  }
}

Reply-Topic: joystick//runtime/out state: pressed/released

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "JLEFT": {
        "success": true,
        "state": "pressed"
      },
      "JRIGHT": {
        "success": true,
        "state": "released"
      },
      "JUP": {
        "success": true,
        "state": "released"
      },
      "JDOWN": {
        "success": true,
        "state": "released"
      },
      "JCENTER": {
        "success": true,
        "state": "released"
      }
    }
  }
}

24.11 Buzzer Actor

24.11.1 Overview

The Buzzer Actor is responsible for controlling the onboard buzzer through MQTT commands. It receives runtime commands on an MQTT input topic, validates the requested buzzer operation, drives the buzzerthrough GPIO using libgpiod, and publishes status/final responses on an MQTT output topic.

The actor currently controls GPIO line 25 on /dev/gpiochip0, with ACTIVE_LOW = False. It creates a

GpiodBuzzerDriver instance and routes incoming MQTT actions to runtime handlers.

The supported runtime actions are:

Action Description
BEEP Plays a finite beep sequence, an infinite beep sequence, or a continuous tone
STOP Stops the currently active buzzer playback
24.11.2 MQTT Topics
Topic Direction Description
buzzer/runtime/in Input Receives buzzer commands
buzzer/runtime/out Output Publishes status messages and final command responses

The actor subscribes to buzzer/runtime/in and publishes all status/final replies to buzzer/runtime/out.

24.11.3 Hardware and Datasheet Notes

The buzzer used is the MLT-8530 electro-magnetic SMD buzzer.

According to the datasheet:

Parameter Value
Rated voltage 3.6 Vo-p
Operating voltage 2.5 ~ 4.5 Vo-p
Rated current Max. 95 mA
Rated test frequency 2700 Hz
Duty cycle 50% square wave
Sound output Min. 80 dB at 10 cm
Coil resistance 16 ± 3 Ω
Resonant frequency 2700 Hz
24.11.4 BEEP

The BEEP action supports two modes:

Mode Description
sequence Plays one or more beeps with gaps between them
continuous Plays one continuous tone until STOP is received

If no mode is provided, the default mode is: sequence

All messages should be sent to the topic buzzer/runtime/in

a) Default Datasheet-Aligned Beep
{
"id": <TIMESTAMP>,
"origin": "APP",
"task": {
  "action": "BEEP"
  }
}
b) N Beeps

Play <BEEPS_QUANTITY> beeps at <FREQUENCY> Hz. Each beep lasts <BEEP_DURATION> seconds, with

<GAP_BETWEEN_BEEPS> seconds of silence between beeps.

{
"id": <TIMESTAMP>,
"origin": "APP",
"task": {
   "action": "BEEP",
   "params": {
      "frequency_hz": <FREQUENCY>,
      "duration_s": <BEEP_DURATION>,
      "count": <BEEPS_QUANTITY>,
      "gap_s": <GAP_BETWEEN_BEEPS> 
    }
  }
}

If you want to play repeated beeps forever until a STOP command arrives then you only need to pass the count: 0

c) Continuous Tone

Play one continuous <FREQUENCY> Hz tone until STOP.

{
"id": <TIMESTAMP>,
"origin": "APP",
"task": {
   "action": "BEEP",
   "params": {
      "mode": "continuous",
      "frequency_hz": <FREQUENCY>
    }
  }
}

If frequency_hz is omitted, the handler uses the configured default frequency.

d) Stop Buzzer

If you want to stop the beep sequence, just send this payload to the buzzer/runtime/in

{
"id": <TIMESTAMP>,
"origin": "APP",
"task": {
   "action": "STOP",
  }
}
e) Buzzer payload parameters table
Field Required Type Default Applies to Description
task Yes object - All requests Main task object. Contains the requested action and

optional parameters.

task.action Yes string - All requests Action to execute. Supported values: "BEEP" and

"STOP".

task.params No object {} BEEP Optional parameters for configuring the buzzer

behavior. Not needed for STOP.

task.params.mode No string "sequence" BEEP Playback mode. Supported values: "sequence" and

"continuous".

task.params.frequency_hz No number 2700.0 BEEP Buzzer frequency in Hz. Recommended/default value

is 2700 Hz , matching the buzzer resonant frequency.

task.params.duration_s No number 0.2 BEEP with

mode="sequence"

Duration of each beep, in seconds.
task.params.count No integer 1 BEEP with

mode="sequence"

Number of beeps to play. 0 means repeat forever

until STOP.

task.params.gap_s No number 0.15 BEEP with

mode="sequence"

Silence gap between beeps, in seconds.
task.params.mode ="continuous" No string - BEEP Plays one continuous tone until STOP . In this mode,

duration_s , count , and gap_s are ignored.

24.11.5 Buzzer - diagram
24.11.6 Buzzer Command timing charts - Examples

The following charts represent the command-level buzzer state over time.

They do not show the internal 2700 Hz switching frequency.

Instead, they show when the buzzer is logically:

State Meaning
1 Buzzer active / sound ON
0 Buzzer inactive / silence
a) Default BEEP command
{
"id": <TIMESTAMP>,
"origin": "APP",
"task": {
   "action": "BEEP",
  }
}

Default values used:

Parameter Value
duration_s 0.2 s
count 1
gap_s 0.15 s

Buzzer State

duration_s = 0.2 s

count = 1

b) BEEP Sequence - 5 beeps
{
"id": 1779789836000,
"origin": "APP",
"task": {
    "action": "BEEP",
    "params": {
      "duration_s": 1,
      "count": 5,
      "gap_s": <GAP_BETWEEN_BEEPS>
  } 
 }
}

Buzzer State



duration_s = 1.0s

gap_s = 0.5s

count = 5

c) Infinite BEEP Sequence

This happens when: "count": 0

{
"id": 1779789836000,
"origin": "APP",
"task": {
    "action": "BEEP",
    "params": {
       "duration_s": 1,
       "count": 0,
       "gap_s": 0.5
  }
 }
}

Buzzer State

duration_s = 1.0 gap_s = 0.5

count = 0

d) Continuous BEEP

In continuous mode, the buzzer remains ON until a STOP command is received.

{
"id": 1779789836000,
"origin": "APP",
"task": {
    "action": "BEEP",
    "params": {
       "mode": "continuous",
  }
 }
}

Buzzer State

mode = continuous

e) STOP

The STOP command immediately forces the buzzer to OFF.

Buzzer State

After STOP, the buzzer is forced to OFF.

24.12 INA232 actor

24.12.1 Overview

The INA Actor is responsible for reading the ATLAS INA232 power monitor and publishing the measuredelectrical values through MQTT.

The actor publishes:

Value Unit Description
voltage_v V Measured bus/input voltage
current_a A Measured current
power_w W Measured/calculated power

The INA232 is a current, voltage, and power monitor with an I²C/SMBus interface. It reports current, busvoltage, and power values through internal registers. The calibration register must be configured to obtainvalid current and power results.

24.12.2 Actor Behaviour

The INA Actor shall:

1. Start with a valid INA configuration.

2. Configure the INA232 device.

3. Read voltage, current and power once per second.

4. Publish the values to: ina/runtime/out

The actor does not need a request every second.

The publication is automatic and periodic.

24.12.3 Required Configuration

The actor requires a small configuration to correctly read and convert the INA232 measurements.

Field Type Required Description
enabled boolean Yes Enables or disables the INA actor
address string /integer Yes I²C address of the INA232 device
shunt_ohm number Yes Value of the shunt resistor in ohms
max_current_a number Yes Maximum expected current, used forcalibration
adcrange integer No INA232 shunt voltage range selection
publish_interval_ms integer Yes Runtime publish interval in milliseconds
rail_name string No Logical name of the monitored power rail
  • Default configuration
{
  "enabled": true,
  "address": "0x40",
  "shunt_ohm": 0.020,
  "publish_interval_ms": 1000,
  "rail_name": "atlas_input_power"
}
24.12.4 Configuration domain

Configuration messages are sent to:

ina/config/in

Configuration replies are published on:

ina/config/out

- GET_CONFIG

Returns the current INA Actor configuration

Request

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "GET_CONFIG"
  }
}

Response

{
  "id": "<TIMESTAMP>",
  "origin": "INA",
  "task": {
    "action": "GET_CONFIG",
    "taskResult": {
      "success": true,
      "configured": true,
      "enabled": true,
      "address": "0x40",
      "shunt_ohm": 0.020,
      "publish_interval_ms": 1000
    }
  }
}
24.12.5 Runtime domain

Runtime messages are sent to:

ina/runtime/in

Runtime replies are published on:

ina/runtime/out

- Manual Runtime read

Request

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "GET_POWER"
  }
}

Response

{
  "id": "<TIMESTAMP>",
  "origin": "INA",
  "task": {
    "action": "GET_POWER",
    "taskResult": {
      "success": true,
      "voltage_v": 24.12,
      "current_a": 0.481,
      "power_w": 11.6
    }
  }
}

- Automatic Runtime Publication

Publish topic:

ina/runtime/out

Period: 1000 ms === 1s

Response payload

{
  "id": "<TIMESTAMP>",
  "origin": "INA",
  "task": {
    "action": "PUBLISH_POWER",
    "taskResult": {
      "success": true,
      "voltage_v": 24.12,
      "current_a": 0.481,
      "power_w": 11.6
    }
  }
}
Field Type Required Description
success boolean - Indicates whether the read operation succeeded
voltage_v number V Measured bus/input voltage
current_a number A Measured current
power_w number W Measured power

24.13 Modem Actor

24.13.1 App Interfacing

User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtainmodem (LTE) data. Connecting to the broker for this area requires no credentials.

24.13.2 Mobile (LTE Modem)

The Mobile actor manages the LTE modem using ModemManager (mmcli). It allows monitoring modem status, configuring connectivity (APN, operator,network mode), and performing diagnostics.

24.13.3 Scan Operators

Scans available network operators (requires SIM and modem enabled).

Req-Topic: modem/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SCAN_OPERATORS"
  }
}

Reply-Topic: modem/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "operators": [
        {
          "id": "26801",
          "name": "vodafone P",
          "status": "available"
        },
        {
          "id": "26806",
          "name": "MEO",
          "status": "available"
        }
      ]
    }
  }
}
24.13.4 Set Operator

The supported modes are:

  • auto → modem selects de operator automatically (default).
  • manual→ user forces a specific operator using operator_id.

- Operators are identified using MCC + MNC codes:

Operator Code Country
Vodafone PT 26801 Portugal
MEO 26806 Portugal
NOS 26803 Portugal

These values are obtained dynamically via SCAN_OPERATORS

  • Recommendations:

Default should always be auto

Use manual only when:

- You need to force roaming behavior

- You want to lock to a specific network for stability/testing

Auto Selection

Req-Topic: modem/config/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SET_OPERATOR",
    "taskParams": {
      "mode": "auto"
    }
  }
}

Reply-Topic: modem/config/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true
    }
  }
}
Manual Selection

Req-Topic: modem/config/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SET_OPERATOR",
    "taskParams": {
      "mode": "manual",
      "operator_id": "26801"
    }
  }
}

Reply-Topic: modem/config/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true
    }
  }
}
24.13.5 Set APN Configuration

Supports automatic (predefined APN) or custom configuration.

Actual Behavior

When SET_APN is executed, the system performs the following sequence:

  1. Disconnects the current data connection (if connected)
  2. Applies the new APN configuration
  3. Initiates a new connection using the provided APN
  4. Waits until the modem reaches connected state

This means a full reconnection is automatically performed.

No additional RESET or manual reconnection is required.

Impact & Considerations
  • Active data connection is interrupted
  • Ongoing communications (MQTT, HTTP, VPN, etc.) will be dropped
  • IP address may change after reconnection
  • Operation may take several seconds (typically 5–20s)
  • If connection fails, the modem may remain disconnected
Known APNs
Operator APN CONF

NAME

APN PROXY PORT MCC MNC AUTH

TYPE

APN

TYPE

CARRIER OBS.
MEO, UZO -- internet -- -- -- -- -- -- -- --
1nce -- iot.1nce.net -- -- -- -- -- -- -- --
Vodafone Vodafone

Internet

net2.vodafone.pt iproxy.vodafone.pt 80 268 01 PAP default unspecified Docs
Supported Modes
  • auto
  • custom
Mode Description
auto Uses modem default / SIM-provided APN
custom Uses user-defined APN credentials

- Auto APN (e.g. 1NCE)

Uses the default APN embedded in the modem or provided by the SIM.

Req-Topic: modem/config/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SET_APN",
    "taskParams": {
      "mode": "auto"
    }
  }
}

Reply-Topic: modem/config/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "apn": "internet",
      "success": true
    }
  }
}

- Custom APN

Allows full control over APN configuration.

Req-Topic: modem/config/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SET_APN",
    "taskParams": {
      "mode": "custom",
      "apn": "internet",
      "user": "user",
      "password": "pass"
    }
  }
}

Reply-Topic: modem/config/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "apn": "internet",
      "success": true
    }
  }
}
24.13.6 Get Modem Status

Req-Topic: modem/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "GET_STATUS"
  }
}

Reply-Topic: modem/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "modem": {
        "present": true,
        "enabled": true,
        "state": "registered",
        "signal": 34,
        "access_tech": "lte",
        "operator": "vodafone P",
        "sim": "ready"
      }
    }
  }
}
24.13.7 Enable / Disable Modem

Req-Topic: modem/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SET_MODEM_STATE",
    "taskParams": {
      "enabled": true
    }
  }
}

Reply-Topic: modem/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "enabled": true,
      "success": true
    }
  }
}
24.13.8 Reset Modem

Performs a full modem reset and recovery sequence.

Req-Topic: modem/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "RESET"
  }
}

Reply-Topic: modem/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true
    }
  }
}
Actual Behavior

When RESET is executed, the system performs a complete modem restart flow:

  1. Executes system-level reset: ltectl reset-modem
  2. The modem disappears from the system (USB re-enumeration)
  3. The system waits for the modem to reappear
  4. Re-discovers the modem path
  5. Waits until the modem becomes ready
  6. Waits until the modem is connected again

This is a full recovery sequence, including automatic reconnection.

Impact on active connection
  • Active data connection is immediately terminated
  • All ongoing communications (MQTT, VPN, HTTP, etc.) will be interrupted
  • Modem temporarily disappears from the system
  • A new network registration is performed
  • IP address will likely change
  • Total recovery time may take 10–120 seconds
When to use

Use RESET only when:

  • Modem is stuck in searching or not registering
  • Connected but no data traffic is possible
  • APN/operator changes are not taking effect
  • Modem becomes unresponsive or unstable
When NOT to Use

Avoid using RESET :

  • During OTA updates or file uploads
  • During critical real-time operations
  • If a simple reconnect ( SET_MODEM_STATE ) is sufficient
Application Considerations

Before RESET

  • Ensure no critical operations are ongoing
  • Persist any unsent or buffered data
  • Expect loss of connectivity

After RESET

  • Wait for modem to fully recover (can take up to ~2 minutes)
  • Re-check modem status using: GET_STATUS
  • Re-establish application-level connections: MQTT; VPN an Cloud sessions
24.13.9 Set Network Mode

Configures allowed radio technologies

Supported values:

  • 2g
  • 3g
  • 4g
  • auto

Req-Topic: modem/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SET_NETWORK_MODE",
    "taskParams": {
      "mode": "4g"
    }
  }
}

Reply-Topic: modem/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "mode": "4g",
      "success": true
    }
  }
}
24.13.10 Get Signal Strength

Req-Topic: modem/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "GET_SIGNAL"
  }
}

Reply-Topic: modem/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "signal": 34,
      "unit": "%"
    }
  }
}
24.13.11 Get SIM card info

GET_SIM_INFO is a runtime action used to read SIM card information from the modem through ModemManager.

This action is read-only. It does not change the modem state, APN, operator, bearer, or NetworkManager configuration.

Req-Topic: modem/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "GET_SIM_INFO"
  }
}

Reply-Topic: modem/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "modem-actor",
  "task": {
    "taskResult": {
      "success": true,
      "sim": {
        "id": "0",
        "path": "/org/freedesktop/ModemManager1/SIM/0",
        "active": true,
        "iccid": "8935101234567890123",
        "imsi": "268060123456789",
        "operator_id": "26806",
        "operator_name": "MEO",
        "emergency_numbers": [
          "112"
        ],
        "preferred_networks": [
          "operator-code: 42507, access-technologies: gsm, umts, lte",
          "operator-code: 20810, access-technologies: gsm, umts, lte",
          "operator-code: 64710, access-technologies: gsm, umts, lte",
          "operator-code: 37001, access-technologies: gsm, umts, lte",
          "operator-code: 34002, access-technologies: gsm, umts, lte"
        ]
      }
    }
  }
}
Field Type Description
id number / string Same request ID received in the input payload.
origin string Actor name, usually modem-actor.
task.taskResult.success boolean Indicates if the SIM information was read successfully.
task.taskResult.sim.id string SIM object ID used by ModemManager. Usually 0.
task.taskResult.sim.path string ModemManager DBus path for the SIM object.
task.taskResult.sim.active boolean / null Indicates if the SIM is active, when available.
task.taskResult.sim.iccid string / null SIM ICCID / SIM identifier. This is the physical SIM card identifier.
task.taskResult.sim.imsi string / null IMSI associated with the SIM subscription.
task.taskResult.sim.operator_id string / null Mobile operator identifier from the SIM, when available.
task.taskResult.sim.operator_name string / null Operator name from the SIM, when available.
task.taskResult.sim.emergency_numbers array Emergency numbers reported by the SIM/modem.
task.taskResult.sim.preferred_networks array Preferred networks stored on the SIM, when available.
24.13.12 Test Modem

Performs a basic diagnostic test:

  • Modem detection
  • SIM presence
  • Network registration
  • Data connectivity

Req-Topic: modem/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "TEST"
  }
}

Reply-Topic: modem/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "hw": true,
      "sim": true,
      "network": true,
      "data": true
    }
  }
}
24.13.13 Speed Test

Performs a low-data network speed test over the modem interface.

This command does not run a full bandwidth benchmark.

Instead, it performs a short and capped download burst on interface wwan0 , measures the number of received bytes during a fixed time window, and

returns an estimated download speed together with latency and a confidence level.

This approach is designed for IoT / field devices using capped cellular SIM cards, where a classic speed test would consume too much data.

Req-Topic: modem/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "SPEED_TEST"
  }
}

Reply-Topic: modem/runtime/out Success reply:

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "download_mbps": 12.4,
      "success": true
    }
  }
}

Error reply Example when the modem is not connected:

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "download_mbps": 12.4,
      "success": true
    }
  }
}

Example when an unexpected internal error occurs:

{
  "id": "<TIMESTAMP>",
  "origin": "modem-actor",
  "task": {
    "taskResult": {
      "success": false,
      "reason": "unexpected_exception"
    }
  }
}
Reply parameters
Parameter Type Description
success boolean Indicates whether the speed test completed successfully. true = test executed, false = failed (see reason ).
download_mbps number Estimated download speed in megabits per second (Mbps). Calculated from the number of bytes received on interface

wwan0 during the measurement window.

bytes_sampled number Total number of received bytes measured on the modem interface ( wwan0 ) during the test window. Used as the raw input

for speed calculation.

duration_s number Measurement window duration in seconds. Current implementation uses 5 seconds.
latency_ms number null
confidence string Qualitative indicator of measurement reliability based on sampled bytes:• low → < 50,000 bytes• medium → 50,000–

299,999 bytes• high → ≥ 300,000 bytes

reason string Present only when success=false . Provides failure reason (e.g., not_connected (<state>) , unexpected_exception ).
Data consumption notice

This command performs a real network download and therefore consumes mobile data.

Although the test is designed to be low-data, it still generates traffic:

  • Typical consumption per test: ~100 KB to ~500 KB
  • Latency measurement adds a negligible amount (ICMP ping)

Estimated data usage

Frequency Estimated consumption
1 test/day (~100 KB) ~3 MB/month
1 test/day (~250 KB) ~7.5 MB/month
1 test/day (~500 KB) ~15 MB/month
Recommendation

For devices using capped SIM cards, it is recommended to:

  • Avoid running this test at high frequency
  • Use signal and modem status ( mmcli ) for regular monitoring
  • Reserve speed tests for:

- commissioning

- troubleshooting

- periodic health checks

Running frequent or extended tests may significantly impact the data allowance.

24.13.14 Get Raw Modem Info (Reserved)

Req-Topic: reserved/modem/runtime/in

{
  "id": "<TIMESTAMP>",
  "origin": "modem-actor",
  "task": {
    "taskResult": {
      "success": false,
      "reason": "not_connected (registered)"
    }
  }
}

Reply-Topic: reserved/modem/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "DEV",
  "task": {
    "taskResult": {
      "raw": "mmcli -m 0 output..."
    }
  }
}
24.13.15 Example: Raw Modem Output ( mmcli )

Command:

mmcli -m 0 --output-json

Example output:

{
  "modem": {
    "3gpp": {
      "5gnr": {
        "registration-settings": {
          "drx-cycle": "--",
          "mico-mode": "--"
        }
      },
      "enabled-locks": [],
      "eps": {
        "initial-bearer": {
          "dbus-path": "--",
          "settings": {
            "apn": "--",
            "ip-type": "--",
            "password": "--",
            "user": "--"
          }
        },
        "ue-mode-operation": "--"
      },
      "imei": "862636056280785",
      "network-rejection-access-technology": "--",
      "network-rejection-error": "--",
      "network-rejection-operator-id": "--",
      "network-rejection-operator-name": "--",
      "operator-code": "--",
      "operator-name": "--",
      "packet-service-state": "--",
      "pco": "--",
      "registration-state": "--"
    },
    "cdma": {
      "activation-state": "--",
      "cdma1x-registration-state": "--",
      "esn": "--",
      "evdo-registration-state": "--",
      "meid": "--",
      "nid": "--",
      "sid": "--"
    },
    "dbus-path": "/org/freedesktop/ModemManager1/Modem/0",
    "generic": {
      "access-technologies": [],
      "bearers": [],
      "carrier-configuration": "ROW_Gen_VoLTE",
      "carrier-configuration-revision": "05010822",
      "current-bands": [
        "egsm",
        "dcs",
        "pcs",
        "g850",
        "utran-1",
        "utran-4",
        "utran-6",
        "utran-5",
        "utran-8",
        "utran-2",
        "eutran-1",
        "eutran-2",
        "eutran-3",
        "eutran-4",
        "eutran-5",
        "eutran-7",
        "eutran-8",
        "eutran-12",
        "eutran-13",
        "eutran-18",
        "eutran-19",
        "eutran-20",
        "eutran-25",
        "eutran-26",
        "eutran-28",
        "eutran-34",
        "eutran-38",
        "eutran-39",
        "eutran-40",
        "eutran-41",
        "eutran-66",
        "utran-19"
      ],
      "current-capabilities": [
        "gsm-umts, lte"
      ],
      "current-modes": "allowed: 4g; preferred: none",
      "device": "/sys/devices/platform/scb/fe9c0000.xhci/usb1/1-1/1-1.4",
      "device-identifier": "2c759b7021f62d2e26973150063ea040b3662a65",
      "drivers": [
        "option",
        "qmi_wwan"
      ],
      "equipment-identifier": "862636056280785",
      "hardware-revision": "10000",
      "manufacturer": "QUALCOMM INCORPORATED",
      "model": "SIMCOM_SIM7600G-H",
      "own-numbers": [],
      "physdev": "/sys/devices/platform/scb/fe9c0000.xhci/usb1/1-1/1-1.4",
      "plugin": "simtech",
      "ports": [
        "cdc-wdm0 (qmi)",
        "ttyUSB0 (ignored)",
        "ttyUSB1 (gps)",
        "ttyUSB2 (at)",
        "ttyUSB3 (at)",
        "ttyUSB4 (audio)",
        "wwan0 (net)"
      ],
      "power-state": "on",
      "primary-port": "cdc-wdm0",
      "primary-sim-slot": "1",
      "revision": "LE20B04SIM7600G22",
      "signal-quality": {
        "recent": "yes",
        "value": "0"
      },
      "sim": "/org/freedesktop/ModemManager1/SIM/0",
      "sim-slots": [
        "/org/freedesktop/ModemManager1/SIM/0",
        "/"
      ],
      "state": "failed",
      "state-failed-reason": "sim-missing",
      "supported-bands": [
        "egsm",
        "dcs",
        "pcs",
        "g850",
        "utran-1",
        "utran-4",
        "utran-6",
        "utran-5",
        "utran-8",
        "utran-2",
        "eutran-1",
        "eutran-2",
        "eutran-3",
        "eutran-4",
        "eutran-5",
        "eutran-7",
        "eutran-8",
        "eutran-12",
        "eutran-13",
        "eutran-18",
        "eutran-19",
        "eutran-20",
        "eutran-25",
        "eutran-26",
        "eutran-28",
        "eutran-34",
        "eutran-38",
        "eutran-39",
        "eutran-40",
        "eutran-41",
        "eutran-66",
        "utran-19"
      ],
      "supported-capabilities": [
        "gsm-umts, lte"
      ],
      "supported-ip-families": [
        "ipv4",
        "ipv6",
        "ipv4v6"
      ],
      "supported-modes": [
        "allowed: 2g; preferred: none",
        "allowed: 3g; preferred: none",
        "allowed: 4g; preferred: none",
        "allowed: 2g, 3g; preferred: 3g",
        "allowed: 2g, 3g; preferred: 2g",
        "allowed: 2g, 4g; preferred: 4g",
        "allowed: 2g, 4g; preferred: 2g",
        "allowed: 3g, 4g; preferred: 4g",
        "allowed: 3g, 4g; preferred: 3g",
        "allowed: 2g, 3g, 4g; preferred: 4g",
        "allowed: 2g, 3g, 4g; preferred: 3g",
        "allowed: 2g, 3g, 4g; preferred: 2g"
      ],
      "unlock-required": "--",
      "unlock-retries": []
    }
  }
}
Field Reference - mmcli -m 0 --output-json
JSON Path Meaning Example Value Notes / Interpretation
modem.dbus-path Internal modem path /org/.../Modem/0 Used by mmcli ( -m 0 )
modem.generic.manufacturer Modem vendor QUALCOMM INCORPORATED Hardware info
modem.generic.model Modem model SIM7600G-H
modem.generic.revision Firmware version LE20B04SIM7600G22 Useful for debugging
modem.generic.device Linux device path /sys/devices/... USB device
modem.generic.drivers Kernel drivers option, qmi_wwan Must be present
modem.generic.primary-port Control interface cdc-wdm0 Critical (QMI control)
modem.generic.ports Available interfaces ttyUSB*, wwan0 Data + AT + GPS
modem.generic.power-state Power status on
modem.generic.state Modem state failed Main status field
modem.generic.state-failed-reason Failure reason sim-missing Root cause of failure
modem.generic.signal-quality.value Signal strength (%) 0 0 = no signal
modem.generic.current-capabilities Active radio tech gsm-umts, lte
modem.generic.current-modes Active mode allowed: 4g Controlled via API
modem.generic.current-bands Active frequency bands [eutran-1, ...] Coverage related
modem.generic.supported-bands Supported bands [eutran-*, utran-*] Hardware capability
modem.generic.supported-ip-families IP support ipv4, ipv6, ipv4v6
modem.generic.sim SIM path /org/.../SIM/0
modem.generic.sim-slots SIM slots [slot1, slot2] Slot 2 empty here
modem.generic.primary-sim-slot Active SIM slot 1
modem.generic.bearers Active data sessions [ ] Empty = no connection
modem.3gpp.imei Device IMEI 862636056280785 Unique identifier
modem.3gpp.operator-name Network name -- Not available (no SIM)
modem.3gpp.operator-code MCC/MNC -- Not available
modem.3gpp.registration-state Network state -- Not registered
modem.3gpp.packet-service-state Data service state -- No data session
modem.3gpp.eps.initial-bearer.settings.apn APN -- Not set / no connection
24.13.16 Notes:
  • If no modem is detected:

Reply-Topic: modem/runtime/out

{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "modem": {
        "present": false
      }
    }
  }
}
  • If SIM is locked or missing: Reply-Topic: modem/runtime/out
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "modem": {
        "sim": "locked"
      }
    }
  }
}
  • Operator scan may take several seconds and should be handled asynchronously.
  • Some actions require:

- SIM card inserted

- Modem enabled

- cdc-wdm0 interface available

  • Signal strength is reported as percentage and may be cached by ModemActor.

25. Included Software Stack

26. Hardware Libraries

[IMAGE PLACEHOLDER]

PA Name Requirements
PA000000074 SENSBLUE MONARCH Gateway
Name Firmware v. Requirements
PA000000065 SENSBLUE RS-485 Dissolved Oxygen Probe AT-SB-PROBE-DO-P-C1, w/ 15m cable w/connector
PA000000085 SENSBLUE RS-485 Dissolved Oxygen Probe AT-SB-PROBE-DO-T-C1, w/ 15m cable w/connector 10.70
PA000000091 SENSBLUE RS-485 Dissolved CO2 Sensor Probe AT-SB-PROBE-CO2-P-5000-C1, w/ 15m cable w/connector
PA000000086 SENSBLUE RS-485 Low Conductivity Probe AT-SB-PROBE-LC-P-C1, w/ 15m cable w/connector 10.70
PA000000087 SENSBLUE RS-485 Medium Conductivity Probe AT-SB-PROBE-MC-P-C1, w/ 15m cable w/connector 10.70
PA000000068 SENSBLUE RS-485 High Conductivity Probe AT-SB-PROBE-HC-P-C1, w/ 15m cable w/connector 10.70
PA000000089 SENSBLUE RS-485 Salinity/Conductivity/TDS Probe AT-SB-PROBE-S-P-C1, w/ 15m cable w/connector
PA000000067 SENSBLUE RS-485 pH Probe AT-SB-PROBE-pH-P, w/ 15m cable w/conector 10.70
PA000000088 SENSBLUE RS-485 ORP Probe AT-SB-PROBE-ORP-P-C1, w/ 15m cable w/connector
PA000000069 SENSBLUE RS-485 Nitrates (NO3) Probe AT-SB-PROBE-NO3-P, w/ 15m cable w/connector 10.70
PA000000090 SENSBLUE RS-485 Ammonia Nitrogen (NH4-N) Sensor Probe AT-SB-PROBE-NH4-P-C1, w/ 15m cable w/connector
PA000000066 SENSBLUE RS-485 Turbidity Probe AT-SB-PROBE-T-P, w/ 15m cable w/connector 10.70
PA000000073 SENSBLUE RS-485 Multiparameter Probe AT-SB-PROBE-MP-P-C1, w/ 15m cable w/connector 10.71

28. Accessories

PA Name Requirements

29. Document History

Version Description Date
SBADATAv0.1 First version of SENSBLUE ATLAS Datasheet 11/03/2026

30. SENSBLUE ATLAS in-the-field

[IMAGE PLACEHOLDER]