To get Weewx to read Modbus sensors using a EW11 (RS485-wifi), Weewx-ModbusTcp and pymodbus.
As at 26-Jan-2026 I had to make a fix to Weewx-ModbusTcp. Replace “device_id” with “slave” at line 294.
# rr_read = self.read_holding_registers(address=register, count=length, device_id=slave_id)
rr_read = self.read_holding_registers(address=register, count=length, slave=slave_id)
To test a Modbus temperature/humidity sensor connected to a EW11 wifi-to-RS48 adapter.
This reads the first 2 holding registers from the Modbus sensor with address 4. To run it: $ sudo python3 pymodbus_modbus-temp-example.py
The yellow LED on the EW11 RJ45 connector indicates activity. The green LED indicates wifi activity.
#!/usr/bin/env python3
"""Read temperature from a Modbus sensor."""
from pymodbus.client import ModbusTcpClient
def read_temperature():
# Connect to device
client = ModbusTcpClient('192.168.1.90', port=502)
if client.connect():
print("✓ Connected to device")
# Read temperature (assuming it's at register 0)
# result = client.read_holding_registers(address=0, count=2) - original example missing slave id.
result = client.read_holding_registers(address=0, count=2, slave=4)
if not result.isError():
# Convert register value to temperature
# Many devices store temperature * 10
temperature = result.registers[0] / 100.0
print(f"Temperature: {temperature}°C")
humidity = result.registers[1] / 10.0
print(f"Humidity: {humidity}%")
else:
print(f"Error: {result}")
client.close()
else:
print("✗ Failed to connect")
if __name__ == "__main__":
read_temperature()
.
.
.