Go Down

Topic: Gmail notifier sans Ethernet Shield (Read 5133 times) previous topic - next topic

chicotore

Bonjours a tous,

Je début dans Arduino et ses dérivés et je souhaiterais monter dans le futur une install domotique mais pour le moment je souhaite faire un projet tout simple et pourtant je galère pas mal  :smiley-zipper:
Je souhaiterais donc pour le moment réaliser le Gmail-notifier avec une LED . J'ai vu que cela étais réalisable avec un code python, mais c'est tout nouveau pour moi ce truc ....

J'ai donc récupéré ce code, ce dernier permet de créer un avertisseur de Gmail:

Code: [Select]
import serial, sys, feedparser
#Settings - Change these to match your account details
USERNAME="xxxx@gmail.com"
PASSWORD="xxxxxxx"
PROTO="https://"
SERVER="mail.google.com"
PATH="/gmail/feed/atom"
SERIALPORT = "/dev/tty.usbserial-COM3" # Change this to your serial port!
# Set up serial port
try:
ser = serial.Serial(SERIALPORT, 9600)
except serial.SerialException:
print "no device connected - exiting"
sys.exit()

newmails = int(feedparser.parse(PROTO + USERNAME + ":" + PASSWORD + "@" + SERVER + PATH)["feed"]["fullcount"])
 
# Output data to serial port
if newmails > 0:
ser.write("m")
print "some mail"
else:
ser.write("n")
print "no mail"
#print data to terminal


# Close serial port
ser.close()


Le soucis est que le code python ne fonctionne pas, il ne trouve pas le "serial"  :~ j'ai bien sur mis mon adresse Gmail et mon MDP

Pour l'arduino j'ai trouvé ce code:

Code: [Select]
// led wired + to pin 13, resistor to positive +5v

int outPin = 13; // Output connected to digital pin 12
int mail = LOW; // Is there new mail?
int val; // Value read from the serial port
void setup()
{
pinMode(outPin, OUTPUT); // sets the digital pin as output
Serial.begin(9600);
Serial.flush();
mail = HIGH; // start off with lights out
}

void loop()
{
// Read from serial port
if (Serial.available())
{
  val = Serial.read();
  Serial.println(val, BYTE);

  if (val == 110) // n = 110 in dec
  {
    mail = HIGH;  // HIGH is off because led is connected to +5v on the other side
  }

  else if (val == 109) //109 = m in dec
  {
    mail = LOW; // LOW is on because led is connected to +5v on the other side
  }
}

// Set the status of the output pin
digitalWrite(outPin, mail);
}


Apparemment ce code devrais être bon  8)

Donc merci a vous de m'aiguiller sur le soucis du code python car j'ai cherché et pour le moment j'ai rien trouvé ....

Le prochain projet sera de commander une LED (on/off) a partir d'un autre PC grâce a un code python, ça risque encore de pas être de la tarte :/

merci
Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

fdufnews

Quote
SERIALPORT = "/dev/tty.usbserial-COM3" # Change this to your serial port!

Tu es sous Linux?

Il faut adapter le nom du périphérique suivant l'OS utilisé.

chicotore

#2
Mar 05, 2011, 01:25 pm Last Edit: Mar 05, 2011, 01:28 pm by chicotore Reason: 1
Non je suis sous win7 c'est pour ça que j'avais mis a la fin "COM3" car mon arduino est sur le port usb nomé COM3 ....

Code: [Select]
"/dev/tty.usbserial-COM3"

Je doit donc mettre quoi à la place de ça ? juste COM3 ?

merci beaucoup

PS:

Code: [Select]
ser = serial.Serial(SERIALPORT, 9600)

a la place de SERIALPORT faut-il aussi que je mette COM3 ou je laisse SERIALPORT ? merci
Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

Darel

#3
Mar 05, 2011, 02:00 pm Last Edit: Mar 05, 2011, 02:07 pm by Darel Reason: 1
Pour checker tes mail en python, c'est plus propre de passer par le protocole IMAP.
Actives le dans les paramètres de ton compte, puis voilà une fonction que tu pourras adapter en y ajoutant le serial...

Code: [Select]
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import imaplib
import re
import time

# -------------------------------------------------------------------------------------------------------- #

server = 'imap.gmail.com'
port = 993
ssl = True

user = 'adresseemail@gmail.com'
password = 'tonmotdepasse'

delay = 5

# -------------------------------------------------------------------------------------------------------- #

def check_unread_number (server, port, ssl, user, password):
try:
if ssl:
connection = imaplib.IMAP4_SSL(server, port)
else:
connection = imaplib.IMAP4(server, port)
except:
return {'status' : False, 'error' : u'Unable to connect to server !'}
else:
try:
connection.login(user, password)
except:
return {'status' : False, 'error' : u'Bad login !'}
else:
try:
reply = connection.status('INBOX', '(UNSEEN)')
except:
return {'status' : False, 'error' : u'Unable to read INBOX content !'}
else:
number = re.findall('[0-9]+', reply[1][0])
if len(number) == 1:
return {'status' : True, 'number' : int(number[0])}
else:
return {'status' : False, 'error' : u'Bad result after string manipulation !'}

# -------------------------------------------------------------------------------------------------------- #

while True:
values = check_unread_number(server, port, ssl, user, password)

if values['status']:
print values['number']
else:
print 'ERROR : ' + values['error']

time.sleep(delay)


Et tu peux modifier la condition dans la boucle, genre si il y a des mails, tu envois 1 (allume la LED verte et éteint la rouge) au lieu d'afficher le nombre, 0 si aucun (éteint la LED verte et la LED rouge) et 2 si une erreur (éteint la verte et allume la rouge).
Au moins, même si erreur de connexion...

EDIT : SERIALPORT est une variable.
Tu dois la changer par la valeur... Soit ton port COM, mais étant sous Linux je ne peux pas t'aider pour ça.
Regarde sur Google, tu dois trouver facilement je pense.

chicotore

Merci a toi mais en fait j'ai découvert python depuis hier et encore le code que j'ai posté je vois a peut prêt le cheminement, autant le tient  :smiley-eek: outchh c'est complexe  :(

Je croit que je vais finnalement investir dans un ethernet shield, ça m'a l'air bien plus simple que de passer par un "truc" en python  ^_^

J'ai cherché pour les ports mais a chaque fois c'est pour Linux, jamais sous windows :/

merci +++
Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

Darel

C'est dommage, python est un langage formidable :) !
Je te file un lien au cas ou un jour (J'ai appris les base en 2 jours avec, et depuis... J'ai du mal à m'en passer :P !) :
http://www.swaroopch.com/notes/Python_fr:Table_des_Mati%C3%A8res
Python + Arduino, je peux te dire que c'est de la pure tuerie :D !

Après, à chaque problème, il est vrai qu'il existe différentes solutions, certaines plus simple que d'autres.
J'ai regardé un peu pour le port COM sur Windows, je pense que oui, COM3 doit passer.
Cf. : http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1235512781

Bonne continuation.

chicotore

Voila l'erreur obtenu :

Code: [Select]
Traceback (most recent call last):
  File "C:\Python27\checkgmail.py", line 1, in <module>
    import serial, sys, feedparser
ImportError: No module named serial


En lançant ce code:

Code: [Select]
import serial, sys, feedparser
#Settings - Change these to match your account details
USERNAME="xxxxxxxxx@gmail.com"
PASSWORD="xxxxxxxx"
PROTO="https://"
SERVER="mail.google.com"
PATH="/gmail/feed/atom"
SERIALPORT = "COM3" # Change this to your serial port!
# Set up serial port
try:
ser = serial.Serial(COM3, 9600)
except serial.SerialException:
print "no device connected - exiting"
sys.exit()

newmails = int(feedparser.parse(PROTO + USERNAME + ":" + PASSWORD + "@" + SERVER + PATH)["feed"]["fullcount"])
   
# Output data to serial port
if newmails > 0:
ser.write("m")
print "some mail"
else:
ser.write("n")
print "no mail"
#print data to terminal


# Close serial port
ser.close()
Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

Darel

Le module serial n'est pas installé pour ta version de python.
Normal que ça ne marche pas :P !
Il faut que tu aile voir du coté de : http://sourceforge.net/projects/pyserial/files/pyserial/2.5/
Télécharge pyserial-2.5.win32.exe, installe le, et normalement... Magie !

fdufnews


chicotore

#9
Mar 06, 2011, 11:07 am Last Edit: Mar 06, 2011, 11:23 am by chicotore Reason: 1
Ah merci  :)

Il me manquait donc bien pyserial et feedparser que je vient d'installer et le code se lance enfin a peut prêt  :)

Il me reste l'histoire des ports a solutionner, je vais lire le petit truc sur pyserial histoire de trouver la soluce

Code: [Select]
Traceback (most recent call last):
 File "C:\Python27\checkgmail.py", line 11, in <module>
   ser = serial.Serial(COM3, 9600)
NameError: name 'COM3' is not defined


merci

PS: bon apparement c'est bien COM3 qu'il faut mettre pourtant .... Il n'y aurait pas un paramètre a régler dans pyserial par hasard pour "router" les ports COM ou quelque chose dans le genre ?

merci a vous et désolé avec mes questions de noobs  :(
Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

Darel

La par contre, je suis incapable de te répondre.

Dis toi que l'on commence tous un jour, donc forcément, on y passe tous par cette phase de "noob"...
Mais il ne faut pas oublier que Google est là avant de poster sur les forums !

Bonne continuation.

Epy

Attention chicotore, si tu es sous Windows (apparemment ?) ce n'est pas
Code: [Select]
SERIALPORT = "/dev/tty.usbserial-COM3" # Change this to your serial port!
/dev/tty.usbserial-COM3 devient autre chose sous Windows, je ne sais plus quoi en revanche ça m'échappe, désolé
J'ai l'impression que c'est ça que tu as laissé ?
Le gestionnaire de périphérique te dit certainement où est branché l'arduino, COM3 aussi d'après ce que tu dis.

chicotore

Salut,

J'ai mis ça en fait:
Code: [Select]
SERIALPORT = "COM3" # Change this to your serial port!

C'est ce qui été écrit dans le "FAQ" de pyserial mais a priori ça marche pas :/ je retourne a chercher sur google au cas ou j'aurais zapé un truc  :(

merci
Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

chicotore

Bon bah voila ça fonctionne, j'ai retaper COM3 et cette fois il c'est mis en vert et ça "fonctionne"  ;)

Reste un soucis, il fonctionne sous le GUI python avec "Run module" mais si je le lance dans la console python ça plante grrrrrr



Le fait qu'il ne tourne que dans le GUI ne me dérange pas trop mais en fait il ne fait qu'un seul "checkmail" et ensuite s'arrête, j'aimerais bien qu'il tourne constamment moi pour checker mes mails toute la journée .... Est ce que cela vient du fait que le code soit lancé dans le GUI et non dans la console ? ou cela vient du code python auquel il faudrait intégré un "loop" ?

J'ai aussi refait un code pour l'arduino car a la base la LED est allumé et elle s'éteint brièvement lorsqu'un mail arrive. Moi je cherche a faire en sorte que la LED reste éteinte (ça c'est ok ) et quelle clignote lorsqu'un mail arrive et qu'elle reste clignotante jusqu'à ce que le mail soit supprimé ...

Quote
// led wired + to pin 12, resistor to positive +5v

int outPin = 13; // Output connected to digital pin 12
int mail = LOW; // Is there new mail?
int val; // Value read from the serial port
void setup()
{
pinMode(outPin, OUTPUT); // sets the digital pin as output
Serial.begin(9600);
Serial.flush();
mail = LOW; // start off with lights out
}

void loop()
{
// Read from serial port
if (Serial.available())
{
   val = Serial.read();
   Serial.println(val, BYTE);

   if (val == 110) // n = 110 in dec
   {
     mail = HIGH;  // HIGH is off because led is connected to +5v on the other side
   }

   else if (val == 109) //109 = m in dec
   {
     mail = LOW; // LOW is on because led is connected to +5v on the other side
     delay(1000);
     mail = HIGH; // LOW is on because led is connected to +5v on the other side
     delay(1000);
}
}

// Set the status of the output pin
digitalWrite(outPin, mail);
}


Le soucis est que ma LED est bien éteinte en permanence mais a l'arrivé d'un mail elle s'allume une seul fois et ensuite elle ce ré-éteins alors que j'ai mis une fonction de clignotement dedans et en boucle ....

merci a vous
Mon Blog sur l'environnement Arduino ... Tutos fait par un débutant pour les débutants ^^

http://chicowebsite.free.fr/

Darel

1. C'est pas comme ça qu'on lance un script Python.
Ajoute le répertoire d'installation de Python à ton PATH (une variable d'environnement), ensuite pour lancer le script :
Code: [Select]
python C:\Python27\checkgmail.py
Et pour faire encore mieux, regarde pour le mettre en service Windows, ça permet de le lancer automatiquement au démarrage, et en tâche de fond (pas de fenêtre de l'invite de commande...).

2. C'est exactement ce que fait mon programme, dans le tiens il te manque une boucle infinie avec un sleep (une sorte de "delay" comme sur l'Arduino).

Go Up