par , 10/03/2016 à 16h27 (921 Affichages)
A la maison j’ai un Raspberry Pi qui avec une tache CRON envoi des valeurs de température dans une base de données sur un serveur VPS. http://rasp-pi.fr.nf/mon-dashscreen/
J’ai intallé une verification sur le Raspberry Pi pour la connexion internet. Si la connexion est perdu plus de 5 minutes il reboot. Mais il arrive que la connexion soit bonne mais qu’aucune info ne soit envoyée sur la base SQL du serveur VPS distant.
Donc j’ai fait ce code en Python. Dans un premier temps il récupère la dernière valeur dans une table de la base des températures. Il faut que cette valeur soit enregistrée avec une colonne DateTime pour récupérer l’heure de la dernière entrée.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
def connexSQL(paramMysql, sql, colonne):
try:
# On créé une conexion MySQL
conn = MySQLdb.connect(**paramMysql)
# On créé un curseur MySQL
cur = conn.cursor(MySQLdb.cursors.DictCursor)
# On exécute la requête SQL
cur.execute(sql)
# On récupère toutes les lignes du résultat de la requête
rows = cur.fetchall()
# On parcourt toutes les lignes
for row in rows:
# Pour récupérer les différentes valeurs des différents champs
dateDerniere = row[colonne]
return dateDerniere
except MySQLdb.Error, e:
# En cas danomalie
print « Error %d: %s » % (e.args[0],e.args[1])
sys.exit(1)
finally:
# On ferme la connexion
if conn:
conn.close() |
Ensuite on ajoute un delta. Dans mon cas les infos arrivent dans la table toutes les 5 minutes donc j’ajoute 20 mn et si avec cette heure je suis inférieur à l’heure actuelle c’est qu’il y a un problème sur le Raspberry.
1 2 3 4 5 6 7 8
|
# On recupère lheure de la derniere donnée entrée dans la table
dateDerniere = connexSQL(paramMysql, sql, colonne)
#Date et heure maintenant
deSuite = datetime.datetime.now()
#calcul du delta pour savoir si le serveur envoi toujours des données
delta = datetime.timedelta(minutes=delais) |
J’ai ajouté la possibilité d’envoyer un mail quand tout va bien et quand quelque chose ne marche pas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
# Envoi mail
def sendEmail(email_from, email_to, subject, text, smtp, portSmtp, mailLogin, passLogin):
msg = MIMEText(text)
msg[Subject] = subject
msg[From] = email_from
msg[To] = email_to
s = smtplib.SMTP(smtp, portSmtp)
s.ehlo()
s.starttls()
s.ehlo()
s.login(mailLogin, passLogin)
s.sendmail(email_from,[email_to],msg.as_string())
s.quit() |
Et bien sur si cela ne va pas il y a un reboot du Raspberry Pi par une connexion SSH.
1 2 3 4 5 6 7
|
# Connexion SSH pour le reboot
def rebootSSH(hostSSH, userSSH, passWordSSH):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostSSH, username=userSSH, password=passWordSSH)
ssh.exec_command(« sudo reboot ») |
Pour l’utilisation il faut entrèe les host, login et mots de passe pour La connexion à la base de données, le mail et le SSH. Il est possible de mettre les mail à False pour éviter de recevoir un mail par heure.
Vous trouverez le fichier complet et le fichier de configuration ici : https://github.com/Michelgard/Python...erveur_par_SQL
Pour finir une tache CRON toutes les 1/2 heures :
1 2
|
/usr/bin/python /var/www/tache_cron/verifSQLserveur/verifSQLserveur.py >> /var/www/tache_cron/erreur_log/cron_verifSQLserveur.log 2>&1 |
Michel
http://rasp-pi.fr.nf