Partage
  • Partager sur Facebook
  • Partager sur Twitter

declaration variable globale

Sujet résolu
    15 novembre 2019 à 19:11:38

    Hello,

    Tout nouveau sur python, je peine avec la syntaxe, voici une fonction dans laquelle je souhaite faire varier la valeur d'un booleen (ici "first_alert") dans 2 conditions afin d'obtenir 2 comportements différents, mais cela ne fonctionne pas, si vous pouviez me mettre sur la voie

    def scanner(each_capteur, temp):
        global first_alert
    
        if (temp > 30 or temp < 24) and first_alert  False:
            insert_data_req()
            send_alert_mail(True, each_capteur)
            first_alert = True
    
        elif (temp < 30 or temp > 24) and first_alert is True:
            send_alert_mail(False, each_capteur)
            first_alert = False


    merci !

    • Partager sur Facebook
    • Partager sur Twitter
      15 novembre 2019 à 19:33:42

      Les variables globales ne sont généralement pas utiles, pourquoi ne fais tu pas par exemple une classe qui représente tout ton pool de scanner et qui possède un attribut first_alert
      • Partager sur Facebook
      • Partager sur Twitter
        15 novembre 2019 à 20:05:34

        Hello,

        Je ne maitrise pas python en objet du tout, j'ai fait un peu de java et j'avoue être désorienté sur python.

        • Partager sur Facebook
        • Partager sur Twitter
          15 novembre 2019 à 20:29:31

          On peut essayer de voir ensemble les objets dont tu vas avoir besoin et comment les faire. Quels sont les objectifs / contraintes de ton programme ?
          • Partager sur Facebook
          • Partager sur Twitter
            15 novembre 2019 à 20:53:52

            re, c'est vraiment très sympa de ta part, mais j'ai vraiment peur de pas être au niveau surtout par forum interposé !

            Sinon l'énoncé du problème en quelques mots :

            Je dois récupérer la température émise toutes les 30 sec par plusieurs capteurs bluetooth placés sur des vivariums (un capteur par vivarium, je récupère bien les T°)

            Cette température doit être comprise entre 24 et 30° sinon gros problème pour les reptiles qui occupent les vivariums en question !

            Grosso modo, tant que les températures restent dans la fourchette, on ne fait rien (un backup des T° en bdd ttes les heures, mais ça c'est ok aussi), sinon on envoi un mail d'alerte à mr X qui possède les vivariums dès l'instant qu'il y a un écart de T° constaté et on envoie en bdd (sous sqlite)

            Enfin, quand le problème est réglé  (lorsque la où les températures des vivariums reviennent à la normale) on envoi un mail de rétablissement des T° à Mr X (c'est pas ok du tout !)

            Autant en Java, j'aurais été plus à l'aise qu'en python objet...du coup, j'ai déjà avancé sur ce projet pas mal (en procédural comme tu t'en doutes).

            Voilà tu sais tout ! :)

            -
            Edité par Olchiba 15 novembre 2019 à 20:55:15

            • Partager sur Facebook
            • Partager sur Twitter
              16 novembre 2019 à 0:41:40

              Bonsoir,

              Sans aller jusqu'aux classes, peut-être juste partir sur un squelette comme celui ci-dessous

              from time import sleep
              
              MINI_TEMP = 24
              MAXI_TEMP = 30
              
              
              def check_temp():
                  temp = ...  # relever la température
                  if temp not in range(MINI_TEMP, MAXI_TEMP+1):
                      sendmail("...")  # envoi un mail avec le message
                      return False
                  return True
              
              
              def sendmail(message):
                  # à compléter
              
              
              temp_is_ok = True
              while temp_is_ok:
                  temp_is_ok = check_temp()
                  sleep(30)  # attente de 30 secondes
              

              Est-ce que ça aide ? Si non, quel est le problème exactement ? On peut/doit éviter les variables globales sur du code très complexe et important... mais pour un petit code simple, on peut faire exception, car le débuggage sera tout aussi simple.

              • Partager sur Facebook
              • Partager sur Twitter

              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                17 novembre 2019 à 15:59:39

                Bonjour merci pour ta réponse et désolé de répondre si tard...

                Je pense que ton script ne conviendrait pas à mon cas de figure, car si je suis bien ta fonction check_emp est capable d'arrêter la boucle en cas de problème de T° ce qu'il ne faut pas.

                Dans l'énoncé la fonction qui checke les T° doit tourner continuellement, mais met 30 sec à s'exécuter (le temps de scanner tous les capteurs)

                Si il y a une alerte de T° j'envoie un mail d'alerte, lorsque la température revient à la normale, j'envoie un mail de rétablissement du seuil de T°

                POur l'instant j'en suis au point où j'envoie un mail d'alerte toutes les 30 sec à mon client en cas de dépassement de seuil

                • Partager sur Facebook
                • Partager sur Twitter
                  17 novembre 2019 à 16:10:40

                  Olchiba a écrit:

                  POur l'instant j'en suis au point où j'envoie un mail d'alerte toutes les 30 sec à mon client en cas de dépassement de seuil


                  Il y a peu d'adaptation à faire sur mon code pour faire cela, en plus j'ai fais cela à main levée, juste pour en donner le principe, ce n'est donc pas une réponse définitive à un problème.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                  La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                    17 novembre 2019 à 16:41:19

                    J'ai essayé de raisonner sur la comparaison de T° à n et T n-1

                    Si la T° précédente et normale et la t° courante en alerte ->envoi mail, je traite le cas où il n'y a pas encore de T° précédente de relevée

                    Si T° précédente anormale mais T° courante normale -> envoi mail de rétablissement

                    Je testerai en cours demain

                    def scanner(each_capteur, current_temp, previous_temp):
                    
                        if (current_temp > 30 or current_temp < 24) and ((previous_temp is None) or (previous_temp < 30 and previous_temp > 24)):
                            insert_data_req()
                            send_alert_mail(True, each_capteur)
                    
                    
                        elif (current_temp < 30 and current_temp > 24) and ((previous_temp is None) or (previous_temp > 30 or previous_temp < 24)):
                            send_alert_mail(False, each_capteur)


                    Ca enlève les booleens que je n'arrive pas à manipuler dans mon premier post

                    -
                    Edité par Olchiba 17 novembre 2019 à 16:42:05

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 novembre 2019 à 17:22:50

                      J'ai pas compris, mais pour moi la modification est bien plus simple,

                      from time import sleep
                       
                      MINI_TEMP = 24
                      MAXI_TEMP = 30
                       
                       
                      def check_temp():
                          temp = ...  # relever la température
                          if temp not in range(MINI_TEMP, MAXI_TEMP+1):
                              sendmail("...")  # envoi un mail avec le message
                      
                      
                      def sendmail(message):
                          # à compléter
                       
                       
                      while True:
                          check_temp()
                          sleep(30)  # attente de 30 secondes



                      • Partager sur Facebook
                      • Partager sur Twitter

                      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                        18 novembre 2019 à 9:10:43

                        Hello,
                        Le problème je pense dans ce script c'est que tu envoies des mails tant que le retour à la normale des températures n'est pas résolu
                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 novembre 2019 à 9:32:35

                          Olchiba a écrit:

                          POur l'instant j'en suis au point où j'envoie un mail d'alerte toutes les 30 sec à mon client en cas de dépassement de seuil


                          Olchiba a écrit:

                          Le problème je pense dans ce script c'est que tu envoies des mails tant que le retour à la normale des températures n'est pas résolu


                          C'est pourtant ce que j'ai cru comprendre, selon la 1ère citation.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                            18 novembre 2019 à 9:58:42

                            En effet, je me suis mal exprimé...Le truc c'est que une fois que le mail d'alerte est envoyé il ne faut plus en envoyer avant le retour à la normale des T°, sinon l'utilisateur se retrouve inondé de mails tant que le problème de t° n'est pas résolu.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 novembre 2019 à 14:12:43

                              Ok, cela te semble-t-il difficile de faire cette modification à partir de mon code ?

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                18 novembre 2019 à 16:04:20

                                Du coup je vais y réfléchir ce soir, le prof m'a jeté avec mon code précédent...
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  18 novembre 2019 à 19:22:49

                                  Ok, après on peut mettre ça sous la forme d'informations mail, avec un flag pour indiquer si oui ou non le mail a été envoyé, quelque chose du style

                                  from time import sleep
                                  
                                  MINI_TEMP = 24
                                  MAXI_TEMP = 30
                                  INFO_MAIL = {
                                      'sender': '...',
                                      'recipient': '...',
                                      'envoy': False,
                                      '...', '...'
                                  }
                                  
                                  
                                  def check_temp():
                                      temp = ...  # relever la température
                                      if temp not in range(MINI_TEMP, MAXI_TEMP+1):
                                          sendmail("...")  # envoi un mail avec le message
                                          INFO_MAIL['envoy'] = True
                                      else:
                                          INFO_MAIL['envoy'] = False
                                  
                                  
                                  def sendmail(message):
                                      if not INFO_MAIL['envoy']:
                                          # ...
                                  
                                  
                                  while True:
                                      check_temp()
                                      sleep(30)  # attente de 30 secondes



                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                  La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                    25 novembre 2019 à 22:18:59

                                    Salut, je ne vois ton message que maintenant.

                                    Du coup j'ai réussi à trouver comment déclarer ma variable, mais e prof a dit que c'était un mauvais code...Je n'avais pas trouvé autre chose...

                                    first_alert_temp = False
                                    
                                    # scanner() manages the sending of mail and data backup in case of temperature alert
                                    def scanner(each_capteur, temp):
                                        global first_alert_temp
                                        if (temp < 24 or temp > 30) and (first_alert_temp is False):
                                            insert_data_req()
                                            send_alert_mail(True, each_capteur)
                                            first_alert_temp = True
                                    
                                        elif (temp > 24 and temp < 30) and (first_alert_temp is True):
                                            send_alert_mail(False, each_capteur)
                                            first_alert_temp = False



                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      25 novembre 2019 à 22:37:13

                                      Et donc ? Que comptes-tu faire ?
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                        27 novembre 2019 à 20:17:02


                                        Bah rien j'ai été noté du coup, le mal est fait, j'ai plus qu'à m'améliorer pour la prochaine fois. Les délais de rendu étaient très courts et je n'avais jamais fait de python....

                                        Je mets en résolu pour stopper le débat, merci encore

                                        -
                                        Edité par Olchiba 27 novembre 2019 à 20:20:25

                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        declaration variable globale

                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                        • Editeur
                                        • Markdown