Skip to content

Instantly share code, notes, and snippets.

@raspberrypisig
Last active December 17, 2020 10:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save raspberrypisig/65aea786444dfa1f135ab5f3b2b85bcb to your computer and use it in GitHub Desktop.
Save raspberrypisig/65aea786444dfa1f135ab5f3b2b85bcb to your computer and use it in GitHub Desktop.
UPDATE: HA Supervised Install on Raspberry Pi OS is complicated.
Reason: Hard dependency on NetworkManager
Workaround: Possible, but messy.
Workaround involves:
- Setting Up Network Manager
- Running supervised install.
Setting Up Network Manager
--------------------------
curl -sSL https://bit.ly/3qVBeTm|sudo -E bash -
Then reboot when done and once reboot, connect to network using Network Manager applet (not the raspbian networking applet)
Supervised Install
-------------------
curl -sL https://bit.ly/2ykrpaM | HOMEASSISTANT_INSTALL_LOCATION=/home/pi/homeassistant RASPBERRYPI=raspberrypi4 sudo -E bash -
------------------------------------------
This will install Home Assistant at /home/pi/homeassistant
Possible other values for RASPBERRPYPI are:
raspberrypi
raspberrypi2
raspberrypi4
raspberrypi3-64
raspberrypi4-64
Afterwards, go to http://IP_ADDRESS_PI:8123
Once you have done onboarding(create a user and password),
have a poke around for 10 minutes,
then REBOOT your pi (this is an important step).
DNS issues go away (eg. map is drawn correctly)
#!/usr/bin/env bash
# run this script as root
set -xe
HOMEASSISTANT_INSTALL_LOCATION=${HOMEASSISTANT_INSTALL_LOCATION:-/home/pi/homeassistant}
# Possible values for MACHINE raspberrypi raspberrypi2 raspberrypi3 raspberrypi4 raspberrypi3-64 raspberrypi4-64
RASPBERRYPI=${RASPBERRYPI:-raspberrypi3}
apt update
sudo apt install -y jq apparmor
#Install docker if not installed previously
if [ `which docker` ] ;
then
true
else
set +x
curl -sSL https://get.docker.com | sh
set -x
usermod -aG docker pi
fi
sudo mkdir -p $HOMEASSISTANT_INSTALL_LOCATION
sudo mkdir -p $HOMEASSISTANT_INSTALL_LOCATION/share/hassio/data
sudo mkdir -p $HOMEASSISTANT_INSTALL_LOCATION/{bin,sbin}
curl -sL https://gist.githubusercontent.com/raspberrypisig/65aea786444dfa1f135ab5f3b2b85bcb/raw/installer.sh | sudo bash -E -s -- -m $RASPBERRYPI -d $HOMEASSISTANT_INSTALL_LOCATION/share/hassio -p $HOMEASSISTANT_INSTALL_LOCATION
#ln -s $HOMEASSISTANT_INSTALL_LOCATION/bin/ha /usr/bin/ha
#!/usr/bin/env bash
set -e
declare -a MISSING_PACKAGES
function info { echo -e "\e[32m[info] $*\e[39m"; }
function warn { echo -e "\e[33m[warn] $*\e[39m"; }
function error { echo -e "\e[31m[error] $*\e[39m"; exit 1; }
#warn ""
#warn "If you want more control over your own system, run"
#warn "Home Assistant as a VM or run Home Assistant Core"
#warn "via a Docker container."
#warn ""
#warn "If you want to abort, hit ctrl+c within 10 seconds..."
#warn ""
#sleep 10
ARCH=$(uname -m)
IP_ADDRESS=$(hostname -I | awk '{ print $1 }')
BINARY_DOCKER=/usr/bin/docker
DOCKER_REPO=homeassistant
SERVICE_DOCKER="docker.service"
SERVICE_NM="NetworkManager.service"
FILE_DOCKER_CONF="/etc/docker/daemon.json"
FILE_INTERFACES="/etc/network/interfaces"
FILE_NM_CONF="/etc/NetworkManager/NetworkManager.conf"
FILE_NM_CONNECTION="/etc/NetworkManager/system-connections/default"
URL_RAW_BASE="https://raw.githubusercontent.com/home-assistant/supervised-installer/master/files"
URL_VERSION="https://version.home-assistant.io/stable.json"
URL_BIN_APPARMOR="${URL_RAW_BASE}/hassio-apparmor"
URL_BIN_HASSIO="${URL_RAW_BASE}/hassio-supervisor"
URL_DOCKER_DAEMON="${URL_RAW_BASE}/docker_daemon.json"
URL_HA="${URL_RAW_BASE}/ha"
URL_INTERFACES="${URL_RAW_BASE}/interfaces"
URL_NM_CONF="${URL_RAW_BASE}/NetworkManager.conf"
URL_NM_CONNECTION="${URL_RAW_BASE}/system-connection-default"
URL_SERVICE_APPARMOR="${URL_RAW_BASE}/hassio-apparmor.service"
URL_SERVICE_HASSIO="${URL_RAW_BASE}/hassio-supervisor.service"
URL_APPARMOR_PROFILE="https://version.home-assistant.io/apparmor.txt"
# Check env
command -v systemctl > /dev/null 2>&1 || MISSING_PACKAGES+=("systemd")
command -v nmcli > /dev/null 2>&1 || MISSING_PACKAGES+=("network-manager")
command -v apparmor_parser > /dev/null 2>&1 || MISSING_PACKAGES+=("apparmor")
command -v docker > /dev/null 2>&1 || MISSING_PACKAGES+=("docker")
command -v jq > /dev/null 2>&1 || MISSING_PACKAGES+=("jq")
command -v curl > /dev/null 2>&1 || MISSING_PACKAGES+=("curl")
command -v dbus-daemon > /dev/null 2>&1 || MISSING_PACKAGES+=("dbus")
if [ ! -z "${MISSING_PACKAGES}" ]; then
warn "The following is missing on the host and needs "
warn "to be installed and configured before running this script again"
error "missing: ${MISSING_PACKAGES[@]}"
fi
# Check if Modem Manager is enabled
if systemctl list-unit-files ModemManager.service | grep enabled > /dev/null 2>&1; then
warn "ModemManager service is enabled. This might cause issue when using serial devices."
fi
# Detect wrong docker logger config
if [ ! -f "$FILE_DOCKER_CONF" ]; then
# Write default configuration
info "Creating default docker daemon configuration $FILE_DOCKER_CONF"
curl -sL ${URL_DOCKER_DAEMON} > "${FILE_DOCKER_CONF}"
# Restart Docker service
info "Restarting docker service"
systemctl restart "$SERVICE_DOCKER"
else
STORAGE_DRIVER=$(docker info -f "{{json .}}" | jq -r -e .Driver)
LOGGING_DRIVER=$(docker info -f "{{json .}}" | jq -r -e .LoggingDriver)
if [[ "$STORAGE_DRIVER" != "overlay2" ]]; then
warn "Docker is using $STORAGE_DRIVER and not 'overlay2' as the storage driver, this is not supported."
fi
if [[ "$LOGGING_DRIVER" != "journald" ]]; then
warn "Docker is using $LOGGING_DRIVER and not 'journald' as the logging driver, this is not supported."
fi
fi
# Check dmesg access
if [[ "$(sysctl --values kernel.dmesg_restrict)" != "0" ]]; then
info "Fix kernel dmesg restriction"
echo 0 > /proc/sys/kernel/dmesg_restrict
echo "kernel.dmesg_restrict=0" >> /etc/sysctl.conf
fi
#url -sL "${URL_NM_CONF}" > "${FILE_NM_CONF}"
if [ ! -f "$FILE_NM_CONNECTION" ]; then
curl -sL "${URL_NM_CONNECTION}" > "${FILE_NM_CONNECTION}"
fi
warn "Changes are needed to the /etc/network/interfaces file"
info "If you have modified the network on the host manualy, those can now be overwritten"
info "If you do not overwrite this now you need to manually adjust it later"
info "Replacing /etc/network/interfaces"
curl -sL "${URL_INTERFACES}" > "${FILE_INTERFACES}";
#info "Restarting NetworkManager and sleeping for 20 seconds"
#systemctl restart "${SERVICE_NM}"
#sleep 20
# Parse command line parameters
while [[ $# -gt 0 ]]; do
arg="$1"
case $arg in
-m|--machine)
MACHINE=$2
shift
;;
-d|--data-share)
DATA_SHARE=$2
shift
;;
-p|--prefix)
PREFIX=$2
shift
;;
-s|--sysconfdir)
SYSCONFDIR=$2
shift
;;
*)
error "Unrecognized option $1"
;;
esac
shift
done
PREFIX=${PREFIX:-/usr}
SYSCONFDIR=${SYSCONFDIR:-/etc}
DATA_SHARE=${DATA_SHARE:-$PREFIX/share/hassio}
CONFIG=$SYSCONFDIR/hassio.json
# Generate hardware options
case $ARCH in
"i386" | "i686")
MACHINE=${MACHINE:=qemux86}
HASSIO_DOCKER="$DOCKER_REPO/i386-hassio-supervisor"
;;
"x86_64")
MACHINE=${MACHINE:=qemux86-64}
HASSIO_DOCKER="$DOCKER_REPO/amd64-hassio-supervisor"
;;
"arm" |"armv6l")
if [ -z $MACHINE ]; then
error "Please set machine for $ARCH"
fi
HASSIO_DOCKER="$DOCKER_REPO/armhf-hassio-supervisor"
;;
"armv7l")
if [ -z $MACHINE ]; then
error "Please set machine for $ARCH"
fi
HASSIO_DOCKER="$DOCKER_REPO/armv7-hassio-supervisor"
;;
"aarch64")
if [ -z $MACHINE ]; then
error "Please set machine for $ARCH"
fi
HASSIO_DOCKER="$DOCKER_REPO/aarch64-hassio-supervisor"
;;
*)
error "$ARCH unknown!"
;;
esac
if [[ ! "${MACHINE}" =~ ^(intel-nuc|odroid-c2|odroid-n2|odroid-xu|qemuarm|qemuarm-64|qemux86|qemux86-64|raspberrypi|raspberrypi2|raspberrypi3|raspberrypi4|raspberrypi3-64|raspberrypi4-64|tinker)$ ]]; then
error "Unknown machine type ${MACHINE}!"
fi
### Main
# Init folders
if [ ! -d "$DATA_SHARE" ]; then
mkdir -p "$DATA_SHARE"
fi
# Read infos from web
HASSIO_VERSION=$(curl -s $URL_VERSION | jq -e -r '.supervisor')
##
# Write configuration
cat > "$CONFIG" <<- EOF
{
"supervisor": "${HASSIO_DOCKER}",
"machine": "${MACHINE}",
"data": "${DATA_SHARE}"
}
EOF
##
# Pull supervisor image
info "Install supervisor Docker container"
docker pull "$HASSIO_DOCKER:$HASSIO_VERSION" > /dev/null
docker tag "$HASSIO_DOCKER:$HASSIO_VERSION" "$HASSIO_DOCKER:latest" > /dev/null
##
# Install Hass.io Supervisor
info "Install supervisor startup scripts"
curl -sL ${URL_BIN_HASSIO} > "${PREFIX}/sbin/hassio-supervisor"
curl -sL ${URL_SERVICE_HASSIO} > "${SYSCONFDIR}/systemd/system/hassio-supervisor.service"
sed -i "s,%%HASSIO_CONFIG%%,${CONFIG},g" "${PREFIX}"/sbin/hassio-supervisor
sed -i -e "s,%%BINARY_DOCKER%%,${BINARY_DOCKER},g" \
-e "s,%%SERVICE_DOCKER%%,${SERVICE_DOCKER},g" \
-e "s,%%BINARY_HASSIO%%,${PREFIX}/sbin/hassio-supervisor,g" \
"${SYSCONFDIR}/systemd/system/hassio-supervisor.service"
chmod a+x "${PREFIX}/sbin/hassio-supervisor"
systemctl enable hassio-supervisor.service > /dev/null 2>&1;
#
# Install Hass.io AppArmor
info "Install AppArmor scripts"
mkdir -p "${DATA_SHARE}/apparmor"
curl -sL ${URL_BIN_APPARMOR} > "${PREFIX}/sbin/hassio-apparmor"
curl -sL ${URL_SERVICE_APPARMOR} > "${SYSCONFDIR}/systemd/system/hassio-apparmor.service"
curl -sL ${URL_APPARMOR_PROFILE} > "${DATA_SHARE}/apparmor/hassio-supervisor"
sed -i "s,%%HASSIO_CONFIG%%,${CONFIG},g" "${PREFIX}/sbin/hassio-apparmor"
sed -i -e "s,%%SERVICE_DOCKER%%,${SERVICE_DOCKER},g" \
-e "s,%%HASSIO_APPARMOR_BINARY%%,${PREFIX}/sbin/hassio-apparmor,g" \
"${SYSCONFDIR}/systemd/system/hassio-apparmor.service"
chmod a+x "${PREFIX}/sbin/hassio-apparmor"
systemctl enable hassio-apparmor.service > /dev/null 2>&1;
systemctl start hassio-apparmor.service
##
# Init system
info "Start Home Assistant Supervised"
systemctl start hassio-supervisor.service
##
# Setup CLI
info "Installing the 'ha' cli"
curl -sL ${URL_HA} > "${PREFIX}/bin/ha"
chmod a+x "${PREFIX}/bin/ha"
info
info "Home Assistant supervised is now installed"
info "First setup will take some time, when it's ready you can reach it here:"
info "http://${IP_ADDRESS}:8123"
info
#!/usr/bin/env bash
apt update
apt install -y network-manager network-manager-gnome
systemctl disable dhcpcd
systemctl disable ModemManager
rm -f /etc/wpa_supplicant/wpa_supplicant.conf
# Create config for NetworkManager
info "Creating NetworkManager configuration"
cat<<EOF > /etc/NetworkManager/NetworkManager.conf
[main]
dns=default
plugins=ifupdown,keyfile
autoconnect-retries-default=0
rc-manager=file
dhcp=internal
[ifupdown]
managed=true
[device]
wifi.scan-rand-mac-address=no
[keyfile]
unmanaged-devices=type:bridge;type:tun;type:veth
[logging]
backend=journal
EOF
echo "PLEASE REBOOT NOW and once rebooted, connect to your network using the Network Manager applet on top right menu"
echo "Then proceed to supervised install of Home Assisant."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment