SENSBLUE ATLAS: Difference between revisions
No edit summary Tag: Manual revert |
|||
| (48 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
[[File:SENSBLUE-ATLAS-Gateway.png|center|frameless|360x360px]] | [[File:SENSBLUE-ATLAS-Gateway.png|center|frameless|360x360px]] | ||
== | <div style="margin: 15px 0;"> | ||
<span class="atlas-btn">[[SENSBLUE ATLAS/Technical Resources|Technical Resources]]</span> | |||
</div> | |||
== | == '''Datasheet''' == | ||
=== 2. Table of SENSBLUE ATLAS Reference ID Model Number === | |||
{| class="wikitable" | {| class="wikitable" | ||
| | | | ||
| Line 27: | Line 31: | ||
|} | |} | ||
=== | === 3. General Description === | ||
SENSBLUE ATLAS is a single board computer that connects sensors and assets, runs control logic and ships to production without platform changes. | SENSBLUE ATLAS is a single board computer that connects sensors and assets, runs control logic and ships to production without platform changes. | ||
Designed for industrial teams who need one dependable path from experiments to operations. | Designed for industrial teams who need one dependable path from experiments to operations. | ||
==== | ==== 3.1 Key Features ==== | ||
'''Processor:''' | '''Processor:''' | ||
| Line 63: | Line 67: | ||
* Other versions under request. | * Other versions under request. | ||
=== | === 4. Hardware Specifications === | ||
{| class="wikitable tech-table" style="width: 100%;" | {| class="wikitable tech-table" style="width: 100%;" | ||
!style="width: 50%;"|'''Parameter''' | !style="width: 50%;"|'''Parameter''' | ||
| Line 96: | Line 100: | ||
|} | |} | ||
=== | === 5. Power === | ||
{| class="wikitable tech-table" style="width: 100%;" | {| class="wikitable tech-table" style="width: 100%;" | ||
!'''Parameter''' | !style="width: 50%;"|'''Parameter''' | ||
!'''Specification''' | !style="width: 50%;"|'''Specification''' | ||
|- | |- | ||
|Input voltage | |Input voltage | ||
| Line 123: | Line 127: | ||
|} | |} | ||
=== | === 6. Digital Inputs === | ||
{| class="wikitable tech-table" style="width: 100%;" | {| class="wikitable tech-table" style="width: 100%;" | ||
!style="width: 50%;"|'''Parameter''' | !style="width: 50%;"|'''Parameter''' | ||
| Line 162: | Line 166: | ||
|} | |} | ||
=== | === 7. Digital Outputs (Relay) === | ||
{| class="wikitable tech-table" style="width: 100%;" | {| class="wikitable tech-table" style="width: 100%;" | ||
!style="width: 50%;"|'''Parameter''' | !style="width: 50%;"|'''Parameter''' | ||
| Line 186: | Line 190: | ||
|} | |} | ||
=== | === 8. Digital Outputs (Transistor/ SSR) === | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!style="width: 50%;"|'''Parameter''' | !style="width: 50%;"|'''Parameter''' | ||
| Line 210: | Line 214: | ||
|} | |} | ||
=== | === 9. Analog Inputs === | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!style="width: 50%;"|'''Parameter''' | !style="width: 50%;"|'''Parameter''' | ||
| Line 255: | Line 259: | ||
|} | |} | ||
=== | === 10. Analog Outputs === | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!style="width: 50%;"|'''Parameter''' | !style="width: 50%;"|'''Parameter''' | ||
| Line 285: | Line 289: | ||
|} | |} | ||
=== | === 11. Communication Interfaces === | ||
==== | ==== 11.1 Ethernet ==== | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
! style="width: 50%;" | '''Parameter''' | ! style="width: 50%;" | '''Parameter''' | ||
| Line 305: | Line 309: | ||
|} | |} | ||
==== | ==== 11.2 RS-485 ==== | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!style="width: 50%;"|'''Parameter''' | !style="width: 50%;"|'''Parameter''' | ||
| Line 323: | Line 327: | ||
|} | |} | ||
==== | ==== 11.3 USB ==== | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!style="width: 50%;"|'''Parameter''' | !style="width: 50%;"|'''Parameter''' | ||
| Line 344: | Line 348: | ||
|} | |} | ||
==== | ==== 11.4 HDMI ==== | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!'''Parameter''' | !style="width: 50%;"|'''Parameter''' | ||
!'''Specification''' | !style="width: 50%;"|'''Specification''' | ||
|- | |- | ||
|Ports | |Ports | ||
| Line 359: | Line 363: | ||
|} | |} | ||
=== | === 12. RF Communications === | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!'''Technology''' | !style="width: 50%;"|'''Technology''' | ||
!'''Specification''' | !style="width: 50%;"|'''Specification''' | ||
|- | |- | ||
|Wi-Fi | |Wi-Fi | ||
| Line 377: | Line 381: | ||
|} | |} | ||
==== | ==== 12.1 Antenna Connectors ==== | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!'''Connector''' | !style="width: 50%;"|'''Connector''' | ||
!'''Usage''' | !style="width: 50%;"|'''Usage''' | ||
|- | |- | ||
|RP-SMA | |RP-SMA | ||
| Line 389: | Line 393: | ||
|} | |} | ||
=== | === 13. Local Peripherals === | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!'''Peripheral''' | !style="width: 50%;"|'''Peripheral''' | ||
!'''Description''' | !style="width: 50%;"|'''Description''' | ||
|- | |- | ||
|Temperature sensor | |Temperature sensor | ||
| Line 407: | Line 411: | ||
|} | |} | ||
=== | === 14. HDMI === | ||
==== | ==== 14. 1 Display ==== | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!'''Parameter''' | !style="width: 50%;"|'''Parameter''' | ||
!'''Specification ''' | !style="width: 50%;"|'''Specification ''' | ||
|- | |- | ||
|Type | |Type | ||
| Line 433: | Line 437: | ||
|} | |} | ||
==== | ==== 14. 2 Joystick ==== | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!'''Parameter''' | !style="width: 50%;"|'''Parameter''' | ||
!'''Specification ''' | !style="width: 50%;"|'''Specification ''' | ||
|- | |- | ||
|Positions | |Positions | ||
| Line 448: | Line 452: | ||
|} | |} | ||
=== | === 15. Mechanical === | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!'''Parameter''' | !style="width: 50%;"|'''Parameter''' | ||
!'''Specification ''' | !style="width: 50%;"|'''Specification ''' | ||
|- | |- | ||
|Mounting | |Mounting | ||
| Line 466: | Line 470: | ||
|} | |} | ||
=== | === 16. Environmental === | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!'''Parameter''' | !'''Parameter''' | ||
| Line 487: | Line 491: | ||
|} | |} | ||
=== | === 17. Certifications === | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!'''Certification''' | !style="width: 50%;"|'''Certification''' | ||
!'''Standard ''' | !style="width: 50%;"|'''Standard ''' | ||
|- | |- | ||
|CE | |CE | ||
| Line 505: | Line 509: | ||
|} | |} | ||
=== | === 18. Connectivity === | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!'''Parameter''' | !style="width: 50%;"|'''Parameter''' | ||
!'''Specification ''' | !style="width: 50%;"|'''Specification ''' | ||
|- | |- | ||
|Connector type | |Connector type | ||
| Line 529: | Line 533: | ||
|} | |} | ||
=== | === 19. Expansion === | ||
{| class="wikitable tech-table" | {| class="wikitable tech-table" | ||
!'''Feature''' | !style="width: 50%;"|'''Feature''' | ||
!'''Description ''' | !style="width: 50%;"|'''Description ''' | ||
|- | |- | ||
|Piggyback area | |Piggyback area | ||
| Line 552: | Line 556: | ||
|M.2 NVMe SSD connector | |M.2 NVMe SSD connector | ||
|} | |} | ||
=== 20. Mechanical Drawings === | |||
==== Front View ==== | |||
[[File:Atlas FrontView.png|center|frameless|670x670px]] | |||
==== Bottom View ==== | |||
[[File:Atlas bottomview.png|center|frameless|590x590px]] | |||
==== Top View ==== | |||
[[File:Atlas topview.png|center|frameless|688x688px]] | |||
=== 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 === | |||
{| class="wikitable" | |||
| | |||
|'''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> | |||
=== 25. Relay Outputs Actor === | |||
==== 25.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. | |||
===== 25.1.1 Set/reset digital output pin/pins state ===== | |||
Both relays '''default''' state is '''open'''. | |||
Req-Topic: relayOutputs/config/in | |||
<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskParams": { | |||
"D01": { | |||
"state": "open" | |||
}, | |||
"D02": { | |||
"state": "open" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: relayOutputs/config/out | |||
<syntaxhighlight lang="json">{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"D01": { | |||
"success": true, | |||
"state": "open" | |||
}, | |||
"D02": { | |||
"success": true, | |||
"state": "open" | |||
} | |||
} | |||
} | |||
}</syntaxhighlight> | |||
===== 25.1.2 Get all relays state ===== | |||
Req-Topic: relayOutputs/runtime/in<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"action": "READ" | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: relayOutputs/runtime/out <syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"D01": { | |||
"success": true, | |||
"state": "open" | |||
}, | |||
"D02": { | |||
"success": true, | |||
"state": "close" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
===== 25.1.3 Set all relays state ===== | |||
Req-Topic: relayOutputs/runtime/in<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"action": "SET", | |||
"taskParams": { | |||
"D01": { | |||
"state": "open" | |||
}, | |||
"D02": { | |||
"state": "close" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: relayOutputs/runtime/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"D01": { | |||
"success": true, | |||
"state": "open" | |||
}, | |||
"D02": { | |||
"success": true, | |||
"state": "close" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
=== 26. RTC Actor === | |||
==== 26.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. | |||
===== 26.1.1 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<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskParams": { | |||
"CLOCK_SET_MODE": { | |||
"mode": "timer", | |||
"alarmSet": "[timestamp epoch ms]", | |||
"timerSetSeconds": "<INT>" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight>Req-Topic: clock/config/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"success": true, | |||
"CLOCK_SET_MODE": { | |||
"mode": "timer", | |||
"alarmSet": "[timestamp epoch ms]", | |||
"timerSetSeconds": "<INT>" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
===== 26.1.2 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<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"action": "TOGGLE" | |||
} | |||
} | |||
</syntaxhighlight>Req-Topic: clock/config/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"success": true, | |||
"rtcState": "OFF" | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
===== 26.1.3 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<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"action": "READ" | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: clock/config/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"success": true, | |||
"CLOCK_CONFIGS": { | |||
"mode": "timer", | |||
"alarmSet": "[timestamp epoch ms]", | |||
"timerSetSeconds": "<INT>", | |||
"rtcState": "ON" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
===== 26.1.4 Read clock ===== | |||
Req-Topic: clock/runtime/in <syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"success": true, | |||
"timestamp": "[timestamp epoch ms]" | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
==== 26.2 Synchronization loop flowchart (every 30 seconds) ==== | |||
'''RTC Actor - Overview''' | |||
[[File:RTCActor Overview.svg|center|frameless|774x774px]] | |||
=== 27. Core System Health Actor === | |||
==== 27.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. | |||
==== 27.2 Runtime Data ==== | |||
'''Topic: systemHea l th/runtime/ out''' | |||
Publish rate: '''1 Hz''' (one message per second, clock-jump safe) | |||
===== 27.2.1 Metrics Provided ===== | |||
{| class="wikitable tech-table" | |||
!'''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) <syntaxhighlight lang="json"> | |||
{ | |||
"id": 1736022028123, | |||
"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 | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
==== 27.3 Peripherals health ==== | |||
In order get the peripherals health we had to implement a SystemHealth actor in each bus manager (busi2cO, busi2c-1, etc. ... ). | |||
[[File:Peripherals health.svg|center|frameless|792x792px]] | |||
===== 27.3.1 Example ===== | |||
'''For busi2c-0:''' | |||
Reply topic: '''systemHealth/busi2c-0/runtime/out''' | |||
Payload:<syntaxhighlight lang="json"> | |||
{ | |||
"id": 1770378753024, | |||
"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 | |||
} | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight>'''For busi2c-1:''' | |||
Reply topic: '''systemHealth/busi2c-1/runtime/out''' | |||
Payload:<syntaxhighlight lang="json"> | |||
{ | |||
"id": 1770382405107, | |||
"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" | |||
} | |||
} | |||
} | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
=== 28. TempSensor Actor === | |||
==== 28.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. | |||
===== 28.1.1 Set temperature sensor configurations ===== | |||
Req-Topic: tempSensor/config/in | |||
ALERT: | |||
* activate: true(active)/false | |||
* templow: alert temperature lower limit | |||
* tempHigh: alert temperature upper limit | |||
<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskParams": { | |||
"ALERT": { | |||
"activate": true, | |||
"tempLow": 0, | |||
"tempHigh": 80 | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: tempSensor/config/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"success": true, | |||
"ALERT": { | |||
"activate": true, | |||
"tempLow": 0, | |||
"tempHigh": 80 | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
===== 28.1.2 Read temperature sensor configurations ===== | |||
Req-Topic: tempSensor/config/in | |||
ALERT: | |||
* activate: true(active)/false | |||
LIMITS: | |||
* templow: alert temperature lower limit | |||
* tempHigh: alert temperature upper limit | |||
<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"action": "READ" | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: tempSensor/config/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"success": true, | |||
"ALERT": { | |||
"activate": true, | |||
"tempLow": 0, | |||
"tempHigh": 80 | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
===== 28.1.3 Read temperature and alert status ===== | |||
* unit: Temperature unit of measure | |||
* alert: true (triggered) or false | |||
Req-Topic: tempSensor/runtime/in<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"action": "READ" | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: tempSensor/runtime/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"success": true, | |||
"data": { | |||
"temperature": <_FLOAT_>, | |||
"unit": "C", | |||
"alert": true | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
=== 29. TFT Actor === | |||
==== 29.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. | |||
==== 29.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 | |||
===== 29.2.1 Screen Carousel Concept ===== | |||
The TFT actor maintains an '''ordered list of screens''' (carousel). | |||
* Screens are navigated using the joystick: | |||
- LEFT --> Previous screen | |||
- RIGHT --> Next screen | |||
* The carousel wraps around: | |||
- LEFT on first screen --> last screen | |||
- RIGHT on last screen --> first screen | |||
===== 29.2.2 Screen Types ===== | |||
The TFT actor supports the following screen types: | |||
'''a.) Image Screen''' | |||
* Displays a static JPEG image | |||
* Default screen shown at boot | |||
* No user interaction required | |||
'''b.) Network Information Screen''' | |||
* Display a interface with information about the networks of the device | |||
* Updated on load | |||
* No user interaction required | |||
===== 29.2.3 Joystick Navigation Logic ===== | |||
'''Carousel Navigation:''' | |||
{| class="wikitable" | |||
|'''Joystick Input''' | |||
|'''Action''' | |||
|- | |||
|LEFT | |||
|Previous screen | |||
|- | |||
|RIGHT | |||
|Next screen | |||
|- | |||
|DOWN | |||
|Refresh current screen | |||
|} | |||
===== 29.2.4 Boot Behavior ===== | |||
At system boot: | |||
# TFT actor initializes the display | |||
# Last available carousel is loaded | |||
# First screen is rendered | |||
# Joystick subscriptions are activated | |||
# Actor waits for runtime commands | |||
===== 29.2.5 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 | |||
==== 29.3 User interaction through MQTT ==== | |||
Enabling interaction with the carousel using the topic tft/runtime/in . Actions available will be public to the user. | |||
'''Runtime commands''' | |||
'''Go to screen''' | |||
Req-Topic: tft/runtime/in<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"action": "SET_CAROUSEL", | |||
"params": { | |||
"index": 2 | |||
} | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: tft/runtime/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "tft", | |||
"task": { | |||
"taskResult": { | |||
"success": true, | |||
"index": 2 | |||
} | |||
} | |||
} | |||
</syntaxhighlight>'''Set TFT Screen Carousel''' | |||
Req-Topic: tft/runtime/in<syntaxhighlight lang="json"> | |||
{ | |||
"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?" | |||
} | |||
] | |||
} | |||
} | |||
} | |||
</syntaxhighlight>'''Parameters:''' | |||
{| class="wikitable" | |||
|'''Field''' | |||
|'''Description''' | |||
|- | |||
|screens | |||
|Ordered list of screens | |||
|- | |||
|Start lndex | |||
|Initial active screen (optional, default = 0) | |||
|} | |||
'''Reply''' | |||
Reply-Topic: '''tft/runtime/out''' <syntaxhighlight lang="json"> | |||
{ | |||
"id": "TIMESTAMP", | |||
"origin": "tft", | |||
"task": { | |||
"taskResult": { | |||
"success": true, | |||
"activeIndex": 0, | |||
"totalScreens": 3 | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
=== 30. Analoglnputs Actor === | |||
==== 30.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. | |||
===== 30.1.1 Configurations ===== | |||
''' Topic: analoglnputs/config/in - Set ADC channels configurations''' | |||
'''mode''' | |||
* continuous | |||
* single | |||
'''type''' | |||
* voltage | |||
* current | |||
<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskParams": { | |||
"AI1": { | |||
"mode": "single", | |||
"type": "voltage" | |||
}, | |||
"AI2": { | |||
"mode": "single", | |||
"type": "voltage" | |||
}, | |||
"AI3": { | |||
"mode": "single", | |||
"type": "current" | |||
}, | |||
"AI4": { | |||
"mode": "single", | |||
"type": "current" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: analoglnputs/config/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"AI1": { | |||
"success": true | |||
}, | |||
"AI2": { | |||
"success": true | |||
}, | |||
"AI3": { | |||
"success": true | |||
}, | |||
"AI4": { | |||
"success": true | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
===== 30.1.2 Runtime Data ===== | |||
'''Topic: analoglnputs/runtime/in.''' | |||
action: | |||
* READ | |||
* PAUSE (only applicable in continuous mode) | |||
* RESUME (only applicable in continuous mode) | |||
<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskParams": { | |||
"AI1": { | |||
"action": "READ" | |||
}, | |||
"AI2": { | |||
"action": "READ" | |||
}, | |||
"AI3": { | |||
"action": "READ" | |||
}, | |||
"AI4": { | |||
"action": "READ" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: analoglnputs/runtime/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"AI1": { | |||
"success": true, | |||
"value": <_FLOAT_> | |||
}, | |||
"AI2": { | |||
"success": true, | |||
"value": <_FLOAT_> | |||
}, | |||
"AI3": { | |||
"success": true, | |||
"value": <_FLOAT_> | |||
}, | |||
"AI4": { | |||
"success": true, | |||
"value": <_FLOAT_> | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
=== 31. Analog Outputs Actor === | |||
==== 31.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. | |||
===== 31.1.1 Set analog outputs signal ===== | |||
Req-Topic: analogOutputs/config/in | |||
'''Output:''' current within 0-20 mA | |||
'''mode:''' on/off<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskParams": { | |||
"mode": "on", | |||
"AO1": { | |||
"current": <_FLOAT_> | |||
}, | |||
"AO2": { | |||
"current": <_FLOAT_> | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: analogOutputs/config/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"mode": "on", | |||
"AO1": { | |||
"success": true, | |||
"current": <_FLOAT_> | |||
}, | |||
"AO2": { | |||
"success": true, | |||
"current": <_FLOAT_> | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
===== 31.1.2 Set analog outputs ===== | |||
Req-Topic: analogOutputs/runtime/in | |||
'''current:''' current within 0-20 mA<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskParams": { | |||
"AO1": { | |||
"action": "SET", | |||
"current": <_FLOAT_> | |||
}, | |||
"AO2": { | |||
"action": "SET", | |||
"current": <_FLOAT_> | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: analoigOutputs/runtime/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"AO1": { | |||
"success": true, | |||
"current": <_FLOAT_> | |||
}, | |||
"AO2": { | |||
"success": true, | |||
"current": <_FLOAT_> | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
===== 31.1.3 Read analog outputs settings ===== | |||
Req-Topic: analogOutputs/runtime/in | |||
'''current''': current within 0-20 mA<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskParams": { | |||
"AO1": { | |||
"action": "READ" | |||
}, | |||
"AO2": { | |||
"action": "READ" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: analogOutputs/runtime/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"AO1": { | |||
"success": true, | |||
"current": <_FLOAT_> | |||
}, | |||
"AO2": { | |||
"success": true, | |||
"current": <_FLOAT_> | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
=== 32. Digital lnputs Actor === | |||
==== 32.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. | |||
===== 32.1.1 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: digitallnputs/config/in<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskParams": { | |||
"DI1": { | |||
"speed": "fast" | |||
}, | |||
"DI2": { | |||
"speed": "slow" | |||
}, | |||
"DI3": { | |||
"speed": "fast" | |||
}, | |||
"DI4": { | |||
"speed": "fast" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: digitallnputs/config/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"DI1": { | |||
"success": true, | |||
"speed": "fast" | |||
}, | |||
"DI2": { | |||
"success": true, | |||
"speed": "slow" | |||
}, | |||
"DI3": { | |||
"success": true, | |||
"speed": "fast" | |||
}, | |||
"DI4": { | |||
"success": true, | |||
"speed": "fast" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
===== 32.1.2 Get all digital input pins state ===== | |||
Req-Topic: digitallnputs/runtime/in<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"action": "READ" | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: digitallnputs/runtime/out | |||
state: high/low<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"DI1": { | |||
"success": true, | |||
"state": "high" | |||
}, | |||
"DI2": { | |||
"success": true, | |||
"state": "low" | |||
}, | |||
"DI3": { | |||
"success": true, | |||
"state": "high" | |||
}, | |||
"DI4": { | |||
"success": true, | |||
"state": "low" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
=== 33. Digital Outputs Actor === | |||
==== 33.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. | |||
===== 33.1.1 Get all digital output pins state ===== | |||
Req-Topic: digitalOutputs/runtime/in<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"action": "READ" | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: digitalOutputs/runtime/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"DO1": { | |||
"success": true, | |||
"state": "low" | |||
}, | |||
"DO2": { | |||
"success": true, | |||
"state": "high" | |||
}, | |||
"DO3": { | |||
"success": true, | |||
"state": "high" | |||
}, | |||
"DO4": { | |||
"success": true, | |||
"state": "low" | |||
}, | |||
"DO5": { | |||
"success": true, | |||
"state": "low" | |||
}, | |||
"DO6": { | |||
"success": true, | |||
"state": "low" | |||
}, | |||
"DO7": { | |||
"success": true, | |||
"state": "low" | |||
}, | |||
"DO8": { | |||
"success": true, | |||
"state": "low" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
===== 33.1.2 Set all digital output pins state ===== | |||
Req-Topic: digitalOutputs/runtime/in<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskParams": { | |||
"DO1": { | |||
"action": "SET", | |||
"state": "low" | |||
}, | |||
"DO2": { | |||
"action": "SET", | |||
"state": "high" | |||
}, | |||
"DO3": { | |||
"action": "SET", | |||
"state": "high" | |||
}, | |||
"DO4": { | |||
"action": "SET", | |||
"state": "low" | |||
}, | |||
"DO5": { | |||
"action": "SET", | |||
"state": "low" | |||
}, | |||
"DO6": { | |||
"action": "SET", | |||
"state": "low" | |||
}, | |||
"DO7": { | |||
"action": "SET", | |||
"state": "low" | |||
}, | |||
"DO8": { | |||
"action": "SET", | |||
"state": "low" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: digitalOutputs/runtime/out<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"D01": { | |||
"success": true, | |||
"state": "low" | |||
}, | |||
"D02": { | |||
"success": true, | |||
"state": "high" | |||
}, | |||
"D03": { | |||
"success": true, | |||
"state": "high" | |||
}, | |||
"D04": { | |||
"success": true, | |||
"state": "high" | |||
}, | |||
"D05": { | |||
"success": true, | |||
"state": "high" | |||
}, | |||
"D06": { | |||
"success": true, | |||
"state": "low" | |||
}, | |||
"D07": { | |||
"success": true, | |||
"state": "low" | |||
}, | |||
"D08": { | |||
"success": true, | |||
"state": "low" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
==== 33.2 Notes ==== | |||
If the busi2c-3 is not powered, we will get this: | |||
Topic: '''digit a lOutputs/runtime/ out''' <syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"DO1": { | |||
"success": false, | |||
"state": "DO_not_powered" | |||
}, | |||
"DO2": { | |||
"success": false, | |||
"state": "DO_not_powered" | |||
}, | |||
"DO3": { | |||
"success": false, | |||
"state": "DO_not_powered" | |||
}, | |||
"DO4": { | |||
"success": false, | |||
"state": "DO_not_powered" | |||
}, | |||
"DO5": { | |||
"success": false, | |||
"state": "DO_not_powered" | |||
}, | |||
"DO6": { | |||
"success": false, | |||
"state": "DO_not_powered" | |||
}, | |||
"DO7": { | |||
"success": false, | |||
"state": "DO_not_powered" | |||
}, | |||
"DO8": { | |||
"success": false, | |||
"state": "DO_not_powered" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
=== 34. Joystick Actor === | |||
==== 34.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. | |||
===== 34.1.1 Get all joystick pins state ===== | |||
Req-Topic: joystick/runtime/in<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"action": "READ" | |||
} | |||
} | |||
</syntaxhighlight>Reply-Topic: joystick//runtime/out | |||
state: pressed/released<syntaxhighlight lang="json"> | |||
{ | |||
"id": "<TIMESTAMP>", | |||
"origin": "APP", | |||
"task": { | |||
"taskResult": { | |||
"JLEFT": { | |||
"success": true, | |||
"state": "pressed" | |||
}, | |||
"JRIGHT": { | |||
"success": true, | |||
"state": "released" | |||
}, | |||
"JUP": { | |||
"success": true, | |||
"state": "released" | |||
}, | |||
"JDOWN": { | |||
"success": true, | |||
"state": "released" | |||
}, | |||
"JCENTER": { | |||
"success": true, | |||
"state": "released" | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
=== 35. Included Software Stack === | |||
[[File:AtlasCode.svg|center|frameless|583x583px]] | |||
=== 36. Hardware Libraries === | |||
[IMAGE PLACEHOLDER] | |||
=== 37. Related Products === | |||
{| class="wikitable" | |||
|'''PA''' | |||
|'''Name''' | |||
|'''Requirements''' | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|} | |||
=== 38. Accessories === | |||
{| class="wikitable" | |||
|'''PA''' | |||
|'''Name''' | |||
|'''Requirements''' | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|} | |||
=== 39. Document History === | |||
{| class="wikitable" | |||
|'''Version''' | |||
|'''Description''' | |||
|'''Date''' | |||
|- | |||
|SBADATAv0.1 | |||
|First version of SENSBLUE ATLAS Datasheet | |||
|11/03/2026 | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|} | |||
=== 40. SENSBLUE ATLAS in-the-field === | |||
[IMAGE PLACEHOLDER] | |||
Latest revision as of 14:51, 13 March 2026

Datasheet
2. Table of SENSBLUE ATLAS Reference ID Model Number
| Paxxxxxxxx | |||||
| PAxxxxxxxx |
3. 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.
3.1 Key Features
Processor:
- Raspberry Pi CM4 (quad-core Cortex-A72)
I/O:
- 12 DO (Digital Outputs)
- 6 AI (Analog Inputs)
- 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.
4. 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 |
5. 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) |
6. 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 |
7. 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 |
8. 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 |
9. 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 |
10. 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 |
11. Communication Interfaces
11.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 |
11.2 RS-485
| Parameter | Specification |
|---|---|
| Mode | Half-duplex |
| Control | TX_EN line |
| Protocol | Transparent/ any |
| Isolation | None |
11.3 USB
| Parameter | Specification |
|---|---|
| Ports | 2 |
| Type | USB-A |
| Standard | USB 2.0 Host |
| Maximum current | 400 mA per port |
| Protection | Overcurrent protection |
11.4 HDMI
| Parameter | Specification |
|---|---|
| Ports | 1 |
| Connector | HDMI full-size |
| Maximum resolution | Depends on CM4 and OS |
12. RF Communications
| Technology | Specification |
|---|---|
| Wi-Fi | Integrated in CM4 |
| BLE | Integrated in CM4 |
| LTE | M.2 NGFF modem SIM7600G |
| SIM | External access |
12.1 Antenna Connectors
| Connector | Usage |
|---|---|
| RP-SMA | Wi-Fi / BLE |
| SMA | LTE |
13. 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 |
14. HDMI
14. 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 |
14. 2 Joystick
| Parameter | Specification |
|---|---|
| Positions | 5 (Up/ Down/ Left/ Right/ Enter) |
| Type | Mechanical tactile switch |
| Interface | GPIO Expander |
15. Mechanical
| Parameter | Specification |
|---|---|
| Mounting | DIN rail (EN 60715) |
| Enclosure | MAT0091092 (same as iSense / iCee) |
| Protection rating | IP20 |
| Mounting method | DIN rail snap-fit |
16. 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 |
17. Certifications
| Certification | Standard |
|---|---|
| CE | Yes |
| EMC | 2014/30/EU |
| Radio | 2014/53/EU (RED) |
| Ro HS | 2011/65/EU |
18. 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 |
19. 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 |
20. Mechanical Drawings
Front View

Bottom View

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>
25. Relay Outputs Actor
25.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.
25.1.1 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"
}
}
}
}
25.1.2 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"
}
}
}
}
25.1.3 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"
}
}
}
}
26. RTC Actor
26.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.
26.1.1 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>"
}
}
}
}
26.1.2 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"
}
}
}
26.1.3 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"
}
}
}
}
26.1.4 Read clock
Req-Topic: clock/runtime/in
{
"id": "<TIMESTAMP>",
"origin": "APP",
"task": {
"taskResult": {
"success": true,
"timestamp": "[timestamp epoch ms]"
}
}
}
26.2 Synchronization loop flowchart (every 30 seconds)
RTC Actor - Overview
27. Core System Health Actor
27.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.
27.2 Runtime Data
Topic: systemHea l th/runtime/ out
Publish rate: 1 Hz (one message per second, clock-jump safe)
27.2.1 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": 1736022028123,
"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
}
}
}
27.3 Peripherals health
In order get the peripherals health we had to implement a SystemHealth actor in each bus manager (busi2cO, busi2c-1, etc. ... ).
27.3.1 Example
For busi2c-0:
Reply topic: systemHealth/busi2c-0/runtime/out
Payload:
{
"id": 1770378753024,
"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": 1770382405107,
"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"
}
}
}
}
}
}
}
28. TempSensor Actor
28.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.
28.1.1 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
}
}
}
}
28.1.2 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
}
}
}
}
28.1.3 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
}
}
}
}
29. TFT Actor
29.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.
29.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
29.2.1 Screen Carousel Concept
The TFT actor maintains an ordered list of screens (carousel).
- Screens are navigated using the joystick:
- LEFT --> Previous screen
- RIGHT --> Next screen
- The carousel wraps around:
- LEFT on first screen --> last screen
- RIGHT on last screen --> first screen
29.2.2 Screen Types
The TFT actor supports the following screen types:
a.) Image Screen
- Displays a static JPEG image
- Default screen shown at boot
- No user interaction required
b.) Network Information Screen
- Display a interface with information about the networks of the device
- Updated on load
- No user interaction required
29.2.3 Joystick Navigation Logic
Carousel Navigation:
| Joystick Input | Action |
| LEFT | Previous screen |
| RIGHT | Next screen |
| DOWN | Refresh current screen |
29.2.4 Boot Behavior
At system boot:
- TFT actor initializes the display
- Last available carousel is loaded
- First screen is rendered
- Joystick subscriptions are activated
- Actor waits for runtime commands
29.2.5 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
29.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
}
}
}
30. Analoglnputs Actor
30.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.
30.1.1 Configurations
Topic: analoglnputs/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: analoglnputs/config/out
{
"id": "<TIMESTAMP>",
"origin": "APP",
"task": {
"taskResult": {
"AI1": {
"success": true
},
"AI2": {
"success": true
},
"AI3": {
"success": true
},
"AI4": {
"success": true
}
}
}
}
30.1.2 Runtime Data
Topic: analoglnputs/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: analoglnputs/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_>
}
}
}
}
31. Analog Outputs Actor
31.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.
31.1.1 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_>
}
}
}
}
31.1.2 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_>
}
}
}
}
31.1.3 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_>
}
}
}
}
32. Digital lnputs Actor
32.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.
32.1.1 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: digitallnputs/config/in
{
"id": "<TIMESTAMP>",
"origin": "APP",
"task": {
"taskParams": {
"DI1": {
"speed": "fast"
},
"DI2": {
"speed": "slow"
},
"DI3": {
"speed": "fast"
},
"DI4": {
"speed": "fast"
}
}
}
}
Reply-Topic: digitallnputs/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"
}
}
}
}
32.1.2 Get all digital input pins state
Req-Topic: digitallnputs/runtime/in
{
"id": "<TIMESTAMP>",
"origin": "APP",
"task": {
"action": "READ"
}
}
Reply-Topic: digitallnputs/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"
}
}
}
}
33. Digital Outputs Actor
33.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.
33.1.1 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"
}
}
}
}
33.1.2 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"
}
}
}
}
33.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"
}
}
}
}
34. Joystick Actor
34.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.
34.1.1 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"
}
}
}
}
35. Included Software Stack
36. Hardware Libraries
[IMAGE PLACEHOLDER]
37. Related Products
| PA | Name | Requirements |
38. Accessories
| PA | Name | Requirements |
39. Document History
| Version | Description | Date |
| SBADATAv0.1 | First version of SENSBLUE ATLAS Datasheet | 11/03/2026 |
40. SENSBLUE ATLAS in-the-field
[IMAGE PLACEHOLDER]