Issues with Modbus at CV800D VFD

Hi,

hopefully someone can help

hier is my yaml

# Disable logging
logger:   
  baud_rate: 0

uart:
  - id: modbus_filter_pump
    tx_pin: GPIO24
    rx_pin: GPIO33
    baud_rate: 9600
    parity: EVEN
    stop_bits: 1
  - id: modbus_gsa_pump
    tx_pin: GPIO26
    rx_pin: GPIO48
    baud_rate: 9600
    parity: EVEN
    stop_bits: 1
  - id: modbus_hayward
    tx_pin: GPIO53
    rx_pin: GPIO47
    baud_rate: 9600

modbus:
  - uart_id: modbus_filter_pump
    id: vfd_modbus_filter
  - uart_id: modbus_gsa_pump
    id: vfd_modbus_gsa

modbus_controller:
  - id: filter_vfd
    address: 0x1
    modbus_id: vfd_modbus_filter
    setup_priority: -10
  - id: gsa_vfd
    address: 0x1
    modbus_id: vfd_modbus_gsa
    setup_priority: -10

sensor:
  # Aktuelle Ausgangsfrequenz lesen (d00.00 laut Manual Seite 69)
  - platform: modbus_controller
    modbus_controller_id: filter_vfd
    id: filter_pump_frequency
    name: "Poolpumpe Frequenz Aktuell"
    address: 0x7000
    register_type: holding
    value_type: U_WORD
    unit_of_measurement: "Hz"
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
  # Aktuelle Frequenzvorgabe lesen (d00.01 laut Manual Seite 69)
  - platform: modbus_controller
    modbus_controller_id: filter_vfd
    id: filter_pump_frequency_set_monitor
    name: "Poolpumpe Frequenz Vorgabe"
    address: 0x7001
    register_type: holding
    value_type: U_WORD
    unit_of_measurement: "Hz"
    accuracy_decimals: 2
    filters:
      - multiply: 0.01

number:
  # Frequenzvorgabe schreiben (Register 0x1000 laut Manual Anhang I)
  - platform: modbus_controller
    modbus_controller_id: filter_vfd
    name: "Poolpumpe Frequenz Vorgabe"
    address: 0x1000
    register_type: holding
    value_type: U_WORD
    min_value: 0
    max_value: 100
    step: 1
    unit_of_measurement: "%"
    mode: box
    # Umrechnung: 100.00 % im UI -> sendet 5000 an den VFD (0.01Hz Steps)
    lambda: "return x * 0.01;"
    write_lambda: "return x * 100.0;"

select:
- platform: modbus_controller
  modbus_controller_id: filter_vfd
  name: "Poolpumpe Betrieb"
  icon: "mdi:pump"
  address: 0x2000
  value_type: U_WORD
  optimistic: true
  optionsmap:
    "Forward Running": 1
    "Coast to Stop": 5

first of all Register 0x2000 is just for setting the value, this seems to work, but i get an error because he tries to read the status of 0x2000 but the status should be read from 0x3000 … how can i achieve this?

btw i found some old code:

 turn_on_action:
      - modbus_controller.write_register:
          id: filter_vfd
          address: 0x2000
          value: 1        # 0001H: Start Forward

but it seems ther is no modbus_controller.write_register?

Did you try how it behaves with custom_command?

i changed it now to:

  - platform: modbus_controller
    modbus_controller_id: filter_vfd
    id: filter_vfd_status_raw
    name: "Poolpumpe Status Code"
    address: 0x3000
    register_type: holding
    value_type: U_WORD
    internal: true 
    web_server:
      sorting_group_id: sorting_group_misc

select:
  - platform: template
    id: pool_run_cmd
    name: "Poolpumpe Betrieb"
    icon: "mdi:pump"
    options:
      - "Forward Running"
      - "Coast to Stop"

    # Anzeige/Status kommt aus 0x3000 
    lambda: |-
      if (!id(filter_vfd_status_raw).has_state()) return {};
      const int st = (int) id(filter_vfd_status_raw).state;

      // typisch: 0 = Stop, 1 = Forward Run, 2 = Reverse Run
      if (st == 1 || st == 2) return std::string("Forward Running");
      return std::string("Coast to Stop");

    # Beim Setzen schreiben wir nach 0x2000 
    set_action:
      - lambda: |-
          auto *controller = id(filter_vfd);

          uint16_t cmd = 5; // Coast to Stop
          if (x == "Forward Running") cmd = 1;

          esphome::modbus_controller::ModbusCommandItem write_cmd =
              esphome::modbus_controller::ModbusCommandItem::create_write_single_command(
                  controller, 0x2000, cmd);

          controller->queue_command(write_cmd);
    web_server:
      sorting_group_id: sorting_group_misc

seems to work fine