Script Python pour requêtes SQL

Mon problème

(le code fonctionnel est à la fin)

Bonjour
Je débute sur python avec pour but de créer un sensor basé sur l’analyse de plusieurs variables: covariances, variances,…

Je commence avec une requête SQL dans un script python.
Pour cela j’essaie d’appliquer la méthode décrite ici:

où via la commande python3 /config/python_scripts/lectureSQL.py

J’exécute ce script:

import sqlalchemy
import MySQLdb

logfile = open("scriptSQL.log","w")
database = MySQLdb.connect("\\HOMEASSISTANT\config\home-assistant_v2.db","","","homeassistant")

cursor = database.cursor()

query = """
SELECT DISTINCT entity_id,state,last_updated 
FROM states 
WHERE entity_id 
IN ('sensor.mdl_cumul_power', 'sensor.temperature_int', 'sensor.temperature_ext') 
AND ( last_updated > '2022-02-09 00:35' )
"""

cursor.execute(query)

for row in cursor.fetchall():
  day = row[0]
  consumption = row[1]
  
  logfile.write("%s -> %s\n" % (day, consumption))

database.close()
logfile.close()

Malheureusement l’exécution se termine à la première ligne, l’import n’est pas reconnu:

Je pense qu’il manque des librairies mais je ne sais pas lesquelles. Je précise que j’ai la même erreur avec ‹ import MySQLdb ›.
La commande ci dessus est pour mariadb mais il doit bien exister quelque chose pour SQLite… Là aussi j’ai besoin d’aide.
Merci d’avance.

Ma configuration


System Health

version core-2022.2.5
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.9.7
os_name Linux
os_version 5.10.92-v8
arch aarch64
timezone Europe/Paris
Home Assistant Community Store
GitHub API ok
Github API Calls Remaining 5000
Installed Version 1.22.0
Stage running
Available Repositories 984
Downloaded Repositories 5
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 7.3
update_channel stable
supervisor_version supervisor-2022.01.1
docker_version 20.10.9
disk_total 6.6 GB
disk_used 4.9 GB
healthy true
supported true
board rpi3-64
supervisor_api ok
version_api ok
installed_addons Samba share (9.5.1), File editor (5.3.3), deCONZ (6.12.0), SQLite Web (3.2.1)
Lovelace
dashboards 1
resources 3
views 5
mode storage
___

Je précise que la commande pip list me donne:

Command executed: pip list: 0
Package           Version
----------------- ---------
appdirs           1.4.4
CacheControl      0.12.6
certifi           2020.12.5
chardet           4.0.0
colorama          0.4.4
contextlib2       0.6.0
distlib           0.3.1
distro            1.5.0
gitdb             4.0.7
GitPython         3.1.18
hass-configurator 0.4.1
html5lib          1.1
idna              3.2
lockfile          0.12.2
msgpack           1.0.2
ordered-set       4.0.2
packaging         20.9
pep517            0.10.0
pip               20.3.4
progress          1.5
pyotp             2.6.0
pyparsing         2.4.7
requests          2.25.1
retrying          1.3.3
setuptools        52.0.0
six               1.15.0
smmap             4.0.0
toml              0.10.2
urllib3           1.26.5
webencodings      0.5.1

Salut,

Oui tu as besoin de prendre du recul sur ce que tu veux faire :slight_smile:

Pour commencer la base de données, expliqué dans les grandes lignes:
SQLite est un format de fichier qui permet d’avoir une base de données accessible avec des requêtes SQL… sans pour autant avoir un serveur SQL.
MariaDB est un serveur sql… donc un programme qui tourne en tache de fond pour gérer la base SQL.

MySQLdb est un package qui permet d’accéder à un serveur SQL… tu n’en a pas vu que tu as le fichier SQLite.
La commande connect c’est pour ouvrir une connexion à un serveur.

Donc si tu veux lire ton fichier home-assistant_v2…db il faut que tu trouve un package python dédié au SQLite.
En revanche je te déconseille de faire ça sur le fichier .db qui est en ligne… il faudrait laisser à HA la liberté d’utilise ce fichier comme il lui semble. Tu pourrais avoir des effets non désirés.

Ensuite concernant le sensor que tu veux faire, c’est pour analyser le comportement de tes autres sensors c’est ça?

Si c’est bien ça n’y a t’il rien à faire avec le module de statistiques déjà présent:

Et si tu utilises « python script » dans la doc c’est assez explicite :

Merci,
j’ai l’intégration SQLite web d’installée. J’imagine que les requêtes se font via quelque chose du genre REST_API?

Sinon, j’ai placé le fichier python dans le répertoire python_scripts mais j’utilise la commande python3 /config/python_scripts/lectureSQL.py sans faire appel à l’intégration « python _script » de HA.

SQLite Web à accès à ton fichier .db en direct.

Ok c’était au cas où :wink:

Oui mais SQLite web ne m’apporte rien, je veux récupérer les données dans un script python pour les traiter: intégrales, covariances…

Herbs
Je pense que tu as peut être raison…
Il doit certainement falloir installer quelque chose pour avoir accès à toutes les librairies.
Je regarde coté AppDeamon, pyscript ou Jupyter.

Honnêtement pour être plus safe… fais une copie du fichier db pour commencer.
Installes python sur une autre machine.
Trouves un librairie python pour SQLite et la doc comment l’utiliser
Et travailles sur tes requêtes là dessus.

Je n’ai pas besoin de faire trop d’accès à la base de donnée. Mais je vais suivre le conseil de la dupliquer au moins pour tester le script.
Je voulais faire mes requêtes directement dans HA pour utiliser les librairies disponibles et pas celles qui font tout mais ne sont pas intégrables dans HA…

Sinon le module statistique ne permet pas de combiner les senseurs comme pour une covariance.

Je ne pense pas que ce soit vraiment fait pour ça dans la version basique de la db en SQLite.
Avec MariaDB c’est une autre histoire, c’est plus pensé pour gérer des utilisateurs et faire d’autres chose avec les données. Et y accéder à distance avec python par exemple…

Chez moi j’ai mis MariaDB pour pouvoir collecter tous les jours des infos pour ma base perso qui me sert d’historique.

D’accord, je regarde cela.
Est ce que Mariadb est une base supplémentaire? en parallèle du fichier home-assistant_v2.db?

J’ai vu qu’il y avait possibilité d’accéder à home-assistant_v2.db via la librairie sqlalchemy.
(il y a des intégrations sur le git qui l’utilise)
Par contre, je pense que je n’ai pas encore trouvé le bon tuto :sob:

Non MariaDB ça vient en remplacement du fichier .db

Pour lire une fichier db en python c’est la librairie sqlite3
la connexion sur ce fichier se fait avec sqlite3.connect('monfichierbase.db')

Mais si tu ne peux pas importer de librairie …

super !
ça fonctionne et c’est beaucoup + facile à utiliser que la librairie sqlalchemy
sqlite3 semble une librairie native de python…

reste d’autre bug et je partage mon code :sparkler:

voili voilou
Une requête SQLite pour lire la base de donnée HA et écrire le résultat dans un fichier texte type csv.

# copie de 
#  https://docs.python.org/3/library/sqlite3.html
# le fichier s'execute avec la commande
#   python3 /config/python_scripts/lectureSQLnew.py
#  
logfile = open("scriptSQL.log","w")
import sqlite3

connection_db = sqlite3.connect('home-assistant_v2.db')
curs = connection_db.cursor()

query = """
SELECT entity_id, state, last_updated
FROM states 
WHERE entity_id 
IN ('sensor.mdl_cumul_power', 'sensor.temperature_int', 'sensor.temperature_ext') 
AND ( last_updated > '2022-02-10 00:35' )
"""

for row in curs.execute(query):
   X = row[0] 
   Y = row[1] 
   logfile.write(X +', ' + Y  +'\n')
   print(row[0] + ',' + row[1])

connection_db.close()
logfile.close()

J’aurai plutôt écrit ça comme ceci :

connection_db = sqlite3.connect('home-assistant_v2.db')
query = """
SELECT entity_id, state, last_updated
FROM states 
WHERE entity_id 
IN ('sensor.mdl_cumul_power', 'sensor.temperature_int', 'sensor.temperature_ext') 
AND ( last_updated > '2022-02-10 00:35' )
"""
with connection_db() as cursor:
     cursor.execute(query)
     for row in cursor:
           X = row[0] 
           Y = row[1] 
           logfile.write(X +', ' + Y  +'\n')
           print(row[0] + ',' + row[1])

mais bon l’essentiel est que ton problème soit résolu :smiley:

A+ Fred

c’était mon premier script python donc je teste…

oui je crois que je t’ai raconté une grosse co…erie :smirk: ma façon d’écrire est à partir d’une class ( ça simplifie le code quand tu as beaucoup de requêtes… )

Mais dans ton cas, pour une requête unique, pas besoin de class.

Encore désolé de t’avoir induit en erreur

pas de soucis, j’apprends :wink: