Projet de remplacement du "RPiPasserelle" d'Otec.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

modbus.py 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #!/usr/bin/env python3
  2. import os
  3. from serial import Serial
  4. from umodbus.client.serial import rtu
  5. import umodbus
  6. from pyheatpump.config import config
  7. from pyheatpump.logger import logger_init
  8. logger = logger_init()
  9. serial_conn = None
  10. def connect():
  11. global serial_conn
  12. if serial_conn is None:
  13. real_serial_port = os.path.realpath(
  14. config.get('heatpump', 'serial_port'))
  15. logger.info('Connecting to serial port *%s* (%s)',
  16. config.get('heatpump', 'serial_port'),
  17. real_serial_port)
  18. serial_conn = Serial(
  19. port=real_serial_port,
  20. baudrate=config.get('heatpump', 'baudrate'),
  21. bytesize=8,
  22. parity='N',
  23. stopbits=1,
  24. timeout=20)
  25. if serial_conn.open is False:
  26. logger.debug('Opening serial port *%s*', config.get('heatpump', 'serial_port')
  27. serial_conn.open()
  28. return serial_conn
  29. def read_coils(start, end):
  30. global serial_con
  31. connect()
  32. res = []
  33. address = -1
  34. qty = -1
  35. logger.info('read_coils: [%s, %s]', start, end)
  36. try:
  37. for address in range(start, end + 1, 125):
  38. qty = 125 if (end - address) >= 125 else (end - address)
  39. if not qty:
  40. break
  41. req_adu = rtu.read_coils(
  42. slave_id=1,
  43. starting_address=address,
  44. quantity=qty)
  45. response = rtu.send_message(req_adu, serial_conn)
  46. res.extend(response)
  47. except umodbus.exceptions.IllegalDataAddressError as e:
  48. logger.error(e)
  49. logger.debug('address:%s qty:%s', address, qty)
  50. logger.debug('read_coils [%s, %s] result: %s', start, end, res)
  51. return res
  52. def read_holding_registers(start, end):
  53. global serial_conn
  54. connect()
  55. res = []
  56. address = -1
  57. qty = -1
  58. logger.debug('read_holding_registers [%s, %s]',
  59. start, end
  60. )
  61. try:
  62. for address in range(start, end + 1, 125):
  63. qty = 125 if (end - address) >= 125 else (end - address)
  64. if not qty:
  65. break
  66. req_adu = rtu.read_holding_registers(
  67. slave_id=1,
  68. starting_address=address,
  69. quantity=qty)
  70. response = rtu.send_message(req_adu, serial_conn)
  71. res.extend(response)
  72. except umodbus.exceptions.IllegalDataAddressError as e:
  73. logger.error('read_holding_registers(%s, %s): address:%s, qty:%s\n%s',
  74. start, end, address, qty, e)
  75. logger.debug('read_holding_registers [%s, %s] result: %s', start, end, res)
  76. return res
  77. def write_coil(var_value):
  78. global serial_conn
  79. connect()
  80. logger.debug('write_coil address: %s, value: %s',
  81. var_value.address, var_value.value
  82. )
  83. try:
  84. req_adu = rtu.write_single_coil(
  85. slave_id=1,
  86. address=var_value.address,
  87. value=var_value.value)
  88. response = rtu.send_message(req_adu, serial_conn)
  89. logger.debug('write_coil address: %s, response: %s',
  90. var_value.address, response)
  91. if response != var_value.value:
  92. return False
  93. return True
  94. except Exception as e:
  95. raise e
  96. def write_holding_register(var_value):
  97. global serial_conn
  98. connect()
  99. logger.debug('write_holding_register address: %s, value: %s',
  100. var_value.address, var_value.value
  101. )
  102. try:
  103. req_adu = rtu.write_single_register(
  104. slave_id=1,
  105. address=var_value.address,
  106. value=var_value.value)
  107. response = rtu.send_message(req_adu, serial_conn)
  108. logger.debug('write_holding_register, addres: %s, response: %s',
  109. var_value.address, response)
  110. if response != var_value.value:
  111. return False
  112. return True
  113. except Exception as e:
  114. raise e