ESPHome + modbus + kilka liczników

Na samym wstępie chciałem powitać wszystkich, jestem od niedawna tutaj nowym użytkownikiem.

Hardware:

ESP32-S3 16 flash + CC1101 + modbus VCX DTS-1946.

Software:

Środowisko programistyczne to: Homeassistant 2026.2.3 ESPHome 2026.2.4

Projekt to odczyt z liczników wody, energii elektrycznej, później energii cieplnej z kilku mieszkań jednego domu.

Program jako tako działa, odczyty z wodomierzy działają. Z Liczników energii też.

Natomiast zacząłem poprawiać kod i chcę zastosować odczyt liczników energii jako pakiet z dodatkowego pliku vcx_meter.yaml. Niestety nie mogę sobie z tym poradzić. Kombinuję już z wszystkimi AI. Ale dalej jestem w tym samym miejscu. Może ktoś doradzi co robię źle, lub podpowie w którym miejscu jest błąd.

Validacja pliku testboard:

INFO ESPHome 2026.2.4
INFO Reading configuration /config/esphome/testboard.yaml...
Failed config

extra keys not allowed

required key not provided

Validacja pliku vcx:

INFO ESPHome 2026.2.4
INFO Reading configuration /config/esphome/vcx_meter.yaml...
Failed config

'esphome' section missing from configuration. Please make sure your configuration has an 'esphome:' line in it.

Poniżej kod pliku testboard.yaml oraz vcx_meter.yaml.

esphome:
  name: testboard
  friendly_name: testboard
  on_boot:
    then:
      - pcf85063.read_time:
          id: pcf85063_time

packages:
  - file: vcx_meter.yaml
    vars:
      meter_id: VCX1
      meter_name: "M1"
  - file: vcx_meter.yaml
    vars:
      meter_id: VCX2
      meter_name: "M2"
  - file: vcx_meter.yaml
    vars:
      meter_id: VCX3
      meter_name: "M3"
  - file: vcx_meter.yaml
    vars:
      meter_id: VCX4
      meter_name: "Pompa Ciepła"

esp32:
  board: esp32-s3-devkitc-1
  variant: esp32s3
  flash_size: 16MB
  framework:
    type: esp-idf


# Enable logging
logger:
  level: INFO



# Enable Home Assistant API
api:
  encryption:
    key: "IKF9+rDP0hithsbwqnO2ncZ2ZHo1FMGUnPD0l3wOABU="

ota:
  - platform: esphome
    password: "41fde50f3d877f29bacc64206b9b7c05"
    

# wifi:
#   ssid: !secret wifi_ssid
#   password: !secret wifi_password

#   # Enable fallback hotspot (captive portal) in case wifi connection fails
#   ap:
#     ssid: "Testboard Fallback Hotspot"
#     password: "Iw8wwwqxdP5H"


# Enable Web server.
web_server:
  port: 80

#captive_portal:

# I2C
i2c:
  sda: GPIO42
  scl: GPIO41
  frequency: 100kHz
  id: i2cbus
  scan: false

# ETHERNET
ethernet:
  type: W5500
  clk_pin: GPIO15
  mosi_pin: GPIO13
  miso_pin: GPIO14
  cs_pin: GPIO16
  interrupt_pin: GPIO12
  reset_pin: GPIO39

# RS485
uart:
 - id: UART_RS485
   tx_pin: GPIO17
   rx_pin: GPIO18
   baud_rate: 9600
   stop_bits: 1
   data_bits: 8
   parity: NONE

# ModBus RTU
modbus:
  id: modbus_hub
  uart_id: UART_RS485
  send_wait_time: 50ms

modbus_controller:
  - id: VCX1
    modbus_id: modbus_hub
    address: 1
    update_interval: 1s
    command_throttle: 50ms
    allow_duplicate_commands: true

  - id: VCX2
    modbus_id: modbus_hub
    address: 2
    update_interval: 1s
    command_throttle: 50ms
    allow_duplicate_commands: true

  - id: VCX3
    modbus_id: modbus_hub
    address: 3
    update_interval: 1s
    command_throttle: 50ms
    allow_duplicate_commands: true

  - id: VCX4
    modbus_id: modbus_hub
    address: 4
    update_interval: 1s
    command_throttle: 50ms
    allow_duplicate_commands: true

# TIME
time:
  - platform: homeassistant
    id: ha_time
    on_time_sync:
      then:
        # Update the RTC when the synchronization was successful
        - pcf85063.write_time:
  - platform: pcf85063
    id: pcf85063_time

# WMBUS - COMPONENT
external_components:
  - source: github://SzczepanLeon/esphome-components@main
    refresh: 1d
    components:
      - wmbus_meter
      - wmbus_common
  - source: github://enr0c/esphome-components@main
    components: [ wmbus_radio ]
    refresh: 1d

# SPI
spi:
  - id: radio
    clk_pin: GPIO1 #GPIO5
    mosi_pin:
        number: GPIO45 #GPIO4
        ignore_strapping_warning: true
    miso_pin: GPIO47 #GPIO7
    interface: spi3

# WMBUS RADIO
wmbus_radio:
  spi_id: radio
  radio_type: CC1101
  frequency: 868.950

  gdo2_pin: GPIO48 #GPIO6
  gdo0_pin: GPIO38 #GPIO8
  cs_pin:
    number: GPIO0 #GPIO3
    ignore_strapping_warning: true
  
# WMBUS METERS
wmbus_meter:
  - id: water_meter_1
    meter_id: 0x01964733  ######## enter your APATOR meter ID here ###########
    type: apator162
    key: "00000000000000000000000000000000"

  - id: water_meter_2
    meter_id: 0x01933725  ######## enter your APATOR meter ID here ###########
    type: apator162
    key: "00000000000000000000000000000000"

  - id: water_meter_3
    meter_id: 0x01960220  ######## enter your APATOR meter ID here ###########
    type: apator162
    key: "00000000000000000000000000000000"

  - id: water_meter_4
    meter_id: 0x01939505  ######## enter your APATOR meter ID here ###########
    type: apator162
    key: "00000000000000000000000000000000"

  - id: water_meter_5
    meter_id: 0x01933190  ######## enter your APATOR meter ID here ###########
    type: apator162
    key: "00000000000000000000000000000000"

  - id: water_meter_6
    meter_id: 0x01935014  ######## enter your APATOR meter ID here ###########
    type: apator162
    key: "00000000000000000000000000000000"

# SENSORS
sensor:

## Wodomierze
  - platform: wmbus_meter
    parent_id: water_meter_1 #Water meter Apator
    field: total_m3
    device_class: water
    name: Wodomierz zimna 1 zużycie 
    accuracy_decimals: 3
    state_class: total_increasing
    unit_of_measurement: "m³"
  - platform: wmbus_meter
    parent_id: water_meter_1
    field: rssi_dbm
    name: Wodomierz zimna 1 - RSSI
    unit_of_measurement: "dBm"

  - platform: wmbus_meter
    parent_id: water_meter_2 #Water meter Apator
    field: total_m3
    device_class: water
    name: Wodomierz zimna 2 zużycie
    accuracy_decimals: 3
    state_class: total_increasing
    unit_of_measurement: "m³"
  - platform: wmbus_meter
    parent_id: water_meter_2
    field: rssi_dbm
    name: Wodomierz zimna 2 - RSSI
    unit_of_measurement: "dBm"

  - platform: wmbus_meter
    parent_id: water_meter_3 #Water meter Apator
    field: total_m3
    device_class: water
    name: Wodomierz zimna 3 zużycie
    accuracy_decimals: 3
    state_class: total_increasing
    unit_of_measurement: "m³"
  - platform: wmbus_meter
    parent_id: water_meter_3
    field: rssi_dbm
    name: Wodomierz zimna 3 - RSSI
    unit_of_measurement: "dBm"

  - platform: wmbus_meter
    parent_id: water_meter_4 #Water meter Apator
    field: total_m3
    device_class: water
    name: Wodomierz ciepła 1 zużycie 
    accuracy_decimals: 3
    state_class: total_increasing
    unit_of_measurement: "m³"
  - platform: wmbus_meter
    parent_id: water_meter_4
    field: rssi_dbm
    name: Wodomierz ciepła 1 - RSSI
    unit_of_measurement: "dBm"

  - platform: wmbus_meter
    parent_id: water_meter_5 #Water meter Apator
    field: total_m3
    device_class: water
    name: Wodomierz ciepła 2 zużycie
    accuracy_decimals: 3
    state_class: total_increasing
    unit_of_measurement: "m³"
  - platform: wmbus_meter
    parent_id: water_meter_5
    field: rssi_dbm
    name: Wodomierz ciepła 2 - RSSI
    unit_of_measurement: "dBm"

  - platform: wmbus_meter
    parent_id: water_meter_6 #Water meter Apator
    field: total_m3
    device_class: water
    name: Wodomierz ciepła 3 zużycie
    accuracy_decimals: 3
    state_class: total_increasing
    unit_of_measurement: "m³"
  - platform: wmbus_meter
    parent_id: water_meter_6
    field: rssi_dbm
    name: Wodomierz ciepła 3 - RSSI
    unit_of_measurement: "dBm"
sensor:
  - platform: modbus_controller
    modbus_controller_id: ${meter_id}
    name: "${meter_name} Napięcie L1"
    address: 0
    register_type: holding
    register_count: 60
    value_type: FP32
    unit_of_measurement: "V"
    accuracy_decimals: 1
    force_new_range: true
  - platform: modbus_controller
    modbus_controller_id: ${meter_id}
    name: "${meter_name} Napięcie L2"
    address: 0
    byte_offset: 4
    register_type: holding
    value_type: FP32
    unit_of_measurement: "V"
  - platform: modbus_controller
    modbus_controller_id: ${meter_id}
    name: "${meter_name} Napięcie L3"
    address: 0
    byte_offset: 8
    register_type: holding
    value_type: FP32
    unit_of_measurement: "V"
  - platform: modbus_controller
    modbus_controller_id: ${meter_id}
    name: "${meter_name} Prąd L1"
    address: 0
    byte_offset: 24
    register_type: holding
    value_type: FP32
    unit_of_measurement: "A"
  - platform: modbus_controller
    modbus_controller_id: ${meter_id}
    name: "${meter_name} Prąd L2"
    address: 0
    byte_offset: 28
    register_type: holding
    value_type: FP32
    unit_of_measurement: "A"
  - platform: modbus_controller
    modbus_controller_id: ${meter_id}
    name: "${meter_name} Prąd L3"
    address: 0
    byte_offset: 32
    register_type: holding
    value_type: FP32
    unit_of_measurement: "A"
  - platform: modbus_controller
    modbus_controller_id: ${meter_id}
    name: "${meter_name} Moc L1"
    address: 0
    byte_offset: 36
    register_type: holding
    value_type: FP32
    unit_of_measurement: "W"
  - platform: modbus_controller
    modbus_controller_id: ${meter_id}
    name: "${meter_name} Moc L2"
    address: 0
    byte_offset: 40
    register_type: holding
    value_type: FP32
    unit_of_measurement: "W"
  - platform: modbus_controller
    modbus_controller_id: ${meter_id}
    name: "${meter_name} Moc L3"
    address: 0
    byte_offset: 44
    register_type: holding
    value_type: FP32
    unit_of_measurement: "W"
  - platform: modbus_controller
    modbus_controller_id: ${meter_id}
    name: "${meter_name} Energia"
    address: 0
    byte_offset: 104
    register_type: holding
    value_type: FP32
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing