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
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
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).
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.
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)
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
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.
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)
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
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
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)
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.
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)
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.
Ok, cela te semble-t-il difficile de faire cette modification à partir de mon code ?
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)
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
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)
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
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)
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
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.
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)
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)
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)
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)
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)
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)
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)