I’m not a python expert, but this seems to work…
Python script snippet - getModbusData.py
#!/usr/bin/env python
import requests
import json
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.client.sync import ModbusTcpClient as ModbusClient
#Define Modbus Target Device
client = ModbusClient('X.X.X.X',port=502)
client.connect()
controller = 0x01
address = 0x01
count2 = 19
result2 = client.read_coils(address, count2, unit=controller)
client.close()
#REPEAT THE FOLLOWING FOR EACH REGISTER
sensorname = 'binarysensor.pump_status'
if result2.bits[0]:
data = {"state": "On"}
else:
data = {"state": "Off"}
url = 'http://localhost:8123/api/states/' + sensorname
data_json = json.dumps(data)
headers = {'Content-type': 'application/json'}
response = requests.post(url, data=data_json)
command_shell.yaml snippet:
getmodbusbinary: 'python /PATH_TO_SCRIPT/getModbusData.py'
automation.yaml snippet:
- alias: 'Update Binary Sensors'
trigger:
platform: time
seconds: '/5'
action:
service: shell_command.getmodbusbinary