Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Tupla inaccesible dentro de otra tupla

Estas en el tema de Tupla inaccesible dentro de otra tupla en el foro de Python en Foros del Web. Hola Estoy haciendome un sistema domotico en casa. Tengo unos arduinos repartidos por la casa, con sus sensores y conectados por modbus a uno que ...
  #1 (permalink)  
Antiguo 17/04/2016, 15:56
 
Fecha de Ingreso: abril-2016
Ubicación: Madrid
Mensajes: 3
Antigüedad: 8 años
Puntos: 0
Tupla inaccesible dentro de otra tupla

Hola

Estoy haciendome un sistema domotico en casa. Tengo unos arduinos repartidos por la casa, con sus sensores y conectados por modbus a uno que hace de master. Todo funciona pero me falta una web chula para controlarlo todo. Estoy tratando de hacerlo con una rpi con OpenHab. OpenHab lee los esclavos del modbus a paso de tortuga y nadie parece saber solucionarlo, así que estoy haciendo un codiguito en python que pase los datos del modbus al OH (OpenHab) y para ello uso modbus_tk, que al parecer es sencillo y rápido. Soy novato en python, pero lo que he echo me ha gustado más que el C que suelo usar.

El caso tras configurar bien el ejemplo de modbus_tk, ¡zas!, que bien, con print ves los datos por el terminal... parece que ya está, chupado, le asigno cada valor a su variable correspondiente, se los envío al OH y ya, ...craso error.... solo empieza la pesadilla en la que llevo varios días...

La función master.execute(int, cst.READ_HOLDING_REGISTERS, 0, 10) retorna, o eso parece, dos tuplas, una dentro de otra. En una está el int del primer argumento (que es el esclavo consultado) y en la otra... ¿que lechugas es la otra? con type() se ve que es una tupla, pero no es posible accederla con doble indice. Ni copiarla en una lista, ni con join(), ni desempaquetando, ni con fund(), ni con nada, los datos se pueden ver con print, pero es imposible sacarlos de ahí para hacer algo con ellos.

Debo llevar más de 15 horas con esto, es terriblemente frustante que una chorrada se te resista así.

Aqui están los fuentes de modbus-tk:
https://github.com/mushorg/modbus-tk


EDITO para añadir que en la linea 211 de este enlace está la función master.execute() dichosa que retorna no se que especie de tupla que no se leer.
https://github.com/mushorg/modbus-tk/blob/master/modbus_tk/modbus.py



He escrito muchos códigos para probar mil cosas, copio aquí uno:

//////////////////////////////////////////////////////////////////////

import serial

import modbus_tk
import modbus_tk.defines as cst
import urllib, urllib2
from modbus_tk import modbus_rtu


#PORT = 1
PORT = '/dev/ttyUSB0'

def main():
"""main"""
logger = modbus_tk.utils.create_logger("console")


while True:
try:
#Connect to the slave
master = modbus_rtu.RtuMaster(
serial.Serial('/dev/ttyUSB0', baudrate=19200, bytesize=8, parity='N', stopbits=2, xonxoff=0)
)
master.set_timeout(0.07)
master.set_verbose(False)
#logger.info("connected")


kk = 0
while True:
TuplaDeDatos = (kk, master.execute(kk, cst.READ_HOLDING_REGISTERS, 0, 14))
if kk > 9: kk=0
kk = kk + 1

#print (TuplaDeDatos.count[1])


#ListaDeDatos = list(TuplaDeDatos)
#print ListaDeDatos.join(TuplaDeDatos)
#print ListaDeDatos

#lista = ListaDeDatos[0]

#print len(TuplaDeDatos)

#ListaDeDatos.sort()
#print (ListaDeDatos)
#print (TuplaDeDatos.find('0'))
#print (master.get_slave(2,2))
print TuplaDeDatos



#send some queries
#logger.info(master.execute(1, cst.READ_COILS, 0, 10))
#logger.info(master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 8))
#logger.info(master.execute(1, cst.READ_INPUT_REGISTERS, 10, 3))
#logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 5))
#logger.info(master.execute(1, cst.WRITE_SINGLE_COIL, 7, output_value=1))
#logger.info(master.execute(1, cst.WRITE_SINGLE_REGISTER, 100, output_value=54))
#logger.info(master.execute(1, cst.WRITE_MULTIPLE_COILS, 0, output_value=[1, 1, 0, 1, 1, 0, 1, 1]))
#logger.info(master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 100, output_value=xrange(12)))

except modbus_tk.modbus.ModbusError as exc:
print("error---------------------------------------")
#logger.error("%s- Code=%d", exc, exc.get_exception_code())
master.close()

except Exception, e2:
print("Error indefinido en: ", kk , str(e2))
master.close()
#logger.error("%s- Code=%d", exc, exc.get_exception_code())



if __name__ == "__main__":
main()

Última edición por eb4cak; 17/04/2016 a las 16:02 Razón: Añadir información
  #2 (permalink)  
Antiguo 17/04/2016, 16:31
 
Fecha de Ingreso: abril-2016
Ubicación: Madrid
Mensajes: 3
Antigüedad: 8 años
Puntos: 0
Respuesta: Tupla inaccesible dentro de otra tupla

Vale. Perdonadme. Horas buscando y justo después de preguntar voy a dar con la respuesta.

El problema era que no había probado bien. Los datos vienen empaquetados y hay que desempaquetarlos.

dato1, dato2, dato3 = TuplaDeDatos[1]

Y ya dato1 y demás son enteros que se pueden modificar.

Gracias y espero que mi tiempo perdido le sirva de algo a alguien.



////////////////////////////////////////////////////////////////////////////
import serial

import modbus_tk
import modbus_tk.defines as cst
import urllib, urllib2
from modbus_tk import modbus_rtu


#PORT = 1
PORT = '/dev/ttyUSB0'

def main():
"""main"""
#logger = modbus_tk.utils.create_logger("console")




while True:
# try:
#Connect to the slave
master = modbus_rtu.RtuMaster(
serial.Serial('/dev/ttyUSB0', baudrate=19200, bytesize=8, parity='N', stopbits=2, xonxoff=0)
)
master.set_timeout(0.07)
master.set_verbose(False)


kk = 0
while True:
TuplaDeDatos = (kk, master.execute(kk, cst.READ_HOLDING_REGISTERS, 0, 3))
if kk > 9: kk=0
kk = kk + 1


print TuplaDeDatos


if kk > 5:
nose1, nose2, nose3 = TuplaDeDatos[1]
print nose1 + 10
print nose2 + 25
print nose3 + 100
print type(nose1)






if __name__ == "__main__":
main()

Etiquetas: import, int, print, tupla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:05.