SENSBLUE ATLAS/Datasheet: Difference between revisions
Appearance
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>. | ||
====== | ====== a) eMMC RUL Data Flow ====== | ||
[placeholder] | [placeholder] | ||
===== | ====== b) Wear-Level Format ====== | ||
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. | |||
====== d) emmc_rul Payload ====== | |||
The calculated RUL is published inside the regular <code>systemHealth/runtime/out</code> payload. | |||
====== | |||
Example:<syntaxhighlight lang="json"> | |||
{ | { | ||
"id": | "id": 1782230830898, | ||
"origin": "system-health | "origin": "system-health", | ||
"task": { | "task": { | ||
"taskResult": { | "taskResult": { | ||
" | "cpu_percent": 13.6, | ||
"cpu_tempC": 63.3, | |||
"disk_percent": 24.0, | |||
"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, | |||
"confidence": "LOW", | |||
"source": "emmc_actor", | |||
"last_refresh_timestamp_ms": 1782230830898 | |||
}, | |||
"uptime_sec": 9339 | |||
" | |||
" | |||
" | |||
" | |||
" | |||
" | |||
" | |||
" | |||
" | |||
" | |||
} | } | ||
} | } | ||
} | } | ||
</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> | remaining_percent_estimated = 100 - consumed_percent_estimated | ||
remaining_percent_conservative = 100 - consumed_percent_max | |||
</syntaxhighlight>Example for <code>WL03</code>:<syntaxhighlight lang="mathematica"> | |||
current_tier = 3 | |||
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"> | |||
{ | { | ||
" | "current_wear_level": "WL03", | ||
" | "consumed_percent_min": 20, | ||
" | "consumed_percent_max": 30, | ||
"consumed_percent_estimated": 25, | |||
"remaining_percent_estimated": 75, | |||
"remaining_percent_conservative": 70 | |||
} | } | ||
</syntaxhighlight> | </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"> | |||
{ | { | ||
" | "estimated_rul_ms": null, | ||
"estimated_rul_days": null, | |||
"estimated_eol_timestamp_ms": null | |||
" | |||
" | |||
} | } | ||
</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" | ||
! | !Reason | ||
! | !Description | ||
|- | |||
|NO_WEAR_HISTORY | |||
|No valid wear-history entries were received. | |||
|- | |- | ||
| | |ONLY_ONE_HISTORY_ENTRY | ||
| | |Only one wear-level entry exists, so no rate can be calculated. | ||
|- | |- | ||
| | |NON_INCREASING_TIMESTAMPS | ||
| | |Wear-level timestamps are not strictly increasing. | ||
|- | |- | ||
| | |BACKFILLED_HISTORY | ||
| | |Several wear levels have the same timestamp, usually because they were synchronized or recreated at boot. | ||
|- | |- | ||
| | |OBSERVATION_WINDOW_TOO_SHORT | ||
| | |The observed time span is too short to generate a trustworthy RUL estimate. | ||
|} | |||
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 | |||
|- | |- | ||
| | |LOW | ||
| | |Not enough real history exists, history was backfilled, or the observation window is too short. | ||
|- | |- | ||
| | |MEDIUM | ||
| | |Real transitions exist and the observation window is acceptable, but the model is still an estimate. | ||
|- | |- | ||
| | |HIGH | ||
| | |The eMMC has reached or exceeded <code>WL11</code>, or the state is known with high certainty. | ||
| | |} | ||
Recommended behavior: | |||
{| class="wikitable tech-table" | |||
!Condition | |||
!Confidence | |||
!Time-Based RUL | |||
|- | |- | ||
| | |No history | ||
| | |LOW | ||
| | |null | ||
|- | |- | ||
| | |Only one entry | ||
| | |LOW | ||
|null | |||
| | |||
|- | |- | ||
| | |Same timestamp for multiple wear levels | ||
| | |LOW | ||
| | |null | ||
|- | |- | ||
| | |Observation window below 7 days | ||
| | |LOW | ||
| | |null | ||
|- | |- | ||
| | |Valid transitions over acceptable window | ||
| | |MEDIUM | ||
| | |calculated | ||
|- | |- | ||
| | |<code>WL11</code> or higher | ||
|HIGH | |||
|" | |0 | ||
|} | |||
====== 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 | |||
|- | |- | ||
| | |Percentage-based RUL | ||
| | |Reliable immediately | ||
| | |Based directly on the current wear-level tier. | ||
|- | |- | ||
| | |Time-based RUL | ||
|Requires history | |||
| | |Based on real wear-level transitions over time. | ||
| | |} | ||
|- | The SystemHealthActor should always expose the percentage-based RUL when a valid wear level exists. | ||
The time-based RUL should only be exposed when the history is reliable enough to avoid misleading estimates. | |||
===== 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....). | |||
[[File:Peripherals health.svg|center|frameless|792x792px]] | |||
''' | ====== a) Example ====== | ||
'''For busi2c-0:''' | |||
Reply topic: <code>systemHealth/busi2c-0/runtime/out</code> | |||
Payload:<syntaxhighlight lang="json" line="1"> | |||
{ | { | ||
"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: <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": " | "action": "LIST_USB_DEVICES" | ||
} | |||
} | |||
</syntaxhighlight>'''Reply-topic:''' <code>systemHealth/runtime/usb/devices/out</code><syntaxhighlight lang="json" line="1"> | |||
{ | |||
"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 <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": " | "interface": "wlan0", | ||
"available": true, | "available": true, | ||
"status": "down", | "status": "down", | ||
"operstate": "down", | "operstate": "down", | ||
"admin_up": | "admin_up": true, | ||
"carrier": | "carrier": false, | ||
"mtu": 1500, | "mtu": 1500, | ||
"type": | "type": 1, | ||
"link_kind": null, | "link_kind": null, | ||
"mac_address": | "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 | |||
} | |||
} | } | ||
] | ] | ||
}, | }, | ||
" | "lte_modem": { | ||
"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 | |||
} | |||
], | |||
"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 | |string | ||
| | |Origin of the message. In the response, this is normallythe SystemHealth actor name. | ||
|- | |- | ||
| | |task.action | ||
|string | |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 | |boolean | ||
|Indicates whether | |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 | |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. | ||
|- | |- | ||
|wifi.interfaces | |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 | |List of detected Wi-Fi interfaces, usually including '''wlan0''' when Wi-Fi exists. | ||
|- | |- | ||
|wifi.interfaces[ ]. | |wifi.interfaces[ ].interface | ||
|string | |string | ||
| | |Linux interface name, for example '''wlan0'''. | ||
|- | |- | ||
|wifi.interfaces[ ]. | |wifi.interfaces[ ].available | ||
| | |boolean | ||
| | |Indicates whether the Wi-Fi interface exists in the system. | ||
|- | |- | ||
|wifi.interfaces[ ]. | |wifi.interfaces[ ].status | ||
|string | |string | ||
| | |Normalized interface status, for example '''connected, down, unavailable, no_carrier,''' or '''not_available'''. | ||
|- | |- | ||
|wifi.interfaces[ ]. | |wifi.interfaces[ ].operstate | ||
|string / null | |string / null | ||
| | |Operational state reported by Linux, for example '''up, down,''' or '''unknown'''. | ||
|- | |- | ||
|wifi.interfaces[ ]. | |wifi.interfaces[ ].admin_up | ||
|boolean | |boolean / null | ||
|Indicates whether | |Indicates whether the interface is administratively enabled. | ||
|- | |- | ||
|wifi.interfaces[ ]. | |wifi.interfaces[ ].carrier | ||
|boolean / null | |boolean / null | ||
|Indicates whether | |Indicates whether carrier/link is detected. | ||
|- | |- | ||
|wifi.interfaces[ ]. | |wifi.interfaces[ ].mtu | ||
| | |number / null | ||
| | |Maximum Transmission Unit of the interface. | ||
|- | |- | ||
|wifi.interfaces[ ]. | |wifi.interfaces[ ].type | ||
| | |number / null | ||
| | |Linux interface type. | ||
|- | |- | ||
|wifi.interfaces[ ]. | |wifi.interfaces[ ].link_kind | ||
| | |string / null | ||
|Wi-Fi | |Special link type, used mainly for virtual/tunnel interfaces. Usually null for normal Wi-Fi. | ||
|- | |- | ||
|wifi.interfaces[ ].wifi. | |wifi.interfaces[ ].mac_address | ||
| | |string / null | ||
|Wi-Fi | |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.interfaces[ ].network_manager.device | ||
|string | |string | ||
| | |NetworkManager device name. | ||
|- | |- | ||
|wifi.interfaces[ ]. | |wifi.interfaces[ ].network_manager.type | ||
|string | |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 | |boolean | ||
|Indicates whether ''' | |Indicates whether Wi-Fi details could be queried using '''iw'''. | ||
|- | |- | ||
| | |wifi.interfaces[ ].wifi.command | ||
|string | |string | ||
|Command used to | |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 | |string | ||
| | |SSID of the connected Wi-Fi network, when connected. | ||
|- | |- | ||
| | |wifi.interfaces[ ].wifi.bssid | ||
|string | |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 | |string | ||
| | |Wi-Fi transmit bitrate, when available. | ||
|- | |- | ||
| | |wifi.interfaces[ ].wifi.rx_bitrate | ||
|string | |string | ||
| | |Wi-Fi receive bitrate, when available. | ||
|- | |- | ||
|lte_modem. | |task.taskResult.connectivity.interfaces.lte_modem.available | ||
| | |boolean | ||
| | |Indicates whether at least one LTE modem was detected. | ||
|- | |- | ||
|lte_modem. | |task.taskResult.connectivity.interfaces.lte_modem.tool_available | ||
| | |boolean | ||
| | |Indicates whether '''mmcli''' / ModemManager is available. | ||
|- | |- | ||
|lte_modem. | |task.taskResult.connectivity.interfaces.lte_modem.command | ||
|string | |string | ||
| | |Command used to list LTE modems, usually '''mmcli -L'''. | ||
|- | |- | ||
| | |task.taskResult.connectivity.interfaces.lte_modem.modems[ ] | ||
|array | |array | ||
|List of | |List of LTE modems detected by ModemManager. | ||
|- | |- | ||
|lte_modem.modems[ ]. | |lte_modem.modems[ ].id | ||
|string | |string | ||
| | |Modem ID in ModemManager, for example '''0'''. | ||
|- | |- | ||
|lte_modem.modems[ ]. | |lte_modem.modems[ ].success | ||
|string | |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[ ]. | |lte_modem.modems[ ].manufacturer | ||
|string / null | |string / null | ||
| | |Modem manufacturer. | ||
|- | |- | ||
|lte_modem.modems[ ]. | |lte_modem.modems[ ].model | ||
|string / null | |string / null | ||
|Modem | |Modem model. | ||
|- | |- | ||
|lte_modem.modems[ ]. | |lte_modem.modems[ ].revision | ||
| | |string / null | ||
| | |Modem firmware/software revision. | ||
|- | |- | ||
|lte_modem.modems[ ]. | |lte_modem.modems[ ].hardware_revision | ||
|string / null | |string / null | ||
| | |Modem hardware revision. | ||
|- | |- | ||
|lte_modem.modems[ ]. | |lte_modem.modems[ ].device | ||
|string | |string / null | ||
| | |Sysfs/USB path of the modem device. | ||
|- | |- | ||
|lte_modem.modems[ ]. | |lte_modem.modems[ ].drivers[ ] | ||
|array | |array | ||
| | |Linux drivers associated with the modem, for example '''qmi_wwan''' or '''option'''. | ||
|- | |- | ||
|lte_modem.modems[ ]. | |lte_modem.modems[ ].plugin | ||
| | |string / null | ||
| | |ModemManager plugin used to manage the modem. | ||
|- | |- | ||
|lte_modem.modems[ ]. | |lte_modem.modems[ ].primary_port | ||
|string / null | |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[ ]. | |lte_modem.modems[ ].ports[ ].name | ||
|string | |string | ||
| | |Port/interface name, for example '''cdc-wdm0''', '''ttyUSB2''', or '''wwan0'''. | ||
|- | |- | ||
|lte_modem.modems[ ]. | |lte_modem.modems[ ].ports[ ].type | ||
|string / null | |string / null | ||
| | |Port type, for example '''qmi, at, gps, audio, net''', or '''ignored'''. | ||
|- | |- | ||
|lte_modem.modems[ ]. | |lte_modem.modems[ ].state | ||
|string / null | |string / null | ||
| | |General modem state according to ModemManager,for example '''registered''', '''connected''', or '''failed'''. | ||
|- | |- | ||
|lte_modem.modems[ ]. | |lte_modem.modems[ ].power_state | ||
|string / null | |string / null | ||
| | |Modem power state, for example '''on, off''', or '''low'''. | ||
|- | |- | ||
| | |lte_modem.modems[ ].access_technologies[ ] | ||
|array | |array | ||
| | |Current access technologies in use, for example LTE,UMTS, or GSM. | ||
|- | |- | ||
|lte_modem. | |lte_modem.modems[ ].signal_quality.recent | ||
|string | |string / null | ||
| | |Indicates whether the signal quality value is recent. | ||
|- | |- | ||
|lte_modem. | |lte_modem.modems[ ].signal_quality.value | ||
| | |string / number / null | ||
| | |Signal quality value reported by the modem. | ||
|- | |- | ||
|lte_modem. | |lte_modem.modems[ ].current_capabilities[ ] | ||
| | |array | ||
| | |Current modem capabilities. | ||
|- | |- | ||
|lte_modem. | |lte_modem.modems[ ].supported_capabilities[ ] | ||
|array | |||
|Capabilities supported by the modem. | |||
|- | |||
|lte_modem.modems[ ].operator_code | |||
|string / null | |string / null | ||
| | |MCC/MNC operator code. | ||
|- | |- | ||
|lte_modem. | |lte_modem.modems[ ].operator_name | ||
| | |string / null | ||
| | |Operator name. | ||
|- | |- | ||
|lte_modem. | |lte_modem.modems[ ].registration_state | ||
| | |string / null | ||
| | |Mobile network registration state. | ||
|- | |- | ||
|lte_modem. | |lte_modem.modems[ ].packet_service_state | ||
| | |string / null | ||
| | |Mobile packet data service state. | ||
|- | |- | ||
|lte_modem. | |lte_modem.modems[ ].sim_path | ||
| | |string / null | ||
| | |SIM path in ModemManager, when available. | ||
|- | |- | ||
| | |task.taskResult.connectivity.interfaces.lte_modem.network_interfaces[] | ||
|array | |array | ||
| | |List of Linux network interfaces associated with the LTE modem, usually '''wwan0'''. | ||
|- | |- | ||
|lte_modem.network_interfaces[ ]. | |lte_modem.network_interfaces[ ].interface | ||
| | |string | ||
| | |LTE network interface name, for example '''wwan0'''. | ||
|- | |- | ||
|lte_modem.network_interfaces[ ]. | |lte_modem.network_interfaces[ ].available | ||
| | |boolean | ||
| | |Indicates whether the LTE network interface exists. | ||
|- | |- | ||
| | |lte_modem.network_interfaces[ ].status | ||
|string | |string | ||
| | |Normalized LTE network interface status. | ||
|- | |- | ||
| | |lte_modem.network_interfaces[ ].operstate | ||
|string / null | |string / null | ||
|Operational state | |Operational state reported by Linux. | ||
|- | |- | ||
| | |lte_modem.network_interfaces[ ].admin_up | ||
|boolean / null | |boolean / null | ||
|Indicates whether | |Indicates whether the LTE network interface is administratively enabled. | ||
|- | |- | ||
| | |lte_modem.network_interfaces[ ].carrier | ||
|boolean / null | |boolean / null | ||
|Indicates whether | |Indicates whether carrier/link information is availableand active. | ||
|- | |- | ||
| | |lte_modem.network_interfaces[ ].mtu | ||
|number / null | |number / null | ||
| | |Maximum Transmission Unit of the LTE network interface. | ||
|- | |- | ||
| | |lte_modem.network_interfaces[ ].type | ||
|number / null | |number / null | ||
|Linux interface type | |Linux interface type. | ||
|- | |- | ||
| | |lte_modem.network_interfaces[ ].link_kind | ||
|string / null | |string / null | ||
|Link kind | |Link kind, when available. | ||
|- | |- | ||
| | |lte_modem.network_interfaces[ ].mac_address | ||
|string / null | |string / null | ||
|MAC address | |MAC address, when available. | ||
|- | |- | ||
| | |lte_modem.network_interfaces[ ].ipv4[ ] | ||
|array | |array | ||
|IPv4 addresses configured on | |IPv4 addresses configured on the LTE network interface. | ||
|- | |- | ||
| | |lte_modem.network_interfaces[ ].ipv6[ ] | ||
|array | |array | ||
|IPv6 addresses configured on | |IPv6 addresses configured on the LTE network interface. | ||
|- | |- | ||
| | |lte_modem.network_interfaces[ ].network_manager | ||
|object / null | |object / null | ||
|NetworkManager information for | |NetworkManager information for the LTE interface, when available. | ||
|- | |- | ||
|task.taskResult.connectivity.interfaces. | |task.taskResult.connectivity.interfaces.eth0.interface | ||
|string | |string | ||
|Ethernet interface name, ''' | |Ethernet interface name, '''eth0'''. | ||
|- | |- | ||
|task.taskResult.connectivity.interfaces. | |task.taskResult.connectivity.interfaces.eth0.available | ||
|boolean | |boolean | ||
|Indicates whether ''' | |Indicates whether '''eth0''' exists. | ||
|- | |- | ||
|task.taskResult.connectivity.interfaces. | |task.taskResult.connectivity.interfaces.eth0.status | ||
|string | |string | ||
|Normalized ''' | |Normalized '''eth0''' status. | ||
|- | |- | ||
|task.taskResult.connectivity.interfaces. | |task.taskResult.connectivity.interfaces.eth0.operstate | ||
|string / null | |string / null | ||
|Operational state of ''' | |Operational state of '''eth0'''. | ||
|- | |- | ||
|task.taskResult.connectivity.interfaces. | |task.taskResult.connectivity.interfaces.eth0.admin_up | ||
|boolean / null | |boolean / null | ||
|Indicates whether ''' | |Indicates whether '''eth0''' is administratively enabled. | ||
|- | |- | ||
|task.taskResult.connectivity.interfaces. | |task.taskResult.connectivity.interfaces.eth0.carrier | ||
|boolean / null | |boolean / null | ||
|Indicates whether ''' | |Indicates whether '''eth0''' has physical link. | ||
|- | |- | ||
|task.taskResult.connectivity.interfaces. | |task.taskResult.connectivity.interfaces.eth0.mtu | ||
|number / null | |number / null | ||
|MTU of ''' | |MTU of '''eth0'''. | ||
|- | |- | ||
|task.taskResult.connectivity.interfaces. | |task.taskResult.connectivity.interfaces.eth0.type | ||
|number / null | |number / null | ||
|Linux interface type of ''' | |Linux interface type of '''eth0'''. | ||
|- | |- | ||
|task.taskResult.connectivity.interfaces. | |task.taskResult.connectivity.interfaces.eth0.link_kind | ||
|string / null | |string / null | ||
|Link kind of ''' | |Link kind of '''eth0''', usually '''null'''. | ||
|- | |- | ||
|task.taskResult.connectivity.interfaces. | |task.taskResult.connectivity.interfaces.eth0.mac_address | ||
|string / null | |string / null | ||
|MAC address of ''' | |MAC address of '''eth0'''. | ||
|- | |- | ||
|task.taskResult.connectivity.interfaces. | |task.taskResult.connectivity.interfaces.eth0.ipv4[ ] | ||
|array | |array | ||
|IPv4 addresses configured on ''' | |IPv4 addresses configured on '''eth0'''. | ||
|- | |- | ||
|task.taskResult.connectivity.interfaces. | |task.taskResult.connectivity.interfaces.eth0.ipv6[ ] | ||
|array | |array | ||
|IPv6 addresses configured on ''' | |IPv6 addresses configured on '''eth0'''. | ||
|- | |- | ||
|task.taskResult.connectivity.interfaces. | |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. | |task.taskResult.connectivity.interfaces.eth1.available | ||
|boolean | |boolean | ||
|Indicates whether | |Indicates whether '''eth1''' exists. | ||
|- | |- | ||
|task.taskResult.connectivity.interfaces. | |task.taskResult.connectivity.interfaces.eth1.status | ||
|string | |string | ||
| | |Normalized '''eth1''' status. | ||
|- | |- | ||
| | |task.taskResult.connectivity.interfaces.eth1.operstate | ||
|string / null | |string / null | ||
|Operational state | |Operational state of '''eth1'''. | ||
|- | |- | ||
| | |task.taskResult.connectivity.interfaces.eth1.admin_up | ||
|boolean / null | |boolean / null | ||
|Indicates whether | |Indicates whether '''eth1''' is administratively enabled. | ||
|- | |- | ||
| | |task.taskResult.connectivity.interfaces.eth1.carrier | ||
|boolean / null | |boolean / null | ||
| | |Indicates whether '''eth1''' has physical link. | ||
|- | |- | ||
| | |task.taskResult.connectivity.interfaces.eth1.mtu | ||
|number / null | |number / null | ||
| | |MTU of '''eth1'''. | ||
|- | |- | ||
| | |task.taskResult.connectivity.interfaces.eth1.type | ||
|number / null | |number / null | ||
|Linux interface type. | |Linux interface type of '''eth1'''. | ||
|- | |- | ||
| | |task.taskResult.connectivity.interfaces.eth1.link_kind | ||
|string / null | |string / null | ||
| | |Link kind of '''eth1''', usually '''null'''. | ||
|- | |- | ||
| | |task.taskResult.connectivity.interfaces.eth1.mac_address | ||
|string / null | |string / null | ||
|MAC address | |MAC address of '''eth1'''. | ||
|- | |- | ||
| | |task.taskResult.connectivity.interfaces.eth1.ipv4[ ] | ||
|array | |array | ||
|IPv4 addresses configured on | |IPv4 addresses configured on '''eth1'''. | ||
|- | |- | ||
| | |task.taskResult.connectivity.interfaces.eth1.ipv6[ ] | ||
|array | |array | ||
|IPv6 addresses configured on | |IPv6 addresses configured on '''eth1'''. | ||
|- | |- | ||
| | |task.taskResult.connectivity.interfaces.eth1.network_manager | ||
|object / null | |object / null | ||
|NetworkManager information for | |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 | |string | ||
| | |Tunnel interface name. | ||
|- | |- | ||
| | |tunnel.interfaces[ ].available | ||
|boolean | |boolean | ||
|Indicates whether the | |Indicates whether the tunnel interface exists. | ||
|- | |- | ||
| | |tunnel.interfaces[ ].status | ||
|string | |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 | |boolean / null | ||
| | |Carrier/link information, when available. | ||
| | |- | ||
|tunnel.interfaces[ ].mtu | |||
|number / null | |||
|Tunnel interface MTU. | |||
|- | |||
|tunnel.interfaces[ ].type | |||
|number / null | |||
|Linux interface type. | |||
|- | |||
|tunnel.interfaces[ ].link_kind | |||
|string / null | |||
|Tunnel link kind, for example '''tun, tap''', or '''wireguard'''. | |||
|- | |||
|tunnel.interfaces[ ].mac_address | |||
|string / null | |||
|MAC address, when available. | |||
|- | |- | ||
| | |tunnel.interfaces[ ].ipv4[ ] | ||
| | |array | ||
|IPv4 addresses configured on the tunnel interface. | |||
|- | |- | ||
| | |tunnel.interfaces[ ].ipv6[ ] | ||
| | |array | ||
|IPv6 addresses configured on the tunnel interface. | |||
|- | |- | ||
| | |tunnel.interfaces[ ].network_manager | ||
| | |object / null | ||
|NetworkManager information for the tunnel interface, when available. | |||
|- | |- | ||
| | |ipv4[ ].address | ||
| | |string | ||
|IPv4 address assigned to the interface. | |||
|- | |- | ||
| | |ipv4[ ].prefixlen | ||
| | |number | ||
|IPv4 network prefix length. Example: '''24'''. | |||
|- | |- | ||
| | |ipv4[ ].scope | ||
| | |string | ||
|IPv4 scope, for example '''global'''. | |||
|- | |- | ||
| | |ipv4[ ].dynamic | ||
| | |boolean | ||
|Indicates whether the IPv4 address was dynamically assigned. | |||
|- | |- | ||
|''' | |ipv6[ ].address | ||
|string | |||
|IPv6 address assigned to the interface. | |||
|- | |||
|ipv6[ ].prefixlen | |||
|number | |||
|IPv6 network prefix length. | |||
|- | |||
|ipv6[ ].scope | |||
|string | |||
|IPv6 scope, for example '''link''' or '''global'''. | |||
|- | |||
|ipv6[].dynamic | |||
|boolean | |||
|Indicates whether the IPv6 address was dynamically assigned. | |||
|} | |} | ||
====== c) Get hardware info ====== | |||
'''Req-topic:''' <code>systemHealth/runtime/in</code><syntaxhighlight lang="json" line="1"> | |||
{ | { | ||
" | "id": <TIMESTAMP>, | ||
" | "origin": "Dev", | ||
"task": { | |||
"action": "GET_HW_INFO" | |||
" | |||
} | } | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight>'''Reply-topic:''' <code>systemHealth/runtime/hw/info/out</code><syntaxhighlight lang="json" line="1"> | ||
{| class="wikitable tech-table" | { | ||
"id": <TIMESTAMP>, | |||
"origin": "system-health", | |||
"task": { | |||
"action": "get_hw_info", | |||
"taskResult": { | |||
"cpu": {......}, | |||
"ram": {......}, | |||
"emmc": {......}, | |||
"block_devices": {......}, | |||
"filesystems": {......}, | |||
"mmc_sysfs": {......}, | |||
"emmc_extcsd": {......} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
{| class="wikitable tech-table" | |||
|- | |- | ||
| | |'''Section''' | ||
| | |'''Description''' | ||
|- | |- | ||
| | |'''cpu''' | ||
|CPU and board model information. | |||
|- | |- | ||
| | |'''ram''' | ||
| | |RAM total, used, and free memory. | ||
|- | |- | ||
| | |'''emmc''' | ||
| | |Filtered eMMC device and partition information. | ||
|- | |- | ||
| | |'''block_devices''' | ||
| | |Complete block device list from '''lsblk''', including eMMC, boot partitions, loop devices, zram, NVMe, USB storage, etc. | ||
|- | |- | ||
| | |'''filesystems''' | ||
| | |Mounted filesystem usage from '''df -h'''. | ||
|- | |- | ||
| | |'''mmc_sysfs''' | ||
| | |Low-level MMC/eMMC identity fields read from '''/sys/block/mmcblk*/device'''. | ||
|- | |- | ||
| | |'''emmc_extcsd''' | ||
| | |Parsed eMMC EXT_CSD information from '''mmc extcsd read''', including health, revision, RPMB, boot, and partitioning data. | ||
|} | |||
|- | |||
| | * '''CPU''' | ||
| | |||
| | The '''cpu''' object describes the detected board and CPU.<syntaxhighlight lang="json" line="1"> | ||
{ | |||
"board_model": "Raspberry Pi Compute Module 4 Rev 1.1", | |||
"cpu": { | |||
"architecture": "aarch64", | |||
"op_modes": "32-bit, 64-bit", | |||
"byte_order": "Little Endian", | |||
"vendor": "ARM", | |||
"model_name": "Cortex-A72", | |||
"model": "3", | |||
"stepping": "r0p3", | |||
"cpu_count": 4, | |||
"online_cpus": "0-3", | |||
"threads_per_core": 1, | |||
"cores_per_cluster": 4, | |||
"clusters": 1, | |||
"frequency": { | |||
"scaling_percent": 60.0, | |||
"min_mhz": 600.0, | |||
"max_mhz": 1500.0, | |||
"bogomips": 108.0 | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
{| class="wikitable tech-table" | |||
!'''Field''' | |||
!'''Type''' | |||
!'''Description''' | |||
|- | |||
|board_model | |||
|string / null | |||
|Hardware board model read from device-tree. | |||
|- | |- | ||
|cpu. | |cpu.architecture | ||
|string | |string | ||
| | |CPU architecture, for example '''aarch64'''. | ||
|- | |- | ||
|cpu. | |cpu.op_modes | ||
| | |string | ||
| | |Supported CPU operation modes. | ||
|- | |- | ||
|cpu. | |cpu.byte_order | ||
| | |string | ||
| | |CPU byte order. | ||
|- | |- | ||
|cpu. | |cpu.vendor | ||
| | |string | ||
| | |CPU vendor. | ||
|- | |- | ||
|cpu. | |cpu.model_name | ||
| | |string | ||
| | |CPU model name. | ||
|- | |- | ||
|cpu. | |cpu.model | ||
|number | |string / number | ||
| | |CPU model identifier. | ||
|- | |- | ||
|cpu. | |cpu.stepping | ||
| | |string | ||
| | |CPU stepping/revision. | ||
|- | |- | ||
|cpu. | |cpu.cpu_count | ||
|number | |number | ||
| | |Number of detected CPU cores. | ||
|- | |- | ||
| | |cpu.online_cpus | ||
|string | |string | ||
| | |Online CPU list. | ||
|- | |- | ||
| | |cpu.threads_per_core | ||
| | |number | ||
| | |Number of threads per core. | ||
|- | |- | ||
| | |cpu.cores_per_cluster | ||
| | |number | ||
| | |Number of cores per cluster. | ||
|- | |||
|cpu.clusters | |||
|number | |||
|Number of CPU clusters. | |||
|- | |||
|cpu.frequency.scaling_percent | |||
|number / null | |||
|Current CPU frequency scaling percentage. | |||
|- | |||
|cpu.frequency.min_mhz | |||
|number / null | |||
|Minimum CPU frequency in MHz. | |||
|- | |||
|cpu.frequency.max_mhz | |||
|number / null | |||
|Maximum CPU frequency in MHz. | |||
|- | |||
|cpu.frequency.bogomips | |||
|number / null | |||
|BogoMIPS value reported by the system. | |||
|} | |} | ||
* ''' | * '''RAM''' | ||
The ''' | 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 | 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 | 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 | |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 | |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 | ||
| | |<code>true</code> if the parser successfully parsed this filesystem entry. | ||
|} | |} | ||
====== f) mmc_sysfs ====== | ====== f) mmc_sysfs ====== | ||
The | The <code>mmc_sysfs</code> object exposes low-level MMC/eMMC identity fields read from:<syntaxhighlight> | ||
/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 | The <code>emmc_extcsd</code> object contains parsed information from:<syntaxhighlight> | ||
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"> | ||
''' | { | ||
"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 | ||
|- | |- | ||
|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 | '''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 | ||
! | !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''' | ||