Comme annoncé, ce forum est passé en lecture seule au 1er janvier 2020. Désormais nous vous invitons à vous rendre sur notre nouvelle page communauté :
Image

A très bientôt !

[Script] RASP GPIO.py

Avatar de l’utilisateur
Sshafi
Actif
Messages : 3882
Inscription : 01 juil. 2014, 16:08
Localisation : Albi

[Script] RASP GPIO.py

Message par Sshafi » 21 nov. 2016, 13:22

Script GPIO pour raspberry

But :

lire une information d'un raspberry distant, et l'envoyer vers Jeedom
Ce tuto a pour but d'expliquer au travers un exemple fonctionnel à ce jour, comment détecter un changement d'état sur une information cablée en TOR.

Prérequis :

Un raspberry type B, le B+ ne devrait pas poser de probleme (pas testé)
Savoir câbler un capteur sur les gpio d'un raspberry s'y connaitre un minimum en SSH et python (niveau débutant)
Rasbian wheezy fonctionelle, ce script à été développé sur la version 2014-06-20-wheezy-raspbian.img
et bien sur un jeedom accessible sur votre réseau local.

Principe retenu

L'information cablée sur le raspberry distant est "captée" puis envoyé à jeedom à l'aide d'un plugin type virtuel

Le code

A mettre sur le raspberry distant, par exemple /home/pi/scripts/ !#/usr/bin/env python
Les imports nécessaires:

Code : Tout sélectionner

import time
import RPi.GPIO as GPIO
import urllib
import os as os
Les "classiques"

Code : Tout sélectionner

#Configuration
ip_jeedom = "XXX.XXX.XXX.XXX"
Api_key  = "XXXX"
La configuration du GPIO et l'ID virtuel définit dans Jeedom

Code : Tout sélectionner

#Configuration Num GPIO
N_GPIO = XX               #METTRE ICI LE NUMERO DU GPIO CONCERNE EX:22
#Num Virtual
N_virtual = XXXX          #METTRE ICI LE NUMERO DU GPIO CONCERNE EX:1977
Une fonction pour retourner date et heure formatée

Code : Tout sélectionner

def My_time():
  temp = time.strftime('%H:%M:%S',time.localtime())
  return str(temp) + " : " 
La fonction 'retour vers jeedom"

Code : Tout sélectionner

def Jeedom(id,value):
 base = "http://" + ip_jeedom + "/jeedom/core/api/jeeApi.php?api="
 type = "virtual"
 req  = base + Api_key + "&type=" + type + "&id=" + str(id) + "&value=" + str(value)
 urllib.urlopen(req)
 #print "Req Virtuel : " + My_time() + req
Note : sur la ligne

Code : Tout sélectionner

#print "Req Virtuel : " + My_time() + req en supprimant le # , l'affichage de le requête s'affiche
La fonction de callback

Code : Tout sélectionner

def affiche_on(what):
 Jeedom(N_virtual,1)
 time.sleep(2)
 Jeedom(N_virtual,0)
NOTE : cette fonction affecte la valeur 1 au virtuel lorsque l'information est "capté", attend 2 sec, puis renvoi la valeur 0
Un peu de conf pour les GPIO (pour les détails, voir google)

Code : Tout sélectionner

#Conf GPIO
GPIO.setwarnings(False)
GPIO.setmode( GPIO.BCM )
GPIO.setup( N_GPIO, GPIO.IN, pull_up_down=GPIO.PUD_UP )
La fonction principale :

Code : Tout sélectionner

GPIO.add_event_detect(N_GPIO, GPIO.RISING, callback=affiche_on, bouncetime=200)
C'est la fonction principal, cette fonction attend un changement d'état sur l'entrée paramétrée et execute la fonction affiche_on, qui, elle, met a jour le virtuel
Une boucle pour "rester" dans le programme et testé une interruption de sortie

Code : Tout sélectionner

 try:  
   	while 1:
   		time.sleep(0.02)
 
   except KeyboardInterrupt:
       GPIO.cleanup()       # clean up GPIO on CTRL+C exit  
GPIO.cleanup()           # clean up GPIO on normal exit
Lancement :

Le lancement de ce script doit se faire en ssh avec une commande du genre :

Code : Tout sélectionner

sudo python /home/pi/scripts/NOM_DU_SCRIPT.py
Arrêt :
si tout va bien et que vous avez décommenter le # du print, vous voyez les trames vers jeedom partir !
donc un control-c permet de stopper proprement le programme

Evolution :

1) rendre le script paramétrable pour utiliser le même code pour plusieurs Entrées tor !
2) lancer le programme au démarrage du raspberry

Une méthode : modifier le fichier rc.local, fichier lancé lors du démarrage du raspberry, se connecter en ssh et faire :

Code : Tout sélectionner

sudo nano /etc/rc.local
L'éditeur nano permet de modifier le contenu du fichier en y ajoutant
"sudo /usr/bin/python /home/pi/shares/<NOM DE VOTRE SCRIPT>.py" AVANT la ligne exit 0,
voici un exemple:

Code : Tout sélectionner

# !/bin/sh -e
#
 # rc.local
 #
 # This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
 # In order to enable or disable this script just change the execution
# bits.
 # By default this script does nothing.
#
 # Print the IP address

_IP=$(hostname -I) || true
if [ "$_IP" ]; then
 printf "My IP address is %s\n" "$_IP"
fi
#lancement du script de detection de presence
sudo /usr/bin/python /home/pi/shares/event_gpio.py
exit 0
??? Menfin ...
VM ESXi # Aeon Lab Gen5 | RFXtrx433E | ...
Trucs & Astuces

Verrouillé

Revenir vers « Plugins »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités