esphome: name: uart-mock-modbus-lambda-write host: api: logger: level: VERBOSE external_components: - source: type: local path: EXTERNAL_COMPONENT_PATH # Dummy uart entry to satisfy modbus's DEPENDENCIES = ["uart"] # The actual UART bus used is the uart_mock component below uart: baud_rate: 115200 port: /dev/null uart_mock: - id: virtual_uart_server baud_rate: 9600 auto_start: true debug: on_tx: - then: - uart_mock.inject_rx: id: virtual_uart_controller data: !lambda return data; - id: virtual_uart_controller baud_rate: 9600 auto_start: true debug: on_tx: - then: - uart_mock.inject_rx: id: virtual_uart_server data: !lambda return data; globals: - id: reg30 type: uint16_t initial_value: "0" modbus: - uart_id: virtual_uart_server id: virtual_modbus_server role: server - uart_id: virtual_uart_controller id: virtual_modbus_controller role: client turnaround_time: 10ms modbus_controller: - address: 1 modbus_id: virtual_modbus_controller id: modbus_controller_1 update_interval: 1s modbus_server: - address: 1 modbus_id: virtual_modbus_server id: modbus_server_1 registers: - address: 0x30 value_type: U_WORD read_lambda: return id(reg30); write_lambda: id(reg30) = x; return true; # A COIL-type switch (assumed_state, write-only) whose write_lambda ignores its own coil type and instead # drives a HOLDING-REGISTER write on the mock server through the entity itself: `item` IS the command, so # item->write_single_register() sends a register write from a coil entity (cross-type). Returning nothing # (an empty optional) tells the write path the lambda already dispatched the frame - no default coil write. switch: - platform: modbus_controller modbus_controller_id: modbus_controller_1 name: "cross_switch" register_type: coil address: 0x00 assumed_state: true write_lambda: |- item->write_single_register(0x30, x ? 1234 : 0); return {}; sensor: - platform: modbus_controller modbus_controller_id: modbus_controller_1 name: "reg_30" address: 0x30 register_type: holding value_type: U_WORD button: - platform: template name: "Start Scenario" id: start_scenario_btn # This test does not have anything to start (mock is autostart)