#!/usr/bin/env bash # Test Module: Hardware Detection # Validates Pi model, temperature, throttling, USB, I2C devices set -euo pipefail output_result() { local status=$1 local message=$2 local details=${3:-"{}"} echo "{\"test\": \"hardware\", \"status\": \"$status\", \"message\": \"$message\", \"details\": $details}" } if [[ "${DRY_RUN:-false}" == "true" ]]; then output_result "DRY_RUN" "Would check hardware status" exit 0 fi HOSTNAME=$(hostname) # Detect Pi model PI_MODEL="unknown" PI_RAM="unknown" if [[ -f /proc/cpuinfo ]]; then PI_MODEL=$(grep "Model" /proc/cpuinfo | cut -d':' -f2 | xargs || echo "unknown") fi if [[ -f /proc/meminfo ]]; then PI_RAM=$(grep MemTotal /proc/meminfo | awk '{printf "%.0fMB", $2/1024}') fi # CPU temperature CPU_TEMP="unknown" if [[ -f /sys/class/thermal/thermal_zone0/temp ]]; then CPU_TEMP=$(awk '{printf "%.1f°C", $1/1000}' /sys/class/thermal/thermal_zone0/temp) CPU_TEMP_VALUE=$(awk '{printf "%.0f", $1/1000}' /sys/class/thermal/thermal_zone0/temp) fi # Throttling / undervoltage detection THROTTLE_STATUS="unknown" THROTTLE_HEX="0x0" if command -v vcgencmd &>/dev/null; then THROTTLE_HEX=$(vcgencmd get_throttled | cut -d'=' -f2) if [[ "$THROTTLE_HEX" == "0x0" ]]; then THROTTLE_STATUS="ok" else THROTTLE_STATUS="throttled_or_undervolt" fi fi # USB devices USB_DEVICES=$(lsusb 2>/dev/null | wc -l || echo 0) USB_LIST=$(lsusb 2>/dev/null | tail -n +2 || echo "") # Check for specific known devices PRINTER_DETECTED="false" if [[ "$HOSTNAME" == "aria" ]]; then if echo "$USB_LIST" | grep -iq "printer"; then PRINTER_DETECTED="true" fi fi # I2C devices (OLED displays) I2C_DEVICES=0 I2C_LIST="" if command -v i2cdetect &>/dev/null; then # Check i2c-1 bus (common on Pi) if [[ -e /dev/i2c-1 ]]; then I2C_DEVICES=$(sudo i2cdetect -y 1 2>/dev/null | grep -oE '\b[0-9a-fA-F]{2}\b' | wc -l || echo 0) I2C_LIST=$(sudo i2cdetect -y 1 2>/dev/null | grep -oE '\b[0-9a-fA-F]{2}\b' | tr '\n' ',' || echo "") fi fi # HDMI displays HDMI_STATUS="unknown" HDMI_DISPLAYS=0 if command -v tvservice &>/dev/null; then if tvservice -s 2>/dev/null | grep -q "HDMI"; then HDMI_STATUS="connected" HDMI_DISPLAYS=1 else HDMI_STATUS="disconnected" fi fi DETAILS=$(cat <