Jump to content

SENSBLUE ATLAS/Datasheet: Difference between revisions

No edit summary
Tag: Manual revert
 
(93 intermediate revisions by the same user not shown)
Line 1: Line 1:
[[File:SENSBLUE-ATLAS-Gateway.png|center|frameless|360x360px]]
{{DISPLAYTITLE:Datasheet}}
 
<div class="buy-now-container">
<div style="margin: 15px 0;">
<span class="button-buy-now">[https://atronia.eu/product/sensblue-atlas/ Buy Now]</span>
<span class="atlas-btn">[[SENSBLUE ATLAS/Technical Resources|Technical Resources]]</span>
</div>
</div>


[[File:SENSBLUE-ATLAS-Gateway.png|center|frameless|397x397px]]
== '''Datasheet''' ==
== '''Datasheet''' ==


=== 1. Table of SENSBLUE ATLAS Reference ID Model Number ===
=== 1. Table of SENSBLUE ATLAS Reference ID Model Number ===
{| class="wikitable"
{| class="wikitable"
|
|'''Reference Number'''
|
|'''Name'''
|
|'''Version'''
|
|'''RAM'''
|
|'''Modem'''
|
|-
|PA000000102
|ATLAS IoT SBC V1 CM4. 2GB M2.0 M1 PB0
|V1
|2GB
|Yes
|-
|-
|Paxxxxxxxx
|PA000000103
|
|ATLAS IoT SBC V1 CM4. 2GB M2.0 M0 PB0
|
|V1
|
|2GB
|
|Yes
|
|-
|-
|PAxxxxxxxx
|PA000000104
|
|ATLAS IoT SBC V1 CM4. 4GB M2.0 M1 PB0
|
|V1
|
|4GB
|
|No
|
|}
|}


Line 82: Line 85:
|-
|-
|RAM
|RAM
|4GB  LPDDR4
|2GB, 4GB  LPDDR4
|-
|-
|Storage
|Storage
Line 594: Line 597:
'''Raspian'''
'''Raspian'''


Debian GNU/Linux 13 (trixie) Version 13.2 Linux atlas 6.12.47 +rpt-rpi-v8 #1 SMP PREEMPT
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.
Debian 1:6.12.62-1+rpt1 (2025-09-16) aarch64 GNU/Linux.


=== 22. Network Information ===
=== 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.
There are three ways to connect to the device. The IP and connection status can be checked on the LCD by cycling to the Network screen.


==== 22.1 Eth1 (ethO) ====
==== 22.1 ETH1 ====
Client dynamic IP obtained by DHCP server.
By default, the ETH1 port has the following configuration:


==== 22.2 Eth2 (eth1) ====
* Network interface: eth0
Static IP: '''93.48.86.253'''
* Connection type: DHCP client.
* IP Address: Dynamic IP address provided by an external DHCP server.


==== 22.3 Access Point (wlanO) ====
==== 22.2 ETH2 ====
IP: '''192.168.30.1'''
By default, the ETH2 port has the following configuration:
 
* Network interface: eth1
* Connection type: Static IP
* IP Address: 93.48.86.253
 
==== 22.3 Access Point ====
By default, ATLAS provides an Access Point configured with the following settings:
 
* Network interface: wlan0
* SSID: '''atlas-<SERIAL_NUMBER>-AP'''
* Password: atlas_2025!
* Connection type: DHCP Server
* IP Address: 192.168.30.1


=== 23. Software Information ===
=== 23. Software Information ===
Line 616: Line 633:
|'''Grafana'''
|'''Grafana'''
|'''lnfluxDB'''
|'''lnfluxDB'''
|'''Operating System'''
|-
|-
|Version
|'''Version'''
|4.1.4
|4.1.4
|12.3.1
|12.3.1
|2.8.0
|2.8.0
|13 (Trixie)
|-
|-
|Port
|'''Port'''
|1880
|1880
|3000
|3000
|8086
|8086
|22
|-
|-
|State
|'''State'''
|Clean
|Clean
|Clean
|Clean
|Clean
|Clean
|N/A
|-
|-
|Authentication
|'''Authentication'''
|None
|None
|User/Pass (admin/admin)
|'''User:''' admin
|Not defined, configured on first time interface login.
'''Pass:''' admin
|Not defined, configured on first time interface login.
|'''User:''' pi
'''Pass:''' atlas2026
|-
|-
|GUI on
|'''GUI'''
|http://<device-ip>:1880
|http://<device-ip>:1880
|http://<device-ip>:3000
|http://<device-ip>:3000
|http://<device-ip>:8086
|http://<device-ip>:8086
|N/A
|}
|}


=== 24. MQTT Broker ===
=== 24. Included Software Stack ===
port: 1883
<br>
 
[[File:AtlasCode.svg|center|frameless|583x583px]]
address: AP-> 192.168.30.1
 
Eth1: '''93.48.86.253'''
 
user: < not needed>
 
login <not needed>
 
==== <big>24.1 Relay Outputs Actor</big> ====
 
===== 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
 
<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>
 
====== b) 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>
 
====== c) 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>
 
==== <big>24.2 RTC Actor</big> ====
 
===== 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<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>
 
====== 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<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>
 
====== 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<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>
 
====== d) Read clock ======
 
Req-Topic: clock/runtime/in <syntaxhighlight lang="json">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "success": true,
      "timestamp": "[timestamp epoch ms]"
    }
  }
}
 
</syntaxhighlight>
 
===== 24.2.2 Synchronization loop flowchart (every 30 seconds) =====
 
 
'''RTC Actor - Overview'''
[[File:RTCActor Overview.svg|center|frameless|903x903px]]
 
==== <big>24.3 Core System Health Actor</big> ====
 
===== 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 ======
{| 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": <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
    }
  }
}
 
</syntaxhighlight>
 
===== 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. ... ).
 
 
[[File:Peripherals health.svg|center|frameless|792x792px]]
 
====== a) Example ======
'''For busi2c-0:'''
 
Reply topic: '''systemHealth/busi2c-0/runtime/out'''
 
Payload:<syntaxhighlight lang="json">
{
  "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
        }
      }
    }
  }
}
 
 
 
</syntaxhighlight>'''For busi2c-1:'''
 
Reply topic: '''systemHealth/busi2c-1/runtime/out'''
 
Payload:<syntaxhighlight lang="json">
{
  "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"
            }
          }
        }
      }
    }
  }
}
</syntaxhighlight>
 
===== 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<syntaxhighlight lang="json">
{
"id": <TIMESTAMP>,
"origin": "Dev",
"task": {
  "action": "LIST_USB_DEVICES"
}
}
</syntaxhighlight>'''Reply-topic''': systemHealth/runtime/usb/devices/out<syntaxhighlight lang="json">
{
"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": ""
      }
    }
  }
}
</syntaxhighlight>
{| class="wikitable tech-table"
!'''JSON Path'''
!'''Type'''
!Example
!'''Description'''
|-
|id
|string /number
|"get-hw-info-001"
|Request identifier echoed back in the response.
|-
|origin
|string
|"system-health"
|Actor/device that generated the response.
|-
|task
|object
|{...}
|Container for the action response.
|-
|task.action
|string
|"list_usb_devices"
|Action executed by the actor.
|-
|task.taskResult
|object
|{...}
|Main result object for the action.
|-
|task.taskResult.usb_devices
|object
|{...}
|Contains the USB device scan result.
|-
|task.taskResult.usb_devices.success
|boolean
|true
|Indicates whether the lsusb
commandexecuted successfully.
|-
|task.taskResult.usb_devices.command
|string
|"lsusb"
|Command used to collect USB information.
|-
|task.taskResult.usb_devices.returncode
|number /null
|0
|Process return code. 0 means success. null
means the command was not executed ortimed out.
|-
|task.taskResult.usb_devices.devices
|array
|[...]
|List of USB devices detected by lsusb.
|-
|task.taskResult.usb_devices.devices[ ].bus
|string
|"001"
|USB bus number where the device wasdetected.
|-
|task.taskResult.usb_devices.devices[ ].device
|string
|"004"
|USB device number assigned on that bus.
|-
|task.taskResult.usb_devices.devices[ ].vendor_id
|string
|"1e0e"
|USB vendor ID in hexadecimal format.
|-
|task.taskResult.usb_devices.devices[ ].product_id
|string
|"9001"
|USB product ID in hexadecimal format.
|-
|task.taskResult.usb_devices.devices[ ].description
|string
|"Qualcomm / Option SimTech,Incorporated"
|Human-readable device description returnedby lsusb.
|-
|task.taskResult.usb_devices.devices[ ].parsed
|boolean
|true
|Indicates whether the lsusb line was parsed successfully.
|-
|task.taskResult.usb_devices.devices[ ].raw
|string
|Optional
|Present only when a device line could not beparsed.
Contains the original raw lsusb line.
|-
|task.taskResult.usb_devices.stderr
|string
|" "
|Error output from the command. Empty stringmeans no error.
|}
 
====== 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<syntaxhighlight lang="json">
{
"id": "connectivity-001",
"origin": "APP",
"task": {
  "action": "list_connectivity_specs"
}
}
</syntaxhighlight>'''Reply-topic''': systemHealth/runtime/connectivity/out<syntaxhighlight lang="json">
{
  "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": []
          }
        }
      }
    }
  }
}
</syntaxhighlight>
{| class="wikitable tech-table"
!'''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.
|}
==== <big>24.4 TempSensor Actor</big> ====
 
===== 24.4.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.
 
====== a) Set temperature sensor configurations ======
Req-Topic: tempSensor/config/in
 
ALERT:
 
* activate: true(active)/false
* templow: alert temperature lower limit
* tempHigh: alert temperature upper limit
<syntaxhighlight lang="json">
{
  "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>
 
====== b) Read temperature sensor configurations ======
Req-Topic: tempSensor/config/in
 
ALERT:
 
* activate: true(active)/false
 
LIMITS:
 
* templow: alert temperature lower limit
* tempHigh: alert temperature upper limit
<syntaxhighlight lang="json">
{
  "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>
 
====== c) 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>
 
==== <big>24.5 TFT Actor</big> ====
 
===== 24.5.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to control and interact with the TFT display, or frontal panel LCD screen. Connecting to the broker for this Area requires no credentials.
 
===== 24.5.2 TFT Display Actor =====
  The TFT Actor is responsible for:
 
* Rendering static and informative screens on the TFT display
* Reacting to joystick input (LEFT/ RIGHT/ CENTER/ UP/ DOWN)
* Managing screen navigation and user confirmation flows
* Providing feedback to the application via MQTT
 
====== a) Screen Carousel Concept ======
The TFT actor maintains an '''ordered list of screens''' (carousel).
 
* Screens are navigated using the joystick:
 
- LEFT --> Previous screen
 
- RIGHT --> Next screen
 
* The carousel wraps around:
 
- LEFT on first screen --> last screen
 
- RIGHT on last screen --> first screen
 
====== b) Screen Types ======
The TFT actor supports the following screen types:
 
'''Image Screen'''
 
* Displays a static JPEG image
* Default screen shown at boot
* No user interaction required
 
'''Network Information Screen'''
 
* Display a interface with information about the networks of the device
* Updated on load
* No user interaction required
 
====== c) Joystick Navigation Logic ======
'''Carousel Navigation:'''
{| class="wikitable"
|'''Joystick  Input'''
|'''Action'''
|-
|LEFT
|Previous screen
|-
|RIGHT
|Next screen
|-
|DOWN
|Refresh current screen
|}
 
====== d) Boot Behavior ======
At system boot:
 
# TFT actor initializes the display
# Last available carousel is loaded
# First screen is rendered
# Joystick subscriptions are activated
# Actor waits for runtime commands
 
====== e) Design Notes & Constraints ======
* TFT actor does not expose joystick state
* Joystick actor remains independent
* TFT actor internally consumes joystick events
* Carousel state is local to the TFT actor
* Screen rendering is synchronous; input handling is asynchronous
* Confirmation screens always require explicit CENTER press
 
===== 24.5.3 User interaction through MQTT =====
Enabling interaction with the carousel using the topic tft/runtime/in . Actions available will be public to the user.
 
'''Runtime commands'''
 
'''Go to screen'''
 
Req-Topic: tft/runtime/in<syntaxhighlight lang="json">
{
  "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>
 
==== <big>24.6 AnalogInputs Actor</big> ====
 
===== 24.6.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.
 
====== a) Configurations ======
'''  Topic: analogInputs/config/in - Set ADC channels configurations'''
 
'''mode'''
 
* continuous
* single
 
'''type'''
 
* voltage
* current
<syntaxhighlight lang="json">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "AI1": {
        "mode": "single",
        "type": "voltage"
      },
      "AI2": {
        "mode": "single",
        "type": "voltage"
      },
      "AI3": {
        "mode": "single",
        "type": "current"
      },
      "AI4": {
        "mode": "single",
        "type": "current"
      }
    }
  }
}
 
</syntaxhighlight>Reply-Topic: analogInputs/config/out<syntaxhighlight lang="json">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "AI1": {
        "success": true
      },
      "AI2": {
        "success": true
      },
      "AI3": {
        "success": true
      },
      "AI4": {
        "success": true
      }
    }
  }
}
 
</syntaxhighlight>
 
====== b) Runtime Data ======
'''Topic: analogInputs/runtime/in.'''
 
action:
 
* READ
* PAUSE (only applicable in continuous mode)
* RESUME (only applicable in continuous mode)
<syntaxhighlight lang="json">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "AI1": {
        "action": "READ"
      },
      "AI2": {
        "action": "READ"
      },
      "AI3": {
        "action": "READ"
      },
      "AI4": {
        "action": "READ"
      }
    }
  }
}
 
</syntaxhighlight>Reply-Topic: analogInputs/runtime/out<syntaxhighlight lang="json">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "AI1": {
        "success": true,
        "value": <_FLOAT_>
      },
      "AI2": {
        "success": true,
        "value": <_FLOAT_>
      },
      "AI3": {
        "success": true,
        "value": <_FLOAT_>
      },
      "AI4": {
        "success": true,
        "value": <_FLOAT_>
      }
    }
  }
}
 
</syntaxhighlight>
 
===== 24.6.2 Usage Examples =====
 
==== <big>24.7 Analog Outputs Actor</big> ====
 
===== 24.7.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.
 
====== a) Set analog outputs signal ======
Req-Topic: analogOutputs/config/in
 
'''Output:''' current within 0-20 mA
 
'''mode:''' on/off<syntaxhighlight lang="json">
{
  "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>
 
====== b) 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>
 
====== c) 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>
 
==== <big>24.8 Digital Inputs Actor</big> ====
 
===== 24.8.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credentials.
 
====== a) Set digital input pin/pins speed fast/slow ======
The '''fast''' speed setting supports edge detection speed up to 100 Hz and the '''slow''' speed settings supports up to 10 Hz.
 
'''Fast Mode''' generates a message on every I/O state change, which may result in a '''high message payload''' during operation. Fast Mode should therefore only be enabled when '''strictly required'''.
 
Req-Topic: digitalInputs/config/in<syntaxhighlight lang="json">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskParams": {
      "DI1": {
        "speed": "fast"
      },
      "DI2": {
        "speed": "slow"
      },
      "DI3": {
        "speed": "fast"
      },
      "DI4": {
        "speed": "fast"
      }
    }
  }
}
</syntaxhighlight>Reply-Topic: digitalInputs/config/out<syntaxhighlight lang="json">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "DI1": {
        "success": true,
        "speed": "fast"
      },
      "DI2": {
        "success": true,
        "speed": "slow"
      },
      "DI3": {
        "success": true,
        "speed": "fast"
      },
      "DI4": {
        "success": true,
        "speed": "fast"
      }
    }
  }
}
</syntaxhighlight>
 
====== b) Get all digital input pins state ======
 
 
Req-Topic: digitalInputs/runtime/in<syntaxhighlight lang="json">
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "action": "READ"
  }
}
 
</syntaxhighlight>Reply-Topic: digitalInputs/runtime/out


state: high/low<syntaxhighlight lang="json">
<br>
{
  "id": "<TIMESTAMP>",
  "origin": "APP",
  "task": {
    "taskResult": {
      "DI1": {
        "success": true,
        "state": "high"
      },
      "DI2": {
        "success": true,
        "state": "low"
      },
      "DI3": {
        "success": true,
        "state": "high"
      },
      "DI4": {
        "success": true,
        "state": "low"
      }
    }
  }
}
 
</syntaxhighlight>
 
==== <big>24.9 Digital Outputs Actor</big> ====
 
===== 24.9.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this area requires no credencials.
 
====== a) Get all digital output pins state ======
 
 
Req-Topic: digitalOutputs/runtime/in<syntaxhighlight lang="json">
{
  "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>
 
====== b) 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>
 
===== 24.9.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>
 
==== <big>24.10 Joystick Actor</big> ====
 
===== 24.10.1 App Interfacing =====
User App interface and functionalities exposed to the open part of the MQTT broker. Simplified interface to configure and obtain peripherals data. Connecting to the broker for this Area requires no credencials.
 
====== a) Get all joystick pins state ======
 
 
Req-Topic: joystick/runtime/in<syntaxhighlight lang="json">
{
  "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>
 
==== <big>24.11 Buzzer Actor</big> ====
 
===== 24.11.1 Overview =====
The '''Buzzer Actor''' is responsible for controlling the onboard buzzer through MQTT commands. It receives runtime commands on an MQTT input topic, validates the requested buzzer operation, drives the buzzerthrough GPIO using '''libgpiod''', and publishes status/final responses on an MQTT output topic.
 
The actor currently controls '''GPIO line 25''' on '''/dev/gpiochip0''', with '''ACTIVE_LOW = False'''. It creates a
 
'''GpiodBuzzerDriver''' instance and routes incoming MQTT actions to runtime handlers.
 
The supported runtime actions are:
{| class="wikitable"
|'''Action'''
|'''Description'''
|-
|BEEP
|Plays a finite beep sequence, an infinite beep sequence, or a continuous tone
|-
|STOP
|Stops the currently active buzzer playback
|}
 
===== 24.11.2 MQTT Topics =====
{| class="wikitable"
|'''Topic'''
|'''Direction'''
|'''Description'''
|-
|buzzer/runtime/in
|Input
|Receives buzzer commands
|-
|buzzer/runtime/out
|Output
|Publishes status messages and final command responses
|}
The actor subscribes to '''buzzer/runtime/in''' and publishes all status/final replies to '''buzzer/runtime/out'''.
 
===== 24.11.3 Hardware and Datasheet Notes =====
The buzzer used is the '''MLT-8530 electro-magnetic SMD buzzer.'''
 
According to the datasheet:
{| class="wikitable"
|'''Parameter'''
|'''Value'''
|-
|Rated voltage
|3.6 Vo-p
|-
|Operating voltage
|2.5 ~ 4.5 Vo-p
|-
|Rated current
|Max. 95 mA
|-
|Rated test frequency
|2700 Hz
|-
|Duty cycle
|50% square wave
|-
|Sound output
|Min. 80 dB at 10 cm
|-
|Coil resistance
|16 ± 3 Ω
|-
|Resonant frequency
|2700 Hz
|}
 
===== 24.11.4 BEEP =====
The BEEP action supports two modes:
{| class="wikitable"
|'''Mode'''
|'''Description'''
|-
|sequence
|Plays one or more beeps with gaps between them
|-
|continuous
|Plays one continuous tone until '''STOP''' is received
|}
If no mode is provided, the default mode is: '''sequence'''
 
All messages should be sent to the topic '''buzzer/runtime/in'''
 
====== a) Default Datasheet-Aligned Beep ======
<syntaxhighlight lang="json">
{
"id": <TIMESTAMP>,
"origin": "APP",
"task": {
  "action": "BEEP"
  }
}
 
</syntaxhighlight>
 
====== b) N Beeps ======
Play '''<BEEPS_QUANTITY>''' beeps at '''<FREQUENCY>''' Hz. Each beep lasts '''<BEEP_DURATION>''' seconds, with
 
'''<GAP_BETWEEN_BEEPS>''' seconds of silence between beeps.<syntaxhighlight lang="json">{
"id": <TIMESTAMP>,
"origin": "APP",
"task": {
  "action": "BEEP",
  "params": {
      "frequency_hz": <FREQUENCY>,
      "duration_s": <BEEP_DURATION>,
      "count": <BEEPS_QUANTITY>,
      "gap_s": <GAP_BETWEEN_BEEPS>
    }
  }
}</syntaxhighlight>If you want to play repeated beeps forever until a '''STOP''' command arrives then you only need to pass the '''count: 0'''
 
====== c) Continuous Tone ======
Play one continuous <FREQUENCY> Hz tone until '''STOP'''.<syntaxhighlight lang="json">
{
"id": <TIMESTAMP>,
"origin": "APP",
"task": {
  "action": "BEEP",
  "params": {
      "mode": "continuous",
      "frequency_hz": <FREQUENCY>
    }
  }
}
</syntaxhighlight>If '''frequency_hz''' is omitted, the handler uses the configured default frequency.
 
====== d) Stop Buzzer ======
If you want to stop the beep sequence, just send this payload to the '''buzzer/runtime/in'''<syntaxhighlight lang="json">
{
"id": <TIMESTAMP>,
"origin": "APP",
"task": {
  "action": "STOP",
  }
}
</syntaxhighlight>
 
====== e) Buzzer payload parameters table ======
{| class="wikitable"
!Field
!Required
!Type
!Default
!Applies to
!Description
|-
|task
|Yes
|object
| -
|All requests
|Main task object. Contains the requested action and
optional parameters.
|-
|task.action
|Yes
|string
| -
|All requests
|Action to execute. Supported values: "BEEP" and
"STOP".
|-
|task.params
|No
|object
|{}
|BEEP
|Optional parameters for configuring the buzzer
behavior. Not needed for STOP.
|-
|task.params.mode
|No
|string
|"sequence"
|BEEP
|Playback mode. Supported values: "sequence" and
"continuous".
|-
|task.params.frequency_hz
|No
|number
|2700.0
|BEEP
|Buzzer frequency in Hz. Recommended/default value
is 2700 Hz , matching the buzzer resonant frequency.
|-
|task.params.duration_s
|No
|number
|0.2
|BEEP with
mode="sequence"
|Duration of each beep, in seconds.
|-
|task.params.count
|No
|integer
|1
|BEEP with
mode="sequence"
|Number of beeps to play. 0 means repeat forever
until STOP.
|-
|task.params.gap_s
|No
|number
|0.15
|BEEP with
mode="sequence"
|Silence gap between beeps, in seconds.
|-
|task.params.mode ="continuous"
|No
|string
| -
|BEEP
|Plays one continuous tone until STOP . In this mode,
duration_s , count , and gap_s are ignored.
|}
 
===== 24.11.5 Buzzer - diagram =====
[[File:Buzzer - diagram.svg|center|frameless|901x901px]]
 
===== 24.11.6 Buzzer Command timing charts - Examples =====
The following charts represent the command-level buzzer state over time.
 
They do not show the internal 2700 Hz switching frequency.
 
Instead, they show when the buzzer is logically:
{| class="wikitable"
|'''State'''
|'''Meaning'''
|-
|1
|Buzzer active / sound ON
|-
|0
|Buzzer inactive / silence
|}
 
====== a) Default BEEP command ======
<syntaxhighlight lang="json">
{
"id": <TIMESTAMP>,
"origin": "APP",
"task": {
  "action": "BEEP",
  }
}
</syntaxhighlight>Default values used:
{| class="wikitable"
|'''Parameter'''
|'''Value'''
|-
|duration_s
|0.2 s
|-
|count
|1
|-
|gap_s
|0.15 s
|}
'''Buzzer State'''
 
[[File:Default_Beep.svg|frameless]]
 
duration_s = 0.2 s
 
count = 1
 
====== b) BEEP Sequence - 5 beeps ======
<syntaxhighlight lang="json">
{
"id": 1779789836000,
"origin": "APP",
"task": {
    "action": "BEEP",
    "params": {
      "duration_s": 1,
      "count": 5,
      "gap_s": <GAP_BETWEEN_BEEPS>
  }
}
}
</syntaxhighlight>'''Buzzer State'''
[[File:5 beeps.svg|left|frameless|700x700px]]
 
 
 
 
 
duration_s = 1.0s
 
gap_s = 0.5s
 
count = 5
 
====== c) Infinite BEEP Sequence ======
 
This happens when: "count": 0<syntaxhighlight lang="json">
{
"id": 1779789836000,
"origin": "APP",
"task": {
    "action": "BEEP",
    "params": {
      "duration_s": 1,
      "count": 0,
      "gap_s": 0.5
  }
}
}
</syntaxhighlight>'''Buzzer State'''
[[File:Infinite_Beeps.svg|frameless|606x606px]]
duration_s = 1.0
gap_s = 0.5
 
count = 0
 
====== d) Continuous BEEP ======
In continuous mode, the buzzer remains ON until a STOP command is received.<syntaxhighlight lang="json">
{
"id": 1779789836000,
"origin": "APP",
"task": {
    "action": "BEEP",
    "params": {
      "mode": "continuous",
  }
}
}
</syntaxhighlight>'''Buzzer State'''
 
[[File:Continous beep.svg|frameless|600x600px]]
 
mode = continuous
 
====== e) STOP ======
The STOP command immediately forces the buzzer to OFF.
 
'''Buzzer State'''
 
[[File:Stop beep.svg|frameless|600x600px]]
 
After STOP, the buzzer is forced to OFF.
 
=== 25. Included Software Stack ===
 
 
[[File:AtlasCode.svg|center|frameless|583x583px]]


=== 26. Hardware Libraries ===
=== 25. Software Stack and IPC Architecture ===
[IMAGE PLACEHOLDER]
<br>
[[File:Hardware Peripherals Library Architecture.svg|center|frameless|1934x1934px]]


=== 27. Related Products ===
=== 26. Related Products ===
{| class="wikitable"
{| class="wikitable"
|'''PA'''
|'''PA'''
Line 3,342: Line 685:
|-
|-
|PA000000074
|PA000000074
|[[SENSBLUE MONARCH|SENSBLUE MONARCH Gateway]]
|[[SENSBLUE MONARCH|'''<u>SENSBLUE MONARCH Gateway</u>''']]
|
|
|-
|-
Line 3,348: Line 691:
{{SimilarProductsTable}}
{{SimilarProductsTable}}


=== 28. Accessories ===
=== 27. Accessories ===
{| class="wikitable"
{| class="wikitable"
|'''PA'''
|'''PA'''
Line 3,375: Line 718:
|}
|}


=== 29. Document History ===
=== 28. Document History ===
{| class="wikitable"
{| class="wikitable"
|'''Version'''
|'''Version'''
Line 3,394: Line 737:
|}
|}


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