Bonjour
Pour les personnes que cela intéresse, j'ai fait un script python, pour piloter les sorties d'un MCP23017 avec une Raspberry pi2
Ceci avec l'aide de toutes les infos trouvées sur la toile !!!!
Donc j'essaye d'apporter mon humble contribution
Ce script est a appeler via Domoticz en lui passant des paramètres,
On créé un périphérique virtuel de type interrupteur, on édite et pour la mise a on ou off on appelle le script comme suit :
exemple on:
script:///home/pi/domoticz/scripts/python/./script_device_mcp23017.py 32 0 1 on
Exemple pour la mise a off :
script:///home/pi/domoticz/scripts/python/./script_device_mcp23017.py 32 0 1 off
le script est a rendre exécutable avec la commande chmod + x
Il est a placer dans /domoticz/scripts/python
Si on édite le script sous windows, ou via une console, il se peut qu'il y ai des défaut d’interpréteur lié aux caractères de fin de lignes,
vu que j'ai un peu galéré pour trouver, il faut tapez en mode console sur la raspberry pila commande :
ou vous remplacez test.py par le script a modifier et newtest.py le nom du fichier destination,
Pour l'utilisation du script,
On passe comme paramètre l'adresse du composant I2C Mcp23017, puis le rang de la led que l'on veux allumer (de 0 à 8 ) pour le port A et le portB puis la commande on ou off,
J'ai ajouté la commande reset pour tout mettre à off
La valeur 0 permet de ne pas faire de changement d'état sur le le port concerné.
La carte que j'ai réalisé n'est qu'une carte de sorties,
On peu créer 16 device virtuel avec le même script et les bon paramètres
donc du coup 16 sorties,
Code : Tout sélectionner
#!/usr/bin/python
#syntaxe mcp23017 [adresse] [RANG SORTIEA 0..8] [RANG SORTIEB 0..8] [on ,off ou reset]
# scipt.py 32 0 1 on --> allume la led 1 du port B
# scipt.py 32 0 1 off --> eteind la led 1 du port B
# scipt.py 32 8 0 on --> allume la led 8 du port A
# scipt.py 32 0 1 off --> eteind la led 1 du port B
import smbus
import sys
#DEVICE = 0x20 # Device address (A0-A2) --> passee en parmaetre [1]
IODIRA = 0x00 # Pin direction register
IODIRB = 0x01 # Pin direction register
OLATA = 0x14 # Register A for outputs
OLATB = 0x15 # Register B for outputs
GPIOA = 0x12 # Register for inputs
GPIOB = 0x13 # Register B for inputs
add = int(sys.argv[1]) # Adresse du circuit MCP23017 si A2=A1=A0=0 -> 0x20 soit 32 en decimal
if int(sys.argv[2]) == 0 :
valeur1 = 0
if int(sys.argv[2]) >8 : # Test de la valeur a 0
valeur1 = 0
else :
temp = int(sys.argv[2])-1
valeur1 = 1 << temp # Valeur du Port A a ecrire choisir entre 1 et 8
if int(sys.argv[3]) == 0 : # Test de la valeur a 0
valeur2 = 0
if int(sys.argv[3]) > 8 : # Test de la valeur a
valeur2 = 0
else :
temp=int(sys.argv[3])-1
valeur2 = 1 << temp # Valeur du Port B a ecrire choisir entre 1 et 8
bus = smbus.SMBus(1) # Carte I2C port 1 pour la PI2
bus.write_byte_data(add,IODIRA,0x00) #PORTA en sortie
bus.write_byte_data(add,IODIRB,0x00) #PORTB en sortie
ValA=bus.read_byte_data(add,GPIOA) # Lecture de la Valeur du Port A
ValB=bus.read_byte_data(add,GPIOB) # Lecture de la Valeur du Port A
if sys.argv[4] == "on":
octet1 = valeur1|ValA
octet2 = valeur2|ValB
bus.write_byte_data(add,OLATA,octet1)
bus.write_byte_data(add,OLATB,octet2)
print octet1, octet2,"lu :",ValA,ValB,"ou"
if sys.argv[4] == "off":
if valeur1 != 0 :
octet1 = ValA&~valeur1
else :
octet1=ValA
if valeur2 != 0 :
octet2 = ValB&~valeur2
else :
octet2=ValB
bus.write_byte_data(add,OLATA,octet1)
bus.write_byte_data(add,OLATB,octet2)
print octet1, octet2,"lu :",ValA,ValB,"et"
if sys.argv[4] == "reset":
bus.write_byte_data(add,OLATA,0)
bus.write_byte_data(add,OLATB,0)
Voilà.....