community italiana di domotica personale
 
Installare Python 3.10.x (o superiori) su Raspberry Pi OS – e ripristinare Home Assistant Core su venv

Installare Python 3.10.x (o superiori) su Raspberry Pi OS – e ripristinare Home Assistant Core su venv

Amazon - Promozioni del giorno  
SCOPI DELLA GUIDA
  • Aggiornare la versione di Python alla 3.10.x o superiori
  • Livello di difficoltàmedia
CONCETTI AFFRONTATI:
  • Utilizzo e configurazione software
COMPONENTI SOFTWARE UTILIZZATE:
PREREQUISITI
  • Home Assistant Core installato su sistema operativo Raspberry Pi OS come applicativo Python su venv (no Core su Docker, no HassOS, no Supervised su Docker)
  • Python versione < 3.10.x
DISPOSITIVI FISICI UTILIZZATI:
Guida indicata per utenti con installazione:
Ambiente Home Assistant Core
NOTE E DISCLAIMER
  • qualsiasi eventuale modifica agli impianti domestici dev'essere progettata ed realizzata SOLO da personale qualificato;
  • qualsiasi modifica non prevista attuata in proprio è a propria responsabilità personale nonché a proprio rischio e pericolo (i contenuti della presenta pagina hanno infatti puro scopo didattico) e fa decadere garanzia, omologazioni e certificazioni di qualità; dei dispositivi interessati;
  • tutte le tecniche descritte si intendono applicate a software e firmware aggiornati alle ultime versioni disponibili;
  • questa pagina è materialmente scritta e manutenuta da più individui: non ci si aspetti né si pretenda un supporto personale. In presenza di difficoltà, chiedere supporto alla community sul nostro forum o sulla nostra chat.
Revisione guida: 1.2

Abstract

A partire dalla versione 2022.7 di Home Assistant, la versione di Python 3.9.x è considerata deprecata. Home Assistant Core considererà tale versione obsoleta come non più valida a seguire, pertanto Home Assistant non funzionerà semplicemente più se non a fronte di un aggiornamento di Python alla versione 3.10.x.

Questo vale solo per le installazioni di Home Assistant Core come applicativo venv su sistemi dotati di sistema operativo Raspberry Pi OS (no Core su Docker, no HassOS, no Supervised su Docker) – ad esempio come in questa guida – oppure, sempre come applicativo, sul altri sistemi operativi.

Questa guida illustra come installare Python 3.10 (o versioni superiori) su un sistema Raspberry Pi con sistema operativo Raspberry Pi OS. Si consiglia, per sicurezza, di effettuare un backup della propria microSD (o disco SSD che sia).

La procedura che segue è testata e funzionante. Ma ATTENZIONE: si tratta di una procedura che può prendere anche diverse ore. Non essere frettolosi e lasciare che il mini computer esegua completamente tutti i passaggi.
STANCHI DI QUESTI CICLICI AGGIORNAMENTI PYTHON?

Se non avete specifiche necessità, oltre Home Assistant, nell’utilizzare una versione recente di Python, su inDomus continuiamo e continueremo sempre a spingervi alla migrazione di Home Assistant da ambiente venv a Docker, il che semplifica enormemente i processi di gestione nonché evita i problemi legati all’obsolescenza di Python (in quanto gestita direttamente all’interno degli aggiornamenti dell’immagine Docker di Home Assistant).

Si parte

Un chiarimento importante

Prima di addentrarci nella guida vogliamo chiarire un concetto fondamentale che spesso confonde gli utenti alle prime armi. Di solito quando avviamo per la prima volta il sistema operativo di Raspberry otterremo di default (almeno fino ad oggi) anche la versione di Python 2.7 (ultima release della serie 2.x). Ci sono anche altri casi: installando la versione “bullseye” del sistema oeprativo, viene per esepio fornita direttamente la Python 3.7.

Colleghiamoci  via SSH al nostro Raspberry andando in prima battuta a verificare la versione di Python tramite il binario python il risultato restituito solitamente è questo (in verde scuro i comandi, in verde chiaro gli output):

pi@raspberrypi:~ $ python --version
Python 2.7.16

che è lo stesso che otterremmo se usassimo python2:

pi@raspberrypi:~ $ python2 --version
Python 2.7.16

Perché questo? Perché python di fatto non è un binario ma un symlink (ovvero un “Symbolic Link“) al binario python2.
Questo possiamo verificarlo in questo modo:

pi@raspberrypi:~ $ which python
/usr/bin/python
pi@raspberrypi:~ $ ls -lart /usr/bin/python
lrwxrwxrwx 1 root root 7 Mar  4  2019 /usr/bin/python -> python2
pi@raspberrypi:~ $ ls -lart /usr/bin/python2
lrwxrwxrwx 1 root root 9 Mar  4  2019 /usr/bin/python2 -> python2.7
pi@raspberrypi:~ $ ls -lart /usr/bin/python2.7 
-rwxr-xr-x 1 root root 2984816 Oct 11  2019 /usr/bin/python2.7

quindi Python di fatto si trova sotto /usr/bin/ ed è un symlink di /usr/bin/python2, che a sua volta è un symlink di /usr/bin/python2.7 (il vero binario).

A noi però per Home Assistant Core ormai serve Python 3.x; possiamo subito verificare se sia già installato utilizzando il “comando” python3:

pi@raspberrypi:~ $ python3 --version
Python 3.7.3

In questo  caso risulta già installata la versione 3.7.3 (ultima installata automaticamente con il package manager sulla versione “Buster” di Raspberry Pi OS). Anche python3 vale il discorso dei symlink:

pi@raspberrypi:~ $ which python3
/usr/bin/python3
pi@raspberrypi:~ $ ls -lart /usr/bin/python3
lrwxrwxrwx 1 root root 9 Mar 26  2019 /usr/bin/python3 -> python3.7
pi@raspberrypi:~ $ ls -lart /usr/bin/python3.7
-rwxr-xr-x 2 root root 4275580 Jan 22  2021 /usr/bin/python3.7

Installazione della nuova versione di Python

Chiarito questo concetto, possiamo procedere all’installazione “manuale” di una versione più recente di Python. Nel nostro caso prendiamo come esempio l’ultima 3.9 disponibile, ma precisiamo come la procedura sarà esattamente identica per l’installazione di altre versioni di Python: basterà adeguare i link di download e dei binari a seconda della nuova versione da installare.

Installiamo ora, tramite package manager, alcuni pacchetti/librerie fondamentali:

sudo apt-get install build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev libopenjp2-7 libtiff5 libffi-dev libjpeg-dev bluetooth libbluetooth-dev -y

Scarichiamo quindi la versione che ci interessa (ad esempio la 3.9.9), decomprimiamo il pacchetto coi sorgenti e spostiamoci nella directory appena creata:

wget https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tgz
tar xzvf Python-3.10.6.tgz
cd Python-3.10.6

Prepariamo la configurazione:

./configure --enable-optimizations

Ora, prima di procedere con la compilazione di Python, verifichiamo di quanti core disponga la CPU del nostro Raspberry tramite il comando:

nproc

Passiamo quindi il valore ottenuto (ipotizziamo “4“) come valore del parametro -j del comando make.
Siamo dunque pronti alla compilazione, la quale necessiterà di parecchio tempo. Avviamo il tutto con:

make -j 4
sudo make install

E attendiamo con grande pazienza.


Una volta terminato il processo potremo verificare come il symlink python3 ora punti alla nuova versione:

pi@raspberrypi:/srv $ python3 --version
Python 3.10.6
Amazon - Promozioni del giorno

Home Assistant

A questo punto fermiamo Home Assistant:

sudo systemctl stop homeassistant

Rimuoviamo il vecchio ambiente virtuale venv:

sudo rm -rf /srv/homeassistant

Ricreiamolo utilizzando la nuova versione di Python (nel caso del nostro esempio, la 3.9.9):

sudo mkdir /srv/homeassistant
sudo chown homeassistant:homeassistant /srv/homeassistant
sudo -u homeassistant -H -s
cd /srv/homeassistant
python3 -m venv .
source bin/activate
python3 -m pip install wheel
python -m pip install flask_sqlalchemy fnvhash

Installiamo l’ultima versione di Home Assistant:

python3 -m pip install homeassistant

Usciamo dall’ambiente vituale venv:

deactivate

Avviamo nuovamente il servizio Home Assistant:

sudo systemctl start homeassistant

Fatto ciò controlliamo i log di Home Assistant per verificare che tutto sia ok (adeguare eventualmente il percorso relativo al proprio file di log):

tail -f /home/homeassistant/.homeassistant/home-assistant.log

Errori comuni

Utilizzando la diffusa versione “Buster” di Raspberry Pi OS, passando ad una versione di Python > 3.8 probabilmente si otterrà il seguente errore:

ERROR (MainThread) [homeassistant.auth.providers] Unable to load auth provider homeassistant: libffi.so.7: cannot open shared object file: No such file or directory

La libreria che causa l’errore, libffi7, purtroppo non è disponibile tramite package manager su Buster. Premesso che sarebbe meglio portarsi avanti con la versione del proprio OS, visto che in questo caso non c’è ancora la nuova versione e per evitare la compilazione a mano della libreria partendo dai sorgenti, possiamo installarla recuperando i package necessari dal repository della nuova versione.

Ci occorreranno gcc, libgcc, e libffi. I link ai package si possono recuperare presso:

In queste tre pagine troveremo ulteriori link mirror (ftp o http) presso i quali i pacchetti sono effettivamente scaricabili: copiare uno di tali link per ciascuno dei tre pacchetti e poi applicarli alla wget da eseguire sul terminale di Raspberry OS, per esempio:

wget http://ftp.us.debian.org/debian/pool/main/g/gcc-10/gcc-10-base_10.2.1-6_armhf.deb
wget http://ftp.debian.org/debian/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_armhf.deb
wget http://ftp.lt.debian.org/debian/pool/main/libf/libffi/libffi7_3.3-6_armhf.deb

Una volta scaricati i tre pacchetti, installiamoli tassativamente nel seguente ordine:

sudo dpkg -i gcc-10-base_10.2.1-6_armhf.deb
sudo dpkg -i libgcc-s1_10.2.1-6_armhf.deb
sudo dpkg -i libffi7_3.3-6_armhf.deb

Ciò fatto, l’errore di cui sopra sparirà.

⚠️ Se di Home Assistant ne sai poco ma sei interessato a capirne di più, ti suggeriamo di partire da qui.

Questa pagina è redatta, manutenuta e aggiornata dallo staff di inDomus, un gruppo di persone molto diverse tra loro che trovi, per domande e supporto, sul forum e sulla chat del sito. Se ti sei perso, a tua disposizione c'è la mappa.
Telegram News Channel