[resolu]probleme lancement script python

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

zeverybest
Raspinaute
Messages : 136
Enregistré le : sam. 18 oct. 2014 19:09

[resolu]probleme lancement script python

Message par zeverybest » mar. 23 déc. 2014 22:15

Bonjour a tous

J'ai un probleme avec un script python :

Mon script vient verifier si un evenement est present dans un agenda Google et, en fonction, actionne ou non un relais

mon script fonctionne tres bien en ligne de commande (sans erreur)

Comme il a besoin d'etre executer toute les minutes, j'ai ajouté une ligne dans le CRON, et là, ça ne fonctionne plus (mon script n'est pas executé)

Lorsqu'il etait prevu pour l'API google V2, il fonctionnait tres bien, mais depuis que je l'ai modifié pour l'API V3, l ne fonctionne plus

J'ai fait un autre script tout con qui allume et eteint une LED pour voir, et là, cela fonctionne

Comment savoir ce qui peut poser probleme dans mon script?

Si quelqu'un a une idée...
Modifié en dernier par zeverybest le sam. 27 déc. 2014 09:12, modifié 1 fois.

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: probleme lancement script python

Message par Manfraid » mer. 24 déc. 2014 09:00

Pourrais-tu mettre tes sources pour que je puisse t'aider
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

zeverybest
Raspinaute
Messages : 136
Enregistré le : sam. 18 oct. 2014 19:09

Re: probleme lancement script python

Message par zeverybest » mer. 24 déc. 2014 11:39

Biensur

Ne pas trop critiquer la syntaxe et la presentation, je suis nul la dedans :lol: :lol: :lol:

Les different "PRINT" ne sont la que pour servir de drapeau et analyser le comportement

La seule réelle action de ce script est la commande des GPIO

Merci d'avance

Code : Tout sélectionner

#!/usr/bin/python3.2

import RPi.GPIO as GPIO
import os
import time
#import gdata.calendar.service  
#import gdata.calendar 
#import atom.service
#import atom
#import gdata.service 
import datetime
import MySQLdb
import httplib2

from RPi import GPIO

from apiclient.discovery import build
from oauth2client.file import Storage
from oauth2client.client import AccessTokenRefreshError
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.tools import run_flow
from oauth2client.client import flow_from_clientsecrets

GPIO.setmode (GPIO.BOARD)
GPIO.setup(15,GPIO.OUT)
GPIO.setup(16,GPIO.OUT)
GPIO.setup(18,GPIO.OUT)
GPIO.setup(21,GPIO.OUT)


#parametre de connexion au compte google pour recuperer l'agenda

#cal_client = gdata.calendar.service.CalendarService()  
#cal_client.email = "user@gmail.com"  
#cal_client.password = "mdp"  
#cal_client.source = 'Google-Calendar_Python_Sample-1.0'  
#cal_client.ProgrammaticLogin()  
      		


#definition de la categorie pour les log
cat='Piscine'
#pompemarche=0
#evenement=0

#connexion a la base SQL
mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")
mycursor=mydb.cursor()

#recuperation du mode de fontionnement dans la base SQL

mycursor.execute('SELECT pompe FROM variables WHERE ID=1')
enr=mycursor.fetchall()
for row in enr:
	for col in row :
		pompe=col
		pompe=int(pompe)
print(pompe)

#recuperation de l'etat actuelle de la pompe
mycursor.execute('SELECT pompemarche FROM variables WHERE ID=1')
enr=mycursor.fetchall()
for row in enr:
	for col in row :
		pompemarche=col
		pompemarche=int(pompemarche)
print(pompemarche)

#recuperation de l'etat precedent de la pompe
mycursor.execute('SELECT etatpompe FROM variables WHERE ID=1')
enr=mycursor.fetchall()
for row in enr:
	for col in row :
		evenement=col
		evenement=int(evenement)
print(evenement)

mycursor.close()
mydb.close()
	

if pompe==1:    #si la pompe passe a l'arret, inscription dans les log
	pompemarche=0
	mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")
	mycursor=mydb.cursor()
	mycursor.execute ('UPDATE variables SET pompemarche=0 WHERE ID=1')
	mydb.commit()
	mycursor.close()
	mydb.close()	
	GPIO.output (21, True) # et arret de la pompe
	GPIO.output (15, True)
	GPIO.output (16, False)
	GPIO.output (18, False)

elif pompe==2:   #si la pompe passe en marche programme

        GPIO.output (15, False)
	GPIO.output (16, True)
	GPIO.output (18, False)	

        #verification de l'agenda du jour pour voir si il y a des evenements prevus	
	
        scope = 'https://www.googleapis.com/auth/calendar'
        flow = flow_from_clientsecrets('client_secret.json', scope=scope)

        storage = Storage('credentials.dat')
        credentials = storage.get()

        class fakeargparse(object):  # fake argparse.Namespace
            noauth_local_webserver = True
            logging_level = "ERROR"
        flags = fakeargparse()

        if credentials is None or credentials.invalid:
            credentials = run_flow(flow, storage, flags)

        http = httplib2.Http()
        http = credentials.authorize(http)
        service = build('calendar', 'v3', http=http)

        # get the next 12 hours of events
        epoch_time = time.time()
        print epoch_time
        start_time = epoch_time - 3600  # 1 hour ago
        end_time = epoch_time + 12 * 3600  # 12 hours in the future
        tz_offset = - time.altzone / 3600
        if tz_offset < 0:
            tz_offset_str = "-%02d00" % abs(tz_offset)
        else:
            tz_offset_str = "+%02d00" % abs(tz_offset)

        start_time = datetime.datetime.fromtimestamp(start_time).strftime("%Y-%m-%dT%H:%M:%S") + tz_offset_str
        end_time = datetime.datetime.fromtimestamp(end_time).strftime("%Y-%m-%dT%H:%M:%S") + tz_offset_str
        #start_time = datetime.datetime.now()
        #end_time = datetime.datetime.now()
        print "Getting calendar events between: " + start_time + " and " + end_time

        print start_time
        print end_time

        events = service.events().list(calendarId='id@group.calendar.google.com', timeMin=start_time, timeMax=end_time, singleEvents=True).execute()
        #pprint.pprint(events)
        for event in events['items']:
            print event["summary"]
            print event["start"]
            str_date_deb=event["start"]
            print str_date_deb
            print type (str_date_deb)
            print event["end"]
            str_date_fin=event["end"]
            print str_date_fin

            str_date_deb=str(str_date_deb)
            date_deb = datetime.datetime(int(str_date_deb[16:20]) , int(str_date_deb[21:23]), int(str_date_deb[24:26]), int(str_date_deb[27:29]), int(str_date_deb[30:32]), int(str_date_deb[33:35]))  
 
            str_date_fin=str(str_date_fin)
            date_fin = datetime.datetime(int(str_date_fin[16:20]) , int(str_date_fin[21:23]), int(str_date_fin[24:26]), int(str_date_fin[27:29]), int(str_date_fin[30:32]), int(str_date_fin[33:35]))  

            print date_deb
            print date_fin 

     
    
            maintenant=datetime.datetime.now()
            maintenant=str(maintenant)
            print maintenant
            la = datetime.datetime(int(maintenant[0:4]) , int(maintenant[5:7]), int(maintenant[8:10]), int(maintenant[11:13]), int(maintenant[14:16]), int(maintenant[17:19]))  
            #maintenant=maintenant[0:19]
            #maintenant=datetime.datetime(int(maintenant))
            #print maintenant
            print la




	    #inscription dans les log du la mise en marche programme
	    evenement=0
	    mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")
	    mycursor=mydb.cursor()
	    mycursor.execute ('UPDATE variables SET etatpompe=0 WHERE ID=1')
	    mydb.commit()
	    mycursor.close()	
	    print(evenement)
	
            if ((date_deb<=la) and (date_fin>=la)):  #si on se trove pendant un evenement
                print 'action en cours'
	        #print ("Cons.:",event.title.text) 
		print pompemarche
		print ('en periode')
		#pompemarche=1
		evenement=1 #enregistrement de l'etat de la pompe pour le prochain test
		mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")   #log du demarrage du programme
		mycursor=mydb.cursor()
		mycursor.execute ('UPDATE variables SET etatpompe=1 WHERE ID=1')
		mydb.commit()
		mycursor.close()	
		print(evenement)
		#GPIO.output (21, False)
		#break

            else:    # si on est hors periode
                print 'pas d action'
		print ('hors periode')
		#pompemarche=0
		#evenement=0
		#GPIO.output (21, True)
		#break

         
		
					
					

		
	if evenement==1 :   # si la pompe doit marcher
		if pompemarche==0 :    #mais qu'elle etait arrete jusqu'a maintenant on log le demarrage
			print ('demarrage programme')
			j= time.strftime('%d-%m-%Y')
			h=time.strftime('%H:%M:%S')
			m='demarrage programme'
			mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")
			mycursor=mydb.cursor()
			mycursor.execute ('INSERT INTO log (jour, heure, categorie, action) VALUES (%s,%s,%s,%s)',(j,h,cat,m))
			mydb.commit()
			mycursor.close()
		pompemarche=1
		#print ('arret systeme pompe')
		mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")  #et on confirme qu'elle est en marche
		mycursor=mydb.cursor()
		mycursor.execute ('UPDATE variables SET pompemarche=1 WHERE ID=1')
		mydb.commit()
		mycursor.close()
		GPIO.output (21, False)  #on met la pompe en marche

	elif evenement==0:  #si la pompe doit etre a l'arret
		if pompemarche==1 : #et qu'elle etait en marche precedemment, on log la mise a l'arret
			print ('arret programme')
			j= time.strftime('%d-%m-%Y')
			h=time.strftime('%H:%M:%S')
			m='arret programme'
			mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")
			mycursor=mydb.cursor()
			mycursor.execute ('INSERT INTO log (jour, heure, categorie, action) VALUES (%s,%s,%s,%s)',(j,h,cat,m))
			mydb.commit()
			mycursor.close()
		pompemarche=0  #on confirme qu'elle est arrete
		#print ('arret systeme pompe')
		mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")
		mycursor=mydb.cursor()
		mycursor.execute ('UPDATE variables SET pompemarche=0 WHERE ID=1')
		mydb.commit()
		mycursor.close()
		GPIO.output (21, True)   #on arrete la pompe



	
elif pompe==3:   #si la pompe passe en mode marche forcee
	#print ('demarrage marche force')
	pompemarche=1
	mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")   #on confirme sont etat en marche
	mycursor=mydb.cursor()
	mycursor.execute ('UPDATE variables SET pompemarche=1 WHERE ID=1')
	mydb.commit()
	mycursor.close()
	GPIO.output (21, False)  #on met la pompe en marche
	GPIO.output (15, False)
	GPIO.output (16, False)
	GPIO.output (18, True)
	
print("pompe 1=" , pompemarche, "   ")
	
	#time.sleep(30)
	
Edit Domi : Je ne sais pas si c'était les vrais identifiants et mot de passe, alors par sécurité je me suis permis d'édité ton message et de cacher tes identifiants et mot de passe affichés.

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: probleme lancement script python

Message par Manfraid » mer. 24 déc. 2014 14:30

déja attention il y a tes mdp visible sur le script :)

sinon je vois beaucoup de print effectivement mais attention tu utlise la syntax de python2 pour beaucoup d'entre eux
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

zeverybest
Raspinaute
Messages : 136
Enregistré le : sam. 18 oct. 2014 19:09

Re: probleme lancement script python

Message par zeverybest » mer. 24 déc. 2014 15:04

Oups, effectivement, j'avai laissé les mots de passe

Au fait, qu'elle est la meilleurs methode pour qu'ils ne soient pas visible dans le script?
les mettre dans un autre fichiers?

Les PRINT sont en syntaxe python2, mais j'utilise Python 2.7

Crois tu que cela soit la cause du probleme? (cela fonctionnait avec les lignes de codes de l'API google V2)

Je me suis contenté de remplacer les lignes utilisés par l'API V2 par celles de l'API V3

Je vais essayer de mettre un # devant les PRINT pour voir, mais j'ai un doute

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: probleme lancement script python

Message par Manfraid » mer. 24 déc. 2014 16:03

tu dit que tu utilise python 2.7 alors que dans le début du ficher c'est marquer 3.2 et oui l'idéal est de stoker les mdp en dehors des scripts
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

domi
Administrateur
Messages : 3230
Enregistré le : mer. 17 sept. 2014 18:12
Localisation : Seine et Marne

Re: probleme lancement script python

Message par domi » mer. 24 déc. 2014 16:19

Manfraid a écrit :... oui l'idéal est de stoker les mdp en dehors des scripts
Voici un sujet intéressant.
Tu pourrais nous donner un petit exemple d'appel de variables stockées dans un autre fichier que le script Python.
est-ce un autre fichier Python ne contenant que les variables ?
un peu à la manière de Php ?
Passionné de Raspberry, Arduino, ESP8266, ESP32, et objets connectés :
Spécial débutant, concevez vous-même votre domotique DIY : https://www.youtube.com/c/DomoticDIY
Conception d'une station météo DIY, et envoi des infos à votre Domotique.

mike913
Raspinaute
Messages : 246
Enregistré le : mar. 7 oct. 2014 09:46
Localisation : Morsang / Orge - Essonne
Contact :

Re: probleme lancement script python

Message par mike913 » mer. 24 déc. 2014 16:31

domi a écrit :
Manfraid a écrit :... oui l'idéal est de stoker les mdp en dehors des scripts
Voici un sujet intéressant.
Tu pourrais nous donner un petit exemple d'appel de variables stockées dans un autre fichier que le script Python.
est-ce un autre fichier Python ne contenant que les variables ?
un peu à la manière de Php ?
Les fichiers de configuration: exemple
Test.ini:

Code : Tout sélectionner

[Fichiers]
logs = /var/www/RFX-Meteo/logs/Meteo.txt
status = /var/www/RFX-Meteo/config/Status.txt
meteoxml = nouvelle Valeur
logsxml = /var/www/RFX-Meteo/logs/MeteoXml.txt

[Sql]
password = 'Toto'
user = 'root'
serveur = 'localhost'
base = 'Base'
et pour lire et afficher les variables:

Code : Tout sélectionner

#!/usr/bin/env python
# coding=UTF-8
# =====================================
# import des modules
import serial
import datetime
import time
import struct
import sys
import os
import ConfigParser
# ----------------------------------------------------------------------------
# Lit la configuration
# ----------------------------------------------------------------------------
def Get_Config(configfile):
	cfg = ConfigParser.ConfigParser()
	cfg.read(configfile)
	return cfg	
# ----------------------------------------------------------------------------
# Ecrit dans le fichier de configuration
# ----------------------------------------------------------------------------
def Set_Config(configfile, cfg):
	with open(configfile, 'wb') as config:
		cfg.write(config)
#-------------------------------------------
#   Boucle principale
#------------------------------------------- 
cfgConf = Get_Config('Test.ini')  
print cfgConf.get('Sql', 'password')
DS712+ 2x Western Digital WD10EADS-00L 1000 GB (SHR) - Firmware: DSM 6.1.6-15266
Raspberry - RFXTRX433 - Aeon Labs ZStick V2 - Domoticz
FreeBox v6
https://meteo.folcke.net
https://wiki.folcke.net

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: probleme lancement script python

Message par Manfraid » mer. 24 déc. 2014 16:40

Oui domi c'est faisable

par exemple dans un fichier config.py

Code : Tout sélectionner

user = "toto"
pass = "mdp"
db = "mabase"
et dans le script principal

Code : Tout sélectionner

import config
print config.user,config.pass,config.db
après il y a une multitude de façon de stocker des information de ce genre
comme le décrit mike913 avec un fichier ini et la lib configparser
ou un fichier json et la lib qui va bien avec
ou un xml


dès que j'aurais plus de temps je ferais un petit tuto des différentes façon de le faire
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

domi
Administrateur
Messages : 3230
Enregistré le : mer. 17 sept. 2014 18:12
Localisation : Seine et Marne

Re: probleme lancement script python

Message par domi » mer. 24 déc. 2014 17:19

Merci à tous les deux pour ces infos qui sont fortes interressantes, aussi bien l'une que l'autre suivant ce que l'on fait, et principalement suivant le nombre de variables à stocker.

Le fichier INI est effectivement intéressant lorsque l'on a beaucoup de variables, cela permet de mieux structurer les données, et moi j'ai bien. C'est propre, bien rangé, et les sections du INI donnent une indication sur l'utilisation de chacune des variables.

Pour le stockage de peu de variables (comme dans le cas de "zeverybest"), le fichier Python semble plus simple d'emploi, et conviendra très bien pour quelques variables.

Merci encore à tout les deux.
Passionné de Raspberry, Arduino, ESP8266, ESP32, et objets connectés :
Spécial débutant, concevez vous-même votre domotique DIY : https://www.youtube.com/c/DomoticDIY
Conception d'une station météo DIY, et envoi des infos à votre Domotique.

Répondre

Retourner vers « Python »