rm3100/setup.sh

79 lines
2.6 KiB
Bash
Raw Normal View History

2026-08-19 23:00:47 -04:00
#!/usr/bin/env bash
#
# One-time system setup for the CH347 USB-I2C adapter and the RM3100 logger.
# Idempotent: safe to re-run.
#
# Needs sudo for exactly one thing: installing the udev rule that grants the
# plugdev group access to the adapter's USB node.
set -euo pipefail
VID=1a86
PID=55db
RULE_FILE=/etc/udev/rules.d/99-ch347.rules
RULE='SUBSYSTEM=="usb", ATTRS{idVendor}=="'"$VID"'", ATTRS{idProduct}=="'"$PID"'", GROUP="plugdev", MODE="0660"'
cd "$(dirname "$0")"
echo "== 1. Checking for the CH347 adapter =="
if ! lsusb -d "$VID:$PID" >/dev/null 2>&1; then
echo "ERROR: no device $VID:$PID found on the USB bus." >&2
echo " Plug in the Waveshare adapter and make sure it is in Mode 1" >&2
echo " (UART1+I2C+SPI): DTR1 pulled high, RTS1 pulled low." >&2
exit 1
fi
lsusb -d "$VID:$PID"
echo
echo "== 2. Installing udev rule =="
if [[ -f "$RULE_FILE" ]] && [[ "$(cat "$RULE_FILE")" == "$RULE" ]]; then
echo "$RULE_FILE already up to date, skipping."
else
echo "Writing $RULE_FILE (needs sudo)..."
printf '%s\n' "$RULE" | sudo tee "$RULE_FILE" >/dev/null
sudo udevadm control --reload-rules
sudo udevadm trigger --subsystem-match=usb
# udevadm trigger returns before the rule has necessarily been applied.
sudo udevadm settle
echo "Installed."
fi
if ! id -nG | tr ' ' '\n' | grep -qx plugdev; then
echo "WARNING: $(id -un) is not in the 'plugdev' group, so the rule above" >&2
echo " will not grant access. Fix with:" >&2
echo " sudo usermod -aG plugdev $(id -un)" >&2
echo " then log out and back in." >&2
fi
echo
echo "== 3. Creating virtualenv and installing pyusb =="
if [[ ! -d .venv ]]; then
python3 -m venv .venv
echo "Created .venv"
else
echo ".venv already exists"
fi
./.venv/bin/pip install --quiet --upgrade pip
./.venv/bin/pip install --quiet pyusb
echo "pyusb $(./.venv/bin/python -c 'import usb; print(usb.__version__)') installed"
echo
echo "== 4. Verifying device node permissions =="
# Resolve the bus/device path for this specific adapter.
NODE=$(lsusb -d "$VID:$PID" | head -1 |
sed -E 's|Bus ([0-9]+) Device ([0-9]+).*|/dev/bus/usb/\1/\2|')
ls -l "$NODE"
if [[ -w "$NODE" ]]; then
echo "OK: $NODE is writable by $(id -un)."
else
echo "WARNING: $NODE is not writable by $(id -un)." >&2
echo " If the group above is already 'plugdev', unplug and replug" >&2
echo " the adapter so the new rule is applied to a fresh node." >&2
fi
echo
echo "Setup complete. Run the logger with:"
echo " ./.venv/bin/python logger.py --duration 10"
echo "or, to check wiring only:"
echo " ./.venv/bin/python logger.py --scan-only"