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()