Files
anker-shelly-bridge/start.sh
T

143 lines
4.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$HERE"
DATA_DIR="${SOLIXAUTO_HOME:-$HOME/solix-automation}"
VENV_DIR="${SOLIXAUTO_VENV:-$DATA_DIR/venv}"
VENV_PYTHON="$VENV_DIR/bin/python"
REPO_URL="https://github.com/thomluther/anker-solix-api.git"
echo
echo "=============================================================="
echo " Anker SOLIX to Shelly automation"
echo "=============================================================="
echo
works() {
[ -x "$1" ] && "$1" -c "import anker_solix_api.api, yaml, aiohttp" >/dev/null 2>&1
}
if works "$VENV_PYTHON"; then
echo "Using: $VENV_PYTHON"
echo
exec "$VENV_PYTHON" "$HERE/solixauto.py" setup
fi
find_base_python() {
for name in python3.14 python3.13 python3.12 python3; do
if command -v "$name" >/dev/null 2>&1; then
local path version
path="$(command -v "$name")"
version="$("$path" -c 'import sys; print(sys.version_info[0]*100+sys.version_info[1])' 2>/dev/null || echo 0)"
if [ "$version" -ge 312 ]; then
echo "$path"
return 0
fi
fi
done
return 1
}
BASE="$(find_base_python || true)"
if [ -z "${BASE:-}" ]; then
echo "Python 3.12 or newer is required and was not found."
echo
if command -v brew >/dev/null 2>&1; then
echo "Install it with: brew install python@3.13"
elif command -v apt >/dev/null 2>&1; then
echo "Install it with: sudo apt install python3 python3-venv python3-pip git"
elif command -v dnf >/dev/null 2>&1; then
echo "Install it with: sudo dnf install python3 python3-pip git"
else
echo "Install Python 3.12 or newer from https://www.python.org/downloads/"
fi
echo
echo "Then run this script again."
exit 1
fi
if ! command -v git >/dev/null 2>&1; then
echo "Git is required to fetch the Anker library, and was not found."
echo
if [ "$(uname)" = "Darwin" ]; then
echo "Install the Xcode command line tools: xcode-select --install"
else
echo "Install git with your package manager, for example:"
echo " sudo apt install git"
fi
echo
echo "Then run this script again."
exit 1
fi
if [ -d "$VENV_DIR" ]; then
echo "The environment at $VENV_DIR is incomplete."
echo "It will be rebuilt. Nothing else is touched."
else
echo "This project runs in its own Python environment, so that installing or"
echo "removing packages elsewhere on this machine cannot break your"
echo "automation."
echo
echo "It will be created at:"
echo " $VENV_DIR"
fi
echo
echo "Base interpreter: $BASE"
echo
printf "Set it up now? [Y/n]: "
read -r reply
case "${reply:-y}" in
[nN]*) echo "Nothing was changed."; exit 0 ;;
esac
echo
echo "Creating the environment..."
mkdir -p "$DATA_DIR"
rm -rf "$VENV_DIR"
if ! "$BASE" -m venv "$VENV_DIR"; then
echo
echo "Could not create a virtual environment."
if command -v apt >/dev/null 2>&1; then
echo "On Debian and Ubuntu this usually means python3-venv is missing:"
echo " sudo apt install python3-venv"
fi
exit 1
fi
if [ ! -x "$VENV_PYTHON" ]; then
echo "The environment was created but has no interpreter at $VENV_PYTHON"
exit 1
fi
echo "Installing packages. This takes a minute."
echo
"$VENV_PYTHON" -m pip install --upgrade pip --quiet
"$VENV_PYTHON" -m pip install -r "$HERE/requirements.txt" --quiet
"$VENV_PYTHON" -m pip install "git+$REPO_URL" --quiet
# The upstream Anker library does not declare its runtime dependencies, so a
# plain install imports the package but fails on first real use.
"$VENV_PYTHON" -m pip install aiofiles cryptography paho-mqtt --quiet
if ! works "$VENV_PYTHON"; then
echo
echo "The install finished but the Anker library still will not import."
echo "Run this to see the error:"
echo " $VENV_PYTHON -c 'import anker_solix_api.api'"
exit 1
fi
echo
echo "Environment ready."
echo
echo "From now on, run commands with:"
echo " $VENV_PYTHON solixauto.py <command>"
echo
exec "$VENV_PYTHON" "$HERE/solixauto.py" setup