This commit is contained in:
sebseb7
2025-12-20 12:39:58 +01:00
parent 4ddbca1246
commit c90477aa52
2 changed files with 106 additions and 45 deletions

View File

@@ -31,6 +31,7 @@ API_URL="${API_URL:-https://dev.seedheads.de/picUploadApi/upload}"
CAMERA_ID="${CAMERA_ID:-rpi-webcam}" CAMERA_ID="${CAMERA_ID:-rpi-webcam}"
VIDEO_DEVICE="${VIDEO_DEVICE:-/dev/video0}" VIDEO_DEVICE="${VIDEO_DEVICE:-/dev/video0}"
RESOLUTION="${RESOLUTION:-1920x1080}" RESOLUTION="${RESOLUTION:-1920x1080}"
CAPTURE_METHOD="${CAPTURE_METHOD:-fswebcam}"
SKIP_FRAMES="${SKIP_FRAMES:-5}" SKIP_FRAMES="${SKIP_FRAMES:-5}"
TEMP_DIR="${TEMP_DIR:-/tmp}" TEMP_DIR="${TEMP_DIR:-/tmp}"
LOG_FILE="${LOG_FILE:-${SCRIPT_DIR}/picupper.log}" LOG_FILE="${LOG_FILE:-${SCRIPT_DIR}/picupper.log}"
@@ -71,9 +72,11 @@ if [[ "${1:-}" == "--test" ]]; then
echo "Camera ID: $CAMERA_ID" echo "Camera ID: $CAMERA_ID"
echo "Video device: $VIDEO_DEVICE" echo "Video device: $VIDEO_DEVICE"
echo "Resolution: $RESOLUTION" echo "Resolution: $RESOLUTION"
echo "Capture Method: $CAPTURE_METHOD"
echo "" echo ""
# Check video device # Check video device (only if using fswebcam or if device is specified for rpicam)
if [[ "$CAPTURE_METHOD" == "fswebcam" ]]; then
if [[ ! -e "$VIDEO_DEVICE" ]]; then if [[ ! -e "$VIDEO_DEVICE" ]]; then
echo "❌ Video device not found: $VIDEO_DEVICE" echo "❌ Video device not found: $VIDEO_DEVICE"
echo " Available devices:" echo " Available devices:"
@@ -88,6 +91,22 @@ if [[ "${1:-}" == "--test" ]]; then
exit 1 exit 1
fi fi
echo "✓ fswebcam installed" echo "✓ fswebcam installed"
elif [[ "$CAPTURE_METHOD" == "rpicam-still" ]] || [[ "$CAPTURE_METHOD" == "libcamera-still" ]]; then
# Check rpicam-still/libcamera-still
CMD_NAME="rpicam-still"
if ! command -v rpicam-still &>/dev/null; then
if command -v libcamera-still &>/dev/null; then
CMD_NAME="libcamera-still"
else
echo "❌ rpicam-still (or libcamera-still) not installed."
exit 1
fi
fi
echo "$CMD_NAME installed"
else
echo "❌ Unknown CAPTURE_METHOD: $CAPTURE_METHOD"
exit 1
fi
# Try capture # Try capture
# Get System Info for Overlay # Get System Info for Overlay
@@ -96,6 +115,23 @@ if [[ "${1:-}" == "--test" ]]; then
echo "Capturing test image to: $TEST_FILE" echo "Capturing test image to: $TEST_FILE"
if [[ "$CAPTURE_METHOD" == "rpicam-still" ]] || [[ "$CAPTURE_METHOD" == "libcamera-still" ]]; then
# Parse resolution
WIDTH=$(echo "$RESOLUTION" | cut -d'x' -f1)
HEIGHT=$(echo "$RESOLUTION" | cut -d'x' -f2)
CMD="rpicam-still"
command -v libcamera-still &>/dev/null && CMD="libcamera-still"
if $CMD -o "$TEST_FILE" --width "$WIDTH" --height "$HEIGHT" --nopreview --timeout 2000; then
FILE_SIZE=$(stat -f%z "$TEST_FILE" 2>/dev/null || stat -c%s "$TEST_FILE" 2>/dev/null)
echo "✓ Capture successful: $TEST_FILE (${FILE_SIZE} bytes)"
else
echo "❌ Capture failed."
exit 1
fi
else
# fswebcam default
if fswebcam -d "$VIDEO_DEVICE" -r "$RESOLUTION" -S "$SKIP_FRAMES" \ if fswebcam -d "$VIDEO_DEVICE" -r "$RESOLUTION" -S "$SKIP_FRAMES" \
--title "$CAMERA_ID" \ --title "$CAMERA_ID" \
--subtitle "$SYSTEM_IP" \ --subtitle "$SYSTEM_IP" \
@@ -113,6 +149,7 @@ if [[ "${1:-}" == "--test" ]]; then
echo "❌ Capture failed. Check webcam connection and permissions." echo "❌ Capture failed. Check webcam connection and permissions."
exit 1 exit 1
fi fi
fi
exit 0 exit 0
fi fi
@@ -123,11 +160,13 @@ fi
TEMP_FILE="${TEMP_DIR}/picupper_${CAMERA_ID}_$(date +%s).jpg" TEMP_FILE="${TEMP_DIR}/picupper_${CAMERA_ID}_$(date +%s).jpg"
# Check video device # Check video device (only for fswebcam)
if [[ "$CAPTURE_METHOD" == "fswebcam" ]]; then
if [[ ! -e "$VIDEO_DEVICE" ]]; then if [[ ! -e "$VIDEO_DEVICE" ]]; then
log_error "Video device not found: $VIDEO_DEVICE" log_error "Video device not found: $VIDEO_DEVICE"
exit 1 exit 1
fi fi
fi
# Fetch and apply camera settings from server # Fetch and apply camera settings from server
apply_camera_settings() { apply_camera_settings() {
@@ -245,17 +284,35 @@ upload_current_settings() {
fi fi
} }
# Only handle settings upload/apply for fswebcam/v4l2 for now
if [[ "$CAPTURE_METHOD" == "fswebcam" ]]; then
apply_camera_settings apply_camera_settings
fi
# Capture image # Capture image
log "Capturing from $VIDEO_DEVICE ($RESOLUTION)" log "Capturing using $CAPTURE_METHOD ($RESOLUTION)"
# Get System Info for Overlay # Get System Info for Overlay
SYSTEM_HOSTNAME=$(hostname) SYSTEM_HOSTNAME=$(hostname)
# Get first non-loopback IP # Get first non-loopback IP
SYSTEM_IP=$(hostname -I 2>/dev/null | awk '{print $1}') || SYSTEM_IP="unknown" SYSTEM_IP=$(hostname -I 2>/dev/null | awk '{print $1}') || SYSTEM_IP="unknown"
if [[ "$CAPTURE_METHOD" == "rpicam-still" ]] || [[ "$CAPTURE_METHOD" == "libcamera-still" ]]; then
WIDTH=$(echo "$RESOLUTION" | cut -d'x' -f1)
HEIGHT=$(echo "$RESOLUTION" | cut -d'x' -f2)
CMD="rpicam-still"
command -v libcamera-still &>/dev/null && CMD="libcamera-still"
# Note: Text overlay on rpicam-still is not as straightforward as fswebcam (requires --post-process-file or similar),
# so we are skipping overlay for now to keep it simple, or we could use imagemagick later if requested.
if ! $CMD -o "$TEMP_FILE" --width "$WIDTH" --height "$HEIGHT" --nopreview --timeout 2000 >/dev/null 2>&1; then
log_error "Capture failed with $CMD"
exit 1
fi
else
# fswebcam logic
if ! fswebcam -d "$VIDEO_DEVICE" -r "$RESOLUTION" -S "$SKIP_FRAMES" \ if ! fswebcam -d "$VIDEO_DEVICE" -r "$RESOLUTION" -S "$SKIP_FRAMES" \
--title "$CAMERA_ID" \ --title "$CAMERA_ID" \
--subtitle "$SYSTEM_IP" \ --subtitle "$SYSTEM_IP" \
@@ -268,6 +325,7 @@ if ! fswebcam -d "$VIDEO_DEVICE" -r "$RESOLUTION" -S "$SKIP_FRAMES" \
log_error "Capture failed" log_error "Capture failed"
exit 1 exit 1
fi fi
fi
FILE_SIZE=$(stat -c%s "$TEMP_FILE" 2>/dev/null || echo "unknown") FILE_SIZE=$(stat -c%s "$TEMP_FILE" 2>/dev/null || echo "unknown")
log "Captured: $TEMP_FILE ($FILE_SIZE bytes)" log "Captured: $TEMP_FILE ($FILE_SIZE bytes)"

View File

@@ -24,6 +24,9 @@ VIDEO_DEVICE="/dev/video0"
# Capture resolution (common options: 1920x1080, 1280x720, 640x480) # Capture resolution (common options: 1920x1080, 1280x720, 640x480)
RESOLUTION="1920x1080" RESOLUTION="1920x1080"
# Capture Method: "fswebcam" (default, for USB webcams) or "rpicam-still" (for Raspberry Pi cameras)
CAPTURE_METHOD="fswebcam"
# Skip first N frames (helps camera adjust exposure, default 5) # Skip first N frames (helps camera adjust exposure, default 5)
SKIP_FRAMES=5 SKIP_FRAMES=5