SmartestHome/stream-dock/setup-stream-dock.sh

136 lines
5.7 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# The desk-side half: generate this dock's files and put them where OpenDeck and
# systemd will find them. Run it ON THE DESKTOP THE DOCK IS PLUGGED INTO, from a
# checkout of this repo.
#
# stream-dock/setup-stream-dock.sh
#
# What it does:
# 1. runs generate.py against CoreSystemConfig.json
# 2. installs the starting leds.toml for the akp05 device plugin (backing up yours)
# 3. installs led-sync.env (mode 0600 — it holds the HA token) and the systemd
# --user unit for the ring-colour service
# 4. tells you what it could not do for you, which is every step that needs a
# human in front of OpenDeck's own UI
#
# It installs no plugins. Both of them come from third parties as release downloads,
# and a setup script that silently pulls executables off the internet onto a desktop
# is not a trade this project makes — the two links are printed instead. See
# stream-dock/README.md §2.
#
# Options:
# --no-enable install the unit but do not start it
# --config PATH use a different CoreSystemConfig.json
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
DOCK_DIR="${REPO_ROOT}/stream-dock"
# shellcheck source=/dev/null
source "${REPO_ROOT}/tools/lib/coreconfig.sh"
ENABLE=true
while [[ $# -gt 0 ]]; do
case "$1" in
--no-enable) ENABLE=false; shift ;;
--config) CORE_CONFIG_PATH="$2"; shift 2 ;;
*) core_die "unknown option: $1" ;;
esac
done
core_load
[[ "$CORE_STREAM_DOCK_ENABLED" == "true" ]] || core_die \
"stream_dock.enabled is false in $(basename "$CORE_CONFIG_PATH") — nothing to set up"
core_log "Generating this dock's files"
"${DOCK_DIR}/generate.py" "$CORE_CONFIG_PATH"
GEN="${DOCK_DIR}/generated"
# --- the device plugin's LED file --------------------------------------------------
LEDS_PATH="${CORE_STREAM_DOCK_LED_CONFIG_PATH:-}"
LEDS_PATH="${LEDS_PATH:-$HOME/.config/opendeck-akp05/leds.toml}"
LEDS_PATH="${LEDS_PATH/#\~/$HOME}"
core_log "Installing starting knob colours -> ${LEDS_PATH}"
mkdir -p "$(dirname "$LEDS_PATH")"
if [[ -f "$LEDS_PATH" ]] && ! grep -q "Generated by stream-dock" "$LEDS_PATH"; then
cp "$LEDS_PATH" "${LEDS_PATH}.bak-streamdock"
core_warn "kept your existing file as ${LEDS_PATH}.bak-streamdock"
fi
cp "${GEN}/leds.toml" "$LEDS_PATH"
# --- the sync service ---------------------------------------------------------------
if [[ "$CORE_STREAM_DOCK_LED_ENABLED" == "true" ]]; then
core_log "Installing the ring-colour service"
mkdir -p "$HOME/.config/stream-dock" "$HOME/.config/systemd/user"
install -m 600 "${GEN}/led-sync.env" "$HOME/.config/stream-dock/led-sync.env"
install -m 644 "${GEN}/stream-dock-led-sync.service" \
"$HOME/.config/systemd/user/stream-dock-led-sync.service"
# Not fatal if systemd is not answering (a session without a user manager, a
# container, an ssh login without lingering): the files are installed either way and
# the unit can be started by hand later. Aborting here would leave the dock set up
# and the script looking like it failed.
if ! systemctl --user daemon-reload 2>/dev/null; then
core_warn "systemctl --user is not available here — the unit is installed but not loaded"
elif $ENABLE; then
if systemctl --user enable --now stream-dock-led-sync.service; then
echo " started — follow it with: journalctl --user -fu stream-dock-led-sync"
else
core_warn "could not start the unit — try: systemctl --user status stream-dock-led-sync"
fi
else
echo " installed, not started (--no-enable)"
fi
# A user unit dies at logout unless lingering is on. Worth saying, not worth doing
# unasked: enabling lingering is a system-wide change made with sudo, and this is a
# service for a device on a desk somebody is sitting at.
if ! loginctl show-user "$USER" --property=Linger 2>/dev/null | grep -q "Linger=yes"; then
echo " note: this stops at logout. 'sudo loginctl enable-linger $USER' if you"
echo " want it running while logged out."
fi
else
core_warn "stream_dock.knob_leds.enabled is false — skipping the ring-colour service"
fi
# --- what a script cannot do for you -------------------------------------------------
core_log "What is left, and only you can do it"
have_opendeck=false
command -v opendeck >/dev/null 2>&1 && have_opendeck=true
flatpak list 2>/dev/null | grep -qi opendeck && have_opendeck=true
$have_opendeck || cat <<'EOF'
[ ] Install OpenDeck itself:
flatpak install flathub me.amankhanna.opendeck
EOF
cat <<EOF
[ ] Install the device plugin, or the dock will not appear in OpenDeck at all —
an N4 Pro is not an Elgato device and OpenDeck does not speak to it natively:
https://github.com/aroaxinping/opendeck-akp05 (Ajazz AKP05 / Mirabox N4 family)
[ ] Install the Home Assistant plugin (a .streamDeckPlugin release, installed
through OpenDeck's plugin installer):
https://github.com/cgiesche/streamdeck-homeassistant
[ ] Put the lighting controls on their own OpenDeck layer, then teach the gate
how to see it:
${DOCK_DIR}/layer-active.sh --discover
[ ] Find out what makes the knob rings pick up a colour change — two minutes with
the dock plugged in, and its first test is whether they already do:
${DOCK_DIR}/apply-leds.sh --probe
[ ] Bind the dials and keys — every value to paste is in:
${GEN}/bindings.md
[ ] On the Home Assistant side (from any machine that can ssh to the container host):
${DOCK_DIR}/install-ha-package.sh
EOF
if ! lsusb 2>/dev/null | grep -qiE "mirabox|ajazz|stream ?dock"; then
core_warn "no obviously-Mirabox/Ajazz device in lsusb — if OpenDeck cannot see the dock,"
core_warn "that is a udev rule question for the device plugin, not for this repo"
fi