Class python pour controler votre IPX800

voici une class en python que j’ai réalisé et que je fait partager pour ceux que ça peut intéresser. Elle permet de contrôler simplement votre carte IPX800 en utilisant le langage évolué qu’est python.
Vous trouverai a la fin de la class un petit bout de code utilisant les méthodes disponible actuellement.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       IPX800.class.py
#       
#       Free Copyright 2011 Guillaume JONVILLE <guillaume.jonville<AT>gmail<DOT>com>
#       
#       
import socket

class IPX8000:
	adresse_ip = None
	port = None
	
	def __init__(self, ip, port=9870):
		self.adresse_ip = ip
		self.port = port
				
	def getIntEntryValue(self,inputNum):
		try:
			req = "GetIn" + str(inputNum) + "\r\n"
			s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
			s.settimeout(3)
			s.connect((self.adresse_ip,self.port)) 
			s.send(req)
			data = ""
			i = False
			while 1:
				txt = s.recv(1)
				if ord(txt) == 10:
					if i == False:
						i=True
					else:
						break
				data = data + txt
			s.close()
			return data[data.find(chr(10))+2:data.find(chr(10))+3]
		except:
			return False

	def getAntEntryValue(self,inputNum):
		try:
			req = "GetAn" + str(inputNum) + "\r\n"
			s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
			s.settimeout(3)
			s.connect((self.adresse_ip,self.port)) 
			s.send(req)
			data = ""
			i = False
			while 1:
				txt = s.recv(1)
				if ord(txt) == 10:
					if i == False:
						i=True
					else:
						break
				data = data + txt
			s.close()
			return data[data.find(chr(10))+2:data.find(chr(10))+3]
		except:
			return False
				
	def setRelayValue(self,rNumber,rValue):
		try:
			if rValue:
				rValue="1"
			else:
				rValue="0"
			req = "Set" + str(rNumber) + str(rValue) + "\r\n"
			s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
			s.settimeout(3)
			s.connect((self.adresse_ip,self.port)) 
			s.send(req)
			data = ""
			while 1:
				txt = s.recv(1)
				if ord(txt) == 10:
					break
				data = data + txt
			s.close()
			if data.find("Success") != -1:
				return True
			else:
				return False
		except:
			return False

	def reset(self):
		try:
			req = "reset\r\n"
			s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
			s.settimeout(3)
			s.connect((self.adresse_ip,self.port)) 
			s.send(req)
			return True
		except:
			return False
			
	def setAllRelay(self,boolValue):
		try:
			if boolValue:
				req = "Bit=11111111\r\n"
			else:
				req = "Bit=00000000\r\n"
			s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
			s.settimeout(3)
			s.connect((self.adresse_ip,self.port)) 
			s.send(req)
			data = ""
			while 1:
				txt = s.recv(1)
				if ord(txt) == 10:
					break
				data = data + txt
			s.close()
			if data.find("Success") != -1:
				return True
			else:
				return False
		except:
			return False	

def main():
	myipx800 = IPX8000("10.50.40.155",10000)
####################################################################################
####################################################################################
####################################################################################
	if myipx800.setAllRelay(True):
		print "All relay are up!!!"
	else:
		print "Error, can't up all relay!!!"
####################################################################################
####################################################################################
####################################################################################
	for i in range(4):
		value = myipx800.getIntEntryValue(i+1)
		if value != False:
			print "Actualy, bool Input " + str(i+1) + " = " + str(value) + "!!!"
		else:
			print "Error, can't get bool input " + str(i+1) + " value!!!"
####################################################################################
####################################################################################
####################################################################################
	for i in range(2):
		value = myipx800.getAntEntryValue(i+1)
		if value != False:
			print "Actualy, Analog Input " + str(i+1) + " = " + str(value) + "!!!"
		else:
			print "Error, can't get Analog input " + str(i+1) + " value!!!"
####################################################################################
####################################################################################
####################################################################################
	if myipx800.setAllRelay(False):
		print "All relay are down!!!"
	else:
		print "Error!!!, can't down all relay!!!"
####################################################################################
####################################################################################
####################################################################################	
	for i in range(:sunglasses::
		if myipx800.setRelayValue(i+1,True):
			print "Relay " + str(i+1) + " is up!!!"
		else:
			print "Error!!!, can't up relay" + str(i+1) + "!!!"
####################################################################################
####################################################################################
####################################################################################
	for i in range(:sunglasses::
		if myipx800.setRelayValue(i+1,False):
			print "Relay " + str(i+1) + " is down!!!"
		else:
			print "Error!!!, can't up relay" + str(i+1) + "!!!"
####################################################################################
####################################################################################
####################################################################################	
	if myipx800.reset():
		print "Reset is ok!!!"
	else:
		print "Error!!!, can't make a reset!!!"
				
	return 0

if __name__ == '__main__':
	main()

en output on a :

All relay are up!!!
Actualy, bool Input 1 = 1!!!
Actualy, bool Input 2 = 1!!!
Actualy, bool Input 3 = 1!!!
Actualy, bool Input 4 = 1!!!
Actualy, Analog Input 1 = 0!!!
Actualy, Analog Input 2 = 0!!!
All relay are down!!!
Relay 1 is up!!!
Relay 2 is up!!!
Relay 3 is up!!!
Relay 4 is up!!!
Relay 5 is up!!!
Relay 6 is up!!!
Relay 7 is up!!!
Relay 8 is up!!!
Relay 1 is down!!!
Relay 2 is down!!!
Relay 3 is down!!!
Relay 4 is down!!!
Relay 5 is down!!!
Relay 6 is down!!!
Relay 7 is down!!!
Relay 8 is down!!!
Reset is ok!!!
1 « J'aime »

Bonjour, j’ai écrit votre script est en retour je n’ai que les messages d’erreur que vous avez écrit dedans. J’ai rajouter des prints(« ») à différents endroits pour voir si je retrouvais bien ce que vous demandiez et je n’ai pas trouvé d’incohérence.

J’ai bien trouvé mon API et mon port self adresse = 192.168.1.xx.9870.

Par compte j’ai un password et un username.

J’ai fait un essai avec TCP Client Server et cela marche très bien si je mets mon password.

Je souhaiterais écrire un script pour écrire dans un fichier Excel les entrées analogiques et les compteurs deux fois par jour.

Je ne connais pas beaucoup le langage Python, j’ai fait un peu de visuel Basic et du C++ mais il y a bien longtemps.

Merci de votre aide

Gérard

Bonjour Gerard et bienvenue sur le forum,

réveiller un post vieux de 9 ans… pas sûr que vous ayez une réponse.

Ce script a probablement été écrit pour l’IPX V3, peut-être même la V2… :laughing:

Si vous avez une V4, connaissez-vous l’existence du fichier status.xml?

Bonne journée

Bonjour Merci de votre réponse.

J’ai un IPX800-v3 et j’ai écrit le script ave Python 3.9

Je ne connais pas ce fichier, je connais la commande « http://ipx800_v3/globalstatus.xlm » qui donne l’ensemble de l’état de l’IPX800

1 « J'aime »

Est-ce qu’il y a une personne disponible pour réactualiser ce script en Python 3.9 pour un IPX800-v3 avec un mot de passe activé ?
Merci pour votre aide.

Bonjour

N’ayant pas eu de réponse, que je comprends bien, je suis passé en macro Excel.

Je passe la commande :

With ActiveSheet.QueryTables.Add(Connection:= _
« URL;http://@ipx800_v3/globalstatus.xml », Destination:=Range("$c$4"))

Je récupérais toutes les données dans ma feuille Excel.

Cela marchait très bien depuis janvier 2021.

Je ne sais pas pourquoi depuis deux jours j’ai un message :

Erreur définie par l’application ou par l’objet.

Si vous pouviez me donner une piste pour rétablir la communication avec IPX800-v3.

Merci

Bonjour, Quelle est la version Excel ? Il faudrait voir si il n’y a pas eu une mise à jour d’Excel il y a 2 jours sur votre système peut-être ?

Bonjour.
J’ai la version 14.0.7268.5000 (64bits).
Merci de ta réponse.