Page 2 sur 3

Re: Bus I2C

Publié : 27 mars 2015, 21:30
par Gwenvel
Ok, je vais me concentrer sur python et php alors.
Merci pour ces conseils, je vais étudier le fonctionnement de mon système avec python.
Je reviendrai surement pour plus de renseignements.

Re: Bus I2C

Publié : 29 mars 2015, 21:30
par vin100
Bonjour les gars


Si jamais tu arrive a faire fonctionné des I/O sur i2c je suis vraiment interessé par la demarche car ca pourrais me faire economiser un pi deporté avec un piface et ca serais moins compliqué finalement moins de risque de panne

Merci :)

Re: Bus I2C

Publié : 16 mai 2015, 12:56
par Gwenvel
Bonjour,
petites infos sur l'avancement de mon projet d'utilisation de domoticz avec un bus I2C: les premiers essais sont concluant, j'ai programmer des interrupteurs avec des scripts en python, qui pilotent une carte équipée d'un MCP23017.
Je débute avec Domoticz et le langage Python, j'avance doucement. Je vais voir maintenant pour l'utilisation des ports en entrées.
Si des pesonnes sont intéressés par ce projet, ce sera avec plaisirs que je partagerai mes infos.

A+

Re: Bus I2C

Publié : 15 déc. 2015, 22:28
par Cedric
Bonjour,
Je suis très intéressé de ton projet car je me lance dans la domotique et je veux partir dans le même principe, avec un raspberry et des puces MCP.
J'ai deja quelque script pour piloter des sorties ou ecouter des entrées. mais je veux une interface pour echanger. Donc j'ai pensé à Domoticz.
J'aimerais echanger pour peut etre me lancer ds mon projet.
Merci d'avance

Re: Bus I2C

Publié : 20 janv. 2016, 13:34
par Gaap
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 :

Code : Tout sélectionner

tr -d '\r' < test.py > newtest.py
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à.....

Re: Bus I2C Lecture d'une entree en mode interrupteur

Publié : 22 juin 2016, 07:55
par Gaap
Suite à mon premier articjle pour le pilotage d'un MCP23017 en sortie, je galére pour faire la même chose en lecture,

j'ai créé un script python ci dessous qui permet de lire le PORTA du MCP23017 et le recopie sur le PORTB,
en gros j'ai 8 boutons ou interrupteurs sur le PORTA et 8 relais sur le PORTB


Je voudrais gérer cela dans DOMOTICZ sous forme de matériel
Comment puis je créer mon "matériel" correspondant?
Si qqu'un as des infos ou un tuto je suis preneur


Code : Tout sélectionner

#!/usr/bin/python
# -*-coding:Latin-1 -*
# syntaxe mcp23017 [adresse] 


import smbus
import sys
IODIRA = 0x00	# Pin direction register
OLATA  = 0x14	# Register A for outputs
GPIOA  = 0x12	# Register for inputs
IODIRB = 0x01	# Pin direction register
OLATB  = 0x15	# Register B for outputs
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

bus = smbus.SMBus(1) 			# Carte I2C  port 1 pour la PI2

bus.write_byte_data(add,IODIRA,0xFF) #PORTA en entrée
bus.write_byte_data(add,IODIRB,0x00) #PORTB en Sortir
Val_PortB=bus.read_byte_data(add,GPIOB)		# Lecture de la Valeur du Port B

while True:
	Lecture_PortA=bus.read_byte_data(add,GPIOA)
	bus.write_byte_data(add,GPIOB,bus.read_byte_data(add,GPIOA))	
	print "PortA:", Lecture_PortA
time.sleep(1)

Bus I2C / MCP 23017

Publié : 29 août 2017, 00:26
par PhilippeBP59
Bonjour,
Depuis plusieurs années, je me suis installé un système domotique basé sur Raspberry et Domoticz pour faire la régulation de mon chauffage centrale chaudière bois de tout mon habitat, y compris les accès des portes et fenêtres.
La majorité de mes capteurs sont des 1-wire (DS1820), le relayage des pompes par un IPX800, les comptages des consommations par serveur WES et les accès par le protocole 433Mhz.
Dans l'ensemble cela fonctionne correctement.
L'objet de mon intervention est simplement que je voudrai remplacer le relayage des pompes par un module I2C basé sur un MCP 23017.
J'ai donc développé une carte électronique que je vais faire mettre en production.
Dans la généralité, la carte à les caractéristiques suivantes :
-- 8 sorties relais contact sec ou contact point commun avec ou sans tension
-- 8 entrées isolés optocoupleurs
-- cartes enfichable les unes à la la suite des autres
-- s'installe sur rail DIN
Avec je vais fabriquer une carte multi-ports de communications avec des connexions par câble en natte (connecteur type HE10 pour éviter un maximum de câblage filaire).

Tout ceci me prend beaucoup de temps, d'autant plus que comme beaucoup de personnes passionnées, j'ai un métier qui me laisse peu de loisirs (j'ai une entreprise d'électricité), et donc pas assez pour avoir le temps de faire une bonne programmation autour de ce module.

Je voudrai proposer à une personne qui à les compétences de paramétrage et programmation de faire un échange :

Ma carte complète I2C 8 Sorties /8 Entrées contre une installation Domoticz (dernière version) fonctionnant en mode kiosk et avec des routines de lecture I2C (pour le MCP23017)

Si vous êtes intéressé, des questions ou remarques, n'hésitez pas à me laisser un message.

Merci de votre attention

Philippe

Re: Bus I2C

Publié : 05 sept. 2017, 20:49
par bucley29
Bonsoir philippe,

Cool que ca fonctionne chez toi. N'ayant pas reussi à controler ma carte io pi plus sur domoticz, j'ai fait le test sur jeedom. Ca marche bien.

J'ai toujours ma sd pour continuer dessus

Comment as tu reussi a voir tes entrees sorties?

Re: Bus I2C

Publié : 06 sept. 2017, 00:21
par PhilippeBP59
Bonsoir,
Cela fonctionne sans trop de problème sur Domoticz, il suffit d'affecter à un switch un petit script Lua qui adresse l'action de l'activation d'un relais par l'intermédiaire d'un MCP23017 sur le bus I2C.
Pour la lecture c'est la même opération en lecture du bus I2C.
Ce n'est pas compliqué, pour moi ce qui me pose problème c'est d'avoir une version récente de Domoticz, tournant directement sur son propre écran au démarrage avec un Raspberry, c'est surtout le temps qui me manque.

Pour l'instant je vais me faire fabriquer quelques cartes I2C avec MCP23017 (8 sorties et 8 entrées ) afin que je domotise l'ensemble de chez moi à moindre coût, y compris la régulation complète de mon chauffage au bois.
Pour l'instant les pompes sont commandées par un IPX800, le module est un peu cher surtout quand on veut augmenter le nombre d'entrées et sorties.

Philippe

Re: Bus I2C

Publié : 12 nov. 2017, 07:52
par PhilippeBP59
Bonjour,
J'ai un petit souci d'adressage sous Lua et malgré mes multiples recherches qui ne me donnent pas satisfactions :
J'ai besoin d'accéder au contenu d'un registre hexadécimal
exemple portb = 0x11
cela fonctionne en python, mais mon besoin est en Lua

Si vous avez une solution à me proposer, je suis preneur.

Bon WE
Philippe