Jump to content

SENSBLUE ATLAS/Datasheet: Difference between revisions

No edit summary
Line 995: Line 995:
The RUL data is calculated from the wear-level history maintained by the <code>EmmcActor</code>.
The RUL data is calculated from the wear-level history maintained by the <code>EmmcActor</code>.


====== 24.3.4.1 eMMC RUL Data Flow ======
====== a) eMMC RUL Data Flow ======
[placeholder]
[placeholder]


===== 24.3.6 Peripherals health =====
====== b) Wear-Level Format ======
  In order get the peripherals health we had to implement a SystemHealth actor in each bus manager (busi2c­O, busi2c-1, etc. ... ).
Each wear-level entry has the following format:<syntaxhighlight lang="json">
<WLxx:timestamp_ms>
</syntaxhighlight>Example:<syntaxhighlight lang="json">
<WL03:1782228844578>
</syntaxhighlight>
{| class="wikitable tech-table"
!Part
!Meaning
|-
|WL03
|eMMC wear-level tier
|-
|1782228844578
|Unix timestamp in milliseconds when the wear-level was registered
|}


====== c) Wear-Level Interpretation ======
The wear-level tier represents a coarse estimation of consumed eMMC lifetime.
{| class="wikitable tech-table"
!Wear Level
!Estimated Lifetime Consumed
!Conservative Remaining
|-
|WL01
|0% - 10%
|90%
|-
|WL02
|10% - 20%
|80%
|-
|WL03
|20% - 30%
|70%
|-
|WL04
|30% - 40%
|60%
|-
|WL05
|40% - 50%
|50%
|-
|WL06
|50% - 60%
|40%
|-
|WL07
|60% - 70%
|30%
|-
|WL08
|70% - 80%
|20%
|-
|WL09
|80% - 90%
|10%
|-
|WL10
|90% - 100%
|0%
|-
|WL11
|Estimated lifetime exceeded
|0%
|}
When <code>WL11</code> or higher is detected, the device should be considered beyond the estimated eMMC lifetime.


[[File:Peripherals health.svg|center|frameless|792x792px]]
====== d) emmc_rul Payload ======
 
The calculated RUL is published inside the regular <code>systemHealth/runtime/out</code> payload.
====== a) Example ======
'''For busi2c-0:'''
 
Reply topic: '''systemHealth/busi2c-0/runtime/out'''


Payload:<syntaxhighlight lang="json" line="1">
Example:<syntaxhighlight lang="json">
{
{
   "id": <TIMESTAMP>,
   "id": 1782230830898,
   "origin": "system-health-busi2c-0",
   "origin": "system-health",
   "task": {
   "task": {
     "taskResult": {
     "taskResult": {
       "ADC": {
       "cpu_percent": 13.6,
        "status": "ERROR",
      "cpu_tempC": 63.3,
        "description": "IRQ Retrying",
      "disk_percent": 24.0,
        "last_report": 1770378753006,
      "emmc_rul": {
        "stats": {
        "ok": true,
          "AI1": {
         "state": "OK",
            "samples": 563154,
         "current_wear_level": "WL03",
            "retries": 760548,
         "current_tier": 3,
            "discards": 253313
         "consumed_percent_min": 20,
          },
        "consumed_percent_max": 30,
          "AI2": {
        "consumed_percent_estimated": 25,
            "samples": 563154,
        "remaining_percent_estimated": 75,
            "retries": 760475,
        "remaining_percent_conservative": 70,
            "discards": 253314
         "history_entries": 3,
          },
         "estimated_rul_ms": null,
          "AI3": {
         "estimated_rul_days": null,
            "samples": 563154,
         "estimated_eol_timestamp_ms": null,
            "retries": 760528,
         "confidence": "LOW",
            "discards": 253313
         "source": "emmc_actor",
          },
         "last_refresh_timestamp_ms": 1782230830898
          "AI4": {
      },
            "samples": 563154,
      "uptime_sec": 9339
            "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>


====== e) emmc_rul Field Description ======
{| class="wikitable tech-table"
!Field
!Type
!Description
|-
|ok
|boolean
|Indicates whether the RUL calculation was successful.
|-
|state
|string
|General eMMC RUL state. Examples: <code>OK</code>, <code>UNKNOWN</code>, <code>EXCEEDED_ESTIMATED_LIFETIME</code>.
|-
|current_wear_level
|string
|Current wear-level tier as text, for example <code>WL01</code>, <code>WL03</code>, or <code>WL11</code>.
|-
|current_tier
|integer
|Numeric version of the wear level. For example, <code>WL03</code> becomes <code>3</code>.
|-
|consumed_percent_min
|number
|Lower bound of estimated consumed lifetime for the current tier.
|-
|consumed_percent_max
|number
|Upper bound of estimated consumed lifetime for the current tier.
|-
|consumed_percent_estimated
|number
|Mid-point estimate between minimum and maximum consumed lifetime.
|-
|remaining_percent_estimated
|number
|Estimated remaining lifetime using the mid-point consumed value.
|-
|remaining_percent_conservative
|number
|Conservative remaining lifetime using the maximum consumed value.
|-
|history_entries
|integer
|Number of wear-history entries received from the <code>EmmcActor</code>.
|-
|estimated_rul_ms
|integer / null
|Estimated remaining useful lifetime in milliseconds. <code>null</code> means there is not enough reliable time-history data.
|-
|estimated_rul_days
|number / null
|Estimated remaining useful lifetime in days. <code>null</code> means time-based RUL is not available.
|-
|estimated_eol_timestamp_ms
|integer / null
|Estimated end-of-life Unix timestamp in milliseconds. <code>null</code> means EOL cannot be estimated reliably.
|-
|ms_per_wear_tier
|integer / null
|Average time observed for one wear-level tier transition. Only available when a valid transition history exists.
|-
|confidence
|string
|Confidence level of the RUL estimate. Suggested values: <code>LOW</code>, <code>MEDIUM</code>, <code>HIGH</code>.
|-
|rul_reason
|string / null
|Optional explanation when time-based RUL is not calculated, for example <code>OBSERVATION_WINDOW_TOO_SHORT</code>.
|-
|source
|string
|Source used for the calculation. Normally <code>emmc_actor</code>.
|-
|last_refresh_timestamp_ms
|integer
|Unix timestamp in milliseconds when the SystemHealthActor last refreshed the eMMC RUL cache.
|}
====== f) Percentage-Based RUL Calculation ======
The percentage-based RUL can be calculated immediately from the current wear-level tier.


Formula:<syntaxhighlight lang="mathematica">
consumed_percent_min = (current_tier - 1) * 10
consumed_percent_max = current_tier * 10
consumed_percent_estimated = (consumed_percent_min + consumed_percent_max) / 2


</syntaxhighlight>'''For busi2c-1:'''
remaining_percent_estimated = 100 - consumed_percent_estimated
 
remaining_percent_conservative = 100 - consumed_percent_max
Reply topic: '''systemHealth/busi2c-1/runtime/out'''
</syntaxhighlight>Example for <code>WL03</code>:<syntaxhighlight lang="mathematica">
 
current_tier = 3
Payload:<syntaxhighlight lang="json" line="1">
{
  "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" line="1">
consumed_percent_min = (3 - 1) * 10 = 20
consumed_percent_max = 3 * 10 = 30
consumed_percent_estimated = (20 + 30) / 2 = 25
 
remaining_percent_estimated = 100 - 25 = 75
remaining_percent_conservative = 100 - 30 = 70
</syntaxhighlight>Result:<syntaxhighlight lang="json">
{
{
"id": <TIMESTAMP>,
  "current_wear_level": "WL03",
"origin": "Dev",
  "consumed_percent_min": 20,
"task": {
  "consumed_percent_max": 30,
  "action": "LIST_USB_DEVICES"
  "consumed_percent_estimated": 25,
}
  "remaining_percent_estimated": 75,
  "remaining_percent_conservative": 70
}
}
</syntaxhighlight>'''Reply-topic''': systemHealth/runtime/usb/devices/out<syntaxhighlight lang="json" line="1">
</syntaxhighlight>
 
====== g) Time-Based RUL Calculation ======
Time-based RUL estimates how many milliseconds, days, or calendar time remain until the eMMC reaches the end of the expected lifetime.
 
This calculation requires real historical wear transitions.
 
The minimum required data is:<syntaxhighlight lang="mathematica">
WL01 at timestamp A
WL02 at timestamp B
</syntaxhighlight>Where:<syntaxhighlight lang="mathematica">
timestamp B > timestamp A
</syntaxhighlight>Formula:<syntaxhighlight lang="mathematica">
ms_per_wear_tier = (last_timestamp_ms - first_timestamp_ms) / (last_tier - first_tier)
 
remaining_tiers_to_wl10 = 10 - current_tier
 
estimated_rul_ms = remaining_tiers_to_wl10 * ms_per_wear_tier
 
estimated_eol_timestamp_ms = current_wear_timestamp_ms + estimated_rul_ms
</syntaxhighlight>Example:<syntaxhighlight lang="mathematica">
WL01 at 1782225732187
WL03 at 1782235908273
</syntaxhighlight>Observed tier delta:<syntaxhighlight lang="mathematica">
3 - 1 = 2 tiers
</syntaxhighlight>Observed time delta:<syntaxhighlight lang="mathematica">
1782235908273 - 1782225732187 = 10,176,086 ms
</syntaxhighlight>Average time per tier:<syntaxhighlight lang="mathematica">
10,176,086 / 2 = 5,088,043 ms per tier
</syntaxhighlight>Remaining tiers from <code>WL03</code> to <code>WL10</code>:<syntaxhighlight lang="mathematica">
10 - 3 = 7 tiers
</syntaxhighlight>Estimated RUL:<syntaxhighlight lang="mathematica">
7 * 5,088,043 = 35,616,301 ms
35,616,301 ms = 0.41 days
</syntaxhighlight>This calculation is mathematically correct, but it may be operationally misleading if the observation window is too short.
 
====== h) Why Time-Based RUL Can Be <code>null</code> ======
The following fields can be <code>null</code>:<syntaxhighlight lang="json">
{
{
"id": <TIMESTAMP>,
  "estimated_rul_ms": null,
"origin": "system-health",
   "estimated_rul_days": null,
"task": {
   "estimated_eol_timestamp_ms": null
   "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>
</syntaxhighlight>This happens when the SystemHealthActor does not have enough reliable history to estimate the wear rate.
 
Common reasons:
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!'''JSON Path'''
!Reason
!'''Type'''
!Description
!Example
|-
!'''Description'''
|NO_WEAR_HISTORY
|No valid wear-history entries were received.
|-
|-
|id
|ONLY_ONE_HISTORY_ENTRY
|string /number
|Only one wear-level entry exists, so no rate can be calculated.
|"get-hw-info-001"
|Request identifier echoed back in the response.
|-
|-
|origin
|NON_INCREASING_TIMESTAMPS
|string
|Wear-level timestamps are not strictly increasing.
|"system-health"
|Actor/device that generated the response.
|-
|-
|task
|BACKFILLED_HISTORY
|object
|Several wear levels have the same timestamp, usually because they were synchronized or recreated at boot.
|{...}
|Container for the action response.
|-
|-
|task.action
|OBSERVATION_WINDOW_TOO_SHORT
|string
|The observed time span is too short to generate a trustworthy RUL estimate.
|"list_usb_devices"
|}
|Action executed by the actor.
Example with only one entry:<syntaxhighlight>
<WL01:1782225732187>
</syntaxhighlight>The actor can calculate the percentage-based RUL:24.3.6 Peripherals health<syntaxhighlight lang="mathematica">
WL01 = 0% - 10% consumed
remaining_percent_estimated = 95%
remaining_percent_conservative = 90%
</syntaxhighlight>But it cannot calculate:<syntaxhighlight lang="json">
estimated_rul_ms
estimated_rul_days
estimated_eol_timestamp_ms
</syntaxhighlight>because it does not know how fast the eMMC is wearing.
 
====== i) Important Rule: Do Not Trust Short Observation Windows ======
During development, stress tests, boot corrections, actor restarts, or history synchronization, several wear levels may be registered in a very short time.
 
Example:<syntaxhighlight>
<WL01:1782225732187>
<WL02:1782228844578>
<WL03:1782235908273>
</syntaxhighlight>This may produce:<syntaxhighlight lang="json">
{
  "ms_per_wear_tier": 5088043,
  "estimated_rul_days": 0.41,
  "confidence": "MEDIUM"
}
</syntaxhighlight>Although the math is correct, the result should not be trusted as a production RUL estimate.
 
The actor should avoid publishing a time-based RUL estimate when the observation period is too short.
 
Recommended rule:<syntaxhighlight>
Calculate time-based RUL only when:
- at least 2 real transitions exist;
- timestamps are strictly increasing;
- the total observation window is >= 7 days.
</syntaxhighlight>For production deployments, a stricter rule may be used:<syntaxhighlight>
Minimum observation window >= 30 days.
</syntaxhighlight>When the observation window is too short, publish:<syntaxhighlight lang="json">
{
  "estimated_rul_ms": null,
  "estimated_rul_days": null,
  "estimated_eol_timestamp_ms": null,
  "confidence": "LOW",
  "rul_reason": "OBSERVATION_WINDOW_TOO_SHORT"
}
</syntaxhighlight>The percentage-based fields should still be published because they remain valid.
 
====== j) Recommended Confidence Rules ======
{| class="wikitable tech-table"
!Confidence
!Meaning
|-
|-
|task.taskResult
|LOW
|object
|Not enough real history exists, history was backfilled, or the observation window is too short.
|{...}
|Main result object for the action.
|-
|-
|task.taskResult.usb_devices
|MEDIUM
|object
|Real transitions exist and the observation window is acceptable, but the model is still an estimate.
|{...}
|Contains the USB device scan result.
|-
|-
|task.taskResult.usb_devices.success
|HIGH
|boolean
|The eMMC has reached or exceeded <code>WL11</code>, or the state is known with high certainty.
|true
|}
|Indicates whether the lsusb
Recommended behavior:
commandexecuted successfully.
{| class="wikitable tech-table"
!Condition
!Confidence
!Time-Based RUL
|-
|-
|task.taskResult.usb_devices.command
|No history
|string
|LOW
|"lsusb"
|null
|Command used to collect USB information.
|-
|-
|task.taskResult.usb_devices.returncode
|Only one entry
|number /null
|LOW
|0
|null
|Process return code. 0 means success. null
means the command was not executed ortimed out.
|-
|-
|task.taskResult.usb_devices.devices
|Same timestamp for multiple wear levels
|array
|LOW
|[...]
|null
|List of USB devices detected by lsusb.
|-
|-
|task.taskResult.usb_devices.devices[ ].bus
|Observation window below 7 days
|string
|LOW
|"001"
|null
|USB bus number where the device wasdetected.
|-
|-
|task.taskResult.usb_devices.devices[ ].device
|Valid transitions over acceptable window
|string
|MEDIUM
|"004"
|calculated
|USB device number assigned on that bus.
|-
|-
|task.taskResult.usb_devices.devices[ ].vendor_id
|<code>WL11</code> or higher
|string
|HIGH
|"1e0e"
|0
|USB vendor ID in hexadecimal format.
|}
 
====== k) Critical State Handling ======
If the current tier is <code>WL11</code> or higher, the eMMC has exceeded the estimated lifetime range.
 
Expected output:<syntaxhighlight lang="json">
{
  "ok": true,
  "state": "EXCEEDED_ESTIMATED_LIFETIME",
  "current_wear_level": "WL11",
  "current_tier": 11,
  "consumed_percent_min": 100,
  "consumed_percent_max": 100,
  "consumed_percent_estimated": 100,
  "remaining_percent_estimated": 0,
  "remaining_percent_conservative": 0,
  "estimated_rul_ms": 0,
  "estimated_rul_days": 0,
  "confidence": "HIGH"
}
</syntaxhighlight>Recommended service interpretation:<syntaxhighlight>
The device should be serviced or replaced.
</syntaxhighlight>
 
====== l) Example: Safe Output for Short Observation Window ======
If the device is already on <code>WL03</code>, but the transition history happened in a short test window, the safe output should be:<syntaxhighlight lang="json">
{
  "emmc_rul": {
    "ok": true,
    "state": "OK",
    "current_wear_level": "WL03",
    "current_tier": 3,
    "consumed_percent_min": 20,
    "consumed_percent_max": 30,
    "consumed_percent_estimated": 25,
    "remaining_percent_estimated": 75,
    "remaining_percent_conservative": 70,
    "history_entries": 3,
    "estimated_rul_ms": null,
    "estimated_rul_days": null,
    "estimated_eol_timestamp_ms": null,
    "ms_per_wear_tier": 5088043,
    "confidence": "LOW",
    "rul_reason": "OBSERVATION_WINDOW_TOO_SHORT",
    "source": "emmc_actor",
    "last_refresh_timestamp_ms": 1782230830898
  }
}
</syntaxhighlight>This output avoids reporting a misleading value such as:<syntaxhighlight lang="json">
{
  "estimated_rul_days": 0.41
}
</syntaxhighlight>The correct interpretation is:<syntaxhighlight>
The eMMC is currently in WL03.
Estimated consumed lifetime is between 20% and 30%.
Estimated remaining lifetime is between 70% and 75%.
A reliable time-based RUL cannot yet be calculated.
</syntaxhighlight>
 
====== m) Summary ======
The <code>emmc_rul</code> object provides two different types of information:
{| class="wikitable tech-table"
!Type
!Reliability
!Description
|-
|-
|task.taskResult.usb_devices.devices[ ].product_id
|Percentage-based RUL
|string
|Reliable immediately
|"9001"
|Based directly on the current wear-level tier.
|USB product ID in hexadecimal format.
|-
|-
|task.taskResult.usb_devices.devices[ ].description
|Time-based RUL
|string
|Requires history
|"Qualcomm / Option SimTech,Incorporated"
|Based on real wear-level transitions over time.
|Human-readable device description returnedby lsusb.
|}
|-
The SystemHealthActor should always expose the percentage-based RUL when a valid wear level exists.
|task.taskResult.usb_devices.devices[ ].parsed
 
|boolean
The time-based RUL should only be exposed when the history is reliable enough to avoid misleading estimates.
|true
 
|Indicates whether the lsusb line was parsed successfully.
===== 23.3.5 Peripherals health =====
|-
In order get the peripherals health we had to implement a SystemHealth actor in each bus manager (busi2c-0, busi2c-1, etc....).
|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
[[File:Peripherals health.svg|center|frameless|792x792px]]
* LTE modem
* eth0
* eth1
* Tunnel interfaces, for possible commissioning use


'''Req-topic''': systemHealth/runtime/in<syntaxhighlight lang="json" line="1">
====== a) Example ======
{
'''For busi2c-0:'''
"id": "connectivity-001",
 
"origin": "APP",
Reply topic: <code>systemHealth/busi2c-0/runtime/out</code>
"task": {
 
  "action": "list_connectivity_specs"
   
  }
 
}
Payload:<syntaxhighlight lang="json" line="1">
</syntaxhighlight>'''Reply-topic''': systemHealth/runtime/connectivity/out<syntaxhighlight lang="json" line="1">
{
{
  "id": "<TIMESTAMP>",
  "id": <TIMESTAMP>,
  "origin": "system-health",
  "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: <code>systemHealth/busi2c-1/runtime/out</code>
 
 
Payload:<syntaxhighlight lang="json" line="1">
{
  "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 <code>list_usb_devices</code> action returns a parsed list of USB devices detected on the system using the <code>lsusb</code> command.
 
'''Req-topic:''' <code>systemHealth/runtime/in</code><syntaxhighlight lang="json" line="1">
{
  "id": <TIMESTAMP>,
  "origin": "Dev",
   "task": {
   "task": {
     "action": "list_connectivity_specs",
     "action": "LIST_USB_DEVICES"
    "taskResult": {
  }
      "connectivity": {
}
        "sources": {
</syntaxhighlight>'''Reply-topic:''' <code>systemHealth/runtime/usb/devices/out</code><syntaxhighlight lang="json" line="1">
          "sysfs": "/sys/class/net",
{
          "ip_link": {
  "id": <TIMESTAMP>,
            "available": true,
  "origin": "system-health",
            "command": "ip -j -d link show",
  "task": {
            "error": null
    "action": "list_usb_devices",
          },
    "taskResult": {
          "network_manager": {
      "usb_devices": {
            "available": true,
        "success": true,
            "command": "nmcli -t -f DEVICE,TYPE,STATE,CONNECTION device status",
        "command": "lsusb",
            "error": null
        "returncode": 0,
          }
        "devices": [
        },
          {
        "interfaces": {
            "bus": "001",
          "wifi": {
            "device": "001",
            "available": true,
            "vendor_id": "1d6b",
            "interfaces": [
            "product_id": "0002",
              {
            "description": "Linux Foundation 2.0 root hub",
                "interface": "wlan0",
            "parsed": true
                "available": true,
          },
                "status": "down",
          {
                "operstate": "down",
            "bus": "001",
                "admin_up": true,
            "device": "002",
                "carrier": false,
            "vendor_id": "0424",
                "mtu": 1500,
            "product_id": "9514",
                "type": 1,
            "description": "Microchip Technology, Inc. (formerly SMSC) SMC9514 Hub",
                "link_kind": null,
            "parsed": true
                "mac_address": "2c:cf:67:fd:60:40",
          },
                "ipv4": [],
          {
                "ipv6": [],
            "bus": "001",
                "network_manager": {
            "device": "003",
                  "device": "wlan0",
            "vendor_id": "0424",
                  "type": "wifi",
            "product_id": "ec00",
                  "state": "disconnected",
            "description": "Microchip Technology, Inc. (formerly SMSC) SMSC9512/9514 Fast Ethernet Adapter",
                  "connection": null
            "parsed": true
                },
          },
                "wifi": {
          {
                  "available": true,
            "bus": "001",
                  "command": "iw dev wlan0 link",
            "device": "004",
                  "connected": false
            "vendor_id": "1e0e",
                }
            "product_id": "9001",
              }
            "description": "Qualcomm / Option SimTech, Incorporated",
            ]
            "parsed": true
          },
          }
          "lte_modem": {
        ],
            "available": true,
        "stderr": ""
            "tool_available": true,
      }
            "command": "mmcli -L",
    }
            "modems": [
  }
              {
}
                "id": "0",
</syntaxhighlight>
                "success": true,
{| class="wikitable tech-table"
                "command": "mmcli -m 0 --output-json",
!'''JSON Path'''
                "manufacturer": "QUALCOMM INCORPORATED",
!'''Type'''
                "model": "SIMCOM_SIM7600G-H",
!Example
                "revision": "LE20B04SIM7600G22",
!'''Description'''
                "hardware_revision": "10000",
|-
                "device": "/sys/devices/platform/scb/fe9c0000.xhci/usb1/1-1/1-1.4",
|id
                "drivers": [
|string /number
                  "qmi_wwan",
|"get-hw-info-001"
                  "option"
|Request identifier echoed back in the response.
                ],
|-
                "plugin": "simtech",
|origin
                "primary_port": "cdc-wdm0",
|string
                "ports": [
|"system-health"
                  {
|Actor/device that generated the response.
                    "name": "cdc-wdm0",
|-
                    "type": "qmi"
|task
                  },
|object
                  {
|{...}
                    "name": "ttyUSB0",
|Container for the action response.
                    "type": "ignored"
|-
                  },
|task.action
                  {
|string
                    "name": "ttyUSB1",
|"list_usb_devices"
                    "type": "gps"
|Action executed by the actor.
                  },
|-
                  {
|task.taskResult
                    "name": "ttyUSB2",
|object
                    "type": "at"
|{...}
                  },
|Main result object for the action.
                  {
|-
                    "name": "ttyUSB3",
|task.taskResult.usb_devices
                    "type": "at"
|object
                  },
|{...}
                  {
|Contains the USB device scan result.
                    "name": "ttyUSB4",
|-
                    "type": "audio"
|task.taskResult.usb_devices.success
                  },
|boolean
                  {
|true
                    "name": "wwan0",
|Indicates whether the lsusb
                    "type": "net"
commandexecuted successfully.
                  }
|-
                ],
|task.taskResult.usb_devices.command
                "state": "failed",
|string
                "power_state": "on",
|"lsusb"
                "access_technologies": [],
|Command used to collect USB information.
                "signal_quality": {
|-
                  "recent": "yes",
|task.taskResult.usb_devices.returncode
                  "value": "0"
|number /null
                },
|0
                "current_capabilities": [
|Process return code. 0 means success. null
                  "gsm-umts, lte"
means the command was not executed ortimed out.
                ],
|-
                "supported_capabilities": [
|task.taskResult.usb_devices.devices
                  "gsm-umts, lte"
|array
                ],
|[...]
                "operator_code": "--",
|List of USB devices detected by lsusb.
                "operator_name": "--",
|-
                "registration_state": "--",
|task.taskResult.usb_devices.devices[ ].bus
                "packet_service_state": "--",
|string
                "sim_path": null
|"001"
              }
|USB bus number where the device wasdetected.
            ],
|-
             "network_interfaces": [
|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 <code>list_connectivity_specs</code> 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:''' <code>systemHealth/runtime/in</code><syntaxhighlight lang="json" line="1">
{
  "id": "connectivity-001",
  "origin": "APP",
  "task": {
    "action": "list_connectivity_specs"
  }
}
</syntaxhighlight>'''Reply-topic:''' <code>systemHealth/runtime/connectivity/out</code><syntaxhighlight lang="json" line="1">
{
  "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": "wwan0",
                 "interface": "wlan0",
                 "available": true,
                 "available": true,
                 "status": "down",
                 "status": "down",
                 "operstate": "down",
                 "operstate": "down",
                 "admin_up": false,
                 "admin_up": true,
                 "carrier": null,
                 "carrier": false,
                 "mtu": 1500,
                 "mtu": 1500,
                 "type": 65534,
                 "type": 1,
                 "link_kind": null,
                 "link_kind": null,
                 "mac_address": null,
                 "mac_address": "2c:cf:67:fd:60:40",
                 "ipv4": [],
                 "ipv4": [],
                 "ipv6": [],
                 "ipv6": [],
                 "network_manager": null
                 "network_manager": {
                  "device": "wlan0",
                  "type": "wifi",
                  "state": "disconnected",
                  "connection": null
                },
                "wifi": {
                  "available": true,
                  "command": "iw dev wlan0 link",
                  "connected": false
                }
               }
               }
             ]
             ]
           },
           },
           "eth0": {
           "lte_modem": {
            "interface": "eth0",
             "available": true,
             "available": true,
             "status": "connected",
            "tool_available": true,
             "operstate": "up",
            "command": "mmcli -L",
             "admin_up": true,
            "modems": [
             "carrier": true,
              {
             "mtu": 1500,
                "id": "0",
             "type": 1,
                "success": true,
             "link_kind": null,
                "command": "mmcli -m 0 --output-json",
             "mac_address": "2c:cf:67:fd:60:3f",
                "manufacturer": "QUALCOMM INCORPORATED",
             "ipv4": [
                "model": "SIMCOM_SIM7600G-H",
               {
                "revision": "LE20B04SIM7600G22",
                 "address": "172.16.20.57",
                "hardware_revision": "10000",
                 "prefixlen": 24,
                "device": "/sys/devices/platform/scb/fe9c0000.xhci/usb1/1-1/1-1.4",
                 "scope": "global",
                "drivers": [
                 "dynamic": true
                  "qmi_wwan",
               }
                  "option"
             ],
                ],
             "ipv6": [
                "plugin": "simtech",
               {
                "primary_port": "cdc-wdm0",
                 "address": "fe80::7fc1:f65f:5729:d234",
                "ports": [
                 "prefixlen": 64,
                  {
                 "scope": "link",
                    "name": "cdc-wdm0",
                 "dynamic": false
                    "type": "qmi"
               }
                  },
             ],
                  {
             "network_manager": {
                    "name": "ttyUSB0",
               "device": "eth0",
                    "type": "ignored"
               "type": "ethernet",
                  },
               "state": "connected",
                  {
               "connection": "wired-ip-dynamic"
                    "name": "ttyUSB1",
             }
                    "type": "gps"
           },
                  },
           "eth1": {
                  {
             "interface": "eth1",
                    "name": "ttyUSB2",
             "available": true,
                    "type": "at"
             "status": "unavailable",
                  },
             "operstate": "down",
                  {
             "admin_up": true,
                    "name": "ttyUSB3",
             "carrier": false,
                    "type": "at"
             "mtu": 1500,
                  },
             "type": 1,
                  {
             "link_kind": null,
                    "name": "ttyUSB4",
             "mac_address": "2c:cf:67:fd:60:41",
                    "type": "audio"
             "ipv4": [],
                  },
             "ipv6": [],
                  {
             "network_manager": {
                    "name": "wwan0",
               "device": "eth1",
                    "type": "net"
               "type": "ethernet",
                  }
               "state": "unavailable",
                ],
               "connection": null
                "state": "failed",
             }
                "power_state": "on",
           },
                "access_technologies": [],
           "tunnel": {
                "signal_quality": {
             "available": false,
                  "recent": "yes",
             "interfaces": []
                  "value": "0"
           }
                },
         }
                "current_capabilities": [
       }
                  "gsm-umts, lte"
     }
                ],
   }
                "supported_capabilities": [
}
                  "gsm-umts, lte"
</syntaxhighlight>
                ],
{| class="wikitable tech-table"
                "operator_code": "--",
!'''Field'''
                "operator_name": "--",
!'''Type'''
                "registration_state": "--",
!'''Description'''
                "packet_service_state": "--",
|-
                "sim_path": null
|id
              }
|string/number
            ],
|Request/response identifier used to correlate therequest with the response.
            "network_interfaces": [
|-
              {
|origin
                "interface": "wwan0",
|string
                "available": true,
|Origin of the message. In the response, this is normallythe SystemHealth actor name.
                "status": "down",
|-
                "operstate": "down",
|task.action
                "admin_up": false,
|string
                "carrier": null,
|Executed action. For this feature, the value is list_connectivity_specs.
                "mtu": 1500,
|-
                "type": 65534,
|task.taskResult.connectivity.sources.sysfs
                "link_kind": null,
|string
                "mac_address": null,
|Linux sysfs path used to discover network interfaces, usually/sys/class/net.
                "ipv4": [],
|-
                "ipv6": [],
|task.taskResult.connectivity.sources.ip_link.available
                "network_manager": null
|boolean
              }
|Indicates whether the ip command was available andexecuted successfully.
            ]
|-
          },
|task.taskResult.connectivity.sources.ip_link.command
          "eth0": {
|string
            "interface": "eth0",
|Command used to retrieve detailed link information,for example ip -j -d link show.
            "available": true,
|-
             "status": "connected",
|task.taskResult.connectivity.sources.ip_link.error
             "operstate": "up",
|string/null
             "admin_up": true,
|Error returned by the ip command, or null if no erroroccurred.
             "carrier": true,
|-
             "mtu": 1500,
|task.taskResult.connectivity.sources.network_manager.available
             "type": 1,
|boolean
             "link_kind": null,
|Indicates whether NetworkManager / nmcli was available and executed successfully.
             "mac_address": "2c:cf:67:fd:60:3f",
|-
             "ipv4": [
|task.taskResult.connectivity.sources.network_manager.command
               {
|string
                 "address": "172.16.20.57",
|Command used to retrieve NetworkManager device status.
                 "prefixlen": 24,
|-
                 "scope": "global",
|task.taskResult.connectivity.sources.network_manager.error
                 "dynamic": true
|string/null
               }
|Error returned by nmcli, or null if no error occurred.
             ],
|-
             "ipv6": [
|task.taskResult.connectivity.interfaces.wifi.available
               {
|boolean
                 "address": "fe80::7fc1:f65f:5729:d234",
|Indicates whether at least one Wi-Fi interface was found.
                 "prefixlen": 64,
|-
                 "scope": "link",
|task.taskResult.connectivity.interfaces.wifi.interfaces[ ]
                 "dynamic": false
|array
               }
|List of detected Wi-Fi interfaces, usually including '''wlan0''' when Wi-Fi exists.
             ],
|-
             "network_manager": {
|wifi.interfaces[ ].interface
               "device": "eth0",
|string
               "type": "ethernet",
|Linux interface name, for example '''wlan0'''.
               "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'''
|-
|-
|wifi.interfaces[ ].available
|id
|boolean
|string/number
|Indicates whether the Wi-Fi interface exists in the system.
|Request/response identifier used to correlate therequest with the response.
|-
|-
|wifi.interfaces[ ].status
|origin
|string
|string
|Normalized interface status, for example '''connected, down, unavailable, no_carrier,''' or '''not_available'''.
|Origin of the message. In the response, this is normallythe SystemHealth actor name.
|-
|-
|wifi.interfaces[ ].operstate
|task.action
|string / null
|string
|Operational state reported by Linux, for example '''up, down,''' or '''unknown'''.
|Executed action. For this feature, the value is list_connectivity_specs.
|-
|-
|wifi.interfaces[ ].admin_up
|task.taskResult.connectivity.sources.sysfs
|boolean / null
|string
|Indicates whether the interface is administratively enabled.
|Linux sysfs path used to discover network interfaces, usually/sys/class/net.
|-
|-
|wifi.interfaces[ ].carrier
|task.taskResult.connectivity.sources.ip_link.available
|boolean / null
|boolean
|Indicates whether carrier/link is detected.
|Indicates whether the ip command was available andexecuted successfully.
|-
|-
|wifi.interfaces[ ].mtu
|task.taskResult.connectivity.sources.ip_link.command
|number / null
|string
|Maximum Transmission Unit of the interface.
|Command used to retrieve detailed link information,for example ip -j -d link show.
|-
|-
|wifi.interfaces[ ].type
|task.taskResult.connectivity.sources.ip_link.error
|number / null
|string/null
|Linux interface type.
|Error returned by the ip command, or null if no erroroccurred.
|-
|-
|wifi.interfaces[ ].link_kind
|task.taskResult.connectivity.sources.network_manager.available
|string / null
|boolean
|Special link type, used mainly for virtual/tunnel interfaces. Usually null for normal Wi-Fi.
|Indicates whether NetworkManager / nmcli was available and executed successfully.
|-
|-
|wifi.interfaces[ ].mac_address
|task.taskResult.connectivity.sources.network_manager.command
|string / null
|string
|MAC address of the Wi-Fi interface.
|Command used to retrieve NetworkManager device status.
|-
|-
|wifi.interfaces[ ].ipv4[ ]
|task.taskResult.connectivity.sources.network_manager.error
|array
|string/null
|List of IPv4 addresses configured on the Wi-Fi interface.
|Error returned by nmcli, or null if no error occurred.
|-
|-
|wifi.interfaces[ ].ipv6[ ]
|task.taskResult.connectivity.interfaces.wifi.available
|boolean
|Indicates whether at least one Wi-Fi interface was found.
|-
|task.taskResult.connectivity.interfaces.wifi.interfaces[ ]
|array
|array
|List of IPv6 addresses configured on the Wi-Fi interface.
|List of detected Wi-Fi interfaces, usually including '''wlan0''' when Wi-Fi exists.
|-
|-
|wifi.interfaces[ ].network_manager.device
|wifi.interfaces[ ].interface
|string
|string
|NetworkManager device name.
|Linux interface name, for example '''wlan0'''.
|-
|-
|wifi.interfaces[ ].network_manager.type
|wifi.interfaces[ ].available
|string
|boolean
|NetworkManager interface type, usually '''wifi'''.
|Indicates whether the Wi-Fi interface exists in the system.
|-
|-
|wifi.interfaces[ ].network_manager.state
|wifi.interfaces[ ].status
|string
|string
|NetworkManager state, for example '''connected''', '''disconnected''', or '''unavailable'''.
|Normalized interface status, for example '''connected, down, unavailable, no_carrier,''' or '''not_available'''.
|-
|-
|wifi.interfaces[ ].network_manager.connection
|wifi.interfaces[ ].operstate
|string / null
|string / null
|Active NetworkManager profile name, or null if none is active.
|Operational state reported by Linux, for example '''up, down,''' or '''unknown'''.
|-
|-
|wifi.interfaces[ ].wifi.available
|wifi.interfaces[ ].admin_up
|boolean
|boolean / null
|Indicates whether Wi-Fi details could be queried using '''iw'''.
|Indicates whether the interface is administratively enabled.
|-
|-
|wifi.interfaces[ ].wifi.command
|wifi.interfaces[ ].carrier
|string
|Command used to query Wi-Fi link state, for example '''iw dev wlan0 link'''.
|-
|wifi.interfaces[ ].wifi.connected
|boolean / null
|boolean / null
|Indicates whether the Wi-Fi interface is associated with a Wi-Fi network.
|Indicates whether carrier/link is detected.
|-
|-
|wifi.interfaces[ ].wifi.ssid
|wifi.interfaces[ ].mtu
|string
|number / null
|SSID of the connected Wi-Fi network, when connected.
|Maximum Transmission Unit of the interface.
|-
|-
|wifi.interfaces[ ].wifi.bssid
|wifi.interfaces[ ].type
|string
|number / null
|BSSID/MAC address of the connected access point, when connected.
|Linux interface type.
|-
|-
|wifi.interfaces[ ].wifi.frequency_mhz
|wifi.interfaces[ ].link_kind
|number
|string / null
|Wi-Fi frequency in MHz, when connected.
|Special link type, used mainly for virtual/tunnel interfaces. Usually null for normal Wi-Fi.
|-
|-
|wifi.interfaces[ ].wifi.signal_dbm
|wifi.interfaces[ ].mac_address
|number
|string / null
|Wi-Fi signal strength in dBm, when available.
|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[ ].wifi.tx_bitrate
|wifi.interfaces[ ].network_manager.device
|string
|string
|Wi-Fi transmit bitrate, when available.
|NetworkManager device name.
|-
|-
|wifi.interfaces[ ].wifi.rx_bitrate
|wifi.interfaces[ ].network_manager.type
|string
|string
|Wi-Fi receive bitrate, when available.
|NetworkManager interface type, usually '''wifi'''.
|-
|-
|task.taskResult.connectivity.interfaces.lte_modem.available
|wifi.interfaces[ ].network_manager.state
|boolean
|string
|Indicates whether at least one LTE modem was detected.
|NetworkManager state, for example '''connected''', '''disconnected''', or '''unavailable'''.
|-
|-
|task.taskResult.connectivity.interfaces.lte_modem.tool_available
|wifi.interfaces[ ].network_manager.connection
|string / null
|Active NetworkManager profile name, or null if none is active.
|-
|wifi.interfaces[ ].wifi.available
|boolean
|boolean
|Indicates whether '''mmcli''' / ModemManager is available.
|Indicates whether Wi-Fi details could be queried using '''iw'''.
|-
|-
|task.taskResult.connectivity.interfaces.lte_modem.command
|wifi.interfaces[ ].wifi.command
|string
|string
|Command used to list LTE modems, usually '''mmcli -L'''.
|Command used to query Wi-Fi link state, for example '''iw dev wlan0 link'''.
|-
|-
|task.taskResult.connectivity.interfaces.lte_modem.modems[ ]
|wifi.interfaces[ ].wifi.connected
|array
|boolean / null
|List of LTE modems detected by ModemManager.
|Indicates whether the Wi-Fi interface is associated with a Wi-Fi network.
|-
|-
|lte_modem.modems[ ].id
|wifi.interfaces[ ].wifi.ssid
|string
|string
|Modem ID in ModemManager, for example '''0'''.
|SSID of the connected Wi-Fi network, when connected.
|-
|-
|lte_modem.modems[ ].success
|wifi.interfaces[ ].wifi.bssid
|boolean
|Indicates whether detailed modem information wasread successfully.
|-
|lte_modem.modems[ ].command
|string
|string
|Command used to read modem details, for example '''mmcli -m 0 --output-json'''.
|BSSID/MAC address of the connected access point, when connected.
|-
|-
|lte_modem.modems[ ].manufacturer
|wifi.interfaces[ ].wifi.frequency_mhz
|string / null
|number
|Modem manufacturer.
|Wi-Fi frequency in MHz, when connected.
|-
|-
|lte_modem.modems[ ].model
|wifi.interfaces[ ].wifi.signal_dbm
|string / null
|number
|Modem model.
|Wi-Fi signal strength in dBm, when available.
|-
|-
|lte_modem.modems[ ].revision
|wifi.interfaces[ ].wifi.tx_bitrate
|string / null
|string
|Modem firmware/software revision.
|Wi-Fi transmit bitrate, when available.
|-
|-
|lte_modem.modems[ ].hardware_revision
|wifi.interfaces[ ].wifi.rx_bitrate
|string / null
|string
|Modem hardware revision.
|Wi-Fi receive bitrate, when available.
|-
|-
|lte_modem.modems[ ].device
|task.taskResult.connectivity.interfaces.lte_modem.available
|string / null
|boolean
|Sysfs/USB path of the modem device.
|Indicates whether at least one LTE modem was detected.
|-
|-
|lte_modem.modems[ ].drivers[ ]
|task.taskResult.connectivity.interfaces.lte_modem.tool_available
|array
|boolean
|Linux drivers associated with the modem, for example '''qmi_wwan''' or '''option'''.
|Indicates whether '''mmcli''' / ModemManager is available.
|-
|-
|lte_modem.modems[ ].plugin
|task.taskResult.connectivity.interfaces.lte_modem.command
|string / null
|string
|ModemManager plugin used to manage the modem.
|Command used to list LTE modems, usually '''mmcli -L'''.
|-
|-
|lte_modem.modems[ ].primary_port
|task.taskResult.connectivity.interfaces.lte_modem.modems[ ]
|string / null
|Primary modem control port, for example '''cdc-wdm0'''.
|-
|lte_modem.modems[ ].ports[ ]
|array
|array
|List of ports associated with the modem.
|List of LTE modems detected by ModemManager.
|-
|-
|lte_modem.modems[ ].ports[ ].name
|lte_modem.modems[ ].id
|string
|string
|Port/interface name, for example '''cdc-wdm0''', '''ttyUSB2''', or '''wwan0'''.
|Modem ID in ModemManager, for example '''0'''.
|-
|-
|lte_modem.modems[ ].ports[ ].type
|lte_modem.modems[ ].success
|string / null
|boolean
|Port type, for example '''qmi, at, gps, audio, net''', or '''ignored'''.
|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[ ].state
|lte_modem.modems[ ].manufacturer
|string / null
|string / null
|General modem state according to ModemManager,for example '''registered''', '''connected''', or '''failed'''.
|Modem manufacturer.
|-
|-
|lte_modem.modems[ ].power_state
|lte_modem.modems[ ].model
|string / null
|string / null
|Modem power state, for example '''on, off''', or '''low'''.
|Modem model.
|-
|-
|lte_modem.modems[ ].access_technologies[ ]
|lte_modem.modems[ ].revision
|array
|string / null
|Current access technologies in use, for example LTE,UMTS, or GSM.
|Modem firmware/software revision.
|-
|-
|lte_modem.modems[ ].signal_quality.recent
|lte_modem.modems[ ].hardware_revision
|string / null
|string / null
|Indicates whether the signal quality value is recent.
|Modem hardware revision.
|-
|-
|lte_modem.modems[ ].signal_quality.value
|lte_modem.modems[ ].device
|string / number / null
|string / null
|Signal quality value reported by the modem.
|Sysfs/USB path of the modem device.
|-
|-
|lte_modem.modems[ ].current_capabilities[ ]
|lte_modem.modems[ ].drivers[ ]
|array
|array
|Current modem capabilities.
|Linux drivers associated with the modem, for example '''qmi_wwan''' or '''option'''.
|-
|-
|lte_modem.modems[ ].supported_capabilities[ ]
|lte_modem.modems[ ].plugin
|array
|string / null
|Capabilities supported by the modem.
|ModemManager plugin used to manage the modem.
|-
|-
|lte_modem.modems[ ].operator_code
|lte_modem.modems[ ].primary_port
|string / null
|string / null
|MCC/MNC operator code.
|Primary modem control port, for example '''cdc-wdm0'''.
|-
|lte_modem.modems[ ].ports[ ]
|array
|List of ports associated with the modem.
|-
|-
|lte_modem.modems[ ].operator_name
|lte_modem.modems[ ].ports[ ].name
|string / null
|string
|Operator name.
|Port/interface name, for example '''cdc-wdm0''', '''ttyUSB2''', or '''wwan0'''.
|-
|-
|lte_modem.modems[ ].registration_state
|lte_modem.modems[ ].ports[ ].type
|string / null
|string / null
|Mobile network registration state.
|Port type, for example '''qmi, at, gps, audio, net''', or '''ignored'''.
|-
|-
|lte_modem.modems[ ].packet_service_state
|lte_modem.modems[ ].state
|string / null
|string / null
|Mobile packet data service state.
|General modem state according to ModemManager,for example '''registered''', '''connected''', or '''failed'''.
|-
|-
|lte_modem.modems[ ].sim_path
|lte_modem.modems[ ].power_state
|string / null
|string / null
|SIM path in ModemManager, when available.
|Modem power state, for example '''on, off''', or '''low'''.
|-
|-
|task.taskResult.connectivity.interfaces.lte_modem.network_interfaces[]
|lte_modem.modems[ ].access_technologies[ ]
|array
|array
|List of Linux network interfaces associated with the LTE modem, usually '''wwan0'''.
|Current access technologies in use, for example LTE,UMTS, or GSM.
|-
|-
|lte_modem.network_interfaces[ ].interface
|lte_modem.modems[ ].signal_quality.recent
|string
|string / null
|LTE network interface name, for example '''wwan0'''.
|Indicates whether the signal quality value is recent.
|-
|-
|lte_modem.network_interfaces[ ].available
|lte_modem.modems[ ].signal_quality.value
|boolean
|string / number / null
|Indicates whether the LTE network interface exists.
|Signal quality value reported by the modem.
|-
|-
|lte_modem.network_interfaces[ ].status
|lte_modem.modems[ ].current_capabilities[ ]
|string
|array
|Normalized LTE network interface status.
|Current modem capabilities.
|-
|-
|lte_modem.network_interfaces[ ].operstate
|lte_modem.modems[ ].supported_capabilities[ ]
|array
|Capabilities supported by the modem.
|-
|lte_modem.modems[ ].operator_code
|string / null
|string / null
|Operational state reported by Linux.
|MCC/MNC operator code.
|-
|-
|lte_modem.network_interfaces[ ].admin_up
|lte_modem.modems[ ].operator_name
|boolean / null
|string / null
|Indicates whether the LTE network interface is administratively enabled.
|Operator name.
|-
|-
|lte_modem.network_interfaces[ ].carrier
|lte_modem.modems[ ].registration_state
|boolean / null
|string / null
|Indicates whether carrier/link information is availableand active.
|Mobile network registration state.
|-
|-
|lte_modem.network_interfaces[ ].mtu
|lte_modem.modems[ ].packet_service_state
|number / null
|string / null
|Maximum Transmission Unit of the LTE network interface.
|Mobile packet data service state.
|-
|-
|lte_modem.network_interfaces[ ].type
|lte_modem.modems[ ].sim_path
|number / null
|string / null
|Linux interface type.
|SIM path in ModemManager, when available.
|-
|-
|lte_modem.network_interfaces[ ].link_kind
|task.taskResult.connectivity.interfaces.lte_modem.network_interfaces[]
|string / null
|Link kind, when available.
|-
|lte_modem.network_interfaces[ ].mac_address
|string / null
|MAC address, when available.
|-
|lte_modem.network_interfaces[ ].ipv4[ ]
|array
|array
|IPv4 addresses configured on the LTE network interface.
|List of Linux network interfaces associated with the LTE modem, usually '''wwan0'''.
|-
|-
|lte_modem.network_interfaces[ ].ipv6[ ]
|lte_modem.network_interfaces[ ].interface
|array
|string
|IPv6 addresses configured on the LTE network interface.
|LTE network interface name, for example '''wwan0'''.
|-
|-
|lte_modem.network_interfaces[ ].network_manager
|lte_modem.network_interfaces[ ].available
|object / null
|boolean
|NetworkManager information for the LTE interface, when available.
|Indicates whether the LTE network interface exists.
|-
|-
|task.taskResult.connectivity.interfaces.eth0.interface
|lte_modem.network_interfaces[ ].status
|string
|string
|Ethernet interface name, '''eth0'''.
|Normalized LTE network interface status.
|-
|-
|task.taskResult.connectivity.interfaces.eth0.available
|lte_modem.network_interfaces[ ].operstate
|boolean
|Indicates whether '''eth0''' exists.
|-
|task.taskResult.connectivity.interfaces.eth0.status
|string
|Normalized '''eth0''' status.
|-
|task.taskResult.connectivity.interfaces.eth0.operstate
|string / null
|string / null
|Operational state of '''eth0'''.
|Operational state reported by Linux.
|-
|-
|task.taskResult.connectivity.interfaces.eth0.admin_up
|lte_modem.network_interfaces[ ].admin_up
|boolean / null
|boolean / null
|Indicates whether '''eth0''' is administratively enabled.
|Indicates whether the LTE network interface is administratively enabled.
|-
|-
|task.taskResult.connectivity.interfaces.eth0.carrier
|lte_modem.network_interfaces[ ].carrier
|boolean / null
|boolean / null
|Indicates whether '''eth0''' has physical link.
|Indicates whether carrier/link information is availableand active.
|-
|-
|task.taskResult.connectivity.interfaces.eth0.mtu
|lte_modem.network_interfaces[ ].mtu
|number / null
|number / null
|MTU of '''eth0'''.
|Maximum Transmission Unit of the LTE network interface.
|-
|-
|task.taskResult.connectivity.interfaces.eth0.type
|lte_modem.network_interfaces[ ].type
|number / null
|number / null
|Linux interface type of '''eth0'''.
|Linux interface type.
|-
|-
|task.taskResult.connectivity.interfaces.eth0.link_kind
|lte_modem.network_interfaces[ ].link_kind
|string / null
|string / null
|Link kind of '''eth0''', usually '''null'''.
|Link kind, when available.
|-
|-
|task.taskResult.connectivity.interfaces.eth0.mac_address
|lte_modem.network_interfaces[ ].mac_address
|string / null
|string / null
|MAC address of '''eth0'''.
|MAC address, when available.
|-
|-
|task.taskResult.connectivity.interfaces.eth0.ipv4[ ]
|lte_modem.network_interfaces[ ].ipv4[ ]
|array
|array
|IPv4 addresses configured on '''eth0'''.
|IPv4 addresses configured on the LTE network interface.
|-
|-
|task.taskResult.connectivity.interfaces.eth0.ipv6[ ]
|lte_modem.network_interfaces[ ].ipv6[ ]
|array
|array
|IPv6 addresses configured on '''eth0'''.
|IPv6 addresses configured on the LTE network interface.
|-
|-
|task.taskResult.connectivity.interfaces.eth0.network_manager
|lte_modem.network_interfaces[ ].network_manager
|object / null
|object / null
|NetworkManager information for '''eth0'''.
|NetworkManager information for the LTE interface, when available.
|-
|-
|task.taskResult.connectivity.interfaces.eth1.interface
|task.taskResult.connectivity.interfaces.eth0.interface
|string
|string
|Ethernet interface name, '''eth1'''.
|Ethernet interface name, '''eth0'''.
|-
|-
|task.taskResult.connectivity.interfaces.eth1.available
|task.taskResult.connectivity.interfaces.eth0.available
|boolean
|boolean
|Indicates whether '''eth1''' exists.
|Indicates whether '''eth0''' exists.
|-
|-
|task.taskResult.connectivity.interfaces.eth1.status
|task.taskResult.connectivity.interfaces.eth0.status
|string
|string
|Normalized '''eth1''' status.
|Normalized '''eth0''' status.
|-
|-
|task.taskResult.connectivity.interfaces.eth1.operstate
|task.taskResult.connectivity.interfaces.eth0.operstate
|string / null
|string / null
|Operational state of '''eth1'''.
|Operational state of '''eth0'''.
|-
|-
|task.taskResult.connectivity.interfaces.eth1.admin_up
|task.taskResult.connectivity.interfaces.eth0.admin_up
|boolean / null
|boolean / null
|Indicates whether '''eth1''' is administratively enabled.
|Indicates whether '''eth0''' is administratively enabled.
|-
|-
|task.taskResult.connectivity.interfaces.eth1.carrier
|task.taskResult.connectivity.interfaces.eth0.carrier
|boolean / null
|boolean / null
|Indicates whether '''eth1''' has physical link.
|Indicates whether '''eth0''' has physical link.
|-
|-
|task.taskResult.connectivity.interfaces.eth1.mtu
|task.taskResult.connectivity.interfaces.eth0.mtu
|number / null
|number / null
|MTU of '''eth1'''.
|MTU of '''eth0'''.
|-
|-
|task.taskResult.connectivity.interfaces.eth1.type
|task.taskResult.connectivity.interfaces.eth0.type
|number / null
|number / null
|Linux interface type of '''eth1'''.
|Linux interface type of '''eth0'''.
|-
|-
|task.taskResult.connectivity.interfaces.eth1.link_kind
|task.taskResult.connectivity.interfaces.eth0.link_kind
|string / null
|string / null
|Link kind of '''eth1''', usually '''null'''.
|Link kind of '''eth0''', usually '''null'''.
|-
|-
|task.taskResult.connectivity.interfaces.eth1.mac_address
|task.taskResult.connectivity.interfaces.eth0.mac_address
|string / null
|string / null
|MAC address of '''eth1'''.
|MAC address of '''eth0'''.
|-
|-
|task.taskResult.connectivity.interfaces.eth1.ipv4[ ]
|task.taskResult.connectivity.interfaces.eth0.ipv4[ ]
|array
|array
|IPv4 addresses configured on '''eth1'''.
|IPv4 addresses configured on '''eth0'''.
|-
|-
|task.taskResult.connectivity.interfaces.eth1.ipv6[ ]
|task.taskResult.connectivity.interfaces.eth0.ipv6[ ]
|array
|array
|IPv6 addresses configured on '''eth1'''.
|IPv6 addresses configured on '''eth0'''.
|-
|-
|task.taskResult.connectivity.interfaces.eth1.network_manager
|task.taskResult.connectivity.interfaces.eth0.network_manager
|object / null
|object / null
|NetworkManager information for '''eth1'''.
|NetworkManager information for '''eth0'''.
|-
|task.taskResult.connectivity.interfaces.eth1.interface
|string
|Ethernet interface name, '''eth1'''.
|-
|-
|task.taskResult.connectivity.interfaces.tunnel.available
|task.taskResult.connectivity.interfaces.eth1.available
|boolean
|boolean
|Indicates whether at least one tunnel interface was detected.
|Indicates whether '''eth1''' exists.
|-
|-
|task.taskResult.connectivity.interfaces.tunnel.interfaces[ ]
|task.taskResult.connectivity.interfaces.eth1.status
|array
|List of detected tunnel interfaces, for example '''tun0, tap0, wg0''', or '''tailscale0'''.
|-
|tunnel.interfaces[ ].interface
|string
|string
|Tunnel interface name.
|Normalized '''eth1''' status.
|-
|-
|tunnel.interfaces[ ].available
|task.taskResult.connectivity.interfaces.eth1.operstate
|boolean
|Indicates whether the tunnel interface exists.
|-
|tunnel.interfaces[ ].status
|string
|Normalized tunnel interface status.
|-
|tunnel.interfaces[ ].operstate
|string / null
|string / null
|Operational state reported by Linux.
|Operational state of '''eth1'''.
|-
|-
|tunnel.interfaces[ ].admin_up
|task.taskResult.connectivity.interfaces.eth1.admin_up
|boolean / null
|boolean / null
|Indicates whether the tunnel interface isadministratively enabled.
|Indicates whether '''eth1''' is administratively enabled.
|-
|-
|tunnel.interfaces[ ].carrier
|task.taskResult.connectivity.interfaces.eth1.carrier
|boolean / null
|boolean / null
|Carrier/link information, when available.
|Indicates whether '''eth1''' has physical link.
|-
|-
|tunnel.interfaces[ ].mtu
|task.taskResult.connectivity.interfaces.eth1.mtu
|number / null
|number / null
|Tunnel interface MTU.
|MTU of '''eth1'''.
|-
|-
|tunnel.interfaces[ ].type
|task.taskResult.connectivity.interfaces.eth1.type
|number / null
|number / null
|Linux interface type.
|Linux interface type of '''eth1'''.
|-
|-
|tunnel.interfaces[ ].link_kind
|task.taskResult.connectivity.interfaces.eth1.link_kind
|string / null
|string / null
|Tunnel link kind, for example '''tun, tap''', or '''wireguard'''.
|Link kind of '''eth1''', usually '''null'''.
|-
|-
|tunnel.interfaces[ ].mac_address
|task.taskResult.connectivity.interfaces.eth1.mac_address
|string / null
|string / null
|MAC address, when available.
|MAC address of '''eth1'''.
|-
|-
|tunnel.interfaces[ ].ipv4[ ]
|task.taskResult.connectivity.interfaces.eth1.ipv4[ ]
|array
|array
|IPv4 addresses configured on the tunnel interface.
|IPv4 addresses configured on '''eth1'''.
|-
|-
|tunnel.interfaces[ ].ipv6[ ]
|task.taskResult.connectivity.interfaces.eth1.ipv6[ ]
|array
|array
|IPv6 addresses configured on the tunnel interface.
|IPv6 addresses configured on '''eth1'''.
|-
|-
|tunnel.interfaces[ ].network_manager
|task.taskResult.connectivity.interfaces.eth1.network_manager
|object / null
|object / null
|NetworkManager information for the tunnel interface, when available.
|NetworkManager information for '''eth1'''.
|-
|-
|ipv4[ ].address
|task.taskResult.connectivity.interfaces.tunnel.available
|string
|boolean
|IPv4 address assigned to the interface.
|Indicates whether at least one tunnel interface was detected.
|-
|-
|ipv4[ ].prefixlen
|task.taskResult.connectivity.interfaces.tunnel.interfaces[ ]
|number
|array
|IPv4 network prefix length. Example: '''24'''.
|List of detected tunnel interfaces, for example '''tun0, tap0, wg0''', or '''tailscale0'''.
|-
|-
|ipv4[ ].scope
|tunnel.interfaces[ ].interface
|string
|string
|IPv4 scope, for example '''global'''.
|Tunnel interface name.
|-
|-
|ipv4[ ].dynamic
|tunnel.interfaces[ ].available
|boolean
|boolean
|Indicates whether the IPv4 address was dynamically assigned.
|Indicates whether the tunnel interface exists.
|-
|-
|ipv6[ ].address
|tunnel.interfaces[ ].status
|string
|string
|IPv6 address assigned to the interface.
|Normalized tunnel interface status.
|-
|-
|ipv6[ ].prefixlen
|tunnel.interfaces[ ].operstate
|number
|string / null
|IPv6 network prefix length.
|Operational state reported by Linux.
|-
|-
|ipv6[ ].scope
|tunnel.interfaces[ ].admin_up
|string
|boolean / null
|IPv6 scope, for example '''link''' or '''global'''.
|Indicates whether the tunnel interface isadministratively enabled.
|-
|-
|ipv6[].dynamic
|tunnel.interfaces[ ].carrier
|boolean
|boolean / null
|Indicates whether the IPv6 address was dynamically assigned.
|Carrier/link information, when available.
|}
|-
 
|tunnel.interfaces[ ].mtu
====== c) Get hardware info ======
|number / null
'''Req-topic''': systemHealth/runtime/in<syntaxhighlight lang="json" line="1">
|Tunnel interface MTU.
{
|-
  "id": "<TIMESTAMP>",
|tunnel.interfaces[ ].type
  "origin": "Dev",
|number / null
  "task": {
|Linux interface type.
    "action": "GET_HW_INFO"
|-
  }
|tunnel.interfaces[ ].link_kind
}
|string / null
</syntaxhighlight>'''Reply-topic''': systemHealth/runtime/hw/info/out<syntaxhighlight lang="json" line="1">
|Tunnel link kind, for example '''tun, tap''', or '''wireguard'''.
{
|-
  "id": "<TIMESTAMP>",
|tunnel.interfaces[ ].mac_address
  "origin": "system-health",
|string / null
  "task": {
|MAC address, when available.
    "action": "get_hw_info",
    "taskResult": {
      "cpu": {......},
      "ram": {......},
      "emmc": {......},
      "block_devices": {......},
      "filesystems": {......},
      "mmc_sysfs": {......},
      "emmc_extcsd": {......}
    }
  }
}
</syntaxhighlight>
{| class="wikitable tech-table"
|-
|-
|'''Section'''
|tunnel.interfaces[ ].ipv4[ ]
|'''Description'''
|array
|IPv4 addresses configured on the tunnel interface.
|-
|-
|'''cpu'''
|tunnel.interfaces[ ].ipv6[ ]
|CPU and board model information.
|array
|IPv6 addresses configured on the tunnel interface.
|-
|-
|'''ram'''
|tunnel.interfaces[ ].network_manager
|RAM total, used, and free memory.
|object / null
|NetworkManager information for the tunnel interface, when available.
|-
|-
|'''emmc'''
|ipv4[ ].address
|Filtered eMMC device and partition information.
|string
|IPv4 address assigned to the interface.
|-
|-
|'''block_devices'''
|ipv4[ ].prefixlen
|Complete block device list from '''lsblk''', including eMMC, boot partitions, loop devices, zram, NVMe, USB storage, etc.
|number
|IPv4 network prefix length. Example: '''24'''.
|-
|-
|'''filesystems'''
|ipv4[ ].scope
|Mounted filesystem usage from '''df -h'''.
|string
|IPv4 scope, for example '''global'''.
|-
|-
|'''mmc_sysfs'''
|ipv4[ ].dynamic
|Low-level MMC/eMMC identity fields read from '''/sys/block/mmcblk*/device'''.
|boolean
|Indicates whether the IPv4 address was dynamically assigned.
|-
|-
|'''emmc_extcsd'''
|ipv6[ ].address
|Parsed eMMC EXT_CSD information from '''mmc extcsd read''', including health, revision, RPMB, boot, and partitioning data.
|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.
|}
|}


* '''CPU'''
====== c) Get hardware info ======
 
'''Req-topic:''' <code>systemHealth/runtime/in</code><syntaxhighlight lang="json" line="1">
The '''cpu''' object describes the detected board and CPU.<syntaxhighlight lang="json" line="1">
{
{
   "board_model": "Raspberry Pi Compute Module 4 Rev 1.1",
   "id": <TIMESTAMP>,
   "cpu": {
   "origin": "Dev",
    "architecture": "aarch64",
  "task": {
    "op_modes": "32-bit, 64-bit",
     "action": "GET_HW_INFO"
    "byte_order": "Little Endian",
    "vendor": "ARM",
    "model_name": "Cortex-A72",
     "model": "3",
    "stepping": "r0p3",
    "cpu_count": 4,
    "online_cpus": "0-3",
    "threads_per_core": 1,
    "cores_per_cluster": 4,
    "clusters": 1,
    "frequency": {
      "scaling_percent": 60.0,
      "min_mhz": 600.0,
      "max_mhz": 1500.0,
      "bogomips": 108.0
    }
   }
   }
}
}
</syntaxhighlight>
</syntaxhighlight>'''Reply-topic:''' <code>systemHealth/runtime/hw/info/out</code><syntaxhighlight lang="json" line="1">
{| class="wikitable tech-table"
{
!'''Field'''
  "id": <TIMESTAMP>,
!'''Type'''
  "origin": "system-health",
!'''Description'''
  "task": {
    "action": "get_hw_info",
    "taskResult": {
      "cpu": {......},
      "ram": {......},
      "emmc": {......},
      "block_devices": {......},
      "filesystems": {......},
      "mmc_sysfs": {......},
      "emmc_extcsd": {......}
    }
  }
}
</syntaxhighlight>
{| class="wikitable tech-table"
|-
|-
|board_model
|'''Section'''
|string / null
|'''Description'''
|Hardware board model read from device-tree.
|-
|-
|cpu.architecture
|'''cpu'''
|string
|CPU and board model information.
|CPU architecture, for example '''aarch64'''.
|-
|-
|cpu.op_modes
|'''ram'''
|string
|RAM total, used, and free memory.
|Supported CPU operation modes.
|-
|-
|cpu.byte_order
|'''emmc'''
|string
|Filtered eMMC device and partition information.
|CPU byte order.
|-
|-
|cpu.vendor
|'''block_devices'''
|string
|Complete block device list from '''lsblk''', including eMMC, boot partitions, loop devices, zram, NVMe, USB storage, etc.
|CPU vendor.
|-
|-
|cpu.model_name
|'''filesystems'''
|string
|Mounted filesystem usage from '''df -h'''.
|CPU model name.
|-
|-
|cpu.model
|'''mmc_sysfs'''
|string / number
|Low-level MMC/eMMC identity fields read from '''/sys/block/mmcblk*/device'''.
|CPU model identifier.
|-
|-
|cpu.stepping
|'''emmc_extcsd'''
|string
|Parsed eMMC EXT_CSD information from '''mmc extcsd read''', including health, revision, RPMB, boot, and partitioning data.
|CPU stepping/revision.
|}
|-
 
|cpu.cpu_count
* '''CPU'''
|number
 
|Number of detected CPU cores.
The '''cpu''' object describes the detected board and CPU.<syntaxhighlight lang="json" line="1">
{
  "board_model": "Raspberry Pi Compute Module 4 Rev 1.1",
  "cpu": {
    "architecture": "aarch64",
    "op_modes": "32-bit, 64-bit",
    "byte_order": "Little Endian",
    "vendor": "ARM",
    "model_name": "Cortex-A72",
    "model": "3",
    "stepping": "r0p3",
    "cpu_count": 4,
    "online_cpus": "0-3",
    "threads_per_core": 1,
    "cores_per_cluster": 4,
    "clusters": 1,
    "frequency": {
      "scaling_percent": 60.0,
      "min_mhz": 600.0,
      "max_mhz": 1500.0,
      "bogomips": 108.0
    }
  }
}
</syntaxhighlight>
{| class="wikitable tech-table"
!'''Field'''
!'''Type'''
!'''Description'''
|-
|board_model
|string / null
|Hardware board model read from device-tree.
|-
|-
|cpu.online_cpus
|cpu.architecture
|string
|string
|Online CPU list.
|CPU architecture, for example '''aarch64'''.
|-
|-
|cpu.threads_per_core
|cpu.op_modes
|number
|string
|Number of threads per core.
|Supported CPU operation modes.
|-
|-
|cpu.cores_per_cluster
|cpu.byte_order
|number
|string
|Number of cores per cluster.
|CPU byte order.
|-
|-
|cpu.clusters
|cpu.vendor
|number
|string
|Number of CPU clusters.
|CPU vendor.
|-
|-
|cpu.frequency.scaling_percent
|cpu.model_name
|number / null
|string
|Current CPU frequency scaling percentage.
|CPU model name.
|-
|-
|cpu.frequency.min_mhz
|cpu.model
|number / null
|string / number
|Minimum CPU frequency in MHz.
|CPU model identifier.
|-
|-
|cpu.frequency.max_mhz
|cpu.stepping
|number / null
|string
|Maximum CPU frequency in MHz.
|CPU stepping/revision.
|-
|-
|cpu.frequency.bogomips
|cpu.cpu_count
|number / null
|number
|BogoMIPS value reported by the system.
|Number of detected CPU cores.
|}
 
* '''RAM'''
 
The '''ram''' object reports system memory usage.
{| class="wikitable tech-table"
!'''Field'''
!'''Type'''
!'''Description'''
|-
|-
|'''total'''
|cpu.online_cpus
|string
|string
|Total system RAM.
|Online CPU list.
|-
|-
|'''used'''
|cpu.threads_per_core
|string
|number
|Currently used RAM.
|Number of threads per core.
|-
|-
|'''free'''
|cpu.cores_per_cluster
|string
|number
|Currently free RAM.
|Number of cores per cluster.
|-
|cpu.clusters
|number
|Number of CPU clusters.
|-
|cpu.frequency.scaling_percent
|number / null
|Current CPU frequency scaling percentage.
|-
|cpu.frequency.min_mhz
|number / null
|Minimum CPU frequency in MHz.
|-
|cpu.frequency.max_mhz
|number / null
|Maximum CPU frequency in MHz.
|-
|cpu.frequency.bogomips
|number / null
|BogoMIPS value reported by the system.
|}
|}


* '''EMMC'''
* '''RAM'''


The '''emmc''' object is a '''filtered eMMC''' '''view'''. It focuses on the main eMMC disk and its partitions.<syntaxhighlight lang="json" line="1">
The <code>ram</code> object reports system memory usage.
{
{| class="wikitable tech-table"
   "devices": [
!'''Field'''
     {
!'''Type'''
!'''Description'''
|-
|'''total'''
|string
|Total system RAM.
|-
|'''used'''
|string
|Currently used RAM.
|-
|'''free'''
|string
|Currently free RAM.
|}
 
* '''EMMC'''
 
The <code>emmc</code> object is a '''filtered eMMC view'''. It focuses on the main eMMC disk and its partitions.<syntaxhighlight lang="json" line="1">{
   "devices": [
     {
       "name": "mmcblk0",
       "name": "mmcblk0",
       "model": null,
       "model": null,
Line 2,334: Line 2,781:
     }
     }
   ]
   ]
}
}</syntaxhighlight>'''Device fields'''
</syntaxhighlight>'''Device fields'''
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!'''Field'''
!'''Field'''
Line 2,409: Line 2,855:


====== d) block_devices ======
====== d) block_devices ======
The '''block_devices''' object is the complete storage/device tree returned by '''lsblk'''.<syntaxhighlight lang="json" line="1">
The <code>block_devices</code> object is the complete storage/device tree returned by <code>lsblk</code>.<syntaxhighlight lang="json" line="1">{
{
   "devices": [
   "devices": [
     {
     {
Line 2,439: Line 2,884:
   ],
   ],
   "stderr": ""
   "stderr": ""
}
}</syntaxhighlight>
</syntaxhighlight>
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!'''Field'''
!'''Field'''
Line 2,492: Line 2,936:


====== e) file_systems ======
====== e) file_systems ======
The '''file_systems''' object reports mounted filesystem usage, equivalent to '''df -h'''.<syntaxhighlight lang="json" line="1">
The <code>file_systems</code> object reports mounted filesystem usage, equivalent to <code>df -h</code>.<syntaxhighlight lang="json" line="1">{
{
   "filesystems": [
   "filesystems": [
     {
     {
Line 2,517: Line 2,960:
   ],
   ],
   "stderr": ""
   "stderr": ""
}
}</syntaxhighlight>
</syntaxhighlight>
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!'''Field'''
!'''Field'''
Line 2,534: Line 2,976:
|filesystems[index].source
|filesystems[index].source
|string
|string
|Filesystem source, for example '''/dev/mmcblk0p2''' , '''tmpfs''' , or '''udev'''.
|Filesystem source, for example <code>/dev/mmcblk0p2</code>, <code>tmpfs</code>, or <code>udev</code>.
|-
|-
|filesystems[index].filesystem
|filesystems[index].filesystem
|string
|string
|Filesystem type, for example '''ext4''' , '''vfat''' , '''tmpfs''' , or '''devtmpfs'''.
|Filesystem type, for example <code>ext4</code>, <code>vfat</code>, <code>tmpfs</code>, or <code>devtmpfs</code>.
|-
|-
|filesystems[index].size
|filesystems[index].size
Line 2,562: Line 3,004:
|filesystems[index].parsed
|filesystems[index].parsed
|boolean
|boolean
|'''true''' if the parser successfully parsed this filesystem entry.
|<code>true</code> if the parser successfully parsed this filesystem entry.
|}
|}


====== f) mmc_sysfs ======
====== f) mmc_sysfs ======
The '''mmc_sysfs''' object exposes low-level MMC/eMMC identity fields read from:
The <code>mmc_sysfs</code> object exposes low-level MMC/eMMC identity fields read from:<syntaxhighlight>
 
/sys/block/mmcblk*/device/
'''/sys/block/mmcblk*/device/'''
</syntaxhighlight>


This is useful for production traceability, device identification and diagnostics.<syntaxhighlight lang="json" line="1">
This is useful for production traceability, device identification and diagnostics.<syntaxhighlight lang="json" line="1">
Line 2,659: Line 3,101:


====== e) emmc_extcsd ======
====== e) emmc_extcsd ======
The '''emmc_extcsd''' object contains parsed information from:
The <code>emmc_extcsd</code> object contains parsed information from:<syntaxhighlight>
 
mmc extcsd read /dev/mmcblk0
'''mmc extcsd read /dev/mmcblk0'''
</syntaxhighlight>This section is useful for:
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!'''Category'''
!'''Category'''
Line 2,683: Line 3,125:
|partitioning
|partitioning
|Partitioning and enhanced-area information.
|Partitioning and enhanced-area information.
|}
|}<syntaxhighlight lang="json" line="1">
'''emmc_extcsd.devices[''' '''].revision'''<syntaxhighlight lang="json" line="1">
{
  "command": "mmc extcsd read <device>",
  "devices": [
    {
      "success": true,
      "device": "/dev/mmcblk0",
      "command": "mmc extcsd read /dev/mmcblk0",
      "returncode": 0,
      "revision": {
        "ext_csd_revision": "1.8",
        "mmc_version": "MMC 5.1"
      },
      "health": {},
      "boot": {},
      "rpmb": {},
      "sector": {},
      "partitioning": {}
    }
  ]
}
</syntaxhighlight>
{| class="wikitable tech-table"
!'''Field'''
!Type
!'''Description'''
|-
|command
|string
|Generic command pattern.
|-
|devices
|array
|Parsed EXT_CSD results per eMMC device.
|-
|success
|boolean
|<code>true</code> if EXT_CSD was read successfully for this device.
|-
|devices[index].device
|string
|Device path, for example <code>/dev/mmcblk0</code>.
|-
|devices[index].command
|string
|Exact command executed for this device.
|-
|devices[index].returncode
|number / null
|Process return code.
|-
|devices[index].revision
|object
|EXT_CSD revision and MMC version.
|-
|devices[index].health
|object
|Lifetime and pre-EOL information.
|-
|devices[index].boot
|object
|Boot-related information.
|-
|devices[index].rpmb
|object
|RPMB information.
|-
|devices[index].sector
|object
|Sector count and capacity data.
|-
|devices[index].partitioning
|object
|Partitioning and enhanced-area configuration.
|}
'''emmc_extcsd.devices[].revision'''<syntaxhighlight lang="json" line="1">
{
{
   "ext_csd_revision": "1.8",
   "ext_csd_revision": "1.8",
Line 2,693: Line 3,209:
!'''Field'''
!'''Field'''
!Type
!Type
!'''Description'''
!Description
|-
|-
|ext_csd_revision
|ext_csd_revision
Line 2,703: Line 3,219:
|MMC/eMMC standard version.
|MMC/eMMC standard version.
|}
|}
'''emmc_extcsd.devices[ ].health'''<syntaxhighlight lang="json" line="1">
'''emmc_extcsd.devices[].health'''<syntaxhighlight lang="json">
{
{
   "life_time_estimation_a": {
   "life_time_estimation_a": {
Line 2,736: Line 3,252:
   },
   },
   "pre_eol": {
   "pre_eol": {
     "field": {
     "field": {
       "register": "PRE_EOL_INFO",
       "register": "PRE_EOL_INFO",
       "index": null,
       "index": null,
       "description": "eMMC Pre EOL information",
       "description": "eMMC Pre EOL information",
       "value": "0x01",
       "value": "0x01",
       "value_int": 1,
       "value_int": 1,
       "value_hex": "0x1"
       "value_hex": "0x1"
     },
     },
     "decoded": {
     "decoded": {
       "state": "normal"
       "state": "normal"
     }
     }
   }
   }
}
}
</syntaxhighlight>
</syntaxhighlight>'''Fields'''
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!'''Field'''
!Field
!'''Description'''
!Description
|-
|-
|life_time_estimation_a
|life_time_estimation_a
Line 2,763: Line 3,279:
|Pre-end-of-life state.
|Pre-end-of-life state.
|}
|}
Lifetime Decoding
'''Lifetime Decoding'''
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!'''Raw Value'''
!'''Raw Value'''
Line 2,795: Line 3,311:
|0x06
|0x06
|normal
|normal
|50% to 60% estimated lifetime used
|50% to 60% estimated lifetime used.
|-
|-
|0x07
|0x07
Line 2,817: Line 3,333:
|Estimated maximum lifetime exceeded.
|Estimated maximum lifetime exceeded.
|}
|}
Pre-EOL Decoding
'''Pre-EOL Decoding'''
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!'''Raw Value'''
!'''Raw Value'''
Line 2,839: Line 3,355:
|Urgent state. Replacement recommended.
|Urgent state. Replacement recommended.
|}
|}
'''emmc_extcsd.devices[ ].boot'''<syntaxhighlight lang="json" line="1">
'''emmc_extcsd.devices[].boot'''<syntaxhighlight lang="json" line="1">{
{
   "partition_config": {
   "partition_config": {
     "field": null,
     "field": null,
Line 2,859: Line 3,374:
     "decoded": null
     "decoded": null
   }
   }
}
}</syntaxhighlight>
</syntaxhighlight>
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!'''Field'''
!'''Field'''
Line 2,886: Line 3,400:
|Boot partition size, if available.
|Boot partition size, if available.
|}
|}
'''emmc_extcsd.devices[ ].rpmb'''
'''emmc_extcsd.devices[].rpmb'''


RPMB means '''Replay Protected Memory Block'''. It is a protected eMMC area often used for secure storage.<syntaxhighlight lang="json" line="1">
RPMB means '''Replay Protected Memory Block'''. It is a protected eMMC area often used for secure storage.<syntaxhighlight lang="json" line="1">{
{
   "size": {
   "size": {
     "field": {
     "field": {
Line 2,909: Line 3,422:
     }
     }
   }
   }
}
}</syntaxhighlight>
</syntaxhighlight>
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!'''Field'''
!'''Field'''
Line 2,948: Line 3,460:
|RPMB size in GiB.
|RPMB size in GiB.
|}
|}
'''emmc_extcsd.devices[ ].sector'''<syntaxhighlight lang="json" line="1">
'''emmc_extcsd.devices[ ].sector'''<syntaxhighlight lang="json" line="1">{
{
   "sector_count": null,
   "sector_count": null,
   "sector_size_bytes": 512,
   "sector_size_bytes": 512,
   "user_capacity": null
   "user_capacity": null
}
}</syntaxhighlight>
</syntaxhighlight>
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!'''Field'''
!'''Field'''
Line 2,972: Line 3,482:
|Calculated user capacity, if sector count is available.
|Calculated user capacity, if sector count is available.
|}
|}
'''emmc_extcsd.devices[ ].partitioning'''<syntaxhighlight lang="json" line="1">
'''emmc_extcsd.devices[].partitioning'''<syntaxhighlight lang="json" line="1">{
{
   "partitioning_support": {
   "partitioning_support": {
     "register": "PARTITIONING_SUPPORT",
     "register": "PARTITIONING_SUPPORT",
Line 3,022: Line 3,531:
     "value_hex": "0x0"
     "value_hex": "0x0"
   }
   }
}
}</syntaxhighlight>
</syntaxhighlight>
{| class="wikitable tech-table"
{| class="wikitable tech-table"
!'''Field'''
!'''Field'''