Jump to content

SENSBLUE ATLAS: Difference between revisions

From ATRONIA Wiki
No edit summary
No edit summary
 
Line 664: Line 664:
Req-Topic: relayOutputs/config/in
Req-Topic: relayOutputs/config/in


<syntaxhighlight lang="json">
<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 681: 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 700: Line 700:
====== b) 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 708: 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 729: Line 729:
====== c) 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 745: 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 776: 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 790: 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 810: Line 810:
'''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 818: 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 841: 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 850: 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 871: Line 871:
====== d) 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 953: Line 953:
|seconds
|seconds
|}
|}
Example Payload (systemHealth/runtime/out) <syntaxhighlight lang="json">
Example Payload (systemHealth/runtime/out) <syntaxhighlight lang="json" line="1">
{
{
   "id": <TIMESTAMP>,
   "id": <TIMESTAMP>,
Line 986: Line 986:
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": <TIMESTAMP>,
   "id": <TIMESTAMP>,
Line 1,066: 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": <TIMESTAMP>,
   "id": <TIMESTAMP>,
Line 1,193: Line 1,193:
The list_usb_devices action returns a parsed list of USB devices detected on the system using the lsusb command.  
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<syntaxhighlight lang="json">
'''Req-topic''': systemHealth/runtime/in<syntaxhighlight lang="json" line="1">
{
{
"id": <TIMESTAMP>,
"id": <TIMESTAMP>,
Line 1,201: Line 1,201:
  }
  }
}
}
</syntaxhighlight>'''Reply-topic''': systemHealth/runtime/usb/devices/out<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-topic''': systemHealth/runtime/usb/devices/out<syntaxhighlight lang="json" line="1">
{
{
"id": <TIMESTAMP>,
"id": <TIMESTAMP>,
Line 1,361: Line 1,361:
* Tunnel interfaces, for possible commissioning use
* Tunnel interfaces, for possible commissioning use


'''Req-topic''': systemHealth/runtime/in<syntaxhighlight lang="json">
'''Req-topic''': systemHealth/runtime/in<syntaxhighlight lang="json" line="1">
{
{
"id": "connectivity-001",
"id": "connectivity-001",
Line 1,369: Line 1,369:
  }
  }
}
}
</syntaxhighlight>'''Reply-topic''': systemHealth/runtime/connectivity/out<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-topic''': systemHealth/runtime/connectivity/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 2,100: Line 2,100:


====== c) Get hardware info ======
====== c) Get hardware info ======
'''Req-topic''': systemHealth/runtime/in<syntaxhighlight lang="json">
'''Req-topic''': systemHealth/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 2,108: Line 2,108:
   }
   }
}
}
</syntaxhighlight>'''Reply-topic''': systemHealth/runtime/hw/info/out<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-topic''': systemHealth/runtime/hw/info/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 2,155: Line 2,155:
* '''CPU'''
* '''CPU'''


The '''cpu''' object describes the detected board and CPU.<syntaxhighlight lang="json">
The '''cpu''' object describes the detected board and CPU.<syntaxhighlight lang="json" line="1">
{
{
   "board_model": "Raspberry Pi Compute Module 4 Rev 1.1",
   "board_model": "Raspberry Pi Compute Module 4 Rev 1.1",
Line 2,277: Line 2,277:
* '''EMMC'''
* '''EMMC'''


The '''emmc''' object is a '''filtered eMMC''' '''view'''. It focuses on the main eMMC disk and its partitions.<syntaxhighlight lang="json">
The '''emmc''' object is a '''filtered eMMC''' '''view'''. It focuses on the main eMMC disk and its partitions.<syntaxhighlight lang="json" line="1">
{
{
   "devices": [
   "devices": [
Line 2,386: Line 2,386:


====== d) block_devices ======
====== d) block_devices ======
The '''block_devices''' object is the complete storage/device tree returned by '''lsblk'''.<syntaxhighlight lang="json">
The '''block_devices''' object is the complete storage/device tree returned by '''lsblk'''.<syntaxhighlight lang="json" line="1">
{
{
   "devices": [
   "devices": [
Line 2,469: Line 2,469:


====== e) file_systems ======
====== e) file_systems ======
The '''file_systems''' object reports mounted filesystem usage, equivalent to '''df -h'''.<syntaxhighlight lang="json">
The '''file_systems''' object reports mounted filesystem usage, equivalent to '''df -h'''.<syntaxhighlight lang="json" line="1">
{
{
   "filesystems": [
   "filesystems": [
Line 2,547: Line 2,547:
'''/sys/block/mmcblk*/device/'''
'''/sys/block/mmcblk*/device/'''


This is useful for production traceability, device identification and diagnostics.<syntaxhighlight lang="json">
This is useful for production traceability, device identification and diagnostics.<syntaxhighlight lang="json" line="1">
{
{
   "source": "/sys/block",
   "source": "/sys/block",
Line 2,661: Line 2,661:
|Partitioning and enhanced-area information.
|Partitioning and enhanced-area information.
|}
|}
'''emmc_extcsd.devices[''' '''].revision'''<syntaxhighlight lang="json">
'''emmc_extcsd.devices[''' '''].revision'''<syntaxhighlight lang="json" line="1">
{
{
   "ext_csd_revision": "1.8",
   "ext_csd_revision": "1.8",
Line 2,680: Line 2,680:
|MMC/eMMC standard version.
|MMC/eMMC standard version.
|}
|}
'''emmc_extcsd.devices[ ].health'''<syntaxhighlight lang="json">
'''emmc_extcsd.devices[ ].health'''<syntaxhighlight lang="json" line="1">
{
{
   "life_time_estimation_a": {
   "life_time_estimation_a": {
Line 2,816: Line 2,816:
|Urgent state. Replacement recommended.
|Urgent state. Replacement recommended.
|}
|}
'''emmc_extcsd.devices[ ].boot'''<syntaxhighlight lang="json">
'''emmc_extcsd.devices[ ].boot'''<syntaxhighlight lang="json" line="1">
{
{
   "partition_config": {
   "partition_config": {
Line 2,865: Line 2,865:
'''emmc_extcsd.devices[ ].rpmb'''
'''emmc_extcsd.devices[ ].rpmb'''


RPMB means '''Replay Protected Memory Block'''. It is a protected eMMC area often used for secure storage.<syntaxhighlight lang="json">
RPMB means '''Replay Protected Memory Block'''. It is a protected eMMC area often used for secure storage.<syntaxhighlight lang="json" line="1">
{
{
   "size": {
   "size": {
Line 2,925: Line 2,925:
|RPMB size in GiB.
|RPMB size in GiB.
|}
|}
'''emmc_extcsd.devices[ ].sector'''<syntaxhighlight lang="json">
'''emmc_extcsd.devices[ ].sector'''<syntaxhighlight lang="json" line="1">
{
{
   "sector_count": null,
   "sector_count": null,
Line 2,949: Line 2,949:
|Calculated user capacity, if sector count is available.
|Calculated user capacity, if sector count is available.
|}
|}
'''emmc_extcsd.devices[ ].partitioning'''<syntaxhighlight lang="json">
'''emmc_extcsd.devices[ ].partitioning'''<syntaxhighlight lang="json" line="1">
{
{
   "partitioning_support": {
   "partitioning_support": {
Line 3,043: Line 3,043:
* templow: alert temperature lower limit
* templow: alert temperature lower limit
* tempHigh: alert temperature upper limit
* tempHigh: alert temperature upper limit
<syntaxhighlight lang="json">
<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,057: Line 3,057:
   }
   }
}
}
</syntaxhighlight>Reply-Topic: tempSensor/config/out<syntaxhighlight lang="json">
</syntaxhighlight>Reply-Topic: tempSensor/config/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,086: Line 3,086:
* templow: alert temperature lower limit
* templow: alert temperature lower limit
* tempHigh: alert temperature upper limit
* tempHigh: alert temperature upper limit
<syntaxhighlight lang="json">
<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,095: Line 3,095:
}
}


</syntaxhighlight>Reply-Topic: tempSensor/config/out<syntaxhighlight lang="json">
</syntaxhighlight>Reply-Topic: tempSensor/config/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,117: Line 3,117:
* alert: true (triggered) or false
* alert: true (triggered) or false


Req-Topic: tempSensor/runtime/in<syntaxhighlight lang="json">
Req-Topic: tempSensor/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,126: Line 3,126:
}
}


</syntaxhighlight>Reply-Topic: tempSensor/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>Reply-Topic: tempSensor/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,227: Line 3,227:
'''Go to screen'''
'''Go to screen'''


Req-Topic: tft/runtime/in<syntaxhighlight lang="json">
Req-Topic: tft/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,239: Line 3,239:
}
}


</syntaxhighlight>Reply-Topic: tft/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>Reply-Topic: tft/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,253: Line 3,253:
</syntaxhighlight>'''Set TFT Screen Carousel'''
</syntaxhighlight>'''Set TFT Screen Carousel'''


Req-Topic: tft/runtime/in<syntaxhighlight lang="json">
Req-Topic: tft/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "TIMESTAMP",
   "id": "TIMESTAMP",
Line 3,292: Line 3,292:
'''Reply'''
'''Reply'''


Reply-Topic: '''tft/runtime/out''' <syntaxhighlight lang="json">
Reply-Topic: '''tft/runtime/out''' <syntaxhighlight lang="json" line="1">
{
{
   "id": "TIMESTAMP",
   "id": "TIMESTAMP",
Line 3,324: Line 3,324:
* voltage
* voltage
* current
* current
<syntaxhighlight lang="json">
<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,350: Line 3,350:
}
}


</syntaxhighlight>Reply-Topic: analogInputs/config/out<syntaxhighlight lang="json">
</syntaxhighlight>Reply-Topic: analogInputs/config/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,382: Line 3,382:
* PAUSE (only applicable in continuous mode)
* PAUSE (only applicable in continuous mode)
* RESUME (only applicable in continuous mode)
* RESUME (only applicable in continuous mode)
<syntaxhighlight lang="json">
<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,404: Line 3,404:
}
}


</syntaxhighlight>Reply-Topic: analogInputs/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>Reply-Topic: analogInputs/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,444: Line 3,444:
'''Output:''' current within 0-20 mA
'''Output:''' current within 0-20 mA


'''mode:''' on/off<syntaxhighlight lang="json">
'''mode:''' on/off<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,461: Line 3,461:
}
}


</syntaxhighlight>Reply-Topic: analogOutputs/config/out<syntaxhighlight lang="json">
</syntaxhighlight>Reply-Topic: analogOutputs/config/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,485: Line 3,485:
Req-Topic: analogOutputs/runtime/in
Req-Topic: analogOutputs/runtime/in


'''current:''' current within 0-20 mA<syntaxhighlight lang="json">
'''current:''' current within 0-20 mA<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,503: Line 3,503:
}
}


</syntaxhighlight>Reply-Topic: analoigOutputs/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>Reply-Topic: analoigOutputs/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,526: Line 3,526:
Req-Topic: analogOutputs/runtime/in
Req-Topic: analogOutputs/runtime/in


'''current''': current within 0-20 mA<syntaxhighlight lang="json">
'''current''': current within 0-20 mA<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,542: Line 3,542:
}
}


</syntaxhighlight>Reply-Topic: analogOutputs/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>Reply-Topic: analogOutputs/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,572: Line 3,572:
'''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'''.
'''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">
Req-Topic: digitalInputs/config/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,593: Line 3,593:
   }
   }
}
}
</syntaxhighlight>Reply-Topic: digitalInputs/config/out<syntaxhighlight lang="json">
</syntaxhighlight>Reply-Topic: digitalInputs/config/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,623: Line 3,623:




Req-Topic: digitalInputs/runtime/in<syntaxhighlight lang="json">
Req-Topic: digitalInputs/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,634: Line 3,634:
</syntaxhighlight>Reply-Topic: digitalInputs/runtime/out
</syntaxhighlight>Reply-Topic: digitalInputs/runtime/out


state: high/low<syntaxhighlight lang="json">
state: high/low<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,670: Line 3,670:




Req-Topic: digitalOutputs/runtime/in<syntaxhighlight lang="json">
Req-Topic: digitalOutputs/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,679: Line 3,679:
}   
}   


</syntaxhighlight>Reply-Topic: digitalOutputs/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>Reply-Topic: digitalOutputs/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,725: Line 3,725:




Req-Topic: digitalOutputs/runtime/in<syntaxhighlight lang="json">
Req-Topic: digitalOutputs/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,766: Line 3,766:
   }
   }
}
}
</syntaxhighlight>Reply-Topic: digitalOutputs/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>Reply-Topic: digitalOutputs/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,813: Line 3,813:
If the busi2c-3 is not powered, we will get this:
If the busi2c-3 is not powered, we will get this:


Topic: '''digit a lOutputs/runtime/ out''' <syntaxhighlight lang="json">
Topic: '''digit a lOutputs/runtime/ out''' <syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,865: Line 3,865:




Req-Topic: joystick/runtime/in<syntaxhighlight lang="json">
Req-Topic: joystick/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,876: Line 3,876:
</syntaxhighlight>Reply-Topic: joystick//runtime/out
</syntaxhighlight>Reply-Topic: joystick//runtime/out


state: pressed/released<syntaxhighlight lang="json">
state: pressed/released<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 3,995: Line 3,995:


====== a) Default Datasheet-Aligned Beep ======
====== a) Default Datasheet-Aligned Beep ======
<syntaxhighlight lang="json">
<syntaxhighlight lang="json" line="1">
{
{
"id": <TIMESTAMP>,
"id": <TIMESTAMP>,
Line 4,009: Line 4,009:
Play '''<BEEPS_QUANTITY>''' beeps at '''<FREQUENCY>''' Hz. Each beep lasts '''<BEEP_DURATION>''' seconds, with  
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">{
'''<GAP_BETWEEN_BEEPS>''' seconds of silence between beeps.<syntaxhighlight lang="json" line="1">{
"id": <TIMESTAMP>,
"id": <TIMESTAMP>,
"origin": "APP",
"origin": "APP",
Line 4,024: Line 4,024:


====== c) Continuous Tone ======
====== c) Continuous Tone ======
Play one continuous <FREQUENCY> Hz tone until '''STOP'''.<syntaxhighlight lang="json">
Play one continuous <FREQUENCY> Hz tone until '''STOP'''.<syntaxhighlight lang="json" line="1">
{
{
"id": <TIMESTAMP>,
"id": <TIMESTAMP>,
Line 4,039: Line 4,039:


====== d) Stop Buzzer ======
====== d) Stop Buzzer ======
If you want to stop the beep sequence, just send this payload to the '''buzzer/runtime/in'''<syntaxhighlight lang="json">
If you want to stop the beep sequence, just send this payload to the '''buzzer/runtime/in'''<syntaxhighlight lang="json" line="1">
{
{
"id": <TIMESTAMP>,
"id": <TIMESTAMP>,
Line 4,153: Line 4,153:


====== a) Default BEEP command ======
====== a) Default BEEP command ======
<syntaxhighlight lang="json">
<syntaxhighlight lang="json" line="1">
{
{
"id": <TIMESTAMP>,
"id": <TIMESTAMP>,
Line 4,184: Line 4,184:


====== b) BEEP Sequence - 5 beeps ======
====== b) BEEP Sequence - 5 beeps ======
<syntaxhighlight lang="json">
<syntaxhighlight lang="json" line="1">
{
{
"id": 1779789836000,
"id": 1779789836000,
Line 4,212: Line 4,212:
====== c) Infinite BEEP Sequence ======
====== c) Infinite BEEP Sequence ======


This happens when: "count": 0<syntaxhighlight lang="json">
This happens when: "count": 0<syntaxhighlight lang="json" line="1">
{
{
"id": 1779789836000,
"id": 1779789836000,
Line 4,233: Line 4,233:


====== d) Continuous BEEP ======
====== d) Continuous BEEP ======
In continuous mode, the buzzer remains ON until a STOP command is received.<syntaxhighlight lang="json">
In continuous mode, the buzzer remains ON until a STOP command is received.<syntaxhighlight lang="json" line="1">
{
{
"id": 1779789836000,
"id": 1779789836000,
Line 4,344: Line 4,344:


* '''Default configuration'''
* '''Default configuration'''
<syntaxhighlight lang="json">
<syntaxhighlight lang="json" line="1">
{
{
   "enabled": true,
   "enabled": true,
Line 4,367: Line 4,367:
Returns the current INA Actor configuration
Returns the current INA Actor configuration


'''Request'''<syntaxhighlight lang="json">
'''Request'''<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,375: Line 4,375:
   }
   }
}
}
</syntaxhighlight>'''Response'''<syntaxhighlight lang="json">
</syntaxhighlight>'''Response'''<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,404: Line 4,404:
'''- Manual Runtime read'''
'''- Manual Runtime read'''


'''Request'''<syntaxhighlight lang="json">
'''Request'''<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,412: Line 4,412:
   }
   }
}
}
</syntaxhighlight>'''Response'''<syntaxhighlight lang="json">
</syntaxhighlight>'''Response'''<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,434: Line 4,434:
Period: 1000 ms === 1s
Period: 1000 ms === 1s


'''Response payload'''<syntaxhighlight lang="json">
'''Response payload'''<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,487: Line 4,487:
Scans available network operators (requires SIM and modem enabled).
Scans available network operators (requires SIM and modem enabled).


'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json">
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,495: Line 4,495:
   }
   }
}
}
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,555: Line 4,555:


====== '''Auto Selection''' ======
====== '''Auto Selection''' ======
'''Req-Topic''': modem/config/in<syntaxhighlight lang="json">
'''Req-Topic''': modem/config/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,566: Line 4,566:
   }
   }
}
}
</syntaxhighlight>'''Reply-Topic''': modem/config/out<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-Topic''': modem/config/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,579: Line 4,579:


====== Manual Selection ======
====== Manual Selection ======
'''Req-Topic''': modem/config/in<syntaxhighlight lang="json">
'''Req-Topic''': modem/config/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,591: Line 4,591:
   }
   }
}
}
</syntaxhighlight>'''Reply-Topic''': modem/config/out<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-Topic''': modem/config/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,700: Line 4,700:
Uses the default APN embedded in the modem or provided by the SIM.
Uses the default APN embedded in the modem or provided by the SIM.


'''Req-Topic''': modem/config/in<syntaxhighlight lang="json">
'''Req-Topic''': modem/config/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,711: Line 4,711:
   }
   }
}
}
</syntaxhighlight>'''Reply-Topic''': modem/config/out<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-Topic''': modem/config/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,726: Line 4,726:
Allows full control over APN configuration.
Allows full control over APN configuration.


'''Req-Topic''': modem/config/in<syntaxhighlight lang="json">
'''Req-Topic''': modem/config/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,740: Line 4,740:
   }
   }
}
}
</syntaxhighlight>'''Reply-Topic''': modem/config/out<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-Topic''': modem/config/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,754: Line 4,754:


===== 24.13.6 Get Modem Status =====
===== 24.13.6 Get Modem Status =====
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json">
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,762: Line 4,762:
   }
   }
}
}
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,783: Line 4,783:


===== 24.13.7 Enable / Disable Modem =====
===== 24.13.7 Enable / Disable Modem =====
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json">
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,794: Line 4,794:
   }
   }
}
}
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,810: Line 4,810:
Performs a full modem reset and recovery sequence.
Performs a full modem reset and recovery sequence.


'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json">
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,818: Line 4,818:
   }
   }
}
}
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,889: Line 4,889:
* auto
* auto


'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json">{
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
   "origin": "APP",
   "origin": "APP",
Line 4,898: Line 4,898:
     }
     }
   }
   }
}</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json">
}</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,912: Line 4,912:


===== 24.13.10 Get Signal Strength =====
===== 24.13.10 Get Signal Strength =====
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json">
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,920: Line 4,920:
   }
   }
}
}
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,938: Line 4,938:
This action is '''read-only'''. It does not change the modem state, APN, operator, bearer, or NetworkManager configuration.
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">
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 4,946: Line 4,946:
   }
   }
}
}
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 5,038: Line 5,038:
* Data connectivity
* Data connectivity


'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json">
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 5,046: Line 5,046:
   }
   }
}
}
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 5,072: Line 5,072:
This approach is designed for IoT / field devices using '''capped cellular SIM cards''', where a classic speed test would consume too much data.
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">
'''Req-Topic''': modem/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 5,082: Line 5,082:
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out
</syntaxhighlight>'''Reply-Topic''': modem/runtime/out


'''Success reply''':<syntaxhighlight lang="json">
'''Success reply''':<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 5,095: Line 5,095:
</syntaxhighlight>'''Error reply'''
</syntaxhighlight>'''Error reply'''


Example when the modem is not connected:<syntaxhighlight lang="json">
Example when the modem is not connected:<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 5,106: Line 5,106:
   }
   }
}
}
</syntaxhighlight>Example when an unexpected internal error occurs:<syntaxhighlight lang="json">
</syntaxhighlight>Example when an unexpected internal error occurs:<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 5,196: Line 5,196:


===== 24.13.14 Get Raw Modem Info (Reserved) =====
===== 24.13.14 Get Raw Modem Info (Reserved) =====
'''Req-Topic''': reserved/modem/runtime/in<syntaxhighlight lang="json">
'''Req-Topic''': reserved/modem/runtime/in<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 5,207: Line 5,207:
   }
   }
}
}
</syntaxhighlight>'''Reply-Topic''': reserved/modem/runtime/out<syntaxhighlight lang="json">
</syntaxhighlight>'''Reply-Topic''': reserved/modem/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 5,224: Line 5,224:
mmcli -m 0 --output-json
mmcli -m 0 --output-json


Example output:<syntaxhighlight lang="json">
Example output:<syntaxhighlight lang="json" line="1">
{
{
   "modem": {
   "modem": {
Line 5,558: Line 5,558:
* If no modem is detected:
* If no modem is detected:


'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json">
'''Reply-Topic''': modem/runtime/out<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",
Line 5,573: Line 5,573:


* If SIM is locked or missing: '''Reply-Topic''': modem/runtime/out
* If SIM is locked or missing: '''Reply-Topic''': modem/runtime/out
<syntaxhighlight lang="json">
<syntaxhighlight lang="json" line="1">
{
{
   "id": "<TIMESTAMP>",
   "id": "<TIMESTAMP>",

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]