esphome/proto/t.py
2025-05-25 19:16:59 +02:00

64 lines
1.9 KiB
Python
Executable File

#!python
from pymodbus.client import ModbusSerialClient, ModbusTcpClient
from pymodbus.pdu.register_read_message import ReadInputRegistersResponse
from configModel import Algo, Metrique, Capteur, ModbusType
import struct, time
# client = ModbusTcpClient(host="shellyproem50-08f9e0e79718") # grarage (borne et pac)
# client = ModbusTcpClient(host="ShellyPro3EM-FCE8C0D97664") # bureau (prises 1 à 3)
client = ModbusSerialClient(
port="/dev/ttyACM0",
baudrate=4800,
# stopbits=capteur.comConfig.stopbits,
# bytesize=capteur.comConfig.bytesize,
# parity=capteur.comConfig.parity
)
def ieee754(registres:list):
float_bytes = struct.pack('HH', registres[0], registres[1])
return struct.unpack('f', float_bytes)[0]
def uint32(a, b):
ret:int = (a << 16) | b
return ret
slave = 1
def lireMetrique(metrique:Metrique, registre):
client.connect()
try:
data:ReadInputRegistersResponse = client.read_input_registers(registre, 2, slave=slave)
if data:
print(f"--> {data}")
registres = data.registers
if metrique.algo == Algo.NORMAL:
val = registres[0]
if metrique.algo == Algo.IEEE2:
val = round(ieee754(registres[0:2]), metrique.precision)
if metrique.algo == Algo.UINT32:
val = uint32(registres[0], registres[1])
if metrique.algo == Algo.STRING:
val = ''.join(chr(register) for register in data.registers)
if metrique.algo == Algo.BOOLEAN:
val = registres[0]
print(f"Captation sur {registre} : {val}")
except Exception as e:
print(f"Erreur lors de la captation sur {registre} : {e}")
finally:
client.close()
registre = -1
if __name__ == '__main__':
slave = 2
while True:
registre = 0
m:Metrique = Metrique(
idMetrique=1,
indexRegistreDepart=registre,
precision=3,
algo=Algo.NORMAL
)
lireMetrique(m, registre)
time.sleep(1)