Auteur Sujet: Script python lancé en double, pourquoi  (Lu 8999 fois)

0 Membres et 1 Invité sur ce sujet

Darkjeje

  • Abonné Free adsl
  • *
  • Messages: 592
  • Free VDSL2 Issy-les-Moulineaux (92)
Script python lancé en double, pourquoi
« le: 06 octobre 2020 à 22:40:40 »
Bonjour à tous,

Suite à un plantage de mon raspberry pi, j'ai du tout réinstallé n'ayant pas pensé à l'époque à faire une sauvegarde.

Je rencontre plusieurs problèmes depuis.
Le 1er c'est que mon script Python relatif à ma domotique est lancé deux fois.
Il ne devrait normalement n'être lancé qu'une fois, via un Crontab, or j'ai deux processus, avec pour chacun le processus parent suivant :
Le 1er :   /bin/sh -c sleep 25 && python3 (mon script crontab)
Le 2ème : /sbin/init splash

Je ne m'y connais malheureusement pas assez en Linux pour comprendre comment trouver d'où provient le 2ème lancement et comment y remédier.

Mon second problème, c'est que mon script Python est censé enregistré dans ma base de donnée mysql, tout évènement intervenu sur la domotique de la maison (relevé de température, consommation électrique, allumage/extinction de lumière...), mais la température du bureau ne s'enregistre qu'exceptionnellement.
De plus, certaine commande d'allumage/extinction de lumière ne s'enregistre pas, résultat la base de donnée n'est pas actualisée et je ne peux donc pas utiliser mon site web pour procéder à l'opération inverse d'allumage/exctinction.

Le script python n'a pas évolué, il est excatement le même qu'avant le plantage de mon raspberry. Je suppose donc un problème avec ma base de donnée (accès / ressource processeur...).
Auriez-vous une idée de comment analyser tout ça et y remédier.

Pour info, j'ai testé différent moyen pour remettre ma base de donnée mysql depuis mon ancien raps, en y copiant/collant le contenu du dossier var/lib/mysql. Peut-être ai-je modifier un mauvais paramètre et faudrait-il que je désinstalle proprement mysql et phpmyadmin et tout réinstaller, mais comment ?

Merci par avance pour votre aide !

Darkjeje

  • Abonné Free adsl
  • *
  • Messages: 592
  • Free VDSL2 Issy-les-Moulineaux (92)
Script python lancé en double, pourquoi
« Réponse #1 le: 15 octobre 2020 à 14:57:38 »
Personne ne saurait m'aider ou m'aiguiller vers la solution ?  :-\

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 078
  • Paris (75)
Script python lancé en double, pourquoi
« Réponse #2 le: 15 octobre 2020 à 15:03:41 »
le point de départ serait de nous communiquer le script python. la on a aucune information utile pour t'aider.

pour tes process, fait "ps faux" (en root ou avec sudo) pour en voir un peu plus.

Darkjeje

  • Abonné Free adsl
  • *
  • Messages: 592
  • Free VDSL2 Issy-les-Moulineaux (92)
Script python lancé en double, pourquoi
« Réponse #3 le: 18 octobre 2020 à 14:25:30 »
le point de départ serait de nous communiquer le script python. la on a aucune information utile pour t'aider.

pour tes process, fait "ps faux" (en root ou avec sudo) pour en voir un peu plus.

Tu as raison kgersen.
Je n'ai plus le doublon de processus, mais je ne sais pas ce qui l'a retiré.
Mon script ci-dessous n'a pas évolué depuis le plantage du rasp, raison pour laquelle je soupçonne plus un manque de ressource du raspberry 1 B+ que j'aurai éventuellement optimisé à l'époque, ou une lenteur/bug dans l'enregistrement dans mysql.

J'ai constaté deux problèmes :
- Le 1er est l'enregistrement très rare de la température du bureau dans mysql, alors qu'elle s'enregistre dans le fichier .txt (commande que je viens de rajouter).
Peut-être est-ce dû à la mauvaise découpe du retour du webserveur, car dans le fichier txt, la température du bureau est anormalement enregistrée sur la même ligne, à la suite de la température de la chambre :
1603022422 18/10/2020 14:00:22 : b'*#4*1*0*0229##' (température du salon)
1603022425 18/10/2020 14:00:25 : b'*#4*2*0*0226##*#4*3*0*0226##' (température de la chambre puis du salon)

- Le 2ème problème, c'est que quand je clique sur l'icône d'allumer la lumière d'une pièce, ma page web se recharge plus vite que l'enregistrement dans ma bdd mysql, du changement de statut de ma lumière (on/off). Résultat ma page web m'indique à tort que la lumière n'est pas allumée. J'avais de mémoire ralenti le temps de chargement de la page web pour laisser le temps à mysql de s'actualiser (ou accélérer mysql). Mais je ne sais plus comment j'ai fait.
Et j'ai l'impression que l'enregistrement de l'état de la lumière ne se fait pas toujours, comme pour la température du bureau.

Voici le script. Je te préviens, je débute totalement sur python, et je n'y ai pas touché depuis des mois (hors ajout mentionné ci-dessus).
Je n'y connais donc pas grand-chose et il m'a fallu des mois pour le créer afin que tout fonctionne, en lisant pas mal de doc sur le web et avec l'aide d'utilisateur de python.
Le script est donc très fortement améliorable, mais comme il fonctionnait bien...

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from datetime import date, timedelta, datetime
import re, time, socket, mysql.connector, os, subprocess, logging

# initialize the log settings
logging.basicConfig(filename='/home/pi/Script_Cron_Domotique/log_Enregistrement_evenements.log',level=logging.DEBUG)

AllLumiere='0#'
Allume='1'
Eteindre='0'
LumiereBureau='22'
LumiereChambre='81'
LumiereCuisinePlafonnier='15'
LumiereCuisinePlanDeTravail='16'
LumiereCouloir='11'
LumiereWC='31'
LumiereSalleDeBainPlafonnier='33'
LumiereSalleDeBainMiroir='24'
LumiereSalon='17'

FenetreTiming='*2*1000#'
AllVolet='*5##'
Stop='0'
Ouverture='1'
Fermeture='2'
VoletBureau='52'
VoletChambre='51'
VoletSalon='57'
VoletBalcon='58'

TemperatureSalon='1'
TemperatureChambre='2'
TemperatureBureau='3'

#Périodes de la variable
today = datetime.now()
Y = str(today.year)
m = str(today.month)
d = str(today.day)
H = str(today.hour)
M = str(today.minute)
S = str(today.second)
Date = time.strftime('%Y-%m-%d %H:%M:%S')
Timestamp = time.time()


#Paramètres de la connexion à la base de données Mysql
config = {
    'user': 'XXXXXXXX',
    'password': 'XXXXXXXX',
    'host': 'localhost',
    'database': 'domotique',}

#Paramètres de connexion à la passerelle BUS/SCS
buffer_size = 2048
ip_F455 = '192.168.XXX.XXX'
port_F455 = XXXXX

#ouverture du socket
try:
    s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip_F455,port_F455))
    data=s.recv(buffer_size)
    DataDecode=data.decode('UTF-8')
    print (Date + " : " + DataDecode + " = Retour de connexion")

    s.send(b"*99*1##")#ouverture d'une session COMMAND
    data=s.recv(buffer_size)
    DataDecode=data.decode('UTF-8')
    print (Date + " : " + DataDecode + " = Retour d'ouverture de commande")
    while True:
        data = s.recv(buffer_size)
        DataDecode=data.decode('UTF-8')
        if DataDecode=='':
            s.close()
            break
        else:
            #Périodes de la variable
            today = datetime.now()
            Y = str(today.year)
            m = str(today.month)
            d = str(today.day)
            H = str(today.hour)
            M = str(today.minute)
            S = str(today.second)
            Date = time.strftime('%Y-%m-%d %H:%M:%S')
            Timestamp = time.time()

    # Enregistrement des lumières   
            if DataDecode[0:3] == "*1*":
                if DataDecode[0:8]=="*1*1000#":
                    time.time()
                   
                elif DataDecode[5:7]==AllLumiere:
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' "
                        cursor.execute(loggit)
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' "
                        cursor.execute(loggit)
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                elif DataDecode[5:7]==LumiereBureau: # Bureau
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereBureau))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereBureau))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                elif DataDecode[5:7]==LumiereChambre: # Chambre
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereChambre))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereChambre))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                elif DataDecode[5:7]==LumiereCuisinePlafonnier: # Cuisine plafonnier
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereCuisinePlafonnier))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereCuisinePlafonnier))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                elif DataDecode[5:7]==LumiereCuisinePlanDeTravail: # Cuisine Plan de travail
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereCuisinePlanDeTravail))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereCuisinePlanDeTravail))
                        conn.commit()
                        cursor.close()
                        conn.close()

                elif DataDecode[5:7]==LumiereCouloir: # Couloir
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereCouloir))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereCouloir))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                elif DataDecode[5:7]==LumiereWC: # WC
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereWC))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereWC))
                        conn.commit()
                        cursor.close()
                        conn.close()

                elif DataDecode[5:7]==LumiereSalleDeBainPlafonnier: # Salle de Bain Plafonnier
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereSalleDeBainPlafonnier))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereSalleDeBainPlafonnier))
                        conn.commit()
                        cursor.close()
                        conn.close()

                elif DataDecode[5:7]==LumiereSalleDeBainMiroir: # Salle de Bain Miroir
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereSalleDeBainMiroir))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereSalleDeBainMiroir))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                elif DataDecode[5:7]==LumiereSalon: # Salon
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereSalon))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereSalon))
                        conn.commit()
                        cursor.close()
                        conn.close()
         
                else:
                    print (Date + " : " + DataDecode + " = Commande Lumiere non prise en compte")
                    #Connexion à la Bdd mysql
                    conn = mysql.connector.connect(**config)
                    cursor = conn.cursor()
                    loggit = "INSERT INTO commande_inconnue (date_releve, commande) VALUES (%s, %s)"
                    cursor.execute(loggit, (Date, DataDecode))
                    conn.commit()
                    cursor.close()
                    conn.close()
La suite dans un second poste, j'ai atteint la limite en caractère...

Darkjeje

  • Abonné Free adsl
  • *
  • Messages: 592
  • Free VDSL2 Issy-les-Moulineaux (92)
Script python lancé en double, pourquoi
« Réponse #4 le: 18 octobre 2020 à 14:32:35 »
# Enregistrement des températures ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            elif DataDecode[0:4] == "*#4*":
                time.time()
                Date = time.strftime("%Y-%m-%d %H:%M:%S")
                Timestamp = time.time()
                if DataDecode[4:5]==TemperatureSalon:
                    if DataDecode[6:7]=="0":
                        TemperatureSalonReleve = float(DataDecode[8:12])/10
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "INSERT INTO température_salon (date_releve, temp_salon, timemysql, jour) VALUES (%s, %s, %s, %s)"
                        cursor.execute(loggit, (Date, TemperatureSalonReleve, int(Timestamp), Date))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                        timestamp = int(time.time())
                        mon_fichier = open("/home/pi/Script_Cron_Domotique/Logtemp.txt", "a") #Ouverture/écriture en mode ajout
                        mon_fichier.write(str(timestamp) + " " + time.strftime("%d/%m/%Y %H:%M:%S")+" : "+str(data))
                        mon_fichier.write("\n")
                        mon_fichier.close()

                    else: # Commande température non prise en compte
                        print (Date + " : " + DataDecode + " = Commande température inconnu non prise en compte")
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "INSERT INTO commande_inconnue (date_releve, commande) VALUES (%s, %s)"
                        cursor.execute(loggit, (Date, DataDecode))
                        conn.commit()
                        cursor.close()
                        conn.close()

                   
                elif DataDecode[4:5]==TemperatureChambre:
                    if DataDecode[6:7]=="0":
                        TemperatureChambreReleve = float(DataDecode[8:12])/10                   
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "INSERT INTO température_chambre (date_releve, temp_chambre, timemysql, jour) VALUES (%s, %s, %s, %s)"
                        cursor.execute(loggit, (Date, TemperatureChambreReleve, int(Timestamp), Date))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                        timestamp = int(time.time())
                        mon_fichier = open("/home/pi/Script_Cron_Domotique/Logtemp.txt", "a") #Ouverture/écriture en mode ajout
                        mon_fichier.write(str(timestamp) + " " + time.strftime("%d/%m/%Y %H:%M:%S")+" : "+str(data))
                        mon_fichier.write("\n")
                        mon_fichier.close()

                    else: # Commande température non prise en compte
                        print (Date + " : " + DataDecode + " = Commande Temperature chambre non prise en compte du tout")
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "INSERT INTO commande_inconnue (date_releve, commande) VALUES (%s, %s)"
                        cursor.execute(loggit, (Date, DataDecode))
                        conn.commit()
                        cursor.close()
                        conn.close()


                elif DataDecode[4:5]==TemperatureBureau:
                    if DataDecode[6:7]=="0":
                        TemperatureBureauReleve = float(DataDecode[8:12])/10
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "INSERT INTO température_bureau (date_releve, temp_bureau, timemysql, jour) VALUES (%s, %s, %s, %s)"
                        cursor.execute(loggit, (Date, TemperatureBureauReleve, int(Timestamp), Date))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                        timestamp = int(time.time())
                        mon_fichier = open("/home/pi/Script_Cron_Domotique/Logtemp.txt", "a") #Ouverture/écriture en mode ajout
                        mon_fichier.write(str(timestamp) + " " + time.strftime("%d/%m/%Y %H:%M:%S")+" : "+str(data))
                        mon_fichier.write("\n")
                        mon_fichier.close()

                    else: # Commande température non prise en compte
                        print (Date + " : " + DataDecode + " = Commande Temperature bureau non prise en compte")
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "INSERT INTO commande_inconnue (date_releve, commande) VALUES (%s, %s)"
                        cursor.execute(loggit, (Date, DataDecode))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                else: # Commande température non prise en compte
                    print (Date + " : " + DataDecode + " = Commande Temperature non prise en compte")
                    #Connexion à la Bdd mysql
                    conn = mysql.connector.connect(**config)
                    cursor = conn.cursor()
                    loggit = "INSERT INTO commande_inconnue (date_releve, commande) VALUES (%s, %s)"
                    cursor.execute(loggit, (Date, DataDecode))
                    conn.commit()
                    cursor.close()
                    conn.close()

    s.close()
except Exception as e:
    logging.exception("\n"+"\n"+'Erreur_Enregist_events : ' + time.strftime("%d/%m/%Y à %H:%M:%S")+"\n" + str(e)+"\n"+"\n")
N’hésite pas si tu as des questions, suggestions...

Le script en lui-même ne plante pas, j'en ai un autre qui test son fonctionnement et le relance si nécessaire.

Merci

Jérémy

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 078
  • Paris (75)
Script python lancé en double, pourquoi
« Réponse #5 le: 18 octobre 2020 à 16:08:28 »
hum effectivement c'est du script de débutant mais faut bien commencer un jour :)

déjà je vois un premier souci: tu assumes qu'a chaque tour de boucle (le 'while True'), il n'y a qu'un seul évènement reçu. Tu n'itère pas sur 'data' pour voir combien il contient d'évènements tu pars du principe qu'il y en a toujours qu'un. C'est peut-être pour cela que la temp du salon est ignorée : on dirait qu'elle est envoyé en même temps (dans le meme 'data') que celle de la chambre.

on le voit bien sur la ligne:

1603022425 18/10/2020 14:00:25 : b'*#4*2*0*0226##*#4*3*0*0226##' (température de la chambre puis du salon)
ca correspond a
mon_fichier.write(str(timestamp) + " " + time.strftime("%d/%m/%Y %H:%M:%S")+" : "+str(data))donc
data = *#4*2*0*0226##*#4*3*0*0226##
il y a donc bien 2 évènements dans un même 'data' mais ta boucle ne gère qu'un évènement a la fois.

il te faut introduire une 2eme boucle dans ta boucle principale; pour 'parser' tous les évènements de la variable "data" a chaque (a priori '##' est le délimiteur d'évènement). Vu que tu importe deja 're', tu peux utiliser par exemple re.split("##",data) pour itérer ensuite dessus.

Je te conseille fortement d'utiliser des fonctions dans ton code, tu répète beaucoup de code pour rien. Il y a plein d'autre petits défauts inhérent a un débutant mais ce n'est pas critique.
Egalement coté structure SQL, tu n'a pas besoin d'une table de température par piece, tu peut avoir une seul table 'temperature' avec un champ en plus qui est le nom de la pièce.

Mais bon ces derniers points ne sont pas primordiaux au bon fonctionnement, le 1er l'est.


Darkjeje

  • Abonné Free adsl
  • *
  • Messages: 592
  • Free VDSL2 Issy-les-Moulineaux (92)
Script python lancé en double, pourquoi
« Réponse #6 le: 18 octobre 2020 à 16:54:58 »
il y a donc bien 2 évènements dans un même 'data' mais ta boucle ne gère qu'un évènement a la fois.

il te faut introduire une 2eme boucle dans ta boucle principale; pour 'parser' tous les évènements de la variable "data" a chaque (a priori '##' est le délimiteur d'évènement). Vu que tu importe deja 're', tu peux utiliser par exemple re.split("##",data) pour itérer ensuite dessus.

Merci pour ton analyse kgersen.

En fait, j'ai beaucoup de mal à comprendre le principe des objets dans Python, je me suis arrêté au début dans la programmation, car je ne pouvais gérer la reprise de mes études en cours du soir, plus le boulot, et l'apprentissage de Python.

La partie ci-dessous
Citer
while True:
        data = s.recv(buffer_size)
        DataDecode=data.decode('UTF-8')
        if DataDecode=='':
            s.close()
            break
        else:
m'a été conseillé par des utilisateurs, car je ne savais pas (et ne sais toujours pas), comment récupérez la variable transmise par mon serveur domotique, la découper avec en effet le dénominateur suivant "##" afin de pouvoir ensuite traiter chaque retour séparé en fonction de sa structure.

Je vais me remettre à Python et essayer de corriger cela.

Merci kgersen
« Modifié: 18 octobre 2020 à 17:25:15 par Darkjeje »

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 078
  • Paris (75)
Script python lancé en double, pourquoi
« Réponse #7 le: 18 octobre 2020 à 17:37:28 »
Je te recommande d'apprendre les fonctions et d'en mettre dans ton script, tu devrait passer de plus de 400 lignes a moins de 200...

Ainsi que les dictionnaires, très utiles ici aussi.

Et tu n'a pas besoin d'apprendre la notion d'objet (au sens programmation orienté objet (POO), OOP en anglais).
Du procédurale simple avec fonctions et éventuellement dictionnaires suffit.

Exemple de fonction. Partout ou tu as:

                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = " ..... "
                        cursor.execute(loggit)
                        conn.commit()
                        cursor.close()
                        conn.close()


remplace par
                        loggit = " ..... "
                        commandeSQL(loggit)


et defini la fonction commandeSQL avant le try: principale :

# se connecte et exécute 'commande' sur le serveur sql
def commandeSQL(commande):
  conn = mysql.connector.connect(**config)
  cursor = conn.cursor()
  cursor.execute(commande)
  conn.commit()
  cursor.close()
  conn.close()

#ouverture du socket
try:
....


rien qu'avec ce changement tu vas gagner plus de 100 lignes qui sont répétées pour rien. Ton script sera nettement plus lisible.

Darkjeje

  • Abonné Free adsl
  • *
  • Messages: 592
  • Free VDSL2 Issy-les-Moulineaux (92)
Script python lancé en double, pourquoi
« Réponse #8 le: 18 octobre 2020 à 17:59:41 »
Je te recommande d'apprendre les fonctions et d'en mettre dans ton script, tu devrait passer de plus de 400 lignes a moins de 200...

Ainsi que les dictionnaires, très utiles ici aussi.

Et tu n'a pas besoin d'apprendre la notion d'objet (au sens programmation orienté objet (POO), OOP en anglais).
Du procédurale simple avec fonctions et éventuellement dictionnaires suffit.

Exemple de fonction. Partout ou tu as:

                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = " ..... "
                        cursor.execute(loggit)
                        conn.commit()
                        cursor.close()
                        conn.close()


remplace par
                        loggit = " ..... "
                        commandeSQL(loggit)


et defini la fonction commandeSQL avant le try: principale :

# se connecte et exécute 'commande' sur le serveur sql
def commandeSQL(commande):
  conn = mysql.connector.connect(**config)
  cursor = conn.cursor()
  cursor.execute(commande)
  conn.commit()
  cursor.close()
  conn.close()

#ouverture du socket
try:
....


rien qu'avec ce changement tu vas gagner plus de 100 lignes qui sont répétées pour rien. Ton script sera nettement plus lisible.

Merci kgersen, c'est très clair par ton exemple.

De mon côté j'ai lancé mon script sur mon rasp en ligne de commande et le même (mais sans la partie enregistrement, seulement un print après le try), et je constate que le raps met 3 à 5 secondes pour afficher la commande, contre un affichage instantanné sur mon PC.
Il y a donc surement un problème de ressource sur le rasp.
Tout à l'heure le site web ne s'affichait pas, le rasp était super lent et m'a mis plusieurs dizaines de second avant d'afficher la demande de mot de passe pour ma connexion ssh.

Il y a donc un problème de parsing dans mon script et un problème de ressource sur le rasp qui ne fait pourtant que reverse proxy nginX, script python et site web mono utilisateur.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 078
  • Paris (75)
Script python lancé en double, pourquoi
« Réponse #9 le: 18 octobre 2020 à 20:33:50 »
Il y a donc un problème de parsing dans mon script et un problème de ressource sur le rasp qui ne fait pourtant que reverse proxy nginX, script python et site web mono utilisateur.

je ne vois rien d'inquiétant dans le script concernant les performances si ce n'est que tu ouvre & ferme une connexion SQL pour chaque écriture en base. Si le flot d'évènements est faible ca ne doit pas poser de problème. A moins d'un memory leak ?

Il faut diagnostiquer ce qui se passe dans le Pi, notamment l'utilisation de la mémoire et du cpu. La commande 'top' est la base pour cela, ou sinon installer 'htop' ou mieux encore 'glances'.

C'est quel soft qui fait le site web mono utilisateur ?

Apres un Pi 1b c'est peut-être trop leger pour tout cela  quand meme.

kazyor

  • Expert des Télécoms
  • Expert
  • *
  • Messages: 1 334
  • Lyon 7ème (69)
Script python lancé en double, pourquoi
« Réponse #10 le: 18 octobre 2020 à 21:20:42 »
Apres un Pi 1b c'est peut-être trop leger pour tout cela  quand meme.

Quand même ...
Nginx + pi-hole + MQTT + Zigbee2MQTT + qqs scripts basiques en cron + tunnel SSH, ça tient la charge sans problème.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 078
  • Paris (75)
Script python lancé en double, pourquoi
« Réponse #11 le: 18 octobre 2020 à 21:32:39 »
Quand même ...
Nginx + pi-hole + MQTT + Zigbee2MQTT + qqs scripts basiques en cron + tunnel SSH, ça tient la charge sans problème.

Oui d'où ma question 'quel soft qui fait le site web mono utilisateur'. On ne sait pas trop ce qui tourne dans son Pi.