domotique:Lancer commande via agenda google

Parce que les applications du Raspberry Pi sont illimités...

Modérateur : Francois

Répondre
manux
Messages : 42
Enregistré le : ven. 28 nov. 2014 13:12

domotique:Lancer commande via agenda google

Message par manux » lun. 8 juin 2015 08:02

Bonjour
Je cherche à connecter mon pi avec un agenda style google, pour me permette de lancer des taches à des moments bien précis et modifiables.
Je me suis intéressé à google agenda car il est assez pratique, Pc smartphone, etc...
Hélas, je suis un peu débutant et j'aimerai quelques pistes.
J'ai exploré la réveil py, mais je voudrais aller un peu plus loin, en différenciant plusieurs commandes, comme "démarre tel script", "arrête le", "lance ce script"
Cela tourne un peu autour des projets domotiques, vidéosurveillance ; lance motion de tel heure à tel heure (je suis absent), lance le rapatriement des images ...
voir le projet alarme py
https://blog.bartbania.com/raspberry_pi ... arm-clock/

J'ai essayé cette méthode là :
http://www.domoticz.com/wiki/Interactin ... e_Calendar
J'ai été séduit par la simplicité mais cela ne fonctionne pas, Google n'accepte plus le protocole OAuth 1.0. Dommage, cela était parfait, mais un peu dangereux sans mot de passe !!!

manux
Messages : 42
Enregistré le : ven. 28 nov. 2014 13:12

la suite: domotique:Lancer commande via agenda google

Message par manux » sam. 13 juin 2015 20:17

Après des jours de recherhces et de galère, j'ai enfin pu recueillir des données de mon agenda
Je suis parti d'un nouveau compte avec aucun données perso et pas d'identification par téléphone (marotte sauce google)
sur le Pi

$ sudo apt-get install git python-pip python-gdata python-dateutil python-gflags python-vobject python-parsedatetime
$ sudo pip install google-api-python-client
$ sudo pip install apiclient urllib3
$ git clone https://github.com/insanum/gcalcli.git
$ cd gcalcli
$ sudo python setup.py install

Cela m'a installer les versions OAuth2

J'ai pu ensuite tester tout de suite, SANS CODE, avec la commande sudo gcalcli agenda

Attention, il faut le faire sur le PI dans l'environnement start X

Cela donne un lien qu'il faut copier dans le navigateur du pi immédiatement

Cela ouvre une page d'authentification et on valide l'accès de gcalcli

Voilà, c'est tout !

On met quelques infos dans l'agenda google

On retape depuis la commande sudo gcalcli agenda et par magie, les intitule de l'agenda permet de récupérer du texte qui peut être ensuite des commandes...ou des fichiers de commandes



sam jun 13 2:30 wake
8:02 hello word
8:30 lancer cette commande
9:30 Lancer motion
11:00 arret motion

lun jun 15 Semaine 25 de 2015


Voilà, il suffit tout simplement de lancer cette commande, SANS RIEN d'autre, et on accède à son agenda.
ensuite, il suffit de copier le tout dans un fichier , commande sudo gcalcli agenda --tsv --military > fichier (j'en suis là)
Voilà ce qu'on obtient

2015-06-13 14:30 2015-06-13 15:30 wake
2015-06-13 20:02 2015-06-13 20:03 hello word
2015-06-13 20:30 2015-06-13 21:30 lancer cette commande
2015-06-13 21:30 2015-06-13 22:30 Lancer motion
2015-06-13 23:00 2015-06-14 00:00 arret motion
2015-06-14 07:30 2015-06-14 07:30 wake
2015-06-14 07:31 2015-06-14 07:31 sleep
2015-06-14 08:00 2015-06-14 09:00 email
2015-06-15 00:00 2015-06-16 00:00 Semaine 25 de 2015
2015-06-15 07:30 2015-06-15 08:30 la semaine prochaine

puis d'extraire des données de ce fichier.

On peut s'inspier du programme suivant et récupérer que la journée
http://easydomoticz.com/scripts/getgooglecal.py
Si tel commande à tel heure, lancer cela à tel heure.

Une tache cron pour automatiser tous les 5 minutes

Ensuite, on peut faire ce que l'on veut, les possibilités sont énormes et multi plateforme, tant qu'on peut accéder à google agenda
Modifié en dernier par manux le sam. 13 juin 2015 22:17, modifié 3 fois.

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: domotique:Lancer commande via agenda google

Message par vague nerd » sam. 13 juin 2015 20:35

Bonjour et merci du partage de votre avancée.
Tout cela semble très intéressant...
Cdt.
Cordialement,

Vague Nerd

manux
Messages : 42
Enregistré le : ven. 28 nov. 2014 13:12

Demande aide python domotique:Lancer commande via agenda goo

Message par manux » dim. 14 juin 2015 20:08

Bonjour
Après une journée de GROSSE PRISE DE TETE (je n'ai jamais fait de Python) , j'ai presque réussi mais il me manque des connaissances de base en python. De plus mon script a été fait pour du python 3.4 et le raspberry ne tourne qu'avec du 2.7...

En gros, mon programme fait :
Après avoir lu l'agenda avec le script lire.py qui colle l'agenda dans un fichier , voici mon script action.py

On peut ignorer beaucoup de print

Mon problème est plus complexe car dans un script python, je lance des commandes basiques : ca marche mais le script s'arrête tant que la commande n'a pas libéré le système :cry:

En gros, mon programme action.py va lancer une commande shell "Fait ça"... Et la commande shell se lance mais elle ne redonne pas la main à action.py. Donc plus de lecture de l'agenda, impossible de lancer une commande stop ou autre.

Il faut utiliser des subprocess et là, je collectionne des erreurs, il ne trouve pas subprocess.py.

J'ai besoin de votre aide pour finaliser mon script :!:

Code : Tout sélectionner

# -*- coding: utf-8 -*-
#############nrametres ################################# 
import os
import subprocess
import time
import datetime
from datetime import datetime
rep=""
# fichier et chemin pour agenda
mfile="googlecal.txt"

def debugmode(heure_action,r_action,present,diffsecondes):
    print ("###############################################################")
    print ("le fichier dit que l'action -",r_action,"-debute a ")
    print ("heure declenchement ",heure_action)
    print ("il est ",present)
    print ("difference en secondes",diffsecondes)
    if  "start motion" in r_action :
        print (" **********sudo motion start *****")
        print (" **********sudo motion start *****")
        subprocess.call(["sudo motion start"])
        print (" **********sudo motion start *****")
        print (" **********sudo motion start *****")
    elif "stop motion" in r_action :
        print (" **********sudo motion stopppppppppppppp *****")
        print (" **********sudo motion stopppppppppppppp *****")
        subprocess.call(["sudo motion stop"])
    elif "ls" in r_action:   # pour tester
        print (" ********** lssssssssssssssss *****")
        print (" **********ls *****")
        subprocess.call(["sudo ls -l"])
    else :
            print("commande non reconnue")


# traitement #
def traitement(chaine) :
    # ici on va extraire les dates du fichier
    # chaine="2015-06-14 16:18 2015-06-14 15:22 wake"
    print (" ",chaine)
    #   on s'occupe de la date du début
    date_action=chaine[0:10]+" "+chaine[11:16]+":00"
    #  On extraite l'action à faire qu'on passera en variable
    r_action=chaine[34:len(chaine)]
    print ("date action", date_action)
    present=datetime.now()
    # on parse la date de l'action dans un format date compréhensible
    heure_action= datetime.strptime(date_action,"%Y-%m-%d %H:%M:%S")
    #                      
    print ("date actuelle",present)
    print ("heure action",heure_action)
    # seuil en seconde
    # Ce seuil est parfaitement arbitraire : il correspond plus ou moins à 120 ou plus secondes d'écart
    # plus on réduit le seuil, plus c'est précis mais on peut rater l'heure, dû à un reboot
    # ou pas donc le 
    seuil=120
    # 
    # 
    # 
    timedelta = present - heure_action
    diff_day = timedelta.seconds + float(timedelta.seconds) / 86400
    print (" la différence est ",diff_day)
    diffsecondes=(heure_action-present).seconds
    print ("diff =",diffsecondes)
    print ("diff =",diffsecondes)
    #   Il faut pense que le calcul sort soit une durée positive, donc
    # on compare avec le seuil de 60 (secondes) à la minute prêt
    # si on dépasse l'heure, le chiffre devient supérieur à 
    if (diffsecondes < seuil or (diffsecondes> 86400-seuil and diffsecondes <86400)):
                           
                            debugmode(heure_action,r_action,present,diffsecondes)
            
    else:
                            print ("Rien a faire ")    
                            # debugmode(heure_action,r_action,present,diffsecondes)


#main#
print (" //////////////////// debut \\\\\\\\\\\\\\\\\\\_")
import fileinput
for line in fileinput.input([mfile]):
		print ("----------------- > ligne lue", line)
		traitement(line)
print (" //////////////////// fin \\\\\\\\\\\\\\\\\\\_")
Modifié en dernier par manux le lun. 15 juin 2015 19:49, modifié 1 fois.

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

Re: domotique:Lancer commande via agenda google

Message par Manfraid » dim. 14 juin 2015 20:13

Salut, met ton code entre les balise [ code ]

sinon tu peu installer python3.4 sous raspian si tu est en jessie et pour lancer a commande python3.4

pour savoir les version de python disponible sur ton rpi tu peu faire

Code : Tout sélectionner

python -V
python3 -V
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.

phdenaujan
Messages : 63
Enregistré le : lun. 5 janv. 2015 21:29

Re: domotique:Lancer commande via agenda google

Message par phdenaujan » lun. 15 juin 2015 12:43

Bonjour,

Fort intéressante, je pensais m'y pencher prochainement.

Quelle type de commande Shell lances-tu ? As-tu besoin d'un retour de cette commande ? Si non, pourquoi ne pas la lancer en arrière plan ?
Ph.

manux
Messages : 42
Enregistré le : ven. 28 nov. 2014 13:12

Re: domotique:Lancer commande via agenda google

Message par manux » lun. 15 juin 2015 19:49

La version installé (de base ?) est python 2.7. Hélas, si je passe au V3, ça va casser autre chose ... Le risque est grand, surtout que je travaille avec une version de mai 2015 de raspian.
Le serpent risque de se mordre la queue...
Pour répondre à la question de phdenaujan , c'est exactement ça.
Le but est pourtant simple, lancer des commandes en arrière plan, sans s'occuper du résultat...mais en pouvant les arrêter éventuellement.
Evidemment, plus c'est propre mieux c'est. Comme je débute( python en 1 jour !), j'ai besoin de vous.
Exemple : La commande sudo motion start doit partir et le script continue à lire les autres commandes.
J'ai peur que de se lancer dans des sous process demande une gestion très rigoureuse, voir trop.
Pour l'instant, j'avance comme un newbie, code un peu pourri mais le but c'est d'arriver à sa fin.
Comment lancer une commande en arrière plan ?
apparement subprocess est implémenté dans 2.7
https://docs.python.org/2/library/subpr ... subprocess
voici ce que me retourne le lancement de mon programme

Code : Tout sélectionner

   subprocess.call(["sudo motion stop"])
  File "/usr/lib/python2.7/subprocess.py", line 493, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1259, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
Je pense qu'il y a une soluce... Merci d'avance

phdenaujan
Messages : 63
Enregistré le : lun. 5 janv. 2015 21:29

Re: domotique:Lancer commande via agenda google

Message par phdenaujan » mar. 16 juin 2015 20:09

Salut, pour commencer, tu devrais passer à python3, surtout si tu débutes, c'est dommage de ne pas utiliser la dernière version.

Tu peux faire une copie de ta SD pour assurer le coup si tu veux (ce que je t'encourage de toute manière à faire de temps en temps) en utilisant, par exemple, la méthode http://www.framboise314.fr/clonez-la-ca ... pberry-pi/.

J'ai tenter d'installer motion hier, je galère un peu pour le faire fonctionner.

J'ai tenté quand même un truc comme ça :

Code : Tout sélectionner

pi@PI2 ~ $ sudo python3 testcde.py
[0] Processing thread 0 - config file /etc/motion/motion.conf
[0] Motion 3.2.12 Started
[0] Motion going to daemon mode
Commande lançée
Commande lançée
Commande lançée
Commande lançée
Le code après la cde s'est bien executé. Le code utilisé :

Code : Tout sélectionner

#!/usr/bin/env python 3.2
# -*- coding: utf8 -*-
#Lancer une cde schell

import os
commande = "sudo motion stop"
os.system(commande)

### Pour vérifier que le script python continu son exécution
x=1
while x<5 :
    print ("Commande lançée")
    x=x+1
Je ne sais pas si ça répond à ton besoin. Je tente de configurer motion et regarde de plus près (pas d’accès au port 8081 alors que le 8080 fonctionne).
Ph.

manux
Messages : 42
Enregistré le : ven. 28 nov. 2014 13:12

Re: domotique:Lancer commande via agenda google

Message par manux » mer. 17 juin 2015 07:32

Le sujet est un peu dévié sur Python
Je cherche quelque chose de SIMPLE, un script en python qui lance d'autres commandes, sans s'arrêter.
Ca doit exister , même sous 2.7 seulement, je n'ai pas de formation à ce langage.
Le soucis est peut être plus complexe car motion est aussi bavard et peut être qu'il ne permet pas de redonner la main dans l'état initial...
Donc passons par un script de Zéro niveau : un script py qui fait "sudo motion stop", "sudo motion start", parce que je m’aperçois que motion ne veut pas s'arrêter ! A part pkill -9 motion...

Donc les méthodes subprocess ("commande", shell=false) ne fonctionne pas. Je cherche à lancer une commande sans retour, sans prompt bavard....dans un 1er temps. Tous les scripts semblent trop compliqués , avec des contrôles, des passages de variables, etc...
Pour le passage à V3, je n'ai rien contre, mais on retombe dans d'autres problèmes de compatibilité et j'ai déjà refait entièrement une install Raspian pour faire tourner Motion, et gcalcli. J'ai installé Python V3 sous windows et j'ai du revoir tous mes scripts..Alors, faire, défaire, refaire...pour être sans doute dans la même situation.
Je pense que je suis à la porte de la solution... Merci pour votre aide sous 2.7. Beaucoup de commande sont déjà implémentée sous cette version.

Répondre

Retourner vers « Et tout le reste »