Pages: [1] 2 3   Go Down
Author Topic: Gmail notifier sans Ethernet Shield  (Read 4394 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 451
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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"  smiley-confuse j'ai bien sur mis mon adresse Gmail et mon MDP

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

Code:
// 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  smiley-cool

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
Logged

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

http://chicowebsite.free.fr/

France
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3511
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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é.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 451
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
"/dev/tty.usbserial-COM3"

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

merci beaucoup

PS:

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

a la place de SERIALPORT faut-il aussi que je mette COM3 ou je laisse SERIALPORT ? merci
« Last Edit: March 05, 2011, 07:28:30 am by chicotore » Logged

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

http://chicowebsite.free.fr/

Toulouse - FRANCE
Offline Offline
Newbie
*
Karma: 0
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#!/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.
« Last Edit: March 05, 2011, 08:07:48 am by Darel » Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 451
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-sad

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  smiley-kitty

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

merci +++
Logged

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

http://chicowebsite.free.fr/

Toulouse - FRANCE
Offline Offline
Newbie
*
Karma: 0
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est dommage, python est un langage formidable smiley !
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 smiley-razz !) :
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 smiley-grin !

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.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 451
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Voila l'erreur obtenu :

Code:
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:
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()
Logged

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

http://chicowebsite.free.fr/

Toulouse - FRANCE
Offline Offline
Newbie
*
Karma: 0
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Le module serial n'est pas installé pour ta version de python.
Normal que ça ne marche pas smiley-razz !
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 !
Logged

France
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3511
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Et là tu as l'aide Pyserial : http://pyserial.sourceforge.net/

Et là plus spécifiquement l'ouverture d'un port : http://pyserial.sourceforge.net/pyserial_api.html
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 451
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ah merci  smiley

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

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

Code:
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  smiley-sad
« Last Edit: March 06, 2011, 05:23:23 am by chicotore » Logged

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

http://chicowebsite.free.fr/

Toulouse - FRANCE
Offline Offline
Newbie
*
Karma: 0
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 68
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Attention chicotore, si tu es sous Windows (apparemment ?) ce n'est pas
Code:
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.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 451
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut,

J'ai mis ça en fait:
Code:
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  smiley-sad

merci
Logged

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

http://chicowebsite.free.fr/

Offline Offline
Sr. Member
****
Karma: 0
Posts: 451
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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
Logged

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

http://chicowebsite.free.fr/

Toulouse - FRANCE
Offline Offline
Newbie
*
Karma: 0
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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).
Logged

Pages: [1] 2 3   Go Up
Jump to: