It’s a pleasure!
follow your instructions for updating Python
Thanks for the instruction. Manage to upgrage Python but get an error at the following instruction in section E
Error log
Preparing metadata (setup.py) ... error
error: subprocess-exited-with-error
× python setup.py egg_info did not run successfully.
│ exit code: 1
╰─> [55 lines of output]
/srv/homeassistant/lib/python3.10/site-packages/setuptools/config/setupcfg.py:508: SetuptoolsDeprecationWarning: The license_file parameter is deprecated, use license_files instead.
warnings.warn(msg, warning_class)
/srv/homeassistant/lib/python3.10/site-packages/setuptools/installer.py:27: SetuptoolsDeprecationWarning: setuptools.installer is deprecated. Requirements should be satisfied by a PEP 517 installer.
warnings.warn(
WARNING: The wheel package is not available.
WARNING: The wheel package is not available.
error: subprocess-exited-with-error
× python setup.py bdist_wheel did not run successfully.
│ exit code: 1
╰─> [8 lines of output]
/srv/homeassistant/lib/python3.10/site-packages/setuptools/config/setupcfg.py:508: SetuptoolsDeprecationWarning: The license_file parameter is deprecated, use license_files instead.
warnings.warn(msg, warning_class)
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
or: setup.py --help [cmd1 cmd2 ...]
or: setup.py --help-commands
or: setup.py cmd --help
error: invalid command 'bdist_wheel'
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for cffi
ERROR: Failed to build one or more wheels
Any suggestions? Thanks
Solved the issue, problem was related to wheel
following action resolved the issue
python3 -m pip install wheel
Android 13, chrooted in ubuntu jammy
I just deleted folder and install HA core normally, took couple of minutes.
sudo -u homeassistant -H -s
cd /srv/homeassistant
rm -r *
python3 -m venv .
source bin/activate
python3 -m pip install wheel
pip3 install homeassistant
Great was about to respond with that
If anyone has problems with Bluetooth after upgrading to Python 3.10 try this solution here. Short version
sudo setcap 'cap_net_raw,cap_net_admin+eip' /usr/local/bin/python3.10
sudo systemctl restart home-assistant@homeassistant
Sorry I might sound stupid but how do I update Python if I am using the HAOS running on a VM on Proxmox?
Am I missing something ? The base OS I guess is Debian/Ubuntu but how can I run other commands rather than the ones the CLI offers ?
thanks
This guide is not for HAOS but for HA Core.
In your case Python is updated by the OS.
I would like to suggest to stop EVERY possible service (HA, as well) before running “make”, if you are an old Rpi (like mine 3B+) or it will take a very looooooong time!
Thanks for trying to shed some light on the worst mess I’ve seen in 43 years since I started with an Apple ][!
- Is home-assistant (with -) above a typo?
- Edit: You use sudo with
python3 -m venv .
The docs don’t. - Thanks for the suffice-with-3.10 tip. Was about to use 3.11. Edit: Will simply KILL it. How about trying with pyenv?
Later
G.
Hi Maarten,
This unfortunately is the most complex part of the upgrade. Each persons HomeAssistant Integrations are different, so the requirements are different.
What is happening here is the PIP installer is trying to install all the requirements / prerequisites which are unique to your environment & dependant on integrations / components you have configured in HASS.
You might need to try and resolve those individually, or worst case, you might need to edit your requirements.txt file, and remove the items which PIP has a problem with installing.
One item that might be easily resolvable for instance is the “license_file parameter is deprecated, use license_files instead” where you might just need to update the requirements.txt file to use “license_files” instead of “license_file”.
Hi, I’m running HA with a Python VEnv too and have done multiple Python-Updates ( 3.9, 3.10, 3.11) since I started with HA.
My recommendation is NOT to use the “requirements.txt”-approach.
After downloading and installing Python, creating a new VEnv for the new version like you do describe in the guide I always handled it like a new install of HA and installed HA with pip as described in documentation, then changed the service to point to the new folder and started HA. On startup ( which takes quite a while in this case) it pulls all missing requirements, including those for custom components.
Advantage is that you don’t carry over any dependencies from the old VEnv and the old Python-version
Of course this approach also might produce problems
For cryptography a manual install of rustc was required ( believe this was with Python 3.9), otherwise Python was unable to compile the package
Manually installed python libraries have to be installed again. For example I’m using a Infrared Receiver and the “lirc”-package requires manual installation from source into each new environment
my 2 cents
Armin
Thanks for a great guide @Pieter_Rossouw ! Below is a quick guide that describe what I did to go from Python 3.11 to 3.12.
Assumptions
- HA is run as root. I personally run it in a LXC container (Proxmox). See additional steps provided in the first post in this thread for steps required to use a different user.
- The Python runtime previously installed using the deadsnakes PPA.
- Packages already installed:
apt install wget build-essential libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev python3-pip
Install new python version
apt install python3.12 python3.12-dev python3.12-venv
Stop HA
systemctl stop home-assistant@root
Write package requirements to requirements.txt
cd /root/.homeassistant
source /srv/homeassistant/bin/activate
pip3 freeze –local > requirements.txt
exit
Backup existing HA runtime
cd /srv
mv homeassistant homeassistantold
Set up new runtime
cd /srv
mkdir homeassistant
cd /srv/homeassistant
python3.12 -m venv .
Activate python env
source /srv/homeassistant/bin/activate
Install dependencies
cd /root/.homeassistant
pip3 install --upgrade pip
pip install --upgrade pip
pip3 install -r requirements.txt
Install HA
pip3 install homeassistant
Start it again
systemctl start home-assistant@root
I just upgraded this and did the same … no requirements.txt. Just backup the old install and reinstall from scratch. Assuming you have the home-assistant service (for stop and start) …
sudo apt update
sudo apt install python3.12
sudo apt install python3.12-venv
sudo apt install python3.12-dev
sudo systemctl stop home-assistant@homeassistant
cd /srv
sudo mv homeassistant homeassistant-3.11
sudo python3.12 -m venv homeassistant
sudo chown -R homeassistant:homeassistant homeassistant/
pip3 install wheel
cd homeassistant
sudo -u homeassistant -H -s
source bin/activate
pip3 install --upgrade homeassistant
pip3 install --upgrade home-assistant-frontend
exit
sudo systemctl start home-assistant@homeassistant
Worked a charm. Yes you patiently wait for all the python to compile and such (5 minutes or so) but up and running and faster than before
Hello, I’m having this problem… how to solve it?
thanks
root@raspberrypi:/home/lucavasini# sudo apt update
Hit:1 http://deb.debian.org/debian bookworm InRelease
Hit:2 http://deb.debian.org/debian-security bookworm-security InRelease
Hit:3 http://deb.debian.org/debian bookworm-updates InRelease
Hit:4 http://archive.raspberrypi.com/debian bookworm InRelease
Hit:5 https://download.docker.com/linux/debian bookworm InRelease
Ign:6 https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu bookworm InRelease
Err:7 https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu bookworm Release
404 Not Found [IP: 185.125.190.80 443]
I’ve been able to upgrade from 3.9 to 3.11 with freebsd successfully. I did the requirements things, then I did it again without the requirements steps. The later is indeed superior. Much faster, not installing uneeded deps.
Here’s some fix I needed for FreeBSD:
After installing homeassistant:
pip3 install numpy
pip3 install git+https://github.com/rhasspy/webrtc-noise-gain.git
|
I also have a problem with pyturbojpeg==1.7.1. I can install the updated version, but something requires this version that won’t install. That being said, it works so far. Note that my upgrade is small. I’ve started using ha like 3 days ago.
# update Home Assistant Core (HAC) venv on an Ubuntu 22.04 (jammy) system to use python3.12 in order to support "Home Assistant 2024.4" and newer HAC versions
# scenario:
# * Raspberry Pi 4B with Ubuntu 22.04 (jammy)
# * currently the HAC installation uses python3.11.9
# * HAC installation was previously (e.g. in 2022) set up as per
# * https://www.home-assistant.io/installation/linux#install-home-assistant-core
# * https://www.home-assistant.io/installation/raspberrypi#install-home-assistant-core
# * notably, HAC venv is located at "/srv/homeassistant"
# * usual HAC update steps as per https://www.home-assistant.io/common-tasks/core/#update
# don't update beyond 2024.3.3 because HAC 2024.4+ requires python3.12 .
# if not already set up, add the deadsnakes PPA so that python3.12 is available for installation via apt
# see https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
# install all python3.12-relevant packages:
sudo apt install python3.12 python3.12-dev python3.12-venv
# sanity-check *system-wide* python3.12 installation:
which python3.12
# shall output "/usr/bin/python3.12"
python3.12 --version
# shall output "Python 3.12.x", e.g. "Python 3.12.4"
# stop homeassistant service
sudo systemctl stop homeassistant.service
# switch to Unix user "homeassistant"
sudo -u homeassistant -H -s
# now in the role of Unix user "homeassistant"
# backup HAC venv directory
mkdir -p "${HOME}/backups/homeassistant/2024-07-01"
rsync -a /srv/homeassistant/ "${HOME}/backups/homeassistant/2024-07-01/homeassistant"
# see https://docs.python.org/3/library/venv.html
# while OUTSIDE of any venv, upgrade the HAC venv by executing
# "... -m venv --upgrade ..." with the desired python version,
# i.e. by explicitly using the "python3.12" executable:
python3.12 -m venv --upgrade /srv/homeassistant
# if this results in an error with message:
# "Error: Unable to create directory '/srv/homeassistant'",
# then maybe the path "/srv/homeassistant" has a symlink along its path components?
# if so, then try the following command instead:
# python3.12 -m venv --upgrade "$(realpath /srv/homeassistant)"
#
# command shall exit without any output and with exit status 0.
# activate the upgraded venv
source /srv/homeassistant/bin/activate
# you are now as user "homeassistant" in an homeassistent (the application) venv.
# prompt should look similar to the following:
# (homeassistant) homeassistant@mymachine:/srv/homeassistant$
# ... ignore for a moment that the command "python --version" may still output e.g. "Python 3.11.9", not "Python 3.12.x"
pip3 install --upgrade homeassistant
# olala! something works:
# output:
# Collecting homeassistant
# Downloading homeassistant-2024.6.4-py3-none-any.whl.metadata (4.3 kB)
# ...
#
# collects packages, builds wheels, and installs collected packages.
# this can easily take over ten minutes on a Raspberry Pi 4B
#
# in my case I got the following notice:
# [notice] A new release of pip is available: 24.0 -> 24.1.1
# [notice] To update, run: pip install --upgrade pip
# following suit:
pip install --upgrade pip
# continuing with https://www.home-assistant.io/common-tasks/core/#configuration-check :
hass --script check_config
# easily takes 30 minutes and more, as several packages may need to be compiled to the target architecture.
# outputs e.g.:
# INFO:homeassistant.util.package:Attempting install of colorlog==6.8.2
# Testing configuration at /home/homeassistant/.homeassistant
# INFO:homeassistant.helpers.storage:Migrating core.entity_registry storage from 1.13 to 1.14
# INFO:homeassistant.util.package:Attempting install of home-assistant-frontend==20240610.1
# ...
# sanity check if the following command gives sensible output on your configuration:
hass --script check_config --info all
# we're done with the Home Assistant update/upgrade.
# time to start up Home Assistant as you usually do
# in my case the following steps were:
# leaving the venv:
deactivate
# leaving the shell as user "homassistant" to get back to my default user
exit
# now back in the role of my default user
# prepare to monitor the usual logs to see if everything starts up nicely, e.g. with
# journalctl -x -f
# Let's start Home Assistant now; in my case it goes like so:
sudo systemctl start homeassistant.service
# took 30 seconds or so until the first Home Assistant log entries appeared
# then the journalctl log shows that even more things get installed/updated, such as:
# INFO (MainThread) [homeassistant.setup] Setup of domain logger took 0.23 seconds
# ...
# INFO (SyncWorker_1) [homeassistant.util.package] Attempting install of bar==4.5.6
# ... but the web interface is already reachable
This post is not for HAOS, but rather running HomeAssistant on a Ubuntu OS in a Pythone Virtual Environment.
If anyone is interested, this is the script I use to install and update both Python and HA Core (I called it updhass
):
#!/bin/bash
LINE="START: $(date)"
echo "==${LINE}==" | sed "s/./=/g"
echo "= ${LINE} ="
echo "==${LINE}==" | sed "s/./=/g"
# Set this variable to the base directory of where your Python and HASS installations reside
DEF_BASE=/srv
DEF_CONFIG=~/.homeassistant
DEF_TEMP=Python_temp
F_PVER=""
F_HASS=""
NO_START_STOP=0
unset BASE CONFIG P_TEMP
# See if any command line parameters are provided
while getopts "?p:h:b:c:t:s" opt
do
case "${opt}" in
b) BASE=${OPTARG} ;;
c) CONFIG=${OPTARG} ;;
t) P_TEMP=${OPTARG} ;;
p) F_PVER=${OPTARG} ;;
h) F_HASS=${OPTARG} ;;
s) NO_START_STOP=1 ;;
\?)
echo "Usage: ${0} [-b Install_base] [-c Config_dir] [-t Python_Install_temp_dir] [-p Python_version] [-h HASS_version] [-s] [-?]"
echo "Where:"
echo -e "\tInstall_base is the base directory to install Python and HASS in (default ${DEF_BASE})"
echo -e "\tConfig_dir is the HASS config directory (default ${DEF_CONFIG})"
echo -e "\tPython_Install_temp_dir is the temp directory to build Python in (default ${DEF_BASE}/${DEF_TEMP})"
echo -e "\tPython_version is the Python version to use (i.e. 3.12.5)"
echo -e "\tHASS_version is the HASS version to use (i.e. 2024.8.2)"
echo "If -s is specified hass will not be restarted but new links will be created"
echo "When the HASS and Python version are already installed, the links will be recreated if they don't already exist"
exit 0
;;
esac
done
[[ -z "${BASE}" ]] && BASE=${DEF_BASE}
# Make sure the BASE directory exists
if [[ ! -d "${BASE}" ]]
then
mkdir -p ${BASE}
if [[ $? != 0 ]]
then
echo "Problem creating base directory ${BASE}. Exiting..."
exit 1
fi
fi
# Make sure the BASE directory is writable
if [[ ! -w "${BASE}" ]]
then
echo "Directory ${BASE} is write protected. Exiting..."
exit 1
fi
if [[ -z "${P_TEMP}" ]]
then
P_TEMP=${BASE}/${DEF_TEMP}
else
# If P_TEMP does not start with a / prepend the BASE directory
[[ $(echo ${P_TEMP} | cut -c1) -ne "/" ]] && P_TEMP=${BASE}/${P_TEMP}
fi
[[ -z "${CONFIG}" ]] && CONFIG=${DEF_CONFIG}
cd ${CONFIG}
# If we are in a venv, deactivate it
[[ $(type -t deactivate) == function ]] && deactivate
# Activate the latest HASS environment
[[ -d "${BASE}/hass/bin" ]] && source ${BASE}/hass/bin/activate
# Check if HASS is already installed?"
HASS_CVER=$(hass --version 2> /dev/null || echo "0000.0.0" )
# Retrieve the latest version of HASS from github
if [[ -z "${F_HASS}" ]]
then
HASS_NVER=$(wget -q -O - https://github.com/home-assistant/core/releases/latest | grep 'href="/home-assistant/core/releases/tag' | sed 's/^.*href="//;s/".*//' | cut -d/ -f6)
else
# Check if version from command line exists
if wget -q -O /dev/null https://github.com/home-assistant/core/releases/tag/${F_HASS}
then
HASS_NVER=${F_HASS}
else
echo "HASS version ${F_HASS} is not found. Exiting..."
exit 1
fi
fi
# Do not upgrade to a .0 version
MINOR=$(echo "${HASS_NVER}" | cut -d. -f3)
echo "If this is a .0 version, skip the update; unless the version came from the command line"
if [[ ${MINOR} == 0 && -z "${F_HASS}" ]]
then
echo "Not installing version ${HASS_NVER}"
exit 1
fi
echo "Check and update Python if necessary"
[[ ! -d "${P_TEMP}" ]] && mkdir ${P_TEMP}
cd ${P_TEMP}
if [[ -z "${F_PVER}" ]]
then
PFILE=$(wget -q https://python.org/downloads -O - --compression=gzip | grep "Download the latest .*tar.xz" | cut -d\" -f2 | sed "s/\.tar\.[^\.]\+$/.tgz/")
N_PVER=$(basename ${PFILE} .tgz | cut -d- -f2)
else
N_PVER=${F_PVER}
PFILE=https://www.python.org/ftp/python/${N_PVER}/Python-${N_PVER}.tgz
fi
PVER_PATH=Python-${N_PVER}
PPATH=${BASE}/${PVER_PATH}
if [[ -d "${PPATH}"/bin ]]
then
echo "Python ${N_PVER} is already installed..."
else
echo "Collecting and extracting tarbal for Python ${N_PVER}..."
wget -q ${PFILE} -O - | tar zxf -
if [[ $? == 0 && -d ${P_TEMP}/Python-${N_PVER} ]]
then
cd ${P_TEMP}/${PVER_PATH}
echo "Compiling and installing Python ${N_PVER}..."
./configure --prefix=${PPATH} --enable-optimizations && make -j 4 && make install
if [[ $? -ne 0 ]]
then
echo "Something went wrong with building Python ${N_PVER}..."
else
echo "Create virtual environment for Python ${N_PVER} in ${PPATH}..."
export PATH=${PPATH}/bin:${PATH}
python3 -m venv ${PPATH}/venv
fi
echo "Cleaning up the sourcefiles..."
cd ${P_TEMP}
rm -rf ${PVER_PATH}
else
echo "Something went wrong while collecting and extracting source file ${PFILE}"
fi
echo "Done."
fi
cd ${CONFIG}
# Check the current version of Python
C_PVER=$(python3 --version | sed "s/ /-/g")
# Grab the latest installed Python version or the version from the command line
if [[ -z "${F_PVER}" ]]
then
PVER=$(ls -d ${BASE}/Python-*/venv | tail -1 | rev | cut -d/ -f2 | rev)
else
PVER="Python-${F_PVER}"
if [[ ! -d ${BASE}/${PVER}/venv/bin ]]
then
echo "Python version ${PVER} is not available. Exiting..."
exit 1
fi
fi
DDIR="${BASE}/${PVER}/HASS-${HASS_NVER}"
SL=${BASE}/hass-${HASS_NVER}_${PVER}
# Run the update if there is a new version of Python or a new version of HASS
DORELINK=0
echo "Is Python/HASS combo already installed?"
# if [[ "${HASS_CVER}" != "${HASS_NVER}" || "${C_PVER}" != "${PVER}" ]]
if [[ -x "${DDIR}/bin/hass" ]]
then
# Yes, do we need to relink the files?
ls -ld ${BASE}/hass | grep -q ${SL} || DORELINK=1
else
# No, install HASS
mkdir -p ${DDIR}
# If we are in a venv, deactivate it
[[ $(type -t deactivate) == function ]] && deactivate
# Activate the generic venv for the latest Python version (as created by the updPython script)
source ${BASE}/${PVER}/venv/bin/activate
# Create a virtual environment for the latest Python/HASS combo
python3 -m venv ${DDIR}
# Deactivate the generic venv for the latest Python version
deactivate
# Activate the venv for the latest Python/HASS combo
source ${DDIR}/bin/activate
# ensure we have the latest pip
pip3 install --upgrade pip
# Force installation of the latest HASS version
REQ_FILE=~/hass_requirements.txt
sed -i.$(date +'%Y%m%d%H%M%S') "s/homeassistant==.*/homeassistant==${HASS_NVER}/" ${REQ_FILE}
pip3 install -r ${REQ_FILE}
# deactivate the venv for the latest Python/HASS combo
deactivate
DORELINK=1
fi
if [[ "${DORELINK}" == 1 ]]
then
[[ ${NO_START_STOP} == 0 ]] && echo "Stopping old version of HASS"
[[ ${NO_START_STOP} == 0 ]] && sudo systemctl stop home-assistant@homeassistant
# Recreate links to the latest Python/HASS combo
echo "Creating links for Python/HASS combo"
rm -f ${BASE}/hass ${SL}
ln -s ${DDIR} ${SL}
ln -s ${SL} ${BASE}/hass
[[ ${NO_START_STOP} == 0 ]] && echo "Starting new version of HASS"
[[ ${NO_START_STOP} == 0 ]] && sudo systemctl start home-assistant@homeassistant
fi
LINE="END: $(date)"
echo "==${LINE}==" | sed "s/./=/g"
echo "= ${LINE} ="
echo "==${LINE}==" | sed "s/./=/g"
And this is my ~/hass_requirements.txt file (adjust it as necessary). The version of homeassistant is changed when the script is run:
wheel
mysqlclient==2.1.1
click==8.0.4
zha-quirks
moonraker-api
psutil-home-assistant
pyturbojpeg
homeassistant==2024.9.1
homeassistant-cli
numpy
So what this script does is the following:
- it uses /srv as the base install directory. Update this to what works for you
- check if a new version of Python exists
- if so, install it in /srv/Python-x.yy.z
- create a venv for this version in /srv/Python-x.yy.z/venv
- check if a new version of HA Core exists
- if so, create a venv with the latest version of Python in /srv/Python-x.yy.z/HASS-aaaa.b.c
- activate this venv and use pip3 to install homeassistant
- shutdown the exisiting version of HA Core (in this script, I use systemctl but you can change that anyway you handle HA Core startup and shutdown)
- backup the current /srv/hass symbolic link to /srv/hass-aaaa.b.c_Python-x.yy.z
- create a symbolic link to from the new install directory to /srv/hass
- start the new installation of HA Core
These are the commandline options:
$ ./updhass -?
===========================================
= START: Sat Sep 7 07:28:17 AM CEST 2024 =
===========================================
Usage: ./updhass [-b Install_base] [-c Config_dir] [-t Python_Install_temp_dir] [-p Python_version] [-h HASS_version] [-s] [-?]
Where:
Install_base is the base directory to install Python and HASS in (default /srv)
Config_dir is the HASS config directory (default /home/homeassistant/.homeassistant)
Python_Install_temp_dir is the temp directory to build Python in (default /srv/Python_temp)
Python_version is the Python version to use (i.e. 3.12.5)
HASS_version is the HASS version to use (i.e. 2024.8.2)
If -s is specified hass will not be restarted but new links will be created
When the HASS and Python version are already installed, the links will be recreated if they don't already exist
With -p and -h you can force a specific Python or HA version. Without any options, it will simple install the latest versions of Python and HA Core if necessary.
This script assumes, you have installed all other prerequisites for running HA Core (see Install Home Assistant Core)
This script ensures, I ALWAYS have a fresh install of HA Core and its requirements, but it always uses the same config directory. I am running HA Core under Rocky Linux 9 but this script should also work under Debian/Raspbian and Ubuntu