TUF-2000M setup

Hi all,

After reading a few post on here about flow measurements, I’ve bought a TUF-2000M with the small TS-2 sensors. This is running just fine over modbus with esphome on an ESP32 + RS485 converter. My config is as follows in case you’re also trying to do this:

uart:
  id: mod_bus_uart
  tx_pin: GPIO17
  rx_pin: GPIO16
  baud_rate: 9600
  # debug:
  #   direction: BOTH

modbus:
  id: modbus1
  uart_id: mod_bus_uart
  send_wait_time: 500ms

modbus_controller:
  - id: tuf2000m
    address: 0x1
    modbus_id: modbus1
    setup_priority: -10
    update_interval: 3s  # TODO: Default is 60, makes more sense once in prod

sensor:

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow rate"
    register_type: holding
    address: 0x1  # Register 1
    register_count: 2
    value_type: FP32
    device_class: "volume_flow_rate"
    state_class: "measurement"
    unit_of_measurement: "g/m"

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Velocity"
    register_type: holding
    address: 0x3  # Register 3
    register_count: 2
    value_type: FP32
    device_class: "speed"
    state_class: "measurement"
    unit_of_measurement: "m/s"

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Positive Accumulator"
    register_type: holding
    address: 0x9  # Register 9
    register_count: 2
    value_type: FP32
    device_class: "water"
    state_class: "measurement"
    unit_of_measurement: "g"

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Temperature #1"
    register_type: holding
    address: 0x21  # Register 33
    register_count: 2
    value_type: FP32
    device_class: "temperature"
    state_class: "measurement"
    unit_of_measurement: "°C"

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Temperature #2"
    register_type: holding
    address: 0x23  # Register 35
    register_count: 2
    value_type: FP32
    device_class: "temperature"
    state_class: "measurement"
    unit_of_measurement: "°C"

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Signal Quality"
    register_type: holding
    address: 0x5C  # Register 92
    register_count: 1
    value_type: U_WORD 
    lambda: |-
      return (uint16_t)(x) & 0xff;
    state_class: "measurement"
    unit_of_measurement: "%"

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Upstream Strength"
    register_type: holding
    address: 0x5D  # Register 93
    register_count: 1
    value_type: U_WORD 
    state_class: "measurement"
    lambda: |-
      return (x/2048.0)*100.0;
    unit_of_measurement: "%"

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Downstream Strength"
    register_type: holding
    address: 0x5E  # Register 94
    register_count: 1
    value_type: U_WORD 
    state_class: "measurement"
    lambda: |-
      return (x/2048.0)*100.0;
    unit_of_measurement: "%"

binary_sensor:

- platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Error No Signal"
    register_type: holding
    address: 0x48  # Register 72
    bitmask: 0x1

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Error Low Signal"
    register_type: holding
    address: 0x48  # Register 72
    bitmask: 0x2

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Error Poor Signal"
    register_type: holding
    address: 0x48  # Register 72
    bitmask: 0x4

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Error Pipe Empty"
    register_type: holding
    address: 0x48  # Register 72
    bitmask: 0x8

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Error Hardware Failure"
    register_type: holding
    address: 0x48  # Register 72
    bitmask: 0x10

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Error Gain Ajusting"
    register_type: holding
    address: 0x48  # Register 72
    bitmask: 0x20

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Error Freq Overflow"
    register_type: holding
    address: 0x48  # Register 72
    bitmask: 0x40

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Error RAM CS"
    register_type: holding
    address: 0x48  # Register 72
    bitmask: 0x100

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Error Clock"
    register_type: holding
    address: 0x48  # Register 72
    bitmask: 0x200

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Error Parameters CS"
    register_type: holding
    address: 0x48  # Register 72
    bitmask: 0x400

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Error ROM CS"
    register_type: holding
    address: 0x48  # Register 72
    bitmask: 0x800

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Error Temp Circuits"
    register_type: holding
    address: 0x48  # Register 72
    bitmask: 0x1000

  - platform: modbus_controller
    modbus_controller_id: tuf2000m
    name: "${friendly_name} Flow Meter Error Internal timer"
    register_type: holding
    address: 0x48  # Register 72
    bitmask: 0x4000

What I have problems with is getting it to actually work though. I live in the US and have new 1" copper pipe (type L). When measuring these I get an OD of 28.6mm, ID of 26.0mm and a wall thickness of 1.3mm. (A bit thicker than the standard says it should be but that’s a good thing I guess. Plugging in the standard’s numbers makes no real difference.)

When feeding these parameters into the unit I get a distance of ~4mm in V setup and 11mm in a W setup. In either configuration I can get to a signal quality of ~85 with some variance between 78 and 90 over time and fiddling. However neither of these happens at the distance the unit indicates, I’m always a few mm off (it’s actually not clear how to exactly measure but I assume just between the sensors going by the images in the manual).

However going by the manual after this step the next one is to get the TOM/TOS ratio around 100 ±3. In neither setup I’ve gotten anywhere near this. In the V config it was around 111 and in the W config it’s 76%

image

The resulting flow numbers make no sense at all either. Even with all valves closed I’m running about 0.5 gallon/minute. Zeroing things out doesn’t improve the situation. Large or no flow makes no difference either.

Does anyone have this working by chance? Any tips you can share to get this working would be much appreciated!

I don’t even have your hardware, but I got curious…
Anyway, I wouldn’t trust too much distance given, it’s not a swiss made medical equipment.
Try distances from 0 in 2mm increments and control signal strength, signal quality and tom/tos. I expect tom/tos should be spot on to have accurate results.

So I’ve spent quite a bit of quality time getting this to work and must admit that I’ve failed to get something that even gets close to reality going.

Over the course of a few hours I’ve tried N, V and W modes. Signal quality I can get up to high 80’s% in most situations. However TOS/TOM best I ever got was 104.25% and that’s in an orientation that is not reasonable (V mode with sensors nearly touching). most of the time it’s either high 70% or 110%+

Flow measurements are not realistic in any of the attempts and do not reflect reality at all under both no flow and flow situations.

I can only conclude that this doesn’t work for me on a US 1" (28.3mm OD) copper L pipe. If anyone has this working I’d be happy to hear it.

Dennis,

I just bought a TUF-2000B with a pair of TS-2. I’m planning to 3D print a mounting template that will space the devices somewhere near the ~4.5 mm spacing the device tells me I’m supposed to have. I did view the following YouTube video (https://www.youtube.com/watch?v=L0udGBz2_0M) which I found to be helpful. Out of curiosity, is your ESPHome script above working, and you’re just unhappy with the accuracy of the data you’re getting?

Just in case anyone in the future is having problems, you need an acoustic couplant between the sensors and the pipes. Silicone grease for example.