modbus_controller:
  - id: ${enm_id}
    address: ${enm_address}        # Modbus slave ID
    modbus_id: modbus_bus
    update_interval: 3s
    command_throttle: 50ms
    allow_duplicate_commands: false

# ===================== Discrete Inputs (FC02) =====================
# NEW MAP:
# LEDs: 0..3 | Buttons: 4..7 | Relays: 8..9 | Alarms: 16..27 (addr = 16 + ch*3 + kind, ch=0..3)
binary_sensor:
  # --- LED physical states ---
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} LED1"
    address: 0
    register_type: discrete_input
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} LED2"
    address: 1
    register_type: discrete_input
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} LED3"
    address: 2
    register_type: discrete_input
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} LED4"
    address: 3
    register_type: discrete_input

  # --- Buttons pressed ---
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} BTN1"
    address: 4
    register_type: discrete_input
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} BTN2"
    address: 5
    register_type: discrete_input
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} BTN3"
    address: 6
    register_type: discrete_input
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} BTN4"
    address: 7
    register_type: discrete_input

  # --- Relay physical state ---
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Relay 1 State"
    address: 8
    register_type: discrete_input
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Relay 2 State"
    address: 9
    register_type: discrete_input

  # --- Alarm active flags (kind: 0=Alarm,1=Warning,2=Event), ch: 0=L1,1=L2,2=L3,3=Total ---
  # L1 (16..18)
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Alarm L1 (Alarm)"
    address: 16
    register_type: discrete_input
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Alarm L1 (Warning)"
    address: 17
    register_type: discrete_input
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Alarm L1 (Event)"
    address: 18
    register_type: discrete_input

  # L2 (19..21)
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Alarm L2 (Alarm)"
    address: 19
    register_type: discrete_input
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Alarm L2 (Warning)"
    address: 20
    register_type: discrete_input
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Alarm L2 (Event)"
    address: 21
    register_type: discrete_input

  # L3 (22..24)
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Alarm L3 (Alarm)"
    address: 22
    register_type: discrete_input
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Alarm L3 (Warning)"
    address: 23
    register_type: discrete_input
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Alarm L3 (Event)"
    address: 24
    register_type: discrete_input

  # Total (25..27)
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Alarm Total (Alarm)"
    address: 25
    register_type: discrete_input
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Alarm Total (Warning)"
    address: 26
    register_type: discrete_input
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Alarm Total (Event)"
    address: 27
    register_type: discrete_input


# ===================== Coils (FC01/05) =====================
# NEW MAP:
# Relay coils: 0..1
# Ack coils: 16..19 (write 1 to ACK; device auto-clears to 0)
switch:
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Relay 1"
    address: 0
    register_type: coil
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Relay 2"
    address: 1
    register_type: coil

  # --- Alarm acknowledgements (write 1 to ACK; device auto-clears to 0) ---
  - platform: modbus_controller
    id: ${enm_id}_ack_l1
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} ACK L1"
    address: 16
    register_type: coil
    on_turn_on:
      - delay: 200ms
      - switch.turn_off: ${enm_id}_ack_l1

  - platform: modbus_controller
    id: ${enm_id}_ack_l2
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} ACK L2"
    address: 17
    register_type: coil
    on_turn_on:
      - delay: 200ms
      - switch.turn_off: ${enm_id}_ack_l2

  - platform: modbus_controller
    id: ${enm_id}_ack_l3
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} ACK L3"
    address: 18
    register_type: coil
    on_turn_on:
      - delay: 200ms
      - switch.turn_off: ${enm_id}_ack_l3

  - platform: modbus_controller
    id: ${enm_id}_ack_total
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} ACK Total"
    address: 19
    register_type: coil
    on_turn_on:
      - delay: 200ms
      - switch.turn_off: ${enm_id}_ack_total


# ===================== Sensors (FC04 Input Registers RO) =====================
# NEW MAP:
# Urms: 0..2 (0.01V) | Irms: 3..5 (0.001A)
# Freq: 6 (0.01Hz) | Temp: 7 (int16°C)
# PF raw: 8..11 (x0.001)
# P (s32): 20/22/24/26  | Q (s32): 28/30/32/34 | S (s32): 36/38/40/42
# Angles: 44..46 (0.1°)
# Energies (u32): base 60 (see below)
sensor:
  # --- RMS ---
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Urms L1"
    address: 0
    register_type: read
    value_type: U_WORD
    unit_of_measurement: "V"
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
      - lambda: "return round(x * 100.0f) / 100.0f;"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Urms L2"
    address: 1
    register_type: read
    value_type: U_WORD
    unit_of_measurement: "V"
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
      - lambda: "return round(x * 100.0f) / 100.0f;"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Urms L3"
    address: 2
    register_type: read
    value_type: U_WORD
    unit_of_measurement: "V"
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
      - lambda: "return round(x * 100.0f) / 100.0f;"

  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Irms L1"
    address: 3
    register_type: read
    value_type: U_WORD
    unit_of_measurement: "A"
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
      - lambda: "return round(x * 1000.0f) / 1000.0f;"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Irms L2"
    address: 4
    register_type: read
    value_type: U_WORD
    unit_of_measurement: "A"
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
      - lambda: "return round(x * 1000.0f) / 1000.0f;"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Irms L3"
    address: 5
    register_type: read
    value_type: U_WORD
    unit_of_measurement: "A"
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
      - lambda: "return round(x * 1000.0f) / 1000.0f;"

  # --- PF (×1000) & Angle (×0.1°) ---
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} PF L1"
    address: 8
    register_type: read
    value_type: S_WORD
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
      - lambda: "return round(x * 1000.0f) / 1000.0f;"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} PF L2"
    address: 9
    register_type: read
    value_type: S_WORD
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
      - lambda: "return round(x * 1000.0f) / 1000.0f;"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} PF L3"
    address: 10
    register_type: read
    value_type: S_WORD
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
      - lambda: "return round(x * 1000.0f) / 1000.0f;"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} PF Total"
    address: 11
    register_type: read
    value_type: S_WORD
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
      - lambda: "return round(x * 1000.0f) / 1000.0f;"

  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Angle L1"
    address: 44
    register_type: read
    value_type: S_WORD
    unit_of_measurement: "°"
    accuracy_decimals: 1
    filters:
      - multiply: 0.1
      - lambda: "return round(x * 10.0f) / 10.0f;"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Angle L2"
    address: 45
    register_type: read
    value_type: S_WORD
    unit_of_measurement: "°"
    accuracy_decimals: 1
    filters:
      - multiply: 0.1
      - lambda: "return round(x * 10.0f) / 10.0f;"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Angle L3"
    address: 46
    register_type: read
    value_type: S_WORD
    unit_of_measurement: "°"
    accuracy_decimals: 1
    filters:
      - multiply: 0.1
      - lambda: "return round(x * 10.0f) / 10.0f;"

  # --- Frequency & Temperature ---
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Line Frequency"
    address: 6
    register_type: read
    value_type: U_WORD
    unit_of_measurement: "Hz"
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
      - lambda: "return round(x * 100.0f) / 100.0f;"

  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Temperature"
    address: 7
    register_type: read
    value_type: S_WORD
    unit_of_measurement: "°C"

  # --- P/Q/S (s32, whole watts/var/VA) ---
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} P L1"
    address: 20
    register_type: read
    value_type: S_DWORD
    unit_of_measurement: "W"
    accuracy_decimals: 0
    filters:
      - lambda: "return (float) ((int) round(x));"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} P L2"
    address: 22
    register_type: read
    value_type: S_DWORD
    unit_of_measurement: "W"
    accuracy_decimals: 0
    filters:
      - lambda: "return (float) ((int) round(x));"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} P L3"
    address: 24
    register_type: read
    value_type: S_DWORD
    unit_of_measurement: "W"
    accuracy_decimals: 0
    filters:
      - lambda: "return (float) ((int) round(x));"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} P Total"
    address: 26
    register_type: read
    value_type: S_DWORD
    unit_of_measurement: "W"
    accuracy_decimals: 0
    filters:
      - lambda: "return (float) ((int) round(x));"

  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Q L1"
    address: 28
    register_type: read
    value_type: S_DWORD
    unit_of_measurement: "var"
    accuracy_decimals: 0
    filters:
      - lambda: "return (float) ((int) round(x));"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Q L2"
    address: 30
    register_type: read
    value_type: S_DWORD
    unit_of_measurement: "var"
    accuracy_decimals: 0
    filters:
      - lambda: "return (float) ((int) round(x));"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Q L3"
    address: 32
    register_type: read
    value_type: S_DWORD
    unit_of_measurement: "var"
    accuracy_decimals: 0
    filters:
      - lambda: "return (float) ((int) round(x));"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} Q Total"
    address: 34
    register_type: read
    value_type: S_DWORD
    unit_of_measurement: "var"
    accuracy_decimals: 0
    filters:
      - lambda: "return (float) ((int) round(x));"

  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} S L1"
    address: 36
    register_type: read
    value_type: S_DWORD
    unit_of_measurement: "VA"
    accuracy_decimals: 0
    filters:
      - lambda: "return (float) ((int) round(x));"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} S L2"
    address: 38
    register_type: read
    value_type: S_DWORD
    unit_of_measurement: "VA"
    accuracy_decimals: 0
    filters:
      - lambda: "return (float) ((int) round(x));"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} S L3"
    address: 40
    register_type: read
    value_type: S_DWORD
    unit_of_measurement: "VA"
    accuracy_decimals: 0
    filters:
      - lambda: "return (float) ((int) round(x));"
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} S Total"
    address: 42
    register_type: read
    value_type: S_DWORD
    unit_of_measurement: "VA"
    accuracy_decimals: 0
    filters:
      - lambda: "return (float) ((int) round(x));"

  # --- Energies (u32 Wh/varh/VAh) — Total Increasing ---
  # Energy table base = 60:
  # AP: 60/62/64/66
  # AN: 68/70/72/74
  # RP: 76/78/80/82
  # RN: 84/86/88/90
  # S : 92/94/96/98
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} AP L1"
    address: 60
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "Wh"
    device_class: energy
    state_class: total_increasing
    skip_updates: 29
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} AP L2"
    address: 62
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "Wh"
    device_class: energy
    state_class: total_increasing
    skip_updates: 29
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} AP L3"
    address: 64
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "Wh"
    device_class: energy
    state_class: total_increasing
    skip_updates: 29
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} AP Total"
    address: 66
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "Wh"
    device_class: energy
    state_class: total_increasing
    skip_updates: 29

  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} AN L1"
    address: 68
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "Wh"
    device_class: energy
    state_class: total_increasing
    skip_updates: 29
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} AN L2"
    address: 70
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "Wh"
    device_class: energy
    state_class: total_increasing
    skip_updates: 29
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} AN L3"
    address: 72
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "Wh"
    device_class: energy
    state_class: total_increasing
    skip_updates: 29
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} AN Total"
    address: 74
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "Wh"
    device_class: energy
    state_class: total_increasing
    skip_updates: 29

  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} RP L1"
    address: 76
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "varh"
    state_class: total_increasing
    skip_updates: 29
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} RP L2"
    address: 78
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "varh"
    state_class: total_increasing
    skip_updates: 29
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} RP L3"
    address: 80
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "varh"
    state_class: total_increasing
    skip_updates: 29
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} RP Total"
    address: 82
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "varh"
    state_class: total_increasing
    skip_updates: 29

  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} RN L1"
    address: 84
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "varh"
    state_class: total_increasing
    skip_updates: 29
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} RN L2"
    address: 86
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "varh"
    state_class: total_increasing
    skip_updates: 29
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} RN L3"
    address: 88
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "varh"
    state_class: total_increasing
    skip_updates: 29
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} RN Total"
    address: 90
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "varh"
    state_class: total_increasing
    skip_updates: 29

  # --- Apparent Energy (VAh) ---
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} VAh L1"
    address: 92
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "VAh"
    state_class: total_increasing
    skip_updates: 29
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} VAh L2"
    address: 94
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "VAh"
    state_class: total_increasing
    skip_updates: 29
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} VAh L3"
    address: 96
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "VAh"
    state_class: total_increasing
    skip_updates: 29
  - platform: modbus_controller
    modbus_controller_id: ${enm_id}
    name: "${enm_prefix} VAh Total"
    address: 98
    register_type: read
    value_type: U_DWORD
    unit_of_measurement: "VAh"
    state_class: total_increasing
    skip_updates: 29
